当前位置: 首页 > news >正文

C++基础:测试

每段代码中有0个或者多个错误。你的任务是找出并排除每个程序中的错误,当你排除了所有的错误之后,得到的程序编译,运行后就会输出“Success!” 即使你认为已经找到了一个错误,你仍然需要输入(原始、未修改的)程序并测试它;因为你可能猜错了,或者程序中还有其他错误。这个练习的另一个目的是让你感受一下编译器对不同错误的反应是怎么样子的。你不需要上面的程序框架25次,用剪贴,粘贴或者类似的技术就可以了。不要通过删除一条语句来逃避问题,你应该试着用修改、增加或删除一些字符来排除问题。

原始框架代码:

#include "std_lib_facilities.h"int main()
try{<<your code here>>keep_window_open();return 0;
}
catch (exception& e){cerr << "error: " << e.what() << '\n';keep_window_open();return 1;
}
catch(...){cerr << "Oops: unknown exception\n";keep_window_open();return 2;
}

注意:keep_window_open();这个语句的作用是使得Windows上的黑框停留一段时间,方便我们阅读窗口信息,我这里使用的是ubuntu24.4
其源码文件如下,我们使用的不带参数的第一个。

inline void keep_window_open()
{cin.clear();cout << "Please enter a character to exit\n";char ch;cin >> ch;return;
}inline void keep_window_open(string s)
{if (s == "") return;cin.clear();cin.ignore(120, '\n');for (;;) {cout << "Please enter " << s << " to exit\n";string ss;while (cin >> ss && ss != s)cout << "Please enter " << s << " to exit\n";return;}
}

1 Cout << “Success!\n”;

在这里插入图片描述

cout << "Success!\n"

2 cout << "Success!\n;

在这里插入图片描述其实就差一后半个双引号,但会报<<(输出流符号)不匹配的问题,所以编译器报错了看看代码前后几行有时候更容易知道问题所在。

3 cout << “Success!” <<!\n";

在这里插入图片描述

4 cout << success << ‘\n’;

在这里插入图片描述

5 string res = 7; vector v(10); v[5] = res; cout <<“Success!\n”;在这里插入图片描述

6 vector v(10); v(5) = 7; if (v(5)!= 7) cout <<''Success!\n";在这里插入图片描述

    vector<int> v(10);v[5] = 7; if (v[5]== 7)cout <<"Success!\n";

7 if (cond ) cout << “Success!”; else cout <<“Fail!\n”;

在这里插入图片描述

 int cond = 1;

8 bool c = false; if (c ) cout << “Success!\n”; else cout <<“Fail!\n”;在这里插入图片描述

if (!c) cout << "Success!\n"; 

9 string s = “ape”;bool c = “fool” < s;;if( c) cout << “Success!\n”;

在这里插入图片描述
其实就是两个单词首字母的比较,f<a明显是假的,所以为0,要想成功输出,要么改成大于符号,要么!c。

if(!c) cout << "Success!\n";

10 string s = “ape”;if ( s == “fool”) cout << “Success!\n”;

在这里插入图片描述没有报错,只需要将if条件改成小于(<)或者不等于(!=)就能成功输出。

11 string s = “ape”;if ( s == “fool”) cout < “Success!\n”;

在这里插入图片描述

 if ( s != "fool") cout << "Success!\n";

12 string s = “ape”;if ( s +“fool”) cout < “Success!\n”;

在这里插入图片描述修改后一个错误,更为详细的+不能转换成bool类型。
在这里插入图片描述

if ( s < "fool") cout << "Success!\n";

13 vector< char> v(5) ;for(int i= 0;i<v.size();++i) ;cout<< “Success!\n”;

注意:for循环体为空语句,所以执行完,然后确认后输出Success。

在这里插入图片描述

14 vector< char> v(5) ;for(int i= 0;i<=v.size();++i) ;cout<< “Success!\n”;在这里插入图片描述

这里有个很隐蔽的范围错误,就是i<= v.size(),幸好它的循环体不是遍历V,否则会访问v[5]的地址,造成越界。

15 string s = “Success!\n”;for(int i = 0; i < 6;++i) cout << s[i];

在这里插入图片描述只输出了“Success!"的前5个字符。

    for(int i = 0; i < 8;++i) cout << s[i];

16 if (true) then cout <<“Success!\n”;else cout << “Fail!\n”;

在这里插入图片描述在这里插入图片描述

17int x = 2000; char c = x; if(c==2000) cout <<“Success!\n”;在这里插入图片描述

