第一次的代码无法选择打印方式,这次用户可以选择是输出到文件还是打印到屏幕。代码如下:
1 //张晓菲,2016/3/11 2 //要求:1、题目避免重复; 3 // 2、可定制(数量、打印方式); 4 // 3、可以控制下列参数:是否有乘除法、是否有括号、数值范围、加减有无负数、除法有无余数。 5 6 #include<iostream> 7 #include<time.h> 8 #include <cmath> 9 #include<string> 10 #include<fstream> 11 using namespace std; 12 13 void main() 14 { 15 srand( (unsigned)time( NULL ) );//时间种子防止每次产生的随机数相同 16 int num1,num2,max,oper,mean1; 17 int ran[10]; 18 int i; 19 //ofstream fout; 20 ofstream fout("1.txt"); 21 22 23 cout<<"请输入要打印的数量:"; 24 cin>>num1; 25 if(num1<=0) 26 { 27 cout<<"请重新输入要打印的数量:"; 28 cin>>num1; 29 } 30 31 cout<<"请输入打印方式:(1、输出到文件 0、输出到屏幕)"; 32 cin>>mean1; 33 34 cout<<"请输入可以允许随机产生的最大数值:"; 35 cin>>max; 36 if(max<=0) 37 { 38 cout<<"请重新输入可以允许的最大数值:"; 39 cin>>max; 40 } 41 42 cout<<"请输入允许几个操作数:"; 43 cin>>num2; 44 if(num2<=1) 45 { 46 cout<<"请重新输入允许几个操作数(1<x<=3):"; 47 cin>>num2; 48 } 49 50 cout<<"请选择是否有乘除法(1:是 0:否):"; 51 cin>>i; 52 if(i!=1 && i!=0) 53 { 54 cout<<"请重新选择是否有乘除法(1:是 0:否):"; 55 cin>>i; 56 } 57 58 for(int x=0;x<num1;x++) 59 { 60 for(int j=0;j<num2;j++) 61 { 62 ran[j]=rand()%(max+1); 63 } 64 oper=rand()%4;//oper用来决定进行什么四则运算 65 switch(i)//用于选择是否有乘除法 66 { 67 case 0://没有乘除 68 switch(num2) 69 { 70 case 2://有两个操作数 71 switch(oper) 72 { 73 case 0: 74 case 1: 75 switch(mean1) 76 { 77 case 1: 78 fout<<ran[0]<<"+"<<ran[1]<<"="<<endl;//进行加运算 79 break; 80 case 0: 81 cout<<ran[0]<<"+"<<ran[1]<<"="<<endl;//进行加运算 82 break; 83 } 84 break; 85 case 2: 86 case 3: 87 if(ran[0]<ran[1]) 88 { 89 int a=ran[0]; 90 ran[0]=ran[1]; 91 ran[1]=a; 92 } 93 switch(mean1) 94 { 95 case 1: 96 fout<<ran[0]<<"-"<<ran[1]<<"="<<endl;//进行减运算 97 break; 98 case 0: 99 cout<<ran[0]<<"-"<<ran[1]<<"="<<endl; 100 break; 101 } 102 break; 103 } 104 break; 105 case 3://有3个操作数 106 switch(oper) 107 { 108 case 0: 109 switch(mean1) 110 { 111 case 1: 112 fout<<ran[0]<<"+"<<ran[1]<<"+"<<ran[2]<<"="<<endl; 113 break; 114 case 0: 115 cout<<ran[0]<<"+"<<ran[1]<<"+"<<ran[2]<<"="<<endl; 116 break; 117 } 118 break; 119 case 1: 120 if(ran[1]<ran[2]) 121 { 122 int a=ran[1]; 123 ran[1]=ran[2]; 124 ran[2]=a; 125 } 126 switch(mean1) 127 { 128 case 1: 129 fout<<ran[0]<<"+"<<ran[1]<<"-"<<ran[2]<<"="<<endl; 130 break; 131 case 0: 132 cout<<ran[0]<<"+"<<ran[1]<<"-"<<ran[2]<<"="<<endl; 133 break; 134 } 135 break; 136 case 2: 137 if((ran[0]-ran[1]-ran[2])<0)//判断结果是否为负数,如果是,则将减号变为加号输出 138 { 139 switch(mean1) 140 { 141 case 1: 142 fout<<ran[0]<<"+"<<ran[1]<<"+"<<ran[2]<<"="<<endl; 143 break; 144 case 0: 145 cout<<ran[0]<<"+"<<ran[1]<<"+"<<ran[2]<<"="<<endl; 146 break; 147 } 148 } 149 else 150 switch(mean1) 151 { 152 case 1: 153 fout<<ran[0]<<"-"<<ran[1]<<"-"<<ran[2]<<"="<<endl; 154 break; 155 case 0: 156 cout<<ran[0]<<"-"<<ran[1]<<"-"<<ran[2]<<"="<<endl; 157 break; 158 } 159 break; 160 case 3: 161 if(ran[0]<ran[1])//判断ran[0]-ran[1]是否大于0,小于则交换位置 162 { 163 int a=ran[0]; 164 ran[0]=ran[1]; 165 ran[1]=a; 166 } 167 switch(mean1) 168 { 169 case 1: 170 fout<<ran[0]<<"-"<<ran[1]<<"+"<<ran[2]<<"="<<endl; 171 break; 172 case 0: 173 cout<<ran[0]<<"-"<<ran[1]<<"+"<<ran[2]<<"="<<endl; 174 break; 175 } 176 break; 177 } 178 break; 179 } 180 break; 181 case 1://有乘除 182 switch(num2) 183 { 184 //如果有两个操作数 185 case 2: 186 switch(oper) 187 { 188 case 0: 189 switch(mean1) 190 { 191 case 1: 192 fout<<ran[0]<<"+"<<ran[1]<<"="<<endl;//进行加运算 193 break; 194 case 0: 195 cout<<ran[0]<<"+"<<ran[1]<<"="<<endl;//进行加运算 196 break; 197 } 198 break; 199 case 1: 200 if(ran[0]<ran[1]) 201 { 202 int a=ran[0]; 203 ran[0]=ran[1]; 204 ran[1]=ran[0]; 205 } 206 switch(mean1) 207 { 208 case 1: 209 fout<<ran[0]<<"-"<<ran[1]<<"="<<endl;//进行减运算 210 break; 211 case 0: 212 cout<<ran[0]<<"-"<<ran[1]<<"="<<endl;//进行减运算 213 break; 214 } 215 break; 216 case 2: 217 switch(mean1) 218 { 219 case 1: 220 fout<<ran[0]<<"*"<<ran[1]<<"="<<endl; 221 break; 222 case 0: 223 cout<<ran[0]<<"*"<<ran[1]<<"="<<endl; 224 break; 225 } 226 break; 227 case 3: 228 if(ran[1]==0) 229 ran[1]=rand()%100;//判断除数是否为0,如果是,则重新生成 230 if(ran[0]%ran[1]!=0) 231 ran[0]=ran[0]-ran[0]%ran[1]; 232 switch(mean1) 233 { 234 case 1: 235 fout<<ran[0]<<"/"<<ran[1]<<"="<<endl;//进行除运算 236 break; 237 case 0: 238 cout<<ran[0]<<"/"<<ran[1]<<"="<<endl;//进行除运算 239 break; 240 } 241 break; 242 } 243 break; 244 245 //如果有三个操作数 246 case 3: 247 int oper1,oper2; 248 oper1=rand()%16; 249 oper2=rand()%16; 250 string list[16]; 251 //固定表达式的形式,一共四种:A+B-C、A-B*C、A*B/C、A/B+C 252 switch(oper1) 253 { 254 case 0: 255 case 1: 256 case 2: 257 case 3: 258 list[oper1]='+'; 259 list[oper2]='-'; 260 break; 261 case 4: 262 case 5: 263 case 6: 264 case 7: 265 list[oper1]='-'; 266 list[oper2]='*'; 267 break; 268 case 8: 269 case 9: 270 case 10: 271 case 11: 272 list[oper1]='*'; 273 list[oper2]='/'; 274 break; 275 case 12: 276 case 13: 277 case 14: 278 case 15: 279 list[oper1]='/'; 280 list[oper2]='+'; 281 break; 282 } 283 //形如A/B+C的式子,判断B是否为0以及A/B是否能除尽 284 if(oper1==12||oper1==13||oper1==14||oper1==15) 285 { 286 if(ran[1]==0) 287 ran[1]=rand()%(max+1); 288 if(ran[0]%ran[1]!=0) 289 ran[0]=ran[0]-ran[0]%ran[1]; 290 switch(mean1) 291 { 292 case 1: 293 fout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl; 294 break; 295 case 0: 296 cout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl; 297 break; 298 } 299 } 300 //形如A+B/C的式子,判断C是否为0以及B/C是否能除尽 301 if(oper1==8||oper1==9||oper1==10||oper1==11) 302 { 303 if(ran[2]==0) 304 ran[2]=rand()%(max+1); 305 if(ran[1]%ran[2]!=0) 306 ran[1]=ran[1]-ran[1]%ran[2]; 307 switch(mean1) 308 { 309 case 1: 310 fout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl; 311 break; 312 case 2: 313 cout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl; 314 break; 315 } 316 } 317 //形如A-B*C的式子,判断结果是否为负数,如果为负数,则判断A-B是否小于0,不小于则直接输出(A-B)*C,小于则交换AB位置 318 if(oper1==4||oper1==5||oper1==6||oper1==7) 319 { 320 if((ran[0]-(ran[1]*ran[2]))<0) 321 { 322 if(ran[0]-ran[1]>=0) 323 { 324 switch(mean1) 325 { 326 case 1: 327 fout<<'('<<ran[0]<<list[oper1]<<ran[1]<<')'<<list[oper2]<<ran[2]<<endl; 328 break; 329 case 0: 330 cout<<'('<<ran[0]<<list[oper1]<<ran[1]<<')'<<list[oper2]<<ran[2]<<endl; 331 break; 332 } 333 } 334 else 335 { 336 int a=ran[0]; 337 ran[0]=ran[1]; 338 ran[1]=a; 339 switch(mean1) 340 { 341 case 1: 342 fout<<'('<<ran[0]<<list[oper1]<<ran[1]<<')'<<list[oper2]<<ran[2]<<endl; 343 break; 344 case 0: 345 cout<<'('<<ran[0]<<list[oper1]<<ran[1]<<')'<<list[oper2]<<ran[2]<<endl; 346 break; 347 } 348 } 349 } 350 else 351 switch(mean1) 352 { 353 case 1: 354 fout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl; 355 break; 356 case 0: 357 cout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl; 358 break; 359 } 360 } 361 //形如A+B-C的式子,判断结果是否为负数,如果是,则交换B和C的位置 362 363 if(oper1==0||oper1==1||oper1==2||oper1==3) 364 { 365 if(((ran[0]+ran[1])-ran[2])<0) 366 { 367 int a=ran[1]; 368 ran[1]=ran[2]; 369 ran[2]=a; 370 } 371 switch(mean1) 372 { 373 case 1: 374 fout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl; 375 break; 376 case 0: 377 cout<<ran[0]<<list[oper1]<<ran[1]<<list[oper2]<<ran[2]<<endl; 378 break; 379 } 380 } 381 break; 382 } 383 break; 384 } 385 } 386 fout.close(); 387 }
运行结果如下:
输出到文件:
输出到屏幕:
还是没有实现括号的功能,但是比上次有点进步。