목적 : 수업시간에 분수를 클래스화 하는 실습을 진행하고 있고, 멘토링 모임을 진행하고 있어서 분수 클래스를 만들어 보기로 한다.
목표
1. 산술연산 및 대입연산, 관계연산이 모두 가능하도록 만들기로 한다.
2011년 10월 20일 목요일
헤더파일에 생성자와 파괴자, 연산자 오버로딩을 정의
Rational.h
Rational.cpp
목표
1. 산술연산 및 대입연산, 관계연산이 모두 가능하도록 만들기로 한다.
2011년 10월 20일 목요일
헤더파일에 생성자와 파괴자, 연산자 오버로딩을 정의
Rational.h
#pragma once #include <iostream> #include <string> class Rational { public: // Constructor Rational( int numerator, int denominator ); Rational( Rational& r ); Rational( Rational* r ); // Destroyer ~Rational( void ); // Overloading to output Object friend std::ostream& operator <<( std::ostream& out, const Rational& T ); friend std::ostream& operator <<( std::ostream& out, const Rational* T ); // Overloading to arithmetic operators Rational operator+ (const Rational& T) const; Rational operator- (const Rational& T) const; Rational operator* (const Rational& T) const; Rational operator/ (const Rational& T) const; // Overloading to assignment operator Rational operator= (const Rational& T) const; // Overloading to relational operators Rational operator> (const Rational& T) const; Rational operator>=(const Rational& T) const; Rational operator< (const Rational& T) const; Rational operator<=(const Rational& T) const; Rational operator==(const Rational& T) const; Rational operator!=(const Rational& T) const; private: int numerator; int denominator; // Common Denominator const int gcdForDenominator(int a, int b) const; // reduction of fractions to a common denominator Rational reduceFration(int num, int den) const; };
#include <iostream> #include <stdexcept> #include "Rational.h" /* * 2011년 10월 19일 분모와 분자를 인수로 하는 생성자 정의 * 2011년 10월 20일 Rational 객체를 인수로 하는 생성자 정의 */ Rational::Rational( int numerator, int dendenominator ) { this->numerator = numerator; this->denominator = dendenominator; } Rational::Rational( Rational& r ) { this->numerator = r.numerator; this->denominator = r.denominator; } Rational::Rational( Rational* r ) { this->numerator = r->numerator; this->numerator = r->numerator; } /* * 동적할당을 하는 멤버가 없기 때문에 멤버를 0으로 초기화 * 2011년 10월 19일 파괴자 or 소멸자 정의 */ Rational::~Rational( void ) { this->numerator = 0; this->denominator = 0; } /* * 2011년 10월 20일 << 연산자 오버로딩 출력을 위한 연산자 */ std::ostream& operator<<( std::ostream& out, const Rational& T ) { out << T.numerator << "/" << T.denominator; return out; } std::ostream& operator<<( std::ostream& out, const Rational* T ) { out << T->numerator << "/" << T->denominator; return out; } /* * 2011년 10월 19일 산술 연산자 오버로딩 구현 * 2011년 10월 20일 reduceFration 메서드 추가하여 중복코드 삭제 */ Rational Rational::operator+( const Rational& T ) const { int num = (this->numerator * T.denominator) + (this->denominator * T.numerator); int den = (this->denominator * T.denominator); return this->reduceFration(num, den); } Rational Rational::operator-(const Rational& T) const { int num = (this->numerator * T.denominator) - (this->denominator * T.numerator); int den = (this->denominator * T.denominator); return this->reduceFration(num, den); } Rational Rational::operator*(const Rational& T) const { int num = (this->numerator * T.numerator); int den = (this->denominator * T.denominator); return this->reduceFration(num, den); } Rational Rational::operator/(const Rational& T) const { int num = (this->numerator * T.denominator); int den = (this->denominator * T.numerator); return this->reduceFration(num, den); } /* * 2011년 10월 20일 대입 연산자 오버로딩 구현 */ Rational Rational::operator =(const Rational& T) const { Rational R(T.numerator, T.denominator); return R; } /* * 2011년 10월 20일 통분을 위한 멤버 메서드 */ Rational Rational::reduceFration(int num, int den) const { int commonDenominator = this->gcdForDenominator(num, den); Rational R(num / commonDenominator, den / commonDenominator); return R; }\/* * 2011년 10월 19일 통분을 위한 약수를 구하는 메서드 */ const int Rational::gcdForDenominator(int a, int b) const { a = std::abs(a); b = std::abs(b); if( a < b ) std::swap(a, b); while( b > 0 ) { int temp = a % b; a = b; b = temp; } return a; }
Posted by LaLuna