20175126Apollo 20175126《Java程序設計》結隊編程項目——四則運算 第一周階段總結
結隊編程項目——四則運算
一、項目需求
- 自動生成小學四則運算題目(加、減、乘、除)統計正確率
- 支持整數
- 支持多運算符(比如生成包含100個運算符的題目)
- 支持真分數
需求分析:
生成四則運算:需要使用隨機數生成,需要創造一個能實現計算功能的類。
支持多運算符:運算符也需要利用隨機生成,並且不限個數。
支持真分數:需要用到生成分子、分母的函數,將分數化簡等。
統計正確率:需要設置一個計算變量,並需要用一個判斷正確的函數。
二、設計思路
首先根據需求分析,進行大體的設計:
生成題目→輸入答案→判斷正誤→下一道題→生成題目→ ......→顯示正確率
我和搭檔決定一共用四個類,來完成本次項目:1.Main.java 2.棧.java 3.計算.java 4.後綴.java
UML類圖:
三、關鍵代碼
壓棧\出棧:
第一周我們打算先完成棧和計算的部分,根據老師發的參考網站,我們又自行百度了很多關於棧的學習資料...但由於我們的水平有限,經過一下午的時間,還是未能完全搞懂如何利用棧來進行後綴計算,所以我們向學長請教,在學長的指導下,完成了部分代碼。我們的棧主要分為兩個部分,一是DataStack,專門用來存儲數字,二是CharStack用來存儲運算符。以此來完成老師參考資料裏的後綴表達式算法。
public class CharStack { int n; char [] a; int top = -1; public CharStack(int m) { //定義棧的大小 this.n=m; } void getStack() { // 定義棧的大小 a = new char[n]; } void push(char data) { //壓棧 a[++top]=data; } char pop() {//出棧 return a[top--]; } }
public class DataStack { //代碼原理同上一個CharStack int n; Rational [] a; int top = -1; public DataStack(int m) { this.n=m; } void getStack() { a = new Rational[n]; for(int i=0;i<n;i++) { a[i] = new Rational(); } } void push(Rational data) { top++; a[top].numerator=data.numerator; a[top].denominator=data.denominator; } Rational pop() { return a[top--]; } }
題目運算:
而計算部分我們則采取了全分數計算的方式,整數也作為分母為1的分數。並且還能做到對分數進行約分,我們想的是利用找分子分母最大公約數,然後同除以其約數,完成約分。在將運算共分為四種情況:加減乘除。先利用分子分母有理化,將分母化為一樣的,然後再進行基本運算,得到新的分數,再進行約分,得到答案。
public class Rational {
double numerator = 1 ; //分子
double denominator = 1; //分母
void setNumerator(double a) { //設置分子
double c=f(Math.abs(a),denominator); //計算最大公約數
numerator = a/c;//約分
denominator = denominator/c;
if(numerator<0&&denominator<0) { //分子分母負數情況
numerator = -numerator;
denominator = -denominator;
}
}
void setDenominator(double b) { //設置分母
double c=f(numerator,Math.abs(b)); //計算最大公約數
numerator = numerator/c;
denominator = b/c;
if(numerator<0&&denominator<0) {
numerator = -numerator;
denominator = -denominator;
}
}
double getNumerator() {//返回分子
return numerator;
}
double getDenominator() {
return denominator;
}
double f(double a,double b) { //求a和b的最大公約數
if(a==0) return 1;
if(a<b) {
double c=a;
a=b;
b=c;
}
double r=a%b;
while(r!=0) { //輾轉相除
a=b;
b=r;
r=a%b;
}
return b;
}
Rational add(Rational r) { //加法運算
double a=r.getNumerator();
double b=r.getDenominator();
double newNumerator=numerator*b+denominator*a; //計算出新分子
double newDenominator=denominator*b; //計算出新分母
Rational result=new Rational();
result.setNumerator(newNumerator);
result.setDenominator(newDenominator);
return result;
}
Rational sub(Rational r) { //減法運算
double a=r.getNumerator();
double b=r.getDenominator();
double newNumerator=numerator*b-denominator*a;
double newDenominator=denominator*b;
Rational result=new Rational();
result.setNumerator(newNumerator);
result.setDenominator(newDenominator);
return result;
}
Rational muti(Rational r) { //乘法運算
double a=r.getNumerator();
double b=r.getDenominator();
double newNumerator=numerator*a;
double newDenominator=denominator*b;
Rational result=new Rational();
result.setNumerator(newNumerator);
result.setDenominator(newDenominator);
return result;
}
Rational div(Rational r) { //除法運算
double a=r.getNumerator();
double b=r.getDenominator();
double newNumerator=numerator*b;
double newDenominator=denominator*a;
Rational result=new Rational();
result.setNumerator(newNumerator);
result.setDenominator(newDenominator);
return result;
}
static boolean judge(Rational a,Rational b) {//判斷是否正確
if(a.numerator==b.numerator && a.denominator==b.denominator)
return true;
else
return false;
}
}
四、遇到的困難及解決辦法
問題1:不會棧的使用
問題1解決辦法:參考網上的博客:《棧詳解及Java實現》 https://www.cnblogs.com/fzz9/p/8167546.html,然後對於一些細節不懂的地方再請教學長
問題2:沒有分數運算的思路,無從下手
問題2解決辦法:參考網上的博客:《Java-分數運算》https://blog.csdn.net/slyslyme/article/details/80032526。
五、對小夥伴鑫浩的評價:
搭檔是一個非常有責任心的夥伴,也是一個很熱情的人,在我們開發項目之前,他就已經進行了一些關於項目所需函數的了解,並且在設計時他也非常積極,在共同工作時總能給與我很大的幫助。
六、P2P圖
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 20 | 20 |
· Estimate | · 估計這個任務需要多少時間 | 30 | 30 |
Development | 開發 | 900 | |
· Analysis | · 需求分析 (包括學習新技術) | 300 | 350 |
· Design Spec | · 生成設計文檔 | 30 | 30 |
· Design Review | · 設計復審 (和同事審核設計文檔) | 30 | 30 |
· Coding Standard | · 代碼規範 (為目前的開發制定合適的規範) | 30 | 30 |
· Design | · 具體設計 | 180 | |
· Coding | · 具體編碼 | 900 | |
· Code Review | · 代碼復審 | 180 | |
· Test | · 測試(自我測試,修改代碼,提交修改) | 30 | |
Reporting | 報告 | 90 | |
· Test Report | · 測試報告 | 90 | |
· Size Measurement | · 計算工作量 | 90 | |
· Postmortem & Process Improvement Plan | · 事後總結, 並提出過程改進計劃 | 90 | |
合計 | 2990 |
20175126Apollo 20175126《Java程序設計》結隊編程項目——四則運算 第一周階段總結