feat: finish chapter 3 lab 1

This commit is contained in:
Youwen Wu 2025-01-24 00:29:50 -08:00
parent 6eea0acaea
commit 3e99bb5443
Signed by: youwen5
GPG key ID: 865658ED1FE61EC3
2 changed files with 174 additions and 0 deletions

View file

@ -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_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_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_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)

View file

@ -0,0 +1,172 @@
#include <iostream>
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 << ")";
}