讀古今文學網 > C語言解惑 > 13.7 調試程序實例 >

13.7 調試程序實例

1.編程題目

【例13.13】有5個小學生,每個學生有數學和語文二門功課。從鍵盤上輸入學生學號、姓名及成績,計算出平均成績後,輸出每個人的平均成績,然後將數據全部存入磁盤文件「stud」之中。

下面是為它設計的源程序清單。


#include <stdio.h>
#define TOTAL 4
struct 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      47
ZhangHong   88
  

運行結果是當sum為偶數時不對,跟蹤監視sum,如圖13-12所示。從圖中可見,if語句少了配套的else語句。

圖13-12 跟蹤監視sum變量和stu結構成員示意圖

注意:調試完畢,將TOTAL改回原值。

3.小結

(1)應根據錯誤結果決定查錯範圍。

(2)正確選擇要觀察的變量表達式。

(3)選擇各種可能的測試數據。