面向对象程序设计|静态友元

文章提供了五个C++编程题目,涉及复数类的加减运算、日期时间合并输出、银行账户管理(包括静态成员和友元函数)、旅馆旅客管理和电视机遥控器(友元类)的实现。每个题目都详细描述了要求和输入输出格式,并给出了代码示例。
摘要由CSDN通过智能技术生成

题目一:复数运算

题目描述:

复数类的声明如下

 

要求如下:

1. 实现复数类和友元函数addCom和outCom;

2. 参考addCom函数为复数类增加一个友元函数minusCom,用于实现两个复数的减法;

3. 在main函数中,通过友元函数,实现复数的加减法和复数的输出。

输入要求:

第1行:第1个复数的实部和虚部

第2行:需进行运算的次数,注意:是连续运算。具体结果可参考样例

第3行开始,每行输入运算类型,以及参与运算的复数的实部与虚部。“+”表示复数相加,“-”表示复数相减。

输出要求:

每行输出复数运算后的结果,复数输出格式为“(实部,虚部)”。

输入样例:

10 10
3
+ 20 10
- 15 5
+ 5 25

输出样例:

(30,20)
(15,15)
(20,40)

代码示例:

#include<iostream>
#include<iomanip>
#include<cstring>
#include<string> 
#include<cmath>
#include<algorithm>
using namespace std;

class Complex
{
public:
	Complex() {}
	Complex(double r, double i) :real(r), imag(i) {}
	friend Complex addCom(Complex c1, Complex c2)
	{
		Complex c(c1.real + c2.real, c1.imag + c2.imag);
		return c;
	}
	friend Complex minusCom(Complex c1, Complex c2)
	{
		Complex c(c1.real - c2.real, c1.imag - c2.imag);
		return c;
	}
	friend void outCom(Complex c)
	{
		cout << "(" << c.real << "," << c.imag << ")" << endl;
	}
private:
	double real;
	double imag;
};

int main()
{
	int r0, i0;
	cin >> r0 >> i0;
	Complex c(r0, i0);
	int t;
	cin >> t;
	while (t--)
	{
		char opration;
		cin >> opration;
		int r1, i1;
		cin >> r1 >> i1;
		Complex c2(r1, i1);
		if (opration == '+')
		{
			c = addCom(c, c2);
		}
		else if (opration == '-')
		{
			c = minusCom(c, c2);
		}
		outCom(c);
	}
}

友元函数的本质就是一个函数,但它能够直接访问私有成员函数。

题目二:日期时间合并输出(友元函数)

题目描述:

已知日期类CDate,有属性:年、月、日,其他成员函数根据需要自行编写,注意该类没有输出的成员函数

已知时间类CTime,有属性:时、分、秒,其他成员函数根据需要自行编写,注意该类没有输出的成员函数

现在编写一个全局函数把时间和日期的对象合并起来一起输出,

函数原型为:void Display(CDate &, CTime &)

函数输出要求为:

1、时分秒输出长度固定2位,不足2位补0

2、年份输出长度固定为4位,月和日的输出长度固定2位,不足2位补0

例如2017年3月3日19时5分18秒

则输出为:2017-03-03 19:05:18

程序要求

1、把函数Display作为时间类、日期类的友元

2、分别创建一个日期对象和时间对象,保存日期的输入和时间的输入

3、调用Display函数实现日期和时间的合并输出

输入要求:

第一行输入t表示有t组示例

接着一行输入三个整数,表示年月日

再接着一行输入三个整数,表示时分秒

依次输入t组示例

输出要求:

每行输出一个日期和时间合并输出结果

输出t行

输入样例:

2
2017 3 3
19 5 18
1988 12 8
5 16 4

输出样例:

2017-03-03 19:05:18
1988-12-08 05:16:04

代码示例:

#include<iostream>
#include<iomanip>
#include<cstring>
#include<string> 
#include<cmath>
#include<algorithm>
using namespace std;

class CTime;

class CDate
{
public:
	CDate(int y, int mon, int d) :year(y), month(mon), day(d) {}
	friend void Display(CDate& rd, CTime& rt);
private:
	int year, month, day;
};

class CTime
{
public:
	CTime(int h, int min, int s) :hour(h), minute(min), second(s) {}
	friend void Display(CDate& rd, CTime& rt);
private:
	int hour, minute, second;
};

void Display(CDate& rd, CTime& rt)
{
	cout << setw(4) << setfill('0') << rd.year << "-";
	cout << setw(2) << setfill('0') << rd.month << "-";
	cout << setw(2) << setfill('0') << rd.day << " ";
	cout << setw(2) << setfill('0') << rt.hour << ":";
	cout << setw(2) << setfill('0') << rt.minute << ":";
	cout << setw(2) << setfill('0') << rt.second << endl;
}

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		int y0, mon0, d0, h0, min0, s0;
		cin >> y0 >> mon0 >> d0 >> h0 >> min0 >> s0;
		CDate date(y0, mon0, d0);
		CTime time(h0, min0, s0);
		Display(date, time);
	}
	return 0;
}

