Creative Code

main.cpp(rational클래스 증감연산자) 본문

C++ Programming

main.cpp(rational클래스 증감연산자)

빛하루 2023. 9. 4. 10:22

※main.cpp파일

#include <iostream>

#include "rational.h"



int main() {

	Rational r1;               // 0

	Rational r2(3);            // 3/1

	Rational r3(3,4);          // 3/4

	std::cout << "r1 : " << r1 << std::endl;

	std::cout << "r1 + r2 : " << r1+r2 <<std::endl;

	std::cout << "r2 * r3 : " << r2*r3 << std::endl;

	std::cout << "r2 == r3 : " << (r2==r3) << std::endl;

	std::cout << "r2 > r3 : " << (r2>r3) << std::endl;

	std::cout << "r2 / r3 : " << (r2/r3) << std::endl; 

	r3++;

	std::cout << "r3 : " << r3 << std::endl;

	++r3;

	std::cout << "r3 : " << r3 << std::endl;

}

※rational.h파일

#ifndef RATIONAL_H

#define RATIONAL_H

#include <iostream>



class Rational {

friend std::ostream& operator<<(std::ostream& out, const Rational& rhs);

private:

	int num_;

	int den_;

public:

	Rational(int num = 0, int den = 1);

	Rational& operator+=(const Rational& rhs);

	

	bool operator>(const Rational& rhs) const;

	bool operator==(const Rational& rhs) const;

	bool operator!=(const Rational& rhs) const;

	

	const Rational operator+(const Rational& rhs) const;

	const Rational operator-(const Rational& rhs) const;

	const Rational operator*(const Rational& rhs) const;

	const Rational operator/(const Rational& rhs) const;

	const Rational& operator++();

	const Rational operator++(int );

};

#endif

※rational.cpp파일

#include "rational.h"

#include <cassert>

#include "gcd.h"





std::ostream& operator<<(std::ostream& out, const Rational& rhs) {

	out << "(" << rhs.num_ << "/" << rhs.den_ << ")";

	return out;

}



Rational::Rational(int num, int den) {

	int g = gcd(num,den);

	num_ = num/g;

	den_ = den/g;

}



Rational& Rational::operator+=(const Rational &rhs) {

	num_ = num_ * rhs.den_ + den_*rhs.num_;

	den_ = den_ * rhs.den_;

	int g = gcd(num_,den_);

	num_ /= g;

	den_ /= g;

	return *this;

}



bool Rational::operator>(const Rational &rhs) const {

	double result1 = (double)(num_)/(double)(den_);

	double result2 = (double)(rhs.num_)/(double)(rhs.den_);

	return result1>result2;

}



bool Rational::operator==(const Rational &rhs) const {

	int g1 = gcd(num_,den_);

	int g2 = gcd(rhs.num_,rhs.den_);

	return (num_/g1 == rhs.num_/g2 && den_/g1 == rhs.den_/g2);

}



bool Rational::operator!=(const Rational &rhs) const {

	return !(*this==rhs);

}



const Rational Rational::operator+(const Rational &rhs) const{

	int num1 = num_ * rhs.den_ + den_ * rhs.num_;

	int den1 = den_ * rhs.den_;

	return Rational(num1,den1);	

}



const Rational Rational::operator-(const Rational &rhs) const {

	int num1 = num_ * rhs.den_ - den_ * rhs.num_;

	int den1 = den_ * rhs.den_;

	return Rational(num1,den1);	

}



const Rational Rational::operator*(const Rational &rhs) const {

	int num1 = num_ * rhs.num_;

	int den1 = den_ * rhs.den_;

	return Rational(num1,den1);

}



const Rational Rational::operator/(const Rational &rhs) const {

	assert(rhs.num_!=0);

	int num1 = num_ * rhs.den_;

	int den1 = den_ * rhs.num_;

	return Rational(num1,den1);

}



const Rational& Rational::operator++() {

	num_ /= gcd(num_,den_);

	den_ /= gcd(num_,den_);

	num_ += den_;

	return *this;

}



const Rational Rational::operator++(int ) {

	num_ /=gcd(num_,den_);

	den_ /=gcd(num_,den_);

	Rational result(*this);

	num_ += den_;

	return result;

}

※gcd.h파일

#ifndef GCD_H

#define GCD_H



extern "C" int gcd(int a, int b); //c로 만들어진 코드를 다른 언어에서 사용할 때 extern "C"사용



#endif

※ gcd.c파일

#include <stdio.h>



int gcd(int a, int b) {

	int remain;

	while (remain = a%b){

		a =b;

		b =remain;

	}

	return b;

}