四則運算複審
我複審的是計科13-1班的邵楠同學的代碼。
以下是她的全部代碼,我直接複制運作了一下,沒有錯誤。
#include "stdio.h"
#include <stdlib.h>
#include <time.h>
#include <ctype.h> /* 字元操作函數*/
/* 定義全局變量*/
int sy[10],sr[10],jd[10],jg[10]; /* sy,fh,sr,jd,jg分别儲存第一運算數,運算
符, 第二運算數,輸入結果,正确結果*/
int fs=0; /* s接收鍵盤輸入的結果,score儲存成績*/
char fh[10]; /* fh儲存運算符号*/
void chufa(int *s1,int *s2,int *s3)
{
int i,b=1,c,jg; /*i為控制循環變量,jg,jd分别儲存輸入結果和正确答案*/
int cs[20]={0},sy,sr; /*cs為除數數組,sy儲存被除數,sr為從cs中抽取的除數*/
srand( (unsigned)time( NULL ) );
FA: sy=rand()%100;
if(sy==0) goto FA;
for(i=1;i<=sy;i++) /*産生除數數組的循環*/
{
if(sy%i==0) { cs[b]=i; b++;}
else continue;
} /*循環結束*/
c=rand()%b; /*随機抽取除數*/
if(c==0) c=c+1;
sr=cs[c];
jg=sy/sr;
*s1=sy; /*指針變量*/
*s2=sr;
*s3=jg;
}
/* 自動生成10道運算題目,數值在0-99之間
每出1道題後等待操作者輸入運算結果
判斷輸入的結果是否正确,正确則加10分
給出最終得分*/
/* 算法:用随機函數rand()産生0-32767之間的整數,與100取餘數後得到0-99之間的整數
運算符也由随機數産生,rand()%4 得到0-3之間的随機數,約定0:減法,1:加法,
2:乘法,3:除法。for循環控制題目數量,每次循環先産生題目并顯示出來,将計
算結果儲存在jg中然後再等待做題的人從鍵盤輸入計算結果儲存在s中,将jg與s進
行比較判定正确性做完10道題後(循環結束),顯示測試結果并進行評價*/
void jisuan()
{
int p; /* p為随機産生的運算符号,規定0為加法,1為減法,2為乘法,3為除法*/
int i,gh; /* i為循環控制變量,gh用于臨時交換資料*/
printf("你将進行的是100以内數字的四則運算!\n");
srand( (unsigned)time( NULL ) ); /* 随即數種子由系統時間函數産生*/
/* 循環産生10道100之内的加減乘除法運算題目*/
for(i=0;i<10;i++)
{
sy[i]=rand()%100; /* 随機産生第一個操作數(1-99)*/
sr[i]=rand()%100; /* 随機産生第二個操作數(1-99)*/
p=rand()%4; /* 随機産生運算符(0-3)*/
if(p==0) /* 轉換成運算符号,p為0表示做加法*/
{ fh[i]='+'; jg[i]=sy[i]+sr[i]; } /* fh為‘+’,jg為sy[i]+sr[i]*/
else if(p==1) /* p為1,表示做減法*/
{ fh[i]='-';
if(sy[i]<sr[i]) { gh=sy[i]; sy[i]=sr[i];sr[i]=gh; } /* 如果sy<sr則交換sy,sr,以保證結果為正數*/
jg[i]=sy[i]-sr[i]; /* fh為‘-’,jg為sy-sr*/
}
else if(p==2) /* p為2表示做乘法*/
{ fh[i]='*'; jg[i]=sy[i]*sr[i]; } /* fh為‘*’,jg為sy*sr*/
else if(p==3)
{
fh[i]='/'; /* p為3表示做除法*/
chufa(&sy[i],&sr[i],&jg[i]);
}
printf("第%2d題: %2d %c %2d = ? ",i+1,sy[i],fh[i],sr[i]); /* 顯示題目*/
scanf("%d",&jd[i]); /* 等待鍵盤輸入計算結果*/
if(jd[i]==jg[i]) fs+=10; /* 如果輸入的結果與計算機運算結果相符則加10分*/
} /* 循環結束*/
printf("\n測試結束!\n\n");
}
/* 主菜單選項,分為顯示答卷、錯題的正确解、再進行一次練習、系統對成績的評價、退出系統等選項*/
/* 算法:使用printf()函數顯示菜單項,用sacnf()函數接收選項字元while條件限定選項的合法性,非法字元則重新輸入并傳回主函數*/
char caidan()
{
char c='0'; /*定義變量*/
printf("\n********** 數學四則運算測試軟體 **********\n\n\n");
printf(" 1.顯示答卷 2.錯題正解\n\n");
printf(" 3.系統評估 4.錯題重做\n\n");
printf(" 5.再次練習 0.退出系統\n\n");
printf("\n********************************************");
printf("\n請輸入選項(0-5):"); /*提示輸入選項*/
do
{ scanf("%c",&c); } /*輸入選項*/
while(!(c>='0'&&c<'6')); /*驗證選項是否合法,若否則重輸*/
return c; /*傳回選擇項*/
}
/*對成績結果進行評價,便于做題都了解自己的情況,進行有針對性的學習.按分數的不同層次進行評價*/
/*算法:用條件函數switch對成績score進行分段并給出相應的評價,結果score的資料從主函數獲得*/
void pingjia()
{
printf("你的成績是%d分.\n",fs); /* 顯示測試結果*/
switch(fs) /*顯示評價*/
{ case 100: printf("全都答對了,好厲害!\n"); break;
case 90: printf("優秀!差一點就滿分了!\n"); break;
case 80:
case 70: printf("良好!請繼續努力,下次取得更好的成績!\n"); break;
case 60: printf("及格!成績不太理想喲!再接再勵吧!\n"); break;
case 50:
case 40:
case 30:
case 20:
case 10: printf("多花點功夫吧,不然你會後悔的!!\n"); break;
case 0: printf("你認真答題了嗎!再做一次吧!!!!\n"); break;
}
printf("\n\n");
}
/*顯示答卷*/
/*各資料從主函數中擷取*/
void dajuan()
{
int j;
printf("你的答卷為:\n");
for(j=0;j<10;j++)
printf("%2d %c %2d = %2d\n",sy[j],fh[j],sr[j],jd[j]);
printf("\n\n");
}
/*對錯題給出正确的答案*/
/*各資料從主函數中擷取*/
void zhengjie()
{
int k;
printf("你答錯的題的正确答案為:\n");
for(k=0;k<10;k++)
{ if(jd[k]==jg[k]) continue;
else
{
printf("%2d %c %2d = %2d\n",sy[k],fh[k],sr[k],jg[k]);
}
}
printf("\n\n");
}
/*将錯題給出,讓做題者再次對其進行計算*/
/*各資料從主函數中擷取*/
void chongzuo()
{
int m,n;
printf("以下是你做錯的題,請重做:\n");
for(m=0;m<10;m++) /*用循環對錯題進行選擇*/
if(jd[m]==jg[m]) continue; /*做對的題則跳過*/
else
{ printf("%2d %c %2d =?",sy[m],fh[m],sr[m]);
scanf("%d",&jd[m]);
if(jd[m]==jg[m]) printf("恭喜!你做對了!\n");/*再次對輸入的答案進行檢驗*/
else /*若仍未做對,則用此函數*/
{
for(n=0;n<3;n++)
{ printf("你仍未做對!你還有%d次機會: ",2-n);/*再次計算*/
printf("%2d %c %2d =?",sy[m],fh[m],sr[m]);
scanf("%d",&jd[m]);
if(jd[m]==jg[m]) { printf("恭喜!你做對了!\n"); break;}/*跳出循環*/
}
}
} /*循環結束*/
printf("\n\n");
}
/*主函數*/
int main()
{
int key=1;
jisuan();
while(key)
{
switch(caidan())
{
case '1': { printf("\n\n\n"); dajuan(); } break;
case '2': { printf("\n\n\n"); zhengjie(); } break;
case '3': { printf("\n\n\n"); pingjia(); } break;
case '4': { printf("\n\n\n"); chongzuo(); } break;
case '5': { printf("\n\n\n"); jisuan(); } break;
case '0': key=0;
}
}
}
總結:
我覺得她的代碼在關鍵的地方都加上了注釋,我在讀她的代碼的過程中會感覺到輕松很多。同時她的注釋基本上沒有加在那些顯而易見的代碼的部分,而是加在必要的點上。第二,從整個程式的結構上看,這份代碼的思路十厘清晰,并且每一個子產品的實作都是使用盡可能簡單的方法,這對于日後代碼的維護有很好的作用。第三,從細節上來看,這份代碼在變量命名上非常好,基本上所有的變量的名字都很明确的展現了這個變量的含義。最後,這份代碼對輸入和一些敏感的地方坐了必要的檢查,提高了代碼的穩定性。
在代碼複審的過程中,我在對方的代碼中看到了一些我需要學習的優點,也看到了自己存在的問題,同時也看到了一些自己需要引以為戒的地方。最後,附上我在學習的關于代碼評價的内容。
