软件工程个人作业02
四则运算2
- 设计思想
由于需要控制的种类比较多所以采用小模块构成大模块的方式
1、是否有乘除法
将加减从四则运算中拿出来,形成加减和四则两种运算方式
2、数值范围
将上次的在程序中直接规定的0-99变成由用户输入的g,然后读取,形成全局变量。
3、加减法有无负数
将随机到的题目进行计算判断,结果小于零则重新生成。
4、除法有无余数
①能除尽
②不能除尽,可以将其用+,-,*进行替换,比较简便。
③对于分数而言,控制分母位置的数不为零;若出现两个分数相除,则继续控制被除数的分子也不为零。
5、是否有括号(最多支持十个数的计算)
①用这样的函数来控制数量random.nextInt(9)+2。
②在符号数组中加入‘(’,形成随机数栈和运算符栈,在运算符中随机出现,若出现‘(’则在其前面添加非括运算符并记录‘(’的数量,在最后添加等量的‘)’。
6、可订制(数量/打印方式)
①数量:将上次的在程序中直接规定的30变成由用户输入的h,然后读取,形成全局变量。
②打印方式:设置全局变量r,由用户输入每行打印的个数,在每个小的模块中加入if语句来实现。
7、题目避免重复
对生成的题目与前面的题目相同位置的数与运算符进行比对,若相同则重新生成。
- 程序代码
import java.util.*; public class Aritmetic1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入要生成多少道四则运算题目?"); int h = input.nextInt(); String [] arr1 = new String[h]; System.out.println("请输入随机数可产生的最大值:"); int g = input.nextInt(); System.out.println("请输入定制要求(每行题数):"); int r = input.nextInt(); System.out.println("请选择要求:"); System.out.println("1加减法运算"); System.out.println("2四则运算"); Random random = new Random(); char arr[] = {'+','-','*','/','('}; int a=input.nextInt(); switch(a){ case 1:{ System.out.println("请选择数字类型:"); System.out.println("1整数"); System.out.println("2分数"); int m = input.nextInt(); switch(m) { case 1: { System.out.println("有无负数?"); System.out.println("1没有负数"); System.out.println("2有负数"); int f = input.nextInt(); int i; switch(f) { case 1: { for(i=0;i<h;i++) { if(i==r||i%r==0) { System.out.println(); } String str = random.nextInt(g) + " " + arr[random.nextInt(2)] + " " + random.nextInt(g) + "="+" "; System.out.print(str); } break; } case 2: { for(i=0;i<h;i++) { if(i==r||i%r==0) { System.out.println(); } String str = (-random.nextInt()%g) + " " + arr[random.nextInt(2)] + " " + (-random.nextInt()%g) + "="+" "; System.out.print(str); } break; } default: { System.out.println("输入错误,请输入1或2"); } break; }//switch(f) break; }//case1内 case 2: { System.out.println("有无负数?"); System.out.println("1没有负数"); System.out.println("2有负数"); int f=input.nextInt(); switch(f) { case 1: { for(int i=0;i<h;i++) { if(i==r||i%r==0) { System.out.println(); } System.out.print(random.nextInt(g)+"/"+random.nextInt(g)+1+" "+arr[random.nextInt(2)]+" "+random.nextInt(g)+"/"+random.nextInt(g)+1+"="+" "); } break; } case 2: { for(int i=0;i<h;i++) { if(i==r||i%r==0) { System.out.println(); } System.out.print(-random.nextInt()%g+"/"+random.nextInt(g)+1+" "+arr[random.nextInt(2)]+" "+-random.nextInt()%g+"/"+random.nextInt(g)+1+"="+" "); } break; } default: System.out.println("输入错误,请输入1或2"); break; } break; }//case2内 }//switch(m) break; }//case1外 case 2: { System.out.println("请选择数字类型:"); System.out.println("1整数"); System.out.println("2分数"); int m = input.nextInt(); switch(m) { case 1: { System.out.println("请选择要求:"); System.out.println("1正整数无余数四则运算"); System.out.println("2可负整数无余数四则运算"); System.out.println("3正整数可有余数四则运算"); System.out.println("4可负整数可有余数四则运算"); System.out.println("5多数带括号运算"); int f =input.nextInt(); switch(f) { case 1: { for(int i=0;i<h;i++) { int u=random.nextInt(g); int v=random.nextInt(g)+1; char w=arr[random.nextInt(4)]; if(i==r||i%r==0) { System.out.println(); } if(u%v==0 && w=='/') { System.out.print(u+" "+w+" "+v+"="+" "); } else { System.out.print(u+" "+arr[random.nextInt(3)]+" "+v+"="+" "); } } break; } case 2: { for(int i=0;i<h;i++) { int u=-random.nextInt()%g; int v=-random.nextInt()%g; char w=arr[random.nextInt(4)]; if(i==r||i%r==0) { System.out.println(); } if(v!=0 && u%v==0 && w=='/' ) System.out.print(u+" "+w+" "+v+"="+" "); else System.out.print(u+" "+arr[random.nextInt(3)]+" "+v+"="+" "); } break; } case 3: { for(int i=0;i<h;i++) { int u=random.nextInt(g); int v=random.nextInt(g)+1; char w=arr[random.nextInt(4)]; if(i==r||i%r==0) { System.out.println(); } System.out.print(u+" "+w+" "+v+"="+" "); } break; } case 4: { for(int i=0;i<h;i++) { int u=-random.nextInt()%g; int v=-random.nextInt()%g; char w=arr[random.nextInt(4)]; if(i==r||i%r==0) { System.out.println(); } System.out.print(u+" "+w+" "+v+"="+" "); } break; } case 5: { for(int i=0;i<h;i++) { int n =random.nextInt(9)+2; Stack<Integer> S1 = new Stack<Integer>(); Stack<Character> S2 = new Stack<Character>(); for(int j=0;j<n+1;j++) { char w=' '; int e = random.nextInt()%g; if(w=='/'&&e==0) { e=random.nextInt(g)+1; } w=arr[random.nextInt(5)]; S1.push(e); S2.push(w); } int k=0; for(int j=0;j<n;j++) { char q =S2.pop(); if(q=='(') { if(j>n-2) { System.out.print(S1.pop()+" "+arr[random.nextInt(4)]); } else { System.out.print(S1.pop()+" "+arr[random.nextInt(4)]+" "+q); k++; } } else { System.out.print(S1.pop()+" "+q); } } if(k==0) { System.out.println(random.nextInt()%g+"="); } else if(k==1) { System.out.println(random.nextInt()%g+")="); } else if(k==2) { System.out.println(random.nextInt()%g+"))="); } else if(k==3) { System.out.println(random.nextInt()%g+")))="); } else { System.out.println(random.nextInt()%g+"))))="); } } break; } default: { System.out.println("输入错误,请输入1-5"); } break; }//switch(f) break; }//case1内 case 2: { System.out.println("请选择要求:"); System.out.println("1正分数四则运算!"); System.out.println("2可负分数四则运算!"); int f=input.nextInt(); switch(f) { case 1: { for(int i=0;i<h;i++) { int u=random.nextInt(g); int v=random.nextInt(g)+1; int x=random.nextInt(g); int y=random.nextInt(g)+1; char w=arr[random.nextInt(4)]; if(i==r||i%r==0) { System.out.println(); } System.out.print(u+"/"+v+" "+w+" "+x+"/"+y+"="+" "); } break; } case 2: { for(int i=0;i<h;i++) { int u=-random.nextInt()%g; int v=random.nextInt(g)+1; int x=-random.nextInt()%g; int y=random.nextInt(g)+1; char w=arr[random.nextInt(4)]; if(i==r||i%r==0) { System.out.println(); } if(x!=0 && w=='/' ) System.out.print(u+"/"+v+" "+w+" "+x+"/"+y+"="+" "); else System.out.print(u+"/"+v+" "+arr[random.nextInt(3)]+" "+x+"/"+y+"="+" "); } break; } default: System.out.print("输入的数有误,请输入1或2"); } break; }//case2内 } }//switch(m) }//case2外 }//switch(a) }//起始
- 运行结果截图
PSP0级记录表:
- 项目计划日志
周活动总结表
姓名:赵东睿 日期:16/3/19
日期 \ 任务 | 听课 | 编写程序 | 阅读书籍 | 日总计 | ||
周日 | ||||||
周一 | 100 | 30 | 130 | |||
周二 | 30 | 30 | ||||
周三 | 60 | 60 | ||||
周四 | 200 | 200 | ||||
周五 | 60+120 | 180 | ||||
周六 | 120 | 120 | ||||
周总计 | 100 | 500 | 120 | 720 |
阶段时间和效率 周数:第3周
总计 | 100 | 500 | 120 | 720 | ||
平均 | 100 | 500 | 120 | 720 | ||
最大 | 100 | 500 | 120 | 720 | ||
最小 | 100 | 500 | 120 | 720 |
以前各周的累计时间
总计 | 100 | 500 | 120 | 720 | ||
平均 | 100 | 500 | 120 | 720 | ||
最大 | 100 | 500 | 120 | 720 | ||
最小 | 100 | 500 | 120 | 720 |
时间记录日志
学生:赵东睿 日期:16/3/19
教师:王建民 课程:软件工程概论
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3/14 | 8:00 | 9:50 | 10 | 100 | 上课 | 课间休息 |
13:30 | 14:00 | 30 | 阅读书籍 | |||
3/15 | 15:00 | 15:30 | 30 | 阅读书籍 | ||
3/16 | 13:00 | 14:20 | 20 | 60 | 阅读书籍 | 休息 |
3/17 | 16:30 | 21:30 | 100 | 200 | 编写代码 | 吃饭,查资料 |
3/18 | 12:30 | 13:30 | 60 | 编写代码 | ||
16:30 | 18:30 | 120 | 编写代码 | |||
3/19 | 9:30 | 11:30 | 120 | 完善代码 | ||
缺陷记录日志
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3/17 | 1 | 运行 | 引入输入流 | 1min | ||
没有写import java.util.*; | ||||||
3/18 | 2 | 编译 | 运行 | 2min | ||
对每行题目个数的限制if语句加在输出之前 | ||||||
3/18 | 3 | 编译 | 运行 | 10min | ||
在case中忘记break;导致会在运行时多弹出一次上一步。 | ||||||
3/18 | 4 | 编译 | 运行 | 20min | ||
解决分数四则运算u/v / x/y中v,x,y为零的错误 | ||||||