一、需求分析
任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:23 - 3 * 4 = 11。
统计用户共答对多少道题。
二、功能设计
三、详细设计
随机产生三个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 | 需求分析 (包括学习新技术) | 20 | 20 |
· Design Spec | 生成设计文档 | 10 | 20 |
· Design Review | 设计复审 | 10 | 10 |
· Coding Standard | 代码规范 | 10 | 10 |
· Design | 具体设计 | 30 | 30 |
· Coding | 具体编码 | 120 | 180 |
· Code Review | 代码复审 | 30 | 20 |
· Test | 测试(自我测试,修改代码,提交修改) | 60 | 120 |
Reporting | 报告 | 30 | 30 |
· | 测试报告 | 10 | 10 |
· | 计算工作量 | 10 | 10 |
· | 并提出过程改进计划 | 10 | 10 |