一、需求分析
任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:23 - 3 * 4 = 11。
统计用户共答对多少道题。
二、功能设计
1.根据用户要求的题目数n,循环n次输出随机的四则运算。
2.判断用户输入值是否正确,并给出正确题目数。
3.运算答案不能小于0,小于0就重新在后台出题目。
三、详细设计
随机产生三个100以内的正整数和四个分别用“1”-“4”代表+,-,*,/运算符号,通过对四则运算中乘除和加减的优先级别判断:先乘除后加减,在计算函数中遍历运算符数组中乘除符号后进行优先计算,之后再对乘除计算之后的运算数进行相加减运算。
遇到当随机产生的正整数运算题计算结果为负数时,递归重新生成运算题,直至结果是大于零时所产生的题目打印在控制台上,用户输入答案,答案与结果匹配正确即累加正确题数,错误的输出打印正确结果,当全部运算题做完后输出统计结果。
代码实现:
int random(double start, double end)//获取随机数函数
{
return (int)(start+(end-start)*rand()/(RAND_MAX+1.0));
}
char getSignala()//获取随机运算符函数
{
int a;
char signal1[4]={'+','-','*','/'};
srand((unsigned)time(NULL));
a = rand()%4;
return signal1[a];
}
char getSignalb()//获取随机运算符函数
{
int b;
char signal2[4]={'+','-','*','/'};
srand((unsigned)time(NULL));
b = rand()%4;
return signal2[b];
}
int getResult(int num1,int num2,int num3,char signal1,char signal2)//结果计算函数
{
int i=0,res;
if(signal1=='+')
{
if(signal2=='+')
{
res=num1+num2+num3;
}
if(signal2=='-')
{
res=num1+num2-num3;
}
if(signal2=='*')
{
res=num2*num3+num1;
}
if(signal2=='/')
{
res=num2/num3+num1;
}
}
if(signal1=='-')
{
if(signal2=='+')
{
res=num1-num2+num3;
}
if(signal2=='-')
{
res=num1-num2-num3;
}
if(signal2=='*')
{
res=num2*num3-num1;
}
if(signal2=='/')
{
res=num2/num3-num1;
}
}
if(signal1=='*')
{
if(signal2=='+')
{
res=num1*num2+num3;
}
if(signal2=='-')
{
res=num1*num2-num3;
}
if(signal2=='*')
{
res=num2*num3*num1;
}
if(signal2=='/')
{
res=num2/num3*num1;
}
}
if(signal1=='/')
{
if(signal2=='+')
{
res=num1/num2+num3;
}
if(signal2=='-')
{
res=num1/num2-num3;
}
if(signal2=='*')
{
res=num2*num3/num1;
}
if(signal2=='/')
{
res=num2/num3/num1;
}
}
return res;
}
int takeTest()//题目生成函数
{
int get;
int num1,num2,num3,a;
char signal1,signal2;
srand((unsigned)time(NULL));
signal1=getSignala();
srand((unsigned)time(NULL));
signal2=getSignalb();
num1=random(1,100);
num2=random(0,100);
num3=random(1,100);
if(signal1=='-')
{
if(num1<num2)
{
int temp;
temp=num1;
num1=num2;
num2=temp;
}
}
if(signal1=='/')
{
if(num2==0)
{
int temp;
temp=num1;
num1=num2;
num2=temp;
}
}
printf("%d%c%d%c%d=",num1,signal1,num2,signal2,num3);
scanf("%d",&get);
fflush(stdin); //清空输入缓冲区
if(getResult(num1,num2,num3,signal1,signal2)==get)
{
printf("回答正确!\n");
a=1;
}
else
{
printf("I回答错误!\n");
printf("正确答案是: %d\n",getResult(num1,num2,num3,signal1,signal2));
a=0;
}
return a;
}
void main()
{
int n,a,right=0,i=0;
double percent;
printf("请选择问题数目:");
scanf("%d",&n);
for(i;i<n;i++)
{
a=takeTest();
right=right+a;
}
printf("回答完毕!\n");
printf("回答正确数量:%d\n",right);
percent=((double)right*100.00)/(double)n;
printf("正确率:%0.2f %%\n",percent);
}
四、运行结果
五、问题及解决办法
问题:不知道如何做到答案不为负数的问题。有时候会出现负数的情况,还有我的运算符也没有做到不同。
六、过程耗时估计与统计表
PSP2.1 | Personal Software Process Stages | 预计时间(分钟) | 实际时间(分钟) |
Planning | 计划 | 20 | 30 |
· Estimate | 估计这个任务需要多少时间 | 180 | 180 |
Development | 开发 | 120 | 2000 |
· Analysis | 需求分析 (包括学习新技术) | ||
· Design Spec | 生成设计文档 | 10 | |
· Design Review | 设计复审 | ||
· Coding Standard | 代码规范 | ||
· Design | 具体设计 | ||
· Coding | 具体编码 | ||
· Code Review | 代码复审 | ||
· Test | 测试(自我测试,修改代码,提交修改) | 60 | |
Reporting | 报告 | ||
· | 测试报告 | ||
计算工作量 | |||
并提出过程改进计划 |