一、要求:
四则运算2,可控制下列参数:
是否有乘除法; 是否有括号(最多可以支持十个数参与计算); 数值范围; 加减有无负数。
二、思路:
1.存储结构:构建一个表达式类,私有属性为一个字符串数组,即将一个表达式拆成若干字符串,每个操作数和操作符都视为一个字符串。若需生成多个表达式则用类创建一个对象数组。
2.生成一个表达式的实现过程:
1)随机生成一个2-10的整数number表示操作数的数量;
2)随机选择该表达式操作数全为整数或全为分数;
3)若全为整数则判断是否要出现负数(用户输入控制),然后随机生成number个操作数,若操作数为分数则会生成一个分数字符串,格式为:“[a/b]” ,负数格式为“[-4]”;
4)判断是否有乘除法(输入控制),若有则随机生成number-1个含有+-*÷的操作符,若无则只有+-两种操作符;
5)用表达式类创建对象,将上述生成的操作数及操作符合成一个完整的表达式如 “9*5+6÷3=”;
6)若用户输入有括号(即ifKuoHao参数为1),则根据表达式字符串数组的长度随机出两个位置填入一对括号,如 “9*5+6÷3=”这个表达式,该字符串数组长度为8,则随机生成整数k,范围是0-7,再判断k/2的值是否为偶数,若不为偶数则将k/2+1即为表达式数组插入右括号的位置(因为操作数的位置下标为偶数,如6的下标为4),例如,就上述表达式而言,若生成的k值为7,7/2=3,3+1=4,所以生成右括号的位置为4,即在“6”和“÷”之间添加右括号,再在k-3的位置后添加左括号,所以最终表达式为“9*(5+6)÷3=”;
7)若ifKuoHao参数为2,则在第5)步结束。
三、源代码:
import java.util.*; public class MathHomeWork2 { public static int choose,from,to,operNum,ifFuShu,number,ifKuoHao,ifChengChu; public static int randomArr[]=new int[10]; public static Random ran=new Random(); public static char randomCh[]={'+','-','*','÷'}; public static Formular formu[]; @SuppressWarnings({ "resource" }) public static void main(String[] args){ Scanner in=new Scanner(System.in); System.out.println("题目个数:"); number=in.nextInt(); System.out.println("数字范围(从小到大输入两个正整数):"); from=in.nextInt(); to=in.nextInt(); System.out.println("是否有乘除法(1有2无):"); ifChengChu=in.nextInt(); System.out.println("是否有括号(1有2无):"); ifKuoHao=in.nextInt(); System.out.println("是否有负数(1有2无):"); ifFuShu=in.nextInt(); formu=new Formular[number]; for(int i=0;i<number;i++){ formu[i]=new Formular(); choose=ran.nextInt(2)+1; operNum=ran.nextInt(9)+2; formu[i]=creaFormula(choose,operNum,ifChengChu,ifKuoHao); if(formu[i]==null) i--; } showFormulas(formu); } //生成分数 public static String creaFenShu(){ int a=0,b=0; while(a>=b){ a=randomNum(from,to,2); b=randomNum(from,to,2); } int fenshu[]={a,b}; fun1(fenshu); String s="["+a+"/"+b+"]"; return s; } //生成表达式 public static Formular creaFormula(int choose,int nums,int ifChengChu,int ifKuoHao){ Formular formu=new Formular(); char operator[]=new char[nums-1]; if(ifChengChu==1){ for(int i=0;i<operator.length;i++){ int n=ran.nextInt(4); operator[i]=randomCh[n]; } } else{ for(int i=0;i<operator.length;i++){ int n=ran.nextInt(2); operator[i]=randomCh[n]; } } if(choose==1){ for(int i=0;i<nums;i++){ randomArr[i]=randomNum(from,to,ifFuShu); } for(int i=0;i<nums-1;i++){ formu.push(""+randomArr[i]); formu.push(""+operator[i]); } formu.push(""+randomArr[nums-1]); formu.push("="); } else if(choose==2){ String fenshu[]=new String[nums]; for(int i=0;i<nums;i++){ fenshu[i]=creaFenShu(); } for(int i=0;i<nums-1;i++){ formu.push(""+fenshu[i]); formu.push(""+operator[i]); } formu.push(""+fenshu[nums-1]); formu.push("="); } else return null; if(ifKuoHao==1){ int k=ran.nextInt(2*nums); k/=2; if(k%2!=0) k++; formu.insert(k+3,")"); formu.insert(k,"("); } //处理表达式,给负数加括号 for(int i=0;i<formu.size();i++){ String s=formu.get(i); if(s.indexOf('-')!=-1&&s.length()>1){ s="["+s+"]"; } formu.set(i,s); } return formu; } //打印表达式 public static void showFormulas(Formular f[]){ int len=f.length; for(int i=0;i<len;i++){ System.out.print("No."+(i+1)+": "); f[i].show(); System.out.print("\n"); } } //约分函数 public static void fun1(int x[]){ int k=fun2(x[0],x[1]); x[0]=x[0]/k; x[1]=x[1]/k; } //求分子分母最大公约数 public static int fun2(int x,int y){ int min,i; if(x>y) min=x; else min=y; for(i=min;i>=1;i--){ if(x%i==0&&y%i==0){ break; } } return i; } //范围生成随机数 public static int randomNum(int fromA,int toB,int ifFuShu){ int x=ran.nextInt(toB)+fromA+1; if(ifFuShu==1){ boolean ifFushu=ran.nextBoolean(); if(ifFushu) x=x-2*x; } return x; } } class Formular{ private Vector<String> formular; public Formular(){ formular=new Vector<String>(); } public void push(String x){ formular.addElement(x); } public String get(int i){ if(formular!=null&&i>=0&&i<formular.size()){ return formular.get(i); } else return null; } public void set(int i,String x){ if(formular!=null&&i>=0&&i<formular.size()){ formular.set(i,x); } else return; } public void insert(int i,String x){ if(formular!=null&&i>=0&&i<formular.size()){ formular.insertElementAt(x,i); } else return; } public void add(int i,String x){ if(formular!=null&&i>=0&&i<formular.size()){ formular.add(i,x); } else return ; } public void delete(int i){ if(formular!=null&&i>=0&&i<formular.size()){ formular.removeElementAt(i); } else return ; } public void show(){ for(int i=0;i<formular.size();i++){ System.out.print(formular.get(i)); } } public int size(){ if(formular!=null) return formular.size(); else return -1; } }
四、结果截图:
五、项目计划日志
任务 日期 | 上课 | 编程序 | 看书 | 日总计 |
周一 | 1.5h | 0.5h | 0.5h | 2.5h |
周二 |
|
|
|
|
周三 |
| 4h |
| 4h |
周四 |
| 2h |
| 2h |
周五 |
|
| 1h | 1h |
周总计 | 1.5h | 6.5h | 1.5h | 9.5 |
六、时间记录
日期 | 开始时间 | 结束时间 | 学习时间 | 活动 | 备注 |
3.6 | 16:00 | 17:30 | 1.5h | 上课 | 软件工程概论 |
3.6 | 17:30 | 18:00 | 0.5h | 编程 | 四则运算2 |
3.6 | 19:00 | 19:30 | 0.5h | 看书 | 《构建之法》 |
3.8 | 17:00 | 21:00 | 4h | 编程 | 四则运算2 |
3.9 | 18:00 | 20:00 | 2h | 编程 | 四则运算2 |
3.10 | 18:30 | 19:30 | 1h | 看书 | 《构建之法》 |