作業四:四則運算
阿新 • • 發佈:2018-11-12
一、需求分析
任何程式語言都可以,命令列程式接受一個數字輸入,然後輸出相應數目的四則運算題目和答案。例如輸入數字是 30, 那就輸出 30 道題目和答案。 運算式子必須至少有兩個運算子,運算數字是在 100 之內的正整數,答案不能是負數。 如:23 - 3 * 4 = 11。
統計使用者共答對多少道題。
二、功能設計
三、詳細設計
隨機產生三個100以內的正整數和四個分別用“1”-“4”代表+,-,*,/運算子號,通過對四則運算中乘除和加減的優先級別判斷:先乘除後加減,在計算函式中遍歷運算子陣列中乘除符號後進行優先計算,之後再對乘除計算之後的運算數進行相加減運算。
遇到當隨機產生的正整數運算題計算結果為負數時,遞迴重新生成運算題,直至結果是大於零時所產生的題目列印在控制檯上,使用者輸入答案,答案與結果匹配正確即累加正確題數,錯誤的輸出列印正確結果,當全部運算題做完後輸出統計結果。
程式碼實現:
int random(double start, double end)//獲取隨機數函式 {return (int)(start+(end-start)*rand()/(RAND_MAX+1.0)); } char getSignala()//獲取隨機運算子函式 { int a; char signal1[4]={'+','-','*','/'}; srand((unsigned)time(NULL)); a = rand()%4; return signal1[a]; } char getSignalb()//獲取隨機運算子函式 { int b; char signal2[4]={'+','-','*','/'}; srand((unsigned)time(NULL)); b= rand()%4; return signal2[b]; } int getResult(int num1,int num2,int num3,char signal1,char signal2)//結果計算函式 { int i=0,res; if(signal1=='+') { if(signal2=='+') { res=num1+num2+num3; } if(signal2=='-') { res=num1+num2-num3; } if(signal2=='*') { res=num2*num3+num1; } if(signal2=='/') { res=num2/num3+num1; } } if(signal1=='-') { if(signal2=='+') { res=num1-num2+num3; } if(signal2=='-') { res=num1-num2-num3; } if(signal2=='*') { res=num2*num3-num1; } if(signal2=='/') { res=num2/num3-num1; } } if(signal1=='*') { if(signal2=='+') { res=num1*num2+num3; } if(signal2=='-') { res=num1*num2-num3; } if(signal2=='*') { res=num2*num3*num1; } if(signal2=='/') { res=num2/num3*num1; } } if(signal1=='/') { if(signal2=='+') { res=num1/num2+num3; } if(signal2=='-') { res=num1/num2-num3; } if(signal2=='*') { res=num2*num3/num1; } if(signal2=='/') { res=num2/num3/num1; } } return res; } int takeTest()//題目生成函式 { int get; int num1,num2,num3,a; char signal1,signal2; srand((unsigned)time(NULL)); signal1=getSignala(); srand((unsigned)time(NULL)); signal2=getSignalb(); num1=random(1,100); num2=random(0,100); num3=random(1,100); if(signal1=='-') { if(num1<num2) { int temp; temp=num1; num1=num2; num2=temp; } } if(signal1=='/') { if(num2==0) { int temp; temp=num1; num1=num2; num2=temp; } } printf("%d%c%d%c%d=",num1,signal1,num2,signal2,num3); scanf("%d",&get); fflush(stdin); //清空輸入緩衝區 if(getResult(num1,num2,num3,signal1,signal2)==get) { printf("回答正確!\n"); a=1; } else { printf("I回答錯誤!\n"); printf("正確答案是: %d\n",getResult(num1,num2,num3,signal1,signal2)); a=0; } return a; } void main() { int n,a,right=0,i=0; double percent; printf("請選擇問題數目:"); scanf("%d",&n); for(i;i<n;i++) { a=takeTest(); right=right+a; } printf("回答完畢!\n"); printf("回答正確數量:%d\n",right); percent=((double)right*100.00)/(double)n; printf("正確率:%0.2f %%\n",percent); }
四、執行結果
五、問題及解決辦法
問題:不知道如何做到答案不為負數的問題。有時候會出現負數的情況,還有我的運算子也沒有做到不同。
六、過程耗時估計與統計表
PSP2.1 | Personal Software Process Stages | 預計時間(分鐘) | 實際時間(分鐘) |
Planning | 計劃 | 20 | 30 |
· Estimate | 估計這個任務需要多少時間 | 180 | 180 |
Development | 開發 | 120 | 2000 |
· Analysis | 需求分析 (包括學習新技術) | 20 | 20 |
· Design Spec | 生成設計文件 | 10 | 20 |
· Design Review | 設計複審 | 10 | 10 |
· Coding Standard | 程式碼規範 | 10 | 10 |
· Design | 具體設計 | 30 | 30 |
· Coding | 具體編碼 | 120 | 180 |
· Code Review | 程式碼複審 | 30 | 20 |
· Test | 測試(自我測試,修改程式碼,提交修改) | 60 | 120 |
Reporting | 報告 | 30 | 30 |
· | 測試報告 | 10 | 10 |
· | 計算工作量 | 10 | 10 |
· | 並提出過程改進計劃 | 10 | 10 |