软件工程个人作业02
四则运算2的设计思路:
因为老师添加了一些要求,比如说能够通过参数来控制有无乘除法,加减有无负数,除法是否有余数。
所以,我意识到,应该把每个式子都写成函数,比如说,整数加法式子,减法式子,都写成函数,然后再通过参数来控制
是否产生此类型的式子,以及式子的一些格式。
四则运算的代码如下:
Main.java
import java.util.*; public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("请输入数值范围:"); Scanner scan=new Scanner(System.in); int range=scan.nextInt(); //新想法,可以在用户还没做出选择之前,先出点没有任何要求的题 System.out.println("需要定制多少题:"); int number=scan.nextInt(); int alnumber=0; //代表已出题目的数目 int i; //用于循环 Random ran=new Random(); //专门用于产生随机数 int ranNumber;//存随机产生的数 //建一个Ways类的对象,用于方法的调用 Ways ways=new Ways(); //用于存储用户的选择 char choice[]=new char[4]; System.out.println("是否需要乘除法?"); choice[0]=scan.next().charAt(0); System.out.println("是否需要括号?"); choice[1]=scan.next().charAt(0); System.out.println("加减是否需要负数?"); choice[2]=scan.next().charAt(0); System.out.println("除法是否需要余数?"); choice[3]=scan.next().charAt(0); for(i=0;i<number;i++){ //开始出题 switch(ran.nextInt(8)+1){ case 1: System.out.println(ways.addInt(range)); break; case 2: System.out.println(ways.mimusInt(range, choice[2])); break; case 3: if(ways.multiplyInt(range, choice[0])!=null){ System.out.println(ways.multiplyInt(range, choice[0])); } else i--; break; case 4: if(ways.divideInt(range, choice[0],choice[3])!=null){ System.out.println(ways.divideInt(range, choice[0],choice[3])); } else i--; break; case 5: System.out.println(ways.add(range)); break; case 6: System.out.println(ways.minus(range,choice[2])); break; case 7: if(ways.multiply(range,choice[0])!=null){ System.out.println(ways.multiply(range,choice[0])); } else i--; break; case 8: if(ways.divide(range,choice[0])!=null){ System.out.println(ways.divide(range,choice[0])); } else i--; break; } } } }
Ways.java
import java.util.*; public class Ways { public String addInt(int range){ //整数加法 Random ran=new Random(); int a=ran.nextInt(range)+1; int b=ran.nextInt(range)+1; int c=a+b; String result=a+"+"+b+"="+c; return result; } public String mimusInt(int range ,char a1){ //整数减法 Random ran=new Random(); int a=ran.nextInt(range)+1; int b=ran.nextInt(range)+1; if(a1=='n') { if(a<b){ int temp; temp=a; a=b; b=temp; } } int c=a-b; String result=a+"-"+b+"="+c; return result; } public String multiplyInt(int range,char a1){ //整数乘法 Random ran=new Random(); int a=ran.nextInt(range)+1; int b=ran.nextInt(range)+1; int c=a*b; String result=a+"*"+b+"="+c; if(a1=='n'){ result=null; } return result; } public String divideInt(int range,char a1,char a2){ //整数除法 Random ran=new Random(); int a=ran.nextInt(range)+1; int b=ran.nextInt(range)+1; while(b==0){ b=ran.nextInt(range)+1; } if(a2=='n') { while(a%b!=0){ a=ran.nextInt(range)+1; b=ran.nextInt(range)+1; while(b==0){ b=ran.nextInt(range)+1; } } } int c=a/b; String result=a+"/"+b+"="+c; if(a1=='n'){ result=null; } return result; } public String add(int range){ //真分数加法 Random ran=new Random(); int a=ran.nextInt(range)+1; int b=ran.nextInt(range)+1; int c=ran.nextInt(range)+1; int d=ran.nextInt(range)+1; //分母不能为零 while (b==0){ b=ran.nextInt(range); } while (d==0){ d=ran.nextInt(range); } if(a>b){ int temp; temp=a; a=b; b=temp; } if(c>d){ int temp; temp=c; c=d; d=temp; } String result="("+reduce(a,b)+")"+"+"+"("+reduce(c,d)+")"+"="+calculate(reduce(a,b),reduce(c,d),"+"); return result; } //用于判断两个分数的大小 public boolean judge(int a,int b,int c,int d ){ if(a*d-b*c<0){ return false; } return true; } public String minus(int range,char a1){ //真分数减法 Random ran=new Random(); int a=ran.nextInt(range)+1; int b=ran.nextInt(range)+1; int c=ran.nextInt(range)+1; int d=ran.nextInt(range)+1; //分母不能为零 while (b==0){ b=ran.nextInt(range); } while (d==0){ d=ran.nextInt(range); } if(a>b){ int temp; temp=a; a=b; b=temp; } if(c>d){ int temp; temp=c; c=d; d=temp; } if(a1=='n'){ while(judge(a,b,c,d)==false){ a=ran.nextInt(range)+1; b=ran.nextInt(range)+1; c=ran.nextInt(range)+1; d=ran.nextInt(range)+1; if(a>b){ int temp; temp=a; a=b; b=temp; } if(c>d){ int temp; temp=c; c=d; d=temp; } } } String result="("+reduce(a,b)+")"+"-"+"("+reduce(c,d)+")"+"="+calculate(reduce(a,b),reduce(c,d),"-"); return result; } public String multiply(int range ,char a1){ //真分数乘法 Random ran=new Random(); int a=ran.nextInt(range)+1; int b=ran.nextInt(range)+1; int c=ran.nextInt(range)+1; int d=ran.nextInt(range)+1; //分母不能为零 while (b==0){ b=ran.nextInt(range); } while (d==0){ d=ran.nextInt(range); } if(a>b){ int temp; temp=a; a=b; b=temp; } if(c>d){ int temp; temp=c; c=d; d=temp; } String result="("+reduce(a,b)+")"+"*"+"("+reduce(c,d)+")"+"="+calculate(reduce(a,b),reduce(c,d),"*"); if(a1=='n'){ result=null; } return result; } public String divide(int range,char a1){ //真分数除法 Random ran=new Random(); int a=ran.nextInt(range)+1; int b=ran.nextInt(range)+1; int c=ran.nextInt(range)+1; int d=ran.nextInt(range)+1; //分母不能为零 while (b==0){ b=ran.nextInt(range); } while (d==0){ d=ran.nextInt(range); } if(a>b){ int temp; temp=a; a=b; b=temp; } if(c>d){ int temp; temp=c; c=d; d=temp; } String result="("+reduce(a,b)+")"+"/"+"("+reduce(c,d)+")"+"="+calculate(reduce(a,b),reduce(c,d),"/"); if(a1=='n'){ result=null; } return result; } public int maxCommon(int a ,int b) { //循环法求两个数的最大公约数 //保证第一个参数大于第二个参数 if(a<b) { int temp; temp=a; a=b; b=temp; } while(a%b!=0) //在余数不为零时循环 { int temp=a%b; a=b; b=temp; } return b; //返回最大公约数 } public int minCommon(int a,int b) { //求最小公倍数 return a*b/maxCommon(a,b); } public String reduce(int a ,int b) { //对于a/b组成的分数进行约分 //第一步就是找出两者的最大公约数 int c=maxCommon(a,b); //分子分母约分 a=a/c; b=b/c; //把a,b转换成分数返回 String temp=a+"/"+b; return temp; } public String calculate(String a,String b,String c) //参数分别代表第一个分数,第二个分数,以及运算符 { int a1=Integer.parseInt(a.substring(0,a.indexOf("/")));//代表a的分子 int a2=Integer.parseInt(a.substring(a.indexOf("/")+1));//代表a的分母 int b1=Integer.parseInt(b.substring(0,b.indexOf("/")));//代表b的分子 int b2=Integer.parseInt(b.substring(b.indexOf("/")+1));//代表b的分母 if(c.equals("+")) { //首先求两个分母的最小公倍数,进行通分 int temp=minCommon(a2,b2); a1=temp/a2*a1; b1=temp/b2*b1; //求合并后的分子 int temp1=a1+b1; String temp2=reduce(temp1,temp); return temp2; } else if(c.equals("-")) { //首先求两个分母的最小公倍数,进行通分 int temp=minCommon(a2,b2); a1=temp/a2*a1; b1=temp/b2*b1; //求合并后的分子 int temp1=a1-b1; return reduce(temp1,temp); } else if(c.equals("*")) { //直接把分母相乘得到合并后的分母 int temp=a2*b2; //求合并后的分子 int temp1=a1*b1; return reduce(temp1,temp); } else if(c.equals("/")) { //分数相除就是第一个分数乘以第二个分数的倒数 int temp=a2*b1; //求合并后的分子 int temp1=a1*b2; return reduce(temp1,temp); } String xuhaojun="成功了"; return xuhaojun; } public String equation(int range,char a1){ Random ran=new Random(); int number=ran.nextInt(9)+2;//决定这个式子有几个数 int number1=number/2; for(int i=0;i<number1;i++){ } String result=""; if(a1=='n'){ result=null; } return result; } }
程序结果截图:
程序总结:
通过这个程序,我真是深刻的认识到了分而治之的思想,当我们遇到一个问题时,不管这个问题怎么样,
我们应该想到这个问题分解成一些比较小的问题,然后再分别去解决这些小问题。
还有就是一定要把解决问题的手段封装到方法里,这样会便于以后的管理。
项目计划日志:
日期 任务 |
听课 |
编写程序 |
阅读课本 |
准备考试 |
日总计 |
周一 |
60 |
60 |
|
|
120 |
周二 |
|
|
|
|
|
周三 |
|
180 |
|
|
180 |
周四 |
|
120 |
|
|
120 |
周五 |
|
|
|
|
|
周总计 |
60 |
360 |
|
|
420 |
时间记录日志:
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
C |
U |
3/6 |
14:00 |
16:00 |
|
120 |
听课 |
软件工程概论 |
|
|
|
22:00 |
22:40 |
|
40 |
写思路 |
把程序的思路写下来 |
|
|
3/8 |
15:00 |
18:00 |
|
180 |
编程序 |
四则运算2 |
|
|
3/9 |
20:00 |
22:00 |
|
120 |
编程序 |
四则运算2 |
|
|
3/10 |
16:00 |
18:00 |
|
120 |
写报告 |
四则运算2 的报告 |
|