zoukankan      html  css  js  c++  java
  • 5.1(封装,测试)

    程序源代码(简单Java版):

    package arrays.myArray;
    
    import java.util.Scanner;
    
    public class SortObject {
     private static int intercePosition = 0; // 记录单个运算数据的长度
     private static int[] intercePositionIndex = null; // 记录“(”的下标
     private static int[] intercePositionEnd = null; // 记录“)”的下标
    
     public static void main(String[] args) {
      Scanner input = new Scanner(System.in);
      do {
       System.out.println("请输入你要计算的字符串(注意:只能输入数字和加,减,乘除符号;输入完毕后,请直接回车):");
       String numberString = input.next().trim();
       // 判断输入的运算字符串是否符合规定
       if (ispassString(numberString) == false) {
        System.out.println("您输入的计算字符串有误,请正确输入!");
       } else {
        // 计算结果返回
        System.out.println(interceResult(numberString));
       }
      } while (true);
     }
    
     // 判断是否有带括号的运算字符串存在
     private static String interceResult(String str) {
      String result = str;
      char[] numberString = str.toCharArray(); // 1+2+(1*2+1-1*2+5)+2+(1+5+9+10-11)+1*5/2+3
      // 1+8-9+(1*8/2-5+(1+2+8))+4/5*8/3*2
      int IndexStart = 0; // 记录“(”的实际数量
      int EndStart = 0; // 记录“)”的实际数量
      for (int i = 0; i < numberString.length; i++) {
       if ('(' == numberString[i]) {
        // 记录最后一个正括号的位置
        IndexStart = i;
       }
       if (')' == numberString[i]) {
        // 记录反括号的最初始下标的位置
        EndStart = i;
    
        // 截取最里面一个括号里的运算字符串
        result = result.substring(IndexStart + 1, EndStart);
    
        // 截取括号的运算字符串进行运算,生成新的运算字符串
        result = str.substring(0, IndexStart)
          + interceptOperation(result, '*', '/')
          + str.substring(EndStart + 1, str.length());
    
        // 回调执行,其它小括号的运算字符串
        return interceResult(result);
       }
       if (i == numberString.length - 1)
        if (EndStart == 0)
         break;
      }
      // 不存在括号了,再进行混合运算
      result = interceptOperation(str, '*', '/');
      return result;
     }
    
     // 不带括号的四则运算
     private static String interceptOperation(String operationNumber, char a,
       char b) {
      String mess = operationNumber;
      char[] stringOperation = mess.toCharArray();
    
      // 循环遍历运算字符串,并做相应的运算
      for (int i = 0; i < stringOperation.length; i++) {
    
       // 判断运算符所在的索引
       if (stringOperation[i] == a || stringOperation[i] == b) {
        if (i != 0) {
         // 运算符前的第一个数
         double num1 = interceptNumIndex(mess.substring(0, i));
    
         // 记录第一个数据的长度
         int frontPosition = intercePosition;
    
         // 运算符前的第二个数
         double num2 = interceptNumEnd(mess.substring(i + 1,
           stringOperation.length));
    
         // 记录第二个数据的长度
         int backPosition = intercePosition;
    
         // 算完乘除,将结果替换到原来运算的位置,得到新的运算字符串
         String IndexMess = mess.substring(0, i - frontPosition + 1);
         String IndexResult = "";
    
         // 判断是否运算到最后的结果了
         if (IndexMess.indexOf('+') == -1
           && IndexMess.indexOf('*') == -1
           && IndexMess.indexOf('/') == -1
           && IndexMess.lastIndexOf('-') == -1)
          IndexMess = "";
         if (IndexMess != "")
          IndexResult = IndexMess.lastIndexOf('-') == IndexMess
            .length() - 1 ? IndexMess.substring(0, i
            - frontPosition) : IndexMess;
    
         // 组装新的运算字符串
         mess = IndexResult// mess.substring(0,i-frontPosition+1)
           + reslutString("" + stringOperation[i], num1, num2)
           + mess.substring(i + backPosition + 1);
         // 0.111/1212/2/2/2/2/2/2/2
         if (mess.lastIndexOf('-') == 0 && mess.indexOf('+') == -1
           && mess.indexOf('*') == -1
           && mess.indexOf('/') == -1) {
          break;
         }
         // 回调,继续运算
         return interceptOperation(mess, a, b);// 1+7-5+89/3+4-6*8/2+4-6
        } else
         continue;
       }
       if (i == stringOperation.length - 1) {
        // 递归出口,判断是否还有运算字符串在
        if (mess.indexOf('+') != -1 || mess.indexOf('-') != -1)
         return interceptOperation(mess, '+', '-');
        break;
       }
      }
      return mess;
     }
    
     // 截取第二个数
     private static double interceptNumEnd(String str) {
      double a = 0;
      int InrerceIndex = 0;
      char[] stringOperation = str.toCharArray();
      boolean ispas = false; // 记录是否为负数
      for (int i = 0; i < stringOperation.length; i++) {
       switch (stringOperation[i]) {
       case '*':
       case '/':
       case '+':
       case '-':
        InrerceIndex = i;
        if (i != 0) // 判断该数是否为负数
         ispas = true;
        break;
       default:
        break;
       }
       if (ispas)
        break;
      }
      // 判断此数据是否在运算字符串的最后一位
      if (InrerceIndex == 0) {
       a = Double.parseDouble(str);
       intercePosition = str.length();
       if (ispas)
        intercePosition++;
    
      } else {
       a = Double.parseDouble(str.substring(0, InrerceIndex));
       // 记录数据的真实长度
       intercePosition = str.substring(0, InrerceIndex).length();
      }
      return a;
     }
    
     // 截取第一个数
     private static double interceptNumIndex(String str) {
      double a = 0; // 记录数据
      int InrerceIndex = 0; // 记录运算符的位置
      boolean temp = false; // 记录数据前运算符的状态
      char[] stringOperation = str.toCharArray();
      for (int i = stringOperation.length - 1; i >= 0; i--) {
       switch (stringOperation[i]) {
       case '*':
       case '/':
    
       case '+':
       case '-':
        InrerceIndex = i;
        temp = true;
        break;
       default:
        break;
       }
       if (temp)
        break;
      }
      // 判断此数据是否在运算字符串的第一位
      if (InrerceIndex == 0) {
       a = Double.parseDouble(str);
       intercePosition = str.length();
       // if(temp)
       // intercePosition++;
      } else {
       a = Double.parseDouble(str.substring(InrerceIndex, str.length()));
       // 记录数据的真实长度
       intercePosition = str.substring(InrerceIndex, str.length())
         .length();
      }
      return a;
     }
    
     // 计算结果
     private static double reslutString(String operation, double num1,
       double num2) {
      double sumResult = 0;
      if (operation.equals("*"))
       sumResult = num1 * num2;
      if (operation.equals("-"))
       sumResult = num1 - num2;
      if (operation.equals("/"))
       sumResult = num1 / num2;
      if (operation.equals("+"))
       sumResult = num1 + num2;
      return sumResult;
     }
    
     // 判断是否正确输入运算方式
     private static boolean ispassString(String messString) {
      boolean ispass = false;
      boolean operationIspass = true; // 记录被除数的状态
      int ai = 0; // 记录是否有运算符号的存在
      char[] IsString = messString.toCharArray();
      int num1 = 0;
      int num2 = 0;
      for (int i = 0; i < IsString.length; i++) {
       // 记录有几对小括号的存在
       if ('(' == IsString[i])
        num1++;
       if (')' == IsString[i])
        num2++;
    
       // 判断除数是否为零
       if ('/' == IsString[i] && IsString[i + 1] == '0')
        operationIspass = false;
    
       // 判断是否输入了运算符合
       if (IsString[i] == '+' || IsString[i] == '-' || IsString[i] == '*'
         || IsString[i] == '/')
        ai++;
    
       if (i == IsString.length - 1)
        if (ai == 0)
         num2++;
      }
      if (operationIspass)
       if (num1 == num2)
        ispass = true;
      return ispass;
     }
    }

    封装代码:

    package test.test;
    
    public class Core {
        int sumResult=0;
        static double test1(String operation, double num1,double num2) {
                  double sumResult = 0;
                  if (operation.equals("*"))
                   sumResult = num1 * num2;
                  if (operation.equals("-"))
                   sumResult = num1 - num2;
                  if (operation.equals("/"))
                   sumResult = num1 / num2;
                  if (operation.equals("+"))
                   sumResult = num1 + num2;
                  return sumResult;
                 }
    
    
    
    }

    测试代码:

    package test.test;
    
    import static org.junit.Assert.*;
    
    import org.junit.Before;
    import org.junit.Test;
    
    public class CoreTest {
    
        @Before
        public void setUp() throws Exception {
        }
    
        @Test
        public void test() {
            Core core = new Core();
            double a = core.test1("+",1,3);
            assertEquals(4,a);
        }
    
    }

    对于这次实验的“测试方法”还在摸索之中。。。

  • 相关阅读:
    TSQL循环打印一年中所有的日期(WHILE循环)
    给Table加字段的SQL
    [正则表达式]前台JS得到控件ID (该控件被其它控件包住了)
    1.SQL Server中批量更新Object的Owner 2.附加数据库
    转:动态LINQ的几种方法
    转:查看LINQ生成SQL语句的几种方法
    TrimZero方法
    Oracle关联更新语法(TSQL中的update...from)
    Table之间的空隙或Table与父控件之间的空隙怎么去掉?
    自动完成带来的麻烦
  • 原文地址:https://www.cnblogs.com/santokim/p/4469537.html
Copyright © 2011-2022 走看看