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