小组成员:杨茵,严羽卿
设计思想:
1.框架为:首先输入需要出题的数量,再选择是分数运算,整数运算;进入分数运算第一步输入数值的范围,运行即可(真分数,假分数必须化简);进入整数运算后,第一步输入数值的范围,然后选择是否需要括号;进入有括号后,随机产生题目;进入无括号后,需要选择是否需要乘除法,除法中是否需要余数,加减法是否需要负数;
2.在加减法中控制有无负数,使用随机数控制,0产生正数,1
产生负数;
3.选择除法是否有余数,先随机产生除数,若需要产生余数,则
被除数=除数*n+k(k为大于0小于除数的正整数);若不需要,
则被除数=除数*n;
4.有括号(最多可以支持十个数参与计数),将操作数压入动态数组al1中,将运算符压入动态数组al2中;通过循环输出数组信息,首先输出操作数,然后输出运算符;一对运算符中,第一个运算符和第二个运算符进行优先级的比较,若第一个的优先级小于等于第二个,则不加括号;若第一个优先级大于第二个,则在第二个运算符前后加括号。
代码:
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++) { ArrayList<Integer> al1=new ArrayList<Integer>(); //申请动态数组存放操作数 ArrayList<Integer> al2=new ArrayList<Integer>(); //申请动态数组存放运算符 int m,n,a,b; int j,k; m=(int) (Math.random()*7+3); //限制操作数个数 n=m-1; //运算符个数 for(j=0;j<m;j++) { a=(int) (Math.random()*(N1-1)+1); al1.add(a); }//将操作数压入al1数组 for(k=0;k<n;k++) { b=(int) (Math.random()*4); al2.add(b); }//将运算符压入al2数组 if(m==3)//产生的操作数是3个 { if((int)al2.get(0)>(int)al2.get(1))//比较优先级 { if((int)al2.get(0)==1) System.out.print((int)al1.get(0)+"-"+(int)al1.get(1)+"+"+(int)al1.get(2)); else if((int)al2.get(0)==2) { if((int)al2.get(1)==0) System.out.print((int)al1.get(0)+"*"+"("+(int)al1.get(1)+"+"+(int)al1.get(2)+")"); else if((int)al2.get(1)==1) System.out.print((int)al1.get(0)+"*"+"("+(int)al1.get(1)+"-"+(int)al1.get(2)+")"); } else if((int)al2.get(0)==3) { if((int)al2.get(1)==0) System.out.print((int)al1.get(0)+"/"+"("+(int)al1.get(1)+"+"+(int)al1.get(2)+")"); else if((int)al2.get(1)==1) System.out.print((int)al1.get(0)+"/"+"("+(int)al1.get(1)+"-"+(int)al1.get(2)+")"); if((int)al2.get(1)==2) System.out.print((int)al1.get(0)+"/"+(int)al1.get(1)+"*"+(int)al1.get(2)); } } else if((int)al2.get(0)<(int)al2.get(1)||(int)al2.get(0)==(int)al2.get(1))//比较优先级 { if((int)al2.get(0)==0) { if((int)al2.get(1)==0) System.out.print((int)al1.get(0)+"+"+(int)al1.get(1)+"+"+(int)al1.get(2)); else if((int)al2.get(1)==1) System.out.print((int)al1.get(0)+"+"+(int)al1.get(1)+"-"+(int)al1.get(2)); else if((int)al2.get(1)==2) System.out.print((int)al1.get(0)+"+"+(int)al1.get(1)+"*"+(int)al1.get(2)); else if((int)al2.get(1)==3) System.out.print((int)al1.get(0)+"+"+(int)al1.get(1)+"/"+(int)al1.get(2)); } else if((int)al2.get(0)==1) { if((int)al2.get(1)==1) System.out.print((int)al1.get(0)+"-"+(int)al1.get(1)+"-"+(int)al1.get(2)); else if((int)al2.get(1)==2) System.out.print((int)al1.get(0)+"-"+(int)al1.get(1)+"*"+(int)al1.get(2)); else if((int)al2.get(1)==3) System.out.print((int)al1.get(0)+"-"+(int)al1.get(1)+"/"+(int)al1.get(2)); } else if((int)al2.get(0)==2) { if((int)al2.get(1)==2) System.out.print((int)al1.get(0)+"*"+(int)al1.get(1)+"*"+(int)al1.get(2)); else if((int)al2.get(1)==3) System.out.print((int)al1.get(0)+"*"+(int)al1.get(1)+"/"+(int)al1.get(2)); } else if((int)al2.get(0)==3) { System.out.print((int)al1.get(0)+"/"+(int)al1.get(1)+"/"+(int)al1.get(2)); } } System.out.print("="); System.out.println(); } else if(m>=4)//产生的操作大于等于4个 { for(j=0;j<al2.size()-2;j=j+2)//输出运算表达式 { k=j; if((int)al2.get(j)>(int)al2.get(j+1))//比较运算符优先级 { if((int)al2.get(j)==1)//第一个出现减法 System.out.print((int)al1.get(k)+"-"+(int)al1.get(k+1)+"+"+(int)al1.get(k+2)); else if((int)al2.get(j)==2)//第一个出现乘法 { if((int)al2.get(j+1)==0) System.out.print((int)al1.get(k)+"*"+"("+(int)al1.get(k+1)+"+"+(int)al1.get(k+2)+")"); else if((int)al2.get(j+1)==1) System.out.print((int)al1.get(k)+"*"+"("+(int)al1.get(k+1)+"-"+(int)al1.get(k+2)+")"); } else if((int)al2.get(j)==3)//第一个出现除法 { if((int)al2.get(j+1)==0) System.out.print((int)al1.get(k)+"/"+"("+(int)al1.get(k+1)+"+"+(int)al1.get(k+2)+")"); else if((int)al2.get(j+1)==1) System.out.print((int)al1.get(k)+"/"+"("+(int)al1.get(k+1)+"-"+(int)al1.get(k+2)+")"); if((int)al2.get(j+1)==2) System.out.print((int)al1.get(k)+"/"+(int)al1.get(k+1)+"*"+(int)al1.get(k+2)); } } else if((int)al2.get(j)<(int)al2.get(j+1)||(int)al2.get(j)==(int)al2.get(j+1)) { if((int)al2.get(j)==0) { if((int)al2.get(j+1)==0)//第一个出现加法 System.out.print((int)al1.get(k)+"+"+(int)al1.get(k+1)+"+"+(int)al1.get(k+2)); else if((int)al2.get(j+1)==1) System.out.print((int)al1.get(k)+"+"+(int)al1.get(k+1)+"-"+(int)al1.get(k+2)); else if((int)al2.get(j+1)==2) System.out.print((int)al1.get(k)+"+"+(int)al1.get(k+1)+"*"+(int)al1.get(k+2)); else if((int)al2.get(j+1)==3) System.out.print((int)al1.get(k)+"+"+(int)al1.get(k+1)+"/"+(int)al1.get(k+2)); } else if((int)al2.get(j)==1)//第一个出现减法 { if((int)al2.get(j+1)==1) System.out.print((int)al1.get(k)+"-"+(int)al1.get(k+1)+"-"+(int)al1.get(k+2)); else if((int)al2.get(j+1)==2) System.out.print((int)al1.get(k)+"-"+(int)al1.get(k+1)+"*"+(int)al1.get(k+2)); else if((int)al2.get(j+1)==3) System.out.print((int)al1.get(k)+"-"+(int)al1.get(k+1)+"/"+(int)al1.get(k+2)); } else if((int)al2.get(j)==2)//第一个出现乘法 { if((int)al2.get(j+1)==2) System.out.print((int)al1.get(k)+"*"+(int)al1.get(k+1)+"*"+(int)al1.get(k+2)); else if((int)al2.get(j+1)==3) System.out.print((int)al1.get(k)+"*"+(int)al1.get(k+1)+"/"+(int)al1.get(k+2)); } else if((int)al2.get(j)==3)//第一个出现除法 { System.out.print((int)al1.get(k)+"/"+(int)al1.get(k+1)+"/"+(int)al1.get(k+2)); } } if((int)al2.get(j+2)==0) System.out.print("+"); else if((int)al2.get(j+2)==1) System.out.print("-"); else if((int)al2.get(j+2)==2) System.out.print("*"); else if((int)al2.get(j+2)==3) System.out.print("/"); } System.out.print((int)al1.get(al1.size()-1)); //输出最后一位操作数 System.out.print("="); System.out.println(); } } } 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(); } }
运行结果:
个人总结:
本次实验在讨论设计思想时,难度不大,但是在实现时有些难点不好解决。因为对栈的使用不太熟悉,我使用了动态数组来存放操作数和运算符以输出括号,虽然实现了功能,但是过程有些繁杂;因为负数的限制,我只在加减法中控制了负数的出现;总体程序有些缺陷。
周活动总结表
姓名:杨茵 日期 2016/3/18
|
听课 |
编写代码 |
阅读课本 |
准备考试 |
|
|
日总计 |
周日 |
|
|
17 |
|
|
|
17 |
周一 |
100 |
44 |
12 |
|
|
|
156 |
周二 |
|
40 |
|
|
|
|
40 |
周三 |
|
|
16 |
|
|
|
16 |
周四 |
|
267 |
|
|
|
|
267 |
周五 |
|
176 |
11 |
|
|
|
187 |
周六 |
|
|
|
|
|
|
|
周总计 |
100 |
527 |
56 |
|
|
|
683 |
时间记录日志
学生:杨茵 日期:2016/3/18
教师:王建民 课程:软件工程
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
C |
U |
3/14 |
8:00 |
10:00 |
20 |
100 |
听课 |
下课,休息 |
|
|
|
18:30 |
20:30 |
10 |
120 |
改程序读构建之法 |
作业,修改部分程序;休息 |
|
|
3/15 |
15:20 |
17:00 |
10 |
90 |
改程序 |
作业 休息 |
|
|
3/16 |
15:30 |
16:52 |
10 |
82 |
讨论设计思想 大概过程 |
四则运算2,两人小组讨论 聊天 |
|
|
3/17 |
15:00 |
17:30 |
10 |
140 |
编程序 |
开始编写四则运算2 休息 |
|
|
|
18:30 |
23:00 |
30 |
240 |
编程序 |
编写四则运算2;休息,洗漱,聊天 |
|
|
3/18 |
16:30 |
18:00 |
10 |
80 |
编程序 |
休息 |
|
|
3/20 |
15:30 |
16:30 |
7 |
60 |
读构建之法 |
聊天 |
|
|
缺陷记录日志
学生:杨茵
日期:2016/3/18
教员:王建民
程序号:四则运算2
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
||||||||
3/14 |
1 |
|
编码 |
编译 |
5min |
|
||||||||
描述:判断字符串相等,a.equals(b) |
||||||||||||||
3/16 |
2 |
|
设计 |
编译 |
30min |
|
||||||||
描述:括号的产生有问题 |
||||||||||||||
3/17 |
3 |
|
编码 |
编译 |
1min |
|
||||||||
描述:申请的动态数组ArrayList.rangeCheck超出范围 |
||||||||||||||
|
4 |
|
编码 |
编译 |
1min |
|
||||||||
描述:Exception in thread “mian”:Index: 7,Size: 7 |
||||||||||||||
3/18 |
5 |
|
编码 |
编译 |
1min |
|
||||||||
|
描述:在类Test中找不到main方法,JavaFX应用程序类必须扩展 |
原文:http://www.cnblogs.com/yyting/p/5294400.html