From 90eac27a8e9943f7bdf0f95c814209fc42481487 Mon Sep 17 00:00:00 2001 From: GiladFisher Date: Fri, 21 Apr 2023 16:13:01 +0300 Subject: [PATCH 1/7] from laptop From 11d377bb7eb36861414b3ec298adec5d7e455eec Mon Sep 17 00:00:00 2001 From: GiladFisher Date: Fri, 21 Apr 2023 16:54:01 +0300 Subject: [PATCH 2/7] test windows --- Demo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Demo.cpp b/Demo.cpp index de960de..6b63dfb 100644 --- a/Demo.cpp +++ b/Demo.cpp @@ -3,7 +3,7 @@ * * @author Evgeny Hershkovitch Neiterman * @since 2023-03 - */ + */ #include #include From b01e3798b448221e9f74f2181a9fd1448cb5a57e Mon Sep 17 00:00:00 2001 From: GiladFisher Date: Fri, 21 Apr 2023 18:36:50 +0300 Subject: [PATCH 3/7] test compiles but demo doesnt how could demo possibly compile when the task is to "only write the headers"? thats right, it CANT! --- Test.cpp | 42 +++++++++++++++ sources/Fraction.cpp | 119 +++++++++++++++++++++++++++++++++++++++++++ sources/Fraction.hpp | 58 +++++++++++++++++++++ 3 files changed, 219 insertions(+) create mode 100644 Test.cpp create mode 100644 sources/Fraction.cpp create mode 100644 sources/Fraction.hpp diff --git a/Test.cpp b/Test.cpp new file mode 100644 index 0000000..7b87848 --- /dev/null +++ b/Test.cpp @@ -0,0 +1,42 @@ +#include +#include +#include +#include +using namespace std; + +#include "doctest.h" +#include "sources/Fraction.hpp" +using namespace ariel; +TEST_CASE("Correct Init"){ + Fraction a(5,3); + CHECK(a.getNumerator() == 5); + CHECK(a.getDenominator() == 3); +} +TEST_CASE("Denominator can't be 0"){ + CHECK_THROWS(Fraction(5,0)); +} +TEST_CASE("Increment"){ + Fraction a(5,3); + a++; + CHECK(a.getNumerator() == 8); + CHECK(a.getDenominator() == 3); +} +TEST_CASE("Decrement"){ + Fraction a(5,3); + a--; + CHECK(a.getNumerator() == 2); + CHECK(a.getDenominator() == 3); +} +TEST_CASE("Addition"){ + Fraction a(5,3); + Fraction b(14,21); + Fraction c = a+b; + CHECK(c.getNumerator() == 7); + CHECK(c.getDenominator() == 3); +} +TEST_CASE("Addition with float"){ + Fraction a(5,3); + Fraction c = a + (float)2.5; + CHECK(c.getNumerator() == 25); + CHECK(c.getDenominator() == 6); +} \ No newline at end of file diff --git a/sources/Fraction.cpp b/sources/Fraction.cpp new file mode 100644 index 0000000..cc9767f --- /dev/null +++ b/sources/Fraction.cpp @@ -0,0 +1,119 @@ +#include "Fraction.hpp" +#include +#include +#include +#include +using namespace std; +using namespace ariel; +int Fraction::gcd(int a, int b){ + if (b == 0) + return a; + return gcd(b, a % b); +} +Fraction Fraction::operator+(const Fraction& other){ + int newNumerator = this->numerator * other.denominator + other.numerator * this->denominator; + int newDenominator = this->denominator * other.denominator; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); +} +Fraction Fraction::operator+(double num){ + int newNumerator = this->numerator + num * this->denominator; + int newDenominator = this->denominator; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); +} +Fraction Fraction::operator-(const Fraction& other){ + int newNumerator = this->numerator * other.denominator - other.numerator * this->denominator; + int newDenominator = this->denominator * other.denominator; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); +} +Fraction Fraction::operator-(double num){ + int newNumerator = this->numerator - num * this->denominator; + int newDenominator = this->denominator; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); +} +Fraction Fraction::operator*(const Fraction& other){ + int newNumerator = this->numerator * other.numerator; + int newDenominator = this->denominator * other.denominator; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); +} +Fraction Fraction::operator*(double num){ + int newNumerator = this->numerator * num; + int newDenominator = this->denominator; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); +} +Fraction Fraction::operator/(const Fraction& other){ + int newNumerator = this->numerator * other.denominator; + int newDenominator = this->denominator * other.numerator; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); +} +Fraction Fraction::operator/(double num){ + int newNumerator = this->numerator; + int newDenominator = this->denominator * num; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); +} +bool Fraction::operator==(const Fraction& other){ + return (this->numerator == other.numerator && this->denominator == other.denominator); +} +bool Fraction::operator==(double num){ + return (this->numerator == num * this->denominator); +} +bool Fraction::operator>(const Fraction& other){ + return (this->numerator * other.denominator > other.numerator * this->denominator); +} +bool Fraction::operator>(double num){ + return (this->numerator > num * this->denominator); +} +bool Fraction::operator<(const Fraction& other){ + return (this->numerator * other.denominator < other.numerator * this->denominator); +} +bool Fraction::operator<(double num){ + return (this->numerator < num * this->denominator); +} +bool Fraction::operator>=(const Fraction& other) const{ + return (this->numerator * other.denominator >= other.numerator * this->denominator); +} +bool Fraction::operator>=(double num){ + return (this->numerator >= num * this->denominator); +} +bool Fraction::operator<=(const Fraction& other){ + return (this->numerator * other.denominator <= other.numerator * this->denominator); +} +bool Fraction::operator<=(double num){ + return (this->numerator <= num * this->denominator); +} +Fraction Fraction::operator++(int){ + Fraction temp = *this; + this->numerator += this->denominator; + return temp; +} +Fraction& Fraction::operator++(){ + this->numerator += this->denominator; + return *this; +} +Fraction Fraction::operator--(int){ + Fraction temp = *this; + this->numerator -= this->denominator; + return temp; +} +Fraction& Fraction::operator--(){ + this->numerator -= this->denominator; + return *this; +} +ostream& Fraction::operator<<(ostream& os, const Fraction& other){ + os << other.numerator << "/" << other.denominator; + return os; +} +istream& Fraction::operator>>(istream& is, Fraction& other){ + char c; + is >> other.numerator >> c >> other.denominator; + return is; +} + + diff --git a/sources/Fraction.hpp b/sources/Fraction.hpp new file mode 100644 index 0000000..26f2d52 --- /dev/null +++ b/sources/Fraction.hpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#pragma once +using namespace std; +namespace ariel{ + + + class Fraction{ + private: + int numerator; + int denominator; + public: + int gcd(int a, int b); + Fraction(int nume, int deno){ + if(deno == 0){ + throw std::invalid_argument("Math: can't devide by 0"); + } + this->numerator = nume; + this->denominator = deno; + } + Fraction operator+(const Fraction& other); + Fraction operator+(double num); + Fraction operator-(const Fraction& other); + Fraction operator-(double num); + Fraction operator*(const Fraction& other); + Fraction operator*(double num); + Fraction operator/(const Fraction& other); + Fraction operator/(double num); + + bool operator==(const Fraction& other); + bool operator==(double num); + bool operator>(const Fraction& other); + bool operator>(double num); + bool operator<(const Fraction& other); + bool operator<(double num); + bool operator>=(const Fraction& other) const; + bool operator>=(double num); + bool operator<=(const Fraction& other); + bool operator<=(double num); + + Fraction operator++(int); // postfix + Fraction operator--(int); // postfix + Fraction &operator++(); // prefix + Fraction &operator--(); // prefix + + friend ostream& operator<<(ostream& ost, const Fraction& frc); + friend istream& operator>>(istream& ist, Fraction& frc); + + int getNumerator() { + return this->numerator; + } + int getDenominator() { + return this->denominator; + } + }; +} \ No newline at end of file From 89a22ec453a42aa1f6fa9c9a73557b37246abc39 Mon Sep 17 00:00:00 2001 From: GiladFisher Date: Mon, 24 Apr 2023 15:02:54 +0300 Subject: [PATCH 4/7] 20 tests --- Demo.cpp | 2 +- Test.cpp | 36 +++++++ sources/Fraction.cpp | 230 ++++++++++++++++++++++--------------------- sources/Fraction.hpp | 11 ++- 4 files changed, 163 insertions(+), 116 deletions(-) diff --git a/Demo.cpp b/Demo.cpp index 6b63dfb..4465c4f 100644 --- a/Demo.cpp +++ b/Demo.cpp @@ -29,7 +29,7 @@ int main() { cout << c++ << endl; cout << --c << endl; - cout << "c >=b ? : " << c >= b << endl; + cout << "c >=b ? : " << (c >= b) << endl; if (a > 1.1) cout << " a is bigger than 1.1" << endl; else cout << " a is smaller than 1.1" << endl; diff --git a/Test.cpp b/Test.cpp index 7b87848..b4cea61 100644 --- a/Test.cpp +++ b/Test.cpp @@ -12,6 +12,16 @@ TEST_CASE("Correct Init"){ CHECK(a.getNumerator() == 5); CHECK(a.getDenominator() == 3); } +TEST_CASE("Correct Init with negative"){ + Fraction a(-5,3); + CHECK(a.getNumerator() == -5); + CHECK(a.getDenominator() == 3); +} +TEST_CASE("Correct Reduce"){ + Fraction a(10,5); + CHECK(a.getNumerator() == 2); + CHECK(a.getDenominator() == 1); +} TEST_CASE("Denominator can't be 0"){ CHECK_THROWS(Fraction(5,0)); } @@ -39,4 +49,30 @@ TEST_CASE("Addition with float"){ Fraction c = a + (float)2.5; CHECK(c.getNumerator() == 25); CHECK(c.getDenominator() == 6); +} +TEST_CASE("Subtraction"){ + Fraction a(5,3); + Fraction b(1, 7); + Fraction c = a-b; + CHECK(c.getNumerator() == 32); + CHECK(c.getDenominator() == 21); +} +TEST_CASE("Subtraction with float"){ + Fraction a(5,3); + Fraction c = a - (float)0.45; + CHECK(c.getNumerator() == 73); + CHECK(c.getDenominator() == 60); +} +TEST_CASE("Multiplication"){ + Fraction a(5,3); + Fraction b(1, 7); + Fraction c = a*b; + CHECK(c.getNumerator() == 5); + CHECK(c.getDenominator() == 21); +} +TEST_CASE("Multiplication with float"){ + Fraction a(5,3); + Fraction c = 0.45 * a; + CHECK(c.getNumerator() == 3); + CHECK(c.getDenominator() == 4); } \ No newline at end of file diff --git a/sources/Fraction.cpp b/sources/Fraction.cpp index cc9767f..356685b 100644 --- a/sources/Fraction.cpp +++ b/sources/Fraction.cpp @@ -4,116 +4,122 @@ #include #include using namespace std; -using namespace ariel; -int Fraction::gcd(int a, int b){ - if (b == 0) - return a; - return gcd(b, a % b); -} -Fraction Fraction::operator+(const Fraction& other){ - int newNumerator = this->numerator * other.denominator + other.numerator * this->denominator; - int newDenominator = this->denominator * other.denominator; - int gcd = this->gcd(newNumerator, newDenominator); - return Fraction(newNumerator/gcd, newDenominator/gcd); -} -Fraction Fraction::operator+(double num){ - int newNumerator = this->numerator + num * this->denominator; - int newDenominator = this->denominator; - int gcd = this->gcd(newNumerator, newDenominator); - return Fraction(newNumerator/gcd, newDenominator/gcd); -} -Fraction Fraction::operator-(const Fraction& other){ - int newNumerator = this->numerator * other.denominator - other.numerator * this->denominator; - int newDenominator = this->denominator * other.denominator; - int gcd = this->gcd(newNumerator, newDenominator); - return Fraction(newNumerator/gcd, newDenominator/gcd); -} -Fraction Fraction::operator-(double num){ - int newNumerator = this->numerator - num * this->denominator; - int newDenominator = this->denominator; - int gcd = this->gcd(newNumerator, newDenominator); - return Fraction(newNumerator/gcd, newDenominator/gcd); -} -Fraction Fraction::operator*(const Fraction& other){ - int newNumerator = this->numerator * other.numerator; - int newDenominator = this->denominator * other.denominator; - int gcd = this->gcd(newNumerator, newDenominator); - return Fraction(newNumerator/gcd, newDenominator/gcd); -} -Fraction Fraction::operator*(double num){ - int newNumerator = this->numerator * num; - int newDenominator = this->denominator; - int gcd = this->gcd(newNumerator, newDenominator); - return Fraction(newNumerator/gcd, newDenominator/gcd); -} -Fraction Fraction::operator/(const Fraction& other){ - int newNumerator = this->numerator * other.denominator; - int newDenominator = this->denominator * other.numerator; - int gcd = this->gcd(newNumerator, newDenominator); - return Fraction(newNumerator/gcd, newDenominator/gcd); -} -Fraction Fraction::operator/(double num){ - int newNumerator = this->numerator; - int newDenominator = this->denominator * num; - int gcd = this->gcd(newNumerator, newDenominator); - return Fraction(newNumerator/gcd, newDenominator/gcd); -} -bool Fraction::operator==(const Fraction& other){ - return (this->numerator == other.numerator && this->denominator == other.denominator); -} -bool Fraction::operator==(double num){ - return (this->numerator == num * this->denominator); -} -bool Fraction::operator>(const Fraction& other){ - return (this->numerator * other.denominator > other.numerator * this->denominator); -} -bool Fraction::operator>(double num){ - return (this->numerator > num * this->denominator); -} -bool Fraction::operator<(const Fraction& other){ - return (this->numerator * other.denominator < other.numerator * this->denominator); -} -bool Fraction::operator<(double num){ - return (this->numerator < num * this->denominator); -} -bool Fraction::operator>=(const Fraction& other) const{ - return (this->numerator * other.denominator >= other.numerator * this->denominator); -} -bool Fraction::operator>=(double num){ - return (this->numerator >= num * this->denominator); -} -bool Fraction::operator<=(const Fraction& other){ - return (this->numerator * other.denominator <= other.numerator * this->denominator); -} -bool Fraction::operator<=(double num){ - return (this->numerator <= num * this->denominator); -} -Fraction Fraction::operator++(int){ - Fraction temp = *this; - this->numerator += this->denominator; - return temp; -} -Fraction& Fraction::operator++(){ - this->numerator += this->denominator; - return *this; -} -Fraction Fraction::operator--(int){ - Fraction temp = *this; - this->numerator -= this->denominator; - return temp; -} -Fraction& Fraction::operator--(){ - this->numerator -= this->denominator; - return *this; -} -ostream& Fraction::operator<<(ostream& os, const Fraction& other){ - os << other.numerator << "/" << other.denominator; - return os; -} -istream& Fraction::operator>>(istream& is, Fraction& other){ - char c; - is >> other.numerator >> c >> other.denominator; - return is; -} - +namespace ariel{ + int Fraction::gcd(int a, int b){ + if (b == 0) + return a; + return gcd(b, a % b); + } + Fraction Fraction::operator+(const Fraction& other){ + int newNumerator = this->numerator * other.denominator + other.numerator * this->denominator; + int newDenominator = this->denominator * other.denominator; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); + } + Fraction Fraction::operator+(double num){ + int newNumerator = this->numerator + num * this->denominator; + int newDenominator = this->denominator; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); + } + Fraction Fraction::operator-(const Fraction& other){ + int newNumerator = this->numerator * other.denominator - other.numerator * this->denominator; + int newDenominator = this->denominator * other.denominator; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); + } + Fraction Fraction::operator-(double num){ + int newNumerator = this->numerator - num * this->denominator; + int newDenominator = this->denominator; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); + } + Fraction Fraction::operator*(const Fraction& other){ + int newNumerator = this->numerator * other.numerator; + int newDenominator = this->denominator * other.denominator; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); + } + Fraction operator*(double num, const Fraction& other){ + // int newNumerator = this->numerator * num; + // int newDenominator = this->denominator; + // int gcd = this->gcd(newNumerator, newDenominator); + // return Fraction(newNumerator/gcd, newDenominator/gcd); + return other; + } + Fraction Fraction::operator/(const Fraction& other){ + // int newNumerator = this->numerator * other.denominator; + // int newDenominator = this->denominator * other.numerator; + // int gcd = this->gcd(newNumerator, newDenominator); + // return Fraction(newNumerator/gcd, newDenominator/gcd); + return *this; + } + Fraction Fraction::operator/(double num){ + int newNumerator = this->numerator; + int newDenominator = this->denominator * num; + int gcd = this->gcd(newNumerator, newDenominator); + return Fraction(newNumerator/gcd, newDenominator/gcd); + } + bool Fraction::operator==(const Fraction& other){ + return (this->numerator == other.numerator && this->denominator == other.denominator); + } + bool Fraction::operator==(double num){ + return (this->numerator == num * this->denominator); + } + bool Fraction::operator>(const Fraction& other){ + return (this->numerator * other.denominator > other.numerator * this->denominator); + } + bool Fraction::operator>(double num){ + return (this->numerator > num * this->denominator); + } + bool Fraction::operator<(const Fraction& other){ + return (this->numerator * other.denominator < other.numerator * this->denominator); + } + bool Fraction::operator<(double num){ + return (this->numerator < num * this->denominator); + } + bool Fraction::operator>=(const Fraction& other) const{ + // return (this->numerator * other.denominator >= other.numerator * this->denominator); + return true; + } + bool Fraction::operator>=(double num){ + // return (this->numerator >= num * this->denominator); + return true; + } + bool Fraction::operator<=(const Fraction& other){ + // return (this->numerator * other.denominator <= other.numerator * this->denominator); + return true; + } + bool Fraction::operator<=(double num){ + // return (this->numerator <= num * this->denominator); + return true; + } + Fraction Fraction::operator++(int){ + Fraction temp = *this; + this->numerator += this->denominator; + return temp; + } + Fraction& Fraction::operator++(){ + this->numerator += this->denominator; + return *this; + } + Fraction Fraction::operator--(int){ + Fraction temp = *this; + this->numerator -= this->denominator; + return temp; + } + Fraction& Fraction::operator--(){ + this->numerator -= this->denominator; + return *this; + } + std::ostream& operator<<(std::ostream& os, const Fraction& other){ + // os << other.numerator << "/" << other.denominator; + return os; + } + std::istream& operator>>(std::istream& is, Fraction& other){ + // char c; + // is >> other.numerator >> c >> other.denominator; + return is; + } +} \ No newline at end of file diff --git a/sources/Fraction.hpp b/sources/Fraction.hpp index 26f2d52..7f56ff2 100644 --- a/sources/Fraction.hpp +++ b/sources/Fraction.hpp @@ -25,7 +25,7 @@ namespace ariel{ Fraction operator-(const Fraction& other); Fraction operator-(double num); Fraction operator*(const Fraction& other); - Fraction operator*(double num); + friend Fraction operator*(double num, const Fraction& other); Fraction operator/(const Fraction& other); Fraction operator/(double num); @@ -45,8 +45,8 @@ namespace ariel{ Fraction &operator++(); // prefix Fraction &operator--(); // prefix - friend ostream& operator<<(ostream& ost, const Fraction& frc); - friend istream& operator>>(istream& ist, Fraction& frc); + friend std::ostream& operator<<(std::ostream& ost, const Fraction& frc); + friend std::istream& operator>>(std::istream& ist, Fraction& frc); int getNumerator() { return this->numerator; @@ -55,4 +55,9 @@ namespace ariel{ return this->denominator; } }; + + + + + } \ No newline at end of file From f6716ebd834e702c736b12c9adb20cd68091b154 Mon Sep 17 00:00:00 2001 From: GiladFisher Date: Mon, 24 Apr 2023 15:35:08 +0300 Subject: [PATCH 5/7] made tidy apart from the swapped erroe --- sources/Fraction.cpp | 8 ++++---- sources/Fraction.hpp | 13 ++++++------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/sources/Fraction.cpp b/sources/Fraction.cpp index 356685b..60b55e2 100644 --- a/sources/Fraction.cpp +++ b/sources/Fraction.cpp @@ -5,10 +5,10 @@ #include using namespace std; namespace ariel{ - int Fraction::gcd(int a, int b){ - if (b == 0) - return a; - return gcd(b, a % b); + int Fraction::gcd(int first, int second){ + if (second == 0) + return first; + return gcd(second, first % second); } Fraction Fraction::operator+(const Fraction& other){ int newNumerator = this->numerator * other.denominator + other.numerator * this->denominator; diff --git a/sources/Fraction.hpp b/sources/Fraction.hpp index 7f56ff2..dda75bf 100644 --- a/sources/Fraction.hpp +++ b/sources/Fraction.hpp @@ -12,13 +12,11 @@ namespace ariel{ int numerator; int denominator; public: - int gcd(int a, int b); - Fraction(int nume, int deno){ - if(deno == 0){ + int gcd(int first, int second); + Fraction(int _numerator, int _denominator): numerator(_numerator), denominator(_denominator){ + if(_denominator == 0){ throw std::invalid_argument("Math: can't devide by 0"); } - this->numerator = nume; - this->denominator = deno; } Fraction operator+(const Fraction& other); Fraction operator+(double num); @@ -48,10 +46,11 @@ namespace ariel{ friend std::ostream& operator<<(std::ostream& ost, const Fraction& frc); friend std::istream& operator>>(std::istream& ist, Fraction& frc); - int getNumerator() { + int getNumerator() const + { return this->numerator; } - int getDenominator() { + int getDenominator() const{ return this->denominator; } }; From 038ab26594ec63b39dbedd81f7801a7d9d56cbd5 Mon Sep 17 00:00:00 2001 From: GiladFisher Date: Tue, 2 May 2023 16:55:30 +0300 Subject: [PATCH 6/7] fixed stupid tidy thing --- sources/Fraction.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/Fraction.hpp b/sources/Fraction.hpp index dda75bf..4edefaa 100644 --- a/sources/Fraction.hpp +++ b/sources/Fraction.hpp @@ -13,7 +13,7 @@ namespace ariel{ int denominator; public: int gcd(int first, int second); - Fraction(int _numerator, int _denominator): numerator(_numerator), denominator(_denominator){ + Fraction(int _numerator, const int _denominator): numerator(_numerator), denominator(_denominator){ if(_denominator == 0){ throw std::invalid_argument("Math: can't devide by 0"); } From e461d62111437befc3c43caf899dd758cbdfdfb2 Mon Sep 17 00:00:00 2001 From: GiladFisher Date: Fri, 5 May 2023 12:40:03 +0200 Subject: [PATCH 7/7] no changes, trying pc