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)選擇各種可能的測試數據。