今日のソース
今完成した。分数演算のクラス設計。とりあえずできたのだが、入出力演算子のオーバーロードがなぜこれでうまくいくのかがすっきり理解できない。
#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; }