当前位置:首页 > 《C语言程序设计》案例讲义 - 完整版
【例6-1】程序 #include
int i,n;
float sum; clrscr();
scanf(“%d”,&n);
sum=1; /*存放阶乘值的变量赋初值1*/ for(i=1;i<=n;i++)
sum=sum*i; /*循环体*/ printf(“%f\\n”,sum); }
【例6-2】程序 #include
int j;
float sum; clrscr();
sum=1; /*存放和值的变量赋初值1,这时需要注意*/ for(j=2;j<=50;j=j+2)
sum=sum+1.0/j; /*循环体*/ printf(“%f\\n”,sum); }
三、习题
1. 编程求1000以奇数的和。 2. 编程求1!+2!+??+n!。 3. 编程打印下述图形。
88888888888 88888888888
88888888888 88888888888
4. 编程打印下图(思考题) *
***
*****
四、实验 实验七 for语句构成的循环结构程序
4.1实验目的
1. 掌握循环结构程序的调试方法; 2. 掌握实现循环结构的for语句。
4.2设置断点调试程序的方法
单步执行程序的方法能有效地、一行一行地执行并检查感兴趣变量的值,但是如果程序很长,是
41
难以逐行进行检查的。对于一个较长的程序,常用的方法是在程序中设置若干个断点,程序执行到断点处暂停,用户可以检查此时有关变量或表达式的值。如果未发现错误,就继续执行程序直到下一个断点处,如此一段一段地检查;若在某断点处发现错误,则修改程序,再次重复执行,直到得到正确的结果。这种方法是把一个程序分割成几个段,逐段检查有无错误,从而缩小范围,然后集中精力检查有问题的段。
断点设置的方法是:将光标移到要设置断点的行上,用快捷键CTRL+F8,或者是使用菜单Break/watch下的子菜单Toggle breakpoint。取消断点和设置断点的方法一样,快捷键和菜单命令也一样。下面仍然通过一个例子来讲解断点的设置和调试程序的方法。
2
【例】求解一元二次方程式ax+bx+c=0的根。
#include “math.h” #include “stdio.h” #include “conio.h” main() {
float a,b,c,disc,p,q,x1,x2;
scanf(“%f,%f,%f”,&a,&b,&c); clrscr();
disc=b*b-4*a*c; p=-b/(2*a);
q=sqrt(disc)/(2*a); x1=p+q; x2=p-q;
printf(“x1=%d,x2=%d\\n”,x1,x2); }
这个源程序没有语法错误,顺利通过编译和连接。运行时输入: 1,2,1↙ 输出结果为: x1=0,x2=0
这个结果显然不对。为了找出问题所在,我们通过分析决定在“p=-b/(2*a);”和“printf(“x1=%d,x2=%d\\n”,x1,x2);”语句行设置断点,结果如图6.3所示,这两行以红色显示。
设置断点之后,当使用Run命令执行程序时,遇到断点暂停,并且断点所在行也未被执行,只执行到断点行的上一行。这时就可通过观察窗口检查相关变量的值,见图6.4所示,变量disc的值为0,
图6.3 断点设置结果
42
根据数学知识可知,在输入“1,2,1” 即b=2,a=1,c=1的情况下,disc的值应该是0,由此可知方程应该有两个相等的实根,至此未发现错误。继续全速执行程序,遇到第二个断点时,暂停,再检
图6.4 执行到第一个断点
查相关变量的值,见图6.5所示,可见x1为-1,x2为-1。通过计算可知,方程的两相等实根就是-1,可见到此程序没有问题,那为什么输出结果为0呢?剩下只有一条语句行了,问题就应重点检查“printf(“x1=%d,x2=%d\\n”,x1,x2);”语句行了。变量x1和x2的值确实是正确的方程根,输出时却是错误的,这时经过仔细分析,发现问题出在输出格式上,x1和x2都是实型,可printf中却用了“%d”的格式输出,所以出现错误。
将printf函数中的“%d”改成“%f”,再次运行程序,输出结果为:
x1=-1.000000,x2=-1.000000
结果完全正确。我们再运行一次(断点行不变),这次输入a、b、c的值改为2,3,5。执行到第一个断点暂停,可以看到变量disc的值为-31,方程应该有两个复根,而本程序只能计算实根,当disc的值为负时,在计算平方根时会出现错误。继续运行程序,当执行到“q=sqrt(disc)/(2*a);”时,屏幕
图6.5执行到第二断点
43
闪了一下(这是程序向用户屏幕输出信息,然后又切换到TC窗口而产生的),当执行到第二个断点时,通过用户屏幕可以看到提示的出错信息:
sqrt:DOMAIN error
这个错误提示表示sqrt函数调用时,要求的参数是大于等于0,而本例sqrt函数的参数是-31,从而引起溢出错误。当然这个错误是由于输入a、b、c的值不恰当造成的,程序本身没有错误,不需要修改程序。
一旦程序调试通过,所设置的断点就可清除。断点的设置是有所选择的,一般选择一些关键变量值的改变处,比如上例中disc变量值的变化,这样便于分析变量前后的变化,从而寻找问题。因此调试程序之前需要做好准备工作,全面熟悉程序,做好静态分析,然后再进行动态调试。动态调试时选择单步运行程序还是断点运行程序,这需要具体情况具体对待,对于较短的程序,可以单步运行,对于有些分支程序,也可以通过单步运行来观察分支的条件是否正确。而较长的程序,或者循环的次数较多时,通常采用断点调试方法,这样减少暂停次数,提高调试效率。当然调试程序是项既专业又有技巧的工作,需要不断进行经验总结,才能熟练掌握。
4.3实验内容及步骤
1.用单步调试程序的方法调试案例程序,将求1~100的和,改为求1~5的和。记录如下信息: 程序:
编译结果: 修改记录:
第一次按F7键,i= ,sum= 语句: 第二次按F7键,i= ,sum= 语句: 第三次按F7键,i= ,sum= 语句: ??
2.用设置断点调试程序的方法调试案例程序,将求1~100的和,改为求1~5的和。记录如下信息: 请将“sum=sum+i;”行设成断点。 编译结果: 修改记录:
第一次执行Run命令,i= ,sum= 语句: 第二次执行Run命令,i= ,sum= 语句: 第三次执行Run命令,i= ,sum= 语句: ??
3.用设置断点调试程序的方法调试【例6-1】,并进行记录。 程序:
编译结果: 修改记录: 输入数据1:
第一次执行Run命令,i= ,sum= ,n= 语句: 第二次执行Run命令,i= ,sum= ,n= 语句: 第三次执行Run命令,i= ,sum= ,n= 语句: ?? 输入数据2:
第一次执行Run命令,i= ,sum= ,n= 语句: 第二次执行Run命令,i= ,sum= ,n= 语句: 第三次执行Run命令,i= ,sum= ,n= 语句: ??
4.用设置断点调试程序的方法调试【例6-2】,自己设计记录内容。 5.选择合适的调试方法调试习题并做好记录。 4.4思考题
1. 请比较单步和断点调试程序方法的优缺点。
44
共分享92篇相关文档