c++重载运算符实验定义分数类实现分数间四则运算

实验二           自定义类型的运算

【实验目的】

  1. 理解运算符函数与运算符重载方法;
  2. 掌握运算符重载为友元函数;

 

【实验内容】

题目:

在C++中,分数不是预先定义的,建立一个分数类,使之具有以下功能:能防止分母为0、当分数不是最简形式时进行约分及分母为负数。用重载运算符完成加法、减法、乘法、除法等四则运算。

 

源程序代码:

#include<iostream>

#include<cstdlib>

using namespace std;

int gcd(int m,int n)//求最大公约数函数

{

    if (m < n)

    {

        int tmp = m;

        m = n;

        n = tmp;

    }

    if (n == 0)

        return m;

    else

        return gcd(n,m % n);

}

 

class fraction   //构建分数类

{

    int a,b;

public:

    fraction(int x=0,int y=1)         //构造函数

    {

        if(y==0)                      //判断分母是否为0

              {

                     cout<<"分母为零"<<endl;

                     exit(0);

              }

        if(y<0)                         //分母小于0时将负号转移到分子上

        {

            a=(-1)*x;

            b=(-1)*y;

        }

        a=x;

        b=y;

    }

    fraction(const fraction&f)//拷贝构造

    {

        a=f.a;

        b=f.b;

}

~fraction(){}//析构函数

    void setfraction(int x,int y)//在类外重新设置分数值

    {

        if(y==0)

          {

                     cout<<"分母为零"<<endl;

                     exit(0);

              }

        if(y<0)

        {

            a=(-1)*x;

            b=(-1)*y;

        }

        a=x;

        b=y;

    }

    void show()//输出最简结果

 

    {

        int flag=1,m;

        if(a<0)

        {

            a=-a;

            flag=-flag;

        }

        if(b<0)

        {

            b=-b;

            flag=-flag;

        }

              m=gcd(a,b);

        a=a/m;

        b=b/m;

        a=a*flag;

        if(a==0||b==1)

            cout<<a<<endl;

        else

            cout<<a<<"/"<<b<<endl;

}

    friend   fraction operator  +  (fraction  &  f1,fraction & f2 ) //以友元函数重载运算符

    {

        return fraction(f1.a * f2.b + f1.b * f2.a , f1.b * f2.b);

    }

    friend  fraction operator  -  (fraction & f1,fraction & f2)

    {

        return fraction(f1.a*f2.b-f1.b*f2.a,f1.b*f2.b);

    }

    friend fraction operator  *  (fraction & f1,fraction & f2)

    {

        return fraction(f1.a*f2.a,f1.b*f2.b);

    }

    friend fraction operator  /  (fraction & f1,fraction & f2)

    {

        return fraction(f1.a*f2.b,f1.b*f2.a);

    }

};

int main()

{

    int a,b;

    cout<<"请输入第一个分数的分子分母"<<endl;

    cin>>a>>b;

    int c,d;

    cout<<"请输入第二个分数的分子分母"<<endl;

    cin>>c>>d;

    fraction a1,a2,a3,a4,a5,a6;

    a1.setfraction(a,b);

    a2.setfraction(c,d);

    a3=a1+a2;

       cout<<"加法结果"<<endl;

    a3.show();

    a4=a1-a2;

       cout<<"减法结果"<<endl;

    a4.show();

    a5=a1*a2;

       cout<<"乘法法结果"<<endl;

    a5.show();

    a6=a1/a2;

       cout<<"除法法结果"<<endl;

a6.show();

 return 0;

}

 

运行结果截图:

 

 

【实验小结】

  1. 在运算完成后输出所需结果时进行约分,使之输出最简结果;
  2. 可以将化简部分写一个单独的函数来使用;
  3. 在重载运算符的时候再运算符前后打上空格使格式好看。

 

转载于:https://www.cnblogs.com/qq252756561/p/4456161.html

(有理数)创建一个名为 Rational 的,用于对分数进行算术运算。编写一个程序来测试你的。使用整数变量来表示的私有实例变量——分子和分母。 提供一个构造函数,使该的对象能够在声明时进行初始化。构造函数应以简化形式存储分数分数 2/4 等价于 1/2,并将作为分子中的 1 和分母中的 2 存储在对象中。 如果没有提供初始值设定项,请提供默认值为 1 的无参数构造函数。 提供执行以下每个操作的公共方法: a) 将两个有理数相加:相加的结果应以简化形式存储。 b) 两个有理数相减:相减的结果应以简化形式存储。 c) 将两个有理数相乘:相乘的结果应以简化形式存储。 d) 将两个有理数相除:相除的结果应以简化形式存储。 e) 以 a/b 的形式返回有理数的字符串表示形式,其中 a 是分子,b 是分母。 f) 以浮点格式返回有理数的字符串表示形式. (考虑提供格式化功能,的用户能够指定小数点右侧的精度位数。) 【Sample output 1】 Enter numerator 1: 12 Enter denominator 1: 3 Enter numerator 2: 5 Enter denominator 2: 14 Enter precision: 3 a=4/1 b=5/14 a + b = 61/14 = 4.357 a - b = 51/14 = 3.643 a * b = 10/7 = 1.429 a / b = 56/5 = 11.200 【Sample output 2】 Enter numerator 1: 1 Enter denominator 1: 4 Enter numerator 2: 75 Enter denominator 2: 35 Enter precision: 1 a=1/4 b=15/7 a + b = 67/28 = 2.4 a - b = -53/28 = -1.9 a * b = 15/28 = 0.5 a / b = 7/60 = 0.1 Note: The red texts are inputed ,others are output texts. Just use a space to seperate words
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值