第八週——運算子過載——專案三(一)分數類
阿新 • • 發佈:2019-01-31
問題及程式碼:
/* *Copyright (c) 2014,煙臺大學計算機學院 *All rights reserved. *檔名稱:lily.cpp *作者:李莉 *完成日期:2015年4月25日 *版本號:v1.0 * *問題描述:實現分數類中的運算子過載 *程式輸入:無輸入 *程式輸出:如結果圖 */ #include <iostream> #include <Cmath> using namespace std; class CFraction { private: int nume; // 分子 int deno; // 分母 public: CFraction(int nu=0,int de=1):nume(nu),deno(de) {}; void simplify(); void display(); CFraction operator+(const CFraction &f); CFraction operator-(const CFraction &f); CFraction operator*(const CFraction &f); CFraction operator/(const CFraction &f); bool operator<(const CFraction &f); bool operator>(const CFraction &f); bool operator==(const CFraction &f); bool operator<=(const CFraction &f); bool operator>=(const CFraction &f); bool operator!=(const CFraction &f); }; void CFraction::display() { cout<<"("<<nume<<"/"<<deno<<")"<<endl; } CFraction CFraction::operator+(const CFraction &f) { int n,d; n=nume*f.deno+f.nume*deno; d=deno*f.deno; CFraction f0(n,d); f0.simplify(); return f0; } CFraction CFraction::operator-(const CFraction &f) { int n,d; n=nume*f.deno-f.nume*deno; d=deno*f.deno; CFraction f0(n,d); f0.simplify(); return f0; } CFraction CFraction::operator*(const CFraction &f) { int n,d; n=nume*f.nume; d=deno*f.deno; CFraction f0(n,d); f0.simplify(); return f0; } CFraction CFraction::operator/(const CFraction &f) { int n,d; n=nume*f.deno; d=deno*f.nume; CFraction f0(n,d); f0.simplify(); return f0; } bool CFraction::operator<(const CFraction &f) { int this_nume,f_nume,common_deno; this_nume=nume*f.deno; f_nume=f.nume*deno; common_deno=deno*f.deno; if ((this_nume-f_nume)*common_deno<0) return true; return false; } bool CFraction::operator>(const CFraction &f) { int this_nume,f_nume,common_deno; this_nume=nume*f.deno; f_nume=f.nume*deno; common_deno=deno*f.deno; if ((this_nume>f_nume&&common_deno>0)||(this_nume<f_nume&&common_deno<0)) return true; return false;; } bool CFraction::operator!=(const CFraction &f) { if(*this<f||*this>f) return true; return false; } bool CFraction::operator==(const CFraction &f) { if(*this!=f)return false; return true; } bool CFraction::operator<=(const CFraction &f) { if(*this>f) return false; return true; } bool CFraction::operator>=(const CFraction &f) { if(*this<f) return false; return true; } void CFraction::simplify() { int m,n,r; m=fabs(deno); //此處存在bug,請參看評論1樓 n=fabs(nume); while((r=m%n)) // 求m,n的最大公約數 { m=n; n=r; } deno/=n; // 化簡 nume/=n; if (deno<0) // 將分母轉化為正數 { deno=-deno; nume=-nume; } } int main() { CFraction f1(1,4),f2(1,20),f3; cout<<"分數1是:"<<endl; f1.display(); cout<<"分數2是:"<<endl; f2.display(); f3=f1+f2; cout<<"兩分數相加的結果是:"<<endl; f3.display(); f3=f1*f2; cout<<"兩分數相乘的結果是:"<<endl; f3.display(); f3=f1-f2; cout<<"兩分數相減的結果是:"<<endl; f3.display(); f3=f1/f2; cout<<"兩分數相除的結果是:"<<endl; f3.display(); if(f1>f2) cout<<"f1>f2"<<endl; if(f1==f2) cout<<"f1=f2"<<endl; if(f1<f2) cout<<"f1<f2"<<endl; if(f1!=f2) cout<<"f1≠f2"<<endl; if(f1<=f2) cout<<"f1<=f2"<<endl; if(f1>=f2) cout<<"f1>=f2"<<endl; f2.display(); return 0; }
執行結果:
心得體會:
寫完之後一直改bug。改改改改。。。最值得的一點是,理解了warning的意思,就是那個處理分子分母的最大公約數的時候給的警告,就是混淆了==語=,即應該是使用==而不是=,所以在用一層圓括號,標註出來