扩展:
接受用户输入答案,并显示结果和答对个数。
附上代码:
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 }
运行结果截图:
结论:
程序的结构很重要,良好的可扩展性便于日后添加新的功能。
时间: 2024-10-12 02:32:53