Advertisement
Cinder1986

15/5/c

Mar 13th, 2022
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <windows.h>
  3.  
  4. using namespace std;
  5.  
  6. const int maxSize = 16;
  7. const int maxVal = 32767;
  8.  
  9. int takeIntValue(int max, int min) {
  10. int length;
  11. bool isCorrect;
  12. do {
  13. isCorrect = true;
  14. try {
  15. cin >> length;
  16. if (cin.fail()) throw 1;
  17. if (length > max || length < min) throw 2;
  18. }
  19. catch (int exc) {
  20. if (exc == 1) {
  21. cin.clear();
  22. cin.ignore(32767, '\n');
  23. isCorrect = false;
  24. cout << "Введено недопустимое значение!";
  25. }
  26. else {
  27. isCorrect = false;
  28. cout << "Введено значение, выходящее за пределы!";
  29. }
  30. }
  31. } while (!isCorrect);
  32. return length;
  33. }
  34. bool checkContract(int num, int denom) {
  35. bool isContract = false;
  36. int i = 2;
  37. if (num > denom || (num < 0 && denom < 0))
  38. isContract = true;
  39. while (!isContract && i <= sqrt(denom)) {
  40. if (num % i == 0 && denom % i == 0)
  41. isContract = true;
  42. i++;
  43. }
  44. return isContract;
  45. }
  46. class fraction{
  47. protected:
  48. int numerator = 0;
  49. int denominator = 0;
  50. public:
  51. friend fraction operator + (fraction frac1, fraction frac2);
  52. friend fraction operator * (fraction frac1, fraction frac2);
  53. friend istream& operator >> (istream &cin, fraction &frac);
  54. friend ostream& operator << (ostream &cout, fraction frac);
  55. void contract() {
  56. if (numerator < 0 && denominator < 0) {
  57. numerator *= -1;
  58. denominator *= -1;
  59. }
  60. int i = 2;
  61. while (i <= sqrt(denominator)) {
  62. if (numerator % i == 0 && denominator % i == 0) {
  63. numerator /= i;
  64. denominator /= i;
  65. }
  66. i++;
  67. }
  68. }
  69. };
  70. istream& operator >> (istream &cin, fraction &frac) {
  71. bool isCorrect;
  72. do {
  73. isCorrect = true;
  74. cout << "Введите числитель: ";
  75. frac.numerator = takeIntValue(maxVal, -maxVal);
  76. cout << "Введите знаменатель: ";
  77. frac.denominator = takeIntValue(maxVal, -maxVal);
  78. if (checkContract(frac.numerator, frac.denominator)) {
  79. cout << "Дробь не соответствует условию!\n";
  80. isCorrect = false;
  81. }
  82. } while (!isCorrect);
  83. return cin;
  84. }
  85. ostream& operator << (ostream &cout, fraction frac) {
  86. cout << frac.numerator << "/" << frac.denominator;
  87. return cout;
  88. }
  89. fraction operator + (fraction frac1, fraction frac2) {
  90. if (frac1.denominator != frac2.denominator) {
  91. frac1.numerator *= frac2.denominator;
  92. frac2.numerator *= frac1.denominator;
  93. frac1.numerator += frac2.numerator;
  94. frac1.denominator *= frac2.denominator;
  95. }
  96. else {
  97. frac1.numerator += frac2.numerator;
  98. }
  99. frac1.contract();
  100. return frac1;
  101. }
  102. fraction operator * (fraction frac1, fraction frac2) {
  103. frac1.numerator *= frac2.numerator;
  104. frac1.denominator *= frac2.denominator;
  105. frac1.contract();
  106. return frac1;
  107. }
  108. int main() {
  109. SetConsoleOutputCP(1251);
  110. fraction fract1, fract2;
  111. cout << "Заполните первую дробь.\n";
  112. cin >> fract1;
  113. cout << "Заполните вторую дробь.\n";
  114. cin >> fract2;
  115. cout << "Сумма дробей равна " << fract1 + fract2 << endl;
  116. cout << "Произведение дробей равно " << fract1 * fract2;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement