四则运算 3
Posted 四季信风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四则运算 3相关的知识,希望对你有一定的参考价值。
老师提出了新的要求
1.学生写的程序必须能判定用户的输入答案是否正确
2.程序必须能处理四种运算的混合算式
要求两人合作分析,单独编程,单独撰写博客
团队成员:苗堃、罗毅(http://www.cnblogs.com/ly199553/)
设计思路:
查阅了相关资料,发现小学四则运算含有括号数量不多,于是结组讨论时选取了较为简单的我的程序,将数组全部转化为字符串形式,
利用栈实现中缀表达式转换为后缀表达式,转换原则为
1.当读到一个操作数时,立即将它放到输出中。操作符则不立即输出,放入栈中。遇到左圆括号也推入栈中。
2.如果遇到一个右括号,那么就将栈元素弹出,将符号写出直到遇到一个对应的左括号。但是这个左括号只被弹出,并不输出。
3.在读到操作符时,如果此时栈顶操作符优先性大于或等于此操作符,弹出栈顶操作符直到发现优先级更低的元素位置。除了处理\')\'
的时候,否则决不从栈中移走\'(\'。操作符中,\'+\' \'-\'优先级最低,\'(\' \')\'优先级最高。
4.如果读到输入的末尾,将栈元素弹出直到该栈变成空栈,将符号写到输出中。
两位数的字符串传递时加入字符@来区分(http://www.cnblogs.com/ly199553/p/5292391.html)
输入答案后与正确答案进行比较判断对错
1 #include<stack> 2 #include<iostream> 3 #include<deque> 4 #include<string> 5 #include<sstream> 6 #include<time.h> 7 using namespace std; 8 9 int Num[100]; //将数字存入数组a 10 string op_arrays[100]; //将运算符存入数组b 11 string All[100]; //合成总数组e 12 string fu[100]; //辅助数组 13 int true_num = 0; //统计做对的题目数 14 int false_num = 0; //统计做错的题目数 15 16 bool isPra(char); //判断是否为括号 17 int getPri(char); //获得符号优先性 18 void check(char c, stack<char>& coll2, deque<char>& coll3);//判断符号优先性 19 void allocate(deque<char>& coll1, stack<char>& coll2, deque<char>& coll3); //将中缀表达式分解为符号和运算数 20 void calculate(deque<char>& coll3, stack<double>& coll4); //计算后缀表达式 21 22 int main() 23 { 24 srand((int)time(NULL));//设置随机种子,使得程序每次运行的结果都不同 25 int subject_number; //出题数量 26 int random_number = 0; //运算数字字数 27 int operation_character = 0; 28 int fuhao = 0; //判定运算符 29 30 int Jude_has_brackets; //定义左、右括号的是否存在的随机变量 31 string left; //左括号变量 32 string right; //左括号变量 33 string sign = "a"; //定义符号变量 34 char Jude_has_mul_dev; //定义是否需要乘除法的变量 35 36 deque<char> coll0; //消除中缀表达式的空格 37 deque<char> coll1; //盛放中缀表达式 38 stack<char> coll2; //盛放操作符 39 deque<char> coll3; //盛放后缀表达式 40 stack<double>coll4; //计算后缀表达式的辅助容器 41 42 int min, Max; //定义输入的值得范围的最值(仅能输入整数<=30) 43 string w = " "; 44 45 //写一个简易菜单 46 cout << "欢 / ̄\_/ ̄\ "<<endl; 47 cout << "迎 ▏ ▔▔▔▔\ " << endl; 48 cout << "使 /\ / ﹨" << endl; 49 cout << "用 ∕ / )" << endl; 50 cout << "小 ▏ ● ▏"<<endl; 51 cout << "天 ▏ ▔█ " << endl; 52 cout << "才 ◢██◣ /\__/" << endl; 53 cout << "四 █████◣ /" << endl; 54 cout << "则 █████████████◣ " << endl; 55 cout << "运 ◢██████████████▆▄" << endl; 56 cout << "算 █◤◢██◣◥█████████◤\" << endl; 57 cout << "自 ◥◢████ ████████◤ \" << endl; 58 cout << "助 █████ ██████◤ ﹨" << endl; 59 cout << "系 │ │█████◤ ▏" << endl; 60 cout << "统 │ │ ▏" << endl; 61 cout << " ∕ ∕ /▔▔▔\ ∕" << endl; 62 cout << " ∕___/﹨ ∕ \ /\" << endl; 63 cout << " \ \_ ﹨/ ﹨" << endl; 64 cout << " \___\ ﹨/▔\﹨/▔\" << endl; 65 cout << " \ ∕" << endl; 66 cout << "1.请输入产生数字的范围(最小和最大):"; 67 cin >> min >> Max; 68 cout << "提示:若您需要做乘除法 请不要做超过30以外的乘除法" << endl; 69 cout << endl; 70 cout << "2.是否需要乘除法[y为需要乘除法 n为不需要乘除法] "; 71 cin >> Jude_has_mul_dev; 72 while (min<0) 73 { 74 cout << "请做正数运算:" << endl; 75 cout << "输入最小值" << endl; 76 cin >> min; 77 } 78 while (Max>30 && Jude_has_mul_dev == \'y\') 79 { 80 cout << "请重新输入最大值:" << endl; 81 cin >> Max; 82 } 83 cout << "请输入出题数量:"; 84 cin >> subject_number; 85 86 int i = 0, j, k; 87 if (\'y\' == Jude_has_mul_dev) 88 { 89 random_number = rand() % 9 + 2; //随机生成2~10个数 90 for (j = 0; j < subject_number; j++) //设置题目数量 91 { 92 //清除数组元素 93 memset(Num, 0, sizeof(Num)); 94 memset(op_arrays, 0, sizeof(op_arrays)); 95 memset(fu, 0, sizeof(fu)); 96 97 random_number = rand() % 9 + 2; //随机生成2~10个数 98 for (i = 0; i < random_number; i++) 99 { 100 stringstream ss; 101 operation_character = rand() % (Max - min + 1) + min; 102 Num[i] = operation_character; 103 fuhao = rand() % 4 + 1; 104 switch (fuhao) 105 { 106 case 1:sign = "+"; break; 107 case 2:sign = "-"; break; 108 case 3:sign = "*"; break; 109 case 4:sign = "/"; break; 110 } 111 //若为除法则除数不为零 112 while (Num[i] == 0 && i >= 1) 113 { 114 if (op_arrays[i - 1] == "/") 115 { 116 operation_character = rand() % (Max - min + 1) + min; 117 Num[i] = operation_character; 118 } 119 } 120 op_arrays[i] = sign; 121 122 fu[4 * i] = w; 123 ss << Num[i]; 124 ss >> fu[4 * i + 1]; 125 fu[4 * i + 2] = w; 126 if (i != (random_number - 1)) //最后一次不产生符号 127 fu[4 * i + 3] = op_arrays[i]; 128 else fu[4 * i + 3] = w; 129 } 130 Jude_has_brackets = rand() % 2 + 1; //随机确定有无括号 131 switch (Jude_has_brackets) 132 { 133 case 1: 134 left = "("; 135 right = ")"; 136 break; 137 case 2: 138 left = w; 139 right = w; 140 break; 141 } 142 143 for (i = 0; i < random_number; i++) 144 { 145 for (k = 0; k < (random_number - 1) / 2; k++) 146 { 147 fu[4 * k] = left; 148 if (left == "(") 149 { 150 fu[4 * k + 10] = right; 151 } 152 } 153 if ((fu[4 * i] == left) && (fu[4 * i + 2] == right)) 154 { 155 fu[4 * i] = w; 156 fu[4 * i + 2] = w; 157 } 158 159 All[j] += fu[4 * i] + fu[4 * i + 1] + fu[4 * i + 2] + fu[4 * i + 3]; 160 } 161 cout << j + 1 << "题. " << All[j] << "= " ; 162 for (int i = 0; i != All[j].size(); ++i) 163 { 164 //逐一加入每个字符,这里使用deque因为deque在两端删除添加的速度最快 165 coll0.push_back(All[j][i]); //在尾部加入一个元素 166 } 167 168 //将coll0转换为后缀表达式coll1 169 for (int i = 0; i != All[j].size(); ++i) 170 { 171 char k = coll0.front(); 172 coll0.pop_front(); 173 if (k != \' \') //消除空格 174 coll1.push_back(k); 175 } 176 //从coll中取出元素,分配元素到coll2和coll3中 177 allocate(coll1, coll2, coll3); 178 179 //计算后缀表达式 180 calculate(coll3, coll4); 181 182 double result = 0; 183 cin >> result; 184 if (result == coll4.top()) 185 { 186 cout << "正确!" << endl; 187 true_num++; 188 cout << "计算结果为:" << coll4.top() << endl; 189 } 190 else 191 { 192 cout << "错误!" << endl; 193 false_num++; 194 cout << "计算结果为:" << coll4.top() << endl; 195 } 196 //将栈清空 197 coll4.pop(); 198 } 199 if (true_num >= false_num) 200 cout << "恭喜你!您共做对" << true_num << "道题!" << "做错" << false_num << "道题!" << endl; 201 else 202 cout << "还需加油!您共做对" << true_num << "道题!" << "做错" << false_num << "道题!" << endl; 203 } 204 else 205 { 206 random_number = rand() % 9 + 2; //随机生成2~10个数 207 for (j = 0; j < subject_number; j++) //设置题目数量 208 { 209 //清除数组元素 210 memset(Num, 0, sizeof(Num)); 211 memset(op_arrays, 0, sizeof(op_arrays)); 212 memset(fu, 0, sizeof(fu)); 213 214 random_number = rand() % 9 + 2; //随机生成2~10个数 215 for (i = 0; i < random_number; i++) 216 { 217 stringstream ss; 218 operation_character = rand() % (Max - min + 1) + min; 219 Num[i] = operation_character; 220 fuhao = rand() % 2 + 1; 221 switch (fuhao) 222 { 223 case 1:sign = "+"; break; 224 case 2:sign = "-"; break; 225 } 226 op_arrays[i] = sign; 227 228 fu[4 * i] = w; 229 ss << Num[i]; 230 ss >> fu[4 * i + 1]; 231 fu[4 * i + 2] = w; 232 if (i != (random_number - 1)) //最后一次不产生符号 233 fu[4 * i + 3] = op_arrays[i]; 234 else fu[4 * i + 3] = w; 235 } 236 Jude_has_brackets = rand() % 2 + 1; //随机确定有无括号 237 switch (Jude_has_brackets) 238 { 239 case 1: 240 left = "("; 241 right = ")"; 242 break; 243 case 2: 244 left = w; 245 right = w; 246 break; 247 } 248 249 for (i = 0; i < random_number; i++) 250 { 251 for (k = 0; k < (random_number - 1) / 2; k++) 252 { 253 fu[4 * k] = left; 254 if (left == "(") 255 { 256 fu[4 * k + 10] = right; 257 } 258 } 259 if ((fu[4 * i] == left) && (fu[4 * i + 2] == right)) 260 { 261 fu[4 * i] = w; 262 fu[4 * i + 2] = w; 263 } 264 265 All[j] += fu[4 * i] + fu[4 * i + 1] + fu[4 * i + 2] + fu[4 * i + 3]; 266 } 267 cout << j + 1 << "题. " << All[j] << "= " << endl; 268 for (int i = 0; i != All[j].size(); ++i) 269 { 270 //逐一加入每个字符,这里使用deque因为deque在两端删除添加的速度最快 271 coll0.push_back(All[j][i]); //在尾部加入一个元素 272 } 273 274 //将coll0转换为后缀表达式coll1 275 for (int i = 0; i != All[j].size(); ++i) 276 { 277 char k = coll0.front(); 278 coll0.pop_front(); 279 if (k != \' \') //消除空格 280 coll1.push_back(k); 281 } 282 //从coll中取出元素,分配元素到coll2和coll3中 283 allocate(coll1, coll2, coll3); 284 285 //计算后缀表达式 286 calculate(coll3, coll4); 287 288 double result = 0; 289 cin >> result; 290 if (result == coll4.top()) 291 { 292 cout << "正确!" << endl; 293 true_num++; 294 cout << "计算结果为:" << coll4.top() << endl; 295 } 296 else 297 { 298 cout << "错误!" << endl; 299 false_num++; 300 cout << "计算结果为:" << coll4.top() << endl; 301 } 302 //将栈清空 Python 3学习笔记获取 badarith,[erlang,'+',[error,0],[],同时使用 Erlang 片段在 TSUNG 中执行算术运算