四则运算的扩展

 扩展:

  接受用户输入答案,并显示结果和答对个数。

附上代码:

  1 #include<iostream>
  2 #include<conio.h>
  3 #include<cstdlib>
  4 #include<ctime>
  5 #include <iomanip>
  6 using namespace std;
  7 
  8 void Rand_Cal_one(int digits[],char characters[],int range)  //随机产生运算数(包含乘除)
  9 {
 10     for(int i=0;i<6;i++){
 11         if(i<3){
 12             digits[i]=rand()%range;//生成四则运算的计算随机数
 13             continue;
 14         }
 15         else if(i<5){
 16             digits[i]=rand()%4;//随机产生标志判断计算符号
 17             continue;
 18         }
 19         else{
 20             digits[i]=rand()%2;//随机产生标志数判断括号位置
 21         }
 22     }
 23 }
 24 
 25 void Rand_Cal_two(int digits[],char characters[],int range)  //随机产生运算数(不含乘除)
 26 {
 27     for(int i=0;i<6;i++){
 28         if(i<3){
 29             digits[i]=rand()%range;//生成四则运算的计算随机数
 30             continue;
 31         }
 32         else if(i<5){
 33             digits[i]=rand()%2;//随机产生标志判断计算符号
 34             continue;
 35         }
 36         else{
 37             digits[i]=rand()%2;//随机产生标志数判断括号位置
 38         }
 39     }
 40 }
 41 
 42 void Demo(int digits[],char characters[],char * Arithmetic_arr[],double results[],int m,int n) //产生符合要求的运算式
 43 {
 44     char character1,character2;
 45     int character3,character4,range;
 46     cout<<"请输入数字范围(最大值):"<<endl;
 47     cin>>range;
 48     cout<<"请选择是否带括号: Y表示带括号,N表示不带括号"<<endl;
 49     cin>>character1;
 50     cout<<"请选择是否有乘除: Y表示有乘除,N表示无乘除"<<endl;
 51     cin>>character2;
 52     cout<<"请选择每行容纳算是数量:"<<endl;
 53     cin>>character3;
 54     
 55     if(character3!=1){    
 56         cout<<"请选择行间距(1-n):"<<endl;    
 57         cin>>character4;
 58     }
 59     
 60     cout<<"-------------------"<<m<<"道算式题如下-------------------------"<<endl;
 61     
 62     for(int k=0; k<m; k++){
 63         int flag=k+1;
 64 P:
 65         if (character2=='Y'){
 66             Rand_Cal_one(digits,characters,range);
 67         }
 68         else{
 69             Rand_Cal_two(digits,characters,range);
 70         }
 71         Arithmetic_arr[k]=new char[n];    
 72         if(k!=0){    
 73             for(int i=0;i<k;i++){        
 74                 if( digits[0]==Arithmetic_arr[i][0]                    //避免重复
 75                     && characters[digits[3]]==Arithmetic_arr[i][1]
 76                     && digits[1]==Arithmetic_arr[i][2]
 77                     && characters[digits[4]]==Arithmetic_arr[i][3]
 78                     && digits[2]==Arithmetic_arr[i][4]
 79                     &&digits[5]==Arithmetic_arr[i][5]){
 80                     
 81                     goto P;    
 82                 }
 83             }
 84         }
 85         
 86         Arithmetic_arr[k][0]=digits[0];        //第一个操作数
 87         Arithmetic_arr[k][1]=characters[digits[3]];//第一个运算符
 88         Arithmetic_arr[k][2]=digits[1];        //第二个操作数
 89         Arithmetic_arr[k][3]=characters[digits[4]];//第二个运算符
 90         Arithmetic_arr[k][4]=digits[2];        //第三个操作数
 91         Arithmetic_arr[k][5]=digits[5];   //存放括号位置标志
 92         
 93         if (character1=='Y'){
 94             double result1=1,result2=1;
 95             switch(digits[5]){    
 96             case 0:
 97                   //计算括号里面的值,并赋值在result中
 98                 switch(characters[digits[3]])
 99                 {
100                 case '+':result1=(double)digits[0]+(double)digits[1];break;
101                 case '-':result1=(double)digits[0]-(double)digits[1];break;
102                 case '*':result1=(double)digits[0]*(double)digits[1];break;
103                 case '/':result1=(double)digits[0]/(double)digits[1];break;
104                 }
105                 switch(characters[digits[4]])
106                 {
107                 case '+':results[k]=(double)result1+(double)digits[2];break;
108                 case '-':results[k]=(double)result1-(double)digits[2];break;
109                 case '*':results[k]=(double)result1*(double)digits[2];break;
110                 case '/':results[k]=(double)result1/(double)digits[2];break;
111                 }
112                 if((characters[digits[3]]=='/'&&digits[1]==0)||(characters[digits[4]]=='/'&&digits[2]==0))//数学规则,商不能为0
113                 {
114                     goto P;
115                 }
116                 else
117                 {
118                     if((characters[digits[3]]=='+'||characters[digits[3]]=='-')        //括号在前
119                         &&(characters[digits[4]]=='*'||characters[digits[4]]=='/'))    //排除无用括号
120                     {
121                         cout<<"(";
122                         if((int)Arithmetic_arr[k][0]<0)
123                         {
124                             cout<<"("<<(int)Arithmetic_arr[k][0]<<")";
125                         }
126                         else
127                             cout<<(int)Arithmetic_arr[k][0];
128                         cout<<Arithmetic_arr[k][1];
129                         if((int)Arithmetic_arr[k][2]<0)
130                         {
131                             cout<<"("<<(int)Arithmetic_arr[k][2]<<")";
132                         }
133                         else
134                             cout<<(int)Arithmetic_arr[k][2];
135                         cout<<")"<<Arithmetic_arr[k][3];
136                         if((int)Arithmetic_arr[k][4]<0)
137                         {
138                             cout<<"("<<(int)Arithmetic_arr[k][4]<<")";
139                         }
140                         else
141                             cout<<(int)Arithmetic_arr[k][4];
142                         cout<<"=";
143 
144                         if(flag%character3==0) {cout<<endl;}
145                         else {cout<<setw(character4);}
146                         
147                         break;
148                     }
149                     else 
150                     {
151                         goto P;
152                     }
153                 }
154                 
155             case 1:  //括号在后
156                 switch(characters[digits[4]])
157                 {
158                 case '+':result2=(double)digits[1]+(double)digits[2];break;
159                 case '-':result2=(double)digits[1]-(double)digits[2];break;
160                 case '*':result2=(double)digits[1]*(double)digits[2];break;
161                 case '/':result2=(double)digits[1]/(double)digits[2];break;
162                 }
163                 switch(characters[digits[3]])
164                 {
165                 case '+':results[k]=(double)digits[0]+(double)result2;break;
166                 case '-':results[k]=(double)digits[0]-(double)result2;break;
167                 case '*':results[k]=(double)digits[0]*(double)result2;break;
168                 case '/':results[k]=(double)digits[0]/(double)result2;break;
169                 }
170                 if((characters[digits[4]]=='/'&&digits[2]==0)||(characters[digits[3]]=='/'&&result2==0))    //数学规则,商不能为0
171                 {
172                     goto P;
173                 }
174                 else
175                 {
176                     if((characters[digits[3]]=='*'&&(characters[digits[4]]=='+'||characters[digits[4]]=='-'))
177                         ||(characters[digits[3]]=='/'&&(characters[digits[4]]=='+'||characters[digits[4]]=='-'||characters[digits[4]]=='*'))
178                         ||(characters[digits[3]]=='-'&&(characters[digits[4]]=='+'||characters[digits[4]]=='-')))    //排除无用括号    
179                     {    
180                         if((int)Arithmetic_arr[k][0]<0)
181                         {
182                             cout<<"("<<(int)Arithmetic_arr[k][0]<<")";
183                         }
184                         else
185                             cout<<(int)Arithmetic_arr[k][0];
186                         cout<<Arithmetic_arr[k][1];
187                         cout<<"(";
188                         if((int)Arithmetic_arr[k][2]<0)
189                         {
190                             cout<<"("<<(int)Arithmetic_arr[k][2]<<")";
191                         }
192                         else
193                             cout<<(int)Arithmetic_arr[k][2];
194                         cout<<Arithmetic_arr[k][3];
195                         if((int)Arithmetic_arr[k][4]<0)
196                         {
197                             cout<<"("<<(int)Arithmetic_arr[k][4]<<")";
198                         }
199                         else
200                             cout<<(int)Arithmetic_arr[k][4];
201                         cout<<")"<<"=";
202                         
203                         if(flag%character3==0) {cout<<endl;}
204                         else {cout<<setw(character4);}
205                         break;
206                     }
207                     
208                     else 
209                     {
210                         goto P;
211                     }
212                 }
213             }    
214         }
215         else{
216             
217             if((int)Arithmetic_arr[k][0]<0)
218             {
219                 cout<<"("<<(int)Arithmetic_arr[k][0]<<")";
220             }
221             else
222                 cout<<(int)Arithmetic_arr[k][0];
223             cout<<Arithmetic_arr[k][1];
224             if((int)Arithmetic_arr[k][2]<0)
225             {
226                 cout<<"("<<(int)Arithmetic_arr[k][2]<<")";
227             }
228             else
229                 cout<<(int)Arithmetic_arr[k][2];
230             cout<<Arithmetic_arr[k][3];
231             if((int)Arithmetic_arr[k][4]<0)
232             {
233                 cout<<"("<<(int)Arithmetic_arr[k][4]<<")";
234             }
235             else
236                 cout<<(int)Arithmetic_arr[k][4];
237             cout<<"=";
238             if(flag%character3==0) {cout<<endl;}
239             else {cout<<setw(character4);}
240         }
241     }        
242 }
243 
244 int main()
245 {
246     while(1)
247     {
248         cout<<"------------------小学生四则运算产生器-------------------"<<endl;
249         
250         srand((unsigned)time(NULL));    //为rand()函数生成不同的随机种子
251         
252         int num1,num2=6,num3;
253         
254         cout<<"请输入定制数目(输入零结束):"<<endl;      //题目数
255         
256         cin>>num1;
257 
258         cout<<"答案小数精确度:"<<endl;      //题目数
259         
260         cin>>num3;
261         
262         if(num1==0){
263 
264             cout<<"---------------------谢谢使用!!!----------------------"<<endl;
265             exit(0);
266         }
267         
268         char ** Arithmetic_arr=new char*[num1];  //存放运算式动态数组
269 
270         double * results=new double[num1];
271 
272         double * answer=new double[num1];  //正确答案数组results与接收答案数组answer
273         
274         int digits[6];                    //存放计算的随机数字的数组,前三个为随机运算数字,第四第
275                                         //五为随机产生运算符号标志数,第六为判断括号位置标志数。
276         int count=0;
277 
278         char characters[6]={'+','-','*','/','(',')'};    //存放加减乘除及括号等字符数组
279         
280         Demo(digits,characters,Arithmetic_arr,results,num1,num2);  //调用计算函数
281         
282         delete [] Arithmetic_arr;  //释放动态数组空间
283 
284         cout<<"---------------------------------------------------------"<<endl;
285 
286         cout<<"请输入结果:"<<endl;
287 
288         for(int i=0;i<num1;i++)
289         {
290             cout<<""<<i+1<<"题答案是:    ";
291             cin>>answer[i];
292         }
293         for(int j=0;j<num1;j++)
294         {
295             if(results[j]==answer[j])
296             {
297                 count++;
298             }
299         }
300         cout<<"---------------------------------------------------------"<<endl;
301         cout<<"按回车显示答案!"<<endl;
302         cout<<"---------------------------------------------------------"<<endl;
303 
304         getch();
305 
306         for(int k=0;k<num1;k++)
307         {
308             cout<<""<<k+1<<"题正确答案是:    "<<fixed<<setprecision(num3)<<results[k]<<endl;
309         }
310         cout<<"---------------------------------------------------------"<<endl;
311 
312         cout<<"答对的题目个数为"<<count+1<<""<<endl;
313 
314         cout<<endl<<"------------------请输入任意键继续!---------------------"<<endl;
315         
316         getch();
317         
318         system("CLS");
319     }
320     return 0;
321 }


运行结果截图:

结论:

  程序的结构很重要,良好的可扩展性便于日后添加新的功能。

原文地址:https://www.cnblogs.com/bill927/p/4346969.html