1.題目簡介
簡單的JAVA四則運算
2.結對及分工過程
在本次試驗中,我進行代碼部分的正确編寫及運作,董學菲對代碼進行測試。
結對人位址:http://www.cnblogs.com/dongxuefei/
3.
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; // 記錄是否為負數
switch (stringOperation[i]) {
case '*':
case '/':
case '+':
case '-':
InrerceIndex = i;
if (i != 0) // 判斷該數是否為負數
ispas = true;
default:
if (ispas)
// 判斷此資料是否在運算字元串的最後一位
if (InrerceIndex == 0) {
a = Double.parseDouble(str);
intercePosition = str.length();
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; // 記錄資料前運算符的狀态
for (int i = stringOperation.length - 1; i >= 0; i--) {
temp = true;
if (temp)
// 判斷此資料是否在運算字元串的第一位
// if(temp)
// intercePosition++;
a = Double.parseDouble(str.substring(InrerceIndex, str.length()));
intercePosition = str.substring(InrerceIndex, str.length())
.length();
// 計算結果
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;
}
代碼的運作結果如下圖:
3.代碼位址
https://github.com/201303014048/test/blob/master/結對作業.md
4.問題及心得
過這次的結對作業中,對于代碼和測試都會遇到一些小問題,但是通過兩個人的溝通及交流得到了解決。通過學習JUnit,對于測試也有了更多的了解,對于代碼的測試由開始的不清楚變得漸漸熟悉。同時,在寫代碼的對以前的的知識也進行了回顧,對一些類及方法加深印象。我覺得平時在學習的過程中應該多加強交流,能夠更好的找到解決問題的方法。