2-8-3 分數類中的運算子過載
阿新 • • 發佈:2019-02-10
問題及程式碼:
#include <iostream> #include <cmath> #include <stdlib.h> using namespace std; class CFraction { private: int nume; // 分子 int deno; // 分母 public: CFraction(int nu=0,int de=1):nume(nu),deno(de) {}; //建構函式,初始化用 void set(int nu=0,int de=1); //置值,改變值時用 void input(); //按照"nu/de"的格式,如"5/2"的形式輸入 void simplify(); //化簡(使分子分母沒有公因子) void amplify(int n); //放大n倍,如2/3放大5倍為10/3 void output(int style=0); //輸出:以8/6為例,style為0時,原樣輸出8/6; int gcd(int n,int d); CFraction operator+(CFraction &c); CFraction operator-(CFraction &c); CFraction operator*(CFraction &c); CFraction operator/(CFraction &c); bool operator > (CFraction &c); bool operator < (CFraction &c); bool operator >= (CFraction &c); bool operator <= (CFraction &c); bool operator == (CFraction &c); bool operator != (CFraction &c); //style為1時,輸出化簡後形式4/3; //style為2時,輸出1(1/3)形式,表示一又三分之一; //style為3時,用小數形式輸出,如1.3333; //預設方式0 }; void CFraction::set(int nu,int de) { nume=nu; deno=de; }; void CFraction::input() { int a,b; char c; while(1) { cin>>a>>c>>b; if(c!='/') cout<<"輸入有誤,請重輸:"; else { nume=a; deno=b; break; } } } void CFraction::simplify() { int n=gcd(nume,deno); nume=nume/n; deno=deno/n; } void CFraction::amplify(int n) { nume*=n; } void CFraction::output(int style) { switch(style) { case 0: { cout<<nume<<'/'<<deno<<endl; break; } case 1: { simplify(); cout<<nume<<'/'<<deno<<endl; break; } case 2: { int i; i=nume/deno; nume=nume%deno; if(i==0) cout<<nume<<'/'<<deno<<endl; else if(nume==0) cout<<i<<endl; else cout<<i<<'('<<nume<<'/'<<deno<<')'<<endl; break; case 3: { cout<<double(nume)/double(deno)<<endl; break; } } } } int CFraction::gcd(int n,int d) { int r; for ( ; d!=0 ;) //用for迴圈構造的輾轉相除法 { r = n%d ; n = d ; d = r ; } return n; } CFraction CFraction::operator+(CFraction &c) { CFraction c1(nume*c.deno+deno*c.nume,deno*c.deno); c1.simplify(); return c1; } CFraction CFraction::operator-(CFraction &c) { CFraction c1(nume*c.deno-deno*c.nume,deno*c.deno); c1.simplify(); return c1; } CFraction CFraction::operator*(CFraction &c) { CFraction c1(nume*c.nume,deno*c.deno); c1.simplify(); return c1; } CFraction CFraction::operator/(CFraction &c) { CFraction c1(nume*c.deno,deno*c.nume); c1.simplify(); return c1; } bool CFraction::operator>(CFraction &c) { CFraction c1; double x; c1=*this-c; x=c1.nume*c1.deno; return (x>0); } bool CFraction::operator<(CFraction &c) { CFraction c1; double x; c1=*this-c; x=c1.nume*c1.deno; return (x<0); } bool CFraction::operator<=(CFraction &c) { return !(*this>c); } bool CFraction::operator>=(CFraction &c) { return !(*this<c); } bool CFraction::operator==(CFraction &c) { simplify(); c.simplify(); if(nume==c.nume&&deno==c.deno) return true; else return false; } bool CFraction::operator!=(CFraction &c) { return !(*this==c); } int main() { CFraction c1,c2(4,2),c3(8,6),c4,c5,c6(1,3),c7(1,4),c8(1,2),c9(3,6); c1.output(); c2.output(1); c2.set(3,4); c2.amplify(3); c2.output(2); c3.simplify(); c3.output(3); c4.input(); c4.output(); c5=c6+c7; c5.output(); c5=c6-c7; c5.output(); c5=c6*c7; c5.output(); c5=c6/c7; c5.output(); cout<<(c6>c7?"c6>c7":"c6<c7")<<endl; cout<<(c6<c7?"c6<c7":"c6>c7")<<endl; cout<<(c6>=c7?"c6>=c7":"c6<c7")<<endl; cout<<(c6<=c7?"c6<=c7":"c6>c7")<<endl; cout<<(c8==c9?"c8=c9":"c8!=c9")<<endl; cout<<(c6!=c7?"c6!=c7":"c6=c7")<<endl; return 0; }
執行結果:
學習小結:
好像是第一次來鐘樓程式設計!有點緊張啊,哈哈
程式中遇到幾個問題,用debug順利的解決了,才發現這玩意真的很好用
還有一個沒解決的問題就是在set();函式中怎麼判斷輸入的兩個是int型資料,不然我如果輸入三個字母,程式就無限迴圈了。