没啥难度,看个格式

题目三:银行账户(静态成员与友元函数)

题目描述:

银行账户类的基本描述如下:

要求如下:

实现该银行账户类

为账户类Account增加一个友元函数,实现账户结息,要求输出结息后的余额(结息余额=账户余额+账户余额*利率)。友元函数声明形式为 friend void Update(Account& a);

在main函数中,定义一个Account类型的指针数组,让每个指针指向动态分配的Account对象,并调用成员函数测试存款、取款、显示等函数,再调用友元函数测试进行结息。

大家可以根据实际需求在类内添加新的成员

要求所有和银行账户相关的数据都不能用全局变量形式,必须封装在类内

输入要求:

第1行:利率
第2行:账户数目n
第3行开始,每行依次输入一个账户的“账号”、“姓名”、“余额”、存款数,取款数。

输出要求:

第1行开始,每行输出一个账户的相关信息,包括账号、姓名、存款后的余额、存款后结息余额、取款后余额。

最后一行输出所有账户的余额。

输入样例:

0.01
3
201501 张三 10000 1000 2000
201502 李四 20000 2000 4000
201503 王二 80000 4000 6000

输出样例:

201501 张三 11000 11110 9110
201502 李四 22000 22220 18220
201503 王二 84000 84840 78840
106170

代码示例:

#include<iostream>
#include<iomanip>
#include<cstring>
#include<string> 
#include<cmath>
#include<algorithm>
using namespace std;

class Account
{
public:
	Account(string accno, string name, float balance) :_accno(accno), accname(name), _balance(balance) {}
	~Account() {}
	void Deposit(float amount)
	{
		_balance += amount;
	}
	void Withdraw(float amount)
	{
		_balance -= amount;
	}
	float GetBalance()
	{
		return _balance;
	}
	void Show()
	{
		cout << _accno << " " << accname << " ";
	}
	static int GetCount()
	{
		return count;
	}
	static void setCount(int t)
	{
		count = t;
	}
	static void setInterestRate(float r)
	{
		InterestRate = r;
	}
	static float GetInterestRate()
	{
		return InterestRate;
	}
	friend void Update(Account& a)
	{
		a._balance = a._balance * (1 + a.InterestRate);
	}
private:
	static int count;
	static float InterestRate;
	string _accno, accname;
	float _balance;
};

float Account::InterestRate = 0;//静态初始化为0
int Account::count = 0;

int main()
{
	float rate, sum;
	int t;
	sum = 0;
	cin >> rate;
	cin >> t;
	Account::setCount(t);//设置银行账户数量
	Account::setInterestRate(rate);//设置利率
	Account** a = new Account * [t];
	for (int i = 0; i < t; i++)
	{
		string no0, name0;
		float balance0, dp0, wd0;
		cin >> no0 >> name0 >> balance0 >> dp0 >> wd0;
		a[i] = new Account(no0, name0, balance0);//利用二级指针进行初始化
		a[i]->Show();
		a[i]->Deposit(dp0);
		cout << a[i]->GetBalance() << " ";
		Update(*a[i]);
		cout << a[i]->GetBalance() << " ";
		a[i]->Withdraw(wd0);
		cout << a[i]->GetBalance() << endl;
		sum += a[i]->GetBalance();
	}
	cout << sum << endl;
	return 0;
}

几个注意点:首先是静态变量的初始化、其次是静态变量的赋值要调用相应的赋值函数以及对没有原始构造类的动态内存分配时应用二级指针。

题目四:旅馆旅客管理(静态成员)

题目描述:

编写程序,实现某旅馆的客人住宿记录功能。

定义一个Customer类,要求输入客人的姓名,创建一个Customer对象。类声明如下:

调用类的Display函数输出客人ID(输出顺序号占4位,如第1位为0001,第2位为0002,依此类推)、姓名、总人数。总人数和客人租金用静态成员,其他属性采用普通的数据成员。 

输入要求:

输入测试次数t

对于每次测试,首先输入当前年份,

接下来依次输入顾客姓名,0表示输入结束。

输出要求:

每行依次输出顾客信息和旅馆信息。包括顾客姓名,顾客编号,旅馆入住总人数,旅馆当前总收入。

输入样例:

2
2014
张三 李四 王五 0
2015
Cindy David 0

输出样例:

张三 20140001 1 150
李四 20140002 2 300
王五 20140003 3 450
Cindy 20150004 4 600
David 20150005 5 750

代码示例:

#include<iostream>
#include<iomanip>
#include<cstring>
#include<string> 
#include<cmath>
#include<algorithm>
using namespace std;

class Customer
{
public:
	Customer(char* name)
	{
		CustName = name;
		TotalVustNum++;
		CustID = TotalVustNum;
	}
	~Customer() {}
	static void changeYear(int r)
	{
		Year = r;
	}
	void display()
	{
		cout << CustName << " " << Year << setw(4) << setfill('0') << CustID << " " << TotalVustNum << " " << TotalVustNum * Rent << endl;
	}
private:
	static int TotalVustNum;
	static int Rent;
	static int Year;
	int CustID;
	char* CustName;
};

