作業五 | 結對項目-四則運算 “軟件”之升級版
作業要求來自於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
- 結對照片:
- 總結:
-
遇到的問題/如何解決
- 我們之前是運用c語言寫四則運算初版軟件,這次作業要將程序改裝成一個單機帶用戶界面(不是控制臺)的程序,而我們考慮過是否試用一下之前我們沒有接觸過的visual studio來完成,但由於上手新軟件比較費時間,所以我們最終選擇了用IntelliJ Idea重寫程序。
- 我們使用java重寫程序時有糾結是使用jFrame還是用JavaScript來完成可視化界面。我個人比較熟悉html的JavaScript編寫,而我的同伴比較熟悉java的編寫,後來我們一起分析了一下兩種方法的利弊,最後選定了使用java編寫的方法。
- 由於我對java語言不是特別熟練,在完成我負責的功能的時候有很多方法是通過網上查詢的。通過對比不同方法和寫法,再選用比較合適的方法寫進程序裏。
- 在web版程序的實現時,在循環輸出題目的過程中曾嘗試過很多種方法但未能實現,後來向web老師請教後學會了通過循環輸出.push()方法才實現了該功能。
-
收獲體會
這次的結對編程我和我的同伴在完成程序的過程中合作很愉快,我們分工明確,在遇到困難時互相幫助,並且會自己查找不同的資料來解決編程的過程中所遇到的問題。在完成了java版的四則運算程序後,也抱著嘗試和學習的想法制作了web版的四則運算,雖然由於時間問題還有一點點功能沒做完,但從中我們也學習到了新的JavaScript的知識與邏輯運用。當然,在後續當中我還想把未完成的功能解決了,並且把web版的界面再做得更人性化和美觀一點,而這就是後話了。
-
作業五 | 結對項目-四則運算 “軟件”之升級版