Browse Source

init with bugs

jezv 1 year ago
commit
b56e668008
4 changed files with 177 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 120 0
      Rational.cpp
  3. 40 0
      Rational.h
  4. 16 0
      main_rational.cpp

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+.vscode

+ 120 - 0
Rational.cpp

@@ -0,0 +1,120 @@
+#include "Rational.h"
+#include <iostream>
+
+using namespace std;
+
+Rational::Rational(){
+    num = 0;
+    denum = 1;
+
+}
+
+Rational::Rational(int num1, int num2)
+{
+    num = num1;
+    denum = num2;
+    simple();
+}
+
+Rational& Rational::operator += (const Rational& r)
+{
+    int scm = lcm(denum, r.denum);
+    num = (num * (scm/denum) + r.num * (scm/r.denum));
+    denum = scm;
+    return *this;
+}
+
+Rational Rational :: operator + (const Rational& r) const
+{
+    Rational res(*this);
+    return res += r;
+}
+
+Rational& Rational::operator -= (const Rational& r)
+{
+    int scm = lcm(denum, r.denum);
+    num = (num * (scm/denum) - r.num * (scm/r.denum));
+    denum = scm;
+    return *this;
+}
+
+Rational Rational :: operator - (const Rational& r) const
+{
+    Rational res(*this);
+    return res -= r;
+}
+
+Rational& Rational::operator *= (const Rational& r)
+{
+    num *= r.num;
+    denum *= r.denum;
+    simple();
+    return *this;
+}
+
+Rational Rational :: operator * (const Rational& r) const
+{
+    Rational res(*this);
+    return res *= r;
+}
+
+Rational& Rational::operator /= (const Rational& r)
+{
+    num *= r.denum;
+    denum *= r.num;
+    simple();
+    return *this;
+}
+
+Rational Rational :: operator / (const Rational& r) const
+{
+    Rational res(*this);
+    return res /= r;
+}
+
+ostream& operator <<(ostream& out, const Rational& r)
+{
+    return out << '(' << r.num << ")/(" << r.denum << ')';
+}
+
+Rational::operator double() const
+{
+    return ((double)num/(double)denum);
+}
+
+Rational::operator int() const
+{
+    return int(double(*this));
+}
+
+int Rational::lcm(int num1, int num2)
+{
+    int result = 1;
+    for(int dnum = 2; num1 != 1 or num2 != 1; dnum++)
+    {
+        if(num1%dnum==0 or num2%dnum==0)
+        {
+            num1%dnum==0 ? num1/=dnum : num1*1;
+            num2%dnum==0 ? num2/=dnum : num1*1;
+            result *= dnum;
+        }
+    }
+    return result;
+}
+
+int Rational::gcd(int num1, int num2)
+{
+    while (num1 && num2)
+        if (num1 >= num2)
+           num1 %= num2;
+        else
+           num2 %= num1;
+    return num1 | num2;
+}
+
+void Rational::simple()
+{
+    int gct = gcd(num, denum);
+    num /= gct;
+    denum /= gct; 
+}

+ 40 - 0
Rational.h

@@ -0,0 +1,40 @@
+#ifndef _RATIONAL_
+#define _RATIONAL_
+
+#include <iostream>
+
+using namespace std;
+
+class Rational {
+
+public:
+    int num;
+    int denum;
+
+    Rational();
+    Rational(int num1, int num2);
+
+    Rational& operator *=(const Rational& r);
+    Rational operator *(const Rational& r) const;
+    Rational& operator += (const Rational& r);
+    Rational operator + (const Rational& r) const;
+    Rational& operator -= (const Rational& r);
+    Rational operator - (const Rational& r) const;
+    Rational operator / (const Rational& r) const;
+    Rational& operator /= (const Rational& r);
+
+    operator int () const;
+    operator double() const;
+
+    friend ostream& operator <<(ostream& out, const Rational& r);
+
+private:
+    // упрощение самого себя
+    void simple();
+    // НОК
+    int lcm(int num1, int num2);
+    // НОД
+    int gcd(int num1, int num2);
+};
+
+#endif

+ 16 - 0
main_rational.cpp

@@ -0,0 +1,16 @@
+#include <iostream>
+#include "Rational.h"
+#include "../Fraction/Fraction.h"
+
+using namespace std;
+
+int main() {
+    Fraction f(Rational(415, 94));
+    cout << f << endl;
+    cout << Rational(f);
+
+    Fraction f2(2.57463);
+    cout << f << endl;
+    cout << Rational(f);
+    return 0;
+}