github地址:https://github.com/jiyx/Student_Comput
一、需求分析
1、由用户输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间;
2、运算过程中不得出现负数与非整数,比如不能出 3/5+2=2.6,2-5+10=7等算式;
3、将学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,文件目录与程序目录一致。
例如:当程序接收的参数为4时,输出如下:
软件附加功能要求如下:
支持有括号的运算式,包括出题与求解正确答案。算式中存在的括号必须大于2个,且不得超过运算符的个数。
扩展程序功能支持真分数的出题与运算,运算时分数需自动化简,比如 1/2+1/6=2/3,而非4/6。
二、设计实现
1、运算结果不能为负数和非整数;
2、将学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中。
三、功能实现
四、测试运行
五、核心代码
1、输入题目数量和写入学号
由用户输入要产生的运算式数量,将学号写入文件。
1 int x;//题目数量 2 System.out.println("请输入题目的数量:"); 3 Scanner scan2 = new Scanner(System.in); 4 x = scan2.nextInt(); 5 String serialNo = "201571030306"; 6 7 fop.write(serialNo.getBytes()); //写入学号 8 fop.write(" ".getBytes()); //换行
2、运算式的产生
产生三个0~100之间的随机数a,b,c 作为运算数,定义字符串q保存运算式;产生0~3之间的随机数,分别表示四种运算符
1 int a=(int)(Math.random()*100); 2 int b=(int)(Math.random()*100); 3 int c=(int)(Math.random()*100); 4 5 String q=""; //保存运算式 6 int ans=0; 7 int[] flag=new int[2]; 8 for(int j=0;j<2;j++){ 9 int f=(int)(Math.random()*4); 10 switch(f){ 11 case 0: 12 if(j==0){ 13 q=a+"+"+b; 14 } 15 else{ 16 q=q+"+"+c; 17 } 18 flag[j]=0; 19 break; 20 case 1: 21 if(j==0){ 22 q=a+"-"+b; 23 } 24 else{ 25 q=q+"-"+c; 26 } 27 flag[j]=1; 28 break; 29 case 2: 30 if(j==0){ 31 q=a+"*"+b; 32 } 33 else{ 34 q=q+"*"+c; 35 } 36 flag[j]=2; 37 break; 38 case 3: 39 if(j==0){ 40 q=a+"/"+b; 41 } 42 else{ 43 q=q+"/"+c; 44 } 45 flag[j]=3; 46 break; 47 } 48 }
3、计算运算式结果,将结果存入变量ans中。
1 if(flag[0]<2){ 2 if(flag[1]<2){ 3 if(flag[0]==0){ 4 ans=a+b; 5 } 6 else{ 7 ans=a-b; 8 } 9 if(flag[1]==0){ 10 ans+=c; 11 } 12 else{ 13 ans-=c; 14 } 15 } 16 else{ 17 if(flag[1]==2){ 18 ans=b*c; 19 } 20 else{ 21 if(c==0){ 22 continue; 23 } 24 if(b<c || b%c!=0) { 25 i=i-1; //如果出现重新循环 26 continue; //判断结果不能为负数和非整数 27 } 28 ans=b/c; 29 } 30 if(flag[0]==0){ 31 ans+=a; 32 } 33 else{ 34 ans=a-ans; 35 } 36 } 37 } 38 else{ 39 if(flag[0]==2){ 40 ans=a*b; 41 } 42 else{ 43 if(b==0){ 44 continue; 45 } 46 if(a<b || a%b!=0) { 47 i=i-1; //如果出现重新循环 48 continue; //判断结果不能为负数和非整数 49 } 50 ans=a/b; 51 } 52 if(flag[1]==0){ 53 ans+=c; 54 } 55 else if(flag[1]==1){ 56 ans-=c; 57 } 58 else if(flag[1]==2){ 59 ans*=c; 60 } 61 else{ 62 if(c==0){ 63 continue; 64 } 65 if(ans<c || ans%c!=0) { 66 i=i-1; //如果出现重新循环 67 continue; //判断结果不能为负数和非整数 68 } 69 ans/=c; 70 } 71 }
4、判断结果(结果不能为负数)将结果ans和运算式连接起来写入文件。
1 if(ans<0) //判断结果不能为负数 2 { 3 i=i-1; continue; 4 } 5 6 q=q+"="+ans; //用字符串将算式和答案连在一起 7 System.out.println(q); 8 fop.write(q.getBytes()); //写入表达式 9 fop.write(" ".getBytes()); //换行
六、PSP展示
PSP2.1 |
任务内容 |
计划完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
30 |
30 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
10 |
20 |
Development |
开发 |
230 |
360 |
·· Analysis |
需求分析 (包括学习新技术) |
20 |
40 |
· Design Spec |
· 生成设计文档 |
5 |
5 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
5 |
8 |
· Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
2 |
2 |
· Design |
具体设计 |
40 |
50 |
· Coding |
具体编码 |
120 |
200 |
· Code Review |
· 代码复审 |
10 |
10 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
30 |
45 |
Reporting |
报告 |
40 |
60 |
·· Test Report |
· 测试报告 |
8 |
10 |
· Size Measurement |
计算工作量 |
3 |
3 |
· Postmortem & Process Improvement Plan |
· 事后总结 ,并提出过程改进计划 |
10 |
15 |
七、总结
本次项目在刚开始分析问题时觉得不是特别困难,但实际操作时才发现自己能力实在是太差了,(每次都是看着不难上手难o(╥﹏╥)o)。通过这次实验也更能深刻的体会到自己能力差,但同时也收获了很多。从这个平台上看了其他同学的博客,学到了很多技能和方法。希望自己以后更加努力。