我们char的大小范围是128~127,所以这里char c = x ,发生了窄化错误,char实际存储不了2000那么大的数字,所以必然不等于2000.
在这里插入图片描述

if(c < 2000) cout <<"Success!\n";

18 string s = “Success!\n”;for(int i = 0; i<10; ++i) cout <<s[i];

这里不记得C++关键字是大写,还是小写,所幸试了一把,结果为错,应为所有字母都小写。在这里插入图片描述
在这里插入图片描述

19vector v(5);for(int i =0; i <= v.size();++i); cout <<“Success!\n”;在这里插入图片描述

缺乏模板参数,所以导致的模板参数推导/替换失败

vector<int> v(5);
for(int i =0; i < v.size();++i); 

20 int i = 0; int j = 9; while(i < 10) ++j;if(j<i)cout <<“Success!\n”;

在这里插入图片描述while语句终结条件为i < 10,但是其循环体中没有对增量i的任何使用,所以会一直循环下去。

21 int x = 2; double d = 5/(x-2); if (d == 2*x +0.5)cout <<“Success!\n”;

在这里插入图片描述我们知道分母不能为0,这里直接算术异常。

22 string s = “Success!\n”;for(int i = 0; i < 10; ++i) cout << s[i];

在这里插入图片描述

#include "std_lib_facilities.h"int main()
try{string s = "Success!\n";for(int i = 0; i < 9; ++i) cout << s[i];keep_window_open();return 0;
}
catch (exception& e){cerr << "error: " << e.what() << '\n';keep_window_open();return 1;
}
catch(...){cerr << "Oops: unknown exception\n";keep_window_open();return 2;
}

这里索引越界,"Success!\n"有9个字符,是个范围错误。可以用以下代码测试一下:

std::string s = "Success!\n";
if (9 < s.size()) {// This line will not execute because 9 is not less than s.size()char c = s[9]; } else {std::cout << "Index out of bounds!" << std::endl;
}

23 int i = 0;while(i <10) ++j;if(j<i) cout <<“Success!\n”;

在这里插入图片描述将j定义好之后,将会进入死循环。

    int i = 0;int j = 0;while(i < 10) cout << ++j;

在这里插入图片描述

24 int x = 4; double d = 5/(x-2); if (d = 2*x+0.5) cout <<“Success!\n”;在这里插入图片描述

因为这个是整型除法,所得到的结果也是整型2,然后被转换成double。由于if条件是d = 2*x+0.5,的赋值语句,所得结果大于0,所以是bool类型为真(或者是1)。

25 cin << “Success!\n”;

在这里插入图片描述
改正错误并不难,但记住这个输入符号的方向挺难记的,输入符号是>>,比如cin >> s;就是把你输入到电脑上的东西,通过cin读入存储到变量s中。输出符号,我把cout想象成电脑屏幕,然后方向指向它,这样就不容易记错了。
所有的错误类型基本上都调试完毕了。


http://www.mrgr.cn/news/65736.html

相关文章:

  • 基于matlab的图像形状与分类的方法比较
  • el-talble selection行 初始默认勾选
  • 网络学习/复习4传输层
  • 对象的接口与设计模式在其中的作用
  • android——渐变色
  • 【HTML】——VSCode 基本使用入门和常见操作
  • 使用Spring Boot搭建简单的web服务
  • 重大917该如何复习?难度大不大?重点是啥?
  • 解决缓存击穿的代码[最佳实践版]
  • PD取电快充协议芯片,XSP08Q在灯具中的应用
  • RT-Thread学习
  • 【Linux探索学习】第十弹——Linux工具篇(五):详解Linux 中 Git 工具的使用与相关知识点
  • 【无标题】基于SpringBoot的母婴商城的设计与实现
  • Java flnalize垃圾回收
  • 如何安装 Vue.js:适合不同场景的方案
  • 企业CRM选型必看:2024年最佳CRM系统排行
  • 实体(Entity)详解
  • 再谈 TCP 连接的源端口选择
  • Machine Learning on the Edge
  • Uni商城-开源项目
  • 论文 | Evaluating the Robustness of Discrete Prompts
  • Leetcode328奇偶链表,Leetcode21合并两个有序链表,Leetcode206反转链表 三者综合题
  • 2024版最新kali linux手机版安装(非常详细)零基础入门到精通,收藏这篇就够了
  • 阿里云-部署CNI flannel集群网络
  • PyQt5实战——UTF-8编码器功能的实现(六)
  • 【018B】基于51单片机脉搏温度计