设计思路:
本次实验在实验二的基础上完成,新增功能:判断结果是否正确。
使用结构体存储算式:
struct equation{ //定义结构体“算式”equation
double value; //值value,用于存算式的值
int num; //当前算式为num元运算
bool isFraction; //标记是否为分数
string shape; //形式shape,用于存算式形式
}Equation[9999];
主要函数:
void getRequirement():记录用户需求,即可定制(数量/打印方式)、是否有乘除法、是否有括号(最多可以支持十个数参与计算)、数值范围、加减有无负数、除法有无余数。
void CreateEquation():生成初始算式。这里生成二元运算,并随机决定算式是整数算式还是分数算式以及是否继续加长算式。
void MakeBrackets(equation*):加括号。随机增加运算符和运算数,随机决定是否继续加长算式。递归函数。
void Print():输出并评判结果。包括屏幕输出和文件输出。分数输出分行。对结果评判精度为10^-2。
void absoluteValue(int &numfirst, int &numsecond):绝对值。用来调整真分数。
代码:
1 //2016/03/06 2 //打印100以内四则运算式,包含真分数。 3 //2016/03/11 4 //新增:题目避免重复;可定制(数量/打印方式);可以控制以下参数: 5 //是否有乘除法;是否有括号(最多可以支持十个数参与计算);数值范围; 6 //加减有无负数;除法有无余数; 7 #include<iostream> 8 #include<fstream> 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include<string> 12 #include<random> 13 #include<cmath> 14 #include<ctime> 15 #include<conio.h> 16 #include<windows.h> 17 using namespace std; 18 19 int NUM_equation = 0; //打印数量 20 bool PrintToFile; //是否输出到文件 21 bool HasMultAndDivi; //是否有乘除法 22 bool HasBrackets; //是否有括号 23 bool HasNegative; //加减是否有负数 24 bool HasRemainder; //除法是否有余数 25 int MaxOfRange = 100; //数值范围上限 26 int MinOfRange = -100; //数值范围下限 27 28 //int NUM_equation = 20; //打印数量 29 //bool PrintToFile = false; //是否输出到文件 30 //bool HasMultAndDivi = true; //是否有乘除法 31 //bool HasBrackets = true; //是否有括号 32 //bool HasNegative = true; //加减是否有负数 33 //bool HasRemainder = true; //除法是否有余数 34 //int MaxOfRange = 100; //数值范围上限 35 //int MinOfRange = -100; //数值范围下限 36 default_random_engine generator; 37 uniform_int_distribution<int> distribution(MinOfRange, MaxOfRange); 38 struct equation{ //定义结构体“算式”equation 39 40 double value; //值value,用于存算式的值 41 int num; //当前算式为num元运算 42 bool isFraction; //标记是否为分数 43 string shape; //形式shape,用于存算式形式 44 }Equation[9999]; 45 46 void MakeBrackets(equation*); 47 48 void absoluteValue(int &numfirst, int &numsecond) 49 { 50 int tonumf; //第一个数的绝对值 51 int tonums; 52 int flag_1; 53 int flag_2; 54 int temp; 55 if (numfirst < 0) 56 { 57 tonumf = 0 - numfirst; 58 flag_1 = -1; 59 } 60 else 61 { 62 tonumf = numfirst; 63 flag_1 = 1; 64 } 65 if (numsecond < 0) 66 { 67 tonums = 0 - numsecond; 68 flag_2 = -1; 69 } 70 else 71 { 72 tonums = numsecond; 73 flag_2 = 1; 74 } 75 if (tonums < tonumf) 76 { 77 temp = tonumf; 78 tonumf = tonums; 79 tonums = temp; 80 } 81 int i; 82 for (i = tonumf; i > 0; i--) 83 { 84 if (tonumf%i == 0 && tonums%i == 0) 85 { 86 break; 87 } 88 } 89 if (i) 90 { 91 numfirst = tonumf / i; 92 numsecond = tonums / i; 93 } 94 else 95 { 96 numfirst = tonumf; 97 numsecond = tonums; 98 } 99 if (flag_1*flag_2 < 0) 100 { 101 numfirst = 0 - numfirst; 102 } 103 } 104 105 void getRequirement() //输入要求 106 { 107 string buffer; 108 bool flag_NUM_right = false; 109 do{ 110 cout << "请选择打印数量(1-9999整数):"; 111 cin >> buffer; 112 int i; 113 if (buffer.length() < 5) 114 { 115 for (i = 0; i < buffer.length(); i++) //判断是否为数字 116 { 117 if (buffer[i] < 48 || buffer[i]>57) 118 { 119 break; //不是数字则跳出 120 } 121 } 122 if (i == buffer.length()) //如果没有跳出(都是数字) 123 { 124 if (buffer[0] != '0') 125 { 126 for (i = 0; i < buffer.length(); i++) //字符转为整形 127 { 128 NUM_equation += (buffer[i] - 48)*pow(10, buffer.length() - 1 - i); 129 } 130 flag_NUM_right = true; 131 } 132 } 133 } 134 } while (!flag_NUM_right); 135 136 bool flag_Print_right = false; 137 do{ 138 cout << "请选择输出方式(1.屏幕/2.文件):"; 139 switch (getche()) 140 { 141 case 49: //'1' 142 PrintToFile = false; 143 flag_Print_right = true; 144 cout << endl; 145 break; 146 case 50: //'2' 147 PrintToFile = true; 148 flag_Print_right = true; 149 cout << endl; 150 break; 151 default: 152 cout << endl; 153 } 154 } while (!flag_Print_right); 155 156 bool flag_MultAndDivi_right = false; 157 do{ 158 cout << "请选择是否有乘除法(Y.有/N.无):"; 159 switch (getche()) 160 { 161 case 78: //'N' 162 HasMultAndDivi = false; 163 flag_MultAndDivi_right = true; 164 cout << endl; 165 break; 166 case 89: //'Y' 167 HasMultAndDivi = true; 168 flag_MultAndDivi_right = true; 169 cout << endl; 170 break; 171 default: 172 cout << endl; 173 } 174 } while (!flag_MultAndDivi_right); 175 176 177 bool flag_Brackets_right = false; 178 do{ 179 cout << "请选择是否有括号(Y.有/N.无):"; 180 switch (getche()) 181 { 182 case 78: //'N' 183 HasBrackets = false; 184 flag_Brackets_right = true; 185 cout << endl; 186 break; 187 case 89: //'Y' 188 HasBrackets = true; 189 flag_Brackets_right = true; 190 cout << endl; 191 break; 192 default: 193 cout << endl; 194 } 195 } while (!flag_Brackets_right); 196 ///////////////////////////////// 197 string bufferforRage; 198 bool flag_Rage_right = false; 199 bool isNegative; 200 MaxOfRange = 0; 201 MinOfRange = 0; 202 do{ 203 cout << "请规定数值范围(整数-99999~99999):上限为:"; 204 cin >> bufferforRage; 205 int i; 206 if (bufferforRage[0] == '-') //若可能为负数 207 { 208 if (bufferforRage.length() < 7) 209 { 210 for (i = 1; i < bufferforRage.length(); i++) //判断是否为数字 211 { 212 if (bufferforRage[i] < 48 || bufferforRage[i]>57) 213 { 214 break; //不是数字则跳出 215 } 216 } 217 if (i == bufferforRage.length()) //如果没有跳出(都是数字) 218 { 219 if (bufferforRage[0] != '0') 220 { 221 for (i = 1; i < bufferforRage.length(); i++) //字符转为整形 222 { 223 MaxOfRange -= (bufferforRage[i] - 48)*pow(10, bufferforRage.length() - i - 1); 224 } 225 flag_Rage_right = true; 226 } 227 } 228 } 229 } 230 if (bufferforRage[0] != '-') //若可能为正数 231 { 232 if (bufferforRage.length() < 6) 233 { 234 for (i = 0; i < bufferforRage.length(); i++) //判断是否为数字 235 { 236 if (bufferforRage[i] < 48 || bufferforRage[i]>57) 237 { 238 break; //不是数字则跳出 239 } 240 } 241 if (i == bufferforRage.length()) //如果没有跳出(都是数字) 242 { 243 if (bufferforRage[0] != '0') 244 { 245 for (i = 0; i < bufferforRage.length(); i++) //字符转为整形 246 { 247 MaxOfRange += (bufferforRage[i] - 48)*pow(10, bufferforRage.length() - 1 - i); 248 } 249 flag_Rage_right = true; 250 } 251 else 252 { 253 MaxOfRange = 0; 254 flag_Rage_right = true; 255 } 256 } 257 } 258 } 259 260 } while (!flag_Rage_right); 261 262 flag_Rage_right = false; 263 do{ 264 cout << "下限为:"; 265 cin >> bufferforRage; 266 int i; 267 if (bufferforRage[0] == '-') //若可能为负数 268 { 269 if (bufferforRage.length() < 7) 270 { 271 for (i = 1; i < bufferforRage.length(); i++) //判断是否为数字 272 { 273 if (bufferforRage[i] < 48 || bufferforRage[i]>57) 274 { 275 break; //不是数字则跳出 276 } 277 } 278 if (i == bufferforRage.length()) //如果没有跳出(都是数字) 279 { 280 if (bufferforRage[0] != '0') 281 { 282 for (i = 1; i < bufferforRage.length(); i++) //字符转为整形 283 { 284 MinOfRange -= (bufferforRage[i] - 48)*pow(10, bufferforRage.length() - i - 1); 285 } 286 if (MinOfRange < MaxOfRange) 287 { 288 flag_Rage_right = true; 289 } 290 else 291 { 292 MinOfRange = 0; 293 } 294 } 295 } 296 } 297 } 298 if (bufferforRage[0] != '-') //若可能为正数 299 { 300 if (bufferforRage.length() < 6) 301 { 302 for (i = 0; i < bufferforRage.length(); i++) //判断是否为数字 303 { 304 if (bufferforRage[i] < 48 || bufferforRage[i]>57) 305 { 306 break; //不是数字则跳出 307 } 308 } 309 if (i == bufferforRage.length()) //如果没有跳出(都是数字) 310 { 311 if (bufferforRage[0] != '0') 312 { 313 for (i = 0; i < bufferforRage.length(); i++) //字符转为整形 314 { 315 MinOfRange += (bufferforRage[i] - 48)*pow(10, bufferforRage.length() - 1 - i); 316 } 317 } 318 else 319 { 320 MinOfRange = 0; 321 } 322 if (MinOfRange < MaxOfRange) 323 { 324 flag_Rage_right = true; 325 } 326 else 327 { 328 MinOfRange = 0; 329 } 330 } 331 } 332 } 333 334 } while (!flag_Rage_right); 335 336 /////////////////////////////////// 337 338 339 bool flag_Negative_right = false; 340 do{ 341 cout << "请选择加减是否有负数(Y.有/N.无):"; 342 switch (getche()) 343 { 344 case 78: //'N' 345 HasNegative = false; 346 flag_Negative_right = true; 347 cout << endl; 348 break; 349 case 89: //'Y' 350 HasNegative = true; 351 flag_Negative_right = true; 352 cout << endl; 353 break; 354 default: 355 cout << endl; 356 } 357 } while (!flag_Negative_right); 358 359 if (HasMultAndDivi) 360 { 361 bool flag_Remainder_right = false; 362 do{ 363 cout << "请选择除法是否有余数(Y.有/N.无):"; 364 switch (getche()) 365 { 366 case 78: //'N' 367 HasRemainder = false; 368 flag_Remainder_right = true; 369 cout << endl; 370 break; 371 case 89: //'Y' 372 HasRemainder = true; 373 flag_Remainder_right = true; 374 cout << endl; 375 break; 376 default: 377 cout << endl; 378 } 379 } while (!flag_Remainder_right); 380 } 381 } 382 383 void CreateEquation() 384 { 385 default_random_engine generator; 386 uniform_int_distribution<int> distribution(MinOfRange, MaxOfRange); 387 for (int i = 0; i < NUM_equation; i++) 388 { 389 if (rand() % 2 == 0) 390 { 391 Equation[i].isFraction = false; 392 } 393 else 394 { 395 Equation[i].isFraction = true; 396 } 397 string middle; 398 char sign; //生成初始运算符 399 do 400 { 401 switch (rand() % 4) 402 { 403 case 0: 404 sign = '+'; 405 break; 406 case 1: 407 sign = '-'; 408 break; 409 case 2: 410 sign = '*'; 411 break; 412 case 3: 413 sign = '/'; 414 break; 415 } 416 } while ((sign == '/' || sign == '*') && !HasMultAndDivi); 417 bool wrong = false; 418 double value = 0; 419 do 420 { 421 wrong = false; 422 if (!Equation[i].isFraction) //生成运算数-整数 423 { 424 int numFormer; 425 int numLatter; 426 numFormer = distribution(generator); 427 do 428 { 429 numLatter = distribution(generator); 430 } while (numLatter == 0 && sign == '/'); 431 char strnumFormer[7] = { '0' }; 432 itoa(numFormer, strnumFormer, 10); 433 char strnumLatter[7] = { '0' }; 434 itoa(numLatter, strnumLatter, 10); 435 if (sign == '+' || sign == '-') //加减 436 { 437 if (HasNegative) 438 { 439 if (sign == '+') 440 { 441 value = (double)numFormer + (double)numLatter; 442 } 443 else 444 { 445 value = (double)numFormer - (double)numLatter; 446 } 447 if (value<MinOfRange || value>MaxOfRange) 448 { 449 wrong = true; 450 } 451 else 452 { 453 middle = strnumFormer; 454 middle = middle + sign; 455 if (numLatter < 0) 456 { 457 middle = middle + '(' + strnumLatter + ')'; 458 } 459 else 460 { 461 middle = middle + strnumLatter; 462 } 463 464 //Equation[i].shape = strnumFormer + sign; 465 //Equation[i].shape = Equation[i].shape + strnumLatter; 466 } 467 } 468 else 469 { 470 if (numFormer < 0 || numLatter < 0) 471 { 472 wrong = true; 473 } 474 else 475 { 476 if (sign == '+') 477 { 478 value = (double)numFormer + (double)numLatter; 479 } 480 else 481 { 482 value = (double)numFormer - (double)numLatter; 483 } 484 if (value<MinOfRange || value>MaxOfRange || value < 0) 485 { 486 wrong = true; 487 } 488 else 489 { 490 middle = strnumFormer; 491 middle = middle + sign; 492 middle = middle + strnumLatter; 493 //Equation[i].shape = strnumFormer + sign; 494 //Equation[i].shape = Equation[i].shape + strnumLatter; 495 } 496 } 497 } 498 } 499 else if (sign == '*') //乘 500 { 501 value = (double)numFormer*(double)numLatter; 502 if (value<MinOfRange || value>MaxOfRange) 503 { 504 wrong = true; 505 } 506 else 507 { 508 middle = strnumFormer; 509 middle = middle + sign; 510 if (numLatter < 0) 511 { 512 middle = middle + '(' + strnumLatter + ')'; 513 } 514 else 515 { 516 middle = middle + strnumLatter; 517 } 518 //Equation[i].shape = strnumFormer + sign; 519 //Equation[i].shape = Equation[i].shape + strnumLatter; 520 } 521 } 522 else //除 523 { 524 if (HasRemainder) 525 { 526 value = (double)numFormer / (double)numLatter; 527 if (value<MinOfRange || value>MaxOfRange) 528 { 529 wrong = true; 530 } 531 else 532 { 533 middle = strnumFormer; 534 middle = middle + sign; 535 if (numLatter < 0) 536 { 537 middle = middle + '(' + strnumLatter + ')'; 538 } 539 else 540 { 541 middle = middle + strnumLatter; 542 } 543 //Equation[i].shape = strnumFormer + sign; 544 //Equation[i].shape = Equation[i].shape + strnumLatter; 545 } 546 } 547 else 548 { 549 if (numFormer%numLatter != 0) 550 { 551 wrong = true; 552 } 553 else 554 { 555 value = (double)numFormer / (double)numLatter; 556 if (value<MinOfRange || value>MaxOfRange) 557 { 558 wrong = true; 559 } 560 else 561 { 562 middle = strnumFormer; 563 middle = middle + sign; 564 if (numLatter < 0) 565 { 566 middle = middle + '(' + strnumLatter + ')'; 567 } 568 else 569 { 570 middle = middle + strnumLatter; 571 } 572 //Equation[i].shape = strnumFormer + sign; 573 //Equation[i].shape = Equation[i].shape + strnumLatter; 574 } 575 } 576 } 577 } 578 } 579 else //生成运算数-分数 580 { 581 int NumeratorFormer; 582 int NumeratorLatter; 583 int DenominatorFormer; 584 int DenominatorLatter; 585 do 586 { 587 NumeratorFormer = distribution(generator); 588 } while (NumeratorFormer == 0); 589 do 590 { 591 DenominatorFormer = distribution(generator); 592 } while (DenominatorFormer == 0 || DenominatorFormer == NumeratorFormer); 593 absoluteValue(NumeratorFormer, DenominatorFormer); 594 do 595 { 596 NumeratorLatter = distribution(generator); 597 } while (NumeratorLatter == 0); 598 do 599 { 600 DenominatorLatter = distribution(generator); 601 } while (DenominatorLatter == 0 || DenominatorLatter == NumeratorLatter); 602 absoluteValue(NumeratorLatter, DenominatorLatter); 603 char strNF[7]; 604 itoa(NumeratorFormer, strNF, 10); 605 char strDF[7]; 606 itoa(DenominatorFormer, strDF, 10); 607 char strNL[7]; 608 itoa(NumeratorLatter, strNL, 10); 609 char strDL[7]; 610 itoa(DenominatorLatter, strDL, 10); 611 if (sign == '+' || sign == '-') //加减 612 { 613 if (HasNegative) 614 { 615 if (sign == '+') 616 { 617 value = (double)NumeratorFormer / (double)DenominatorFormer + (double)NumeratorLatter / (double)DenominatorLatter; 618 } 619 else 620 { 621 value = (double)NumeratorFormer / (double)DenominatorFormer - (double)NumeratorLatter / (double)DenominatorLatter; 622 } 623 if (value<MinOfRange || value>MaxOfRange) 624 { 625 wrong = true; 626 } 627 else 628 { 629 middle = strNF; 630 middle = middle + 'd'; 631 middle = middle + strDF; 632 middle = middle + sign; 633 middle = middle + strNL; 634 middle = middle + 'd'; 635 middle = middle + strDL; 636 //Equation[i].shape = strNF + 'd'; 637 //Equation[i].shape = Equation[i].shape + strDF + sign + strNL + 'd' + strDL; 638 } 639 } 640 else 641 { 642 if (NumeratorFormer < 0 || NumeratorLatter < 0) 643 { 644 wrong = true; 645 } 646 else 647 { 648 if (sign == '+') 649 { 650 value = (double)NumeratorFormer / (double)DenominatorFormer + (double)NumeratorLatter / (double)DenominatorLatter; 651 } 652 else 653 { 654 value = (double)NumeratorFormer / (double)DenominatorFormer - (double)NumeratorLatter / (double)DenominatorLatter; 655 } 656 if (value<MinOfRange || value>MaxOfRange || value<0) 657 { 658 wrong = true; 659 } 660 else 661 { 662 middle = strNF; 663 middle = middle + 'd'; 664 middle = middle + strDF; 665 middle = middle + sign; 666 middle = middle + strNL; 667 middle = middle + 'd'; 668 middle = middle + strDL; 669 //Equation[i].shape = strNF + 'd'; 670 //Equation[i].shape = Equation[i].shape + strDF + sign + strNL + 'd' + strDL; 671 } 672 } 673 } 674 } 675 else //乘除 676 { 677 if (sign == '*') 678 { 679 value = ((double)NumeratorFormer / (double)DenominatorFormer) * ((double)NumeratorLatter / (double)DenominatorLatter); 680 } 681 else 682 { 683 value = ((double)NumeratorFormer / (double)DenominatorFormer) / ((double)NumeratorLatter / (double)DenominatorLatter); 684 } 685 if (value<MinOfRange || value>MaxOfRange) 686 { 687 wrong = true; 688 } 689 else 690 { 691 middle = strNF; 692 middle = middle + 'd'; 693 middle = middle + strDF; 694 middle = middle + sign; 695 middle = middle + strNL; 696 middle = middle + 'd'; 697 middle = middle + strDL; 698 //Equation[i].shape = strNF + 'd'; 699 //Equation[i].shape = Equation[i].shape + strDF + sign + strNL + 'd' + strDL; 700 } 701 } 702 } 703 } while (wrong); 704 Equation[i].shape = middle; 705 Equation[i].value = value; 706 Equation[i].num = 2; 707 if (HasBrackets) 708 { 709 if (rand() % 5 != 0) 710 { 711 712 Equation[i].shape = '(' + Equation[i].shape + ')'; 713 equation *E = &Equation[i]; 714 MakeBrackets(E); 715 716 } 717 } 718 for (int v = 0; v < i; v++) 719 { 720 if (Equation[i].shape == Equation[v].shape) 721 { 722 Equation[i].shape = ""; 723 Equation[i].value = 0; 724 Equation[i].num = 0; 725 i = i - 1; 726 break; 727 } 728 729 } 730 //cout << Equation[i].shape << endl;/////////////////////////////////////////////////////// 731 } 732 } 733 734 void MakeBrackets(equation *thisEquation) //加括号 735 { 736 737 bool wrong = false; 738 double value=0; 739 string interForShape=""; 740 do{ 741 interForShape = (*thisEquation).shape; 742 wrong = false; 743 if ((*thisEquation).isFraction) //若为分数运算 744 { 745 int numerator; 746 int denominator; 747 do{ 748 numerator = distribution(generator); 749 } while (numerator == 0); 750 do{ 751 denominator = distribution(generator); 752 } while (denominator == 0 || denominator == numerator); 753 absoluteValue(numerator, denominator); 754 /*if (numerator > denominator) 755 { 756 int tem; 757 tem = numerator; 758 numerator = denominator; 759 denominator = tem; 760 }*/ 761 char strNumerator[7]; 762 char strDenominator[7]; 763 itoa(numerator, strNumerator, 10); 764 itoa(denominator, strDenominator, 10); 765 switch (rand() % 8) 766 { 767 case 0: 768 if (HasNegative) 769 { 770 value = (*thisEquation).value + (double)numerator / (double)denominator; 771 if (value > MaxOfRange || value < MinOfRange) 772 { 773 wrong = true; 774 break; 775 } 776 interForShape = '+' + interForShape; 777 interForShape = strDenominator + interForShape; 778 interForShape = 'd' + interForShape; 779 interForShape = strNumerator + interForShape; 780 } 781 else 782 { 783 if (numerator > 0 && denominator > 0) 784 { 785 value = (*thisEquation).value + (double)numerator / (double)denominator; 786 if (value > MaxOfRange || value < MinOfRange || value < 0) 787 { 788 wrong = true; 789 break; 790 } 791 interForShape = '+' + interForShape; 792 interForShape = strDenominator + interForShape; 793 interForShape = 'd' + interForShape; 794 interForShape = strNumerator + interForShape; 795 } 796 else 797 { 798 wrong = true; 799 break; 800 } 801 } 802 break; 803 case 1: 804 if (HasNegative) 805 { 806 value = (*thisEquation).value + (double)numerator / (double)denominator; 807 if (value > MaxOfRange || value < MinOfRange) 808 { 809 wrong = true; 810 break; 811 } 812 interForShape = interForShape + '+'; 813 interForShape = interForShape + strNumerator; 814 interForShape = interForShape + 'd'; 815 interForShape = interForShape + strDenominator; 816 } 817 else 818 { 819 if (numerator > 0 && denominator > 0) 820 { 821 value = (*thisEquation).value + (double)numerator / (double)denominator; 822 if (value > MaxOfRange || value < MinOfRange || value < 0) 823 { 824 wrong = true; 825 break; 826 } 827 interForShape = interForShape + '+'; 828 interForShape = interForShape + strNumerator; 829 interForShape = interForShape + 'd'; 830 interForShape = interForShape + strDenominator; 831 } 832 else 833 { 834 wrong = true; 835 break; 836 } 837 } 838 break; 839 case 2: 840 if (HasNegative) 841 { 842 value = (double)numerator / (double)denominator - (*thisEquation).value; 843 if (value > MaxOfRange || value < MinOfRange) 844 { 845 wrong = true; 846 break; 847 } 848 interForShape = '-' + interForShape; 849 interForShape = strDenominator + interForShape; 850 interForShape = 'd' + interForShape; 851 interForShape = strNumerator + interForShape; 852 } 853 else 854 { 855 if (numerator > 0 && denominator > 0) 856 { 857 value = (double)numerator / (double)denominator - (*thisEquation).value; 858 if (value > MaxOfRange || value < MinOfRange || value < 0) 859 { 860 wrong = true; 861 break; 862 } 863 interForShape = '-' + interForShape; 864 interForShape = strDenominator + interForShape; 865 interForShape = 'd' + interForShape; 866 interForShape = strNumerator + interForShape; 867 } 868 else 869 { 870 wrong = true; 871 break; 872 } 873 } 874 break; 875 case 3: 876 if (HasNegative) 877 { 878 value = (*thisEquation).value - (double)numerator / (double)denominator; 879 if (value > MaxOfRange || value < MinOfRange) 880 { 881 wrong = true; 882 break; 883 } 884 interForShape = interForShape + '-'; 885 interForShape = interForShape + strNumerator; 886 interForShape = interForShape + 'd'; 887 interForShape = interForShape + strDenominator; 888 } 889 else 890 { 891 if (numerator > 0 && denominator > 0) 892 { 893 value = (double)numerator / (double)denominator - (*thisEquation).value; 894 if (value > MaxOfRange || value < MinOfRange || value < 0) 895 { 896 wrong = true; 897 break; 898 } 899 interForShape = interForShape + '-'; 900 interForShape = interForShape + strNumerator; 901 interForShape = interForShape + 'd'; 902 interForShape = interForShape + strDenominator; 903 } 904 else 905 { 906 wrong = true; 907 break; 908 } 909 } 910 break; 911 case 4: 912 if (HasMultAndDivi) 913 { 914 value = (double)numerator / (double)denominator * (*thisEquation).value; 915 if (value > MaxOfRange || value < MinOfRange) 916 { 917 wrong = true; 918 break; 919 } 920 interForShape = '*' + interForShape; 921 interForShape = strDenominator + interForShape; 922 interForShape = 'd' + interForShape; 923 interForShape = strNumerator + interForShape; 924 } 925 else 926 { 927 wrong = true; 928 } 929 break; 930 case 5: 931 if (HasMultAndDivi) 932 { 933 value = (*thisEquation).value * (double)numerator / (double)denominator; 934 if (value > MaxOfRange || value < MinOfRange) 935 { 936 wrong = true; 937 break; 938 } 939 interForShape = interForShape + '*'; 940 interForShape = interForShape + strNumerator; 941 interForShape = interForShape + 'd'; 942 interForShape = interForShape + strDenominator; 943 } 944 else 945 { 946 wrong = true; 947 } 948 break; 949 case 6: 950 if (HasMultAndDivi) 951 { 952 value = (double)numerator / (double)denominator / (*thisEquation).value; 953 if (value > MaxOfRange || value < MinOfRange) 954 { 955 wrong = true; 956 break; 957 } 958 interForShape = '/' + interForShape; 959 interForShape = strDenominator + interForShape; 960 interForShape = 'd' + interForShape; 961 interForShape = strNumerator + interForShape; 962 } 963 else 964 { 965 wrong = true; 966 } 967 break; 968 case 7: 969 if (HasMultAndDivi) 970 { 971 value = (*thisEquation).value / ((double)numerator / (double)denominator); 972 if (value > MaxOfRange || value < MinOfRange) 973 { 974 wrong = true; 975 break; 976 } 977 interForShape = interForShape + '/'; 978 interForShape = interForShape + strNumerator; 979 interForShape = interForShape + 'd'; 980 interForShape = interForShape + strDenominator; 981 } 982 else 983 { 984 wrong = true; 985 } 986 break; 987 } 988 } 989 else //若为整数运算 990 { 991 int integer; 992 integer = distribution(generator); 993 char strInteger[7]; 994 itoa(integer, strInteger, 10); 995 switch (rand() % 8) 996 { 997 case 0: 998 if (HasNegative) 999 { 1000 value = (*thisEquation).value + (double)integer; 1001 if (value > MaxOfRange || value < MinOfRange) 1002 { 1003 wrong = true; 1004 break; 1005 } 1006 interForShape = '+' + interForShape; 1007 if (integer < 0) 1008 { 1009 //interForShape = '(' + strInteger + ')' + interForShape; 1010 interForShape = ')' + interForShape; 1011 interForShape = strInteger + interForShape; 1012 interForShape = '(' + interForShape; 1013 } 1014 else 1015 { 1016 interForShape = strInteger + interForShape; 1017 } 1018 } 1019 else 1020 { 1021 if (integer > 0) 1022 { 1023 value = (*thisEquation).value + (double)integer; 1024 if (value > MaxOfRange || value < MinOfRange || value < 0) 1025 { 1026 wrong = true; 1027 break; 1028 } 1029 interForShape = '+' + interForShape; 1030 interForShape = strInteger + interForShape; 1031 } 1032 else 1033 { 1034 wrong = true; 1035 break; 1036 } 1037 } 1038 break; 1039 case 1: 1040 if (HasNegative) 1041 { 1042 value = (*thisEquation).value + (double)integer; 1043 if (value > MaxOfRange || value < MinOfRange) 1044 { 1045 wrong = true; 1046 break; 1047 } 1048 interForShape = interForShape + '+'; 1049 if (integer < 0) 1050 { 1051 //interForShape = interForShape + '(' + strInteger + ')'; 1052 interForShape = interForShape + '('; 1053 interForShape = interForShape + strInteger; 1054 interForShape = interForShape + ')'; 1055 } 1056 else 1057 { 1058 interForShape = interForShape + strInteger; 1059 } 1060 } 1061 else 1062 { 1063 if (integer > 0) 1064 { 1065 value = (*thisEquation).value + (double)integer; 1066 if (value > MaxOfRange || value < MinOfRange || value < 0) 1067 { 1068 wrong = true; 1069 break; 1070 } 1071 interForShape = interForShape + '+'; 1072 interForShape = interForShape + strInteger; 1073 } 1074 else 1075 { 1076 wrong = true; 1077 break; 1078 } 1079 } 1080 break; 1081 case 2: 1082 if (HasNegative) 1083 { 1084 value = (double)integer - (*thisEquation).value; 1085 if (value > MaxOfRange || value < MinOfRange) 1086 { 1087 wrong = true; 1088 break; 1089 } 1090 interForShape = '-' + interForShape; 1091 if (integer < 0) 1092 { 1093 //interForShape = '(' + strInteger + ')' + interForShape; 1094 interForShape = ')' + interForShape; 1095 interForShape = strInteger + interForShape; 1096 interForShape = '(' + interForShape; 1097 } 1098 else 1099 { 1100 interForShape = strInteger + interForShape; 1101 } 1102 } 1103 else 1104 { 1105 if (integer > 0) 1106 { 1107 value = (double)integer - (*thisEquation).value; 1108 if (value > MaxOfRange || value < MinOfRange || value < 0) 1109 { 1110 wrong = true; 1111 break; 1112 } 1113 interForShape = '-' + interForShape; 1114 interForShape = strInteger + interForShape; 1115 } 1116 else 1117 { 1118 wrong = true; 1119 break; 1120 } 1121 } 1122 break; 1123 case 3: 1124 if (HasNegative) 1125 { 1126 value = (*thisEquation).value - (double)integer; 1127 if (value > MaxOfRange || value < MinOfRange) 1128 { 1129 wrong = true; 1130 break; 1131 } 1132 interForShape = interForShape + '-'; 1133 if (integer < 0) 1134 { 1135 //interForShape = interForShape + '(' + strInteger + ')'; 1136 interForShape = interForShape + '('; 1137 interForShape = interForShape + strInteger; 1138 interForShape = interForShape + ')'; 1139 } 1140 else 1141 { 1142 interForShape = interForShape + strInteger; 1143 } 1144 } 1145 else 1146 { 1147 if (integer > 0) 1148 { 1149 value = (*thisEquation).value - (double)integer; 1150 if (value > MaxOfRange || value < MinOfRange || value < 0) 1151 { 1152 wrong = true; 1153 break; 1154 } 1155 interForShape = interForShape + '-'; 1156 interForShape = interForShape + strInteger; 1157 } 1158 else 1159 { 1160 wrong = true; 1161 break; 1162 } 1163 } 1164 break; 1165 case 4: 1166 if (HasMultAndDivi) 1167 { 1168 value = (double)integer * (*thisEquation).value; 1169 if (value > MaxOfRange || value < MinOfRange) 1170 { 1171 wrong = true; 1172 break; 1173 } 1174 interForShape = '*' + interForShape; 1175 if (integer < 0) 1176 { 1177 //interForShape = '(' + strInteger + ')' + interForShape; 1178 interForShape = ')' + interForShape; 1179 interForShape = strInteger + interForShape; 1180 interForShape = '(' + interForShape; 1181 } 1182 else 1183 { 1184 interForShape = strInteger + interForShape; 1185 } 1186 } 1187 else 1188 { 1189 wrong = true; 1190 } 1191 break; 1192 case 5: 1193 if (HasMultAndDivi) 1194 { 1195 value = (*thisEquation).value * (double)integer; 1196 if (value > MaxOfRange || value < MinOfRange) 1197 { 1198 wrong = true; 1199 break; 1200 } 1201 interForShape = interForShape + '*'; 1202 if (integer < 0) 1203 { 1204 //interForShape = interForShape + '(' + strInteger + ')'; 1205 interForShape = interForShape + '('; 1206 interForShape = interForShape + strInteger; 1207 interForShape = interForShape + ')'; 1208 } 1209 else 1210 { 1211 interForShape = interForShape + strInteger; 1212 } 1213 } 1214 else 1215 { 1216 wrong = true; 1217 } 1218 break; 1219 case 6: 1220 if (HasMultAndDivi) 1221 { 1222 if ((*thisEquation).value<1E-7&&(*thisEquation).value>-(1E-7)) //若除数为0 1223 { 1224 wrong = true; 1225 break; 1226 } 1227 if (HasRemainder) 1228 { 1229 value = (double)integer / (*thisEquation).value; 1230 if (value > MaxOfRange || value < MinOfRange) 1231 { 1232 wrong = true; 1233 break; 1234 } 1235 interForShape = '/' + interForShape; 1236 if (integer < 0) 1237 { 1238 //interForShape = '(' + strInteger + ')' + interForShape; 1239 interForShape = ')' + interForShape; 1240 interForShape = strInteger + interForShape; 1241 interForShape = '(' + interForShape; 1242 } 1243 else 1244 { 1245 interForShape = strInteger + interForShape; 1246 } 1247 } 1248 else 1249 { 1250 if ((*thisEquation).value - int((*thisEquation).value) > 1E-7 || (*thisEquation).value - int((*thisEquation).value) < -(1E-7)) 1251 { 1252 wrong = true; 1253 break; 1254 } 1255 if (integer%int((*thisEquation).value) > 1E-7 || integer%int((*thisEquation).value) < -(1E-7)) 1256 { 1257 wrong = true; 1258 break; 1259 } 1260 else 1261 {//// 1262 value = (double)integer / (*thisEquation).value; 1263 if (value > MaxOfRange || value < MinOfRange) 1264 { 1265 wrong = true; 1266 break; 1267 } 1268 interForShape = '/' + interForShape; 1269 if (integer < 0) 1270 { 1271 //interForShape = '(' + strInteger + ')' + interForShape; 1272 interForShape = ')' + interForShape; 1273 interForShape = strInteger + interForShape; 1274 interForShape = '(' + interForShape; 1275 } 1276 else 1277 { 1278 interForShape = strInteger + interForShape; 1279 } 1280 } 1281 } 1282 } 1283 else 1284 { 1285 wrong = true; 1286 } 1287 break; 1288 case 7: 1289 if (HasMultAndDivi) 1290 { 1291 if (0 == integer) //若除数为0 1292 { 1293 wrong = true; 1294 break; 1295 } 1296 if (HasRemainder) 1297 { 1298 value = (*thisEquation).value / (double)integer; 1299 if (value > MaxOfRange || value < MinOfRange) 1300 { 1301 wrong = true; 1302 break; 1303 } 1304 interForShape = interForShape + '/'; 1305 if (integer < 0) 1306 { 1307 //interForShape = interForShape + '(' + strInteger + ')'; 1308 interForShape = interForShape + '('; 1309 interForShape = interForShape + strInteger; 1310 interForShape = interForShape + ')'; 1311 } 1312 else 1313 { 1314 interForShape = interForShape + strInteger; 1315 } 1316 } 1317 else 1318 { 1319 if ((*thisEquation).value - int((*thisEquation).value) > 1E-7 || (*thisEquation).value - int((*thisEquation).value) < -(1E-7)) 1320 { 1321 wrong = true; 1322 break; 1323 } 1324 if ((int((*thisEquation).value)) % integer > 1E-7 || (int((*thisEquation).value)) % integer < -(1E-7)) 1325 { 1326 wrong = true; 1327 break; 1328 } 1329 else 1330 {//// 1331 value = (*thisEquation).value / (double)integer; 1332 if (value > MaxOfRange || value < MinOfRange) 1333 { 1334 wrong = true; 1335 break; 1336 } 1337 interForShape = interForShape + '/'; 1338 if (integer < 0) 1339 { 1340 //interForShape = interForShape + '(' + strInteger + ')'; 1341 interForShape = interForShape + '('; 1342 interForShape = interForShape + strInteger; 1343 interForShape = interForShape + ')'; 1344 } 1345 else 1346 { 1347 interForShape = interForShape + strInteger; 1348 } 1349 1350 } 1351 } 1352 } 1353 else 1354 { 1355 wrong = true; 1356 } 1357 break; 1358 } 1359 } 1360 } while (wrong); 1361 (*thisEquation).shape = interForShape; 1362 (*thisEquation).value = value; 1363 (*thisEquation).num += 1; 1364 if (rand() % 2 > 0 && (*thisEquation).num < 10) 1365 { 1366 (*thisEquation).shape = '(' + (*thisEquation).shape + ')'; 1367 MakeBrackets(thisEquation); 1368 } 1369 } 1370 1371 void Print() 1372 { 1373 int totalR=0; 1374 ofstream ofile; 1375 ofile.open("print.txt"); 1376 for (int i = 0; i < NUM_equation; i++) 1377 { 1378 if (Equation[i].isFraction) 1379 { 1380 string line1 = ""; 1381 string line2 = ""; 1382 string line3 = ""; 1383 bool Fin_Negative = false; 1384 bool Fin_Numerator = false; 1385 bool Fin_Denominator = false; 1386 int NumNumerator = 0; 1387 int NumDenominator = 0; 1388 for (int j = 0;j<Equation[i].shape.length(); j++) 1389 { 1390 if ((Equation[i].shape[j]<48 || Equation[i].shape[j]>57) && Equation[i].shape[j] != 'd'&& Equation[i].shape[j] != '-') 1391 { 1392 Fin_Denominator = true; 1393 Fin_Numerator = false; 1394 line1 = line1 + " "; 1395 line2 = line2 + ' '+ Equation[i].shape[j] + ' '; 1396 line3 = line3 + " "; 1397 } 1398 else if (Equation[i].shape[j] == '-') 1399 { 1400 if (j != 0 && (Equation[i].shape[j - 1] == '-' || Equation[i].shape[j - 1] == '+' || Equation[i].shape[j - 1] == '*' || Equation[i].shape[j - 1] == '/')) 1401 { 1402 line1 = line1 + '-'; 1403 line2 = line2 + '-'; 1404 line3 = line3 + ' '; 1405 } 1406 else 1407 { 1408 1409 Fin_Denominator = true; 1410 Fin_Numerator = false; 1411 1412 line1 = line1 + " "; 1413 line2 = line2 + " - "; 1414 line3 = line3 + " "; 1415 } 1416 } 1417 else if (Equation[i].shape[j] == 'd') 1418 { 1419 Fin_Numerator = true; 1420 Fin_Denominator = false; 1421 for (int k = 1;; k++) 1422 { 1423 //if ((Equation[i].shape[j + k]==NULL)||(Equation[i].shape[j + k] < 48 || Equation[i].shape[j + k] > 57)) 1424 if ((j + k) > Equation[i].shape.length() || (Equation[i].shape[j + k] < 48 || Equation[i].shape[j + k] > 57)) 1425 { 1426 NumDenominator = k - 1; 1427 break; 1428 } 1429 } 1430 for (int h = 1;; h++) 1431 { 1432 if ((j - h < 0) || (Equation[i].shape[j - h] < 48 || Equation[i].shape[j - h] > 57)) 1433 { 1434 NumNumerator = h - 1; 1435 break; 1436 } 1437 } 1438 if (NumNumerator > NumDenominator) 1439 { 1440 for (int n = 0; n < NumNumerator - NumDenominator; n++) 1441 { 1442 line3 = line3 + ' '; 1443 } 1444 for (int n = 0; n < NumNumerator; n++) 1445 { 1446 line2 = line2 + '-'; 1447 } 1448 } 1449 if (NumDenominator > NumNumerator) 1450 { 1451 for (int n = 0; n < NumDenominator - NumNumerator; n++) 1452 { 1453 line1 = line1 + ' '; 1454 } 1455 for (int n = 0; n < NumDenominator; n++) 1456 { 1457 line2 = line2 + '-'; 1458 } 1459 } 1460 else 1461 { 1462 for (int n = 0; n < NumDenominator; n++) 1463 { 1464 line2 = line2 + '-'; 1465 } 1466 } 1467 } 1468 else 1469 { 1470 if (!Fin_Numerator) 1471 { 1472 line1 = line1 + Equation[i].shape[j]; 1473 } 1474 else if (!Fin_Denominator) 1475 { 1476 line3 = line3 + Equation[i].shape[j]; 1477 } 1478 } 1479 } 1480 if (PrintToFile) 1481 { 1482 ofile << line1 << endl << line2 << endl << line3 << endl << endl; 1483 } 1484 //else 1485 //{ 1486 cout << line1 << endl << line2 << endl << line3 << endl << endl; 1487 //} 1488 1489 } 1490 else 1491 { 1492 if (PrintToFile) 1493 { 1494 ofile << Equation[i].shape << endl << endl; 1495 } 1496 //else 1497 //{ 1498 cout << Equation[i].shape << endl << endl; 1499 //} 1500 } 1501 string buffer; 1502 bool Result_Right = true; 1503 int NumofDiv=0; 1504 int Numofdot = 0; 1505 int SpaceofDiv; 1506 cout << "结果:"; 1507 cin >> buffer; 1508 if (!buffer.empty()) 1509 { 1510 for (int m = 0; m < buffer.length(); m++) 1511 { 1512 if ((buffer[m] < 48 || buffer[m]>57) && buffer[m] != '/'&& buffer[m] != '.'&&buffer[m]=='-') 1513 { 1514 Result_Right = false; 1515 break; 1516 } 1517 if (buffer[m] == '/') 1518 { 1519 NumofDiv += 1; 1520 if (NumofDiv > 1) 1521 { 1522 Result_Right = false; 1523 break; 1524 } 1525 SpaceofDiv = m; 1526 } 1527 if (buffer[m] == '.') 1528 { 1529 Numofdot += 1; 1530 if (Numofdot > 1) 1531 { 1532 Result_Right = false; 1533 break; 1534 } 1535 } 1536 } 1537 if (Result_Right) 1538 { 1539 double result; 1540 if (NumofDiv == 1) 1541 { 1542 string strfor=buffer.substr(0,SpaceofDiv); 1543 string strlat = buffer.substr(SpaceofDiv+1,buffer.length()-SpaceofDiv-1); 1544 double former = atof(strfor.c_str()); 1545 double latter = atof(strlat.c_str()); 1546 if ((latter - 0) < 1E-7 && (latter - 0) > (-1E-7)) 1547 { 1548 Result_Right = false; 1549 break; 1550 } 1551 result = former / latter; 1552 } 1553 else 1554 { 1555 result = atof(buffer.c_str()); 1556 } 1557 if ((result - Equation[i].value) < 1E-2 && (result - Equation[i].value) > -(1E-2)) 1558 { 1559 Result_Right = true; 1560 } 1561 else 1562 { 1563 Result_Right = false; 1564 } 1565 } 1566 if (Result_Right) 1567 { 1568 cout << "正确!" << endl << endl; 1569 totalR += 1; 1570 } 1571 else 1572 { 1573 cout << "错误!" << endl << endl; 1574 } 1575 } 1576 else 1577 { 1578 cout << "错误!" << endl << endl; 1579 } 1580 } 1581 ofile.close(); 1582 cout << "共" << NUM_equation << "道题,其中答对了" << totalR << "道题。" << endl; 1583 } 1584 1585 int main() 1586 { 1587 system("mode con: cols=120 lines=40"); 1588 srand(time(0)); 1589 getRequirement(); 1590 CreateEquation(); 1591 Print(); 1592 return 0; 1593 }
截图:
此次结对编程合作者是同班的李娜(20132985),链接:
http://www.cnblogs.com/linanil/p/5296597.html
项目计划总结:
日期&&任务 | 听课 | 编写程序 | 阅读相关书籍 | 网上查资料 | 日总计 |
周一 | 2 | 3 | 5 | ||
周二 | 1 | 1 | |||
周三 | 1 | 1 | |||
周四 | 2 | 2 | |||
周五 | 3 | 1 | 4 | ||
周六 | 10 | 2 | 12 | ||
周日 | 2 | 2 | |||
周总计 | 4 | 16 | 3 | 4 | 27 |
时间纪录日志:
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3/14 | 14:00 | 15:00 | 10 | 100 | 听课 | 软件工程 |
16:00 | 20:00 | 60 | 180 | 继续上周的代码 | 二柱子02 | |
3/16 | 15:00 | 21:00 | 120 | 240 |
继续上周代码、 二柱子03代构思 |
|
3/17 | 14:00 | 15:00 | 10 | 100 | 听课 | 软件工程 |
20:00 | 22:00 | 60 | 60 | 写代码、吃东西 | ||
3/18 | 19:00 | 22:00 | 60 | 240 | 写代码 | |
3/19 | 9:00 | 22:00 | 120 | 180 | 写博客、改程序、测试 |
缺陷记录日志:
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3/16 | 1 | 字符溢出 | 不能一起加,要分开加 | 120min | ||
3/18 | 3 | 重复定义 | 修改定义 | 10min |