鱼C论坛

 找回密码
 立即注册
查看: 1088|回复: 3

[作品展示] C++入门学习运算符重载有理数运算作业

[复制链接]
发表于 2024-3-15 20:00:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

#include<iostream>
#include<string>
#include<sstream>
#include<math.h>

// 辗转相除法
int gcb(int a,int b){
        int c;
        if(a < b){
                c = a;
                a = b;
                b = c;
        }
        while(b != 0){
                c = a % b;
                a = b;
                b = c;
        }
        return a;
}

class Rational{
        public:
                Rational(){
                        this->denominator = 0;
                        this->numerator = 0;
                }
                Rational(int numerator,int denominator){
                        this->denominator = denominator;
                        this->numerator = numerator;
                        simplify();
                }
                void print(){
                        std::cout << getRational() << "\n";
                }
                std::string getRational(){
                        std::stringstream str;
                        if(numerator == 0 || denominator == 0){
                                str << 0;
                        }else if(numerator % denominator == 0){
                                // 能整除
                                str << (numerator/denominator);
                        }else {
                                str << numerator << "/" << denominator;
                        }
                        return str.str();
                }
                Rational operator+(Rational r){
                        return Rational(numerator * r.denominator + r.numerator * denominator ,denominator * r.denominator);
                }
                Rational operator-(Rational r){
                        return Rational(numerator * r.denominator - r.numerator * denominator , denominator * r.denominator);
                }
                Rational operator*(Rational r){
                        return Rational(numerator * r.numerator, denominator * r.denominator);
                }
                Rational operator/(Rational r){
                        return Rational(numerator * r.denominator, denominator * r.numerator);
                }
                // 化简方法
                void simplify(){
                        int c = gcb(abs(numerator),denominator); // 避免得到负数公因数,从而控制负数在分子上
                        numerator /= c;
                        denominator /= c;
                }
                 
        private:
                int numerator; // 分子
                int denominator; // 分母
};


int main(){
        Rational r1(1,3),r2(-2,3),r3;
        r1.print();
        r2.print();
        r3 = r1 - r2;
        r3.print();
       
        return 0;       
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-3-15 20:01:09 | 显示全部楼层
代码缺少print函数的具体实现,以下是完整的Rational类的定义和成员函数的实现:

  1. #include <iostream>

  2. class Rational {
  3. private:
  4.     int numerator;    // 分子
  5.     int denominator;  // 分母

  6. public:
  7.     Rational() : numerator(0), denominator(1) {}

  8.     // 构造函数重载
  9.     Rational(int numerator, int denominator) : numerator(numerator), denominator(denominator) {
  10.         simplify();  // 约简
  11.     }

  12.     void print() const {
  13.         std::cout << numerator << "/" << denominator << std::endl;
  14.     }

  15.     // 辗转相除法求最大公约数
  16.     static int gcd(int a, int b) {
  17.         int c;
  18.         if (a < b) {
  19.             c = a;
  20.             a = b;
  21.             b = c;
  22.         }
  23.         while (b != 0) {
  24.             c = a % b;
  25.             a = b;
  26.             b = c;
  27.         }
  28.         return a;
  29.     }

  30.     // 约简有理数
  31.     void simplify() {
  32.         int g = gcd(numerator, denominator);
  33.         numerator /= g;
  34.         denominator /= g;

  35.         // 处理负号
  36.         if (denominator < 0) {
  37.             numerator = -numerator;
  38.             denominator = -denominator;
  39.         }
  40.     }

  41.     // 运算符重载:加法
  42.     Rational operator+(const Rational& other) const {
  43.         int newNumerator = numerator * other.denominator + other.numerator * denominator;
  44.         int newDenominator = denominator * other.denominator;
  45.         return Rational(newNumerator, newDenominator);
  46.     }

  47.     // 运算符重载:减法
  48.     Rational operator-(const Rational& other) const {
  49.         int newNumerator = numerator * other.denominator - other.numerator * denominator;
  50.         int newDenominator = denominator * other.denominator;
  51.         return Rational(newNumerator, newDenominator);
  52.     }

  53.     // 运算符重载:乘法
  54.     Rational operator*(const Rational& other) const {
  55.         int newNumerator = numerator * other.numerator;
  56.         int newDenominator = denominator * other.denominator;
  57.         return Rational(newNumerator, newDenominator);
  58.     }

  59.     // 运算符重载:除法
  60.     Rational operator/(const Rational& other) const {
  61.         int newNumerator = numerator * other.denominator;
  62.         int newDenominator = denominator * other.numerator;
  63.         return Rational(newNumerator, newDenominator);
  64.     }
  65. };

  66. int main() {
  67.     Rational r1(1, 2);
  68.     Rational r2(1, 3);

  69.     Rational r3 = r1 + r2;
  70.     r3.print();  // 输出:5/6

  71.     Rational r4 = r1 - r2;
  72.     r4.print();  // 输出:1/6

  73.     Rational r5 = r1 * r2;
  74.     r5.print();  // 输出:1/6

  75.     Rational r6 = r1 / r2;
  76.     r6.print();  // 输出:3/2

  77.     return 0;
  78. }
复制代码


在这段代码中,我们使用了成员函数和静态成员函数来实现有理数的运算符重载和约简。运算符重载函数返回一个新的有理数对象,并且使用该对象的构造函数进行初始化。同时,我们还在print函数前加上了const关键字,表示该函数不会修改对象的成员值。这是因为只是输出对象的值,并不会对其进行修改。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-17 15:29:31 | 显示全部楼层
FishC 发表于 2024-3-15 20:01
代码缺少print函数的具体实现,以下是完整的Rational类的定义和成员函数的实现:

你好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-17 15:29:39 | 显示全部楼层


你好!有什么问题可以帮助你解答吗?

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-3 13:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表