一、作业要求:【https://edu.cnblogs.com/campus/nenu/2016CS/homework/2266】
二、git仓库地址:https://git.coding.net/kefei101/f4.git
结队编程的伙伴以及博客地址:侯淑婷:https://www.cnblogs.com/houst388/p/9932981.html
三、
我们设置了六个类
Creat类是负责随机产生N条3个运算符,4个运算数的四则运算的式子。Calculator类是用来计算答案。MakeFile类负责运算结果输出至控制台上,且保存到指定位置的txt文件中。Symbol类负责将产生的代表运算符的数字转换成对应的运算符。(0:“+”;1:“-”;2:“*”;3:“/”)。Result类负责处理不同功能要求的输出结果格式。Main类是主类,负责接收控制台输入,并判断其输入格式,应实现的功能。
功能一:
刚开始不知道功能一的确切要求,在群里问过之后才了解功能一没有确切要求。在计算的时候支持整数,和不含括号的四则运算。这样就不用考虑重复的情况,也没有括号。主要是处理结果小数,让无限小数显示成四舍五入后的形式。在运算的时候先计算优先级高的运算符,先乘除后加减,同级运算符从左向右依次计算。如果出现除数为0的情况,那就是要重新进行四则运算的产生。Create类:createProblem(int n,int no):随机产生N个运算数为整数,不带括号的四则运算式子。 Create类:createProblem(int n,int no):随机产生N个运算数为整数,不带括号的四则运算式子(n表示n个式子,no表示功能一二的选择)
1 while(count<var.length){ 2 if(var.length == 3){ 3 var[0]=(int)(Math.random()*4); 4 var[1]=(int)(Math.random()*4); 5 var[2]=(int)(Math.random()*4); 6 } 7 for(int i=0;i<n;i++){ 8 num[i]=random.nextInt(20);//随机产生4个正整数,存放在num数组中 9 } 10 for(int i=0;i<n;i++){ 11 num1[i]= Double.valueOf(num[i]);//产生的符合规定的运算符存到num1数组中 12 } 13 14 //产生的符合规定的运算符存到m1数组中,m1数组长度比字符数量多一,方便后面运算 15 int m[] = new int[var.length+1]; 16 for(int i=0;i<var.length;i++){ 17 m[i]=var[i]; 18 } 19 20 //将运算符跟数字交错存到数组中,输出为一个四则运算 21 algo[0]=num[0]; 22 algo[1]=var[0]; 23 for(int i=2;i<n+var.length;i++){ 24 if(i%2==0){ 25 algo[i]=num[i/2]; 26 }else 27 algo[i]=var[i/2]; 28 } 29 30 //将运算符从前到后两两比较,先计算优先级高的运算符,先乘除后加减,同级运算符从左向右依次计算 31 //优先级:0:+ 1:- 2:* 3:/ 32 for(int i=0;i<var.length;i++){ 33 //*优先,后加减 34 if((m[i]<m[i+1]) && (m[i+1]==2)){ 35 num1[i+2]=num1[i+1]*num1[i+2]; 36 num1[i+1]=num1[i]; 37 m[i+1]=m[i]; 38 // System.out.println(num1[i + 2]); 39 count++; 40 } 41 //除优先,后加减 42 else if((m[i]<m[i+1]) && m[i+1]==3&&m[i]!=2){ 43 if(num1[i+2]!=0.0){ 44 BigDecimal v1 = new BigDecimal(num1[i + 1]); 45 BigDecimal v2 = new BigDecimal(num1[i + 2]); 46 Double v3 = (v1.divide(v2,4, RoundingMode.HALF_UP)).doubleValue(); 47 num1[i+2] = v3; 48 num1[i + 1] = num1[i]; 49 m[i + 1] = m[i]; 50 // System.out.println(num1[i + 2]); 51 count++; 52 } 53 else {//除数为0,重新进行四则运算的产生 54 count = 0; 55 for (int k = 0; k < var.length; k++) { 56 var[k] = 0; 57 } 58 break; 59 } 60 //先乘后除,从左至右 61 }else if (m[i] == 2 && m[i + 1] == 3) { 62 num1[i + 1] = num1[i] * num1[i + 1]; 63 // System.out.println(num1[i + 1]); 64 count++; 65 //先加后减,从左至右 66 } else if ((m[i] < m[i + 1]) && (m[i + 1] == 1)) { 67 num1[i + 1] = num1[i] + num1[i + 1]; 68 // System.out.println(num1[i + 1]); 69 count++; 70 //先除,从左至右 71 } else if ((m[i] > m[i + 1]) && m[i] == 3) { 72 BigDecimal v1 = new BigDecimal(num1[i]); 73 BigDecimal v2 = new BigDecimal(num1[i + 1]); 74 Double v3 = (v1.divide(v2,4, RoundingMode.HALF_UP)).doubleValue(); 75 num1[i + 1] = v3; 76 // System.out.println(num1[i + 1]); 77 count++; 78 //先乘,先加,从左至右 79 } else if ((m[i] > m[i + 1]) && m[i] == 2) { 80 num1[i + 1] = num1[i] * num1[i + 1]; 81 // System.out.println(num1[i + 1]); 82 count++; 83 //先减,从左至右 84 } else if ((m[i] > m[i + 1]) && m[i] == 1) { 85 num1[i + 1] = num1[i] - num1[i + 1]; 86 // System.out.println(num1[i + 1]); 87 count++; 88 //优先级相同 89 } else { 90 /* 包括情况为0==0;1==1;2==2 3==3*/ 91 if (m[i] == m[i + 1]) { 92 if (m[i] == 0) { //加法 93 num1[i + 1] = num1[i] + num1[i + 1]; 94 // System.out.println(num1[i + 1]); 95 count++; 96 } else if (m[i] == 1) { //减法 97 num1[i + 1] = num1[i] - num1[i + 1]; 98 // System.out.println(num1[i + 1]); 99 count++; 100 } else if (m[i] == 2) { //乘法 101 num1[i + 1] = num1[i] * num1[i + 1]; 102 // System.out.println(num1[i + 1]); 103 count++; 104 } else { //除法运算,判断除数不能为0 105 if (num1[i + 2] != 0.0) { 106 BigDecimal v1 = new BigDecimal(num1[i]); 107 BigDecimal v2 = new BigDecimal(num1[i + 1]); 108 Double v3 = (v1.divide(v2, 4, RoundingMode.HALF_UP)).doubleValue(); 109 // System.out.println(v3); 110 num1[i + 1] = v3; 111 // System.out.println(num1[i + 1]); 112 count++; 113 } else {//除数为0,重新进行四则运算的产生 114 count = 0; 115 for (int k = 0; k < var.length; k++) { 116 var[k] = 0; 117 } 118 break; 119 } 120 } 121 } 122 } 123 } 124 125 }
功能二:支持小数和含小括号的四则运算且表达式可以重复。在处理小括号的时候要考虑小括号是不是合法,左右成对出现。计算的结果的小数位是零,就直接显示成整数就行。同样也涉及到了结果的输出以及和用户的结果进行对比,判断是否正确。bracketsAlgo(int[] var):计算运算数整数小数均可 ,带括号的式子计提计算算法。(var[]代表将要存放的运算符) Create类:createSm(int n):随机产生N个运算数为整数小数均可的,带有括号的四则运算式子。(n表示n个式子,no表示功能一二的选择)
1 double f1 = random.nextDouble()*random.nextInt(20);//随机产生4个正数,存放在num数组中 2 double f2 = random.nextDouble()*random.nextInt(20); 3 BigDecimal n1 = new BigDecimal(f1); 4 BigDecimal n2 = new BigDecimal(f2); 5 f1 = n1.setScale(1,BigDecimal.ROUND_HALF_UP).doubleValue(); 6 f2 = n2.setScale(1,BigDecimal.ROUND_HALF_UP).doubleValue(); 7 String str = "";//算式 8 double st = 0;//当前结果 9 10 if(var[0]==0){ 11 st = f1+f2; 12 str = f1 + "+" + f2; 13 }else if(var[0]==1){ 14 st = f1-f2; 15 str = f1 + "-" + f2; 16 }else if(var[0]==2){ 17 st = f1*f2; 18 str = f1 + "*" + f2; 19 }else{ 20 while(f2==0){ 21 f2 = random.nextDouble()*random.nextInt(20); 22 } 23 BigDecimal v1 = new BigDecimal(f1); 24 BigDecimal v2 = new BigDecimal(f2); 25 Double v3 = (v1.divide(v2, 4, RoundingMode.HALF_UP)).doubleValue(); 26 st=v3; 27 str = f1 + "/" + f2; 28 } 29 30 for(int i=1;i<var.length;++i){ 31 f1 = random.nextDouble()*random.nextInt(20); 32 BigDecimal n3 = new BigDecimal(f1); 33 f1 = n3.setScale(1,BigDecimal.ROUND_HALF_UP).doubleValue(); 34 if(priority(var[i-1])<priority(var[i])){ 35 if(var[i]!=3){ 36 st *= f1; 37 str = "(" + str + ")*" + f1; 38 }else{ 39 while(f1==0){ 40 f1 = random.nextDouble()*random.nextInt(20); 41 } 42 BigDecimal v1 = new BigDecimal(st); 43 BigDecimal v2 = new BigDecimal(f1); 44 Double v3 = (v1.divide(v2, 4, RoundingMode.HALF_UP)).doubleValue(); 45 st=v3; 46 str = "(" + str + ")/" + f1; 47 } 48 }else if(var[i]==0){ 49 st += f1; 50 str = str + "+" + f2; 51 }else if(var[i]==1){ 52 if(var[i - 1] == 1) { 53 st = f1 - st; 54 str = f1 + "-(" + str + ")"; 55 }else{ 56 st -= f1; 57 str = str + "-" + f1; 58 } 59 }else if(var[i] == 2) { 60 st *= f1; 61 str = str + "*" + f1; 62 }else{ 63 while(f1==0){ 64 f1 = random.nextDouble()*random.nextInt(20); 65 } 66 BigDecimal v1 = new BigDecimal(st); 67 BigDecimal v2 = new BigDecimal(f2); 68 Double v3 = (v1.divide(v2, 4, RoundingMode.HALF_UP)).doubleValue(); 69 st=v3; 70 str = str + "/" + f2; 71 } 72 } 73 Result result = new Result(); 74 String dou = result.treat(st); 75 str = str + "=" + dou;//输出运算结果 76 return str; 77 }
功能三:表达式不重复且输出结果显示在控制台,且将控制台显示的结果输出到指定位置的txt文件中。功能三是在功能二的基础上加的。表达式的重复情况有交换律、结合律、分配律的情况。
这是将控制台显示的结果输出到指定位置的txt文件中。bracketsAlgo(int[] var):计算运算数整数小数均可 ,带括号的式子计提计算算法。(var[]代表将要存放的运算符) Create类:createSm(int n):随机产生N个运算数为整数小数均可的,带有括号的四则运算式子 。MakeFile类负责运算结果输出至控制台上,且保存到指定位置的txt文件中。
1 public void creatFile(int n,String fileName){ 2 try{ 3 File file = new File(fileName); 4 if (file.exists()) { //如果文件已存在,则删除文件 5 file.delete(); 6 } 7 if(file.createNewFile()){ 8 FileOutputStream txtFile = new FileOutputStream(file); 9 PrintStream p = new PrintStream(txtFile); 10 ArrayList<String> list = new ArrayList<String>(); 11 Create create = new Create(); 12 list = create.createSm(n); 13 for(int i=0;i<list.size();i++){ 14 System.out.println(list.get(i)); 15 p.println(list.get(i)); 16 } 17 txtFile.close(); 18 p.close(); 19 } 20 21 } 22 catch(IOException ioe) { 23 ioe.printStackTrace(); 24 } 25 }
四、结队编程的体会:
1.之前一个人做的时候,遇到不懂得问题时,就会陷入迷茫。当两个人一起编程时,有不懂的可以一起讨论,说出自己的意见,也为整个编程过程节约了时间。
2.除此之外,两个人一起合作时就会产生更多更好的想法,可以更好的优化整个项目的设计,遇到问题时可以相互帮助解决问题,效率也比较高。
3.两个人合作还可以发现多方身上的优点,找出自己身上的不足,并能相互监督让彼此变得更好,还可以彼此分享好的学习经验。综上所述,我们认为两个人合作的效率远远大于一个人。
4.我觉得主要在完成项目的过程中,会锻炼我们与人交流沟通能力,毕竟在以后的大部分工作中我们都需要与他人合作完成项目,现在也是提前锻炼。
五、花费时间较长、收获较大的事件:
1.我们最开始花了很多时间在项目构造上,最后参照搭档的上次wf词频统计小程序的思路,一层一层逐步深入,先构造好大体逻辑结构,再逐步细化。
2.其次我们卡在功能一花费了几天时间,功能一主要是四则运算的结果四舍五入。
3.题中要求写一个控制台程序,一开始我们以为输入格式应该在命令行中输入,结果运行程序的时候,还没等我们输入,立即就显示“输入格式错误!”而无法进行下去。这个就再去查控制台程序输入。一开始我们以为是在控制台输入,使用scanner获取用户输入参数。但后来经过舍友提醒,我们再去查查控制台程序输入,应该用命令行参数输入格式。可是我们试了好久,控制台直接闪退,显示输入格式错误,最后才发现输入格式的f4不作为判断条件,它不是命令行参数中的一个。