四则运算2

  这次题目的要求是:1、题目避免重复;2、可定制(数量、打印方式);3、可以控制下列参数:是否有乘除法、是否有括号、数值范围、加减有无负数、除法有无余数。刚拿到这个题目的时候有点懵,因为要求很多,感觉很难,后来又仔细分析了一下,将题目进行分解,感觉稍微有了点思路。

  首先题目避免重复的话就应该跟之前的四则运算一样用一个时间种子;然后就是打印题目的数量以及数值范围,这个可以让用户进行输入;然后可以用switch语句控制是否有乘除法,是否有括号;当有乘除法时要判断除数是否为0,为0的话就交换除数和被除数的位置;另外还要判断是否有余数,可以用求余运算,如果判断出来有余数,就可以通过被除数减去余数得到一个新的数值,然后输出的时候直接输出这个新的数值除以除数;当判断加减有无负数时,可以判断减数和被减数的大小,若被减数小于减数,则将两者交换位置,否则直接输出;当有括号时,我想的是用堆栈,但是具体怎样实现还没有想出来。

  我本来是打算用2个小时的时间编出来,实际则用了3个小时还要多一点,具体代码如下:

  1 //张晓菲,2016/3/12
  2 //要求:1、题目避免重复;
  3 //      2、可定制(数量、打印方式);
  4 //      3、可以控制下列参数:是否有乘除法、是否有括号、数值范围、加减有无负数、除法有无余数。
  5 
  6 #include<iostream>
  7 #include<time.h>
  8 #include <cmath>
  9 #include<string>
 10 using namespace std;
 11 
 12 void main()
 13 {
 14     srand( (unsigned)time( NULL ) );//时间种子防止每次产生的随机数相同
 15     int num1,num2,max,oper;
 16     int ran[10];
 17     int i;
 18 
 19     cout<<"请输入要打印的数量:";
 20     cin>>num1;
 21     if(num1<=0)
 22     {
 23         cout<<"请重新输入要打印的数量:";
 24         cin>>num1;
 25     }
 26 
 27     cout<<"请输入可以允许随机产生的最大数值:";
 28     cin>>max;
 29     if(max<=0)
 30     {
 31         cout<<"请重新输入可以允许的最大数值:";
 32         cin>>max;
 33     }
 34 
 35     cout<<"请输入允许几个操作数:";
 36     cin>>num2;
 37     if(num2<=1)
 38     {
 39         cout<<"请重新输入允许几个操作数(1<x<=3):";
 40         cin>>num2;
 41     }
 42 
 43     cout<<"请选择是否有乘除法(1:是 0:否):";
 44     cin>>i;
 45 
 46     for(int x=0;x<num1;x++)
 47         {
 48             for(int j=0;j<num2;j++)
 49             {
 50                 ran[j]=rand()%(max+1);
 51             }
 52             oper=rand()%4;//oper用来决定进行什么四则运算
 53             switch(i)//用于选择是否有乘除法
 54             {
 55             case 0://没有乘除
 56                 switch(num2)
 57             {
 58                 case 2://有两个操作数
 59                     switch(oper)
 60                     {
 61                     case 0:
 62                     case 1:
 63                         cout<<ran[0]<<"+"<<ran[1]<<"="<<endl;//进行加运算
 64                         break;
 65                     case 2:
 66                     case 3:
 67                         if(ran[0]<ran[1])
 68                         {
 69                             int a=ran[0];
 70                             ran[0]=ran[1];
 71                             ran[1]=a;
 72                         }
 73                         cout<<ran[0]<<"-"<<ran[1]<<"="<<endl;//进行减运算
 74                         break;
 75                     }
 76                     break;
 77                 case 3://有3个操作数
 78                     switch(oper)
 79                     {
 80                     case 0:
 81                         cout<<ran[0]<<"+"<<ran[1]<<"+"<<ran[2]<<"="<<endl;
 82                         break;
 83                     case 1:
 84                         if(ran[1]<ran[2])
 85                         {
 86                             int a=ran[1];
 87                             ran[1]=ran[2];
 88                             ran[2]=a;
 89                         }
 90                         cout<<ran[0]<<"+"<<ran[1]<<"-"<<ran[2]<<"="<<endl;
 91                         break;
 92                     case 2:
 93                         if((ran[0]-ran[1]-ran[2])<0)//判断结果是否为负数,如果是,则将减号变为加号输出
 94                         {
 95                             cout<<ran[0]<<"+"<<ran[1]<<"+"<<ran[2]<<"="<<endl;
 96                         }
 97                         else
 98                             cout<<ran[0]<<"-"<<ran[1]<<"-"<<ran[2]<<"="<<endl;
 99                         break;
100                     case 3:
101                         if(ran[0]<ran[1])//判断ran[0]-ran[1]是否大于0,小于则交换位置
102                         {
103                             int a=ran[0];
104                             ran[0]=ran[1];
105                             ran[1]=a;
106                         }
107                         cout<<ran[0]<<"-"<<ran[1]<<"+"<<ran[2]<<"="<<endl;
108                         break;
109                     }
110                     break;
111                 }
112                 break;
113             case 1://有乘除
114                 switch(num2)
115                 {
116                     //如果有两个操作数
117                 case 2:
118                     switch(oper)
119                     {
120                     case 0:
121                         cout<<ran[0]<<"+"<<ran[1]<<"="<<endl;//进行加运算
122                         break;
123                     case 1:
124                         if(ran[0]<ran[1])
125                         {
126                             int a=ran[0];
127                             ran[0]=ran[1];
128                             ran[1]=ran[0];
129                         }
130                         cout<<ran[0]<<"-"<<ran[1]<<"="<<endl;//进行减运算
131                         break;
132                     case 2:
133                         cout<<ran[0]<<"*"<<ran[1]<<"="<<endl;
134                         break;
135                     case 3:
136                         if(ran[1]==0)
137                             ran[1]=rand()%100;//判断除数是否为0,如果是,则重新生成
138                         if(ran[0]%ran[1]!=0)
139                             ran[0]=ran[0]-ran[0]%ran[1];
140                         cout<<ran[0]<<"/"<<ran[1]<<"="<<endl;//进行除运算
141                         break;
142                     }
143                     break;
144 
145                     //如果有三个操作数
146                 case 3:
147                     int oper1,oper2;
148                     oper1=rand()%16;
149                     oper2=rand()%16;
150                     string list[16];
151                     //固定表达式的形式,一共四种:A+B-C、A-B*C、A*B/C、A/B+C
152                     switch(oper1)
153                     {
154                     case 0:
155                     case 1:
156                     case 2:
157                     case 3:
158                         list[oper1]='+';
159                         list[oper2]='-';
160                         break;
161                     case 4:
162                     case 5:
163                     case 6:
164                     case 7:
165                         list[oper1]='-';
166                         list[oper2]='*';
167                         break;
168                     case 8:
169                     case 9:
170                     case 10:
171                     case 11:
172                         list[oper1]='*';
173                         list[oper2]='/';
174                         break;
175                     case 12:
176                     case 13:
177                     case 14:
178                     case 15:
179                         list[oper1]='/';
180                         list[oper2]='+';
181                         break;
182                     }
183                         //形如A/B+C的式子,判断B是否为0以及A/B是否能除尽
184                         if(oper1==12||oper1==13||oper1==14||oper1==15)
185                         {
186                             if(ran[1]==0)
187                                 ran[1]=rand()%(max+1);
188                             if(ran[0]%ran[1]!=0)
189                                 ran[0]=ran[0]-ran[0]%ran[1];
190                             cout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl;
191                         }
192                         //形如A+B/C的式子,判断C是否为0以及B/C是否能除尽
193                         if(oper1==8||oper1==9||oper1==10||oper1==11)
194                         {
195                             if(ran[2]==0)
196                                 ran[2]=rand()%(max+1);
197                             if(ran[1]%ran[2]!=0)
198                                 ran[1]=ran[1]-ran[1]%ran[2];
199                             cout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl;
200                         }
201                         //形如A-B*C的式子,判断结果是否为负数,如果为负数,则判断A-B是否小于0,不小于则直接输出(A-B)*C,小于则交换AB位置
202                         if(oper1==4||oper1==5||oper1==6||oper1==7)
203                         {
204                             if((ran[0]-(ran[1]*ran[2]))<0)
205                             {
206                                 if(ran[0]-ran[1]>=0)
207                                     cout<<'('<<ran[0]<<list[oper1]<<ran[1]<<')'<<list[oper2]<<ran[2]<<endl;
208                                 else
209                                 {
210                                     int a=ran[0];
211                                     ran[0]=ran[1];
212                                     ran[1]=a;
213                                     cout<<'('<<ran[0]<<list[oper1]<<ran[1]<<')'<<list[oper2]<<ran[2]<<endl;
214                                 }
215                             }
216                             else
217                                 cout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl;
218                         }
219                         //形如A+B-C的式子,判断结果是否为负数,如果是,则交换B和C的位置
220 
221                         if(oper1==0||oper1==1||oper1==2||oper1==3)
222                         {
223                             if(((ran[0]+ran[1])-ran[2])<0)
224                             {
225                                 int a=ran[1];
226                                 ran[1]=ran[2];
227                                 ran[2]=a;
228                             }
229                             cout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl;
230                         }
231                         break;
232                 }
233                 break;
234             }
235         }
236 }

运行结果如下图:

  这次是否有括号这个功能用户不能选择,没有支持分数的运算,也没让它输出到文件,还有我设定只能有两个或三个操作数,如果操作数再多的话我就不知道该怎么办了,感觉自己用的方法很笨很啰嗦,但是不知道怎么能更简单,虽然感觉自己的编程能力挺不好的,但是通过这么一次次的努力,也提升了不少,希望以后自己更加努力,然后有一个更大的提升。

  时间记录:

原文地址:https://www.cnblogs.com/quite-love/p/5268066.html