软件工程概论作业-02
作业题目:
可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求:
可以控制下列参数:
1.是否有乘除法;
2.是否有括号(最多可以支持十个数参与计算);
3.数值范围;
4.加减有无负数;
5.除法有无余数!
设计思想:1.输入需要出题的数量,选择是分数运算还是整数运算;分数运算时输入数值的范围,运行即可;整数运算时,先输入数值的范围,然后选择是否需要括号;进入有括号后,随机产生题目;进入无括号后,需要选择是否需要乘除法,除法中是否需要余数,加减法是否需要负数;
2.分数运算生成随机数,分别做分母和分子,分母不能为0,化简分数,分母不为0输出结果,分母为0直接输出分子为结果。
3.在加减法中控制有无负数,使用随机数控制,0产生正数,1产生负数;
4.有括号,括号正在调试中,有点缺陷。有括号的运算优先级比较困难。
5.选择除法是否有余数,先随机产生除数,若需要产生余数,则被除数=除数*n+k(k为大于0小于除数的正整数);若不需要,则被除数=除数*n;
源程序代码
package demo; import java.util.Scanner; import java.util.ArrayList; public class Test { public static void main(String[] args){ int N,i,N1,N2; String hh; Scanner in=new Scanner(System.in); System.out.println("请输入需要打印的运算题的数目:"); N=in.nextInt(); System.out.println("请选择是否需要分数运算(Y/N):"); hh=in.next(); if(hh.equals("Y"))//分数运算 { for(i=0;i<N;i++) { int a,b,c,d,r1,r2; a=(int) (Math.random()*100); b=(int) (Math.random()*99+1); //分母不等于0 c=(int) (Math.random()*100); d=(int) (Math.random()*99+1); int h=(int)(Math.random()*4); int aa=0,bb=0,cc=0,dd=0; //为了产生分数,分子也不可为零 if(a==0) a=(int) (Math.random()*99+1); if(c==0) c=(int) (Math.random()*99+1); if(a>b) r1=b; else r1=a; //化简分数 for(int j=1;j<=r1;j++) { if(a%j==0&&b%j==0) { aa=a/j; bb=b/j; } } if(c>d) r2=d; else r2=c; //化简分数 for(int j=1;j<=r2;j++) { if(c%j==0&&d%j==0) { cc=c/j; dd=d/j; } } if(h==0) { //化简后,分母等于1时,直接输出分子 if(bb!=1&&dd!=1) System.out.println(aa+"/"+bb+" + "+cc+"/"+dd+"="); else if(bb==1&&dd!=1) System.out.println(aa+" + "+cc+"/"+dd+"="); else if(bb!=1&&dd==1) System.out.println(aa+"/"+bb+" + "+cc+"="); else System.out.println(aa+"+"+cc+"="); } else if(h==1) { //不能产生负数 int t1,t2; if((a/b-c/d)<0) { t1=aa; aa=cc; cc=t1; t2=bb; bb=dd; dd=t2; } //化简后,分母等于1时,直接输出分子 if(bb!=1&&dd!=1) System.out.println(aa+"/"+bb+" - "+cc+"/"+dd+"="); else if(bb==1&&dd!=1) System.out.println(aa+" - "+cc+"/"+dd+"="); else if(bb!=1&&dd==1) System.out.println(aa+"/"+bb+" - "+cc+"="); else System.out.println(aa+"-"+cc+"="); } else if(h==2) {//化简后,分母等于1时,直接输出分子 if(bb!=1&&dd!=1) System.out.println(aa+"/"+bb+" * "+cc+"/"+dd+"="); else if(bb==1&&dd!=1) System.out.println(aa+" * "+cc+"/"+dd+"="); else if(bb!=1&&dd==1) System.out.println(aa+"/"+bb+" * "+cc+"="); else System.out.println(aa+"*"+cc+"="); } else {//化简后,分母等于1时,直接输出分子 if(bb!=1&&dd!=1) System.out.println(aa+"/"+bb+" / "+cc+"/"+dd+"="); else if(bb==1&&dd!=1) System.out.println(aa+" / "+cc+"/"+dd+"="); else if(bb!=1&&dd==1) System.out.println(aa+"/"+bb+" / "+cc+"="); else System.out.println(aa+"/"+cc+"="); } } } else if(hh.equals("N"))//整数运算 { System.out.println("请选择是否需要产生括号的运算题(Y/N):"); String str,str1,str2,str3; str=in.next(); if(str.equals("Y")) { System.out.println("请输入数值范围:"); N1=in.nextInt(); for(i=0;i<N;i++) { } } else if(str.equals("N"))//不需要产生括号 { System.out.println("请输入数值范围:"); N2=in.nextInt(); System.out.println("请选择是否有无乘除法的运算题(Y/N):"); str1=in.next(); if(str1.equals("Y"))//有乘除法 { System.out.println("请选择是否有无余数的运算题(Y/N):"); str2=in.next(); if(str2.equals("Y"))//需要有余数 { System.out.println("请选择是否有负数(Y/N):"); str3=in.next(); for(i=0;i<N;i++) { int a,b,c,c1,h,h2; a=(int) (Math.random()*N2); b=(int) (Math.random()*N2); h=(int) (Math.random()*4);//控制加减运算符 c=(int) (Math.random()*(N2-1)+1); c1=(int) (Math.random()*10+1); if(str3.equals("Y"))//有负数 { if(h==0)//加法 { h2=(int) (Math.random()*2);//控制有无负数 if(h2==0) System.out.println(a+"+"+b+"="); else if(h2==1) System.out.println("-"+a+"+"+b+"="); } if(h==1)//减法 { h2=(int) (Math.random()*2); //控制有无负数 if(h2==0) System.out.println(a+"-"+b+"="); else if(h2==1) System.out.println("-"+a+"-"+b+"="); } } else if(str3.equals("N"))//无负数 { if(h==0) { System.out.println(a+"+"+b+"="); } if(h==1) { System.out.println(a+"-"+b+"="); } } if(h==2) { System.out.println(a+"*"+b+"="); } if(h==3) { int d,k; k=(int) (Math.random()*(c-1)+1);//必须产生余数 d=c*c1+k; System.out.println(d+"/"+c+"="); } } } else if(str2.equals("N"))//不需要产生余数 { System.out.println("请选择是否有负数(Y/N):"); str3=in.next(); for(i=0;i<N;i++) { int a,b,c,c1,h,h2; a=(int) (Math.random()*N2); b=(int) (Math.random()*N2); h=(int) (Math.random()*4);//控制加减运算符 c=(int) (Math.random()*(N2-1)+1); c1=(int) (Math.random()*10+1);//控制倍数 if(str3.equals("Y"))//有负数 { if(h==0)//加法 { h2=(int) (Math.random()*2); //控制有无负数 if(h2==0) System.out.println(a+"+"+b+"="); else if(h2==1) System.out.println("-"+a+"+"+b+"="); } if(h==1)//减法 { h2=(int) (Math.random()*2);//控制有无负数 if(h2==0) System.out.println(a+"-"+b+"="); else if(h2==1) System.out.println("-"+a+"-"+b+"="); } } else if(str3.equals("N"))//无负数 { if(h==0) { System.out.println(a+"+"+b+"="); } if(h==1) { System.out.println(a+"-"+b+"="); } } if(h==2)//乘法 { System.out.println(a+"*"+b+"="); } if(h==3)//除法,不产生余数 { int d;//不能产生余数 d=c*c1; System.out.println(d+"/"+c+"="); } } } } else if(str1.equals("N"))//没有乘除法 { int a,b,h,h2; System.out.println("请选择是否有负数(Y/N):"); str3=in.next(); for(i=0;i<N;i++) { a=(int) (Math.random()*N2); b=(int) (Math.random()*N2); h=(int) (Math.random()*2);//控制运算符 if(str3.equals("Y"))//有负数 { if(h==0)//加法 { h2=(int) (Math.random()*2);//控制有无负数 if(h2==0) System.out.println(a+"+"+b+"="); else if(h2==1) System.out.println("-"+a+"+"+b+"="); } if(h==1)//减法 { h2=(int) (Math.random()*2);//控制有无负数 if(h2==0) System.out.println(a+"-"+b+"="); else if(h2==1) System.out.println("-"+a+"-"+b+"="); } } else if(str3.equals("N"))//无负数 { if(h==0) { System.out.println(a+"+"+b+"="); } if(h==1) { System.out.println(a+"-"+b+"="); } } } } } } in.close(); } }
运行结果截图:
项目计划总结:
任务 日期 |
听课 |
编写程序 |
阅读书籍 |
|
|
|
3.06 |
2小时课程 |
30分钟思考思路 |
|
|
|
|
3.07 |
|
实现数值范围和加法有无负数 |
|
|
|
|
3.08 |
|
实现除法有无余数编写运算是否有括号 |
|
|
|
|
3.09 |
|
|
|
|
|
|
3.10 |
|
|
阅读《梦断代码》 |
|
|
时间记录日志
日期 |
开始时间 |
结束时间 |
中断时间 |
活动 |
备注 |
3.6 |
14:00 |
15:50 |
10min |
上课 |
|
3.7 |
14:00 |
15:30 |
|
编程 |
|
3.7 |
19:00 |
20:30 |
|
编程 |
|
3.8 |
15:00 |
17:00 |
30min |
编程 |
|
3.9 |
|
|
|
|
|
3.10 |
19:00 |
|
|
写博客 |
缺陷记录日志
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
描述 |
3.7 |
1 |
思维逻辑 |
设计 |
设计 |
4min |
用位置来控制负数的位置 |
在减法时候负数位置容易混乱 |
3.8 |
1 |
思维 |
设计 |
设计 |
7min |
|
用余数是否为零判断 |
3.10 |
1 |
思维 |
|
|
|
|
括号的运算优先级程序编写思路不明确 |
|
|
|
|
|
|
|