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

news2024/11/21 0:34:19

题目一:复数运算

题目描述:

复数类的声明如下

 

要求如下:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/640636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

待办事项JS:DHTMLX To Do List 1.2 cRACK

DHTMLX To Do List用于有效任务管理的DHTMLX JavaScript 待办事项列表 使用 JavaScript/HTML 5 中的待办事项列表来管理您的任务并确定其优先级。将组件连接到 DHTMLX 甘特图&#xff0c;并允许用户以简单直观的方式快速组织他们的业务流程。 DHTMLX JavaScript 待办事项列表的…

chatgpt赋能python:Python建模块最佳实践

Python建模块最佳实践 Python是一种灵活、易于使用的编程语言&#xff0c;因其强大的模块化支持和丰富的第三方模块而备受推崇。本文将介绍Python建模块的最佳实践&#xff0c;以便帮助开发人员创建可重用、可维护和易于测试的Python模块。 基本概念 在Python中&#xff0c;…

创业很长时间以后…

创业过很长时间以后…综合能力是有滴 创业和打工后的思维习惯 为了效率&#xff0c;一般情况是这样滴 趣讲大白话&#xff1a;区别还是有滴 【趣讲信息科技195期】 **************************** 创业还是很难滴 每年成立很多新公司 有很多公司关门 公司平均生存时间&#xff1…

右值引用以及move移动语义和forward 完美转发

右值引用 右值引用最简单的作用&#xff1a;可以避免无谓的复制&#xff0c;提高了程序性能&#xff08;在移动构造函数中有体现&#xff09;。 什么是右值 最基本的解释&#xff1a; 左值可以取地址、位于等号左边&#xff1b; 右值没法取地址&#xff0c;位于等号右边。&…

UnityVR--组件9--VideoPlayerAudioSource

目录 前言 视频组件VideoPlayer参数解释 RenderMode渲染方式 VideoPlayer类中的API 音频组件AudioSource参数解释 AudioSource类中的常见API&简单应用 前言 在之前的VR场景中已经使用过VideoPlayer播放视频&#xff08;Unity.UI的交互&#xff08;6&#xff09;-播放…

chatgpt赋能python:Python怎么快速读取一组图片的RGB值?

Python怎么快速读取一组图片的RGB值&#xff1f; 简介 Python是一种非常流行的程序设计语言&#xff0c;它具有易于学习、简洁明了的语法和强大的功能。Python被广泛应用于数据分析、人工智能、科学计算、Web开发、游戏开发等领域。在这篇文章中&#xff0c;我们将介绍如何使…

chatgpt赋能python:Python快速缩进技巧与优化提升

Python快速缩进技巧与优化提升 介绍 在Python中&#xff0c;缩进是代码块的唯一标识符。这种缩进机制使得Python代码看起来更加清晰和易于阅读。同时&#xff0c;正确的缩进也是Python程序能否正常运行的重要因素。然而&#xff0c;大量的缩进可能会导致程序员的效率降低&…

Android系统Handler详解

目录 一&#xff0c;背景介绍 1.1 简介 1.2 核心概念 1.3 Handler 背后的生产者-消费者模型 二&#xff0c;Handler机制原理 2.1 消息模型 2.2 Handler原理概述 2.3 Handler与管道通信 三&#xff0c;实战 3.1 创建 Handler 3.2 子线程向主线程 3.3 主线程向子线程…

C/C++爱心代码“你把握不住的,让哥来~”祝你找到另一半

目录 第一种心形 加点好玩的 最后一忠心形&#xff08;会变色的爱心&#xff09; 618多得图书活动来啦 第一种心形 这次需要用到头文件#include<windows.h> #include<stdio.h> #include<windows.h> 以下是完整代码 #include<stdio.h> #include<…

chatgpt赋能python:Python中如何使用Math库进行数学计算

