为 . h 的头文件。
添加完你所有的头文件和源文件之后,检查一下是否添加完毕,之后就可以编译了。
3.对一个简单程序的调试过程 1. 假设准备编制进行如下计算任务的一个简单程序:在已知 x3、y5 的情况下,先计 算出 x 与 y 的和 s,差 d,商 q,模 r,而后计算 ress2d3q4r 的值res 应该等于 16并显示在屏幕上。
但编制的如下程序运行后却得出了一个错误结果“res26”。
1. include ltstdio.hgt 2. void main 3. 4. int x3 y5 5. int s d q r res 6. s x y 7. d s - y 8. q x / y 9. r x y 10. res s 2d 3q 4r 11. printfquotresdnquot res 12. 复制代码 分析上述所编制的程序行,假设能在要输出 res 结果值的那一程序行倒数第二行处设置一个临时断点,让程序先执行到此断点处注意设为断点的那一行尚未被执行!,看一看那时各变量的动态取值情况,有可能就会找到出错的原因!基于上述分析,先将鼠标光标移动到“printfquotresdnquot res”那一行处左键单击那一行任意位置,从而指定了临时性断点的行位置,而后执行“Build→StartDebug→Run to Cursor”选项,使程序运行到所指定行时暂停其执行,并显示出如图 3-2 的界面,其中的左下方窗口中就列出了当时各变量的取值情况:和 s8,差 d3x3,y5,它们的差 d3 肯定是错误的!,商 q0,模 r3,最终结果 res26。
再仔细查看程序中负责计算差 d 的那一个语句“ds-y”就会恍然大悟,原来将“x-y”误写成了“s-y”!找到了错误,此时可以通过菜单选项“Debug→Stop Debugging”,中断当前的调试过程并返回正常的编辑状态,修改所发现的错误后,再一次执行将能得出正确结果“res16”。
顺便指出,图 3-2 中显示的变量是“自动查看”方式的,即 VC6 自动显示当前运行上下文中的变量的值。
如果变量比较多,自动显示的窗口比较混乱,则可以在 Watch列表中添加自己想要监控的变量名。
上述设置临时断点到鼠标光标那一行处的调试手段使用起来很方便,会经常使用也经常在到达一个断点后,又设置另一个新的临时断点。
另外也常配合使用“单步执行”的方式,来仔细检查每一步一个程序行执行后各变量取值的动态变化情况,如,先通过“Run to Cursor”执行到某一个鼠标光标临时断点行处,而后通过使用 Debug 菜单的“Step Over”或“Step Into”来进行所谓的“单步执行”,当然,每执行一步后,都要仔细观察并分析系统自动给出的各变量取值的动态变化情况,以便及时发现异常而找到出错原因。
4.如何对 C 语言设计合适的程序调试方案让我们来分析并设计对如下程序进行调试的具体方法与手段实际上,对不同的程序,都需要在分析其执行结果以及其程序编写结构的基础上,来设计相应的对其进行具体调试的方法与手段,宗旨是想方设法逐步缩小“侦察”范围,直到最后找到出错位置。
该程序除 main 外,还有一个自定义函数 f。
若已经能确认调用 f 函数前计算出的 res值或 s、d、q 或 r 其中之一的结果值不正确的话,则可像上一程序那样,在计算出res 变量值的下一行或在靠前一些的某一行处设置断点,看到达那一断点处是否一切正常。
若到达断点处的数据结果已经不正常的话,错误已经出现出现在跟前或出现在前面,从而找到了错误或者缩小了“侦察”范围;若断点处仍然正常,可断言错误出现在后面,而后,①可又一次通过鼠标光标往更靠后一些的适当位置设置新断点,再一次“Debug→Run to Cursor”一下向后“迈”过了许多行,再继续“侦察”!;②通过“单步执行”Debug→StepOver,在重点怀疑的那一块地方仔细地逐行进行“侦察”。
注意,“Step Over”不会“跟踪”进入 f 函数内部,若怀疑 f 函数可能有问题的话,要通过使用“Debug→Step Into”进入 f 内部再进行细致调试在不遇到函数调用的地方,“Step Over”与“Step Into”的功能是相同的。
若通过“Step Into”进入到函数内部,单步执行若干步之后,若发现不再需要进行单步调试的话,可通过“Step Out”从函数内部返回到调用语句的下一语句处。
此外设置固定性断点最简单的方法是:在某一程序行处,单击鼠标右键,在菜单中选择“Insert/Remove Breakpoint”项通过左键单击该选项,此时该行前将出现一个圆形的黑点标志,意味着已经将该行设置成了固定断点。
清除固定性断点的方法为:在具有圆形黑点标志的固定断点行处,单击鼠标右键,在菜单中选择“Remove Breakpoint”项通过左键单击该选项,此时该行前的那一个圆形黑点标志将消失,意味着已经清除了该固定断点。
设置了固定性断点后,通常通过“Build→Start Debug→Go”或“Debug→Go”选项使程序开始执行,直到遇到某断点或遇到程序结束而停止。
还要说明的是,可以随时设置任意多个固定性断点,也可以随时清除它们。
通过使用菜单选项“Edit→Breakpoints”,会出现一个对话框,在其中的“Break at”文本框中键入要设置断点的程序行的行数信息但通常是先通过鼠标光标选定某一程序行,再利用菜单选项进入上述对话框,而后通过点击“Break at”文本框右边的小三角按钮,并选定系统自动提供的程序行的行数,以免自己要真正地去数清楚那一行的行数,也能够在指定行处设置一个固定性断点通过 OK 按钮确定;如果要清除某断点,可在“Breakpoints”列表栏中先选定它,之后单击 Remove 按钮。
实际上,除位置断点外,通过“Edit→Breakpoints”,还可以设置数据断点,消息断点,以及条件断点等,这儿就不再细说了。
5.优秀 C 程序员的基本素质——丰富的想象、严谨的思维1程序运行结果看起来对了,但并不意味着程序没有隐藏的问题①以下程序是从键盘输入一个数x,x 是一个 int 型整数,计算 yy1000x9并在屏幕上输出,程序基本上是对的,能输出正确的结果。
13. include ltstdio.hgt 14. void main 15. 16. int x y 17. printfquotPlease input x:quot 18. scanfquotdquot ampx 19. y 1000x 9 20. printfquotydnquot y 21. 22. 但是,当 x 输入为 5000000,屏幕上却输出 y705032713,出现了错 误。
23.复制代码②以下程序的功能是从键盘上读入一串字符,然后在屏幕上输出。
24. include ltstdio.hgt 25. void main 26. 27. char str10 28. printfquotPlease input str:quot 29. scanfquotsquot ampstr 30. printfquotstrsnquot str 31. 复制代码若用户在输入 str 时不小心多按了或无意碰触几下键盘,则程序运行会出错,如图3-3 所示——可能稍严重的是程序运行死机不报错,特别严重的是若有人精心设计输入的字符,完全可能造成系统被入侵或被严重破坏。
③以下程序的功能是从计算班中男生boy和女生girl的比例。
如果女生数为 0 时,程序会怎样? 32. include ltstdio.hgt 33. void main 34. 35. int boy girl 36. printfquotPlease input boygirl:quot 37. scanfquotddquot ampboy ampgirl 38. printfquotboy/girl.2fnquot boy1.0/girl 39. 复制代码实际工作中,类似的隐藏的问题往往是破坏力巨大的“地雷”,往往造成极大的损失,例如火箭发射、宇宙飞船飞行、高速列车运行中的事故,我们平常接触最多的恐怕是微软的各种系统需要不断地打补丁。
因此,在程序设计中,必须缜密考虑各种情况,哪怕是机率极小的意外。
2严谨思维的典范——程序员学习的榜样丰富的想象力、严谨的思维是一个优秀的程序应当具备的素质。
设计程序时不要拘泥于固定的思维方式, 遇到问题的时候要多想几种解决问题的方案,并且考虑全面、思维
上一篇:
智能监控中的视频图像去抖动软件系统实现
下一篇:
冬天吃这些食品有好处