2016012059 - 四则运算
coding.net源码仓库地址:https://git.coding.net/moyuming/XiangMu.git
测试步骤:
1.进入src文件夹
2.在命令行输入javac Main.java
3.回车再输入java Main 10
4.回车,将会在根目录下(与src同级)产生result.txt需求分析
(一)题目:尝试按照《构建之法》第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个3到5个运算符的四则运算练习的命令行软件 开发。软件基本功能要求如下:
- 程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
- 为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3÷5+2=2.6,2-5+10=7等算式。
- 练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
- 当程序接收的参数为4时,以下为一个输出文件示例。
2018010203
13+17-1=29
11*15-5=160
3+10+4-16=1
15÷5+3-2=4
软件附加功能要求如下:支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。扩展程序功能支持真分数的出题与运算(只需要涵盖加减法即可),例如:1/6 + 1/8 + 2/3= 23/24。注意在实现本功能时,需支持运算时分数的自动化简,比如 1/2+1/6=2/3,而非4/6,且计算过程中与结果都须为真分数。
功能设计
能够根据用户输入的参数n随机产生n道符合要求的练习题,自动算出答案,并将式子与答案以文档的形式呈现。
设计实现
由src文件下Main类实现(如图)
首先提示用户输入参数,并判断是否合法
穿件输入结果的文件result
实现生成随机数和随机四则运算
算法实现
因为没有没有学多少算法,所以只能自己实现设定好几个固定的公式,然后再用计算机实现随机从这几个公式里面挑选出对应的公式打印出来,我也不知道这算不算算法,只是自己只能理解这样的算法,所以也还算随机的算式吧。
测试运行
首先编译源文件,然后进行非法输入测试;
进行正确输入后检查输出是否正确:
(注:在自己电脑上一直报错,所以测试运行也是在别人的电脑上做的,所以文件路径不一样)
Result文件里的结果:
代码展示
1 2 import java.io.BufferedWriter; 3 import java.io.File; 4 import java.io.FileWriter; 5 import java.io.IOException; 6 import java.util.Scanner; 7 public class Main { 8 9 public static void main(String []args) throws IOException{ 10 11 Scanner input=new Scanner(System.in); 12 int n=0; 13 System.out.println("请输入要产生多少道四则运算练习题:");//提示用户输入多少个四则运算 14 try { 15 n=input.nextInt(); 16 if(n>=1000||n<=1){ 17 System.out.println("对不起,只允许输入1-1000的整数!");//判断是否输入的是1-1000之间的整数 18 return; //结束运行 19 } 20 }catch (Exception e){ //输入非数字字符等 21 System.out.println("对不起,只允许输入1-1000的数字!"); 22 return; //结束运行 23 24 } 25 26 27 28 File writename = new File("result.txt");//建立文件夹result来保存运算结果 29 writename.createNewFile(); 30 @SuppressWarnings("resource") 31 BufferedWriter out = new BufferedWriter(new FileWriter(writename)); 32 out.write("***************************\r\n"); 33 out.write("2016012059\r\n");//向文件夹输入学号 34 for(int i=0;i<n;i++)//for循环生成n个随机等式 35 { 36 int num1=(int)(Math.random()*100); 37 int num2=(int)(Math.random()*100); 38 int num3=(int)(Math.random()*100); 39 int num4=(int)(Math.random()*100); 40 int x=(int)(Math.random()+1); 41 switch(x) 42 { 43 case 0: 44 while(true){ 45 num4= (int) (Math.random()*100+1 );//保证 分母不为零 46 if(num3%num4==0) 47 { 48 System.out.println(num1+"+"+num2+"+"+num3+"/"+num4+"="); 49 out.write(num1+"+"+num2+"+"+num3+"/"+num4+"="+(num1+num2+num3/num4)+"\r\n"); 50 break; 51 } 52 53 } 54 55 case 1: 56 if(num1>num2) { 57 System.out.println("("+num1+"-"+num2+")"+"+"+num3+"*"+num4+"="); 58 out.write("("+num1+"-"+num2+")"+"+"+num3+"*"+num4+" = "+((num1-num2)+num3*num4)+"\r\n"); 59 break; 60 } 61 case 2: 62 System.out.println(num1 + "*" + num2+"+" +num3+"+"+num4+" = "); 63 out.write(num1 + "*" + num2+"+" +num3+"+"+num4+" = "+(num1*num2+num3+num4)+"\r\n"); 64 break; 65 case 3: 66 while(true){ 67 num2 = (int) (Math.random()*100 + 1); 68 if(num1%num2==0) 69 { 70 if(num1/num2+num3>=num4) 71 System.out.println(num1 + "/" + num2 +"+"+ num3+"-"+num4+" = " ); 72 out.write(num1 + "/" + num2 +"+"+ num3+"-"+num4+" = " +(num1/num2+num3-num4)+"\r\n"); 73 break; 74 } 75 } 76 case 4: 77 while(true) { 78 num2 = (int) (Math.random()*100 + 1);//保证分母不为零 79 num4 = (int) (Math.random()*100 + 1); 80 if(num1%num2==0) 81 { 82 if(num3%num4==0) 83 System.out.println(num1 + "/" + num2 +"+"+ num3+"/"+num4+" = " ); 84 out.write(num1 + "/" + num2 +"+"+ num3+"/"+num4+" = " +(num1/num2+num3/num4)+"\r\n"); 85 break; 86 } 87 } 88 case 5: 89 if(num1*num2>num3*num4) { 90 System.out.println(num1+"*"+num2+"-"+num3+"*"+num4+"="); 91 out.write(num1+"*"+num2+"-"+num3+"*"+num4+"="+(num1*num2-num3*num4)+"\r\n"); 92 break; 93 } 94 case 6: 95 while(true){ 96 num2 = (int) (Math.random()*100 + 1); 97 if(num1%num2==0) 98 System.out.println(num1 + "/" + num2 +"+"+ num3+"*"+num4+" = " ); 99 out.write(num1 + "/" + num2 +"+"+ num3+"*"+num4+" = " +(num1/num2+num3*num4)+"\r\n"); 100 break; 101 } 102 } 103 out.flush(); // 将数据写入文件 104 } 105 } 106 } 107 108
psp
PSP |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
10 |
20 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
5 |
20 |
Development |
开发 |
5*60 |
7*60 |
Analysis |
需求分析 (包括学习新技术) |
10*60 |
8*60 |
Design Spec |
生成设计文档 |
30 |
50 |
Design Review |
设计复审 (和同事审核设计文档) |
20 |
60 |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
10 |
20 |
Design |
具体设计 |
30 |
60 |
Coding |
具体编码 |
10*60 |
13*60 |
Code Review |
代码复审 |
30 |
60 |
Test |
测试(自我测试,修改代码,提交修改) |
2*60 |
1*60 |
Reporting |
报告 |
2*60 |
60 |
Test Report |
测试报告 |
1*60 |
30 |
Size Measurement |
计算工作量 |
20 |
20 |
Postmortem & Process Improvement Plan |
事后总结, 并提出过程改进计划 |
30 |
50 |
总结
其实通过这次测试之后,还是有好多的感触的,同时来到大学现在差距就好大了,老师布置的作业别人一天就可以搞定,而自己怎么做都做不出来,就是上的代码,也是看着网上的敲得,感觉对这方面一片空白,也什么都不会,有时候还是很气馁的,觉得自己浪费了好多时间,以前就知道玩,也没学多少,所以这次的作业还是很有帮助的,虽然代码只明白了一些,可是从中还是体会到自己现在多差劲,明白自己该努力,不要因为不喜欢这个专业就不好好学,想来想去这不是成绩也不是兴趣的问题,而是态度,以前我对什么都是不屑一切的态度,现在我想我得改一下了,也希望以后自己能好好学,至少过四级,至少学一点专业课。对于这次的作业我其实不想说太多,因为我也是看了好多网上的代码,然后找到了自己能理解的代码敲得,也没有多少自己的想法,因为自己的想法以自己的代码水平更本实现不了,但是我还是学会了一些东西,希望以后能学到更多。