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