运算符重载函数作为类的成员函数——有理数的约分

news2024/12/27 11:18:22

目录

一、题目

二、代码

三、算法分析

(一)数学表达式

(二) 代码实现

一)+运算符重载函数

二)优化函数(实现有理数约分)


一、题目

通过运算符重载为类的成员函数来实现两个有理数对象的加减乘除运算;

有理数是一个可以化为分数的数,如2/3,533/920,都是有理数,而根号2、Π等就为无理数。

在C++中,并没有预先定义有理数,需要时可以声明一个有理数类,将有理数的分子和分母分别存放在nume和deno变量中,对有理数的各种操作都可以用重载运算符来实现。可以写一个优化函数optimize,它的作用时使有理数约去公分母,也就是说,使保存的有理数分子和分母之间没有公约数(除1以外)。在创建有理数对象时才能执行它,在执行各种运算之后也能执行它,从而保证所存储的有理数都是最优的。

二、代码

#include<iostream>
using namespace std;
#include<cmath>

class Rational        //定义有理数类
{
	public:
		Rational(int x=0,int y=1);        //类的构造函数
		void print();                     //打印出有理数
		Rational operator+(Rational a);   //类的运算符重载函数(成员函数),实现有理数加法
	private:
		int nume;                         //分子
		int deno;                         //分母
		void optimize();                  //优化函数,实现对有理数的约分
};
void Rational::optimize()        //优化函数,实现对有理数的约分
{
	int gcd,i;                   //gcd存放分子和分母较大的一个,i记录更新的公约数
	if(nume==0)                  //①如果分子为0,则分母置1,返回,约分结束
	{
		deno=1;
		return;
	}
                                 //②分子不为0,继续约分操作
	gcd=(abs(nume)>abs(deno)?abs(nume):abs(deno));  //gcd为分子和分母中较大的一个
	if(gcd==0)                                      //若为0,则无需约分,返回,结束约分操作
		return ;
	for(i=gcd;i>1;i--)                 //for循环,从gcd开始,逐次-1,判断是否为公约数,找到一个即返回(最大公约数)
	{
		if((nume%i==0)&&(deno%i)==0)   //判断是否为公约数
		break;
	}
	nume/=i;                //根据找到的最大公约数,更新分子和分母
	deno/=i;
	if(nume<0&&deno<0)      //若分子分母同为负数,则结果为正,所以均改为正
	{
		nume=-nume;
		deno=-deno;
	}
	else if(nume<0||deno<0)  //若分子分母中有一个为负,则结果为负,分子调整为负,分母调整为正
	{
		nume=-abs(nume);
		deno=abs(deno);
	}
}
Rational::Rational(int x,int y)        //构造函数的定义,同时调用优化函数,对有理数继续约分
{
	nume=x;
	deno=y;
	optimize();
}
void Rational::print()                //打印有理数
{
	cout<<nume;
	if(nume!=NULL)                    //①分子不为0
	cout<<"/"<<deno<<endl;
	else                              //②分子为0
	cout<<endl;
}
//函数返回的不是引用类型,因为不可以作为左值
Rational Rational::operator+(Rational a)    //+运算符重载函数,实现类(用户自定义的数据类型)的加法运算
{
	Rational r;                       //定义一个临时变量,自动调用类的构造函数,占有栈区,程序结束后系统自动调用析构函数,释放内存
	r.deno=a.deno*deno;
	r.nume=a.nume*deno+a.deno*nume;
	r.optimize();                     //运算完也需要约分
	return r;
}
int main()
{
	Rational r1(3,14),r2(4,14),r3;
	r1.print();
	r2.print();
	r3=r1+r2;
	r3.print();
	return 0;
}

三、算法分析

有理数相加

(一)数学表达式

当两个有理数 \frac{a}{b}\frac{c}{d}相加时,可得到这样的算式

                                                    \frac{a*d+b*c}{b*d}

