作业四 | 个人项目-小学四则运算 “软件”之初版
作業要求來自于https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186
GitHub遠程倉庫的地址https://github.com/kunnkkk/16rg
?
一、題目要求:
像《構建之法》的人物阿超那樣,寫一個能自動生成小學四則運算題目的命令行 “軟件”。
具體要求:任何編程語言都可以,命令行程序接受一個數字輸入,然后輸出相應數目的四則運算題目和答案。例如輸入數字是 30, 那就輸出 30 道題目和答案。 運算式子必須至少有兩個運算符,運算數字是在 100 之內的正整數,答案不能是負數。 如:
23 - 3 * 4 = 11
擴展要求:
1) 要求能出和真分數 (二分之一, 十二分之五,等)相關的練習題。
2) 并且要求能處理用戶的輸入,并判斷對錯,打分統計。 要求能處理用戶輸入的真分數, 如 1/2, 5/12 等。
初步擬定要實現的功能后,估計一下自己需要花多長時間。編程過程中記錄自己實際用了多長時間。
然后和同學們比較一下各自程序的功能、實現方法的異同等等。
寫博客紀錄自己實現的過程和思路。
?
二、個人軟件過程耗時估計與統計表
?
| PSP2.1 | Personal Software Process Stages | Time Senior Student | Time |
| Planning | 計劃 | 30min | 45min |
| · Estimate | 估計這個任務需要多少時間 | 3h | 5h |
| Development | 開發 | 1h | 1h |
| · Analysis | 需求分析 (包括學習新技術) | 10min | 10min |
| · Design Spec | 生成設計文檔 | 0min | 0min |
| · Design Review | 設計復審 | 5min | 3min |
| · Coding Standard | 代碼規范 | 3min | 3min |
| · Design | 具體設計 | 20min | 30min |
| · Coding | 具體編碼 | 1h | 2h |
| · Code Review | 代碼復審 | 5min | 5min |
| · Test | 測試(自我測試,修改代碼,提交修改) | 30min | 50min |
| Reporting | 報告 | 10min | 15min |
| · | 測試報告 | 0min | 0min |
| · | 計算工作量 | 2min | 2min |
| · | 并提出過程改進計劃 | 2min | 2min |
?
三、代碼提交
提交源代碼和可執行程序至github上,博客開頭已給出github地址。
需要提交的應該有
- 項目的工程文件(可執行的應用程序)
- 項目的源代碼(c文件)
- 一些必要的配置(無)
- 單獨創建一個public子目錄,存放編譯后的可執行程序。(已創建子目錄存放可執行的應用程序)
?
四、設計與結果
根據作業要求,分為了具體要求和擴展要求,所以在設計是,把這兩個功能分開,令用戶可以有針對性的練習。
?
而這兩個功能都能實現詢問測試題目數量、檢測答案是否正確和計算答題準確率。
?
?
?
?
?
?
?
?
?
在設計這兩個功能的時候也遇到比較困難的地方。
功能1:100以內四則運算 (四舍五入精確到小數點后兩位)
- 對輸入結果和正確答案進行四舍五入精確到小數點后兩位的操作(已解決)
- 考慮兩個運算符如何比較優先級(已解決)
功能2:20以內真分數的四則運算
- 設計分數加減乘除運算的邏輯關系(已解決)
- 如何讓用戶輸入的字符與正確答案相比較(已解決,但方法一般還能優化)
- 如何約分(已解決)
- 如果得出的結果為整數,用戶該如何輸入(未解決,目前只能輸入1/1代表整數)
?
?五、部分詳細代碼
(1)功能1 | 獲取隨機運算符
//隨機產生運算符 char createnumberop(){int op;op=rand() % 4+1;switch(op){case 1:return'+';case 2:return'-';case 3:return'*';case 4:return'/';}return 0; }
?
(2)功能1 | 四則運算功能
if(result1 < 0 || result2 <0)//如果結果為非正數,則重新獲取題目 {i--;continue; } else{printf("%.f %c %.f %c %.f = ",a,op,b,op2,c);scanf("%f",&answer);if((op=='+' || op=='-') && (op2=='*' || op2=='/'))//若第二個運算符優先級更大 {if((int)(100.0*answer+0.5)/100.0==(int)(100.0*result2+0.5)/100.0 && result2 >=0)//四舍五入精確到小數點后兩位 {printf("【回答正確!】\n\n");rightnumber++;}else{printf("【回答錯誤!答案是:%.2f】\n\n",(int)(100.0*result2+0.5)/100.0);wrongnumber++;}} }?
(3)功能2 | 獲取公倍數與公約數
//獲取公倍數 double gongbeishu(double b,double d) {double i,max;max=b>d?b:d;//比較分母大小for(i=max;;i++)if((int)(i)%(int)(b)==0 && (int)(i)%(int)(d)==0)//計算最小公倍數break;return i; } //獲取公約數 double gongyueshu(double a,double c) {double i,min;min=a<c?a:c;//比較分子大小for(i=2;i<=min;i++)if((int)(a)%(int)(i)==0 && (int)(c)%(int)(i)==0)//計算最小公約數break;if(i>min)i=1;return i; }?
(4)功能2 | 真分數邏輯運算
if(op=='+') {fenzihe0=beishu1*a + beishu2*c;fenmu=gongbeishu(b,d); fenzihe1=fenzihe0/gongyueshu(fenzihe0,fenmu);fenmu=fenmu/gongyueshu(fenzihe0,fenmu);if(fenzihe1<0 || fenmu<=0){i--;continue;}else{printf("(%.f/%.f) %c (%.f/%.f) = ",a,b,op,c,d);scanf("%d%c%d",&answer[0],&op2,&answer[1]);if(answer[0]/answer[1]==(int)fenzihe1/(int)fenmu && op2=='/'){printf("【回答正確!】\n\n");rightnumber++;}else{printf("【回答錯誤!答案是:%.f/%.f】\n\n",fenzihe1,fenmu);wrongnumber++;}} }?
?
轉載于:https://www.cnblogs.com/kunnkkk/p/9789028.html
總結
以上是生活随笔為你收集整理的作业四 | 个人项目-小学四则运算 “软件”之初版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS检查是否支持Storage
- 下一篇: IOS指纹识别调用