1 #include<iostream> 2 #include<time.h> 3 #include<fstream> 4 using namespace std; 5 void yunsuanfu(int b) 6 { if(b==1) 7 { 8 cout<<"+"; 9 } 10 if(b==2) 11 { 12 cout<<"-"; 13 } 14 if(b==3) 15 { 16 cout<<"*"; 17 } 18 if(b==4) 19 { 20 cout<<"/"; 21 } 22 } 23 void main() 24 { 25 srand((unsigned)time(NULL)); //避免产生随机数时的重复 26 int Num,j,m,n,p; //Num变量为运算的个数 27 cout<<"请输入四则运算的数量:"<<endl; 28 cin>>Num; 29 cout<<"请选择打印方式: 1、文件输出 2、DOS界面显示"<<endl; 30 cin>>j; 31 int max,min; 32 int x,y; 33 srand((unsigned)time(NULL)); 34 cout<<"一、请选择运算的数值范围:"<<endl; 35 cout<<"最大值="; 36 cin>>max; 37 cout<<"最小值="; 38 cin>>min; 39 cout<<"二、请选择加减的结果有无负数:1、结果可以有负数 2、结果不能有负数"<<endl; 40 cin>>n; 41 cout<<"三、请选择是否有乘除法: 1、是 2、否"<<endl; 42 cin>>m; 43 cout<<"四、计算结果除法是否可以带有余数: 1、是 2、否"<<endl; 44 cin>>p; 45 cout<<"生成的结果为:"<<endl; 46 int a,b,c,num[10]; //a为四则运算中操作数的个数,b用来选择输入的运算符,定义一个数组变量num[10],用来存放一个运算式中的所有的操作数 47 if(j==1) //j控制输出结果的打印方式,j==1是,输出结果打印到文件当中 48 { 49 ofstream outfile("wenjian.txt",ios::binary); //定义文件的输入输出,输入到wenjian.txt中 50 if(!outfile) //文件输入的出错处理 51 { 52 cerr<<"open error!"<<endl; 53 } 54 for(x=0; x<Num;x++) //输出四则运算算式的个数。 55 { 56 a=2+rand()%9; //随机输出一个四则运算中操作数的个数。 57 for(int i=0;i<a;i++) 58 { 59 num[i]=min+rand()%max; //生成的操作数存放在num[i]数组中,min和max用来控制操作数的范围 60 } 61 if(n==1) //n控制加减有无负数,n==1是运算结果有负数 62 { 63 if(m==1) //m控制是否带有乘除法,m==1为运算带有乘除法 64 { 65 if(p==1) //p控制除法有无余数,p==1为除法可以带有余数 66 { 67 for(int i=0;i<a-1;i++) //输出一个四则运算 68 { 69 outfile<<num[i]; 70 b=1+rand()%4; 71 if(b==1) 72 { 73 outfile<<"+"; 74 } 75 if(b==2) 76 { 77 outfile<<"-"; 78 79 } 80 if(b==3) 81 { 82 outfile<<"*"; 83 } 84 if(b==4) 85 { 86 outfile<<"/"; 87 } 88 } 89 outfile<<num[a-1]; 90 outfile<<"="<<" "; 91 } 92 if(p==2) //运算中除法结果不带有余数 93 { 94 int g[10],t; //定义一个数组g[],用来存放随机生成的运算符 95 for(int i=0;i<a-1;i=i+2) //把生成的运算符放在一个数组中,运算符的个数比操作数的个数少1 96 { 97 g[i]=1+rand()%3; 98 t=1+rand()%2; //t用来选择生成的除号,避免产生连除的情况 99 if(t==1) 100 { 101 g[i+1]=4; 102 } 103 if(t==2) 104 { 105 g[i+1]=1+rand()%3; 106 } 107 } 108 for(int i=0;i<a-1;i++) 109 { 110 if(g[i]==4) //运算符是除号的情况 111 { 112 if((num[i]>num[i+1])&&(num[i]%num[i+1]!=0)) 113 { 114 num[i]=num[i]-num[i]%num[i+1]; 115 } 116 if((num[i]>num[i+1])&&(num[i]/num[i+1]==1)) 117 { 118 num[i]=num[i+1]; 119 } 120 if(num[i]<num[i+1]) 121 { 122 y=num[i]; 123 num[i]=num[i+1]; 124 num[i+1]=y; 125 num[i]=num[i]-num[i]%num[i+1]; 126 } 127 } 128 } 129 for(int i=0;i<a-1;i++) 130 { 131 outfile<<num[i]; 132 if(g[i]==1) 133 { 134 outfile<<"+"; 135 } 136 if(g[i]==2) 137 { 138 outfile<<"-"; 139 140 } 141 if(g[i]==3) 142 { 143 outfile<<"*"; 144 } 145 if(g[i]==4) 146 { 147 outfile<<"/"; 148 } 149 150 } 151 outfile<<num[a-1]; 152 outfile<<"="<<" "; 153 } 154 } 155 if(m==2) //运算不带有乘除法 156 { 157 for(int i=0;i<a-1;i++) 158 { 159 outfile<<num[i]; 160 b=1+rand()%2; 161 if(b==1) 162 { 163 outfile<<"+"; 164 } 165 if(b==2) 166 { 167 outfile<<"-"; 168 } 169 } 170 outfile<<num[a-1]; 171 outfile<<" "<<" "; 172 } 173 } 174 if(n==2) //运算结果没有无负数 175 { 176 if(m==1) //运算中带有乘除法 177 { 178 if(p==1) //p判断除法有余数 179 { 180 int g[10],t[10]; 181 for(int i=0;i<a-1;i++) //把生成的运算符放在一个数组中,运算符的个数比操作数的个数少1 182 { 183 g[i]=1+rand()%4; 184 } 185 for(int i=0;i<a;i++) //把操作数数组中的数复制一份到t[]数组中 186 { 187 t[i]=num[i]; 188 } 189 for(int i=0;i<a-1;i++) 190 { 191 if(g[i]==3) 192 { 193 t[i]=t[i]*t[i+1]; 194 t[i+1]=t[i]; 195 } 196 if(g[i]==4) 197 { 198 t[i]=t[i]/t[i+1]; 199 t[i+1]=t[i]; 200 } 201 } 202 for(int i=0;i<a-1;i++) 203 { 204 if(g[i]==2) 205 { 206 if(t[i]<t[i+1]) 207 { 208 g[i]=1; 209 } 210 } 211 } 212 for(int i=0;i<a-1;i++) 213 { 214 outfile<<num[i]; 215 if(g[i]==1) 216 { 217 outfile<<"+"; 218 } 219 if(g[i]==2) 220 { 221 outfile<<"-"; 222 } 223 if(g[i]==3) 224 { 225 outfile<<"*"; 226 } 227 if(g[i]==4) 228 { 229 outfile<<"/"; 230 } 231 232 } 233 outfile<<num[a-1]; 234 outfile<<"="<<" "; 235 } 236 if(p==2) //除法没有余数,将运算结果没有负数和除法么有余数结合 237 { 238 int g[10],t[10]; 239 for(int i=0;i<a-1;i=i+2) 240 { 241 g[i]=1+rand()%3; 242 c=1+rand()%2; 243 if(c==1) 244 { 245 g[i+1]=4; 246 } 247 if(c==2) 248 { 249 g[i+1]=1+rand()%3; 250 } 251 } 252 for(int i=0;i<a;i++) 253 { 254 t[i]=num[i]; 255 } 256 for(int i=0;i<a-1;i++) 257 { 258 if(g[i]==3) 259 { 260 t[i]=t[i]*t[i+1]; 261 t[i+1]=t[i]; 262 } 263 if(g[i]==4) 264 { 265 t[i]=t[i]/t[i+1]; 266 t[i+1]=t[i]; 267 if((num[i]>num[i+1])&&(num[i]%num[i+1]!=0)) 268 { 269 num[i]=num[i]-num[i]%num[i+1]; 270 } 271 if((num[i]>num[i+1])&&(num[i]/num[i+1]==1)) 272 { 273 num[i]=num[i+1]; 274 } 275 if(num[i]<num[i+1]) 276 { 277 y=num[i]; 278 num[i]=num[i+1]; 279 num[i+1]=y; 280 num[i]=num[i]-num[i]%num[i+1]; 281 } 282 } 283 } 284 for(int i=0;i<a-1;i++) 285 { 286 if(g[i]==2) 287 { 288 if(t[i]<t[i+1]) 289 { 290 g[i]=1; 291 } 292 } 293 } 294 for(int i=0;i<a-1;i++) 295 { 296 outfile<<num[i]; 297 if(g[i]==1) 298 { 299 outfile<<"+"; 300 } 301 if(g[i]==2) 302 { 303 outfile<<"-"; 304 } 305 if(g[i]==3) 306 { 307 outfile<<"*"; 308 } 309 if(g[i]==4) 310 { 311 outfile<<"/"; 312 } 313 314 } 315 outfile<<num[a-1]; 316 outfile<<"="<<" "; 317 } 318 319 } 320 if(m==2) //m没有乘除法,加减的运算结果没有负数 321 { 322 int g[10],t[10]; 323 for(int i=0;i<a-1;i++) 324 { 325 g[i]=1+rand()%2; 326 } 327 for(int i=0;i<a;i++) 328 { 329 t[i]=num[i]; 330 } 331 for(int i=0;i<a-1;i++) 332 { 333 if(g[i]==2) 334 { 335 if(t[i]<t[i+1]) 336 { 337 g[i]=1; 338 } 339 } 340 } 341 for(int i=0;i<a-1;i++) 342 { 343 outfile<<num[i]; 344 if(g[i]==1) 345 { 346 outfile<<"+"; 347 } 348 if(g[i]==2) 349 { 350 outfile<<"-"; 351 352 } 353 } 354 outfile<<num[a-1]; 355 outfile<<"="<<" "; 356 } 357 } 358 } 359 360 } 361 if(j==2) //输出的算式输出到DOS界面,思路和输出到文件中的相同 362 { 363 for(x=0; x<Num;x++) //输出四则运算的个数。 364 { 365 a=2+rand()%9; //随机输出一个四则运算中操作数的个数。 366 for(int i=0;i<a;i++) 367 { 368 num[i]=min+rand()%max; 369 } 370 if(n==1) //n控制加减有负数 371 { 372 if(m==1) //m控制是否带有乘除法 373 { 374 if(p==1) //p控制除法有无余数 375 { 376 for(int i=0;i<a-1;i++) //输出一个四则运算 377 { 378 cout<<num[i]; 379 b=1+rand()%4; 380 yunsuanfu(b); 381 } 382 cout<<num[a-1]<<"="<<endl; 383 } 384 if(p==2) 385 { 386 int g[10],t; 387 for(int i=0;i<a-1;i=i+2) 388 { 389 g[i]=1+rand()%3; 390 t=1+rand()%2; 391 if(t==1) 392 { 393 g[i+1]=4; 394 } 395 if(t==2) 396 { 397 g[i+1]=1+rand()%3; 398 } 399 } 400 for(int i=0;i<a-1;i++) 401 { 402 if(g[i]==4) 403 { 404 if((num[i]>num[i+1])&&(num[i]%num[i+1]!=0)) 405 { 406 num[i]=num[i]-num[i]%num[i+1]; 407 } 408 if((num[i]>num[i+1])&&(num[i]/num[i+1]==1)) 409 { 410 num[i]=num[i+1]; 411 } 412 if(num[i]<num[i+1]) 413 { 414 y=num[i]; 415 num[i]=num[i+1]; 416 num[i+1]=y; 417 num[i]=num[i]-num[i]%num[i+1]; 418 } 419 } 420 } 421 for(int i=0;i<a-1;i++) 422 { 423 cout<<num[i]; 424 yunsuanfu(g[i]); 425 } 426 cout<<num[a-1]<<"="<<endl; 427 428 } 429 } 430 if(m==2) 431 { 432 for(int i=0;i<a-1;i++) //输出一个四则运算 433 { 434 cout<<num[i]; 435 b=1+rand()%2; 436 yunsuanfu(b); 437 438 } 439 cout<<num[a-1]<<"="<<endl; 440 } 441 } 442 if(n==2) //n判断是加减无负数 443 { if(m==1) //m判断有乘除法 444 { 445 if(p==1) //p判断除法有余数 446 { 447 int g[10],t[10]; 448 for(int i=0;i<a-1;i++) 449 { 450 g[i]=1+rand()%4; 451 } 452 for(int i=0;i<a;i++) 453 { 454 t[i]=num[i]; 455 } 456 for(int i=0;i<a-1;i++) 457 { 458 if(g[i]==3) 459 { 460 t[i]=t[i]*t[i+1]; 461 t[i+1]=t[i]; 462 } 463 if(g[i]==4) 464 { 465 t[i]=t[i]/t[i+1]; 466 t[i+1]=t[i]; 467 } 468 } 469 for(int i=0;i<a-1;i++) 470 { 471 if(g[i]==2) 472 { 473 if(t[i]<t[i+1]) 474 { 475 g[i]=1; 476 } 477 } 478 } 479 for(int i=0;i<a-1;i++) 480 { 481 cout<<num[i]; 482 yunsuanfu(g[i]); 483 } 484 cout<<num[a-1]<<"="<<endl; 485 486 } 487 if(p==2) 488 { 489 int g[10],t[10]; 490 for(int i=0;i<a-1;i=i+2) 491 { 492 g[i]=1+rand()%3; 493 c=1+rand()%2; 494 if(c==1) 495 { 496 g[i+1]=4; 497 } 498 if(c==2) 499 { 500 g[i+1]=1+rand()%3; 501 } 502 } 503 for(int i=0;i<a;i++) 504 { 505 t[i]=num[i]; 506 } 507 for(int i=0;i<a-1;i++) 508 { 509 if(g[i]==3) 510 { 511 t[i]=t[i]*t[i+1]; 512 t[i+1]=t[i]; 513 } 514 if(g[i]==4) 515 { 516 t[i]=t[i]/t[i+1]; 517 t[i+1]=t[i]; 518 if((num[i]>num[i+1])&&(num[i]%num[i+1]!=0)) 519 { 520 num[i]=num[i]-num[i]%num[i+1]; 521 } 522 if((num[i]>num[i+1])&&(num[i]/num[i+1]==1)) 523 { 524 num[i]=num[i+1]; 525 } 526 if(num[i]<num[i+1]) 527 { 528 y=num[i]; 529 num[i]=num[i+1]; 530 num[i+1]=y; 531 num[i]=num[i]-num[i]%num[i+1]; 532 } 533 } 534 } 535 for(int i=0;i<a-1;i++) 536 { 537 if(g[i]==2) 538 { 539 if(t[i]<t[i+1]) 540 { 541 g[i]=1; 542 } 543 } 544 } 545 for(int i=0;i<a-1;i++) 546 { 547 cout<<num[i]; 548 yunsuanfu(g[i]); 549 } 550 cout<<num[a-1]<<"="<<endl; 551 552 } 553 554 } 555 if(m==2) 556 { 557 int g[10],t[10]; 558 for(int i=0;i<a-1;i++) 559 { 560 g[i]=1+rand()%2; 561 } 562 for(int i=0;i<a;i++) 563 { 564 t[i]=num[i]; 565 } 566 for(int i=0;i<a-1;i++) 567 { 568 if(g[i]==2) 569 { 570 if(t[i]<t[i+1]) 571 { 572 g[i]=1; 573 } 574 } 575 } 576 for(int i=0;i<a-1;i++) 577 { 578 cout<<num[i]; 579 yunsuanfu(g[i]); 580 } 581 cout<<num[a-1]<<"="<<endl; 582 } 583 } 584 } 585 } 586 } 587
实验要求:1、题目避免重复
2、可定制(数量/打印方式)
3、可以控制下列参数:
* 是否有乘除法
* 是否有括号(最多可以支持十个数参与计算)
* 数值范围
* 加减有无负数
* 除法有无余数
实验思路:本次实验我有两个功能未能完成,一个是题目避免重复,一个是带括号的计算,望老师能谅解
我用for循环语句来选择四则运算的数量;用min+rand()%max来确定数值范围;用if选择语句来选择打印方式、是否有乘除法、加减有无负数,除法有无余数;大体的实验框架:
选择数量和打印方式:
选择数值范围:
计算结果可以有负数
{
有乘除法
{
除法有余数;
除法没有余数;
}
没有乘除法
}
计算结果没有负数
{
有乘除法
{
除法有余数,加减无负数;
除法没有余数,加减无负数;
}
没有乘除法,加减无负数;
}
在写运算结果是否有负数时,在有乘除法的情况下,定义三个数组num[10],t[10],g[10];num[10]放操作数,num[10]=t[10],g[10]用来存放运算符,g[10]中分别用1,2,3,4,来表示+-*/,先计算乘除,将计算结果放入到t数组中,*或者/前面的t[i]和t[i+1]赋予结果,*,/计算完之后,计算+-,在计算减时,若减号前面的数小于减号后面的数,将减法变为加法
在编写除法是否有余数时,我避免了出现连除这种情况,也是用num[]来存放操作数,g[]来存放运算符,当遇到除法时,if((num[i]>num[i+1])&&(num[i]%num[i+1]!=0))
{ num[i]=num[i]-num[i]%num[i+1];
}
if((num[i]>num[i+1])&&(num[i]/num[i+1]==1))
{
num[i]=num[i+1];
}
if(num[i]<num[i+1])
{
y=num[i];
num[i]=num[i+1];
num[i+1]=y;
num[i]=num[i]-num[i]%num[i+1];
}
具体思路就是这些,本次实验我感觉有点难度,虽然花费很长时间,但是还是有功能没有实现,不过在写的过程中还是复习了很多以前的知识。