实验03 C程序的调试方法.docx
- 文档编号:13343325
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:14
- 大小:167.07KB
实验03 C程序的调试方法.docx
《实验03 C程序的调试方法.docx》由会员分享,可在线阅读,更多相关《实验03 C程序的调试方法.docx(14页珍藏版)》请在冰点文库上搜索。
实验03C程序的调试方法
实验0-3C程序的调试方法
一、实验目的
1.熟悉TurboC2.0集成开发环境。
2.掌握调试C程序的方法,具体掌握C程序的编译、连接、运行、单步执行、设置断点等方法。
二、实验题目及要求
1.实验题目
输入三角形三边a,b,c的值,计算并输出三角形的面积。
三角形面积公式为:
其中,s=(a+b+c)/2为三角形的半周长。
(平方根函数的调用形式为sqrt(x),x和函数值均为浮点类型,sqrt所需的系统头文件为
)
源程序如下:
#include
#include
voidmain(void)
{
floata,b,c,s,t;
scanf("%f%f%f",&a,&b,&c);/*Line8*/
s=(a+b+c)/2/*Line9*/
t=s*(s-a)*(s-b)*(s-c);/*Line10*/
area=sqrt(t);/*Line11*/
print("area=%d\n",area);/*Line12*/
}
下面按要求对此程序进行编辑、编译、运行和跟踪调试。
2.设置编译环境
(1)创建自己的目录
为了避免将不同人编写的程序或不同性质和用途的程序混放在一起,每个学生以自己姓名的汉字拼音头为名设置一个专用的目录,用来存放源程序文件和编译生成的目标文件。
本例中在D盘上创建目录D:
\WT。
(2)启动和退出TurboC2.0
参考教材10.2TurboC2.0的开发环境。
(3)设置目录路径
选择Options/Directories,会弹出一个窗口,如图1所示。
图1设置系统目录路径
第1行Includedirectories指“包含文件”所在的目录,系统显示出默认的子目录C:
\TC\INCLUDE。
第2行Librarydirectories指库文件所在的目录,系统显示出默认的子目录C:
\TC\LIB。
第4行TurboCdirectory指TurboC系统文件所在的目录,系统显示的是安装时的默认目录C:
\TC。
如果你的“包含文件”、库文件和系统文件存放的目录与缺省路径不相同,就作相应的修改。
第3行Outputdirectory指定输出文件(.obj文件和.exe文件)存放的目录,需要用户指定。
如果用户不指定,系统就会就会将它保存在当前工作目录中。
现在我们想指定输出文件目录为我们自己的目录,在选中第3行Outputdirectory后,按回车键,就会弹出一个“输出文件目录”对话框,在此框内输入D:
\WT,见图2,它表示要将.obj文件和.exe文件保持在D:
\WT子目录中。
图2设置输出文件目录路径
在进行了以上设置后,还应当把这些信息保存起来。
方法是:
在上述设置完毕后按Esc键返回Options菜单,然后选择SaveOptions菜单项,将对环境的重新设置保存到配置文件(tcconfig.tc)中。
3.源程序编辑、编译、连接和运行
(1)编辑和存盘
输入新程序:
FILE/NEW,此时光标处于空白的编辑窗口(Edit区)等待用户输入。
将实验题目中的源程序照原样输入。
保存新文件:
FILE/WRITETO,输入带路径的文件名。
在本例中输入d:
\wt\area.c,将源文件area.c保存到自己的目录d:
\wt中,见图3。
图3源文件保存到指定目录
装入已存在的程序(老程序):
FILE/LOAD,或F3,此时可输入要装入的源程序文件名(或直接按回车,然后从列表框中选取)。
保存老文件:
FILE/SAVE,或F2。
(2)编译、连接和运行
①编译和连接过程中发现错误
在本例中,输入源程序后,按Ctrl+F9键,屏幕上的显示如图4所示。
图4程序运行时屏幕显示
从中间的窗口可以看到在编译中发现了2个警告和2个错误。
所谓“警告(Warning)”是指较轻微的错误,系统对此能够容忍,仍然把有警告的程序生成目标文件和可执行文件,可以执行程序,但不保证程序的运行结果正确。
而“错误(Errors)”是指严重的错误,系统不能容忍任何一个错误,编译系统对有错误的程序不生成目标文件和可执行文件,必须改正后再重新编译和连接。
按任何一个键后,中间的编译信息窗口消失,在屏幕下部的Message窗口中,显示了具体的出错信息,见图5。
图5错误信息
该窗口的第1行显示的是编译的文件名。
第2行是出错信息,告诉用户在编译的源文件中的第10行出现了一个错误,错误的内容是:
Statementmissing;infunctionmain(主函数中的语句漏了一个分号)。
从图5可以看到该行是以高亮度显示的。
与此相应,在上部Edit窗口中的源程序第10行也是以高亮度显示的,这样便于用户对照检查。
我们可以发现是第9行的末尾漏了一个分号,而不是第10行漏了分号。
为什么会显示是第10行漏了分号呢?
这是由于编译系统在检查第9行时,发现语句末尾没有分号,但这时还不能判定该语句有错,因为C语言允许把一个语句分写在两行上。
因此,编译系统接着检查第10行,看第10行的开头有无分号。
当发现第10行的开头没有分号时才判定出错,但此时的位置已是第10行了,所以报错的行数为第10行。
所以,在看到出错信息时,不能只简单地从系统显示的出错行数去找错,应该连同上下行一起检查。
图6编辑窗口显示第一条错误信息
在按回车键后,激活了上面的编辑窗口,光标自动停留在第10行上,以便用户修改,两个窗口中的高亮度显示行已恢复为正常显示。
在编辑窗口顶部用红色显示刚才观察的出错信息,以便用户对照检查修改,见图6。
我们在第9行末尾加上一个分号,然后再分析第2个错误。
先按F6键以激活Message窗口,用和键使第2条出错信息用高亮度显示,见图7。
图7第二条错误信息
Message窗口中的第2个出错信息行告诉我们:
源程序第11行有错误,错误的内容是:
Undefinedsymbol‘area’infunctionmain(符号area在主函数中未被定义)。
可以看到编辑窗口中源程序第11行也是以高亮度显示的,经检查发现变量area未定义,应当修改。
按回车键,激活编辑窗口,光标停留在第11行上,同时在编辑窗口顶部显示出错信息行。
将程序第6行改为:
floata,b,c,s,area;
作了以上的修改后,再按Ctrl+F9键,屏幕上的显示如图8所示。
图8再次运行时的屏幕显示
从中间的窗口可以看到在连接中发现了1个错误。
按任何一个键后,中间的连接信息窗口消失,在屏幕下部的Message窗口中,显示了具体的出错信息,见图9。
第3行是出错信息,内容是:
Undefinedsymbol‘_print’inmodulearea.c(符号print在area.c文件中未被定义),经检查发现库函数的名字写错了,应当修改。
按F6键,激活编辑窗口,将程序第11行的print改为printf。
再按Ctrl+F9键,这次程序就可以开始运行了。
图9错误信息显示
②在TC集成环境中运行
在编辑窗口完成一个源程序的编辑后,如果经过检查认为没有问题,就可以直接按Ctrl+F9键。
这时TurboC将一次完成从编译、连接到运行的全过程。
这是运行TurboC程序最简便常用的方法。
如果在编译或连接中有错,就将停下来,显示出错信息,等用户改正后再按Ctrl+F9键重新编译、连接;如不出错,就自动开始运行。
程序运行时,如有键盘输入语句,屏幕显示会切换到用户屏,此时用户可从键盘输入数据。
在本例中,按Ctrl+F9键以后,屏幕显示切换到用户屏,要求输入数据,用户可从键盘输入:
345
见图10。
图10程序运行时的用户屏幕
按回车键后,屏幕的显示又从用户屏切换回TC窗口,因此用户看不到运行结果。
如果想看运行结果,可按Alt+F5键,此时屏幕显示切换到用户屏。
程序运行的结果显示在用户屏上。
用户在看完运行结果后,如想回到编辑窗口继续对源程序进行编辑修改,可按任一键即回到TC窗口。
下面把最常用的功能键的有关操作简要列出:
Ctrl+F9:
编译、连接、运行
Alt+F5:
观看运行结果
按任一键:
从用户屏切换回TC窗口
③在DOS环境下运行
如果在编译、连接过程中未发现错误,系统就会生成可执行文件.EXE,在DOS环境下进入可执行文件.EXE所在的目录,直接输入可执行文件名,即可运行程序。
在本例中可执行文件名为area.exe,输入命令方式为:
d:
\wt>area
4.用DEBUG方式调试程序
程序的编译和连接没有错误,不等于运行结果一定正确。
编译系统能检查出语法错误,但无法检查出逻辑错误。
在本例中,经过修改,这个源程序已经没有语法错误,顺利通过编译和连接。
在运行时如输入:
345
则输出结果为:
area=0
这个结果显然是不对的。
可能用户难以很快地找出错误的原因,这时可采用下面介绍的两种动态调试方法。
①单步执行
这种方法的特点是:
程序一次执行一行。
每执行完一行后,就停下来,用户可以检查此时各有关变量和表达式的值,以便发现问题所在。
对本例中的程序,重新开始运行,按F7键,可以看到在编辑窗口的源程序的主函数main()处,用高亮度显示,表示准备进入main函数。
同时可以看到屏幕下部的Message窗口变成了Watch窗口,它是观察数据用的,见图11。
图11单步执行时的屏幕显示
再按一次F7键,亮条移到第8行(第6行是对变量的定义,不是执行语句,故被跳过),表示下一步要执行此行。
再按一次F7键,此时执行第8行,由于该行是scanf函数语句,需要输人数据,所以切换到用户屏,用户在此处输入:
345
按回车键后,屏幕显示切换到编辑窗口,亮条移到第9行,表示第8行已执行完毕。
再按两次F7键,亮条移到第11行,表示第10行已执行完毕。
此时可以检查一下有关变量的值是否正确。
按Ctrl+F7键,在编辑窗口中出现一个观察数据的输入框。
如果我们想查看变量a的值,就在此框内输入字符a,见图12。
图12输入观察表达式
按回车键后,该输入框消失,在屏幕下部的Watch窗口显示出a的当前值3.0,见图13。
图13观察窗口内显示指定表达式的值
如果还想查变量b的值,需要重新按Ctrl+F7键,并在Addwatch框内输入字符b,然后按回车键,就可在Watch窗口看到变量b的值是4.0。
用同样方法可得到变量c的值5.0,变量s的值6.0,变量t的值36.0。
现在,Watch窗口中的信息如下:
t:
36.0
s:
6.0
c:
5.0
b:
4.0
a:
3.0
最先查看的a值在最下面一行,最后查看的s值在最上面一行。
这些值都是正确的,没有问题。
应再继续运行,检查后面的语句有无问题。
再按一次F7键,亮条移到main函数的第12行,表示第11行已执行完毕。
此时,按Ctrl+F7键,在Addwatch框内输入area并按回车键,在Watch窗口中显示出area的值是6.0,而不是0。
三角形面积应该等于此值。
那么为什么printf函数会输出0呢?
我们再按F7键,亮条移到main函数的第13行,表示第12行已执行完毕。
在Watch窗口中显示出area的值仍然是6.0,说明area的值是对的,而printf函数语句的输出不对。
由于printf函数语句已执行完,应当在用户屏上有输出,用Alt+F5观察用户屏上的显示,发现输出结果为area=0。
至此,出错的范围已缩得很小了,就在printf函数语句内,而且肯定是输出格式有问题,导致未能正确输出一个数据。
经仔细检查,发现用了输出整数的格式符%d,这就查出了出错的原因。
将%d改为%f,再用Ctrl+F9运行程序。
在输入3,4,5之后,输出结果为:
area=6.000000
结果正确。
以上我们通过一个简单的例子详细地介绍了如何用单步执行的方法进行动态调试。
实际上,对这种简单的程序,许多人可能很快就能查出错误所在,而不必采用单步执行方法,我们主要是通过这个例子来说明如何使用F7和Ctrl+F7键检查程序的错误。
上面是用功能键实现单步执行的方法,也可以通过选择菜单命令来实现单步执行。
用Run下拉菜单中的Traceinto命令也能使程序单步执行,相当于按一次F7键。
选择主菜单条中的Break/watch后按回车键,得到下拉菜单。
从中选择Addwatch,并按回车键,也可得到Addwatch输入对话框,相当于按一次Ctrl+F7键。
显然,用功能键比用菜单选择方便得多。
②设置断点
单步执行法能有效地、一行一行地检查感兴趣的数据的值,但是如果程序很长,是难以逐行进行检查的。
对于一个较长的程序,常用的方法是在程序中设若干个断点,程序执行到断点时暂停,用户可以检查此时有关变量或表达式的值。
如果未发现错误,就使程序继续执行到下一个断点,如此一段一段地检查。
这种方法实质上是把一个程序分割成几个分区,逐区检查有无错误,这样就可以将找错的范围从整个程序缩小到一个分区,然后集中精力检查有问题的分区。
再在该分区内设若干个断点,把一个分区分成几个小区,然后寻找有错的小区。
用这种方法可不断缩小找错范围直到找到出错点。
设断点的方法是:
将光标移到某一行上,然后按Ctrl+F8键,此行就以颜色条覆盖,作为断点行。
如果想取消断点行,则将光标移到断点行上,再按一次Ctrl+F8键,颜色条消失,该行就不再是断点行。
运行时遇断点行暂停,此时,用户可以用前面介绍过的方法查看有关变量和表达式的值。
如果想继续运行,再按一次Ctrl+F9键即可。
按Ctrl+F9使此程序运行,输入a、b、c的值1、2、6。
在结束运行后,按Alt+F5键观察用户屏,发现输出为:
sqrt:
DOMAINerror
Floatingpomterror:
Overflow.
这显然不对。
为了找出问题所在,可在程序中第9行、第11行和第12行设置断点,把光标先后移到这三行,并按Ctrl+F8键,这三行就被红色条覆盖,如图14所示。
图14红色覆盖的行表明已设置断点
按Ctrl+F9运行程序,执行到scanf函数语句时,切换到用户屏,输入a、b、c的值。
这次输入:
126
程序继续执行到第一个断点行暂停。
请注意是遇到断点行即暂停,所以断点行并未被执行,只执行到断点行的上一行。
此时按Ctrl+F7键查看a,b,c的值,从Watch窗口可以看到a,b,c的值是正确的。
到目前为止,并未发现程序有错误。
再按Ctrl+F9键使程序继续运行,到第二个断点暂停。
此时再按Ctrl+F7键查看t的值,从Watch窗口可以看到t的值为-59.0625,t为负值在计算平方根时会出现错误。
为证明此点,按Ctrl+F9继续运行,执行“area=sqrt(t);”时屏幕闪了一下(这是程序向用户屏输出信息,然后又切换回TC窗口而产生的),按Alt+F5键观察用户屏,可看到出错信息:
sqrt:
DOMAINerror
Floatingpomterror:
Overflow.
表示在调用sqrt函数时,出现数据范围的错误(sqrt要求参数值不小于0,负数超出了有效范围),引起“浮点数错误——溢出”。
这个错误是由于输入a,b,c的值不恰当而造成的,程序本身并无错误,不需要修改程序。
在以后运行时应注意使输入的三角形三边的值要满足三角形的性质:
两边之和大于第三边。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验03 C程序的调试方法 实验 03 程序 调试 方法