四则运算2+psp0
程序要求:
1.題目避免重復
2.可定制(數量\打印方式)
3.可以一下控制參數 ??
? ① 是否有乘除法
??② 是否有括號(最多支持十個數參與運算)
??③ 數值范圍
??④加減有無負數 ??
? ⑤除法有無余數
分析:① 如果是兩個數的算式很容易就可以輸出,但是多個數就有點兒難住我了,仔細想想可以將一個算式看作為一個數再加上一個符號和一個數就可以輸出,但int型和char型無法一起輸出,于是我就去網上尋找解決辦法,找到了itoa()函數,這個函數可以將int型轉為字符型,這樣就可以將一個算式作為一個string字符串輸出,具體的用法我是在? http://www.cnblogs.com/lidabo/archive/2012/07/10/2584706.html??和http://blog.csdn.net/lwj103862095/article/details/12005105?? 這個博客上學習的。將整數型轉為字符型后加入括號也就容易了許多,我是用這樣一個語句加入的:str_num1 = '(' + str_num1 + ')',在字符串str_num的左右添加括號。
????? ? ② 選擇是否添加乘除法,首先建立一個存儲符號的數組,如果不添加乘除就隨機生成1或2兩個數,1代表“+”,2代表“-”,如果添加乘除就隨機生成1-4四個數,1代表“+”,2代表“-”,3代表“*”,4代表“÷”
??????? ③數值范圍的控制:num1 = rand() % (max - min + 1) + min;// 隨機生成min-max的整數
??????? ④加減有無負數和除法有無余數這兩個功能目前還沒有實現,我感覺這兩個功能的實現如果我一開始用二維數組寫這個程序會容易很多,現在我用itoa()函數沒有寫出來,不過我會繼續改進一下,不然我就用二維數組嘗試重新寫一個。
?
1 #include <iostream> 2 #include <time.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <math.h> 6 #include <fstream> 7 #include <string> 8 using namespace std; 9 10 11 //數字轉換為字符串 12 string int_string(int number) 13 { 14 int temp = abs(number);//取絕對值 15 char str[100]; 16 _itoa_s(temp, str, 10); //運用itoa()函數將int型整數轉換為字符串 17 string str_= str; 18 return str_; 19 } 20 //算式轉換為字符串 21 string group(string str1, string str2, char m) // group:算式組合 22 { 23 string Equation; // equation:算式 24 Equation = str1 + m + str2; 25 return Equation; 26 } 27 //生成運算符 28 char mark(int opt) 29 { 30 int opt1, a; 31 char symbol[1]; // 符號數組 32 if (opt == 0) 33 { 34 opt1 = 2; 35 } 36 if (opt == 1) 37 { 38 opt1 = 4; 39 } 40 a = rand() % opt1+1; //隨機生成1-2或1-4的數,隨opt的值而定,opt意為是否含有乘除法 41 if (a == 1) symbol[0] = '+'; 42 if (a == 2) symbol[0] = '-'; 43 if (a == 3) symbol[0] = '*'; 44 if (a == 4) symbol[0] = '÷'; 45 return symbol[0]; 46 } 47 //主函數 48 void main() 49 { 50 int num1, num2, minus, remainder; 51 int opt, bracket, output, max, min, amount, control, b, c; 52 string str_num1, str_num2, value; //數字-字符串 53 cout << "是否需要包含乘除法?1(有),0(沒有):" << endl; 54 cin >> opt; //opt:選擇是否含有乘除法 55 cout << "是否含有括號?1(有),0(沒有):" << endl; 56 cin >> bracket; 57 cout << "是否需要包含負數1(有),0(沒有):" << endl; 58 cin >> minus; 59 cout << "題目是否要在文件中輸出?1(是),0(不是):" << endl; 60 cin >> output; 61 cout << "請輸入數字范圍:(格式為:最小數 空格 最大數)" << endl; 62 cin >> max>>min; 63 cout << "請輸入出題數量:" << endl; 64 cin >> amount; 65 string equation[100]; //定義數組 66 char symbol; 67 ofstream fout; 68 if (opt == 1) 69 { 70 cout << "除法有無余數,1(有),0(無)" << endl; 71 cin >> remainder; 72 } 73 if ( output == 1 ) 74 { 75 fout.open("output.txt"); 76 fout << amount << "道四則運算題如下:" << endl; 77 } 78 else 79 { 80 cout << amount << "道四則運算題如下:" << endl; 81 } 82 for (int i = 0; i<amount; i++) //為輸出規定題數 83 { 84 srand((int)time(NULL)); //設置時間種子,每次執行種子不同,生成不同的隨機數 85 num1 = rand() % (max - min + 1) + min;// 隨機生成min-max的整數 86 num2 = rand() % (max - min + 1) + min;// 隨機生成min-max的整數 87 control = rand() % 9 + 2; //控制是幾個數的運算式,最多支持10個數的運算式 88 symbol = mark(opt); 89 if (minus == 0) 90 { 91 if (remainder == 0) 92 { 93 str_num1 = int_string(num1); 94 str_num2 = int_string(num2); 95 } 96 if (remainder == 1)//?????????? 97 { 98 str_num1 = int_string(num1); 99 str_num2 = int_string(num2); 100 } 101 } 102 if (minus == 1)//??????????????錯誤! 103 { 104 if (remainder == 0) 105 { 106 str_num1 = int_string(num1); 107 str_num2 = int_string(num2); 108 } 109 if (remainder == 1)//?????????? 110 { 111 str_num1 = int_string(num1); 112 str_num2 = int_string(num2); 113 } 114 } 115 if (remainder == 0) 116 { 117 str_num1 = int_string(num1); 118 str_num2 = int_string(num2); 119 } 120 equation[i] = group(str_num1, str_num2, symbol); 121 if (control >= 2) 122 { 123 for (; control >= 2; control--) 124 { 125 symbol = mark(opt); 126 str_num1 = equation[i]; 127 if (bracket == 1) 128 { 129 b = rand() % 2; //隨機生成0-2的數 130 if (b == 0) //如果b=2,就在字符串str_num1的左右加上括號 131 { 132 str_num1 = '(' + str_num1 + ')'; 133 } 134 } 135 symbol = mark(opt); 136 str_num2 = int_string(num2); 137 b = rand() % 2; 138 if (b == 0) 139 { 140 value = str_num1; 141 str_num1 = str_num2; 142 str_num2 = value; 143 } 144 equation[i] = group(str_num1, str_num2, symbol); 145 } 146 } 147 //判斷是否重復 148 int repeat = 0; //repeat:重復 149 for (c = 0; c<i; c++) 150 { 151 if (equation[c] == equation[i]) 152 { 153 i = i - 1; 154 repeat = 1; 155 break; 156 } 157 } 158 if (repeat != 1)//若不重復,則輸出 159 { 160 if (output == 1) 161 { 162 fout << equation[i] << "=" << endl; 163 } 164 else 165 { 166 cout << equation[i] << "=" << endl; 167 } 168 } 169 170 } 171 if (output == 1) //輸出到文件 172 { 173 fout.close(); 174 } 175 }?程序運行截圖:
問題(錯誤)1:num2每次生成的數都一樣
?
錯誤2:無法生成含乘除法的算式
?
總結:通過本次編程我發現我還有太多的不足,對于很多編程的基本知識還沒有掌握,現在想想以前總是對編程不上心,得過且過,真的很后悔,現在大三我一定積極努力,努力把編程水平提升上去。
項目計劃總結:
| 日期\任務 | 聽課/時 | 編寫程序/時 | 查閱資料/時 | 日總計/時 |
| 星期一 | 2 | 1 | 0.5 | 3.5 |
| 星期二 | ? | 2 | ? | 2 |
| 星期三 | ? | 3 | 1 | 4 |
| 星期四 | 2 | 2 | ? | 4 |
| 星期五 | ? | 2.5 | 1 | 3.5 |
| 星期六 | ? | 5 | ?2 | 7 |
| 星期日 | ? | ? | ? | ? |
| 周總計 | 4 | 15.5 | 4.5 | 24 |
?時間記錄日志:
| 日期 | 開始時間 | 結束時間 | 中斷時間 | 凈時間 | 活動 | 備注 |
| 3/7 | 14:00 | 15:50 | 10 | 100 | 聽課 | 軟件工程上課 |
| ? | 16:30 | 17:30 | ? | 60 | 編寫程序 | 作業 |
| ? | 21:00 | 21:30 | ? | 30 | 閱讀書籍 | 《構建之法》 |
| 3/8 | 19:00 | 21:00 | ?20 | 90 | 查資料,編寫程序 | 作業 |
| 3/9 | ?14:25 | ?16:30 | ?15 | ?110 | 編寫程序 | ?作業 |
| ? | ?17:00 | ?18:00 | ? | ?60 | ?查閱資料和閱讀構建之法 | ? |
| ? | ?21:00 | ?22::00 | ? | 60? | ?編寫程序 | ?作業 |
| 3/10 | 14:00 | 15:50 | ?10 | 100 | 聽課 | 軟件工程上課 |
| ? | 21:20 | 22:10 | ? | 50 | 查資料,編寫程序 | 聊天+作業 |
| 3/11 | 16:20 | 18:30 | ?10 | 120 | 繼續編程... | ? |
| ? | 19:40 | 20:30 | ? | 50 | 閱讀《構建之法》 | ? |
| ? | 21:00 | 21:45 | ? | 45 | 查閱資料 | 聊天+上網查閱資料 |
| 3/12 | 9:00 | 11:40 | ? | 160 | 編程 | 作業 |
| ? | ?12:20 | ?15:00 | ? | ?160 | ?調試程序 | ? |
| ? | ?15:00 | ? | ? | ? | ?寫博客 | ? |
?缺陷記錄日志:(錯誤很多,沒有專門去記錄,以后會注意養成這個習慣的)
| 日期 | 編號 | 引入階段 | 排除階段 | 修復時間&問題描述 |
| 3/7 | 1 | 編碼 | 編譯 | ? |
| 3/8 | ? | ? | ? | ? |
| 3/9 | ? | ? | ? | ? |
| 3/10-3/11 | 2 | 編碼 | 編譯 | ? |
| 3/11-3/12 | 3 | 編碼 | 編譯 | ? |
| ? | ? | ? | ? | ? |
轉載于:https://www.cnblogs.com/me-tts/p/5268771.html
總結
以上是生活随笔為你收集整理的四则运算2+psp0的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux内核的启动过程分析
- 下一篇: 浅析Kerberos原理,及其应用和管理