分子分母分开存放

                                                  分子=a*d+b*c

                                                  分母=b*d

运算完毕后,需要对词有理数继续优化,

此操作可通过重载运算符“+”实现。

(二) 代码实现

一)+运算符重载函数

代码

Rational Rational::operator+(Rational a)    //+运算符重载函数,实现类(用户自定义的数据类型)的加法运算
{
    Rational r;                       //定义一个临时变量,自动调用类的构造函数,占有栈区,程序结束后系统自动调用析构函数,释放内存
    r.deno=a.deno*deno;
    r.nume=a.nume*deno+a.deno*nume;
    r.optimize();                     //运算完也需要约分
    return r;
}

分析

       重载了运算符后,在进行有理数运算时,只需像基本类型的运算一样书写即可,这样给用户带来了很大的方便,并且很直观。

r3=r1+r2;

执行时,C++可以解释为

r3=r1.operator+(r2);

       由此可以看出,C++系统在处理算术表达式“r1+r2”时,把对表达式的处理自动转化为对成员运算符重载函数operator+的调用(r1.operator+(r2)),通过“+”运算符左边的对象去调用operator+,“+”右边的对象作为函数调用的实参。

       这样双目运算符左边的对象就由系统通过this指针隐含地传递给operator+函数。因此,如果将双目运算符函数重载为类的成员函数,其参数表只需写一个形参就可以了。

       但必须要求运算表达式第一个参数(运算符左边的操作数)是一个类对象。而且与运算符函数的返回类型相同。这是因为必须通过类的对象去调用该类的成员函数,而且只要运算符重载函数返回值与改对象同类型,运算才有意义。

二)优化函数(实现有理数约分)

代码

void Rational::optimize()        //优化函数,实现对有理数的约分
{
    int gcd,i;                   //gcd存放分子和分母较大的一个,i记录更新的公约数
    if(nume==0)                  //①如果分子为0,则分母置1,返回,约分结束
    {
        deno=1;
        return;
    }
                                 //②分子不为0,继续约分操作
    gcd=(abs(nume)>abs(deno)?abs(nume):abs(deno));  //gcd为分子和分母中较大的一个
    if(gcd==0)                                      //若为0,则无需约分,返回,结束约分操作
        return ;
    for(i=gcd;i>1;i--)                 //for循环,从gcd开始,逐次-1,判断是否为公约数,找到一个即返回(最大公约数)
    {
        if((nume%i==0)&&(deno%i)==0)   //判断是否为公约数
        break;
    }


    nume/=i;                //根据找到的最大公约数,更新分子和分母
    deno/=i;


    if(nume<0&&deno<0)      //若分子分母同为负数,则结果为正,所以均改为正
    {
        nume=-nume;
        deno=-deno;
    }
    else if(nume<0||deno<0)  //若分子分母中有一个为负,则结果为负,分子调整为负,分母调整为正
    {
        nume=-abs(nume);
        deno=abs(deno);
    }
}

分析

寻找最大公约数的步骤

①初始最大公约数gcd

 gcd=(abs(nume)>abs(deno)?abs(nume):abs(deno));  //gcd为分子和分母中较大的一个

②    判断是否为公约数

