首页 » C语言解惑 » C语言解惑全文在线阅读

《C语言解惑》13.7 调试程序实例

关灯直达底部

1.编程题目

【例13.13】有5个小学生,每个学生有数学和语文二门功课。从键盘上输入学生学号、姓名及成绩,计算出平均成绩后,输出每个人的平均成绩,然后将数据全部存入磁盘文件“stud”之中。

下面是为它设计的源程序清单。


#include <stdio.h>#define TOTAL 4struct student {      char num[6];      char name[20];      int score[2];      int  ave;} stu[TOTAL];void main ( ){     FILE *fp;     int i,j,sum;     char *cnum={"数学","语文"};     i=j=sum=0;     for (i=0; i<=TOTAL; i++ )       {          printf("/n请输入学生%d 的成绩:/n",i+1);          printf("学号:");          scanf("%s",stu[i].num);          printf("姓名:");          scanf("%s",stu[i].name);          sum=0;          for(j=0;j<=1;j++);          {              printf("%s成绩:", cnum[j]);              scanf("%d",&stu[i].score[j]);              sum+=stu[i].score[j];          }          if(sum%2==0) sum=sum/2;          sum=(sum+1)/2;                stu[i].ave=sum;     }     printf("平均成绩/n");     for(i=0;i<=TOTAL;++i)          printf("%s/t%d/n",stu[i].name,stu[i].ave);     fp=fopen("stud", "w");     for (i=0; i<=TOTAL; i++)          if (fwrite(&stu[i],sizeof(struct student ),1 ,fp)!=1)                printf("文件写出错 /n");     fclose(fp);}  

程序编译通过,运行后出现如下情况,请通过跟踪程序执行情况找出错误。

调试示例:

请输入学生1的成绩:


学号:1001姓名:LiMing(null)成绩:89  

2.使用VC跟踪查错

从输出结果上分析,应输出“数学成绩:”时出错。如图13-11所示,在右边窗口设立观察数组cnum,然后在要求输入成绩的printf语句处设立断点,或者简单地将光标置于此处,按Ctrl+F10键,使程序运行并按要求输入学号和姓名。当程序运行到此处时,得到如图13-11所示的结果。显然,当前的j=2,不是预定的j=0。这是因为for语句右边多了“;”号,造成for语句空循环,cnum[2]超出定义范围。

图13-11 观察数组cnum示意图

注意:为了加快查错速度,将TOTAL重新定义为1。

下面是改错之后的运行示例(还有错误)。


请输入学生1 的成绩:学号:1001姓名:LiMing数学成绩:99语文成绩:89请输入学生2 的成绩:学号:1002姓名:ZhangHong数学成绩:88语文成绩:87平均成绩:LiMing      47ZhangHong   88  

运行结果是当sum为偶数时不对,跟踪监视sum,如图13-12所示。从图中可见,if语句少了配套的else语句。

图13-12 跟踪监视sum变量和stu结构成员示意图

注意:调试完毕,将TOTAL改回原值。

3.小结

(1)应根据错误结果决定查错范围。

(2)正确选择要观察的变量表达式。

(3)选择各种可能的测试数据。