RationalNumber class 的运算符重载

//Rational.h

#ifndef RATIONAL_H
#define RATIONAL_H

class Rational {
 public:
  Rational( int = 0, int = 1 );
  
  Rational operator+( const Rational & ) const;
  Rational operator-( const Rational & ) const;
  Rational operator*( const Rational & ) const;
  Rational operator/( const Rational & ) const;
  bool operator==( const Rational & ) const;
  bool operator!=( const Rational & ) const;
  bool operator<( const Rational & ) const;
  bool operator<=( const Rational & ) const;
  bool operator>( const Rational & ) const;
  bool operator>=( const Rational & ) const;
  
  void printRational ();
  
 private:
  int numerator;
  int denominator;
  void reduction();
};

#endif

// Rational.cpp

#include <iostream>
#include "Rational.h"
using namespace std;

Rational::Rational( int n, int d ) {
 numerator = n;
 denominator = d;
 reduction();
}

Rational Rational::operator+( const Rational &a ) const{
 Rational t;
 t.numerator = a.numerator * denominator;
 t.numerator += a.denominator * numerator;
 t.denominator = a.denominator * denominator;
 t.reduction();
 return t;
}

Rational Rational::operator-( const Rational &s ) const{
 Rational t;
 t.numerator = s.denominator * numerator;
 t.numerator -= denominator * s.numerator;
 t.denominator = s.denominator * denominator;
 t.reduction();
 return t;
}

Rational Rational::operator*( const Rational &m ) const{
    Rational t;
 t.numerator = m.numerator * numerator;
 t.denominator = m.denominator * denominator;
 t.reduction();
 return t;
}

Rational Rational::operator/( const Rational &v ) const{
 Rational t;
 t.numerator = v.denominator * numerator;
 t.denominator = denominator * v.numerator;
 t.reduction();
 return t;
}

bool Rational::operator==( const Rational &a ) const{
    if ( numerator == a.numerator && denominator == a.denominator)
        return true;
    else
        return false;
}

bool Rational::operator!=( const Rational &b ) const{
 if ( numerator != b.numerator || denominator != b.denominator)
     return true;
    else
        return false;
}

bool Rational::operator<( const Rational &c ) const{
    if ( numerator / denominator < c.numerator / c.denominator)
        return true;
    else
        return false;
   
}

bool Rational::operator<=( const Rational &d ) const{
    if ( numerator / denominator <= d.numerator / d.denominator)
        return true;
    else
        return false;
}

bool Rational::operator>( const Rational &e ) const{
 if ( numerator / denominator > e.numerator / e.denominator)
        return true;
    else
        return false;
}

bool Rational::operator>=( const Rational &f ) const{
 if ( numerator / denominator >= f.numerator / f.denominator)
        return true;
    else
        return false;
 }
 
void Rational::printRational () {
 if ( denominator == 0 )
  cout << "\nDIVIDE BY ZERO ERROR!!!" << '\n';
 else if ( numerator == 0 )
  cout << 0;
 else
  cout << numerator << '/' << denominator;
}
  
void Rational::reduction() {
 int largest;
 largest = numerator > denominator ? numerator : denominator;

 int gcd = 0;

 for ( int loop = 2; loop <= largest; loop++ )
  if ( numerator % loop == 0 && denominator % loop == 0 )
   gcd = loop;

 if (gcd != 0) {
  numerator /= gcd;
  denominator /= gcd;
 }
}

//main.cpp

#include <iostream>
#include "Rational.h"
using namespace std;

