12.3.1_1 进阶Fraction分数类的实现

本文介绍了如何用C++编写一个Fraction分数类,包括缺省构造函数、成员函数、友元函数的实现。类中包含了分数的规范化处理,即当分母为0时设置为1,以及分数的加法、乘法操作。此外,还实现了分数的输入输出重载,以最简分数形式展示,并提供了获取分子、分母和小数值的方法。示例代码展示了如何使用这个Fraction类进行分数操作和输出。
摘要由CSDN通过智能技术生成

12.3.1_1 进阶Fraction分数类的实现

编写Fraction 类,封装分数的基本功能。
(1)实现函数重载。
(2)实现各个成员函数、友元函数。
(3) 规范化分数,即分母为0时,将其分母置1

类的定义:

class Fraction
{
public:
    Fraction(); //缺省构造函数设置分子为0,分母为1
    Fraction(int n); //只有1 个参数,设置分子为n,分母为1
    Fraction(int n, int d); //设置分子为n,分母为d
    void setValue(int n, int d); //设置分子和分母
    int getNum(); //获取分子值
    int getDen(); //获取分母值
    double getDoubleValue(); //获取分数对应的小数值
    Fraction add(const Fraction & f2);  //分数相加 
        
    Fraction operator*(const Fraction &f2);  //分数相加 
        
         
    void output(); //按分数形式显示最简分数,按真分数或带分数形式输出,不要有多余的空格 
        
    friend ostream &operator<<(ostream &out, Fraction &f);//重载输出,分数形式显示最简分数,按真分数或带分数形式输出,不要有多余的空格 
    friend istream &operator>>(istream &in, Fraction &f); //输入重载 
private:
    int num; //分子
    int den; //分母
    void normalize();//规范化 
    int gcd();  //求最大公约数
};

裁判测试程序样例:

#include <iostream>
using namespace std;
class Fraction
{
public:
    Fraction(); //缺省构造函数设置分子为0,分母为1
    Fraction(int n); //只有1 个参数,设置分子为n,分母为1
    Fraction(int n, int d); //设置分子为n,分母为d
    void setValue(int n, int d); //设置分子和分母
    int getNum(); //获取分子值
    int getDen(); //获取分母值
    double getDoubleValue(); //获取分数对应的小数值
    Fraction add(const Fraction & f2);  //分数相加 
        
    Fraction operator*(const Fraction &f2);  //分数相加 
        
         
    void output(); //按分数形式显示最简分数,按真分数或带分数形式输出,不要有多余的空格 
        
    friend ostream &operator<<(ostream &out, Fraction &f);//重载输出,分数形式显示最简分数,按真分数或带分数形式输出,不要有多余的空格 
    friend istream &operator>>(istream &in, Fraction &f); //输入重载 
private:
    int num; //分子
    int den; //分母
    void normalize();//规范化 
    int gcd();  //求最大公约数
};
int main()
{
    Fraction f1, f2(2), f3(-3,4);
    int num,den;
    //输入两个分数 
    cin>>num>>den;
    f1.setValue(num,den);
    cin>>f2;

    cout<<"Fraction f1 is ";
    f1.output();
    cout<<"its double value is: "<<f1.getDoubleValue()<<endl;


    cout<<"Fraction f2 is ";
    cout<<f2;
    cout<<"its double value is: "<<f2.getDoubleValue()<<endl;

    cout<<"f1+f2=";  
    f1.add(f2).output();
    f3=f1*f2;
    cout<<"f1*f2=";
    cout<<f3;
    return 0;
}

/* 请在这里填写答案 */

输入样例:
6 4
4 6
输出样例:
Fraction f1 is 1 1/2
its double value is: 1.5
Fraciont f2 is 2/3
its double value is: 0.666667
f1+f2=2 1/6
f1*f2=1

c++解析:

存在部分案例过不去的情况!!!


int fun(int m, int n) {//求最大公约数
    int rem;
    while (n > 0) {
        rem = m % n;
        m = n;
        n = rem;
    }
    return m;
}
int MinCommonMultiple(int a, int b)//求最小公倍数
{
    int i;
    for (i = 1; i < a * b; i++)
    {
        if (i % a == 0 && i % b == 0)
            return i;
    }
}
void Fraction::normalize()
{
    if (this->den == 0)this->den = 1;
}
Fraction::Fraction()
{
    num = 0; den = 1;
}
Fraction::Fraction(int n)
{
    num = n; den = 1;
}
Fraction::Fraction(int n, int d)
{
    num = n; den = d;
    if (den == 0)den = 1;
}
void Fraction::setValue(int n, int d)
{
    num = n; den = d;
    if (den == 0)den = 1;
}
int Fraction::getNum()
{
    return num;
}
int Fraction::getDen()
{
    return den;
}
double Fraction::getDoubleValue()
{
    double i = num / (den * 1.0);
    if (i == 0)return 0;
    return i;
}
Fraction Fraction::add(const Fraction& f2)
{
    //cout << "相加" << endl;
    //cout << endl << "f1 = "<<this->num << "/" << this->den << endl;
    //cout << endl << "f2 = " << f2.num << "/" << f2.den << endl;
    int bei = MinCommonMultiple(this->den, f2.den);//求出两个分母的最小公倍数
    //cout << this->num * (bei / this->den) << "    " << f2.num * (bei / f2.den) << endl;
    int x = this->num * (bei / this->den) + f2.num * (bei/f2.den);
    int y = bei;
    //cout <<"bei =  "<<bei<<"  x = " << x << "  y = " << y << endl;
    Fraction t(x, y);
    return t;
}
Fraction Fraction::operator*(const Fraction& f2)
{
    Fraction f(this->num * f2.num, this->den * f2.den);
    return f;
}

void Fraction::output()
{
    if (den * num < 0)cout << "-";
    if (abs(this->num) % abs(this->den) ==0)
    {
        cout << abs(num) / abs(den) << endl;
        return;
    }
    int t = abs(num)% abs(den);
    if (abs(this->num) > abs(this->den))
    {
        cout << abs(num) / abs(den) << " ";
    }
    int y = fun(abs(num), abs(den));
    cout << t / y << "/" << abs(den) / y << endl;
}

ostream& operator<<(ostream& out, Fraction& f)
{
    f.output();
    return out;
}
istream& operator>>(istream& in, Fraction& f)
{
    int num, den;
    cin >> num >> den;
    f.setValue(num, den);
    return in;
}


设计并实现一个动态整型数组Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。 设计并实现一个动态整型数组Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微__凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值