- 人民币类---运算符重载
题目描述如下:
设计人民币类,数据成员包含正负标志位、元、角、分 ,设计构造函数、重载+、-、前置自增、后置自增、前置自减、后置自减、输出流插入运算符<<、输入流提取运算符>> . 其中前置自减、后置自减、<<和>>重载成友元函数。
自增表示增加1分钱。自减表示减少1分钱。加减法和构造时的进位要考虑。
编写主函数测试之。
功能说明:
- 所有的人民币的输入和输出都要使用重载的运算符<<和>>
- 所有的单目运算符的操作都是针对第一个人民币
- 关于人民币表示方法的说明:
(+m元n角k分),含义是正的m元n角k分,其中的m、n、k是无符号的;
(-m元n角k分),含义是负的m元n角k分,其中的m、n、k是无符号的。
负的人民币值表示赤字。
0元0角0分用+表示
输出样例:
请构造两个人民币:
+ 11 22 33
+9 8 18
请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): A
(+13元5角3分) + (+ 9元9角8分) =(+23元5角1分)
请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): S
(+13元5角3分) - (+ 9元9角8分) =(+3元5角5分)
请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): Q
++(+13元5角3分) = (+13元5角4分)
请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): H
(+13元5角4分) ++ = (+13元5角4分)
人民币1:(+13元5角5分)
请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): J
--(+13元5角5分) = (+13元5角4分)
请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): K
(+13元5角4分) -- = (+13元5角4分)
人民币1:(+13元5角3分)
您还要继续吗?(Y/N): Y
请构造两个人民币:
-1 2 33
+5 7 8
请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): A
(-1元5角3分) + (+ 5元7角8分) =(+4元2角5分)
请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): S
(-1元5角3分) - (+ 5元7角8分) =(-7元3角1分)
请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): Q
++(-1元5角3分) = (-1元5角2分)
请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): H
(-1元5角2分) ++ = (-1元5角2分)
人民币1:(-1元5角1分)
请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): J
--(-1元5角1分) = (-1元5角2分)
请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): K
(-1元5角2分) -- = (-1元5角2分)
人民币1:(-1元5角3分)
您还要继续吗?(Y/N): N
press any key to continue…
关于输出样例的说明:
带下划线的内容表示用户的输入。
提示:
可以把钱数转化成总分数,如:
+1元2角3分 = +123分
-1元2角3分 = -123分
对于分数再做各种运算,这样的运算要简单一些;
然后再把分数转换成元角分的形式
//Money.h
#pragma once
#include<iostream>
using namespace std;
class Money {
public:
Money(char c = '+', int y = 0, int j = 0, int f = 0);
void standard();
Money operator+(const Money& m);
Money operator-(const Money& m);
Money& operator++();
Money operator ++(int);
friend Money& operator--(Money& );
friend Money operator--(Money& , int);
friend ostream& operator << (ostream& os, const Money& m);
friend istream& operator >>(istream& os, Money& m);
void Show();
private:
char sign;
int yuan;
int jiao;
int fen;
};
//Money.cpp
#include"Money.h"
#include<iostream>
using namespace std;
Money::Money(char c, int y, int j, int f)
{
sign = c;
yuan = y;
jiao = j;
fen = f;
}
void Money::standard()
{
jiao += fen / 10;
fen %= 10;
yuan += jiao / 10;
jiao %= 10;
}
Money Money::operator+(const Money& m)
{
Money mo;
if (sign == m.sign) {
mo.yuan = yuan + m.yuan;
mo.jiao = jiao + m.jiao;
mo.fen = fen + m.fen;
mo.standard();
}
else {
if (sign == '-') {
Money tmp('+', yuan, jiao, fen);
Money t = m;
mo = t - tmp;
}
else {
Money tmp('+', m.yuan, m.jiao, m.fen);
mo = *this - tmp;
}
}
return mo;
}
Money Money::operator-(const Money& m)
{
Money mo;
Money tmp = m;
if (sign != m.sign) {
if (m.sign == '-') {
tmp.sign = '+';
}
else {
tmp.sign = '-';
}
return *this + tmp;
}
if (yuan > m.yuan || (yuan == m.yuan && jiao > m.jiao) || (yuan == m.yuan && jiao == m.jiao && fen >= m.fen))
{
mo = *this; tmp = m;
}
else { mo = m; tmp = *this; mo.sign = (sign == '+') ? '-' : '+'; }
if (mo.fen < tmp.fen) {
mo.jiao--;
mo.fen += 10;
}
mo.fen -= tmp.fen;
if (mo.jiao < 0 || mo.jiao < tmp.jiao) {
mo.yuan--;
mo.jiao += 10;
}
mo.jiao -= tmp.jiao;
mo.yuan -= tmp.yuan;
return mo;
}
Money& Money::operator++() { //前置
Money m('+', 0, 0, 1);
*this = *this + m;
return *this;
}
Money Money::operator++(int) {
Money m = *this;
++(*this);
return m;
}
Money& operator--(Money& x)
{
Money m('+', 0, 0, 1);
x = x - m;
return x;
}
Money operator--(Money& x, int) {
Money m = x;
--(x);
return m;
}
ostream& operator<<(ostream& os, const Money& m)
{
os << m.sign << m.yuan << "元" << m.jiao << "角" << m.fen << "分";
return os;
}
istream& operator>>(istream& os, Money& m)
{
char c;
int y, j, f;
os >> c >> y >> j >> f;
m.sign = c;
m.yuan = y;
m.jiao = j;
m.fen = f;
m.standard();
return os;
}
void Money::Show()
{
cout << sign << yuan << "元" << jiao << "角" << fen << "分" << endl;
}
//main.cpp
#include"Money.h"
#include<iostream>
using namespace std;
int main() {
Money m1, m2;
char op,t;
do {
cout << "请构造两个人民币:" << endl;
cin >> m1 >> m2;
int x = 6;
while (x--) {
cout << "请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): ";
cin >> t;
if (t == 'A') {
cout << "(" << m1 << ")+(" << m2 << ")=(";
Money ans1 = m1 + m2;
cout << ans1 << ")" << endl;
}
else if (t == 'S') {
cout << "(" << m1 << ")-(" << m2 << ")=(";
Money ans2 = m1 - m2;
cout << ans2 << ")" << endl;
}
else if (t == 'Q') {
cout << "++(" << m1 << ")=(";
cout << ++m1 << ")" << endl;
}
else if (t == 'H') {
cout << "(" << m1 << ")++=(";
cout << m1++ << ")" << endl;
cout << "人民币1:(" << m1 << ")" << endl;
}
else if (t == 'J') {
cout << "--(" << m1 << ")=(";
cout << --m1 << ")" << endl;
}
else if (t == 'K') {
cout << "(" << m1 << ")--=(";
cout << m1-- << ")" << endl;
cout << "人民币1:(" << m1 << ")" << endl;
}
}
cout << "您还要继续吗?(Y/N): ";
cin >> op;
} while (op == 'Y' || op == 'y');
return 0;
}
2. 十六进制数类---运算符重载
题目描述如下:
设计1~4位的无符号十六进制数据类class HEX. 可以创建如 ABCD、1234、DF09、AB、26之类的1~4位的十六进制的正整数。可以输入输出十六进制数据,可以实现十六进制数据和十进制数据的互换,可以实现2个十六进制数据的+、-、*、/、%操作,各操作的要求请看程序注释。
下面给出了完整的类设计,但缺少了相关函数的实现,这些函数在程序注释中标出了。
请你根据题意,添加这些函数的实现。在实现这些函数时:可以调用已有的函数,但不要更改原来的类设计,并且使得经你补充以后的程序完全符合题意,也完全符合程序的输出。
#include <iostream.h>
#include <string>
#include <cmath>
#include <process.h>
char Hex_num[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
class HEX
{ char m_num[10]; //可以存放10位十六进制数据,这样可以确保2个4位十六进制数据+和*的结果不会溢出
public:
HEX(); //构造函数,初始化成全‘0’
HEX(unsigned n); //用无符号整数创建十六进制数据,(即无符号整数转换成十六进制数据)
unsigned GetBit(int i); //获得每一位数据的十进制数值
operator unsigned(); //把十六进制数据转换成无符号的十进制数据
int length(); //获得数据的长度
HEX operator+(HEX n); //加法
HEX operator-(HEX n); //减法运算要求被减数不小于减数
HEX operator*(HEX n); //乘法
HEX operator/(HEX n); //整除,即只要得到商
HEX operator%(HEX n); //取模,即只要得到余数
HEX& operator++(); //前置++
HEX operator++(int); //后置++
friend istream& operator>>(istream& i, HEX& n); // 输入十六进制数
friend ostream& operator<<(ostream& o, HEX n); // 输出十六进制数
};
int main()
{ HEX n1,n2,n3;
char repeat('Y');
do
{ n1 = 0; n2 = 0; n3 =0;
cin>>n1>>n2;
n3 = n1+n2;
cout<<n1<<'+'<<n2<<'='<<n3<<endl;
n3 = n1-n2;
cout<<n1<<'-'<<n2<<'='<<n3<<endl;
n3 = n1*n2;
cout<<n1<<'*'<<n2<<'='<<n3<<endl;
n3 = n1/n2;
cout<<n1<<'/'<<n2<<'='<<n3<<endl;
n3 = n1%n2;
cout<<n1<<'%'<<n2<<'='<<n3<<endl;
cout<<"Repeat?(Y/N)";
cin>>repeat;
}while(repeat=='Y'||repeat=='y');
return 0;
}
下面是一次运行时的程序输出:
Please input a Hex number(>=0,<=FFFF,Hex characters: 0-9 or A-F):
ABCD
Please input a Hex number(>=0,<=FFFF,Hex characters: 0-9 or A-F):
1234
ABCD+1234=BE01
ABCD-1234=9999
ABCD*1234=C374FA4
ABCD/1234=9
ABCD%1234=7F9
Repeat?(Y/N)Y
Please input a Hex number(>=0,<=FFFF,Hex characters: 0-9 or A-F):
FE
Please input a Hex number(>=0,<=FFFF,Hex characters: 0-9 or A-F):
12
FE+12=110
FE-12=EC
FE*12=11DC
FE/12=E
FE%12=2
Repeat?(Y/N)N
Press any key to continue
//HEX.h
#pragma once
#include <iostream>
#include<string>
#include<cmath>
#include<process.h>
static char Hex_num[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
using namespace std;
class HEX {
char m_num[10];
public:
HEX(unsigned n=0);
unsigned GetBit(int i); //获得每一位数据的十进制数值
operator unsigned(); //把十六进制数据转换成无符号的十进制数据
int length(); //获得数据的长度
HEX operator+(HEX n); //加法
HEX operator-(HEX n); //减法运算要求被减数不小于减数
HEX operator*(HEX n); //乘法
HEX operator/(HEX n); //整除,即只要得到商
HEX operator%(HEX n); //取模,即只要得到余数
HEX& operator++(); //前置++
HEX operator++(int); //后置++
friend istream& operator>>(istream& i, HEX& n); // 输入十六进制数
friend ostream& operator<<(ostream& o, HEX n); // 输出十六进制数
};
//HEX.cpp
#include"HEX.h"
HEX::HEX(unsigned n)
{
int cnt = 0;
if (n == 0) m_num[cnt++] = '0';
while (n) {
m_num[cnt++] = Hex_num[n % 16];
n /= 16;
}
for (int i = 0; i < cnt/2; i++) {
swap(m_num[i], m_num[cnt - 1 - i]);
}
for (int i = cnt; i < 10; i++) m_num[i] = '\0';
}
unsigned HEX::GetBit(int i)
{
if (m_num[i] == '\0') return 0;
for (int j = 0; j < 16; j++) {
if (m_num[i] == Hex_num[j]) {
return j;
}
}
return -1;
}
HEX::operator unsigned()
{
unsigned int s = 0;
int len = this->length();
for (int i = 0; i < len; i++) {
//cout << GetBit(i) * pow(16, len-i) << endl;
s += GetBit(i) * pow(16, len-i-1);
}
return s;
}
int HEX::length()
{
for (int i = 9; i >= 0; i--) {
if (m_num[i] != '\0') return i+1;
}
return 0;
}
HEX HEX::operator+(HEX n)
{
unsigned a = n;
unsigned x = *this;
return HEX(x+a);
}
HEX HEX::operator-(HEX n)
{
unsigned x = *this;
unsigned a = n;
return HEX(x - a);
}
HEX HEX::operator*(HEX n)
{
unsigned x = *this;
unsigned a = n;
return HEX(x * a);
}
HEX HEX::operator/(HEX n)
{
unsigned x = *this;
unsigned a = n;
return HEX(x / a);
}
HEX HEX::operator%(HEX n)
{
unsigned x = *this;
unsigned a = n;
return HEX(x % a);
}
HEX& HEX::operator++()
{
unsigned s = *this;
s=s+1;
*this = HEX(s);
return *this;
}
HEX HEX::operator++(int)
{
HEX h = *this;
++* this;
return h;
}
istream& operator>>(istream& i, HEX& n)
{
cout << "Please input a Hex number(>=0,<=FFFF,Hex characters: 0-9 or A-F):" << endl;
i >> n.m_num;
return i;
}
ostream& operator<<(ostream& o, HEX n)
{
o << n.m_num;
return o;
}
//main.cpp
#include"HEX.h"
int main()
{
HEX n1, n2, n3;
char repeat('Y');
do
{
n1 = 0; n2 = 0; n3 = 0;
cin >> n1 >> n2;
n3 = n1 + n2;
cout << n1 << '+' << n2 << '=' << n3 << endl;
n3 = n1 - n2;
cout << n1 << '-' << n2 << '=' << n3 << endl;
n3 = n1 * n2;
cout << n1 << '*' << n2 << '=' << n3 << endl;
n3 = n1 / n2;
cout << n1 << '/' << n2 << '=' << n3 << endl;
n3 = n1 % n2;
cout << n1 << '%' << n2 << '=' << n3 << endl;
cout << "Repeat?(Y/N)";
cin >> repeat;
} while (repeat == 'Y' || repeat == 'y');
return 0;
}