int main()
{
   Rational c( 3, 2 ), d( 5, 9 ), x;

   c.printRational();
   cout << " + " ;
   d.printRational();
   cout << " = ";
   x = c + d;
   x.printRational();

   cout << '\n';
   c.printRational();
   cout << " - " ;
   d.printRational();
   cout << " = ";
   x = c - d;
   x.printRational();

   cout << '\n';
   c.printRational();
   cout << " * " ;
   d.printRational();
   cout << " = ";
   x = c * d;
   x.printRational();

   cout << '\n';
   c.printRational();
   cout << " / " ;
   d.printRational();
   cout << " = ";
   x = c / d;
   x.printRational();

   cout << '\n';
   c.printRational();
   cout << " is:\n";

   cout << ( ( c > d ) ? "  > " : "  <= " );
   d.printRational();
   cout << " according to the overloaded > operator\n";

   cout << ( ( c < d ) ? "  < " : "  >= " );
   d.printRational();
   cout << " according to the overloaded < operator\n";

   cout << ( ( c >= d ) ? "  >= " : "  < " );
   d.printRational();
   cout << " according to the overloaded >= operator\n";

   cout << ( ( c <= d ) ? "  <= " : "  > " );
   d.printRational();
   cout << " according to the overloaded <= operator\n";
 
   cout << ( ( c == d ) ? "  == " : "  != " );
   d.printRational();
   cout << " according to the overloaded == operator\n";

   cout << ( ( c != d ) ? "  != " : "  == " );
   d.printRational();
   cout << " according to the overloaded != operator" << endl;
}



  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
8.17 (Rational Numbers) Create a class called Rational for performing arithmetic with fractions. Write a program to test your class. Use integer variables to represent the private instance variables of the class the numerator and the denominator. Provide a constructor that enables an object of this class to be initialized when it is declared. The constructor should store the fraction in reduced form. The fraction 2/4 is equivalent to 1/2 and would be stored in the object as 1 in the numerator and 2 in the denominator. Provide a no-argument constructor with default values in case no initializers are provided. Provide public methods that perform each of the following operations: a. Add two Rational numbers: The result of the addition should be stored in reduced form. b. Subtract two Rational numbers: The result of the subtraction should be stored in reduced form. c. Multiply two Rational numbers: The result of the multiplication should be stored in reduced form. d. Divide two Rational numbers: The result of the division should be stored in reduced form. e. Print Rational numbers in the form a/b, where a is the numerator and b is the denominator. f. Print Rational numbers in floating-point format. (Consider providing formatting capabilities that enable the user of the class to specify the number of digits of precision to the right of the decimal point.) – 提示: – 有理数是有分子、分母以形式a/b表示的数,其中a是分子,b是分母。例如,1/3,3/4,10/4。 – 有理数的分母不能为0,分子却可以为0。每个整数a等价于有理数a/1。有理数用于分数的精确计算中。例如1/3=0.0000…,它不能使用数据类型double或float的浮点格式精确表示出来,为了得到准确结果,必须使用有理数。 – Java提供了整数和浮点数的数据类型,但是没有提供有理数的类型。 – 由于有理数与整数、浮点数有许多共同特征,并且Number类是数字包装的根类,因此,把有理数类Rational定义为Number类的一个子类是比较合适的。由于有理数是可比较的,那么Rational类也应该实现Comparable接口。
C++中,我们可以通过运算符重载来定义自定义的加法和减法运算符。运算符重载是指在类中定义一个函数,使得该函数可以在使用特定运算符时被调用。 以下是加法运算符重载的示例: ```cpp class Complex{ private: double real; double imag; public: Complex(double r = 0, double i = 0){ real = r; imag = i; } Complex operator+(const Complex& c){ Complex res(real + c.real, imag + c.imag); return res; } }; ``` 在上面的示例中,我们定义了一个名为Complex的类,该类具有两个属性:real和imag,表示复数的实部和虚部。我们还定义了一个构造函数和一个加法运算符重载函数。加法运算符重载函数使用operator+作为函数名,并使用const Complex&作为参数。在函数体中,我们创建了一个新的Complex对象,将其实部和虚部初始化为当前对象和传入对象的实部和虚部的和,然后将该对象返回。 下面是减法运算符重载的示例: ```cpp class Complex{ private: double real; double imag; public: Complex(double r = 0, double i = 0){ real = r; imag = i; } Complex operator-(const Complex& c){ Complex res(real - c.real, imag - c.imag); return res; } }; ``` 在上面的示例中,我们定义了一个名为Complex的类,该类具有两个属性:real和imag,表示复数的实部和虚部。我们还定义了一个构造函数和一个减法运算符重载函数。减法运算符重载函数使用operator-作为函数名,并使用const Complex&作为参数。在函数体中,我们创建了一个新的Complex对象,将其实部和虚部初始化为当前对象和传入对象的实部和虚部的差,然后将该对象返回。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值