Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <conio.h>
- #include <string>
- using namespace std;
- enum choice {
- ESC = 27,
- INCREASE = 42,
- COMBINE = 43,
- SUBTRACT = 45,
- DIVIDE = 47
- };
- struct rational {
- int numerator;
- int denominator;
- };
- typedef rational RATIONAL;
- void combine(const RATIONAL, const RATIONAL);
- void subtract(const RATIONAL, const RATIONAL);
- void increase(const RATIONAL, const RATIONAL);
- void divide(const RATIONAL, const RATIONAL);
- int nod(int, int);
- void reduce(RATIONAL &);
- void show(const RATIONAL, const RATIONAL, const RATIONAL, const string);
- int validint(const RATIONAL, const RATIONAL);
- char validchar();
- void err();
- void zero();
- void ui();
- void ru();
- int main() {
- ru();
- ui();
- return 0;
- }
- void reduce(RATIONAL & _rat) {
- int n = nod(_rat.numerator, _rat.denominator);
- if (n) {
- _rat.numerator /= n;
- _rat.denominator /= n;
- }
- }
- int nod(int _a, int _b) {
- int a = abs(_a);
- int b = abs(_b);
- if (!a && !b) a = 0;
- else while (b) b ^= a ^= b ^= a %= b;
- return a;
- }
- void combine(const RATIONAL _first, const RATIONAL _second) {
- RATIONAL result;
- result.numerator = _first.numerator * _second.denominator + _second.numerator * _first.denominator;
- result.denominator = _second.denominator * _first.denominator;
- reduce(result);
- if (result.denominator) show(_first, _second, result, " + ");
- else zero();
- }
- void subtract(const RATIONAL _first, const RATIONAL _second) {
- RATIONAL result;
- result.numerator = _first.numerator * _second.denominator - _second.numerator * _first.denominator;
- result.denominator = _second.denominator * _first.denominator;
- reduce(result);
- if (result.denominator) show(_first, _second, result, " - ");
- else zero();
- }
- void increase(const RATIONAL _first, const RATIONAL _second) {
- RATIONAL result;
- result.numerator = _first.numerator * _second.numerator;
- result.denominator = _first.denominator * _second.denominator;
- reduce(result);
- if (result.denominator) show(_first, _second, result, " * ");
- else zero();
- }
- void divide(const RATIONAL _first, const RATIONAL _second) {
- RATIONAL result;
- result.numerator = _first.numerator * _second.denominator;
- result.denominator = _first.denominator * _second.numerator;
- reduce(result);
- if (result.denominator) show(_first, _second, result, " / ");
- else zero();
- }
- void zero() { wcout << L"Ошибка! Попытка деления на ноль\n\a"; }
- void show(const RATIONAL _first, const RATIONAL _second, const RATIONAL _result, const string _op) {
- cout << _first.numerator << '/' << _first.denominator << _op
- << _second.numerator << '/' << _second.denominator << " = ";
- if ((_op == " * " && (!_first.numerator || !_second.numerator)) || !_first.numerator && !_second.numerator) cout << 0;
- else cout << _result.numerator << '/' << _result.denominator;
- cout << endl;
- }
- char validchar() {
- do {
- fflush(stdin);
- char op = cin.get();
- if (op == INCREASE || op == COMBINE || op == SUBTRACT || op == DIVIDE) return op;
- else err();
- } while (true);
- }
- int validint() {
- int num;
- do {
- cin >> num;
- if (cin.good()) return num;
- else err();
- } while (true);
- }
- void err() {
- cin.clear();
- cin.ignore(80,'\n');
- wcout << L"\a Ошибка! Повторите попытку: ";
- }
- void ui() {
- RATIONAL first, second;
- do {
- wcout << L"\nВведите числитель первой дроби: ";
- first.numerator = validint();
- wcout << L"Введите знаменатель первой дроби: ";
- first.denominator = validint();
- wcout << L"Введите арифметическую операцию: ";
- char choice = validchar();
- wcout << L"Введите числитель второй дроби: ";
- second.numerator = validint();
- wcout << L"Введите знаменатель второй дроби: ";
- second.denominator = validint();
- switch (choice) {
- case COMBINE: combine(first, second); break;
- case SUBTRACT: subtract(first, second); break;
- case INCREASE: increase(first, second); break;
- case DIVIDE: divide(first, second); break;
- }
- wcout << L"\nДля выхода нажмите клавишу ESC\nДля продолжения любую другую клавишу";
- fflush(stdin);
- if (ESC == _getch()) break;
- else cout << endl;
- } while (true);
- }
- void ru() {
- wcout.imbue(locale(".866"));
- wcin.imbue(locale(".866"));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement