
代码侦探
通过实例,介绍代码中Bug的寻找问题,帮助程序设计初学者提高程序的查错、纠错能力。专栏原创博文数量以作者平时大量辅导学生,帮助他们调试程序的工作为保证。
迂者-贺利坚
烟台大学计算机学院教师,坚持教育情怀,持续进行教学改革。和学生并肩,与不良学风作斗争,为IT菜鸟建跑道,追求快乐与激情的大学。著书《逆袭大学:传给IT学子的正能量》,帮助迷茫中的大学生。
展开
-
毁掉自己的汇编程序
下午的上机课,有位同学写的程序死了。她百思不得其解。 我看了几遍程序,没有发现问题。 多次观察后,发现程序修改数据时,由于循环次数错误地设多了,以致于改到了代码段——代码段的指令于是被当作数据改掉了,而此处的数据,当然它仍然还要被当作指令执行,恰好对应了wait指令!于是,程序进入了等待…… 那程序到底有没有问题?我看的程序没有问题,但运行的,却是老版本的.exe。开始时,源程序是原创 2017-04-05 22:03:12 · 2904 阅读 · 1 评论 -
字符串类中运算符重载出现的一个问题
上机辅导。学生的一个程序莫名出问题。她是在做一个String类,主要是要实现字符串的连接。 程序是这样的,请读者将其拷到IDE,边看边调:#include <iostream>#include <cassert>#include <cstring>using namespace std;class String{private: char* p; int len;原创 2016-05-26 15:09:35 · 5522 阅读 · 1 评论 -
一个冒号引发的“血案”
备课中。 从下载的PPT中复制出例题,调试一下,结果: 何其多的错误,红红的。 不正在声明Base2吗?怎么会“error: ‘Base2’ has not been declared” 斗争! …… 小样,就一个符号的问题,犯得着兴师动众,给出那么多提示?! 编译器就是这么好,严格把关,各种提示。 亲爱的读者,看出来了,会心一笑吧。 编原创 2016-04-25 19:39:43 · 4874 阅读 · 0 评论 -
C++返回值为对象时复制构造函数不执行怎么破
先说点背景知识,调用复制构造函数的三种情况: 1.当用类一个对象去初始化另一个对象时。 2.如果函数形参是类对象。 3.如果函数返回值是类对象,函数执行完成返回调用时。 在辅导学生上机时,有同学第3点提出异议。有教材上的例题为证:#include using namespace std;class Point //Point 类的定义{public: Point(i原创 2016-03-25 11:42:43 · 11058 阅读 · 13 评论 -
数据结构实践——初始化顺序表怎么就内存溢出了?
有学生调程序,是要建顺序表。 他的程序是这样的:#include <stdio.h>#include <malloc.h>#define MaxSize 50 //Maxsize将用于后面定义存储空间的大小typedef int ElemType; //ElemType在不同场合可以根据问题的需要确定,在此取简单的inttypedef struct{ ElemType原创 2015-09-14 21:23:29 · 4415 阅读 · 0 评论 -
找出诡异的Bug:数据怎么存不进去
带着学生做课程设计。程序一大,课程中做过了小项目,练过了分解动作,一到合起来了,难免还是要乱了分寸。其实,实战的功夫,就是这样出来的。 话说,已经有两位做银行系统的同学和我说,“文件中写不进去数据。程序一退出,明明写进去了,结果却是空文件。”这不是一个小打击。 做软件,找Bug,有些像打空气,使半天劲,人家就不理你。学计算机的人,练的就是这样的功夫,要学会自己创建线索,找出问题所在。原创 2015-07-11 09:41:19 · 3424 阅读 · 0 评论 -
藏身时间类中的妖孽
妖孽藏身时间类中,贺老师带领学生要练火眼金睛。原创 2015-03-21 19:33:39 · 2340 阅读 · 1 评论 -
记录:50多行程序中找出多写的一个字母e
小霍同学调程序,做的是第11周的项目1 - 存储班长信息的学生类,但是她写的程序,呃,请读者自己运行一下吧。(下午在机房调试时用的是Code::Blocks10.05,输出的是很长的莫名的符号,晚上在家用的是CodeBlocks12.11,典型的内存溢出症状。)#include #include using namespace std;class Stu //声明基类{public:原创 2014-05-06 20:40:45 · 3278 阅读 · 0 评论 -
一个数组越界的C++程序
学生给我发了私信,一个程序运行了好久,在OJ就是提交不了。 题目是:Description输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。Input10个整数Output整理后的十个数,每个数后跟一个空格(注意最后一个数后也有空格)Sample Input2 1 3 4 5 6 7 8 10 9Sample Ou原创 2013-11-27 09:59:41 · 5834 阅读 · 8 评论 -
'abc'的值是多少?
看见一个贴子,发贴人搞不清输出结果中的“为什么”(见http://bbs.youkuaiyun.com/topics/390623518)。给出的程序是:#include int main(void){ /* 将单个字符赋值给整形变量,结果为字符的ASCII值 */ int a = 'a'; printf("a = %d\n", a); /* ?这里如何解释 */ a = 'abc';原创 2013-10-25 10:28:43 · 3975 阅读 · 2 评论 -
C++字符数组越界问题的一个案例分析
我的学生yang1067155909给我来信,说的是C++第11周项目3 - CEmployee类继承自CPerson类中的一个细节:贺老师: 老师,m_szDepartment=new char[strlen(department)+1];为何需要+1呢?在测试里去掉+1后和这个效果一样啊,不太明白……求指教…… 学生,杨腾飞 我回答: 要给'\0'占个座。是用别人的地盘(越界的部分)保原创 2013-05-15 05:43:25 · 12624 阅读 · 6 评论 -
初学者遭遇离奇错误——求两点间的距离(C++)
有学生向我求助,他编了一个程序,设计一个“点”类,求出两点距离的程序。程序看着没有问题,却出了一大堆的错误。程序如下:#include #include using namespace std;class point{public: double x; double y;};double distance(point p1,point p2);int main(){ po原创 2013-04-27 17:03:14 · 12969 阅读 · 3 评论 -
编程学习,从意外中收获
提倡同学们积累代码行数,于是有了大量的编程练习。做下来是一个基本的要求,对个别同学而言,已经是轻松面对,他们在基本编程能力方面,已经有了保障,这为今后的学习和自学打下了好的基础。一些同学一路紧随,跟住了都不是易事,有些依然不能按时按量完成。心中想着要多做几个,但调试中遇到问题,难免急躁。 看到一位同学在博文最后写的一段话:“直接抓狂了,经过个人分析,应该是函数change24与changefro原创 2013-04-18 07:04:56 · 4346 阅读 · 0 评论 -
找出运行错误的元凶
收到一位同学的求助信,解决的是http://blog.youkuaiyun.com/sxhelijian/article/details/8737365中的问题。她的程序如下:#include using namespace std;class CFraction{private:int nume; // 分子int deno; // 分母public: void input(); //按照"原创 2013-03-29 20:20:08 · 2771 阅读 · 0 评论 -
BUG现形记(二)——偷工减料的复制构造函数
【课程支撑】我的 C++程序设计课程教学材料 【摘要】设计数组类,要实现数组类中两个数组相加的运算,程序却陷入死循环。逐层排查,重载的加法正确,重载的赋值运算也看不出问题。跟踪到赋值运算的实现中发现,传递的参数中有异常,终于找出了嫌疑犯——编制的复制构造函数偷工减料。 【阅读提示】现在打开你熟悉的c++,跟随作者的的思路,重走发现嫌犯的过程。 题目是建立专门的数组类处理有关数组的操作,要完成原创 2012-05-30 12:43:47 · 4296 阅读 · 1 评论 -
Bug现形记(一):一个多重继承程序的查错
【课程支撑】我的 C++程序设计课程教学材料 要完成的任务详见第12周-任务2-双肩挑干部。题目要求 分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。要求: (1)在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。 (2)在Teacher类中还包含数据成员title(职称),在Cadre类中还包含原创 2012-05-09 21:09:37 · 4095 阅读 · 2 评论