diff --git a/meson.build b/meson.build index 6fcaab6..197a617 100644 --- a/meson.build +++ b/meson.build @@ -19,3 +19,5 @@ c_2_lab_1_arg = executable( c_2_lab_2 = executable('c_2_lab_2', 'src/chapter_2/lab_2/main.cpp', install: true) c_2_lab_3 = executable('c_2_lab_3', 'src/chapter_2/lab_3/main.cpp', install: true) c_2_program_1 = executable('c_2_program_1', 'src/chapter_2/program_1/main.cpp', install: true) + +c_3_lab_1 = executable('c_3_lab_1', 'src/chapter_3/lab_1/main.cpp', install: true) diff --git a/src/chapter_3/lab_1/main.cpp b/src/chapter_3/lab_1/main.cpp new file mode 100644 index 0000000..7ea24ce --- /dev/null +++ b/src/chapter_3/lab_1/main.cpp @@ -0,0 +1,172 @@ +#include + +using namespace std; + +// Rational Class declaration +class Rational { +private: + int numerator; + int denominator; + +public: + Rational(int numerator = 0, int denominator = 1); + Rational add(const Rational &) const; + Rational subtract(const Rational &) const; + Rational multiply(const Rational &) const; + Rational divide(const Rational &) const; + void simplify(); + void display() const; + +private: + int gcd(int, int) const; +}; + +// Implement Rational class member functions here +Rational::Rational(int numerator, int denominator) { + this->numerator = numerator; + this->denominator = denominator; +} + +Rational Rational::add(const Rational &frac) const { + return Rational(this->numerator * frac.denominator + + frac.numerator * this->denominator, + this->denominator * frac.denominator); +} + +Rational Rational::subtract(const Rational &frac) const { + return Rational(this->numerator * frac.denominator - + frac.numerator * this->denominator, + this->denominator * frac.denominator); +} + +Rational Rational::multiply(const Rational &frac) const { + return Rational(this->numerator * frac.numerator, + this->denominator * frac.denominator); +} + +Rational Rational::divide(const Rational &frac) const { + return Rational(this->numerator * frac.denominator, + this->denominator * frac.numerator); +} + +void Rational::display() const { + cout << this->numerator << " / " << this->denominator; +} + +int Rational::gcd(int a, int b) const { + if (a == b) + return a; + + int temp; + if (a < b) { + temp = a; + a = b; + b = temp; + } + + int remainder; + + do { + remainder = a % b; + a = b; + b = remainder; + } while (remainder != 0); + + return a; +} + +void Rational::simplify() { + int gcd = this->gcd(this->numerator, this->denominator); + this->numerator /= gcd; + this->denominator /= gcd; +} + +// Do not change any of the code below this line!! + +Rational getRational(); +void displayResult(const string &, const Rational &, const Rational &, + const Rational &); + +int main() { + Rational A, B, result; + char choice; + + cout << "Enter Rational A:" << endl; + A = getRational(); + cout << endl; + + cout << "Enter Rational B:" << endl; + B = getRational(); + cout << endl; + + cout << "Enter Operation:" << endl + << "a - Addition (A + B)" << endl + << "s - Subtraction (A - B)" << endl + << "m - Multiplication (A * B)" << endl + << "d - Division (A / B)" << endl + << "y - Simplify A" << endl; + cin >> choice; + cout << endl; + + if (choice == 'a') { + result = A.add(B); + displayResult("+", A, B, result); + } else if (choice == 's') { + result = A.subtract(B); + displayResult("-", A, B, result); + } else if (choice == 'm') { + result = A.multiply(B); + displayResult("*", A, B, result); + } else if (choice == 'd') { + result = A.divide(B); + displayResult("/", A, B, result); + } else if (choice == 'y') { + A.simplify(); + A.display(); + } else { + cout << "Unknown Operation"; + } + cout << endl; + + return 0; +} + +Rational getRational() { + int choice; + int numer, denom; + + cout << "Which Rational constructor? (Enter 2, 1, or 0)" << endl + << "2 - 2 parameters (numerator & denominator)" << endl + << "1 - 1 parameter (numerator)" << endl + << "0 - 0 parameters (default)" << endl; + cin >> choice; + cout << endl; + + if (choice == 2) { + cout << "numerator? "; + cin >> numer; + cout << endl; + cout << "denominator? "; + cin >> denom; + cout << endl; + return Rational(numer, denom); + } else if (choice == 1) { + cout << "numerator? "; + cin >> numer; + cout << endl; + return Rational(numer); + } else { + return Rational(); + } +} + +void displayResult(const string &op, const Rational &lhs, const Rational &rhs, + const Rational &result) { + cout << "("; + lhs.display(); + cout << ") " << op << " ("; + rhs.display(); + cout << ") = ("; + result.display(); + cout << ")"; +}