1. 程式人生 > >作業五 | 結對項目-四則運算 “軟件”之升級版

作業五 | 結對項目-四則運算 “軟件”之升級版

對比 這就是 html 說明 ava 就會 java版 alc 可視化

作業要求來自於https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2232

GitHub遠程倉庫的地址https://github.com/kunnkkk/16rg

結對同伴:林溢漫 學號:201606120099 博客地址:https://www.cnblogs.com/linyiman/p/9827457.html

註:這次的結對編程我們一起做了Java版和Web版的四則運算答題軟件/系統。我們首先做的是Java版的四則運算答題軟件,功能齊全,符合作業要求,而Web版是一個嘗試的額外制作,初衷是令用戶界面更美觀、友好,但由於剩余的時間不多還有小部分功能未完善。

(Java版)四則運算

  • 基本要求:
    • 生成題目,單個題目最多不能超過4個運算符,操作數小於100
    • 用戶可以輸入答案
    • 若用戶輸入答案正確,則提示正確;若答案錯誤,則提示錯誤,並要提示正確答案是多少
  • 擴展要求(選擇方向):
    • 用戶答題結束以後,程序可以顯示用戶答題所用的時間
    • 用戶可以選擇出題的個數(最多不能超過5個題目),答題結束可以顯示用戶答錯的題目個數和答對的題目個數
    • 程序可以出單個整數階乘的題目:如:4!=24
    • 程序可以設置皮膚功能,可以改變界面的顏色即可
    • 程序可以設置答題時間,時間設置為整數,單位為秒,最大不能超過120秒,若超過了答題時間未答題,則提示:時間已到,不能答題
  • 開發環境:IntelliJ Idea
  • 文件名稱:CalculationSystem
  • 分工:
    • 林溢漫 Java用戶界面設計以及第2、3、4功能的實現
    • 郭曉瑩 第1、5功能的實現以及調試、修改程序的一些小錯誤
  • 算法設計說明:
    • public class FourCalculations {...}

      隨機生成最多不能超過4個運算符,操作數小於100的單個四則運算式,並且能進行正確答案的計算。

    • public class FactorialCalculations {...}

      設置隨機數種子隨機產生一個範圍在1~20的數字,並且能進行正確的階乘運算。

    • public class JudgeLabel extends JLabel {...}

      創建一個JudgeLabel類用於顯示圖標“√”和“×”,若用戶在答案區輸入的答案正確,則圖標為“√”,若用戶在答案區輸入的答案錯誤,則圖標為“×”。

    • public class Window extends JFrame implements Runnable {...}

      設計非控制臺的用戶界面,初始化各類按鈕,主函數就在這個類裏面,程序的執行從主函數裏的代碼語句開始。

  • 調試結果:
    • 用戶界面

      技術分享圖片

    • 設置背景色

      技術分享圖片

    • 輸入題目數,範圍為1~5,否則出現信息提示,需要重新輸入

      技術分享圖片技術分享圖片

    • 四則運算開始計時

      技術分享圖片

    • 四則運算交卷判斷答案正確與否

      技術分享圖片

    • 限時120秒交卷

      技術分享圖片

    • 階乘題目開始計時

      技術分享圖片

    • 階乘交卷判斷答案正確與否

      技術分享圖片

  • 詳細代碼:

(1)計算四則運算式的正確結果。首先遍歷存儲在operators列表中的所有運算符,當有乘除時,就取出operations列表中位於此符號的左右兩側的操作數,然後進行四則運算。計算結束後要將此運算符和操作了的兩個操作數從列表中移除,運算符容器的指針回到原來的位置。遍歷完所有的乘號和除號後,再遍歷operators列表中的所有加號和減號。

技術分享圖片
public int generateCorrectAnswer(List<String> operators, List<Integer> operations) {
        //遍歷運算符容器,完成乘除運算
        for (int i = 0; i < operators.size(); i++) {
            String operator = operators.get(i);
            if (operator.equals("*") || operator.equals("/")) {
                operators.remove(i);                    //乘除符號將其從集合中移除
                int operateLeft = operations.remove(i);      //拿運算符左側的數字
                int operateRight = operations.remove(i);     //拿運算符右側的數字
                if (operator.equals("*"))
                    operations.add(i, operateLeft * operateRight);
                else
                    operations.add(i, operateLeft / operateRight);
                i--;  //運算符容器的指針回到原來的位置,防止跳過下一個運算符
            }
        }

        //遍歷運算符容器,完成加減運算,當運算符容器為空時,運算結束
        while (!operators.isEmpty()) {
            String operator = operators.remove(0);
            int operateLeft = operations.remove(0);
            int operateRight = operations.remove(0);
            if (operator.equals("+"))
                operateLeft = operateLeft + operateRight;
            else
                operateLeft = operateLeft - operateRight;
            operations.add(0, operateLeft);
        }
        return operations.get(0);
    }
計算四則運算正確結果

(2)產生一個範圍在1~20的隨機數,進行階乘運算,將最終得到的int整型運算結果result轉換成String字符串類型。

技術分享圖片
//隨機產生的階乘數字
    public int generateFormula() {
        Random random = new Random();
        int num = random.nextInt(19)+1;
        //計算階乘結果
        int result = 1;
        for (int i = 1; i <= num; i++) {
            result*= i;
        }
        correctAnswerList.add(String.valueOf(result));
        return num;
    }
隨機產生的階乘數字

(3)進行答案判斷。首先判斷用戶進行的是四則運算操作還是階乘運算操作,接著從答題區answerArea[]中取出用戶輸入的答案與標準正確答案進行對比,若相同,則在圖標區顯示“√”,若不相同,則表示用戶計算結果不正確,圖標區顯示“×”,並且將答題區用戶原先輸入的答案修改為正確答案。

技術分享圖片
private void markingPapers() {
        if(fourCalculation == true) {
            for (int i = 0; i < answerArea.length; i++) {
                //System.out.println("answer:"+fourCalculations.correctAnswerList.get(i));
                //System.out.println("input:"+answerArea[i].getText());
                if (answerArea[i].getText().equals(fourCalculations.correctAnswerList.get(i))) {
                    judgeLabel[i].setImageUrl("./FourOperations/src/main/img/right.png");   // 正確,顯示“√”圖標
                    numT++;
                }
                else {
                    //answerArea[i].setText("錯");
                    judgeLabel[i].setImageUrl("./FourOperations/src/main/img/error.png");   // 錯誤,顯示“×”圖標
                    answerArea[i].setText(fourCalculations.correctAnswerList.get(i));        //將用戶輸入的錯誤答案修改為正確答案
                    numF++;
                }
            }
        }
        else{
            for (int i = 0; i < answerArea.length; i++) {
                //System.out.println("answer:"+fourCalculations.correctAnswerList.get(i));
                //System.out.println("input:"+answerArea[i].getText());
                if (answerArea[i].getText().equals(factorialCalculations.correctAnswerList.get(i))) {
                    judgeLabel[i].setImageUrl("./FourOperations/src/main/img/right.png");   // 正確,顯示“√”圖標
                    numT++;
                }
                else {
                    //answerArea[i].setText("錯");
                    judgeLabel[i].setImageUrl("./FourOperations/src/main/img/error.png");   // 錯誤,顯示“×”圖標
                    answerArea[i].setText(factorialCalculations.correctAnswerList.get(i));    //將用戶輸入的錯誤答案修改為正確答案
                    numF++;
                }
            }
        }
    }
答案判斷

(4)設置時間線程顯示用戶答題時間。若用戶在120s時仍未答題結束,則彈出提示框提示用戶“時間已到,不能答題!”。

技術分享圖片
public void run() {      //  完成時間計時
        int second = 0;
        int minute = 0;
        String time;
        timeLabel.setText("用時 00:00");    // 初始化用時
        while (true) {
            try {
                Thread.sleep(1000);   //  按時間設置
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            second++;
            if (second == 60) {
                second = 0;
                minute++;
            }
            if (minute < 10) {
                time = "用時 " + "0" + minute + ":";
            } else {
                time = "用時 " + minute + ":";
            }
            if (second < 10) {
                time = time + "0" + second;
            } else {
                time = time + second;
            }
            if (minute == 2) {      //  如果時間到120s,用戶還未答完題,提示信息
                JOptionPane.showMessageDialog(this, "時間已到,不能答題!");
                submit();
                return;
            }
            timeLabel.setText(time);
        }
    }
顯示用戶時間

(5)設置用戶界面的背景色。當用戶單擊“背景色”按鈕時,會顯示一個顏色選擇界面,用戶選擇合適的背景色之後單擊“確認”按鈕,背景色就會改變。

技術分享圖片
//  背景色按鈕
        JButton changeButton = new JButton("背景色");
        changeButton.setBounds(startX, startY+step*5, width, height);
        changeButton.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                Color color = JColorChooser.showDialog(outPanel, "背景色", outPanel.getBackground());    // 彈出顏色界面供用戶自由選擇背景色
                if (color != null) {
                   outPanel.setBackground(color);
                }
            }
