四则运算2—加强版

设计一个程序,实现出30道四则运算题,要支持真分数的运算
题目避免重复
可定制(数量/打印方式)
可以控制下列参数:

          是否有乘除法、
          是否有括号(最多可以支持10个数参与计算)、
          数值范围(正整数)、
          加减有无负数、
          除法有无余数

分析:

      1、使用随机数填充一个二维数组,每行数组为一个运算式中的所有用到的数字

      2、现在是整形二维数组,对每行的数值进行参数的设定(即用随机数设定),以及运算符的选择

      3、拿出第一行的数组来分析

           首先判断算式中是否应该有括号:1)没有括号     2)有括号

           分析 1)没有括号的情况

                      可以根据数组中数的数量来判断运算符的个数,再随机生成相应个数的运算符(是否有乘除法可在这一步进行设置)

                      对运算结果的限制可以分析如下:

                           首先是有无乘除法,这个比较好设置,上边以提及到。其次是分析运算过程中是否有负数出现,是否有余数出现。

                           若没有乘除法,则只需分析有无余数,若有乘除法则需根据运算规则首先分析是否有余数

                           若没有乘除法,只需分析有无负数出现即可,可顺序执行每次二元运算进行判断并处理

                           若有乘除法,则需判断参与乘除运算的数是否有余数,并进行处理。再次判断是否需要对是否有负数进行判断,若可以有负数,则直接输出即可,可不可以有负数,则对以上的结果数组再次进行分析。

                2)有括号的情况

                     存储运算数字信息的二维数组已经生成,再为每行数组生成相应的运算符数组。根据每行数组中数字的个数求得最多能够插入的括号的对数,然后据此随机生成几对括号,最后将括号的总数目加上运算符的总数目并根据一定的规则存入另外一个数组中,使得括号能够随机分配到运算式的不同位置,既可以为运算式加上括号。最后根据一定的输出方式和方法,将数字和括号,运算符以一定的顺序输出即可。

 
  1 //第三次实验
  2 #include<iostream>
  3 #include<string>
  4 #include<stdlib.h>
  5 #include<time.h>
  6 #include<math.h>
  7 #include<fstream>
  8 using namespace std;
  9 
 10 int main()
 11 {
 12     int expressie_canyu[1000][10];         //这是一个二维数组,每行记录的是每个运算式中参与的数字
 13     int expressieNum_Num[1000];            //此数组记录二维数组相应行中的列数,及记录每个运算式中参与运算的数字的个数                 
 14     int number;              //定义产生的运算式中数的数量(最大为10个数)
 15     int expressie_num;       //定义产生的运算式的数量
 16     int printStyle;          //定义打印方式(DOS界面打印、输出到文件)
 17     int multiply_divide;     //定义是否有乘除法,0代表没有,1代表有
 18     int max, min;            //定义四则运算中的数的取值范围
 19     int minus;               //定义是否有负数,0代表没有,1代表有
 20     int remainder;           //定义是否有余数,0代表没有,1代表有
 21     int bracket;             //定义是否有括号,0代表没有,1代表有
 22 
 23     int biaozhiwei[9];       //标志位,记录各个条件
 24 
 25     cout << "请输入要生成的运算式的数量:";
 26     cin >> expressie_num;
 27     cout << endl;
 28     cout << "请输入打印运算式的方式(0代表DOS界面,1代表输出到文件):";
 29     cin >> printStyle;
 30     cout << endl;
 31     cout << "运算式中是否含有乘除法(0代表没有,1代表有):";
 32     cin >> multiply_divide;
 33     cout << endl;
 34     cout << "请输入运算式中数的取值范围(输入方式为:最小值 空格 最大值):";
 35     cin >> min >> max;
 36     cout << endl;
 37     cout << "运算过程能否出现负数(0代表不能,1代表能)";
 38     cin >> minus;
 39     cout << endl;
 40     cout << "定义运算过程是否能够有余数出现(0代表不能出现余数,1代表能出现)";
 41     cin >> remainder;
 42     cout << endl;
 43     cout << "定义括号是否能够参与运算(0代表不能,1代表能)";
 44     cin >> bracket;
 45     cout << endl;
 46 
 47     biaozhiwei[0] = expressie_num;
 48     biaozhiwei[1] = printStyle;
 49     biaozhiwei[2] = multiply_divide;
 50     biaozhiwei[3] = min;
 51     biaozhiwei[4] = max;
 52     biaozhiwei[5] = minus;
 53     biaozhiwei[6] = remainder;
 54     biaozhiwei[7] = bracket;
 55 
 56 
 57     ofstream outfile;
 58     outfile.open("f1.dat", ios::out);
 59     //首先根据运算式的数量,生成每个运算式需要的数,并记录在expressie_canyu[1000][10]中
 60     srand((int)time(0));           //根据时间生成随机数种子
 61     int xun_huan_expressieNum;      //此变量代表循环时的记录,代表已经循环的次数
 62     for (xun_huan_expressieNum = 0; xun_huan_expressieNum < expressie_num; xun_huan_expressieNum++)
 63     {
 64         number = 2 + rand() % 9;            //随机生成参与每个式子进行运算的数的个数
 65         expressieNum_Num[xun_huan_expressieNum] = number;      //将每个式子中数字的个数存入数组expressieNum_Num[1000]中
 66 
 67         for (int i = 0; i < number; i++)       //根据number生成式子中的每个随机数
 68         {
 69             expressie_canyu[xun_huan_expressieNum][i] = min + rand() % (max - min);    //此处可能有错
 70         }
 71     }
 72 
 73     //以上完成了数组的初始化,下面要完成运算式的组装
 74 
 75     srand((int)time(NULL));
 76     for (int i = 0; i < expressie_num; i++)           //对N个运算式进行循环
 77     {
 78         
 79         if (0 == bracket)         //如果没有括号
 80         {
 81             int yunsuanfugeshu;      //变量运算符的个数
 82             yunsuanfugeshu = expressieNum_Num[i] - 1;
 83             char yunsuanfu[10];     //此数组存储运算符
 84             
 85             for (int j = 0; j < yunsuanfugeshu; j++)     //对运算符数组进行赋值
 86             {
 87                 if (0 == multiply_divide)  //如果没有乘除法
 88                 {
 89                     int sign_noMD;     //数字代表符号
 90                     sign_noMD = 1 + rand() % 2;
 91                     if (1 == sign_noMD)
 92                     {
 93                         yunsuanfu[j] = '+';
 94                     }
 95                     else
 96                     {
 97                         yunsuanfu[j] = '-';
 98                     }
 99                 }
100                 else
101                 {
102                     int sign_yesMD;     //数字代表运算符,且含有乘除法
103                     sign_yesMD = 1 + rand() % 4;
104                     if (1 == sign_yesMD)
105                     {
106                         yunsuanfu[j] = '+';
107                     }
108                     else if (2 == sign_yesMD)
109                     {
110                         yunsuanfu[j] = '-';
111                     }
112                     else if (3 == sign_yesMD)
113                     {
114                         yunsuanfu[j] = '*';
115                     }
116                     else if (4 == sign_yesMD)
117                     {
118                         yunsuanfu[j] = '/';
119                     }
120                 }
121             }
122 
123             //cout << "运算符的个数为:" << yunsuanfugeshu << endl;
124             //输出所有运算符号
125             /*cout << "所有运算符号为:";
126             for (int fuhaoshu1 = 0; fuhaoshu1 < yunsuanfugeshu; fuhaoshu1++)
127             {
128                 cout << yunsuanfu[fuhaoshu1] << " ";
129             }
130             */
131             //上面的循环是对运算符号的赋值。下面组合运算式
132             //此时已存在数组expressie_canyu[i][0-number](参与运算的数字的个数),yunsuanfu[10](存储运算符),yunsuanfugeshu(运算符个数)
133             if (0 == multiply_divide)  //如果没有乘除法
134             {
135                 if (0 == minus)   //如果不能有负数出现
136                 {
137                     int jieguo;
138                     jieguo = expressie_canyu[i][0];   //结果等于此行数组中的第一个数值
139 
140                     //下面的循环是对运算式预算过程有无负数的判断
141                     for (int noMinusNum = 0; noMinusNum < (expressieNum_Num[i]-1); noMinusNum++)
142                     {
143                         if (yunsuanfu[noMinusNum] == '+')
144                         {
145                             jieguo = jieguo + expressie_canyu[i][noMinusNum + 1];
146                             if (jieguo < 0)
147                             {
148                                 int a;
149                                 a = jieguo - expressie_canyu[i][noMinusNum + 1];
150                                 expressie_canyu[i][noMinusNum + 1] = 1 + rand() % a;
151                             }
152                         }
153                         else
154                         {
155                             jieguo = jieguo - expressie_canyu[i][noMinusNum + 1];
156                             if (jieguo <= 0)
157                             {
158                                 int a;
159                                 a = expressie_canyu[i][noMinusNum + 1] + jieguo;
160                                 expressie_canyu[i][noMinusNum + 1] = 1 + rand() % (a+1);
161                             }
162                         }
163                     }
164 
165                     //对运算式进行输出
166                     //cout << "运算式中数的个数为:" << expressieNum_Num[i] << endl;
167                     if (0 == printStyle)
168                     {
169                         int fuhao = 0;
170                         for (int shu = 0; shu < expressieNum_Num[i]; shu++)
171                         {
172                             cout << expressie_canyu[i][shu];
173 
174                             for (; fuhao < yunsuanfugeshu;)
175                             {
176                                 cout << yunsuanfu[fuhao];
177                                 fuhao++;
178                                 break;
179                             }
180                         }
181                     }
182                     else
183                     {
184                         
185                         int fuhao = 0;
186                         for (int shu = 0; shu < expressieNum_Num[i]; shu++)
187                         {
188                             outfile << expressie_canyu[i][shu];
189 
190                             for (; fuhao < yunsuanfugeshu;)
191                             {
192                                 outfile << yunsuanfu[fuhao];
193                                 fuhao++;
194                                 break;
195                             }
196                         }
197                         outfile << endl;
198                         //outfile.close();
199                     }
200                     
201                 }
202                 else    //如果能有负数出现
203                 {
204                     //对运算式进行输出
205                     //cout << "运算式中数的个数为:" << expressieNum_Num[i] << endl;
206                     if (0 == printStyle)
207                     {
208                         int fuhao = 0;
209                         for (int shu = 0; shu < expressieNum_Num[i]; shu++)
210                         {
211                             cout << expressie_canyu[i][shu];
212 
213                             for (; fuhao < yunsuanfugeshu;)
214                             {
215                                 cout << yunsuanfu[fuhao];
216                                 fuhao++;
217                                 break;
218                             }
219                         }
220                     }
221                     else
222                     {
223 
224                         int fuhao = 0;
225                         for (int shu = 0; shu < expressieNum_Num[i]; shu++)
226                         {
227                             outfile << expressie_canyu[i][shu];
228 
229                             for (; fuhao < yunsuanfugeshu;)
230                             {
231                                 outfile << yunsuanfu[fuhao];
232                                 fuhao++;
233                                 break;
234                             }
235                         }
236                         outfile << endl;
237                         //outfile.close();
238                     }
239                 }
240             }
241             else   //如果有乘除法
242             {
243                 if (0 == remainder)    //如果不能有余数
244                 {
245                     int expressie_canyu_linshi[10];    //建立临时数组,下面的循环为给临时数组赋值
246                     for (int linshi_chengchu = 0; linshi_chengchu < expressieNum_Num[i]; linshi_chengchu++)
247                     {
248                         expressie_canyu_linshi[linshi_chengchu] = expressie_canyu[i][linshi_chengchu];
249                     }
250                     for (int chengchui = 0; chengchui < yunsuanfugeshu; chengchui++)  //此循环对数组中的余数情况进行调整
251                     {
252                         if (yunsuanfu[chengchui] == '*')
253                         {
254                             int jieguo;
255                             jieguo = expressie_canyu_linshi[chengchui] * expressie_canyu_linshi[chengchui + 1];
256                             expressie_canyu_linshi[chengchui] = jieguo;
257                             expressie_canyu_linshi[chengchui + 1] = jieguo;
258                         }
259                         if (yunsuanfu[chengchui] == '/')
260                         {
261                             int jieguo;
262                             jieguo = expressie_canyu_linshi[chengchui] % expressie_canyu_linshi[chengchui + 1];
263                             if (jieguo != 0)   //如果有余数
264                             {
265                                 int yueshu = 1;//约数
266                                 int yushupan = 0;
267                                 while (yushupan < 2)
268                                 {
269                                     int jieguoyue;
270                                     jieguoyue = expressie_canyu_linshi[chengchui] % yueshu;
271                                     if (jieguoyue == 0)
272                                     {
273                                         yushupan += 1;
274                                         if (yushupan == 2)
275                                         {
276                                             expressie_canyu_linshi[chengchui + 1] = yueshu;  //修改临时数组
277                                             expressie_canyu[i][chengchui + 1] = yueshu;       //修改原数组
278                                             break;
279                                         }
280                                     }
281                                     yueshu += 1;
282                                 }
283                             }
284                         }
285                     }
286 
287                     if (0 == minus)  //如果不能有负数
288                     {
289                         //下面的大循环时修改乘法或除法前面的一个运算符号为加号
290                         for (int gaijiahao = 0; gaijiahao < yunsuanfugeshu; gaijiahao++)
291                         {
292                             if (yunsuanfu[gaijiahao] == '*')
293                             {
294                                 for (int gaijiahao1 = gaijiahao - 1; gaijiahao1 >= 0; gaijiahao1--)
295                                 {
296                                     if ((yunsuanfu[gaijiahao1] == '+') || (yunsuanfu[gaijiahao1] == '-'))
297                                     {
298                                         yunsuanfu[gaijiahao1] = '+';
299                                         break;
300                                     }
301                                 }
302                             }
303                             if (yunsuanfu[gaijiahao] == '/')
304                             {
305                                 for (int gaijiahao2 = gaijiahao - 1; gaijiahao2 >= 0; gaijiahao2--)
306                                 {
307                                     if ((yunsuanfu[gaijiahao2] == '+') || (yunsuanfu[gaijiahao2] == '-'))
308                                     {
309                                         yunsuanfu[gaijiahao2] = '+';
310                                         if (yunsuanfu[gaijiahao2 + 2] == '-')
311                                         {
312                                             yunsuanfu[gaijiahao2 + 2] = '+';
313                                         }
314                                         
315                                         break;
316                                     }
317                                 }
318                             }
319                         }
320                         //以上为修改乘法和除法符号前边的符号+
321                         //以下为判断正负
322                         for (int fuhaochuan = 0; fuhaochuan < yunsuanfugeshu; fuhaochuan++)
323                         {
324                             if (yunsuanfu[fuhaochuan] == '-')
325                             {
326                                 expressie_canyu[i][fuhaochuan + 1] = 1 + rand() % (expressie_canyu[i][fuhaochuan]);
327                             }
328                         }
329 
330                         //对运算式进行输出
331                         //cout << "运算式中数的个数为:" << expressieNum_Num[i] << endl;
332                         if (0 == printStyle)
333                         {
334                             int fuhao = 0;
335                             for (int shu = 0; shu < expressieNum_Num[i]; shu++)
336                             {
337                                 cout << expressie_canyu[i][shu];
338 
339                                 for (; fuhao < yunsuanfugeshu;)
340                                 {
341                                     cout << yunsuanfu[fuhao];
342                                     fuhao++;
343                                     break;
344                                 }
345                             }
346                         }
347                         else
348                         {
349 
350                             int fuhao = 0;
351                             for (int shu = 0; shu < expressieNum_Num[i]; shu++)
352                             {
353                                 outfile << expressie_canyu[i][shu];
354 
355                                 for (; fuhao < yunsuanfugeshu;)
356                                 {
357                                     outfile << yunsuanfu[fuhao];
358                                     fuhao++;
359                                     break;
360                                 }
361                             }
362                             outfile << endl;
363                             //outfile.close();
364                         }
365                     }
366                     else    //如果能有负数
367                     {
368                         //对运算式进行输出
369                         //cout << "运算式中数的个数为:" << expressieNum_Num[i] << endl;
370                         if (0 == printStyle)
371                         {
372                             int fuhao = 0;
373                             for (int shu = 0; shu < expressieNum_Num[i]; shu++)
374                             {
375                                 cout << expressie_canyu[i][shu];
376 
377                                 for (; fuhao < yunsuanfugeshu;)
378                                 {
379                                     cout << yunsuanfu[fuhao];
380                                     fuhao++;
381                                     break;
382                                 }
383                             }
384                         }
385                         else
386                         {
387 
388                             int fuhao = 0;
389                             for (int shu = 0; shu < expressieNum_Num[i]; shu++)
390                             {
391                                 outfile << expressie_canyu[i][shu];
392 
393                                 for (; fuhao < yunsuanfugeshu;)
394                                 {
395                                     outfile << yunsuanfu[fuhao];
396                                     fuhao++;
397                                     break;
398                                 }
399                             }
400                             outfile << endl;
401                             //outfile.close();
402                         }
403                     }
404                 }
405                 else   //如果可以有余数
406                 {
407                     if (0 == minus)  //如果不能有负数
408                     {
409                         //下面的大循环时修改乘法或除法前面的一个运算符号为加号
410                         for (int gaijiahao = 0; gaijiahao < yunsuanfugeshu; gaijiahao++)
411                         {
412                             if (yunsuanfu[gaijiahao] == '*')
413                             {
414                                 for (int gaijiahao1 = gaijiahao - 1; gaijiahao1 >= 0; gaijiahao1--)
415                                 {
416                                     if ((yunsuanfu[gaijiahao1] == '+') || (yunsuanfu[gaijiahao1] == '-'))
417                                     {
418                                         yunsuanfu[gaijiahao1] = '+';
419                                     }
420                                 }
421                             }
422                             if (yunsuanfu[gaijiahao] == '/')
423                             {
424                                 for (int gaijiahao2 = gaijiahao - 1; gaijiahao2 >= 0; gaijiahao2--)
425                                 {
426                                     if ((yunsuanfu[gaijiahao2] == '+') || (yunsuanfu[gaijiahao2] == '-'))
427                                     {
428                                         yunsuanfu[gaijiahao2] = '+';
429                                     }
430                                 }
431                             }
432                         }
433                         //以上为修改乘法和除法符号前边的符号+
434                         //以下为判断正负
435                         for (int fuhaochuan = 0; fuhaochuan < yunsuanfugeshu; fuhaochuan++)
436                         {
437                             if (yunsuanfu[fuhaochuan] == '-')
438                             {
439                                 expressie_canyu[i][fuhaochuan + 1] = 1 + rand() % (expressie_canyu[i][fuhaochuan + 1]);
440                             }
441                         }
442 
443                         //对运算式进行输出
444                         //cout << "运算式中数的个数为:" << expressieNum_Num[i] << endl;
445                         if (0 == printStyle)
446                         {
447                             int fuhao = 0;
448                             for (int shu = 0; shu < expressieNum_Num[i]; shu++)
449                             {
450                                 cout << expressie_canyu[i][shu];
451 
452                                 for (; fuhao < yunsuanfugeshu;)
453                                 {
454                                     cout << yunsuanfu[fuhao];
455                                     fuhao++;
456                                     break;
457                                 }
458                             }
459                         }
460                         else
461                         {
462 
463                             int fuhao = 0;
464                             for (int shu = 0; shu < expressieNum_Num[i]; shu++)
465                             {
466                                 outfile << expressie_canyu[i][shu];
467 
468                                 for (; fuhao < yunsuanfugeshu;)
469                                 {
470                                     outfile << yunsuanfu[fuhao];
471                                     fuhao++;
472                                     break;
473                                 }
474                             }
475                             outfile << endl;
476                             //outfile.close();
477                         }
478                     }
479                     else    //如果能有负数
480                     {
481                         //对运算式进行输出
482                         //cout << "运算式中数的个数为:" << expressieNum_Num[i] << endl;
483                         if (0 == printStyle)
484                         {
485                             int fuhao = 0;
486                             for (int shu = 0; shu < expressieNum_Num[i]; shu++)
487                             {
488                                 cout << expressie_canyu[i][shu];
489 
490                                 for (; fuhao < yunsuanfugeshu;)
491                                 {
492                                     cout << yunsuanfu[fuhao];
493                                     fuhao++;
494                                     break;
495                                 }
496                             }
497                         }
498                         else
499                         {
500 
501                             int fuhao = 0;
502                             for (int shu = 0; shu < expressieNum_Num[i]; shu++)
503                             {
504                                 outfile << expressie_canyu[i][shu];
505 
506                                 for (; fuhao < yunsuanfugeshu;)
507                                 {
508                                     outfile << yunsuanfu[fuhao];
509                                     fuhao++;
510                                     break;
511                                 }
512                             }
513                             outfile << endl;
514                             //outfile.close();
515                         }
516                     }
517                 }
518                 
519             }
520         }
521         else   //如果有括号
522         {
523             //以下各个变量为个数的定义
524             int yunsuanfugeshu;      //变量运算符的个数
525             yunsuanfugeshu = expressieNum_Num[i] - 1;
526             char yunsuanfu[10];     //此数组存储运算符
527 
528             int zuidakuohaoshu;          //最大括号对数
529             if (expressieNum_Num[i] > 2)
530             {
531                 zuidakuohaoshu = expressieNum_Num[i] - 2;
532             }
533             else
534             {
535                 zuidakuohaoshu = expressieNum_Num[i] - 1;
536             }
537             
538             int suijidekuohaoduishu;      //随机的括号的对数
539             if (zuidakuohaoshu > 4)
540             {
541                 suijidekuohaoduishu = 1 + rand() % 4;
542             }
543             else
544             {
545                 suijidekuohaoduishu = 1 + rand() % zuidakuohaoshu;
546             }
547             int kuohaogeshu = 2 * suijidekuohaoduishu;    //总的括号数,不是对数
548             char zifushuzu[30];          //定义字符数组,存储括号和运算符
549             int zifushuzulength = kuohaogeshu + yunsuanfugeshu;     //括号和运算符的总长度
550 
551             //对字符数组进行初始化
552             for (int chushihua = 0; chushihua < 30; chushihua++)
553             {
554                 zifushuzu[chushihua] = 'n';
555             }
556 
557             //以下循环为运算符数组赋值
558             for (int j = 0; j < yunsuanfugeshu; j++)     //对运算符数组进行赋值
559             {
560                 if (0 == multiply_divide)  //如果没有乘除法
561                 {
562                     int sign_noMD;     //数字代表符号
563                     sign_noMD = 1 + rand() % 2;
564                     if (1 == sign_noMD)
565                     {
566                         yunsuanfu[j] = '+';
567                     }
568                     else
569                     {
570                         yunsuanfu[j] = '-';
571                     }
572                 }
573                 else
574                 {
575                     int sign_yesMD;     //数字代表运算符,且含有乘除法
576                     sign_yesMD = 1 + rand() % 4;
577                     if (1 == sign_yesMD)
578                     {
579                         yunsuanfu[j] = '+';
580                     }
581                     else if (2 == sign_yesMD)
582                     {
583                         yunsuanfu[j] = '-';
584                     }
585                     else if (3 == sign_yesMD)
586                     {
587                         yunsuanfu[j] = '*';
588                     }
589                     else if (4 == sign_yesMD)
590                     {
591                         yunsuanfu[j] = '/';
592                     }
593                 }
594             }
595 
596             //以下将几对括号存入二维数组中
597             char kuohaoshuzu[20][2];
598             for (int kuohaojishu = 0; kuohaojishu < suijidekuohaoduishu; kuohaojishu++)
599             {
600                 kuohaoshuzu[kuohaojishu][0] = '(';
601                 kuohaoshuzu[kuohaojishu][1] = ')';
602             }
603 
604             //对括号二维数组中的每行进行选择,选择在上面定义的字符数组中的位置
605             //以下不考虑括号在不在字符数组的首位有两种不同的情况,所以在此不考虑在首位的情况
606             srand((int)time(0));
607             for (int erweishuzuhangshu = 0; erweishuzuhangshu < suijidekuohaoduishu; erweishuzuhangshu++)
608             {
609                 int zuosuijishuweizhi;      //此变量代表生成一个随机数,此随机数代表左括号的位置
610                 int yousuijishuweizhi;      //此变量代表生成一个随机数,此随机数代表有括号的位置
611 
612                 if (zifushuzulength == 3)
613                 {
614                     zifushuzu[0] = '(';
615                     zifushuzu[2] = ')';
616                 }
617                 else
618                 {
619                     int n1=0,n2=0;         //退出循环的标记
620                     zuosuijishuweizhi = 1 + rand() % (zifushuzulength - 3);   //此处可能出错
621                     while (n1 != 1)
622                     {
623                         if (zifushuzu[zuosuijishuweizhi] == 'n')
624                         {
625                             zifushuzu[zuosuijishuweizhi] = '(';
626                             n1 = 1;
627                         }
628                         else
629                         {
630                             zuosuijishuweizhi = 1 + rand() % (zifushuzulength - 3);
631                         }
632                     }
633                     int aa = zuosuijishuweizhi + 2;
634                     yousuijishuweizhi = aa + rand() % (zifushuzulength - aa);
635                     while (n2 != 1)
636                     {
637                         if (zifushuzu[yousuijishuweizhi] == 'n')
638                         {
639                             zifushuzu[yousuijishuweizhi] = ')';
640                             n2 = 1;
641                         }
642                         else
643                         {
644                             int aa = zuosuijishuweizhi + 2;
645                             yousuijishuweizhi = aa + rand() % (zifushuzulength - aa);
646                         }
647                     }
648                 }
649                 
650                 
651             }
652 
653             //将运算符数组加入到字符数组中
654             for (int yunsuanfujishu = 0; yunsuanfujishu < yunsuanfugeshu; yunsuanfujishu++)
655             {
656                 for (int qq = 0; qq < zifushuzulength; qq++)
657                 {
658                     if (zifushuzu[qq] == 'n')
659                     {
660                         zifushuzu[qq] = yunsuanfu[yunsuanfujishu];
661                         break;
662                     }
663                 }
664             }
665 
666             //校正字符数组,使得其中不能有相邻的括号
667             //下面是校正左括号
668             for (int xianlinkuohao = 0; xianlinkuohao < (zifushuzulength-1); xianlinkuohao++)
669             {
670                 if (zifushuzu[xianlinkuohao] == '(' && zifushuzu[xianlinkuohao+1] == ')')
671                 {
672                     for (int ji = 1; ji < zifushuzulength; ji++)
673                     {
674                         if ((zifushuzu[ji] != '(')&&(zifushuzu[ji] != ')')&&(zifushuzu[ji+1]!=')')&&(zifushuzu[ji-1]!=')'))
675                         {
676                             char a;
677                             a = zifushuzu[ji];
678                             zifushuzu[ji] = zifushuzu[xianlinkuohao];
679                             zifushuzu[xianlinkuohao] = a;
680                             break;
681                         }
682                     }
683                 }
684                 if (zifushuzu[xianlinkuohao] == ')' && zifushuzu[xianlinkuohao+1] == '(')
685                 {
686                     for (int ji = 1; ji < zifushuzulength; ji++)
687                     {
688                         if ((zifushuzu[ji] != '(') && (zifushuzu[ji] != ')') && (zifushuzu[ji + 1] != ')') && (zifushuzu[ji - 1] != ')'))
689                         {
690                             char a;
691                             a = zifushuzu[ji];
692                             zifushuzu[ji] = zifushuzu[xianlinkuohao+1];
693                             zifushuzu[xianlinkuohao+1] = a;
694                             break;
695                         }
696                     }
697                 }
698             }
699             //下面是校正右括号
700             for (int xianlinkuohao = 0; xianlinkuohao < (zifushuzulength - 1); xianlinkuohao++)
701             {
702                 if (zifushuzu[xianlinkuohao] == '(' && zifushuzu[xianlinkuohao + 1] == ')')
703                 {
704                     for (int ji = 1; ji < zifushuzulength; ji++)
705                     {
706                         if ((zifushuzu[ji] != '(') && (zifushuzu[ji] != ')') && (zifushuzu[ji + 1] != '(') && (zifushuzu[ji - 1] != '('))
707                         {
708                             char a;
709                             a = zifushuzu[ji];
710                             zifushuzu[ji] = zifushuzu[xianlinkuohao+1];
711                             zifushuzu[xianlinkuohao+1] = a;
712                             break;
713                         }
714                     }
715                 }
716                 if (zifushuzu[xianlinkuohao] == ')' && zifushuzu[xianlinkuohao + 1] == '(')
717                 {
718                     for (int ji = 1; ji < zifushuzulength; ji++)
719                     {
720                         if ((zifushuzu[ji] != '(') && (zifushuzu[ji] != ')') && (zifushuzu[ji + 1] != '(') && (zifushuzu[ji - 1] != '('))
721                         {
722                             char a;
723                             a = zifushuzu[ji];
724                             zifushuzu[ji] = zifushuzu[xianlinkuohao];
725                             zifushuzu[xianlinkuohao] = a;
726                             break;
727                         }
728                     }
729                 }
730             }
731 
732 
733             //cout << "括号的个数为:" << kuohaogeshu<< endl;
734             //cout << "运算符的个数为:" << yunsuanfugeshu<< endl;
735             //cout << "字符数组的个数为:" << zifushuzulength << endl;
736             //对字符数组进行输出
737             cout << "字符数组为:";
738             for (int ii = 0; ii < zifushuzulength; ii++)
739             {
740                 cout << zifushuzu[ii] << " ";
741             }
742             cout << endl;
743             
744             /*//对运算式进行输出
745             int fuhaojishus0=0;
746             if (zifushuzulength == 3)
747             {
748                 cout << "(" << expressie_canyu[i][0] << yunsuanfu[0] << expressie_canyu[i][1] << ")";
749             }
750             else
751             {
752                 for (int shuchushuzi = 0; shuchushuzi < expressieNum_Num[i]; shuchushuzi++)
753                 {
754                     cout << expressie_canyu[i][shuchushuzi];
755                     for (; fuhaojishus0 < zifushuzulength;)
756                     {
757                         while (zifushuzu[fuhaojishus0] == ')')
758                         {
759                             cout << ")";
760                             fuhaojishus0 += 1;
761                         }
762                         if (fuhaojishus0 < zifushuzulength)
763                         {
764                             cout << zifushuzu[fuhaojishus0];    //输出右括号紧邻的运算符或者是输出第一个符号
765                         }
766                         
767                         fuhaojishus0 += 1;
768                         while (zifushuzu[fuhaojishus0] == '(')
769                         {
770                             cout << "(";
771                             fuhaojishus0 += 1;
772                         }
773                         break;
774                     }
775                 }
776             }*/
777 
778             if (0 == printStyle)
779             {
780                 int fuhaojishus0 = 0;
781                 if (zifushuzulength == 3)
782                 {
783                     cout << "(" << expressie_canyu[i][0] << yunsuanfu[0] << expressie_canyu[i][1] << ")";
784                 }
785                 else
786                 {
787                     for (int shuchushuzi = 0; shuchushuzi < expressieNum_Num[i]; shuchushuzi++)
788                     {
789                         cout << expressie_canyu[i][shuchushuzi];
790                         for (; fuhaojishus0 < zifushuzulength;)
791                         {
792                             while (zifushuzu[fuhaojishus0] == ')')
793                             {
794                                 cout << ")";
795                                 fuhaojishus0 += 1;
796                             }
797                             if (fuhaojishus0 < zifushuzulength)
798                             {
799                                 cout << zifushuzu[fuhaojishus0];    //输出右括号紧邻的运算符或者是输出第一个符号
800                             }
801 
802                             fuhaojishus0 += 1;
803                             while (zifushuzu[fuhaojishus0] == '(')
804                             {
805                                 cout << "(";
806                                 fuhaojishus0 += 1;
807                             }
808                             break;
809                         }
810                     }
811                 }
812             }
813             else
814             {
815                 int fuhaojishus0 = 0;
816                 if (zifushuzulength == 3)
817                 {
818                     outfile << "(" << expressie_canyu[i][0] << yunsuanfu[0] << expressie_canyu[i][1] << ")";
819                     outfile << endl;
820                 }
821                 else
822                 {
823                     for (int shuchushuzi = 0; shuchushuzi < expressieNum_Num[i]; shuchushuzi++)
824                     {
825                         outfile << expressie_canyu[i][shuchushuzi];
826                         for (; fuhaojishus0 < zifushuzulength;)
827                         {
828                             while (zifushuzu[fuhaojishus0] == ')')
829                             {
830                                 outfile << ")";
831                                 fuhaojishus0 += 1;
832                             }
833                             if (fuhaojishus0 < zifushuzulength)
834                             {
835                                 outfile << zifushuzu[fuhaojishus0];    //输出右括号紧邻的运算符或者是输出第一个符号
836                             }
837 
838                             fuhaojishus0 += 1;
839                             while (zifushuzu[fuhaojishus0] == '(')
840                             {
841                                 outfile << "(";
842                                 fuhaojishus0 += 1;
843                             }
844                             break;
845                         }
846                     }
847                     outfile << endl;
848                 }
849             }
850                     
851         }
852 
853         cout << endl;
854     }
855 
856     outfile.close();
857         
858     return 0;
859     
860 }

实验截图:

项目计划总结:

日期任务 听课/时 编写程序/时 查阅资料/时 日总计/时
星期一 2 1.5 0.5 4
星期二   2   2
星期三   3 1 4
星期四 2 2   4
星期五   2.5 1 3.5
星期六   5  2 7
星期日        
周总计 4 15.5 4.5

24.5

时间记录日志:

日期 开始时间 结束时间 中断时间 净时间 活动 备注
3/7 14:00 15:50 10 100 上课 软件工程
  16:30 18:00   60 编写程序 四则运算作业
  21:30 22:00   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  调试程序  
   17:00        写博客  

缺陷记录日志:

日期 编号 引入阶段 排除阶段 修复时间&问题描述
3/7 1 编码 编译  花费半小时,负数问题得不到控制。
3/8        
3/9        
3/10 2 编码 编译 花费1.5小时,运算式输出有多余项,循环不正确。 
3/11 3 编码 编译  花费半小时,调试过程出错,除数不能为零
         
原文地址:https://www.cnblogs.com/seven-seven/p/5269429.html