第九周上机实践项目3-分数类中的运算符重载(续 重载输入输出流)

来源:互联网 发布:非法网络渗透罪 编辑:程序博客网 时间:2024/05/22 00:21

分数类中的运算符重载基础上
(1)定义分数的一目运算+和-,分别代表分数取正和求反,将“按位取反运算符”~重载为分数的求倒数运算。
(2)定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。

/* *Copyright  (c)  2014,烟台大学计算机学院 *All rights reserved. *文件名称: test.cpp *作        者:满星辰 *完成日期:2015 年 5 月 8日 *版本号:v1.0 */#include <iostream>#include <cstdlib>using namespace std;int gcd(int x,int y){    int r;    while(y!=0)    {        r=x%y;        x=y;        y=r;    }    return x;}class CFraction{private:    int nume;  // 分子    int deno;  // 分母public:    CFraction(int nu=0,int de=1);  //构造函数,初始化用    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    //输出:以8/6为例,style为0时,原样输出8/6;    //style为1时,输出化简后形式4/3;    //style为2时,输出1(1/3)形式,表示一又三分之一;    //style为3时,用小数形式输出,如1.3333;    //默认方式0    bool operator > (CFraction &f);    bool operator < (CFraction &f);    bool operator >= (CFraction &f);    bool operator <= (CFraction &f);    bool operator == (CFraction &f);    bool operator != (CFraction &f);    CFraction operator+(CFraction &f);    CFraction operator-(CFraction &f);    CFraction operator*(CFraction &f);    CFraction operator/(CFraction &f);    CFraction operator+();//一目运算取正    CFraction operator-();//一目运算求反    CFraction operator~();//求倒数    friend istream &operator>>(istream &input,CFraction &c);//输入分数    friend ostream &operator<<(ostream &out,CFraction &c);//输出分数};int main(){    CFraction f1,f2,f3,f4;    cout<<"输入f1的值:";    cin>>f1;    cout<<"输入f2的值:";    cin>>f2;    cout<<"输入f3的值:";    cin>>f3;    cout<<"f1是否比f3大?";    cout<<((f1>f3)?"是":"否")<<endl;    cout<<"f1是否比f2小?";    cout<<((f1<f2)?"是":"否")<<endl;    cout<<"f1是否大于或等于f2?";    cout<<((f1>=f2)?"是":"否")<<endl;    cout<<"f1是否小于或等于f3?";    cout<<((f1<=f3)?"是":"否")<<endl;    cout<<"f1是否等于f3?";    cout<<((f1==f3)?"是":"否")<<endl;    cout<<"f1是否不等于f2?";    cout<<((f1!=f2)?"是":"否")<<endl;    cout<<f1<<"+"<<f2<<"=";    f4=f1+f2;    cout<<f4<<endl;    cout<<f1<<"-"<<f2<<"=";    f4=f1-f2;    cout<<f4<<endl;    cout<<f1<<"*"<<f2<<"=";    f4=f1*f2;    cout<<f4<<endl;    cout<<f1<<"/"<<f2<<"=";    f4=f1/f2;    cout<<f4<<endl;    cout<<"+f3=";    f4=+f3;    cout<<f4<<endl;    cout<<"-f3=";    f4=-f3;    cout<<f4<<endl;    cout<<"~f3(取倒数)=";    f4=+f3;    cout<<f4<<endl;    return 0;}CFraction::CFraction(int nu,int de)//初始化只在声明时用{    if(de!=0)//忘记分母不能为零这回事了。。。    {        nume=nu;        deno=de;    }    else    {        cout<<"error!"<<endl;        exit(0);//退出需要用头文件#include <cstdlib>    }}void CFraction::set(int nu,int de){    if(de!=0)    {        nume=nu;        deno=de;    }    else    {        cout<<"error!"<<endl;        exit(0);//退出需要用头文件#include <cstdlib>    }    return;}void CFraction::simplify(){    int x,y,r;    x=nume;    y=deno;    while(y!=0)    {        r=x%y;        x=y;        y=r;    }    nume/=x;    deno/=x;    return;}void CFraction::amplify(int n){    nume*=n;    return;}bool CFraction::operator > (CFraction &f){    return (nume/deno>f.nume/f.deno);}bool CFraction::operator < (CFraction &f){    return (nume/deno<f.nume/f.deno);}bool CFraction::operator >= (CFraction &f){    return !(nume/deno<f.nume/f.deno);}bool CFraction::operator <= (CFraction &f){    return !(nume/deno>f.nume/f.deno);}bool CFraction::operator == (CFraction &f){    return (nume/deno==f.nume/f.deno);}bool CFraction::operator != (CFraction &f){    return (nume/deno!=f.nume/f.deno);}CFraction CFraction::operator+(CFraction &f){    CFraction f1;    int mgy=gcd(deno,f.deno);    f1.deno=deno*f.deno/mgy;    f1.nume=f.deno/mgy*nume+deno/mgy*f.nume;    f1.simplify();    return f1;}CFraction CFraction::operator-(CFraction &f){    CFraction f1(-f.nume,f.deno),f2;    (*this+f1).simplify();    return (*this+f1);}CFraction CFraction::operator*(CFraction &f){    CFraction f1;    f1.nume=nume*f.nume;    f1.deno=deno*f.deno;    f1.simplify();    return f1;}CFraction CFraction::operator/(CFraction &f){    CFraction f1(f.deno,f.nume);    (*this*f1).simplify();    return (*this*f1);}CFraction CFraction::operator+()//一目运算取正{    return *this;}CFraction CFraction::operator-()//一目运算求反{    CFraction c(-nume,deno);    return c;}CFraction CFraction::operator~()//求倒数{    CFraction c(deno,nume);    if(nume==0)        cout<<"error!"<<endl;    else        return c;}istream &operator>>(istream &input,CFraction &c)//输入分数{    char ch;    while(1)    {        input>>c.nume>>ch>>c.deno;        if(ch!='/')        {            cout<<"input error!"<<endl;        }        else if(c.deno==0)        {            cout<<"deno can't be 0!"<<endl;        }        else            break;    }    return input;}ostream &operator<<(ostream &out,CFraction &c)//输出分数{    if((c.nume>0&&c.deno>0)||(c.nume<0&&c.deno>0))        cout<<c.nume<<"/"<<c.deno;    else if(c.nume>0&&c.deno<0)    {        cout<<-c.nume<<"/"<<-c.deno;    }    else    {        cout<<-c.nume<<"/"<<-c.deno;    }    return cout;}

图片:


心得:

记得课件上的 ostream&后面跟的是output呀,怎么这次用output做不出来了。。。换成out就可以了。。。

所以说这只是个符号吗o(╯□╰)o



0 0
原创粉丝点击