个人项目-小学四则运算 “软件”之初版
本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186
我的github远程仓库的地址:https://github.com/manjin666/public
一、题目要求:
像《构建之法》的人物阿超那样,写一个能自动生成小学四则运算题目的命令行 “软件”。
具体要求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:
23 - 3 * 4 = 11
扩展要求:
1) 要求能出和真分数 (二分之一, 十二分之五,等)相关的练习题。
2) 并且要求能处理用户的输入,并判断对错,打分统计。 要求能处理用户输入的真分数, 如 1/2, 5/12 等。
初步拟定要实现的功能后,估计一下自己需要花多长时间。编程过程中记录自己实际用了多长时间。
二、个人软件过程耗时估计与统计表:
PSP2.1 | Personal Software Process Stages | Time Senior Student | Time |
Planning | 计划 | 5 | 8 |
· Estimate | 估计这个任务需要多少时间 | 6 | 10 |
Development | 开发 | 82 | 85 |
· Analysis | 需求分析 (包括学习新技术) | 4 | 6 |
· Design Spec | 生成设计文档 | 2 | 3 |
· Design Review | 设计复审 | 4 | 8 |
· Coding Standard | 代码规范 | 3 | 3 |
· Design | 具体设计 | 4 | 2 |
· Coding | 具体编码 | 36 | 40 |
· Code Review | 代码复审 | 5 | 4 |
· Test | 测试(自我测试,修改代码,提交修改) | 15 | 21 |
Reporting | 报告 | 9 | 6 |
· | 测试报告 | 3 | 2 |
· | 计算工作量 | 2 | 1 |
· | 并提出过程改进计划 | 1 | 1 |
三、项目过程:
项目效果图:
主要的逻辑代码如下,是用Java语言来实现的;
private float getOperationResult(char operation,float x,float y){ float result=0; switch (operation){ case '+': result=x+y; break; case '-': result=x-y; break; case '*': result=x*y; break; case '/': result=x/y; break; } return result; } private void arithmetic(){ int number[]=new int[3]; //运算数量 char []operation=new char[2]; //符号数量 while (true){ for(int i=0;i<number.length;i++){ number[i]=getRandomNumber(); //给变量赋值 } operation[0]=getRandomOperation(); //给符号位赋值 operation[1]=getRandomOperation(); if(operation[0]=='*' || operation[0]=='/'){ //判断第一个是否为*,/ 是,则直接计算 if(number[1]==0)continue; resultNumber=getOperationResult(operation[0],number[0],number[1]); if(operation[1]=='/' && number[2]==0)continue; resultNumber=getOperationResult(operation[1],resultNumber,number[2]); }else { //如果第一个符号位不是* ,/那就先算第二个数和三个数的值后,再与第一个值计算 if(operation[1]=='/'&& number[2]==0)continue; if(operation[0]=='-'){ resultNumber=getOperationResult(operation[1],-number[1],number[2]); operation[0]='+'; } else{ resultNumber=getOperationResult(operation[1],number[1],number[2]); } resultNumber=getOperationResult(operation[0],number[0],resultNumber); } if(resultNumber<0)continue; else break; } // 将数字和符号串联起来 作为输出题目的字符 result=number[0]+""+operation[0]+number[1]+operation[1]+number[2]; System.out.print(result+"="); Scanner sc = new Scanner(System.in); float age = sc.nextFloat(); // 当用户输入的数字和正确答案相比的精确度大于0.01时,判断用户计算错误 if(Math.abs(age-resultNumber)>0.01){ System.out.print("你计算错误,正确的答案为:"+String.format("%.2f", resultNumber)+"\n"); }else{ System.out.print("你计算正确\n"); countTrue++; } }
通过Java来实现这个效果,写起来还是比较繁琐,为了方便修改,很代码模块化,写了比较的多的方法和定义了比较多的变量;
如下图
这个过程还是比较费时间,事前没有花时间去好好规划怎么实现,属于想到哪写到哪;
好在又重新的思考和规划了一下,功能实现了;