int Customer::TotalVustNum = 0;//静态变量的初始化
int Customer::Rent = 150;
int Customer::Year = 0;

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		char name[20];
		int year;
		cin >> year;
		while (1)
		{
			cin >> name;
			if (name[0] == '0')
			{
				break;
			}
			else
			{
				Customer c(name);
				c.changeYear(year);
				c.display();
			}
		}
	}
}

题目五:电视机与遥控器(友元类)

题目描述:

有如下的电视类和遥控器类,遥控器在电视开机的情况下可以控制电视。

 

 

要求如下:

1. 实现并完善Tv类;其中构造函数需修改和完善。另:最大频道为100;

2. 将Remote设为Tv的友元类,以支持在Remote类中对Tv方法的调用。

3. 在main函数中,通过Remote实例对TV实例进行操作。

输入要求:

第一行,电视初始状态,依次为state,volume,channel,mode,input的初始值。

第二行,利用遥控器对上述状态的操作指令,用对应的函数名表示,如增加音量为volup

输出要求:

第一行,执行遥控器操作后的状态。

输入样例:

off 10 19 Cable VCR
onoff volup chanup set_mode set_input

输出样例:

on 11 20 Antenna TV

代码示例:

#include<iostream>
#include<iomanip>
#include<cstring>
#include<string> 
#include<cmath>
#include<algorithm>
using namespace std;

class TV
{
public:
	TV(int s0, int v0, int m0, int c0, int md0, int i0)
	{
		state = s0;
		volume = v0;
		maxchannel = m0;
		channel = c0;
		mode = md0;
		input = i0;
	}

	void onoff()
	{
		if (state == 0)
		{
			state = 1;
		}
		else
		{
			state = 0;
		}
	}
	bool ison()const
	{
		return state;
	}
	bool volup()
	{
		if (volume < 20)
		{
			return volume++;
		}
		else
		{
			return volume;
		}
	}
	bool voldown()
	{
		if (volume > 0)
		{
			return volume--;
		}
		else
		{
			return volume;
		}
	}
	void chanup()
	{
		if (channel < maxchannel)
		{
			channel++;
		}
	}
	void chandown()
	{
		if (channel > 0)
		{
			channel--;
		}
	}
	void set_mode()
	{
		mode = 1;
	}
	void set_input()
	{
		input = 1;
	}
	void settings() const
	{
		if (state == 1)
		{
			cout << "on";
		}
		else
		{
			cout << "off";
		}
		cout << " " << volume << " " << channel << " ";
		if (mode == 1)
		{
			cout << "Antenna" << " ";
		}
		else
		{
			cout << "Cable" << " ";
		}
		if (input == 1)
		{
			cout << "TV" << endl;
		}
		else
		{
			cout << "VCR" << endl;
		}
	}
	friend class Remote;
private:
	int state, volume, maxchannel, channel, mode, input;
};

class Remote
{
public:
	Remote(int m) : mode(m) {}
	bool volup(TV& t) { return t.volup(); }
	bool voldown(TV& t) { return t.voldown(); }
	void onoff(TV& t) { t.onoff(); }
	void chanup(TV& t) { t.chanup(); }
	void chandown(TV& t) { t.chandown(); }
	void set_chan(TV& t, int c) { t.channel = c; }
	void set_mode(TV& t) { t.set_mode(); }
	void set_input(TV& t) { t.set_input(); }
private:
	int mode;
};

int main()
{
	string state, mode, input;
	int volumn, channel;
	int s0, md0, ip0;
	cin >> state >> volumn >> channel >> mode >> input;

	if (state == "off")
	{
		s0 = 0;
	}
	else
	{
		s0 = 1;
	}
	if (mode == "Cable")
	{
		md0 = 0;
	}
	else
	{
		md0 = 1;
	}
	if (input == "VCR")
	{
		ip0 = 0;
	}
	else
	{
		ip0 = 1;
	}
	TV t0(s0, volumn, 100, channel, md0, ip0);
	Remote r0(md0);
	string command;
	while (cin >> command)
	{
		if (command == "onoff") r0.onoff(t0);
		else if (t0.ison())
		{
			if (command == "volup")
			{
				r0.volup(t0);
			}
			else if (command == "voldown")
			{
				r0.voldown(t0);
			}
			else if (command == "chanup")
			{
				r0.chanup(t0);
			}
			else if (command == "chandown")
			{
				r0.chandown(t0);
			}
			else if (command == "set_mode")
			{
				r0.set_mode(t0);
			}
			else if (command == "set_input")
			{
				r0.set_input(t0);
			}
		}
	}
	t0.settings();
	return 0;
}

没什么难点,复合类写起来麻烦……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再给艾克三年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值