for(i=gcd;i>1;i--)                 //for循环,从gcd开始,逐次-1,判断是否为公约数,找到一个即返回(最大公约数)
    {
        if((nume%i==0)&&(deno%i)==0)   //判断是否为公约数
        break;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/542385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云计算与虚拟化】第二章 实验一 VMware Workstation的使用

实验一 vmware workstation的使用 安装Windows Server 2012 R2虚拟机&#xff0c;并激活&#xff08;计算机命名为&#xff1a;学号姓名拼音的首字母&#xff09; 2.在Windows Server 2012 R2的虚拟机中安装VMTools 3.关机创建快照&#xff08;快照命名为&#xff1a;学号姓名…

OMG Data Distribution Service(DDS)规范解读-Part4

目录 2.4 Listeners, Conditions, and Wait-sets2.4.1 Communication Status2.4.2 Changes in Status2.4.2.1 Plain communication statuses2.4.2.2 Read Communication Statuses 2.2.4.3 Access through Listeners2.2.4.3.1 Listener Access to Plain Communication Status2.2…

I2C总线

基于linux-3.14.16 一、注册I2C总线 以上代码即完成了i2c总线的注册&#xff0c;并且添加了一个i2c驱动dummy_driver 二、注册适配器 1、平台总线匹配 设备树有i2c1设备 平台总线匹配后执行probe 2、执行probe 获取中断号 获取地址资源并映射 填充i2c_adapter&#…

chatgpt赋能Python-python3_7如何安装matplotlib

Python3.7如何安装Matplotlib Matplotlib是一个Python的绘图库&#xff0c;可以帮助用户制作2D和3D图表和图形。它利用了NumPy、SciPy和其他Python包&#xff0c;具有出色的兼容性和可视化效果&#xff0c;广泛应用于数据分析、科学计算和工程领域。在本篇文章中&#xff0c;我…

chatgpt赋能Python-python2转3

Python2转3的最终结论 Python是一种流行的编程语言&#xff0c;但随着Python 2的维护结束&#xff0c;许多开发者正在考虑将他们的代码从Python 2升级到Python 3。这篇文章将介绍如何在搜索引擎优化&#xff08;SEO&#xff09;方面实现Python 2转3&#xff0c;并讨论为什么这…

页面样式问题收集及解决方案导航

1、el-table表头文字换行https://blog.csdn.net/qq_44747461/article/details/105976042 2、element-ui动态更改el-table某个单元格字体颜色&#xff1a;https://blog.csdn.net/agua001/article/details/107960393 Element UI 表格 el-table-column根据不同值显示不同颜色&…

ChatGPT工作提效之在程序开发中的巧劲和指令(创建MySQL语句、PHP语句、Javascript用法、python的交互)

ChatGPT工作提效之程序开发中的巧劲 前言一、创建MySQL数据表1.创建指令2.交互评价 二、PHP交互语句1.创建指令2.交互评价 三、javascript的交互用法1.创建指令2.交互评价 四、python的交互1.创建指令2.交互评价 总结 前言 ChatGPT是一个基于GPT模型训练的聊天机器人&#xff…

【Maven从入门到入土】

文章目录 1.Maven1.1 初识Maven依赖管理&#xff1a;统一项目结构 :项目构建 : 1.2 Maven概述1.2.1 Maven模型1.2.2 Maven仓库1.2.3 Maven安装 1.3 IDEA集成Maven1.3.1 配置Maven环境1.3.1.1 当前工程设置1.3.1.2 全局设置 1.3.2 Maven项目1.3.2.1 创建Maven项目1.3.2.2 POM配置…

代码随想录训练营Day37| 738.单调递增的数字 968.监控二叉树 总结

目录 学习目标 学习内容 738.单调递增的数字 968.监控二叉树 总结 学习目标 738.单调递增的数字 968.监控二叉树 总结 学习内容 738.单调递增的数字 738. 单调递增的数字 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/monotone-increasing-di…

【云计算与虚拟化】第二章 实验二 Vmware Workstation 15的使用

实验二 Vmware Workstation 15的使用 在上一实验的基础上&#xff0c;将两台虚拟机调节到在桥接模式下&#xff0c;配置相应的网络参数&#xff0c;实现虚拟机1和2能相互通信&#xff0c;虚拟机1和2能够ping通外网&#xff0c;虚拟机1和2能ping通物理机。 &#xff08;截取…

GE SR469-P5-HI-A20 带有5A相CT次级线圈的标准装置

SR469-P5-HI-A20提供四路4-20 mA模拟输出。该装置已通过CE认证。这是一个带有5A相CT次级线圈的标准装置。该装置的控制电源额定为90-300伏直流电&#xff0c;70-265伏交流电&#xff0c;48-62赫兹。 制造商美国通用电气公司&#xff0c;通用工业系统电压供应交流电:48-62赫兹时…

【云计算与虚拟化】第四章 实验一 在Windows 系统部署vCenter Server

实验一 在Windows 系统部署vCenter Server 1.部署两台ESXi6.0 虚拟主机&#xff0c;其余参数可以参考实验IP拓扑 2.在Windows Server 2012 R2中部署Storge服务器,该服务器名字为&#xff1a;姓名的拼音的首字母1&#xff0c;且要实现以下三个功能&#xff1a; (1)AD域控制…

【5.15】一、软件测试基础—软件概述

目录 1.1 软件概述 1.1.1 软件生命周期 1.1.2 软件开发模型 1.1.3 软件质量概述 1.1 软件概述 软件是相对于硬件而言的&#xff0c;它是一系列按照特定顺序组织的计算机数据和指令的集合。 软件的生命周期&#xff1a;软件从“出生” 到 “消亡” 的过程。 1.1.1 软件生…

超详细!Xmind的学习

哈喽&#xff0c;大家好。最近有小伙伴问使用xmind思维导图怎么快速上手&#xff0c;今天便给各位小伙伴出了这一期快速上手教程。思维导图的上手其实都是很简单的&#xff0c;只要知道基本功能的使用&#xff0c;基本上半天就能学会&#xff0c;一天就能熟练。 一、学习准备 …

【SpringBoot整合JWT】

目录 一、什么是JWT 二、JWT能做什么 三、为什么是JWT 1、基于传统的Session认证 2、基于JWT认证 四、JWT的结构是什么 五、JWT的第一个程序 六、封装JWT工具类 七、整合SpringBoot使用 一、什么是JWT JSON Web Token (JWT) is an open standard ([RFC 7519](http…

chatgpt赋能Python-python2转换为python3

Python 2到Python 3的转换和优化 在过去的几年中&#xff0c;Python 3已经成为了最流行的Python版本。因此&#xff0c;Python 2用户开始转向Python 3&#xff0c;以提高性能、安全性和可靠性。本文将讨论Python 2到Python 3的转换以及一些实用的优化技巧。 为什么要转向Pyth…

chatgpt赋能Python-python3_0列表排序方法

Python 3.0列表排序方法介绍 Python是一门广泛应用、适应性强的编程语言&#xff0c;而Python由于其简洁明了、易于学习、适合初学者的特点&#xff0c;是许多人最喜欢的编程语言之一。 Python 3.0列表排序方法是许多Python爱好者和开发者常用的功能之一。Python 3.0列表排序…

计算机网络 IP 1.1 IP基础知识

1. IP基本认识 网络层是实现主机与主机之间的通信。也叫点对点通信。 网络层(IP)和数据链路层&#xff08;网络接口层&#xff09;(MAC)有什么区别&#xff1f; IP是负责在没有直连的两个网络之间进行通信&#xff0c;MAC负责两个直连设备之间的通信。 只有两者一块使用&…

EasyRecovery Photo16数据恢复软件免费版下载或使用方法及安装激活教程

EasyRecovery Photo16数据恢复软件免费版下载是一款支持Mac/Wind平台进行恢复图片的专业工具&#xff0c;尤其是各种流行单反相机RAW格式文件&#xff0c;以及超大型视频文件等&#xff0c;摄影爱好者使用。EasyRecovery是一款非常专业的硬盘数据恢复工具&#xff0c;可以帮你恢…

windows搭建pyspark环境详细教程

一.安装jdk及配置环境变量: 下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/#java8-windows 安装步骤&#xff1a; 下载后点击安装&#xff0c;中途可以自定义安装路径&#xff0c;最后查看安装路径&#xff1a; 开始配置系统环境变量&#xff1a…