Python中如何使用Math库进行数学计算 Python是一种功能强大的编程语言&#xff0c;但对于许多数字计算、三角函数和其他复杂的数学问题&#xff0c;Python本身并不提供内置支持。为了解决这些问题&#xff0c;Python提供了一个名为Math的库。本文将介绍如何引入Math库&#xf…

【王道·操作系统】第三章 内存管理【未完】

一、内存管理 1.1 内存的基础知识 内存可存放数据&#xff0c;程序执行前需要先放到内存中才能被CPU处理——缓和CPU与硬盘之间的速度矛盾内存地址从0开始&#xff0c;每个地址对应一个存储单元 按字节编址&#xff1a;每个存储单元大小为1字节(B)&#xff0c;即8个二进制位按…

OJ Prime Gap

目录 1.题目 2.中文翻译 3.题意 4.代码 5.知识点 range的倒序处理&#xff1a; 1.题目 Prime Gap Description The sequence of n − 1 consecutive composite numbers (positive integers that are not prime and not equal to 1) lying between two successive prime…

软考A计划-2023系统架构师-知识点集锦(3/4)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

DAY20:二叉树(十)最大二叉树+合并二叉树

文章目录 654.最大二叉树思路遍历顺序 完整版变量作用域的问题 修改后的完整版递归进一步理解关于终止条件 优化时间复杂度和空间复杂度的优化补充&#xff1a;二叉树的高度logn 617.合并二叉树思路完整版定义新二叉树的写法 654.最大二叉树 本题做的时候也卡了一些问题&#…

Gitlab CI/CD概述

前言 CI/CD 是一种持续开发软件的方法&#xff0c;可以不断的进行构建、测试和部署代码迭代更改。这种迭代有助于减少基于错误或失败的版本进行开发新代码的可能性。使用这种方法&#xff0c;从新代码开发到部署&#xff0c;可以减少人工干预甚至不用干预。 达到持续的方法主要…

Python实例属性和实例方法_类对象、类属性、类方法、静态方法

一、实例属性 实例属性是从属于实例对象的属性&#xff0c;也称为“实例变量”。他的使用有如下几个要点&#xff1a; 实例属性一般在__init__()方法中通过如下代码定义&#xff1a; self.实例属性名 初始值 在本类的其他实例方法中&#xff0c;也是通过self进行访问&#x…

QGIS下载天地图瓦片数据

说明 介绍利用QGIS下载天地图瓦片数据。 关键字:window、QGIS、天地图 环境准备 QGIS版本为3.28.3 基本步骤 一、在Browser面板中找到XYZ Tiles 二、New Connection 参数设置 天地图参数 name:如"天地图影像"url :https://t5.tianditu.gov.cn/DataServer?T=…

U-Mail邮件系统:严防数据泄露 保障企业数据安全

在数字经济时代&#xff0c;数据已经成为企业的核心生产要素&#xff0c;也由此滋生了牟取暴利的黑色产业链&#xff0c;企业数据泄露事件有增无减。根据IdentifyTheft Research Center中心的数据显示&#xff0c;2022年世界范围内的数据泄露事件比2021年增长了14%。其中&#…

chatgpt赋能python:Python如何得出结果:从基础语法到高级算法

Python如何得出结果&#xff1a;从基础语法到高级算法 作为一种流行的编程语言&#xff0c;Python被广泛应用于数据分析、人工智能、Web开发等领域。但是&#xff0c;Python也是一种非常值得学习的SEO工具&#xff0c;它可以帮助你得出有关网站排名、竞争对手分析、关键词选择…

JavaScript-Vue

2 Vue 2.1 Vue概述 通过我们学习的htmlcssjs已经能够开发美观的页面了&#xff0c;但是开发的效率还有待提高&#xff0c;那么如何提高呢&#xff1f;我们先来分析下页面的组成。一个完整的html页面包括了视图和数据&#xff0c;数据是通过请求 从后台获取的&#xff0c;那么…