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