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

2024-05-31 14:20
文章标签 c++ 验证 实验 pta verify

本文主要是介绍7-11 验证宏(verify)---PTA实验C++,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述

无需惊慌,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;
}

三、测评详情

这篇关于7-11 验证宏(verify)---PTA实验C++的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1018173

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现