作业三:四则运算复审

四则运算复审

     我复审的是计科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以内数字的四则运算!
");
    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("
测试结束!

");    
}


/* 主菜单选项,分为显示答卷、错题的正确解、再进行一次练习、系统对成绩的评价、退出系统等选项*/
/* 算法:使用printf()函数显示菜单项,用sacnf()函数接收选项字符while条件限定选项的合法性,非法字符则重新输入并返回主函数*/
   
char caidan()
{
   char  c='0';                     /*定义变量*/
   printf("
**********  数学四则运算测试软件  **********


");
   printf("          1.显示答卷        2.错题正解

");
   printf("          3.系统评估        4.错题重做

");
   printf("          5.再次练习        0.退出系统

"); 
   printf("
********************************************");
   printf("
请输入选项(0-5):");      /*提示输入选项*/
   do
   {   scanf("%c",&c);   }          /*输入选项*/
   while(!(c>='0'&&c<'6'));              /*验证选项是否合法,若否则重输*/ 
   return c;                        /*返回选择项*/
}


/*对成绩结果进行评价,便于做题都了解自己的情况,进行有针对性的学习.按分数的不同层次进行评价*/
/*算法:用条件函数switch对成绩score进行分段并给出相应的评价,结果score的数据从主函数获得*/

void pingjia()
{
    printf("你的成绩是%d分.
",fs);  /* 显示测试结果*/
    switch(fs)                                      /*显示评价*/
    {  case  100: printf("全都答对了,好厉害!
");  break;
       case  90:  printf("优秀!差一点就满分了!
");  break;
       case  80:
       case  70:  printf("良好!请继续努力,下次取得更好的成绩!
");  break;
       case  60:  printf("及格!成绩不太理想哟!再接再励吧!
");  break;
       case  50:
       case  40:
       case  30:
       case  20:
       case  10:  printf("多花点功夫吧,不然你会后悔的!!
");  break;
       case  0:   printf("你认真答题了吗!再做一次吧!!!!
");  break;
    }
    printf("

");
}           



/*显示答卷*/
/*各数据从主函数中获取*/

void dajuan()
{
    int j;
    printf("你的答卷为:
");
    for(j=0;j<10;j++)
        printf("%2d %c %2d = %2d
",sy[j],fh[j],sr[j],jd[j]);
    printf("

");
}


/*对错题给出正确的答案*/
/*各数据从主函数中获取*/

void zhengjie()
{
    int k;
    printf("你答错的题的正确答案为:
");
    for(k=0;k<10;k++)
    {   if(jd[k]==jg[k])   continue;
        else
        {
            printf("%2d %c %2d = %2d
",sy[k],fh[k],sr[k],jg[k]);
        }
    }
    printf("

");
}

/*将错题给出,让做题者再次对其进行计算*/
/*各数据从主函数中获取*/

void chongzuo()
{
    int m,n;
    printf("以下是你做错的题,请重做:
");
    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("恭喜!你做对了!
");/*再次对输入的答案进行检验*/
            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("恭喜!你做对了!
");  break;}/*跳出循环*/
                }
            
             }                                       
        }                                                /*循环结束*/
    printf("

");
}


/*主函数*/

int main()
{
    int key=1;
    jisuan();
    while(key)
    {
        switch(caidan())
        {
            case  '1':   {   printf("


"); dajuan();    }     break;
            case  '2':   {   printf("


"); zhengjie();  }     break;
            case  '3':   {   printf("


"); pingjia();   }     break;
            case  '4':   {   printf("


"); chongzuo();  }     break;
            case  '5':   {   printf("


"); jisuan();    }     break;
            case  '0':    key=0;
        }
    }
}



总结:
我觉得她的代码在关键的地方都加上了注释,我在读她的代码的过程中会感觉到轻松很多。同时她的注释基本上没有加在那些显而易见的代码的部分,而是加在必要的点上。第二,从整个程序的结构上看,这份代码的思路十分清晰,并且每一个模块的实现都是使用尽可能简单的方法,这对于日后代码的维护有很好的作用。第三,从细节上来看,这份代码在变量命名上非常好,基本上所有的变量的名字都很明确的展现了这个变量的含义。最后,这份代码对输入和一些敏感的地方坐了必要的检查,提高了代码的稳定性。
在代码复审的过程中,我在对方的代码中看到了一些我需要学习的优点,也看到了自己存在的问题,同时也看到了一些自己需要引以为戒的地方。最后,附上我在学习的关于代码评价的内容。














复制代码
原文地址:https://www.cnblogs.com/yilinwei/p/5313065.html