個人作業1——四則運算題目產生程式(基於控制台),四則運算控制台

來源:互聯網
上載者:User

個人作業1——四則運算題目產生程式(基於控制台),四則運算控制台

個人碼雲地址:HuanWong

a.需求分析:

      出一次小學四則運算的試題對於大多數家長來說都是個簡單的小事情,但是如果每天都需要重複同樣的小事顯得太過繁瑣,浪費時間。所以,有必要設計一個小程式協助家長減輕負擔同時又能讓孩子得到鍛煉。

b.功能設計:

      按題目要求,同時考慮是實際,程式應具備以下功能:

c.設計實現:

      考慮到小學生的知識水平,整數運算部分可以隨機產生來兩個0~100的數字來隨機進行四則運算。對於真分數,需要用一個createFraction方法來隨機產生兩整數當做分子分母,為保證分數為真,應判斷大為分子且排除分子為零且兩數相等導致值為1的情況。用GCD方法與CLM方法求兩數最大公約數與最小公倍數,GCD利用輾轉相除法求兩數最大公約數,LCM利用“最大公約數*最小公倍數=兩數乘積”的關係求得最小公倍數。分數的四則運算遵守分數運算規則利用最大公約數與最小公倍數進行轉換化簡。為檢驗各題答案,計算結果轉換為字串儲存,按習慣,整數除法依據四捨五入保留兩位小數。

      考慮到計算難度,每次整數運算與分數運算題比例為2:1,最終計分為一題一分,並對錯題進行標記顯示。

d.代碼說明:

 1.createFraction方法:

