20165230 結對程式設計項目-四則運算 整體總結
一、需求分析
- 随機生成題目
- 生成的題目個數從指令行輸入
- 使用者可選擇生成不同難度的題目,比如通過參數指定: (1) 運算符個數範圍 (2) 運算符限定(國小一年級題目隻生成 + - 題目)
- 能多次生成題目
- 題目運算(判題)
- 支援多運算符
- 支援整數
- 支援真分數
- 題目合法性判斷
- 可獨立使用
- 可用于測試生成題目的正确性
- 擴充需求
- 題目去重
- 支援多語言
- 處理生成題目并輸出到檔案
- 完成題目後從檔案讀入并判題
二、設計思路
- 設計一個
類,用來實作整數的四則運算IntNumber
-
類,用來實作真分數的四則運算Fraction
-
類,用來判斷使用者輸入與實際計算值是否相等,并統計正确的次數Judgement
- 設計主類,生成随機數,生成題目,并判斷正确率
- 設計測試類,測試整數類與分數類的四則運算
- 支援生成題目并輸出到檔案
20165230 結對程式設計項目-四則運算 整體總結
三、核心代碼及注釋
- 支援生成題目并寫入到檔案
import java.util.*;
public class Calculate {
public static void main(String[] args) {
NumberFormat nf = NumberFormat.getPercentInstance();
···
Random ran = new Random();
Scanner scan = new Scanner(System.in);
IOFile iof = new IOFile("Exercises.txt");//處理生成題目并輸出到檔案
while (true) {
System.out.print("請輸入您所需要的題目數量:");
int A = scan.nextInt();
for (int i = 0; i < A; i++) {
int B = ran.nextInt(2);
int C = ran.nextInt(4);
in1 = IntNumber.obj();
in2 = IntNumber.obj();
score1 = Score.obj();
score2 = Score.obj();
if (B == 0) {
switch (C) {
case 0:
num = in1.add(in2);
S1 =in1.toString()+ " + " + in2.toString() + "=";
num1 = "" + num;
iof.WriteQuestionsToFile(S1);//調用append方法,将題目寫入檔案
N = scan.nextInt();
CorrectJudgment.judgment(N == num, num1);
break;
case 1:
···
case 2:
···
case 3:
···
}
} else {
switch (C) {
case 0:
num2 = score1.add(score2);
num1 = num2.toString();
Q = scan.next();
S2 =score1.toString()+"+"+score2.toString()+"=";
iof.WriteQuestionsToFile(S2);//調用append方法,将題目寫入檔案
CorrectJudgment.judgment(Q.equals(num1), num1);
break;
case 1:
···
case 2:
···
case 3:
···
}
}
}
System.out.println("你答對的題目總數:" + CorrectJudgment.getTrues());
double T = (double) CorrectJudgment.getTrues() / A;
System.out.println("您的正确率為:" + nf.format(T));
System.out.println("是否繼續生成題目?(y/n):" );
String s1 = scan.next();
if (s1.equalsIgnoreCase("n")){
break;
}
}
}
}
import java.util.Random;
public class Fraction {
private int numerator, denominator;
···
public Fraction add(Fraction op2)//實作真分數加法
{
int commonDenominator = denominator * op2.getDenominator();
int numerator1 = numerator * op2.getDenominator();
int numerator2 = op2.getNumerator() * denominator;
int sum = numerator1 + numerator2;
System.out.print("("+this.toString()+")" + " + " + "("+op2.toString()+")" + "=");
return new Fraction (sum, commonDenominator);
}
public Fraction subtract(Fraction op2)//實作真分數減法
{
int commonDenominator = denominator * op2.getDenominator();
int numerator1 = numerator * op2.getDenominator();
int numerator2 = op2.getNumerator() * denominator;
int difference = numerator1 - numerator2;
System.out.print("("+this.toString()+")" + " - " + "("+op2.toString()+")" + "=");
return new Fraction(difference,commonDenominator);
}
public Fraction multiply (Fraction op2)//實作真分數乘法
{
int numer = numerator * op2.getNumerator();
int denom = denominator * op2.getDenominator();
System.out.print("("+this.toString()+")" + " * " + "("+op2.toString()+")" + "=");
return new Fraction (numer, denom);
}
public Fraction divide (Fraction op2)//實作真分數除法
{
int numer = numerator * op2.getDenominator();
int denom = denominator * op2.getNumerator();
System.out.print("("+this.toString()+")" + " / " + "("+op2.toString()+")" + "=");
return new Fraction (numer, denom);
}
···
private void reduce()//化簡
{
if (numerator != 0)
{
int common = gcd (Math.abs(numerator), denominator);
numerator = numerator / common;
denominator = denominator / common;
}
}
private int gcd (int num1, int num2)//求最大公因子
{
if(num2==0)
return num1;
else
return gcd(num2,num1%num2);
}
public static Fraction obj(){
Random ran = new Random();
return new Fraction(ran.nextInt(20),ran.nextInt(20));
}
}
四、測試方法
- IntNumber類的方法測試
20165230 結對程式設計項目-四則運算 整體總結 - Fraction類的方法測試
20165230 結對程式設計項目-四則運算 整體總結
五、運作過程截圖
六、代碼托管位址
https://gitee.com/BESTI-IS-JAVA-2018/20165230/commit/a8633b2aec49a9632cfea1e732035e8f86073b73
七、遇到的困難及解決方法
- 問題1:如何實作輸出到檔案?
- 問題1解決方案:用到了PrinterStream類的append方法。将表達式作為一個字元串傳入參數即可。
- 問題2:在實作支援輸出到檔案功能時,題目不能正常顯示數字,顯示的是其引用
- 問題2解決方案:發現定義字元串時,把int型資料直接添入,結果隻能顯示其引用,通過
方法即可顯示toString()
八、對結對的小夥伴的評價
- 結對搭檔:20165226劉香杉
- 本周主要是在上一周的基礎上進行需求擴充,我們分工獨立完成,最終進行彙總并總結。由我實作支援自動生成題目并寫入到檔案的功能。在擴充的過程中發現自己學過的許多知識不會運用于實際,通過不斷的查資料,查書,通過部落格進行再學習,才獨立完成了該功能的實作。在這個過程中将所學過的知識融會貫通,運用于實際,使我對知識點有了更深的了解與掌握。通過和杉杉交流總結,我們體會到了“紙上得來終覺淺,絕知此事要躬行”,不僅如此,還應多擴充知識的深度和廣度,等到需要用時,便不會像無頭蒼蠅一樣東拼西湊。
九、參考或引用的設計、實作
- 結對程式設計項目-四則運算
- 2017-2018-2 165X 『Java程式設計』課程 結對程式設計練習_四則運算
- 結對程式設計和兩人合作
- Intellj IDEA 簡易教程——單元測試
- 現代軟體工程講義 個人項目和結對項目練習 四則運算
十、PSP表格
| PSP | Personal Software Process Stages)| 預估耗時(分鐘)|實際耗時(分鐘)
| -------- | :----------------ð:----------------ð:---------------: |:-----ð
| Planning | 計劃 | | | |
| Estimate | 估計這個任務需要多少時間 | 360 | 500 | |
| Development | 開發 | | | |
| Analysis | 需求分析 (包括學習新技術) | 60 | 65 | |
| Design Spec | 生成設計文檔 | 30 |35 | |
Design Review | 設計複審 (和同僚稽核設計文檔) | 25 |20
| Coding Standard | 代碼規範 (為目前的開發制定合适的規範) | 15 | 30 | |
Design | 具體設計 |75 |95
| Coding | 具體編碼 | 230 | 300 | |
| Code Review | 代碼複審 | 30 | 25 | |
| Test | 測試(自我測試,修改代碼,送出修改) | 150 | 135 | |
| Reporting | 報告 | | | |
| Test Report | 測試報告 | 20 | 25 | |
| Size Measurement | 計算工作量 | 10 | 5 | |
| Postmortem & Process Improvement Plan | 事後總結, 并提出過程改進計劃 | 60 | 80 | |
| | 合計 | 730 |820 | |