c·c++/c++ 프로그래밍

Fraction Class

바로이순간 2014. 5. 12. 23:43

// File: ex6-5.cpp   http://voyager.deanza.edu/~bentley/cis27_examples/ex6-5_cpp.htm

#include <iostream>

#include <cassert>

using namespace std;


class fraction {

    int numer, denom;

public:

    fraction(int = 0, int = 1);

    void operator!(void) const; // print the fraction

    fraction& operator~(void); // reduce the fraction

    fraction operator-(void) const; // negative of fraction

    fraction operator*(void) const; // reciprocal of fraction

    fraction& operator+=(const fraction&);

    fraction& operator-=(const fraction&);

    fraction& operator*=(const fraction&);

    fraction& operator/=(const fraction&);

    fraction operator+(int) const;

    fraction operator-(int) const;

    fraction operator*(int) const;

    fraction operator/(int) const;

    bool operator>(const fraction&) const;

    bool operator<(const fraction&) const;

    bool operator>=(const fraction&) const;

    bool operator<=(const fraction&) const;

    bool operator==(const fraction&) const;

    bool operator!=(const fraction&) const;

    fraction operator+(const fraction&) const;

    fraction operator-(const fraction&) const;

    fraction operator*(const fraction&) const;

    fraction operator/(const fraction&) const;

    fraction& operator++(); // prefix operator returns by reference

    fraction operator++(int); // postix operator returns by value

};


// member function definitions

fraction::fraction(int n, int d) {

    assert(d != 0);

    numer = n;

    denom = d;

}


void fraction::operator!(void) const {

    cout << numer << '/' << denom << endl;

}


fraction& fraction::operator~(void) {

    int min;

    // find the minimum of the denom and numer

    min = denom < numer ? denom : numer;

    for (int i = 2; i <= min; i++) {

        while ((numer % i == 0) && (denom % i == 0)) {

            numer /= i;

            denom /= i;

        }

    }

    return *this;

}


fraction fraction::operator-(void) const {

    return fraction(-numer,denom);

}


fraction fraction::operator*(void) const {

    return fraction(denom,numer);

}


fraction& fraction::operator+=(const fraction& f) {

    numer = numer*f.denom+denom*f.numer;

    denom = denom*f.denom;

    return *this;

}


fraction& fraction::operator-=(const fraction& f) {

    *this += (-f);

    return *this;

}


fraction& fraction::operator*=(const fraction& f) {

    numer = numer*f.numer;

    denom = denom*f.denom;

    return *this;

}


fraction& fraction::operator/=(const fraction& f) {

    *this *= (*f);

    return *this;

}


bool fraction::operator>(const fraction& f) const {

    return (float) numer/denom > (float) f.numer/f.denom;

}


bool fraction::operator<(const fraction& f) const {

    return f>*this;

}


bool fraction::operator==(const fraction& f) const {

    return numer*f.denom == denom*f.numer;

}


bool fraction::operator!=(const fraction& f) const {

    return !(*this == f);

}


bool fraction::operator<=(const fraction& f) const {

    return !(*this > f);

}


bool fraction::operator>=(const fraction& f) const {

    return !(*this<f);

}


fraction fraction::operator+(const fraction& f) const {

    return fraction(numer*f.denom+denom*f.numer,denom*f.denom);

}


fraction fraction::operator-(const fraction& f) const {

    return fraction(numer*f.denom-denom*f.numer,denom*f.denom);

}


fraction fraction::operator*(const fraction& f) const {

    return fraction(numer*f.numer,denom*f.denom);

}


fraction fraction::operator/(const fraction& f) const {

    return (*this) * (*f);

}


fraction fraction::operator+(int i) const {

    return fraction(numer+i*denom,denom);

}


fraction fraction::operator-(int i) const {

    return (*this) + -i;

}


fraction fraction::operator*(int i) const {

    return fraction(numer*i,denom);

}


fraction fraction::operator/(int i) const {

    return fraction(numer,i*denom);

}


// prefix increment operator

fraction& fraction::operator++() {

    numer += denom;

    return *this;

}


// postfix increment operator

fraction fraction::operator++(int) {  // Note dummy int argument

    fraction temp(*this);

    ++*this;   // call the prefix operator

    return temp;

}



int main() {

    fraction f(3,4);   // initialize fraction f & g

    fraction g(1,2);

    cout << "!f ";  !f;

    cout << "!g ";  !g;

    cout << endl;

    cout << "-g ";  !-g;

    cout << "*g ";  !*g;

    fraction h = g + f;

    cout << endl;

    cout << "h=g+f " << " !h ";  !h;

    cout << "!~h ";  !~h;

    cout << endl;

    cout << "f+g ";  ! (f + g);

    cout << "f-g ";  ! (f - g);

    cout << "f*g ";  ! (f * g);

    cout << "f/g ";  ! (f / g);

    cout << endl;

    cout << "f+=g "; !~(f+=g);

    cout << "f-=g "; !~(f-=g);

    cout << "f*=g "; !~(f*=g);

    cout << "f/=g "; !~(f/=g);

    cout << endl;

    cout << "f<g " << (f<g) << endl;

    cout << "f>g " << (f>g) << endl;

    cout << "f==g " << (f==g) << endl;

    cout << "f!=g " << (f!=g) << endl;

    cout << "f<=g " << (f<=g) << endl;

    cout << "f>=g " << (f>=g) << endl;

    cout << endl;

    cout << "f+5 ";  !(f+5);

    cout << "f-5 ";  !(f-5);

    cout << "f*5 ";  !(f*5);

    cout << "f/5 ";  !(f/5);

    cout << endl;

    cout << "f+=5 "; f+=5;   cout << "!~f ";  !~f;  // How does this work?

    cout << "++f "; !++f; cout << "f="; !f; 

    cout << "f++ "; !f++; cout << "f="; !f; 


    return 0;

}

'c·c++ > c++ 프로그래밍' 카테고리의 다른 글

next_number  (0) 2014.07.22
C++에서 STL 사용하지 않고 가변배열 만들 수 없나요?  (0) 2014.07.16
bool 형에 대해서  (0) 2014.04.02
longest common substring  (0) 2014.03.31
파일의 글자수 세기  (0) 2013.11.09