今日のソース

nozomi_hope2005-05-18

今完成した。分数演算のクラス設計。とりあえずできたのだが、入出力演算子オーバーロードがなぜこれでうまくいくのかがすっきり理解できない。

#include<iostream>
#include<cmath>
using namespace std;

class Fraction
{
private:
	int num,den;//num=分子,den=分母
public:
	Fraction(int a=0,int b=1){	num=a;den=b; }

	void reduce()
	{
		int m=abs(num),n=abs(den);
		if(m==0)
		{
			num=0,den=1;
			return;
		}
		while(m!=n)
		{
			if (m>n) m=m-n;
			else     n=n-m;
		}
		if((num>0 && den>0)||(num<0 && den<0))
		{
			num/=m;
			den/=m;
		}
		else if((num>0 && den<0)||(num<0 && den>0))
		{
			num=abs((num)/m)*(-1);
			den=abs(den)/m;
		}
	}

	void write()
	{
		if(num==0)
			cout<<0;
		else if(den==1)
			cout<<num;
		else
			cout<<"("<<num<<"/"<<den<<")";
	}
	
	friend Fraction operator+(Fraction a,Fraction b);
	friend Fraction operator-(Fraction a,Fraction b);  
	friend Fraction operator*(Fraction a,Fraction b);
	friend Fraction operator/(Fraction a,Fraction b);
	friend istream& operator>>(istream &inst , Fraction &k);
	friend ostream& operator<<(ostream &oust , Fraction &k);
};

Fraction operator+(Fraction a,Fraction b)
{
	a.num=a.num*b.den+b.num*a.den;
	a.den=a.den*b.den;
	a.reduce();
	return a;
}

Fraction operator-(Fraction a,Fraction b){
	a.num=a.num*b.den-b.num*a.den;
	a.den=a.den*b.den;
	a.reduce();
	return a;
}

Fraction operator*(Fraction a,Fraction b)
{
	a.num*=b.num;
	a.den*=b.den;
	a.reduce();
	return a;
}

Fraction operator/(Fraction a,Fraction b)
{
	a.num*=b.den;
	a.den*=b.num;
    a.reduce();
	return a;
}

istream& operator>>(istream &inst , Fraction &k)
{
	return inst>>k.num>>k.den;
}

ostream& operator<<(ostream &oust , Fraction &k)	
{
	k.write();
	return oust;
}
	

int main()
{
	Fraction f1(1,2),f2(2,3),f3(2),f4(2,4),f5(-3,5),f6(0),ans;
	Fraction g1(4,5),g2;
	
	ans=f1+f2;

	cout<<f1<<"+"<<f2<<"="<<ans<<endl;
	ans=f1-f2;
	cout<<f1<<"-"<<f2<<"="<<ans<<endl;
	ans=f1*f3;
	cout<<f1<<"*"<<f3<<"="<<ans<<endl;
	ans=f1-f4;
	cout<<f1<<"-"<<f4<<"="<<ans<<endl;
	ans=f2/f4;
	cout<<f2<<"/"<<f4<<"="<<ans<<endl;
	ans=f2/f5;
	cout<<f2<<"/"<<f5<<"="<<ans<<endl;
	ans=f6*f2;
	cout<<f6<<"*"<<f2<<"="<<ans<<endl;
	ans=1+f5;
	cout<<1<<"+"<<f5<<"="<<ans<<endl;

	cout<<"分数を入力-->"; 
	cin>>g1;
	cout<<"分数を入力-->";
	cin>>g2;
	ans=g1*g2;
	cout<<g1<<"*"<<g2<<"="<<ans<<endl;
}