《C语言程序设计》案例讲义 - 完整版

发布时间 : 星期一 文章《C语言程序设计》案例讲义 - 完整版更新完毕开始阅读

【例6-1】程序 #include #include main() {

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 #include main() {

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

联系合同范文客服:xxxxx#qq.com(#替换为@)