設置背景色

(Web版)四則運算

  • 基本要求
    • 生成題目,單個題目最多不能超過4個運算符,操作數小於100
    • 用戶可以輸入答案
    • 若用戶輸入答案正確,則提示正確;若答案錯誤,則提示錯誤,並要提示正確答案是多少(由於時間問題未將用戶輸入結果與答案進行循環比較,之後嘗試完成該功能並更新博客)
  • 擴展要求(選擇方向)
    • 用戶答題結束以後,程序可以顯示用戶答題所用的時間
    • 用戶可以選擇出題的個數(最多不能超過5個題目),答題結束可以顯示用戶答錯的題目個數和答對的題目個數
    • 程序可以出單個整數階乘的題目:如:4!=24
    • 程序可以設置答題時間,時間設置為整數,單位為秒,最大不能超過120秒,若超過了答題時間未答題,則提示:時間已到,不能答題
  • 開發環境:IntelliJ Idea
  • 文件名稱:web-calSystem.zip
  • 分工:
    • 林溢漫 第1、4功能的實現以及程序的調試與修改小錯誤
    • 郭曉瑩 Web用戶界面設計以及第2、3功能的實現
  • 調試結果
    • 首頁選擇答題數目與類型

      技術分享圖片

    • 選擇題目數量進入簡單運算,120秒倒計時開始,輸入結果對比後判斷對錯和計算用時,確定返回主頁

      技術分享圖片

    • 選擇題目數量進入階乘運算,120秒倒計時開始,輸入結果對比後判斷對錯和計算用時,確定返回主頁

      技術分享圖片

    • 答題超過120秒時按確認返回主頁

      技術分享圖片

總結

  • 結對編程時間統計表:

    PSP2.1

    Personal Software Process Stages

    預估耗時(分鐘)

    實際耗時(分鐘)

    Planning

    計劃

    420

    420

    · Estimate

    估計這個任務需要多少時間

    420

    420

    Development

    開發

    420

    420

    · Analysis

    需求分析 (包括學習新技術)

    30

    15

    · Design Spec

    生成設計文檔

    0

    0

    · Design Review

    設計復審

    20

    40

    · Coding Standard

    代碼規範

    120

    120

    · Design

    具體設計

    30

    35

    · Coding

    具體編碼

    420

    400

    · Code Review

    代碼復審

    100

    60

    · Test

    測試(自我測試,修改代碼,提交修改)

    120

    120

    Reporting

    報告

    120

    125

    Test Report

    測試報告

    0

    0

    ·workload

    計算工作量

    420

    400

    ·correction

    並提出過程改進計劃

    0

    0

  • 結對照片:

技術分享圖片

  • 總結:
    • 遇到的問題/如何解決

    1. 我們之前是運用c語言寫四則運算初版軟件,這次作業要將程序改裝成一個單機帶用戶界面(不是控制臺)的程序,而我們考慮過是否試用一下之前我們沒有接觸過的visual studio來完成,但由於上手新軟件比較費時間,所以我們最終選擇了用IntelliJ Idea重寫程序。
    2. 我們使用java重寫程序時有糾結是使用jFrame還是用JavaScript來完成可視化界面。我個人比較熟悉html的JavaScript編寫,而我的同伴比較熟悉java的編寫,後來我們一起分析了一下兩種方法的利弊,最後選定了使用java編寫的方法。
    3. 由於我對java語言不是特別熟練,在完成我負責的功能的時候有很多方法是通過網上查詢的。通過對比不同方法和寫法,再選用比較合適的方法寫進程序裏。
    4. 在web版程序的實現時,在循環輸出題目的過程中曾嘗試過很多種方法但未能實現,後來向web老師請教後學會了通過循環輸出.push()方法才實現了該功能。
    • 收獲體會

      這次的結對編程我和我的同伴在完成程序的過程中合作很愉快,我們分工明確,在遇到困難時互相幫助,並且會自己查找不同的資料來解決編程的過程中所遇到的問題。在完成了java版的四則運算程序後,也抱著嘗試和學習的想法制作了web版的四則運算,雖然由於時間問題還有一點點功能沒做完,但從中我們也學習到了新的JavaScript的知識與邏輯運用。當然,在後續當中我還想把未完成的功能解決了,並且把web版的界面再做得更人性化和美觀一點,而這就是後話了。

作業五 | 結對項目-四則運算 “軟件”之升級版