天天看點

個人作業1——四則運算題目生成程式(基于控制台)

碼市位址:https://coding.net/u/xmwj/p/rg/git/commit/b4ac9aeead9ba9c66a936667b348ea931fe7c62e

a.需求分析:

 自動生成國小四則運算題目的指令行 “軟體”,滿足以下需求:   

  1. 除了整數以外,還要支援真分數的四則運算,真分數的運算,例如:1/6 + 1/8 = 7/24
  2. 運算符為 +, −, ×, ÷
  3. 并且要求能處理使用者的輸入,并判斷對錯,打分統計正确率。
  4. 要求能處理使用者輸入的真分數, 如 1/2, 5/12 等
  5. 使用 -n 參數控制生成題目的個數,例如執行下面指令将生成10個題目

    Myapp.exe -n 10

b.功能設計:

  基本滿足上述的功能

c.設計實作:

  本程式是通過c++來實作的,一共有三個函數和一個主函數。function(int n)函數用于生成1到n的随機數,fraction(int temp1,int temp2)生成真分數,float sum(int ch1,float a,float b)四則運算 ,主函數中三種類型的随機算式。

d.代碼說明:

 function(int n)函數用于生成1到n的随機數,fraction(int temp1,int temp2)生成真分數,float sum(int ch1,float a,float b)四則運算 ,主函數中題目數的輸入,三種類型的随機算式(整數與整數,整數與真分數,真分數與真分數),随機四種運算符(加減乘除),使用者輸入計算準确答案比對計算正确率。

具體代碼:

function(int n)函數用于生成1到n的随機數

```

int flag = 1;//全局變量,通過此來解決因為循環運作時間非常短,time(NULL)每次都傳回相同的值

int function(int n)//随機生成1至n的整數

{

int random;

int low = 1, high = n;

if (flag)

{

flag = 0;

srand((unsigned)time(NULL));

}

random = rand()% (high - low+1) + low;//生成随機數

return random;

}

fraction(int temp1,int temp2)生成真分數表達式

string fraction(int temp1,int temp2)//生成真分數

string fra;

string str1,str2;

stringstream ss1,ss2;

ss1<<temp1;

ss1>>str1;

ss2<<temp2;

ss2>>str2;

temp1 !=temp2 ? fra=str1+"/"+str2 : fra=1;

return fra;

float sum(int ch1,float a,float b)四則運算

float sum(int ch1,float a,float b){

float sum;

switch (ch1)

{

case 1:sum=(a)+(b);break;

case 2:sum=(a)-(b);break;

case 3:sum=(a)*(b);break;

case 4:sum=(a)/(b);break;

default:cout << "有錯誤!" << endl;break;

}

return sum;

main函數主要部分

```int main()

int integer1, integer2;

float a[10],b[10],yes=0;

float first1,second1;

stringstream ss1,ss2;

string first, second;//四則運算的第一個運算數和第二個運算數

int ch1, ch2, ch3;//switch語句的選項

string sign;//運算符号

int times ;//題目數

cout<<"【四則運算練習題】"<<endl;

cout<<"請輸入練習題數量:"<<endl;

cin>>times;

for (int i = 0;i < times;i++)

int temp1 = function(10);//調用function函數随機生成兩個随機整數

int temp2 = function(10);

if(temp1>temp2)swap(temp1,temp2);

int temp3 = function(10);

int temp4 = function(10);

if(temp3>temp4)swap(temp3,temp4);

ch1 = function(4);//随機生成運算符号

switch (ch1)

case 1:sign = "+";break;

case 2:sign = "-";break;

case 3:sign = "×";break;

case 4:sign = "÷";break;

ch2 = function(3);//四則運算題目的三種情況

switch (ch2)

case 1://整數和整數

strstream ss, cc;

integer1 = function(10);

ss << integer1;

ss >> first;

integer2 = function(10);

cc << integer2;

cc >> second;

a[i]=sum(ch1,(float)integer1,(float)integer2);

}break;

case 2://整數和真分數

strstream kk;

kk << integer1;

kk >> first;

second = fraction(temp1,temp2);

a[i]=sum(ch1,(float)integer1,temp1/(float)temp2);

case 3://真分數和真分數

first = fraction(temp1,temp2);

second = fraction(temp3,temp4);

a[i]=sum(ch1,temp1/(float)temp2,temp3/(float)temp4);

cout <<"("<< first <<")"<< sign << "("<<second<<")" << "=" << endl;

}

float ch;

for(int j=0;j<times;j++)

do{

cin>>ch;

}while(cin.get()!='\n');

b[j]=ch;

if(fabs(b[j]-a[j])<=1e-6)

{

cout<<"√"<<" 正确答案為:"<<a[j]<<endl;

yes++;

}

else cout<<"×"<<" 正确答案為:"<<a[j]<<endl;

cout<<"正确率為"<<yes/times*100<<"%"<<endl;

system("pause");

return 0;

}```

e.測試運作:

個人作業1——四則運算題目生成程式(基于控制台)

PSP表:

PSP2.1 Personal Software Process Stages Time (%) Senior Student Time (%)
Planning 計劃 8 10
· Estimate 估計這個任務需要多少時間 2 4
Development 開發 3
· Analysis 需求分析 (包括學習新技術)
· Design Spec 生成設計文檔 5
· Design Review 設計複審 15
· Coding Standard 代碼規範 1
· Design 具體設計 20
· Coding 具體編碼 30
· Code Review 代碼複審
· Test 測試(自我測試,修改代碼,送出修改) 13 21
Reporting 報告 6
· 測試報告
計算工作量
并提出過程改進計劃

小結:

1.事先沒有一個流程規劃。初略的看了一下需求分析,覺得這個小程式應該可以寫完,但是在寫的過程中卻發現了很多的問題,因為沒有先做了一個大概的規劃,導緻邊寫邊想,寫一段又覺得之前用的結構不大友善之後的使用,又往回改了,這樣反反複複浪費的許多時間。比如在寫輸入資料類型的時候,在考慮用string還是float型的,這将導緻之前寫的存放數組與比較方法的改變。在處理真分數時對代碼的修改導緻了計算錯誤,之後發現是一個表示函數,一個計算函數沒有同步。。。

2.發現随機數盡量不要用在循環裡,因為電腦運作速度快,将導緻出現的随機數一樣這樣的問題。time(NULL)每次都傳回相同的值,可以使用全局變量來解決。

3.代碼過于長,其實可以用指針函數等來簡化,不過這次的編寫思路還是清晰的,這也源于c++比較簡單易懂,不過指令行界面确實是不美觀,打算下次編寫使用java。

4.不知道那個格式發生的什麼,```不起作用,老師求指導。是因為C++ 的問題嗎?

5.還有很多不足,希望老師多多指點迷津,希望在今後的學習實踐中可以逐漸的提高編寫的效率與成果。謝謝o(∩_∩)o