2015年大一下第6周專案3-分數類中的運算子過載(2)分數與整數的加減乘除
阿新 • • 發佈:2019-01-09
/* *Copyright (c) 2014,煙臺大學計算機學院 *All rights reserved. *檔名稱:Annpion.cpp *作者:王耀鵬 *完成日期:2015年4月29日 *版本號:v1.0 * *問題描述:在(1)的基礎上,實現分數類中的物件和整型數的四則運算。分數類中的物件可以和整型數進行四則運算,且運算符合交換律。 *輸入描述:無。 *輸出描述:分數之間和分數與整數之間的加減乘除及比較。 */ #include<iostream> #include<cstdlib> using namespace std; int gcd(int m, int n); class CFraction { private: int nume; // 分子 int deno; // 分母 public: CFraction(int nu=0,int de=1); //建構函式,初始化用 CFraction operator+(CFraction &c); CFraction operator-(CFraction &c); CFraction operator*(CFraction &c); CFraction operator/(CFraction &c); CFraction operator+(); CFraction operator-(); bool operator>(CFraction &c); bool operator<(CFraction &c); bool operator==(CFraction &c); bool operator>=(CFraction &c); bool operator<=(CFraction &c); bool operator!=(CFraction &c); friend CFraction operator+(CFraction &c,int i); friend CFraction operator+(int i,CFraction &c); friend CFraction operator-(CFraction &c,int i); friend CFraction operator-(int i,CFraction &c); friend CFraction operator*(CFraction &c,int i); friend CFraction operator*(int i,CFraction &c); friend CFraction operator/(CFraction &c,int i); friend CFraction operator/(int i,CFraction &c); friend bool operator>(CFraction &c,int i); friend bool operator>(int i,CFraction &c); friend bool operator<(CFraction &c,int i); friend bool operator<(int i,CFraction &c); friend bool operator==(CFraction &c,int i); friend bool operator==(int i,CFraction &c); friend bool operator>=(CFraction &c,int i); friend bool operator>=(int i,CFraction &c); friend bool operator<=(CFraction &c,int i); friend bool operator<=(int i,CFraction &c); friend bool operator!=(CFraction &c,int i); friend bool operator!=(int i,CFraction &c); void display(); void simplify(); }; CFraction::CFraction(int nu,int de) //建構函式,初始化用 { if (de!=0) { nume=nu; deno=de; } else { cerr<<"初始化中發生錯誤,程式退出\n"; exit(0); } } // 求m,n的最大公約數 int gcd(int m, int n) //這個函式可以定義為類的成員函式,也可以為一般函式 { int r; if (m==0) { return n; } while(r=m%n) // 求m,n的最大公約數 { m=n; n=r; } return n; } CFraction CFraction::operator+(CFraction &c) { CFraction a((nume*c.deno+c.nume*deno),(deno*c.deno)); a.simplify(); return a; } CFraction CFraction::operator-(CFraction &c) { CFraction a((nume*c.deno-c.nume*deno),(deno*c.deno)); a.simplify(); return a; } CFraction CFraction::operator*(CFraction &c) { CFraction a(nume*c.nume,(deno*c.deno)); a.simplify(); return a; } CFraction CFraction::operator/(CFraction &c) { CFraction a(c.deno,c.nume); ((*this)*a).simplify(); return (*this)*a; } CFraction CFraction::operator+() { return *this; } CFraction CFraction::operator-() { nume=-nume; deno=-deno; return *this; } bool CFraction::operator>(CFraction &c) { int a=nume*c.deno,b=c.nume*deno; return a>b; } bool CFraction::operator<(CFraction &c) { int a=nume*c.deno,b=c.nume*deno; return a<b; } bool CFraction::operator==(CFraction &c) { int a=nume*c.deno,b=c.nume*deno; return !((a>b)||(a<b)); } bool CFraction::operator>=(CFraction &c) { int a=nume*c.deno,b=c.nume*deno; return !(a<b); } bool CFraction::operator<=(CFraction &c) { int a=nume*c.deno,b=c.nume*deno; return !(a>b); } bool CFraction::operator!=(CFraction &c) { int a=nume*c.deno,b=c.nume*deno; return !(a==b); } CFraction operator+(CFraction &c,int i) { CFraction a(c.nume+i*c.deno,c.deno); a.simplify(); return a; } CFraction operator+(int i,CFraction &c) { return c+i; } CFraction operator-(CFraction &c,int i) { CFraction a(c.nume-i*c.deno,c.deno); a.simplify(); return a; } CFraction operator-(int i,CFraction &c) { CFraction a(i*c.deno-c.nume,c.deno); a.simplify(); return a; } CFraction operator*(CFraction &c,int i) { CFraction a(i*c.deno,c.deno); return c*a; } CFraction operator*(int i,CFraction &c) { CFraction a(i*c.deno,c.deno); return c*a; } CFraction operator/(CFraction &c,int i) { CFraction a(1,i); return c*a; } CFraction operator/(int i,CFraction &c) { CFraction a(i*c.deno,c.nume); a.simplify(); return a; } bool operator>(CFraction &c,int i) { CFraction a(i*c.deno,c.deno); return c>a; } bool operator>(int i,CFraction &c) { CFraction a(i*c.deno,c.deno); return a>c; } bool operator<(CFraction &c,int i) { CFraction a(i*c.deno,c.deno); return c<a; } bool operator<(int i,CFraction &c) { CFraction a(i*c.deno,c.deno); return a<c; } bool operator==(CFraction &c,int i) { return !(c>i||c<i); } bool operator==(int i,CFraction &c) { return !(i>c||i<c); } bool operator>=(CFraction &c,int i) { return !(c<i); } bool operator>=(int i,CFraction &c) { return !(i<c); } bool operator<=(CFraction &c,int i) { return !(c>i); } bool operator<=(int i,CFraction &c) { return !(i>c); } bool operator!=(CFraction &c,int i) { return !(c==i); } bool operator!=(int i,CFraction &c) { return !(i==c); } void CFraction::display() { cout<<nume<<"/"<<deno<<endl; } void CFraction::simplify() { int d=gcd(nume,deno); nume/=d; deno/=d; if(deno<0) { nume=-nume; deno=-deno; } } int main() { CFraction x(1,3),y(-5,10),s; cout<<"分數x=1/3 y=-5/10"<<endl; s=+x+y; cout<<"+x+y="; s.display(); s=x-y; cout<<"x-y="; s.display(); s=x*y; cout<<"x*y="; s.display(); s=x/y; cout<<"x/y="; s.display(); s=-x+y; cout<<"-x+y="; s.display(); x.display(); if (x>y) cout<<"大於"<<endl; if (x<y) cout<<"小於"<<endl; if (x==y) cout<<"等於"<<endl; y.display(); cout<<endl; CFraction c1(5,3),c2; //以下建議在除錯環境中完成測試, c2=c1+5; cout<<"c1+5="; c2.display(); c2=5+c1; cout<<"5+c1="; c2.display(); c2=c1-5; cout<<"c1-5="; c2.display(); c2=5-c1; cout<<"5-c1="; c2.display(); c2=c1*5; cout<<"c1*5="; c2.display(); c2=5*c1; cout<<"5*c1="; c2.display(); c2=c1/5; cout<<"c1/5="; c2.display(); c2=5/c1; cout<<"5/c1="; c2.display(); bool b; b=(c1>2); { if(b) cout<<"c1>2"<<endl; else cout<<"c1≤2"<<endl; } b=(2>c1); { if(b) cout<<"2>c1"<<endl; else cout<<"2≤c1"<<endl; } return 0; }
執行結果: