天天看點

作業三:四則運算複審

四則運算複審

     我複審的是計科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;
        }
    }
}



總結:
     我覺得她的代碼在關鍵的地方都加上了注釋,我在讀她的代碼的過程中會感覺到輕松很多。同時她的注釋基本上沒有加在那些顯而易見的代碼的部分,而是加在必要的點上。第二,從整個程式的結構上看,這份代碼的思路十厘清晰,并且每一個子產品的實作都是使用盡可能簡單的方法,這對于日後代碼的維護有很好的作用。第三,從細節上來看,這份代碼在變量命名上非常好,基本上所有的變量的名字都很明确的展現了這個變量的含義。最後,這份代碼對輸入和一些敏感的地方坐了必要的檢查,提高了代碼的穩定性。
    在代碼複審的過程中,我在對方的代碼中看到了一些我需要學習的優點,也看到了自己存在的問題,同時也看到了一些自己需要引以為戒的地方。最後,附上我在學習的關于代碼評價的内容。      
作業三:四則運算複審