7-11 验证宏(verify)---PTA实验C++

news2025/1/11 14:44:38

一、题目描述

无需惊慌,C++缔造者Bjarne Stroustrup这句话说的CPP是C PreProcessor,即“C代码预处理器”。CPP根据#include #define #if #pragma等指令对文件进行处理。这种处理发生在编译之前,所以CPP叫“预处理器”。CPP完全是文本层面的处理,与C/C++语法无关。

C/C++的标准库提供了assert断言宏,用在程序中检查某些必须成立的条件,确保程序运行符合预期。assert(expr)的参数是一个表达式,如果表达式求值结果相当于false,那么断言失败。断言失败的后果在调试版程序中一般是报错然后中止程序。在定义NDEBUG宏、或VC的Release版时断言将被省略,因此断言的表达式不应进行业务处理。

时间有限,预处理指令我们只练习这一次,实现类似断言但总是启用、失败时不中止程序的验证宏verify

代码框架如下:

#include <iostream>
using namespace std;

static void verify_failed(const char* file, int line, const char* expr){
  // TODO: 仿照样例格式,在验证失败时输出位置和表达式。
}

// 为使源码行号__LINE__准确,验证宏写在了一行中。也可用反斜线续行。
// 表达式最后特意没加分号,使用时就不至于漏写分号。
// #x用了“Stringize”功能,将x对应的表达式转成字符串。这功能必须用CPP,无法用C++实现。
#define verify(x) if(x){}else verify_failed(__FILE__, __LINE__, #x)

int main(){
  int m, n;
  cin >> m >> n;
  for(int i = 0, x; i < n; ++i){
    cin >> x;
    cout << x << endl;
    // TODO: 用#line预处理指令设置行号(整数)和源文件名称(字符串),以便下行报出预期的错误信息。
    verify(x < m);
  }
}

#line预处理指令用于设置源码行号和源文件名称。例如:

  • #line x 下一行代码中__LINE__宏将设为x
  • #line x "name" 下一行代码中__LINE__宏值为x__FILE__宏值为name
  • 请使用#line预处理指令和verify宏实现样例的要求。
输入规格
  • 首先有两个非负整数:范围M、后续数据个数N
  • 随后有N个整数,依次读入并判断。
输出规格

对于读入的N个整数(用变量x表示),输出x的值并换行。
然后用verify验证x < m的表达式,如不成立则提示样例要求的信息。

样例输入
5 3
1
5
3
样例输出
1
5
verify failed at unknown.cpp:987654321: x < m
3
样例解释
  • m=5,n=3,随后有3项数据需要处理。
  • 第1项:x=1,那么x < m成立。
  • 第2项:x=5,那么x < m不成立,verify应报出期望的信息。
    • 源文件名需要是"unknown.cpp",行号987654321大得离谱,可以用#line设置。
  • 第3项:x=3,那么x < m成立。
  • verify(x)宏在参数表达式为“否”时,输出源文件名、行号、表达式
  • 这题目的是练习宏定义,掌握断言的用法。verify作为排错工具可以用在今后的C++开发中。
    • 验证宏适宜用在多次重复结果等效的表达式上,所谓的幂等性
    • 有副作用的表达式不宜用验证宏。反例:verify(++i < 10);
    • 检查用户输入是否合理不适用断言和验证。

二、 完整C++代码实现

#include <iostream>
using namespace std;

// 验证失败时输出位置和表达式
static void verify_failed(const char* file, int line, const char* expr){
    cout << "verify failed at " << file << ":" << line << ": " << expr << endl;
}

// 定义 verify 宏
#define verify(x) if(x){}else verify_failed(__FILE__, 987654321, #x)

int main(){
    int m, n, x;
    cin >> m >> n;
    for(int i = 0; i < n; ++i){
        cin >> x;
        cout << x << endl;
        // 使用 #line 预处理指令设置行号和源文件名称,以便输出预期的错误信息
        #line 13 "unknown.cpp"
        verify(x < m);
    }
    return 0;
}

三、测评详情

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1721424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

少样本学习与零样本学习:理解与应用

少样本学习与零样本学习&#xff1a;理解与应用 在现代机器学习领域中&#xff0c;少样本学习&#xff08;Few-Shot Learning&#xff09;和零样本学习&#xff08;Zero-Shot Learning&#xff09;正变得越来越重要。这些技术能够在数据稀缺的情况下有效地进行学习和推理&…

禁止Windows Defender任务计划程序

开始键->搜索“任务计划程序”->“任务计划程序库”->“Microsoft”->"Windows"->"Windows Defender"->右边四项

Prometheus + Grafana + Alertmanager 系统监控

PrometheusGrafana 系统监控 1. 简介1.1 Prometheus 普罗 米修斯1.2 Grafana 2. 快速试用2.1 Prometheus 普罗 米修斯2.2 Prometheus 配置文件2.3 Grafana 2. 使用 Docker-Compose脚本部署监控服务3. Grafana 配置3.1 配置数据源 Prometheus3.2 使用模板ID 配置监控模板3.3 使用…

【SpringBoot】怎么在一个大的SpringBoot项目中创建多个小的SpringBoot项目,从而形成子父依赖

父子项目工程创建 步骤 先创建父项目 具体操作步骤请看本文章&#xff1a;使用maven工程创建spring boot项目 创建子项目 file- project structure module–new module 剩下步骤请看创建父工程时的操作使用maven工程创建spring boot项目 应用 确认即可 之后创建启动类…

Kafka篇:Kafka搭建、使用、及Flink整合Kafka文档

