2017-2018-2 1723 『Java程序設計』課程 結對編程練習_四則運算 第二週

一.結對對象

二.本週內容

(一)繼續編寫上週未完成代碼

1.本週繼續編寫代碼,使代碼支持分數類計算
2.相關過程截圖
a.下圖是上週編寫的生成題目的類,不能運行。

下圖是本週更新的代碼,能夠支持分數的產生,紅色框內爲主要更改區域
html

b.下圖是代碼中題目轉後綴表達式的部分代碼及運行結果截圖
java

c.下圖是代碼中後綴表達式計算結果的部分代碼及運行結果截圖
編程

3.關鍵代碼解釋數組

在題目中生成真分數及包含真分數的題目轉換爲後綴表達式dom

  • 生成真分數:這裏咱們讓產生的隨機數含有複數,舉例,咱們產生-4~9之間的隨機數,若是產生隨機數爲負數,就將一個隨機產生的真分數賦給一個String型的figure,若是產生的隨機數爲0~9,則將此隨機數轉換爲String型的賦給figure,這樣就完成了真分數的生成在題目中。
  • 含真分數的題目轉後綴表達式:咱們調用StringTokenizer類中的方法,將上面的題目轉換爲StringTokenizer類的一個對象,而後使用nextToken()方法,將其分爲String的字符串,而後判斷字符串的長度,若是字符串長度大於1,就將字符串直接輸出,而後下面就是字符串爲1的,包括整數和操做符,這個在上週已經解決,包括入棧出棧,都已解決。
  • 後綴表達式求值:正在編寫中:將全部的數都轉換爲分數,而後調用以前編寫類中的分數的加減乘除方法,而後完成求值,正在編寫中。

(二)遇到的困難及解決方法【持續更新中......】

1.關於題目轉換成後綴表達式的解決思路
題目轉換成後綴表達式的原理是,如圖:

這個要求的難點在於拿掃描到的操做符與棧頂的操做符比較優先級,高則進棧,低則輸出棧頂元素並將掃描到的操做符壓進棧裏。
解決思路:
a.老師給的思路是編寫一個數組,裏面存放着操做符的優先級比較,而後在調用的時候用於比較。
b.對於老師給的思路,有一些不是很懂的地方。首先是存放操做符優先級比較的二維數組不太會編,而後就是具體調用時的代碼實現不是很清楚。因此我轉換了一下思路,從原理的本質上思考了一下:題目要求的四則運算只要求加減乘除四個操做符(由於咱們組不用實現括號的產生),只有四個操做符的比較,經過if語句多判斷幾回就OK了。首先判斷拿到的操做符是否是乘除一級的,若是是,則判斷棧頂的操做符是否是加減,是則外面的優先級高,不然外面優先級低;若是拿到的操做符是加減一級的,則優先級確定低於棧頂元素優先級。從而達到了判斷優先級的目的。code

(三)所有代碼

第一部分:生成題目 //負責人:侯澤洋htm

import java.util.Stack;
import java.util.Random;
import java.util.ArrayList;
import java.util.Scanner;

class Questions {
    ArrayList<Object> array = new ArrayList<Object>();
    Random generator = new Random();
    char[] newchar = {'+', '-', '*', '/'};
    protected int number;
    int NUM;

    public Questions() {
        number = 0;
    }

    public Object getQuestion(int num) {
        int num1 = num;

        while (num > 0) {
            int figure = (int) generator.nextInt(9) + 1;
            array.add(figure);
            number = (int) (Math.random() * 4);
            array.add(newchar[number]);
            num--;
        }
        String obj = "";
        while (num < 2 * num1) {
            obj += array.get(num);
            num++;
        }
        int other = (int) generator.nextInt(9) + 1;
        array.add(other);
        obj += other + "=";

        return obj;
    }
}

第二部分:題目運算 //負責人:周亞傑,侯澤洋對象

//生成後綴表達式

public class Calculations {
    public static void main(String[] args) {
        Questions questions=new Questions();
        Stack stack = new Stack();

        Scanner Scan=new Scanner(System.in);

        char c;
        int count=0,answer;
        char[] operation = new char[100];
        String str = (String) questions.getQuestion(3);

        System.out.println("請回答如下問題:\n"+str);
        System.out.println("請輸入你的答案:");
        answer=Scan.nextInt();

        for (int i = 0; i < str.length(); i++) {
            c = str.charAt(i);
            if (c >= '0' && c <= '9') {

                operation[i] = c;
                count++;

               }
            else {

                if (c == '*' || c == '/') {
                    if (stack.empty()) {
                        stack.push((char) c);
                    } else if ((char) stack.peek() == '*' || (char) stack.peek() == '/') {
                        operation[i] = (char) stack.pop();
                        stack.push(c);
                    } else
                        stack.push(c);
                } else if (c == '+' || c == '-') {
                    if (stack.empty()) {
                        stack.push(c);
                    } else if ((char) stack.peek() == '+' || (char) stack.peek() == '-') {
                        operation[i] = (char) stack.pop();
                        stack.push(c);
                    } else {
                        operation[i] = (char) stack.pop();
                        stack.push(c);
                    }

                } else
                    stack.push(c);

            }
        }
        int num = stack.size();
        for (int a = 0; a < num; a++) {
            operation[str.length() + a] = (char) stack.pop();
        }
//後綴表達式計算    //負責人:周亞傑

Stack<Integer> stack1 = new Stack<Integer>();

    int m, n, sum,num1=str.length()+(str.length()-count);

        for (int b = 0; b <= num1; b++) {
        if (operation[b] >= '0' && operation[b] <= '9')
            stack1.push((int) operation[b]-48);
        else {
            if (operation[b] == '+') {
                m =  stack1.pop();
                n =  stack1.pop();
                sum = n + m;
                stack1.push(sum);
            } else if (operation[b] == '-') {
                m = stack1.pop();
                n = stack1.pop();
                sum = n- m;
                stack1.push(sum);
            } else if (operation[b] == '*') {
                m = stack1.pop();
                n = stack1.pop();
                sum = n * m;
                stack1.push(sum);
            } else if (operation[b] == '/') {
                m =  stack1.pop();
                n =  stack1.pop();
                sum = n / m;
                stack1.push(sum);
            }
            else if (operation[b] == ' ')
                continue;
        }
    }
        if ((int)stack1.peek()==answer)
            System.out.println("恭喜你答對了!");
        else
            System.out.println("很遺憾,答錯了!答案是:"+stack1.peek());
}
}

三.我的貢獻度劃分

周亞傑:50%
侯澤洋:50%blog

四.小組結對編程照片

相關文章
相關標籤/搜索