機考如何避免范圍性錯誤
小編:參加上機考試的朋友最忌諱犯的錯誤就是粗心,有時明明會做的題,卻因為一個小小的符號錯誤導致全盤皆輸。下面這位朋友在做上機練習時,發現自己所編程序的運行結結果正確無誤,但評分系統沒有給分,這是為什么呢?下面讓她來告訴我們其中的原委。
在上機操作時,要多注意循環的范圍。這種錯誤往往只有一個符號之差,用run運行時并不報錯,在你輸入數據后查看結果時,可能結果顯示也正確,但卻不一定能得分。我在復習過程中,做上機模擬時遇到了這種情況:運行結果正確,評分時卻是0分。下面這道題并不難,卻讓我頗費周折,大家不妨看看,也好引以為戒。
“請編寫一個函數void fun(int x,int pp[ ],intn)。它的功能是:求出能整除x且不是偶數的各整數,并放在數組pp[ ]中,這些除數的個數由n返回。運行時輸入x的值為30。”
(注意:部分源程序在文件prog.c中。請勿改動主函數main和其他函數中的任何內容,僅在函數fun的花括號中填入你編寫的若干語句。)
我是這樣編寫的:
void fun(int x,int pp[ ],int n)
{
int i, j=0,point;
point=pp;
for(i=1,i
if((x%i= =0)&&&&(i%2!=0))
{ point=i;
point++;
j++; }
point=NULL;
n=j;
}
按F9未顯示異常,按ctrl +F9后輸入“30”,結果是:“1 3 5 15”。再次驗證輸入40,結果是:“1 5”。多次驗證(用20、50或其他偶數)結果都正確,可就是評分系統卻不給分。我開始懷疑評分系統是不是做得太死板了,或有錯誤。
打開答案,發現答案的解題思路和我的是一致的,參考答案如下:
#include
#include
void fun(int x,int pp[ ],int n)
{
int i ;
int j=0;
int point;
point=pp;
for(i=1,i<=x;i++)
{if((x%i= =0)&&&&(i%2!=0))
{ point=i;
point++;
j++; }
}
point=NULL;
n=j;
}
main()
{ int x,aa[1000],n,i;
cl
rscr;
printf(“\n please enter an integer number:\n);
scanf(“%d”,&&x)
fun(x,aa,&&n);
for(i=0;i
printf(“%d”,aa[i]);
printf(“\n”);
NONO( );
}
我的解答和答案相比,只有幾處不同:答案中從if語句前,一直到j++后,還有一層“{ }”;在定義變量時的寫法不同,我是用一條語句定義了變量和指針,答案卻用了三條語句。雖然認為這兩處都不會影響程序的運行,但還是按它的意思做了修改。
修改后重新運行,再看評分還是0分。這就更讓我肯定自己編寫無誤,是評分系統的問題。這時候,粗心的我并沒有發現for語句內的第二表達式是小于等于x而不是小于x。也許是只注意結果的正確,主觀上沒懷疑程序有問題。
就在我準備放棄的時候,還是不甘心,再仔細看一遍答案,才突然發現第二表達式的錯誤。
我這才明白了為什么每次運行結果都正確卻不給分的原因:驗證輸入的數字(x)都用的是偶數。按本題的題意,偶數是不會顯示在結果中的。但如果輸入的是27、31或 41,由于結果沒有顯示這些數的本身,那么就會及早發現程序中的毛病,就能想到循環的范圍。
在正式考試的時候,沒有答案可循,更沒有評分系統可用。所以,我們在輸入數字時一定要根據題意全面選擇輸入的數字,也好及早發現程序中的錯誤。另外還有兩個小建議:
1. 編寫程序時,一般主函數已經給出,只讓考生編寫某個子函數,這時你若定義了指針指向形參中的某個數組,那么在最后一定不要忘了給指針賦值NULL(或0或‘\0’),以防止指針越界。
2. 先保存再運行,以備程序編寫欠妥導致死機。
·2009年計算機等考一級WPS上機考試指導(六) (2009-9-17 17:26:38)
·2009年計算機等考一級WPS上機考試指導(五) (2009-9-17 17:18:25)
·2009年計算機等考一級WPS上機考試指導(四) (2009-9-17 17:14:45)
·2009年計算機等考一級WPS上機考試指導(三) (2009-9-17 17:09:59)
·2009年計算機等考一級WPS上機考試指導(二) (2009-9-17 17:05:19)