四则运算测试

测试元素:

  1、题目数目;

  2、数值范围;

  3、是否带括号;

  4、是否有乘除;

  5、每行容纳算式个数;

  6、算式行间距.

第一次测试:30  100  Y  Y   2  12

结果:

格式混乱,检查发现setw()函数逻辑位置不对;修改后显示正常。

第二次测试:20  1  N  N  2   12

结果:

无法避免重复时程序出错,未解决;

第三次测试:2000  1000  Y  Y  4  6

结果:

出现大数据时,会出现除数为零的情况,上面显示的结果是解决后的截图

其他情况下测试未发现明显异常

修改后的源代码如下:

  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[],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             switch(digits[5]){    
 95             case 0:
 96                 if((characters[digits[3]]=='/'&&digits[1]==0)||(characters[digits[4]]=='/'&&digits[2]==0))//数学规则,商不能为0
 97                 {
 98                     goto P;
 99                 }
100                 else
101                 {
102                     if((characters[digits[3]]=='+'||characters[digits[3]]=='-')        //括号在前
103                         &&(characters[digits[4]]=='*'||characters[digits[4]]=='/'))    //排除无用括号
104                     {
105                         cout<<"(";
106                         if((int)Arithmetic_arr[k][0]<0)
107                         {
108                             cout<<"("<<(int)Arithmetic_arr[k][0]<<")";
109                         }
110                         else
111                             cout<<(int)Arithmetic_arr[k][0];
112                         cout<<Arithmetic_arr[k][1];
113                         if((int)Arithmetic_arr[k][2]<0)
114                         {
115                             cout<<"("<<(int)Arithmetic_arr[k][2]<<")";
116                         }
117                         else
118                             cout<<(int)Arithmetic_arr[k][2];
119                         cout<<")"<<Arithmetic_arr[k][3];
120                         if((int)Arithmetic_arr[k][4]<0)
121                         {
122                             cout<<"("<<(int)Arithmetic_arr[k][4]<<")";
123                         }
124                         else
125                             cout<<(int)Arithmetic_arr[k][4];
126                         cout<<"=";
127                         
128                         
129                         
130                         if(flag%character3==0) {cout<<endl;}
131                         else {cout<<setw(character4);}
132                         
133                         break;
134                     }
135                     else 
136                     {
137                         goto P;
138                     }
139                 }
140                 
141             case 1:  //括号在后
142                 int result=1;  //计算括号里面的值,并赋值在result中
143                 switch(characters[digits[4]])
144                 {
145                 case '+':result=digits[1]+digits[2];break;
146                 case '-':result=digits[1]-digits[2];break;
147                 case '*':result=digits[1]*digits[2];break;
148                 case '/':result=digits[1]/digits[2];break;
149                 }
150                 if((characters[digits[4]]=='/'&&digits[2]==0)||(characters[digits[3]]=='/'&&result==0))    //数学规则,商不能为0
151                 {
152                     goto P;
153                 }
154                 else
155                 {
156                     if((characters[digits[3]]=='*'&&(characters[digits[4]]=='+'||characters[digits[4]]=='-'))
157                         ||(characters[digits[3]]=='/'&&(characters[digits[4]]=='+'||characters[digits[4]]=='-'||characters[digits[4]]=='*'))
158                         ||(characters[digits[3]]=='-'&&(characters[digits[4]]=='+'||characters[digits[4]]=='-')))    //排除无用括号    
159                     {    
160                         if((int)Arithmetic_arr[k][0]<0)
161                         {
162                             cout<<"("<<(int)Arithmetic_arr[k][0]<<")";
163                         }
164                         else
165                             cout<<(int)Arithmetic_arr[k][0];
166                         cout<<Arithmetic_arr[k][1];
167                         cout<<"(";
168                         if((int)Arithmetic_arr[k][2]<0)
169                         {
170                             cout<<"("<<(int)Arithmetic_arr[k][2]<<")";
171                         }
172                         else
173                             cout<<(int)Arithmetic_arr[k][2];
174                         cout<<Arithmetic_arr[k][3];
175                         if((int)Arithmetic_arr[k][4]<0)
176                         {
177                             cout<<"("<<(int)Arithmetic_arr[k][4]<<")";
178                         }
179                         else
180                             cout<<(int)Arithmetic_arr[k][4];
181                         cout<<")"<<"=";
182                         
183                         if(flag%character3==0) {cout<<endl;}
184                         else {cout<<setw(character4);}
185                         break;
186                     }
187                     
188                     else 
189                     {
190                         goto P;
191                     }
192                 }
193             }    
194         }
195         else{
196             
197             if((int)Arithmetic_arr[k][0]<0)
198             {
199                 cout<<"("<<(int)Arithmetic_arr[k][0]<<")";
200             }
201             else
202                 cout<<(int)Arithmetic_arr[k][0];
203             cout<<Arithmetic_arr[k][1];
204             if((int)Arithmetic_arr[k][2]<0)
205             {
206                 cout<<"("<<(int)Arithmetic_arr[k][2]<<")";
207             }
208             else
209                 cout<<(int)Arithmetic_arr[k][2];
210             cout<<Arithmetic_arr[k][3];
211             if((int)Arithmetic_arr[k][4]<0)
212             {
213                 cout<<"("<<(int)Arithmetic_arr[k][4]<<")";
214             }
215             else
216                 cout<<(int)Arithmetic_arr[k][4];
217             cout<<"=";
218             if(flag%character3==0) {cout<<endl;}
219             else {cout<<setw(character4);}
220         }
221     }        
222 }
223 
224 int main()
225 {
226     while(1)
227     {
228         cout<<"------------------小学生四则运算产生器-------------------"<<endl;
229         
230         srand((unsigned)time(NULL));    //为rand()函数生成不同的随机种子
231         
232         int num1,num2=6;
233         
234         cout<<"请输入定制数目(输入零结束):"<<endl;      //题目数
235         
236         cin>>num1;
237         
238         if(num1==0){
239 
240             cout<<"---------------------谢谢使用!!!----------------------"<<endl;
241             exit(0);
242         }
243         
244         char ** Arithmetic_arr=new char*[num1];  //存放运算式动态数组
245         
246         int digits[6];                    //存放计算的随机数字的数组,前三个为随机运算数字,第四第
247                                         //五为随机产生运算符号标志数,第六为判断括号位置标志数。
248         char characters[6]={'+','-','*','/','(',')'};    //存放加减乘除及括号等字符数组
249         
250         Demo(digits,characters,Arithmetic_arr,num1,num2);  //调用计算函数
251         
252         delete [] Arithmetic_arr;  //释放动态数组空间
253         
254         cout<<endl<<"------------------请输入任意键继续!---------------------"<<endl;
255         
256         getch();
257         
258         system("CLS");
259     }
260     return 0;
261 }
View Code


结论:通过这次编写程序,我觉得难的不是是否对语法有多么精通,而是编写的算法是否精炼简洁,最难的是逻辑问题的解决;

当小的问题在一个函数下,无需通过大量的结构化以及参数的传递很容易就能解决;但当函数结构扩大时,良好的算法结构才是

维护及修改程序的总要条件。

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