一、Kafka搭建 1、上传并解压改名 tar -xvf kafka_2.11-1.0.0.tgz mv kafka_2.11-1.0.0 kafka-1.0.0 2、配置环境变量 vim /etc/profile export KAFKA_HOME/usr/local/soft/kafka-1.0.0 export PATH$PATH:$KAFKA_HOME/bin source /etc/profile &#xff08;使环境变量生效…

SPHINX的输出文档格式

SPHINX的输出文档格式 SPHINX的输出文档格式更多信息 SPHINX的输出文档格式 用rst编写&#xff0c;然后用sphinx-build进行编译&#xff0c;还是效果相当不错地&#xff0c;只要掌握了格式&#xff0c;可以一次编译&#xff0c;多种格式输出&#xff0c;主要是用的可能是html和…

Java对象的比较——equals方法,Comparable接口,Comparator接口

Java对象的比较——equals方法&#xff0c;Comparable接口&#xff0c;Comparator接口 1. equals方法2. Comparable接口3. Comparator接口 1. equals方法 在判断两个整数是否相同时&#xff0c;我们可以使用以下方式&#xff1a; System.out.println(1 2); System.out.printl…

多普云DPGo摄影测量航线规划软件

1.航线代规划。支持GSR航线&#xff08;大疆精灵4RTKSDK遥控器&#xff09;、DJI Pilot航线&#xff08;大疆精灵4RTK、M300&#xff09;、DJI Pilot2航线&#xff08;大疆精灵4RTK、M300、Mavic3E&#xff09;。 2.DPGO三维模型满足毫米级精度要求&#xff1a;已知被摄范围&am…

基于java的CRM客户关系管理系统(二)

目录 第二章 相关技术介绍 2.1 后台介绍 2.1.1 B/S平台模式 2.1.2 MVC 2.1.3 Spring 2.1.4 Hibernate 2.1.5 Struts 2.2 前端介绍 2.2.1 JSP网页技术 2.3 开发工具 2.4 本章小结 前面内容请移步 基于java的CRM客户关系管理系统&#xff08;二&#xff09; 资源…

vscode编辑器创建分支注意事项?!

最近在公司开发项目时&#xff0c;不小心将自己分支的东西提交到公司的master的分支&#xff0c;大家看看是什么情况&#xff1f; 先上图&#xff1a; 从图上看&#xff0c;我这边用了GITLENS这个插件&#xff0c;在创建分支时&#xff0c;有个create branch from&#xff0c;有…

如何选择软件开发服务商

在当今数字化快速发展的时代&#xff0c;软件已经成为企业运营不可或缺的一部分。然而&#xff0c;对于许多非技术背景的企业来说&#xff0c;如何选择一个合适的软件开发服务商却是一个不小的挑战。本文将从需求分析、服务商评估、合同条款以及后期维护等方面&#xff0c;详细…

【GD32F303红枫派使用手册】第五节 FMC-片内Flash擦写读实验

5.1 实验内容 通过本实验主要学习以下内容&#xff1a; FMC控制器原理&#xff1b; FMC擦写读操作&#xff1b; 5.2 实验原理 5.2.1 FMC控制器原理 FMC即Flash控制器&#xff0c;其提供了片上Flash操作所需要的所有功能&#xff0c;在GD32F303系列MCU中&#xff0c;Flash…

环卫车北斗GPS视频监控定位解决方案的应用与优势

一、引言 随着城市化进程的加快&#xff0c;环卫车作为城市环境卫生的重要保障力量&#xff0c;其运行效率与安全性直接关系到城市形象与居民生活品质。然而&#xff0c;传统的环卫车管理模式往往存在信息不对称、调度不合理、行驶不规范等问题&#xff0c;导致城市道路污染和…

Java中的软引用,你了解吗?

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

打工人福音,办公神器软件

今天分享2个免VIP的办公神器app&#xff0c;建议所有手机安装&#xff0c;第一个布丁扫描http://www.budingscan.com &#xff0c;无广告不收费&#xff0c;这是VIVO 推出的一款完全免费的扫描APP&#xff0c;支持文档&#xff06;证件扫描、OCR文字&#xff06;表格识别提取、…

解决Windows 10通过SSH连接Ubuntu 20.04时的“Permission Denied”错误

在使用SSH连接远程服务器时&#xff0c;我们经常可能遇到各种连接错误&#xff0c;其中“Permission denied, please try again”是较为常见的一种。本文将分享一次实际案例的解决过程&#xff0c;帮助你理解如何排查并解决这类问题。 问题描述 在尝试从Windows 10系统通过SS…

js:flex弹性布局

目录 代码&#xff1a; 1、 flex-direction 2、flex-wrap 3、justify-content 4、align-items 5、align-content 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewp…

Mysql基础教程(13):GROUP BY

MySQL GROUP BY 【 GROUP BY】 子句用于将结果集根据指定的字段或者表达式进行分组。 有时候&#xff0c;我们需要将结果集按照某个维度进行汇总。这在统计数据的时候经常用到&#xff0c;考虑以下的场景&#xff1a; 按班级求取平均成绩。按学生汇总某个人的总分。按年或者…

【spring】Spring Boot3.3.0发布啦

spring最新版本 springboot官网&#xff1a;Spring Boot :: Spring Boot Spring Boot 3.3 发行说明&#xff1a;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.3-Release-Notes 开发环境的要求对比表 Spring BootJDKSpringMavenGradle3.3.017 ~ 226.1…

Nginx实战:LUA脚本_环境配置安装

目录 一、什么是LUA脚本 二、Nginx中的LUA脚本 1、主要特点 2、用途 三、如何在nginx中使用LUA脚本 1、原生nginx 2、OpenResty 3、nginx lua配置验证 一、什么是LUA脚本 Nginx Lua 脚本是 Nginx 与 Lua 语言集成的结果&#xff0c;它允许你使用 Lua 语言编写Nginx 模块…