Homework11_ch8(2) 多态——运算符重载(1)

  1. 人民币类---运算符重载

题目描述如下:

设计人民币类,数据成员包含正负标志位、元、角、分 ,设计构造函数、重载+、-、前置自增、后置自增、前置自减、后置自减、输出流插入运算符<<、输入流提取运算符>> . 其中前置自减、后置自减、<<>>重载成友元函数。

       自增表示增加1分钱。自减表示减少1分钱。加减法和构造时的进位要考虑。

       编写主函数测试之。

功能说明:

  1. 所有的人民币的输入和输出都要使用重载的运算符<<>>
  2. 所有的单目运算符的操作都是针对第一个人民币
  1. 关于人民币表示方法的说明:

+mnk分),含义是正的mnk分,其中的mnk是无符号的;

       -mnk分),含义是负的mnk分,其中的mnk是无符号的。

负的人民币值表示赤字。

       000分用+表示

输出样例:

请构造两个人民币:

+ 11 22 33

+9 8 18

请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): A

(+1353) + (+ 998) =+2351分)

请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): S

(+1353) - (+ 998) =+355分)

请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): Q

++(+1353) = (+1354)

请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): H

 (+1354) ++ = (+1354)

人民币1(+1355)

请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): J

--(+1355) = (+1354)

请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): K

 (+1354) -- = (+1354)

人民币1(+1353)

您还要继续吗?(Y/N): Y

请构造两个人民币:

-1 2 33

+5 7 8

请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): A

(-153) + (+ 578) =+425分)

请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): S

(-153) - (+ 578) =-731分)

请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): Q

++(-153) = (-152)

请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): H

 (-152) ++ = (-152)

人民币1(-151)

请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): J

--(-151) = (-152)

请选择运算(A:+/S:-/Q:++i/H:i++/J:--i/K:i--/): K

 (-152) -- = (-152)

人民币1(-153)

您还要继续吗?(Y/N): N

press any key to continue…

关于输出样例的说明:

带下划线的内容表示用户的输入。

提示:

可以把钱数转化成总分数,如:

+123 = +123

-123 = -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. 可以创建如 ABCD1234DF09AB26之类的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位十六进制数据,这样可以确保24位十六进制数据+*的结果不会溢出

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;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值