运算符重载函数作为类的成员函数——有理数的约分
目录
一、题目
二、代码
三、算法分析
(一)数学表达式
(二) 代码实现
一)+运算符重载函数
二)优化函数(实现有理数约分)
一、题目
通过运算符重载为类的成员函数来实现两个有理数对象的加减乘除运算;
有理数是一个可以化为分数的数,如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) //①分子不为0cout<<"/"<<deno<<endl;else //②分子为0cout<<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;
}
三、算法分析
有理数相加
(一)数学表达式
当两个有理数
和
相加时,可得到这样的算式
分子分母分开存放
分子=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;
}
相关文章:
运算符重载函数作为类的成员函数——有理数的约分
目录 一、题目 二、代码 三、算法分析 (一)数学表达式 (二) 代码实现 一)运算符重载函数 二)优化函数(实现有理数约分) 一、题目 通过运算符重载为类的成员函数来实现两个有…...
mysql数据库的内置函数--7
目录 内置函数 日期函数 字符串函数 数学函数 其它函数 内置函数 在mysql中这些函数用select进行使用 日期函数 函数描述NOW()返回当前的日期和时间CURDATE()返回当前的日期CURTIME()返回当前的时间DATE()从日期或日期/时间表达式中提取日期部分TIME()从日期或日期/时间…...
DS3800HPIB 有效执行任务的所有程序
DS3800HPIB是通用电气公司生产的Speedtronic Mark IV系列的一部分。这DS3800HPIB是一种大型电路板,具有八个连接端子,电路板两侧的尺寸各不相同。左下角有一个红色小方块,上面有一个拨动开关。这DS3800HPIB有大约50个天蓝色的小二极管。这DS3…...
图像比对、人像比对和人脸识别的区别是什么?
图像比对、人像比对和人脸识别都是图像处理技术,但是它们的实现方式和应用场景均有所不同。 图像比对 图像比对是指通过计算机视觉技术将两张或多张图片进行相似度比较。主要包括图像特征提取、匹配和评估等步骤,通常使用神经网络等深度学习技术来实现…...
python中的抽象基类
目录 协议和鸭子类型抽象基类定义抽象基类使用抽象基类直接继承通过注册(register) __subclasshook__魔法方法 协议和鸭子类型 python中有大量的魔法方法,python所谓基于协议编程,就是依赖这些魔法方法。 什么意思呢?…...
耗时几个月,终于决定把原本想用于商业的系统开源了
前言 嗨,大家好,我是希留,一个被迫致力于全栈开发的老菜鸟。 今天又来给小伙伴们分享一个基于 SpringBoot Vue 实现的前后端分离后台管理系统项目; 简介 这个项目是基于xiliu-tenant脚手架项目搭建而成,原本是帮朋…...
HarmonyOS应用端云一体化开发主要流程
图示 主要步骤 序号 阶段 任务 说明 1 创建端云一体化开发工程 选择工程类型与云开发模板 确定工程类型:选择“Application”或“Atomic Service”页签,确定创建的是HarmonyOS应用工程还是原子化服务工程。选择云开发模板,包括通用云开…...
NoSQL之 Redis配置与优化
NoSQL之 Redis配置与优化 ---------------------- 关系数据库与非关系型数据库 ---------------------------------------- ●关系型数据库: 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一…...
Redis哨兵模式
1.哨兵模式是什么 解释一 哨兵巡查监控 master主机是否故障,如果故障了,根据投票数自动将一个从库转换为新数据库,继续对外服务。 解释二 监控redis 的运行状态,包括master和slave当master宕机后,能自动将slave切换…...
数据库管理-第七十六期 如何升级19c RAC(20230516)
数据库管理 2023-05-16 第七十六期 如何升级19c RAC1 回头处理2 升级AHF3 升级GI及DB3.1 拷贝所需文件3.2 升级OPatch3.3 升级GI与DB3.4 应用SQL变更 4 升级OJVM4.1 解压补丁4.2执行补丁冲突检查:4.3 升级OJVM4.4 应用SQL变更 5 最终验证总结 第七十六期 如何升级19…...
组合预测模型 | ARIMA-CNN-LSTM时间序列预测(Python)
组合预测模型 | ARIMA-CNN-LSTM时间序列预测(Python) 目录 组合预测模型 | ARIMA-CNN-LSTM时间序列预测(Python)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 ARIMA-CNN-LSTM是一种结合了传统时间序列模型和深度学习模型的…...
实验四 面向对象分析与设计——UML类图与时序图
一、实验目的: 掌握面向对象分析中静态结构模型与动态行为模型的基本思想。学会识别系统中的类、类的属性和操作以及类之间的关系,掌握UML类图的绘制方法。了解时序图的作用和组成元素,掌握UML时序图的绘制方法。 二、实验仪器及实验环境&a…...
最短路径问题
如图,设定源点为D,终点为A,则D到A的最短路径是多少? 算法思路: 第一步,从源点D出发,此时能到达的选择是C和E,我们根据路径长度选择最少的作为下一个节点,于是选择C&…...
国内有哪些SAAS软件?SAAS软件有哪些优点?
国内有哪些SAAS软件?SAAS软件有哪些优点?不请自来答一下,通过SaaS软件与传统软件的对比来详细讲下SaaS软件有哪些优点? 配合以下内容食用更佳: 关于概念——深度详解什么是SaaS(软件即服务)关…...
分享两组不同的3D VR卡片
最近某音上出现了很多VR视频,转动手机可以看到手机界面未显示出来的场景。这种事情我觉得我们也可以做到。 所以两种不同的3D VR卡片来了: 第一种是横向或上下可以拖动极大的距离。卡片上的信息会随着拖动移动,但不会显示更多的信息&#x…...
外贸人如何精准开发客户?Facebook开发客户全攻略
现在做跨境的都了解的一个社媒平台就是Facebook了,因为很多人都会拿Facebook来开发客户,忙里偷闲,今天东哥就来聊聊用Facebook开发客户的一些心得。 用Facebook开发客户的心得 1、利用关键词搜索 使用行业相关的关键词、产品特定的关键词、相…...
一、Git安装(Git+TortoiseGit图形化)
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式…...
mysql死锁,如何产生?如何发现?如何处理?
1 产生死锁 就是资源互斥 例子如下 好的,请参考以下 SQL 语句来创建 base_account_item 表和向表中插入一些数据: CREATE TABLE base_account_item (id INT(11) NOT NULL,account_item_name VARCHAR(50) NOT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEF…...
YOLO V1-V3 简单介绍
目录 1. YOLO 2. YOLO V1 3. YOLO V2 4. YOLO V3 5. YOLO V3 SPP网络 5.1 Mosaic 图像增强 5.2 SPP 模块 5.3 CIou Loss 5.4 Focal loss 1. YOLO YOLO 是目标检测任务强大的算法,将目标检测的问题转换边界框和相关概率的回归问题,是目标检测…...
数据结构总结1:了解数据结构、时间复杂度、空间复杂度
后续可能会有补充和更改 目录 一、数据结构 1.算法介绍 二、时间复杂度、空间复杂度 三、练习 1.时间复杂度 2.空间复杂度 一、数据结构 数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 数据结构和数据库的区…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