public static int[] createFraction(){                                       //產生兩數構造一個真分數,數組中第一個數為分子        int[] num=new int[2];        int num1 = (int)(Math.random()*100+1);        int num2 = (int)(Math.random()*100+1);                              //避免分母出現零(待改進)        if(num1!=num2){            if(num1<num2) {                                                 //避免出現構造住的分數值為1                 num[0]=num1; num[1]=num2;  return num;            }else{                num[0]=num2; num[1]=num1;  return num;            }        }else              createFraction();                                                //若不滿足條件遞迴調用方法        return num;            }

2.GCD與LCM方法:

public static int GCD(int m, int n) {     //輾轉相除法求最大公約數        while (true) {        if ((m = m % n) == 0)        return n;        if ((n = n % m) == 0)        return m;        }        }        public static int LCM(int m, int n){        return m*n/GCD(m,n);             //最大公約數*最小公倍數=兩數乘積 求最小公倍數       }

3.主函數:

    public static void main(String[] args){        ArrayList<String>List=new ArrayList<String>();//題目儲存        ArrayList<String>Answers=new ArrayList<String>();//參考答案儲存        System.out.println("請輸入想要的題目數量:");                         //提示需求數量        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int m = n/3;                                                        //分數題型題量佔三分之一        int num1;        int num2;        for(int i=0;i<(n-m);i++){                                           //開始隨機出整數題型                         num1 = (int)(Math.random()*100);             num2 = (int)(Math.random()*100);                              //隨機產生兩數            if(num2!=0){                                                   //排除0對除法造成影響(待改進)                int op = (int)(Math.random()*4+1);                       //隨機決定運算類型,1234對應加減乘除                if(op==1){                     List.add(num1+"+"+num2+"= ");                    Answers.add(num1+num2+"");                }                if(op==2){                     if(num1>num2){                                      //小學生知識有限,避免出現負數結果                    List.add(num1+"-"+num2+"= ");                    Answers.add(num1-num2+"");                    } else{                        List.add(num2+"-"+num1+"= ");                        Answers.add(num2-num1+"");                    }                }                if(op==3){                     List.add(num1+"×"+num2+"= ");                    Answers.add(num1*num2+"");                }                if(op==4){                     List.add(num1+"÷"+num2+"= ");                    BigDecimal  a = new BigDecimal((float)num1/num2);                        float ans = a.setScale(2,BigDecimal.ROUND_HALF_UP).floatValue();  //保留兩位,四捨五入                    Answers.add(ans+"");                }            }else{                                                                      //出現0不做除法(待改進)                int op = (int)(Math.random()*3+1);                if(op==1){                     List.add(num1+"+"+num2+"= ");                    Answers.add(num1+num2+"");                }                if(op==2){                     if(num1>num2){                        //避免出現負數結果                    List.add(num1+"-"+num2+"= ");                    Answers.add(num1-num2+"");                    } else{                        List.add(num2+"-"+num1+"= ");                        Answers.add(num2-num1+"");                    }                }                if(op==3){                     List.add(num1+"×"+num2+"= ");                    Answers.add(num1*num2+"");                }            }            }                for(int j=0;j<m;j++){            int[] fa1=createFraction();            int[] fa2=createFraction();            int gbs=LCM(fa1[1],fa2[1]);            if(fa2[0]!=0){                int op = (int)(Math.random()*4+1);                if(op==1){                     List.add("("+fa1[0]+"/"+fa1[1]+")+("+fa2[0]+"/"+fa2[1]+")= ");                                        int sum=gbs/fa1[1]*fa1[0] + (gbs/fa2[1]*fa2[0]);                    int gys1=GCD(sum,gbs);                    Answers.add(sum/gys1+"/"+gbs/gys1+"");//化簡結果並儲存                }                if(op==2){                     if( fa1[0]/fa1[1] > fa2[0]/fa2[1] ){                        //避免出現負數結果                    List.add("("+fa1[0]+"/"+fa1[1]+")-("+fa2[0]+"/"+fa2[1]+")= ");                                        int cha=gbs/fa1[1]*fa1[0] - (gbs/fa2[1]*fa2[0]);                    int gys2=GCD(cha,gbs);                    Answers.add(cha/gys2+"/"+gbs/gys2+"");                    } else{                        List.add("("+fa2[0]+"/"+fa2[1]+")+("+fa1[0]+"/"+fa1[1]+")= ");                        int cha=gbs/fa2[1]*fa2[0] - (gbs/fa1[1]*fa1[0]);                        int gys2=GCD(cha,gbs);                        Answers.add(cha/gys2+"/"+gbs/gys2+"");                    }                }                if(op==3){                     List.add("("+fa1[0]+"/"+fa1[1]+")×("+fa2[0]+"/"+fa2[1]+")= ");                    int a =fa1[0]*fa2[0]; int b = fa1[1]*fa2[1];                    int gys3 = GCD(a,b);                    Answers.add(a/gys3+"/"+b/gys3+"");                }                if(op==4){                     List.add("("+fa1[0]+"/"+fa1[1]+")÷("+fa2[0]+"/"+fa2[1]+")= ");                    int c =fa1[0]*fa2[1]; int d = fa2[0]*fa1[1];    //轉化為乘法                    int gys4 = GCD(c,d);                    Answers.add(c/gys4+"/"+d/gys4+"");                }            }else{                    int op = (int)(Math.random()*3+1);                    if(op==1){                         List.add("("+fa1[0]+"/"+fa1[1]+")+("+fa2[0]+"/"+fa2[1]+")= ");                                                int sum=gbs/fa1[1]*fa1[0] + (gbs/fa2[1]*fa2[0]);                        int gys1=GCD(sum,gbs);                        Answers.add(sum/gys1+"/"+gbs/gys1+"");                    }                    if(op==2){                         if( fa1[0]/fa1[1] > fa2[0]/fa2[1] ){                        //避免出現負數結果                        List.add("("+fa1[0]+"/"+fa1[1]+")-("+fa2[0]+"/"+fa2[1]+")= ");                                                int cha=gbs/fa1[1]*fa1[0] - (gbs/fa2[1]*fa2[0]);                        int gys2=GCD(cha,gbs);                        Answers.add(cha/gys2+"/"+gbs/gys2+"");                        } else{                            List.add("("+fa2[0]+"/"+fa2[1]+")+("+fa1[0]+"/"+fa1[1]+")= ");                            int cha=gbs/fa2[1]*fa2[0] - (gbs/fa1[1]*fa1[0]);                            int gys2=GCD(cha,gbs);                            Answers.add(cha/gys2+"/"+gbs/gys2+"");                        }                    }                    if(op==3){                         List.add("("+fa1[0]+"/"+fa1[1]+")×("+fa2[0]+"/"+fa2[1]+")= ");                        int a =fa1[0]*fa2[0]; int b = fa1[1]*fa2[1];                        int gys3 = GCD(a,b);                        Answers.add(a/gys3+"/"+b/gys3+"");                    }                                        }                }        int qnum=0;        int count=0;        for (String string : List) {                   //列印題目            qnum++; count++;            if(count>3) {                System.out.println();                count=1;            }             System.out.print("["+qnum+"] "+string+"\t\t");        }        System.out.println();        Scanner ans = new Scanner(System.in);        ArrayList<String>anslist=new ArrayList<>();        String str="";        System.out.println("請輸入答案,除法結果請保留兩位小數,輸入“ok”結束:");        while(!str.equals("ok")){            str=ans.nextLine();            anslist.add(str);        }        int correct=0;        int t=0;        System.out.println("[題號] 參考答案 \t 提交結果");        System.out.println();        for (int x=0;x<Answers.size();x++) {                    //檢驗答案並統計            if(Answers.get(x).equals(anslist.get(x))){                correct++;                t=x+1;                System.out.println("["+t+"] "+" \t "+Answers.get(x)+" \t "+" \t "+anslist.get(x));            }else            {                t=x+1;                System.err.println("["+t+"]"+" \t "+Answers.get(x)+" \t "+" \t "+anslist.get(x)+"    !!!!");            }    }        System.out.println("本次練習統計:");        System.out.println("得分:"+correct+"    共"+n+"分,正確率: "+(float)correct/n*100+"%, 帶!!!!為答錯的題目。");}
main

e.測試回合:

f.PSP

PSP2.1 Personal Software Process Stages Time  Senior Student Time 
Planning 計劃 30min 20min
· Estimate 估計這個任務需要多少時間 5h 7h
Development 開發 --- ---
· Analysis 需求分析 (包括學習新技術) 5min 8min
· Design Spec 產生設計文檔 6min 6min
· Design Review 設計複審 8min 8min
· Coding Standard 代碼規範 --- ---
· Design 具體設計 40min 30min
· Coding 具體編碼 3h 3.5h
· Code Review 代碼複審 15min 15min
· Test 測試(自我測試,修改代碼,提交修改) 30min 30min
Reporting 報告 2h 1.5h
· 測試報告 30min 30min
· 計算工作量 5min 8min
· 並提出流程改善計劃 8min 12min

h.小結:

       對於編程缺少練習導致花費了很多的時間在重新瞭解代碼上,這是很不應該的。程式中的有些地方處理的不是太合理,還有好多改進的空間。程式雖小,但結構還是不夠明晰,邏輯不是太清楚,這可能會造成閱讀困難,在以後開發中要注意在設計階段中就理清條理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.