测试元素:
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 }
结论:通过这次编写程序,我觉得难的不是是否对语法有多么精通,而是编写的算法是否精炼简洁,最难的是逻辑问题的解决;
当小的问题在一个函数下,无需通过大量的结构化以及参数的传递很容易就能解决;但当函数结构扩大时,良好的算法结构才是
维护及修改程序的总要条件。