本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2166
我的github远程仓库的地址:https://github.com/LiuQSong/learnning
第一部分:要求
具体要求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:
23 - 3 * 4 = 11
第二部分:个人软件过程耗时估计与统计表
PSP2.1 | Personal Software Process Stages | Time Senior Student | Time |
Planning | 计划 | 5 | 10 |
· Estimate | 估计这个任务需要多少时间 | 157 | 173 |
Development | 开发 | 60 | 73 |
· Analysis | 需求分析 (包括学习新技术) | 6 | 10 |
· Design Spec | 生成设计文档 | 5 | 6 |
· Design Review | 设计复审 | 4 | 6 |
· Coding Standard | 代码规范 | 2 | 2 |
· Design | 具体设计 | 10 | 12 |
· Coding | 具体编码 | 36 | 21 |
· Code Review | 代码复审 | 3 | 5 |
· Test | 测试(自我测试,修改代码,提交修改) | 10 | 12 |
Reporting | 报告 | 9 | 12 |
· | 测试报告 | 3 | 2 |
· | 计算工作量 | 2 | 1 |
· | 并提出过程改进计划 | 2 | 1 |
第三部分:软件设计与实现
设计思想:把运算式的显示和运算结果的计算分别写在两个方法里面,之后用一个产生随机数的方法把它们绑定在一起,实现计算结构和计算式的统一,避免负数结果就用判断语句,做题次数则使用循环语句,而运算式中的运算符与运算符号的使用都是用选择判断语句(switch)实现。
实现代码:
public static void main(String[] args){ int times=0; //用户输入题数 int flag=0; //记录正确题数 double answer=0; //用户输入的答案 double percent=0; //正确率 Scanner inputNumber = new Scanner(System.in); Scanner answer1 = new Scanner(System.in); System.out.println("请输入题数:"); times = inputNumber.nextInt(); for(int i=0;i<times;i++) { double corret; do { corret = timu(); }while (corret<0); answer = answer1.nextDouble(); if(answer==corret){ System.out.println("回答正确"); flag=flag+1; } else{ System.out.println("回答错误,正确答案是:"+corret); } } percent=(double)flag/times*100; System.out.println("正确率为:"+percent+'%'); }
使用do-while来避免得到负数,用for循环执行要求次数,创建一个方法timu()显示算式并返回一个double类型的运算结果并且赋予给corret,判断是否负数,负数就再执行一次,用corret与用户输入的值进行比对看是否正确。
public static double timu(){ int sign1 =(int)(Math.random()*3); //产生1-4的随机数 运算符号1 int sign2 =(int)(Math.random()*3); //产生1-4的随机数 运算符号2 int x=1+(int)(Math.random()*99); int y=1+(int)(Math.random()*99); int z=1+(int)(Math.random()*99); String result=""; double result1=0; result=count(x,y,z,sign1,sign2); result1=count1(x,y,z,sign1,sign2); if(result1>=0) { System.out.println(result + "=? (答案保留一位小数)"); } return result1; }
使用一个方法来产生随机数并且绑定算式与结果,并且在该方法显示题目,返回正确结果,而这里if语句防止得到负数从而再次执行时显示出算式。
public static String count(int x,int y,int z,int sign1,int sign2){ String result=""; String sign3=""; String sign4=""; sign3=sign4; sign4=sign3; String x1 = String.valueOf(x); String y1 = String.valueOf(y); String z1 = String.valueOf(z); switch(sign1){ case 0:sign3="+";break; case 1:sign3="-";break; case 2:sign3="x";break; case 3:sign3="/";break; default:sign3="+"; } switch(sign2){ case 0:sign4="+";break; case 1:sign4="-";break; case 2:sign4="x";break; case 3:sign4="/";break; default:sign4="+"; } result=x1+sign3+y1+sign4+z1; return result; } public static double count1(int x,int y,int z,int sign1,int sign2){ double result=0; .... String test =new DecimalFormat("0.0").format(result); result = Double.valueOf(test); return result; } }
传入相同的值给count与count1,使得算式与结果一致,count得到算式,count1得到结果,count1执行计算。
执行结果:
:
第四部分:遇到的问题与总结
遇到的问题:
(1)我在编程该程序的时候参考了一下网上的算法,发现他们都是用出栈入栈进行运算优先级的处理与总体运算,而我一开始没有计划到这样做,只好一条路走到黑,痛点在运算方法count1()太过木讷,只能靠运算的规格不大才用这种多个if语句执行各种运算情况。
(2)怎么处理小数让用户输入的和程序产生的结果得到统一,后来我使用
String test =new DecimalFormat("0.0").format(result); result = Double.valueOf(test);
这种方法进行保留一位小数,先得到保留一位小数的字符型test先得到保留一位小数的字符型test,然后再转成浮点数赋予result。
总结:
使用的时间比预想使用的多了16分钟,其实我以为本来会更少的,没想到比想像中的难,也有自己基础不扎实的原因,我更深刻地了解到编程需要不断专研不断锻炼才能得心应手。在日后的编程学习生活里面我会更加努力。