1. 程式人生 > >20175126Apollo 20175126《Java程序設計》結隊編程項目——四則運算 第一周階段總結

20175126Apollo 20175126《Java程序設計》結隊編程項目——四則運算 第一周階段總結

階段 沒有 () cnblogs b+ odin pro tails 需要

結隊編程項目——四則運算

一、項目需求

  • 自動生成小學四則運算題目(加、減、乘、除)統計正確率
    • 支持整數
    • 支持多運算符(比如生成包含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.1Personal 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程序設計》結隊編程項目——四則運算 第一周階段總結