软件工程个人作业02
四则运算2:
设计思路:
程序迭代后,明显复杂了很多,而对于此,只能进行分模块然后针对每一个小的模块进行实现,最后连接到一起。
①:针对避免重复的问题,可以将先生成的式子保存,在后生成的式子中运用if语句进行判断,如果出现重复则重新生成式子。
②:对于可以定制的问题,可以设置全局变量,由用户输入来确定打印的条目。打印方式可以是一行一个或者一行多个,利用全局变量进行控制换行即可。
③:对于是否有乘除法的问题,可以通过switch—case语句进行分割,在无乘除法的分块里只有加减符号参与随机,而乘除法则在另一个模块中。
④:数值的取值范围,仍然采用全局变量,由用户进行确定随机数产生的范围。
⑤:针对加减法有无负数的问题,可以让它产生负数的加减式子,也能在无负减法中判断结果是否大于0,小于0时重新生成。
⑥:对于除法有无余数,有余数时不需要控制,而在没余数时,利用if判断能否整除,不能时取出余数在被除数的基础上减去余数即可。
⑦:针对有括号的多数四则运算,使用随机数控制出现数字的个数,最多定为十个,当然最少得有两个数,在符号数组中加入左扩号“(”,利用两个栈分别存储运算数和运算 符,利用循环产生随机数和随机字符,依次压栈,在输出时根据出栈的字符判断,若出现除号,那么下一位不能为0,为0则重新生成不为0的随机数,出现左括号时先判断所在位置,位置太过于靠后,则用其他运算符替代,出现位置适当则在括号前面加其他随机运算符,并在后两位出现的数字后添加右括号。最后在循环外加上=输出。
源代码:
package 加减乘除; import java.util.*; public class Arithmetic { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.println("请输入要输出多少道运算题"); int h=input.nextInt(); System.out.println("请输入你要计算数的最大值"); int g=input.nextInt(); System.out.println("请选择要使用的功能:"); System.out.println("1. 整数加减法运算"); System.out.println("2. 整数四则运算"); System.out.println("3. 分数的加减运算"); System.out.println("4. 分数的四则运算"); System.out.println("5. 多数的四则运算(带括号)"); Random random = new Random(); char arr[] = {'+','-','*','/','('}; int a=input.nextInt(); switch(a) { case 1: { System.out.println("请选择减法是否有负数;0:无负数,1:有负数"); int f=input.nextInt(); int i; switch(f) { case 0: { for(i=0;i<h;i++) { String str=random.nextInt(g)+" "+arr[random.nextInt(2)]+" "+random.nextInt(g)+"="; System.out.println(str); } break; } case 1: { for(i=0;i<h;i++) { System.out.println(-random.nextInt()%g+" "+arr[random.nextInt(2)]+" "+(-random.nextInt())%g+"="); } break; } default: System.out.println("输入的数有误,请输入0或1"); } break; } case 2: { System.out.println("请选择要使用的功能:"); System.out.println("1. 正整数无余数四则运算!"); System.out.println("2. 可负整数无余数四则运算!"); System.out.println("3. 正整数可有余数四则运算"); System.out.println("4. 可负整数可有余数四则运算"); 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(u%v==0 && w=='/'){ System.out.println(u+" "+w+" "+v+"="); } else System.out.println(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(v!=0 && u%v==0 && w=='/' ) System.out.println(u+" "+w+" "+v+"="); else System.out.println(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)]; System.out.println(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)]; System.out.println(u+" "+w+" "+v+"="); } break; } default: System.out.print("输入的数有误,请输入1--4的整数"); } } case 3: { System.out.println("请选择减法是否有负数;0:无负数,1:有负数"); int f=input.nextInt(); switch(f) { case 0: { for(int i=0;i<h;i++) { System.out.println(random.nextInt(g)+"/"+random.nextInt(g)+1+" "+arr[random.nextInt(2)]+" "+random.nextInt(g)+"/"+random.nextInt(g)+1+"="); } break; } case 1: { for(int i=0;i<h;i++) { System.out.println(-random.nextInt()%g+"/"+random.nextInt(g)+1+" "+arr[random.nextInt(2)]+" "+-random.nextInt()%g+"/"+random.nextInt(g)+1+"="); } break; } default: System.out.println("输入的数有误,请输入0或1"); } break; } case 4: { 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)]; System.out.println(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(x!=0 && w=='/' ) System.out.println(u+"/"+v+" "+w+" "+x+"/"+y+"="); else System.out.println(u+"/"+v+" "+arr[random.nextInt(3)]+" "+x+"/"+y+"="); } break; } default: System.out.print("输入的数有误,请输入1或2"); } break; } case 5: { for(int i=0;i<h;i++) { int n =random.nextInt(9)+1; 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 m = S2.pop(); if(m=='(') { if(j>n-2) System.out.print(S1.pop()+""+arr[random.nextInt(4)]); else { System.out.print(S1.pop()+""+arr[random.nextInt(4)]+""+ m); k=k+1; } } else System.out.print(S1.pop()+""+ m); } 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的整数"); } } } }
结果截图:
PSP0级记录表:
项目计划日志:
周活动总结表
姓名:高开拓 日期:2016/3/19
日期\任务 | 听课 | 编写程序 | 阅读文档 | 查询资料 | 日统计 |
周日 | |||||
周一 | 100 | 20 | 30 | 150 | |
周二 | 20 | 20 | |||
周三 | 30 | 30 | |||
周四 | 200 | 10 | 30 | 240 | |
周五 | 60 | 10 | 70 | ||
周六 | 120 | 120 | |||
周总计 | 100 | 380 | 40 | 110 | 630 |
阶段时间和效率 周数:第三周
总计 | 100 | 380 | 40 | 110 | 630 |
平均 | 100 | 380 | 40 | 110 | 630 |
最大 | 100 | 380 | 40 | 110 | 630 |
最小 | 100 | 380 | 40 | 110 | 630 |
以前的各周累计
总计 | 100 | 380 | 40 | 110 | 630 |
平均 | 100 | 380 | 40 | 110 | 630 |
最大 | 100 | 380 | 40 | 110 | 630 |
最小 | 100 | 380 | 40 | 110 | 630 |
时间记录日志:
学生:高开拓 日期:2016/3/19
教师:王建民 课程:软件工程概论
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3/14 | 8:00 | 9:50 | 10 | 100 | 听课 | 课间休息 |
2:00 | 2:20 | 20 | 阅读文档 | |||
2:20 | 2:53 | 3 | 30 | 查询资料 | 出去 | |
3/15 | 7:00 | 7:20 | 20 | 查询资料 | ||
3/16 | 8:20 | 8:50 | 30 | 查询资料 | ||
3/17 | 16:00 | 20:20 | 10+30+20 | 200 | 编写程序 | 阅读文档+查询资料+出去吃饭 |
3/18 | 16:30 | 15:40 | 70 | 完善程序加阅读资料 | ||
3/19 | 9:40 | 11:45 | 5 | 120 | 完善程序 | 出去 |
缺陷记录日志:
学生:高开拓
日期:2016/3/19
教员:王建民
程序号:02
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3/17 | 01 | a | 编码 | 运行 | 5min | |
描述:忘记了在case结束后加上break | ||||||
02 | a | 编码 | 运行 |
1min |
||
描述:print和println的没有区别,输出时不该换行的地方换行了 | ||||||
03 | a | 编码 | 运行 | 10min | ||
描述:随机数生成的范围没有确定好,使得分数的分母出现0 | ||||||
3/18 | 04 | b | 测试 | 编译 | 5min | |
描述:栈的类型确定出现问题定义char类型一直报错,原来需要完整的character | ||||||
05 | b | 测试 | 编译 | 10min | ||
描述:判断左括号的语句出错,右括号输出异常 | ||||||
3/19 | 06 | c | 测试 | 编译 | 20min | |
描述:排除括号运算中除数可能为0的情况 | ||||||