1. 程式人生 > >20165322 結對編程-四則運算 階段總結

20165322 結對編程-四則運算 階段總結

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 結對編程-四則運算 階段總結