碼市位址:https://coding.net/u/xmwj/p/rg/git/commit/b4ac9aeead9ba9c66a936667b348ea931fe7c62e
a.需求分析:
自動生成國小四則運算題目的指令行 “軟體”,滿足以下需求:
- 除了整數以外,還要支援真分數的四則運算,真分數的運算,例如:1/6 + 1/8 = 7/24
- 運算符為 +, −, ×, ÷
- 并且要求能處理使用者的輸入,并判斷對錯,打分統計正确率。
- 要求能處理使用者輸入的真分數, 如 1/2, 5/12 等
-
使用 -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.測試運作:

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