第八週 專案三(1)分數中的運算子過載
阿新 • • 發佈:2019-02-11
問題及程式碼:
/* * Copyright (c) 2014, 煙臺大學計算機學院 * All rights reserved. * 檔名稱:test.cpp * 作 者:宋健 * 完成日期:2015年 5月 18日 * 版 本 號:v1.0 * * 問題描述:實現分數類中的運算子過載,在分數類中可以完成分數的加減乘除(運算後再化簡)、比較(6種關係)的運算。可以在第4周分數類程式碼的基礎上開始工作。 * 程式輸入: * 程式輸出: */ #include<iostream> #include<Cmath> #include<cstdlib> #include <iomanip> using namespace std; class CFraction { private: int nume; // 分子 int deno; // 分母 public: int gcd(int ,int); CFraction(int nu=0,int de=1); //建構函式,初始化用 void simplify(); //化簡(使分子分母沒有公因子) CFraction operator+(const CFraction &c); CFraction operator-(const CFraction &c); CFraction operator*(const CFraction &c); CFraction operator/(const CFraction &c); bool operator>(const CFraction &c); bool operator<(const CFraction &c); bool operator==(const CFraction &c); bool operator!=(const CFraction &c); bool operator>=(const CFraction &c); bool operator<=(const CFraction &c); void display(); }; CFraction::CFraction(int nu,int de) { if(de!=0) { nume=nu; deno=de; } else cout<<"分母不能為0!"; } void CFraction::simplify() { int m,n,r; m=fabs(deno); n=fabs(nume); while(r=m%n) // 求m,n的最大公約數 { m=n; n=r; } deno/=n; // 化簡 nume/=n; if (deno<0) // 將分母轉化為正數 { deno=-deno; nume=-nume; } } CFraction CFraction::operator+(const CFraction &c) { CFraction x(nume*c.deno+deno*c.nume,deno*c.deno); x.simplify(); return x; } CFraction CFraction::operator-(const CFraction &c) {CFraction x(nume*c.deno-deno*c.nume,deno*c.deno); x.simplify(); return x; } CFraction CFraction::operator*(const CFraction &c) { CFraction x(nume*c.nume,deno*c.deno); x.simplify(); return x; } CFraction CFraction::operator/(const CFraction &c) { CFraction x(nume*c.deno,deno*c.nume); x.simplify(); return x; } bool CFraction::operator>(const CFraction &c) { if(nume*c.deno>deno*c.nume) return true; else return false; } bool CFraction::operator<(const CFraction &c) { if(nume*c.deno<deno*c.nume) return true; else return false; } bool CFraction::operator==(const CFraction &c) { if(*this>c||*this<c) return false; else return true; } bool CFraction::operator!=(const CFraction &c) { if (*this==c) return false; else return true; } bool CFraction::operator>=(const CFraction &c) { if(*this<c) return false; else return true; } bool CFraction::operator<=(const CFraction &c) {if(*this>c) return false; else return true;} void CFraction::display() { cout<<"("<<nume<<"/"<<deno<<")"<<endl; } 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(); x.display(); if (x>y) cout<<"大於"<<endl; if (x<y) cout<<"小於"<<endl; if (x==y) cout<<"等於"<<endl; y.display(); cout<<endl; return 0; }
執行結果:
知識點總結:
化簡自己的方法出錯了可是沒找到哪的錯,先用老師的方法,論演算法重要性