C++中的运算符重载练习题
1.RMB类
要求:
定义一个RMB类 Money,包含元、角、分三个数据成员,友元函数重载运算符‘+’(加)
和 ‘-’(减),实现货币的加减运算
例如:
请输入元、角 分:
2 3 4
请输入元、角 分:
3 7 3
和:6元0角7分
差:-1元3角9分
又例如:
请输入元、角 分:
2 3 4
请输入元、角 分:
3 0 0
和:4元6角0分
差:-0元6角6分
代码实现:
#include <iostream>
using namespace std; class Money
{
private:
int yuan, jiao, fen;
bool flag; //标志位,0表示钱数为正,1表示钱数为负 -> 默认结果的钱数为正
public:
Money();
Money(int fg, int y=, int j=, int f=): yuan(y), jiao(j), fen(f), flag(fg){}
friend Money operator+(Money a, Money b);
friend Money operator-(Money a, Money b);
void display(); }; Money::Money()
{
flag = ;
cout << "请输入元、角 分:" <<endl;
cin >> yuan >> jiao >> fen;
} void Money::display()
{
if(flag==) cout << '-';
cout << yuan << "元" << jiao << "角" << fen << "分" << endl;
} //请用友元函数重载加/减,并要在类Money中声明为友元
//TODO重载加 类外定义Money类的+重载运算
Money operator+(Money a, Money b)
{
Money temp();
// 将钱全部转化成分来计算
int money_a = a.yuan* + a.jiao* + a.fen*;
int money_b = b.yuan* + b.jiao* + b.fen*;
int res = money_a + money_b;
// 因为是相加 故应该结果是正的 所以不用判断符号 但是相减时 结果可能为负 就要判断符号
temp.yuan = res/;
res = res % ;
temp.jiao = res/;
temp.fen = res % ; // 返回结果对象
return temp;
} //TODO重载减 类外定义Money类的-重载运算
Money operator-(Money a, Money b)
{
Money temp();
// 将钱全部转化成分来计算
int money_a = a.yuan* + a.jiao* + a.fen*;
int money_b = b.yuan* + b.jiao* + b.fen*;
int res = money_a - money_b;
// 因为是相减时 结果可能为负 就要判断符号
if(res < )
{
temp.flag = ;
res = -res;
}
temp.yuan = res/;
res = res % ;
temp.jiao = res/;
temp.fen = res % ; // 返回结果对象
return temp;
} int main()
{
Money m1, m2, m3(), m4(); //m3用来记录和,m4用来记录差 // +
m3=m1+m2;
cout<<"和:";
m3.display(); // -
m4=m1-m2;
cout<<"差:";
m4.display(); return ;
}
2.日期类运算符重载
要求:
定义一个日期类Date,包含年、月、日三个数据成员
友元函数重载自增运算符(++),实现日期的自增。运行结果如下
例如:
请输入年、月、日:
2016 11 11
今天是:2016-11-11
明天是:2016-11-12
请完成以下程序 ,并注意特殊情况,例
输入的是2016-12-31日
输出的是2017-1- 1日
代码实现:
#include <iostream>
using namespace std; class Date{
private:
int year;
int month;
int day;
public:
Date();
Date operator++(int); // 申明重载的操作符,这种方法是后缀++
/*
++和--重载注意: ++和--有前后缀之分,另外下面的int只是一个占位符用来提示编译器
类名 operator++(); ++前缀 -> 调用方式: ++对象名
类名 operator--(); --前缀 -> 调用方式: --对象名
类名 operator++(int); ++后缀 -> 调用方式: 对象名++
类名 operator--(int); --后缀 -> 调用方式: 对象名--
*/
void display();
}; // 判断是否是闰年 是闰年返回1 不是返回0
int judge(int year)
{
if(year%==&&year%!=||year%==)
return ; //闰年
return ; //非闰年
} // 构造函数
Date::Date()
{
cout<<"请输入年、月、日:\n";
cin>>year>>month>>day;
} // 运算符重载
Date Date::operator++(int)
{
// 数组存储一年12个月的天数,如果对象中的年份为闰年就将2月份的天数+1
int month_days[]={,,,,,,,,,,,};
if(judge(year))
{
month_days[]++;
} // 天数刚好是这个月的最后一天 就要判断月份是否是一年的最后一个月(12月)
// 如果是12月 那么说明这一天是这一年的最后一天 那么年份+1 月和天均置1
// 如果不是12月 那么就把月份+1,天置1
if(day==month_days[month-])
{
if(month==)
{
year++;
month=;
day=;
}
else
{
month++;
day=;
}
}
// 天数不是这个月的最后一天 就直接把天数+1即可
else
{
day++;
} // 返回计算后的对象 就是套路 凡是++和--运算符重载 都可以这样做
// 当然可以提前用一个temp保存*temp的值然后返回temp 也是同理 书上这两种方法都有
return *this;
} void Date::display()
{
cout<<year<<"-"<<month<<"-"<<day<<endl;
} int main()
{
Date d1;
cout<<"今天是:";
d1.display();
d1++;
cout<<"明天是:";
d1.display();
}
C++中的运算符重载练习题的更多相关文章
- C++中的运算符重载注意事项
1.C++中的运算符重载的方式有三种: a.类成员函数重载 b.友元函数重载 c.普通函数重载 注意: a.我们主要使用的方式主要是用:类成员函数和友元函数来实现运算符的重载. b.其实用普通函数理论 ...
- c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑
- c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...
- C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——48(项目一1、复数类中的运算符重载、类的成员函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++中的运算符重载
首先思考以下几个问题: 1.什么是运算符重载? 2.为什么要重载运算符,它有什么用? 3.可以重载哪些运算符? 4.重载运算符有哪些规则? 一.基本概念 我们在程序中使用各种操作符,比如加(+).赋值 ...
- 在Lua中进行运算符重载
在C++里面运算符是可以重载的,这一点也是C++比较方便的一个地方.在Lua中其实也是可以模拟出运算符的重载的. 在Lua中table中元素的运算都是和一个叫做元表有关的,在一个table型的变量上都 ...
- Python 中的运算符重载
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 一种运算符对于不同类型的对象,有不同的使用方式.例如, + 用于整型对象,表示两个数相加:用于字符串 ...
随机推荐
- MPAndroidChart Wiki(译文)~Part 2
7. 填充数据 这一章节将讲解给各式各样的图表设置数据的方法. 7.1 LineChart(线形图) 想给图表添加数据,使用如下方法: public void setData(ChartData da ...
- ubuntu下erlang man的安装
下载 http://www.erlang.org/download/otp_doc_man_17.1.tar.gz 找到erlang 安装目录 解压 otp_doc_man_17.1.tar.gz s ...
- Encode Adjacent Letters
Encode a string by counting the consecutive letter. (i.e., "aaaabbxxxyyz" might become &qu ...
- Tomcat 配置虚拟路径保存、访问图片
转载自:https://www.cnblogs.com/magic101/p/7756402.html 配置tomcat的虚拟映射路径 1.修改Tomcat的server.xml文件 <Host ...
- 20179223《Linux内核原理与分析》第三周学习笔记
测试3的实验: 1. 用gcc -g编译vi输入的代码 2. 在main函数中设置一个行断点 3. 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点 4. 提交调 ...
- idea Java spring 入门 demo
根据这个 来实现 理解 https://www.cnblogs.com/xing901022/p/3963962.html 这里没有说如何导入包,现在我们用 idea 来实现 新建项目结构后 RUN ...
- simulink中几个bit型操作模型
bit concat 将两个fix point 数据 结合到一块. bit rotate 循环移位 bit shift 移位 又分逻辑移位和算术移位,逻辑移位不管最高位0或1,统统移0,算术移位会移 ...
- 日志框架--(二)JDK Logging
前言 从jdk1.4起,JDK开始自带一套日志系统.JDK Logger最大的优点就是不需要任何类库的支持,只要有Java的运行环境就可以使用.相对于其他的日志框架,JDK自带的日志可谓是鸡肋,无论易 ...
- java创建多线程&创建进程
概述 并发和并行是即相似又有区别: 并行:指两个或多个事件在同一时刻发生: 并发:指两个或多个事件在同一时间段内发生. 进程是指一个内存中运行中的应用程序.每个进程都有自己独立的一块内存空间,一个应用 ...
- div,css常用技术
1,<div></div>一张图作为背景的用法: 必须指定width,height,background属性 .smallCircle{ margin-top: 25px; ...