• 第三次作业


    一、作业要求: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不作为判断条件,它不是命令行参数中的一个。

     

  • 相关阅读:
    老杆子遇到新问题
    Linux 下网路适配器配置
    OpenCV学习笔记2_ShowAvi_获取Avi视频图像、摄像头图像
    OpenCV学习笔记3_ShowAvi_Trackbar_加载视频,并添加拖动条
    PS照片
    OpenCV学习笔记7_ImageToBGR_彩色图像三通道转化成BGR3幅单通道图像
    #include "stdafx.h"_预编译头文件
    OpenCV学习笔记1_ShowImage_显示一幅图像
    Visual Assist X_VS2010编程插件安装
    OpenCV学习笔记4_ImageToAvi_写视频
  • 原文地址:https://www.cnblogs.com/tianjx687/p/9933776.html
Copyright © 2020-2023  润新知