20165322 結對編程-四則運算 階段總結
阿新 • • 發佈:2018-04-16
add inf 畫出 隨機 .com clas multiply and ava
結隊編程-四則運算 階段總結
學習筆記
中綴表達式轉換為後綴表達式
- 如果遇到數字,我們就直接將其輸出。
- 如果遇到非數字時,若棧為空或者該符號為左括號或者棧頂元素為括號,直接入棧。
- 如果遇到一個右括號,持續出棧並輸出符號,直到棧頂元素為左括號,然後將左括號出棧(註意,左括號只出棧,不輸出),右括號不入棧。
- 如果遇到運算符號且棧非空,查看棧頂元素,如果棧頂元素的運算優先級大於或者等於該運算符號,則持續出棧,直到棧頂元素優先級小於該運算符。最後將該元素入棧。
- 如果我們讀到了輸入的末尾,則將棧中所有元素依次彈出。
生成隨機數的運用
Random ran = new Random();
隨機數方法創建對象int B = ran.nextInt(2);
生成0—1之內的隨機數
需求分析
- 隨機生成題目
- 生成題目數量根據用戶需求輸入
- 自動生成小學四則運算題目(加、減、乘、除)
- 支持整數和真分數
- 支持多運算符(比如生成包含100個運算符的題目)
- 生成題目數量根據用戶需求輸入
- 統計正確率
能多次生成題目
- 擴展需求
- 題目去重
- 支持多語言
- 處理生成題目並輸出到文件
- 完成題目後從文件讀入並判題
- 隨機生成題目
設計思路
- 實驗首先是完成一個計算器的功能,可以實現簡單的+、-、*、/運算
- 實現多運算符,編入四個類分別實現整數運算、真分數運算、判斷結果正確並計算正確率
- 利用JUnit檢測非法輸入
- 設計一個主類生成隨機數,生成題目,並判斷正確率
- 設計測試類,利用JUnit測試整數類與分數類的四則運算
uml圖:
核心代碼及註釋
public class Calculate { public static void main(String[] args) { NumberFormat number = NumberFormat.getPercentInstance(); Random ran = new Random(); Scanner scan = new Scanner(System.in); while (true) { System.out.print("請輸入您所需要生成的題目數量:"); int A = scan.nextInt(); //A:題目數量 for (int i = 0; i < A; i++) { int B = ran.nextInt(2); //生成隨機數0/1,隨機挑選整數或分數運算 int C = ran.nextInt(4); //生成隨機數0-3,隨機挑選4種運算符 IntNumber in1 = IntNumber.obj(); //整數運算 IntNumber in2 = IntNumber.obj(); Fraction score1 = Fraction.obj(); //分數運算 Fraction score2 = Fraction.obj(); if (B == 0) { switch (C) { //整數加減乘除運算 case 0: int num = in1.add(in2); String num1 = "" + num; int n = scan.nextInt(); Judgement.judge(n == num, num1); break; case 1: num = in1.subtract(in2); num1 = "" + num; n = scan.nextInt(); Judgement.judge(n == num, num1); break; case 2: num = in1.multiply(in2); num1 = "" + num; n = scan.nextInt(); Judgement.judge(n == num, num1); break; case 3: num1 = in1.divide(score1); String Q = scan.next(); Judgement.judge(Q.equals(num1), num1); break; } } else { switch (C) { //分數加減乘除運算 case 0: Fraction num2 = score1.add(score2); String num1 = num2.toString(); String s = scan.next(); Judgement.judge(s.equals(num1), num1); break; case 1: num2 = score1.subtract(score2); num1 = num2.toString(); s = scan.next(); Judgement.judge(s.equals(num1), num1); break; case 2: num2 = score1.multiply(score2); num1 = num2.toString(); s = scan.next(); Judgement.judge(s.equals(num1), num1); break; case 3: num2 = score1.divide(score2); num1 = num2.toString(); s = scan.next(); Judgement.judge(s.equals(num1), num1); break; } } }
測試代碼
運行結果截圖
碼雲鏈接
碼雲鏈接
實驗過程
- 實驗要求生成隨機四則運算,最難的在於真分數與多運算符的實現,以及分多個類來實現算法。
- 我們參考了鄒欣老師的學生編寫的代碼《編寫一個能自動生成小學四則運算題目的程序》嘗試寫了生成隨機數的代碼。但是對後續代碼依然不知從何下手。
- 我們選擇請教了其他同學,並且參考了他們的代碼。其中在利用生成隨機數和switch語句來實現隨機四則運算的巧妙方法使我印象十分深刻。
- 但是我在真分數類的部分代碼我還不太明白。以及如何實現計算題隨機的長度也沒弄懂。
- 我嘗試了往代碼裏加入題目去重功能,但是還沒有成功。其他幾個擴展需求太難了怕是做不了QWQ...
評價我的結隊小夥伴
- 這個其實我覺得沒啥好評價的=-=本來就是好朋友兼舍友。睡前吧唧吧唧討論幾句,看到優秀的代碼就分享給對方。雖然都還很菜編不出那麽難的代碼。但是一起學習帶來了很大的快樂,討論中交換了很多新鮮的思路。相信我們會一起慢慢學的很好的。
- 結隊學習照片(上次比較枯燥這次弄個有趣的> - <)
總結
這次結隊學習任務雖然對我們來說難度大了點,但是鍛煉了我們的思維。通過一個項目也更有利於積極主動地去查找學習一些知識。
時間沒有認真統計,代碼我們沒有自己編寫出來。我感覺結對學習最大的好處就是可以隨時隨地討論起來,利用零散的時間也能一起學習。等啥時候我們自己能編寫一個項目了大概也能畫出漂亮的時間表吧0-0
20165322 結對編程-四則運算 階段總結