第三次作业

一、作业要求: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         }
View Code

功能二:支持小数和含小括号的四则运算且表达式可以重复。在处理小括号的时候要考虑小括号是不是合法,左右成对出现。计算的结果的小数位是零,就直接显示成整数就行。同样也涉及到了结果的输出以及和用户的结果进行对比,判断是否正确。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     }
View Code

功能三:表达式不重复且输出结果显示在控制台,且将控制台显示的结果输出到指定位置的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     }
View Code

 

四、结队编程的体会:

1.之前一个人做的时候,遇到不懂得问题时,就会陷入迷茫。当两个人一起编程时,有不懂的可以一起讨论,说出自己的意见,也为整个编程过程节约了时间。

2.除此之外,两个人一起合作时就会产生更多更好的想法,可以更好的优化整个项目的设计,遇到问题时可以相互帮助解决问题,效率也比较高。

3.两个人合作还可以发现多方身上的优点,找出自己身上的不足,并能相互监督让彼此变得更好,还可以彼此分享好的学习经验。综上所述,我们认为两个人合作的效率远远大于一个人。

4.我觉得主要在完成项目的过程中,会锻炼我们与人交流沟通能力,毕竟在以后的大部分工作中我们都需要与他人合作完成项目,现在也是提前锻炼。

五、花费时间较长、收获较大的事件:

1.我们最开始花了很多时间在项目构造上,最后参照搭档的上次wf词频统计小程序的思路,一层一层逐步深入,先构造好大体逻辑结构,再逐步细化。

2.其次我们卡在功能一花费了几天时间,功能一主要是四则运算的结果四舍五入。

3.题中要求写一个控制台程序,一开始我们以为输入格式应该在命令行中输入,结果运行程序的时候,还没等我们输入,立即就显示“输入格式错误!”而无法进行下去。这个就再去查控制台程序输入。一开始我们以为是在控制台输入,使用scanner获取用户输入参数。但后来经过舍友提醒,我们再去查查控制台程序输入,应该用命令行参数输入格式。可是我们试了好久,控制台直接闪退,显示输入格式错误,最后才发现输入格式的f4不作为判断条件,它不是命令行参数中的一个。

 

原文地址:https://www.cnblogs.com/tianjx687/p/9933776.html