天天看點

2017《面向對象程式設計》課程作業一

2017《面向對象程式設計》課程作業一

林燊 031602325 https://www.cnblogs.com/linshen/

github連結:https://github.com/Travaill/arithmetic.git

1.設計思路

2017《面向對象程式設計》課程作業一

2.程式功能

  • 能對0--10之間的整數進行四則運算(加減乘除)
  • 能實作選擇中文,英文,德文法語,日語五種語言
  • 程式能接收使用者輸入的整數答案,并判斷對錯
  • 程式結束時,統計出答對、答錯的題目數量

3.算法分析

  • 類generate 實作随機算式的生成
  • 類calculate 計算算式的結果
  • 類control 控制題目生成的數量 控制生成符合要求的算式 控制程式的退出 控制程式的語言
  • 類printf 輸出算式、判斷結果、統計答題情況

4.代碼規範

  • 函數的命名必須使用英文單詞,不使用拼音縮寫
  • 函數的命名如果一個單詞的必須首字母大寫,如果多個單詞的用下劃線隔開
  • 程式結構清析,簡單易懂,單個函數的程式行數不得超過100行。
  • 要随意定義全局變量,盡量使用局部變量。
  • 函數的旁邊必須注釋上本函數的功能
  • 禁止GOTO語句。

5.代碼展示

類"generate"

int Generate::randomNumber(int low,int high)  //生成[low,high]随機數 
{
	return (rand()% (high - low+1) + low);
}  

string Generate::randomOperation(int rand)     //生成四則運算符 
{
	string ope;
    switch(rand) 
    {
    	case 1:ope='+'; break;
    	case 2:ope='-'; break;
    	case 3:ope='*'; break;
    	case 4:ope='/'; break;
	}
	return ope;
}

string Generate::generatePolynomial(int rand1,int rand2,string ope,int mode)  //生成多項式 
{
   stringstream ss;
   if(mode==1) 
  {
  	ss << '(' << rand1<<ope<<rand2<<')';
  } 
    if(mode==2)
  {
    ss<<rand1<<ope<<rand2;
  }
    if(mode==3)	
  {
  	if(rand1!=0)
  	{
  	  ss<<rand1;
	}
  }
  	string str = ss.str();  
  	ss.str("");
    return str;
}

string Generate::generateExpression()     //生成算式 
{
	stringstream ss;
	int rand1=randomNumber(1,10);
	int rand2=randomNumber(1,10);
	int mode =randomNumber(1,3);
	string ope=randomOperation(randomNumber(1,4));
	ss<<generatePolynomial(rand1,rand2,ope,mode);
	for(int i=1;i<randomNumber(2,4);i++)
	{
		int rand1=randomNumber(1,10);
	    int rand2=randomNumber(1,10);
 	    int mode =randomNumber(1,3);
	    string ope=randomOperation(randomNumber(1,4));
	    ss<<generatePolynomial(rand1,rand2,ope,mode);
		ss<<randomOperation(randomNumber(1,4)<<generatePolynomial(rand1,rand2,ope,mode);
	}
	string str = ss.str();  
	ss.str("");
    return str;
    return str;
}
           

main

int main(void)
{
	srand((unsigned)time(NULL));             //重置種子 
	Printf().ShowLanguageList();             //展示可選擇語言清單 
	cout<<endl<<endl;
	Printf().printfNeedWhat();
	char language[20];           
	gets(language);                         //擷取使用者所選擇的語言 
	while(!Control().JudgeIfGet(language)){  //判斷語言資源檔案是否載入成功 
	Printf().printfNeedWhat();
	gets(language);
	}
    string Resource[30];       
	Control().GetResource(Resource,language);  //将語言資源導入resouce數組 
	
	int wrong=0;
	int right=0;
   	cout<<Resource[0];
   	int counts;
   	cin>>counts;
	for (int i=0;i<counts;i++){
	string exp = Generate().generateExpression();   //生成表達式 
	cout << exp << "="<<endl;
    double res=Calculate().calculateResult(exp);     //計算表達式結果 
	cout << Resource[1]<<i+1<<Resource[2];
	double number;
	cin >> number;
	if((Control()).getKeyAndExit()) {              //輸出e退出循環并統計答題情況 
	 if(number==res) {
	    cout <<Resource[3]<<endl;
	    right++;
	 }
	 else {
	    cout << Resource[4]<<res<<endl;
        wrong++;
	 }
	}
	else break;	
	}
	cout <<Resource[5]<< right << Resource[6] << wrong <<Resource[7]<<endl;
	system("pause");
	return 0;
}
           

6.送出日志證明

2017《面向對象程式設計》課程作業一

7.程式測試

2017《面向對象程式設計》課程作業一
2017《面向對象程式設計》課程作業一

9.個人感受

本次的代碼版本更疊,我主要把目标放在打造高内聚低耦合上面,減弱每個子產品内部在這裡我們可以看做每個類之間的聯系,加強子產品與子產品間的聯系。

以上述的generate類作為例子,之前下一個函數都會調用前一個函數,這樣很不利于程式的維護,是以,對于這些功能比較單一,較為底層的函數,我運用參數的方法,減少其與其他函數的聯系。同時,在最後一個函數中引用前面所有的函數,加強了子產品的内部的聯系。

同時,在其他類中,我基本做到了,不引用另外類中的函數,可見,類與類的聯系是很低的,這就是所謂的低耦合。

上一篇: 課程作業一
下一篇: 課程作業一