天天看點

結對作業

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,對于測試也有了更多的了解,對于代碼的測試由開始的不清楚變得漸漸熟悉。同時,在寫代碼的對以前的的知識也進行了回顧,對一些類及方法加深印象。我覺得平時在學習的過程中應該多加強交流,能夠更好的找到解決問題的方法。

結對作業
上一篇: 類圖
下一篇: css 透明度