深圳大学计软《面向对象的程序设计》实验8 静态与友元

news2024/12/23 17:21:56

A. 旅馆旅客管理(静态成员)

题目描述

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

定义一个Customer类,要求输入客人的姓名,创建一个Customer对象。类声明如下:
在这里插入图片描述

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

输入

输入测试次数t

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

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

输出

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

输入样例1

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

输出样例1

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

AC代码

#include<bits/stdc++.h>
using namespace std;

class Customer {
	static int TotalCustNum;
	static int Rent;
	static int Year;
	int CustID;
	string name;
public:
	Customer(string name) :name(name) {
		Rent += 150;
		TotalCustNum++;
		CustID = TotalCustNum;
	}

	~Customer() { name.clear(); }

	static void changeYear(int r) {
		Year = r;
	}

	void Display() {
		cout << name << " " << Year;
		cout << setfill('0') << setw(4) << CustID << " " << CustID << " " << Rent << endl;
	}

	static void init() {
		TotalCustNum = 0;
		Rent = 0;
	}
};

int Customer::TotalCustNum = 0;
int Customer::Rent = 0;
int Customer::Year = 0;


int main() {
	int t;
	cin >> t;
	for (int i = 0; i < t; i++) {
		//Customer::init();
		int year;
		cin >> year;
		string name;
		cin >> name;
		int j = 1;
		while (name != "0") {
			Customer test(name);
			Customer::changeYear(year);
			test.Display();
			cin >> name;
		}
	}
	return 0;
}

B. 距离计算(友元函数)

题目描述

Point类的基本形式如下:

在这里插入图片描述

请完成如下要求:

  1. 实现Point类;
  2. 为Point类增加一个友元函数double Distance(Point &a, Point &b),用于计算两点之间的距离。直接访问Point对象的私有数据进行计算。
  3. 编写main函数,输入两点坐标值,计算两点之间的距离。

输入

第1行:输入需计算距离的点对的数目

第2行开始,每行依次输入两个点的x和y坐标

输出

每行依次输出一组点对之间的距离(结果直接取整数部分,不四舍五入)

输入样例1

2
1 0 2 1
2 3 2 4

输出样例1

1
1

AC代码

#include<bits/stdc++.h>
using namespace std;

class Point {
	double x, y;
public:
	Point(double xx, double yy) {
		x = xx;
		y = yy;
	}

	friend double Distance(Point& a, Point& b) {
		return sqrt(pow(b.x - a.x, 2) + pow(a.y - b.y, 2));
	}
};

int main() {
	int t;
	cin >> t;
	while (t--){
		double a, b, c, d;
		cin >> a >> b >> c >> d;
		Point p1(a, b), p2(c, d);
		cout << int(Distance(p1, p2)) << endl;
	}
	return 0;
}

C. 日期时间合并输出(友元函数)

题目描述

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

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

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

函数原型为:void Display(Date &, Time &)

函数输出要求为:

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行

输入样例1

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

输出样例1

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

AC代码

#include<bits/stdc++.h>
using namespace std;

class Time;
class Date {
	int year, month, day;
	string name[12] = { "January","February","March","April","May","June","July","August","September","October","November","December" };
public:
	Date() { cin >> year >> month >> day; }
	friend void Display(Date& date, Time& time);
};

class Time {
	int year, minute, second;
public:
	Time() { cin >> year >> minute >> second; }
	friend void Display(Date& date, Time& time);
};

void Display(Date& date, Time& time) {
	cout <<setfill('0')<<setw(4)<< date.year << "-";
	cout <<setfill('0') << setw(2) << date.month << "-";
	cout << setfill('0') << setw(2) << date.day << " ";
	cout << setfill('0') << setw(2) << time.year << ":";
	cout << setfill('0') << setw(2) << time.minute << ":";
	cout << setfill('0') << setw(2) << time.second << endl;
}

int main() {
	int t;
	cin >> t;
	while (t--) {
		Date d;
		Time t;
		Display(d, t);
	}
	return 0;
}

D. 判断矩形是否重叠(复合类+友元)

题目描述

用CPoint表示点,用两个CPoint对象表示矩形类CRect的对角线两点。分别实现CPoint类和CRect类,并在主函数用输入的坐标定义4个CPoint类对象,每2个CPoint对象再构造1个CRect对象,然后写个友元函数,判断2个矩形是否重叠。

输入

判断次数

矩形1的对角线顶点坐标x1, y1, x2, y2

矩形2的对角线顶点坐标x1, y1, x2, y2

输出

是否重叠

输入样例1

3
1 5 2 9
1 3 2 4
5 6 7 8
5 7 7 7
2 5 1 0
9 4 2 9

输出样例1

not overlapped
overlapped
overlapped

AC代码

#include<bits/stdc++.h>
using namespace std;

class CRect;

class CPoint {
	double x, y;
public:
	CPoint() { cin >> x >> y; }
	friend bool isOverlap(CRect& c1, CRect& c2);
};

class CRect {
	CPoint p1, p2;
public:
	CRect(CPoint& p1, CPoint& p2):p1(p1),p2(p2){}

	friend bool isOverlap(CRect& c1, CRect& c2);
};

bool isOverlap(CRect& c1, CRect& c2) {
	int c1up = max(c1.p1.y, c1.p2.y);
	int c1down = min(c1.p1.y, c1.p2.y);
	int c1left = min(c1.p1.x, c1.p2.x);
	int c1right = max(c1.p1.x, c1.p2.x);

	int c2up = max(c2.p1.y, c2.p2.y);
	int c2down = min(c2.p1.y, c2.p2.y);
	int c2left = min(c2.p1.x, c2.p2.x);
	int c2right = max(c2.p1.x, c2.p2.x);

	if (c1up < c2down)
		return false;
	if (c1down > c2up)
		return false;
	if (c1left > c2right)
		return false;
	if (c2left > c1right)
		return false;
	return true;

}

int main() {
	int t;
	cin >> t;
	while (t--) {
		CPoint p1, p2, p3, p4;
		CRect c1(p1, p2), c2(p3, p4);
		if (isOverlap(c1, c2))
			cout << "overlapped" << endl;
		else
			cout << "not overlapped" << endl;
	}
	return 0;
}

E. 银行账户(静态成员与友元函数)

题目描述

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

在这里插入图片描述

要求如下:

实现该银行账户类

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

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

大家可以根据实际需求在类内添加其他方法,也可以修改成员函数的参数设置

输入

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

输出

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

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

输入样例1

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

输出样例1

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

AC代码

#include<bits/stdc++.h>
using namespace std;

class Account {
	static float TotalBalance;
	static int count;
	static float InterestRate;
	string _accno, _accname;
	float _banlance;
	float save, withdraw;
public:
	Account() {
		cin >> _accno >> _accname >> _banlance >> save >> withdraw;
	}

	static float getTotalBalance() {
		return TotalBalance;
	}

	friend void Update(Account& a) {
		a._banlance += a.save;
		a._banlance *= (1 + a.InterestRate);
		cout << a._banlance << " ";
		a._banlance -= a.withdraw;
		cout << a._banlance << endl;
		a.TotalBalance += a._banlance;
	}

	~Account()
	{
	}

	void Show() {
		cout << _accno  << " " << _accname << " " << _banlance +save << " ";
	}

	static int GetCount() { return count; }
	static float GetInterestRate() { return InterestRate; }

	static void changeRate() {
		cin >> InterestRate;
	}

};

int Account::count = 0;
float Account::InterestRate = 0;
float Account::TotalBalance = 0;

int main() {
	Account::changeRate();
	int n;
	cin >> n;
	Account* account = new Account[n];
	for (int i = 0; i < n; i++) {

		(account + i)->Show();
		Update(*(account + i));
	}
	cout << Account::getTotalBalance() << endl;
	delete[]account;

	return 0;
}

F. 电视机与遥控器(友元类)

题目描述

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

在这里插入图片描述

在这里插入图片描述

要求如下:

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

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

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

输入

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

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

输出

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

输入样例1

off 10 19 Cable VCR
onoff volup chanup set_mode set_input

输出样例1

on 11 20 Antenna TV

AC代码

#include<bits/stdc++.h>
using namespace std;


class TV {
	int state, volume, maxchannel, channel, mode, input;
	friend class Remote;
public:
	TV() {
		string _state, _mode, _input;
		cin >> _state >> volume >> channel >> _mode >> _input;
		_state == "on" ? state = 1 : state = 0;
		_mode == "Cable" ? mode = 0 : mode = 1;
		_input == "TV" ? input = 1 : input = 0;
	}

	void onoff() {
		state = !state;
	}

	bool isOn()const {
		return state;
	}

	bool volup() {
		if (!isOn())
			return false;

		volume++;
		if (volume > 20)
			return false;
		return true;
	}

	bool voldown() {
		if (!isOn())
			return false;

		volume--;
		if (volume < 0)
			return false;
		volume = 0;
	}

	void chanup() {
		if (!isOn())
			return;

		channel++;
		if (channel > 100)
			channel = 100;
	}

	void chandown() {
		if (!isOn())
			return;

		channel--;
		if (channel < 0)
			channel = 0;
	}

	void set_chan() {
		if (!isOn())
			return;

		channel = !channel;
	}

	void set_mode() {
		if (!isOn())
			return;

		mode = !mode;
	}

	void set_input() {
		if (!isOn())
			return;

		input = !input;
	}

	void settings() {
		if (state)
			cout << "on ";
		else
			cout << "off ";

		cout << volume << " " << channel << " ";

		if (!mode)
			cout << "Cable ";
		else
			cout << "Antenna ";

		if (!input)
			cout << "VCR" << endl;
		else
			cout << "TV" << endl;
	}

	int getMode() { return mode; }

};


class Remote {
	int mode;
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(); }
};

int main() {
	TV t;
	Remote r(t.getMode());
	string s;
	while(cin >> s) {
		if (s == "onoff")
			r.onoff(t);
		else if (s == "volup")
			r.volup(t);
		else if (s == "voldown")
			r.voldown(t);
		else if (s == "set_mode")
			r.set_mode(t);
		else if (s == "set_input")
			r.set_input(t);
		else if (s == "chanup")
			r.chanup(t);
		else if (s == "chandown")
			r.chandown(t);
	} 

	t.settings();
	return 0;
}

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

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

相关文章

1_机器学习概述—全流程

文章目录1 机器学习定义2 机器学习常见应用框架&#xff08;重点&#xff09;3 机器学习分类3.1 监督学习&#xff08;Supervised learning&#xff09;3.2 无监督学习&#xff08;Unsupervised learning&#xff09;3.3 半监督学习&#xff08;Semi-Supervised Learning&#…

每年来一次的系统重装和磁盘整理(备忘步骤)

前言 电脑用了一段时间&#xff0c;要么C盘炸裂&#xff0c;要么你无意更新CPU炸裂&#xff0c;你所遇到的各种问题&#xff0c;没有什么事重装解决不了的。 思路 首先&#xff0c;重要的东西都转存C盘之外的盘&#xff0c;重要的是养成习惯。我C盘基本没重要的东西&#xf…

redis数据结构的适用场景分析

1、String 类型的内存空间消耗问题&#xff0c;以及选择节省内存开销的数据类型的解决方案。 为什么 String 类型内存开销大&#xff1f; 图片 ID 和图片存储对象 ID 都是 10 位数&#xff0c;我们可以用两个 8 字节的 Long 类型表示这两个 ID。因为 8 字节的 Long 类型最大可以…

云HIS系统源码 医院his源码 云his源码

大型医院his系统源码 SaaS运维平台多医院入驻强大的电子病历完整文档 &#xff0c;有演示 一、系统概述&#xff1a; 基层卫生健康云是一款满足基层医疗机构各类业务需要的健康云产品。该产品能帮助基层医疗机构完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子…

【Linux学习】菜鸟入门——gcc与g++简要使用

一、gcc/g gcc/g是编译器&#xff0c;gcc是GCC(GUN Compiler Collection&#xff0c;GUN编译器集合)中的C编译器&#xff1b;g是GCC中的C编译器。使用g编译文件时会自动链接STL标准库&#xff0c;而gcc不会自动链接STL标准库。下面简单介绍一下Linux环境下&#xff08;Windows差…

阿里云ECS服务器的6大功能组件

阿里的云服务在国内可以说是首屈一指的了&#xff0c;因此他们家的云服务器也是最受欢迎的。那么&#xff0c;你知道阿里云服务器ECS有哪些功能组件吗&#xff1f;不清楚不要紧&#xff0c;下面服务器吧小编带大家来看看。 在了解之前我们来看一张阿里云服务器ECS的产品组件架…

3.SpringSecurity请求流转的本质

SpringSecurity请求流转的本质 1. SpringSecurity核心源码分析 分析SpringSecurity的核心原理&#xff0c;那么我们从哪开始分析&#xff1f;以及我们要分析哪些内容&#xff1f; 系统启动的时候SpringSecurity做了哪些事情&#xff1f;第一次请求执行的流程是什么&#xff…

51单片机串口通讯原理及程序源码-----day8

51单片机串口通讯原理及程序源码-----day8 1.定义单片机为TTL电平&#xff1a;高 5V 低 0V RS232电平&#xff1a; 计算机的串口高 -12V 低12V 所以计算机与单片机之间通讯时需要加电平转换芯片CH340T 、 MAX232。 2.通信分类&#xff1a; &#xff08;1&#xff09;并行通信通…

Python-异常处理-try-except-else-finally

文章目录1.异常2.try/except3.try/except/else3.try/except/else/finally4.异常错误列表5.作者答疑1.异常 执行 try 子句&#xff08;在关键字 try 和关键字 except 之间的语句&#xff09;。如果没有异常发生&#xff0c;忽略 except 子句&#xff0c;try 子句执行后结束。如…

【Spring6】入门

1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测…

办公学习常用浏览器:这4款浏览器高效简洁无广告,快收藏

在办公学习中&#xff0c;我们经常需要用到浏览器。关于浏览器相信大家并不陌生&#xff0c;市面上的浏览器多种多样&#xff0c;想要找到好用又高效的浏览器并不容易。我个人用过不下10款浏览器&#xff0c;最后只留下这4款&#xff0c;下面给大家分享无广告、高效简洁的浏览器…

02-前端-javaScript

文章目录JavaScript1&#xff0c;JavaScript简介2&#xff0c;JavaScript引入方式2.1 内部脚本2.2 外部脚本3&#xff0c;JavaScript基础语法3.1 书写语法3.2 输出语句3.3 变量3.3.1 全局变量var3.3.2 局部变量let3.3.3 常量const3.4 数据类型3.5 运算符3.5.1 \和区别 ▲3.5.2 …

三招通过Apollo和nacos的能力进行国际化热更新

通过Apollo和nacos的能力进行国际化热更新 1.apollo的自动刷新 Apollo&#xff08;阿波罗&#xff09;是一款可靠的分布式配置管理中心&#xff0c;有了它&#xff0c;我们可以用来做很多事情&#xff1a;配置的热更新&#xff0c;配置监听&#xff0c;灰度发布&#xff0c;微…

ESP32遥控器软硬件设计

一. 前言 做智能车 或者 四轴飞控怎么能少得了遥控器呢&#xff01;在这里给大家分享一个简单的基于ESP32遥控器的设计&#xff0c;包括软硬件以及3D外壳。 二. 硬件设计 1. 功能介绍 遥控器嘛&#xff0c;通信方式是最重要的&#xff0c;本设计支持 WIFI、蓝牙 和 2.4G&…

raft协议的一些理解

raft是工程上使用较为广泛的强一致性、去中心化、高可用的分布式协议。(类似的还有ZAB,GOSSIP) 大概理解一下,强一致性就是任意时刻客户端在不同机器读到的数据一致.注意跟最终一致性区别,比如数据库mysql的主从复制,主库写了再同步到从库,这个过程是异步的,主库写好就返回客户…

Python高性能编程

一、进程池和线程池 1.串行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import time import requests url_lists [ http://www.baidu.com, http://fanyi.baidu.com, http://map.baidu.com, http://music.baidu.com/, http://tieba.baid…

项目实战典型案例13——学情页面逻辑问题

学情页面逻辑问题一&#xff1a;背景介绍二&#xff1a;学情页面逻辑问题分析逻辑问题缓存滥用的问题三&#xff1a;LocalStorage基础知识数据结构特性应用场景localStorage常用方法四&#xff1a;总结一&#xff1a;背景介绍 本篇博客是对项目开发中出现的学情页面逻辑问题进…

buu [INSHack2017]rsa16m 1

题目描述&#xff1a; 打开的 rsa_16m 文件 &#xff1a; &#xff08;在此我只想说神人才找得到 c 的位置&#xff09; &#xff0c;这位置是真的难找啊 题目分析&#xff1a; 首先打开 description.md 文件&#xff0c;得到&#xff1a; 翻译下来&#xff1a; 当您需要真正…

青岛诺凯达机械盛装亮相2023济南生物发酵展,3月与您相约

BIO CHINA生物发酵展&#xff0c;作为生物发酵产业一年一度行业盛会&#xff0c;由中国生物发酵产业协会主办&#xff0c;上海信世展览服务有限公司承办&#xff0c;2023第10届国际生物发酵展&#xff08;济南&#xff09;于2023年3月30-4月1日在山东国际会展中心&#xff08;济…

王道C语言督学营OJ练习全解【24考研最新版】

前言 本篇博客是在博主参加王道408专业课前置课程-----C语言督学营的学习笔记&#xff0c;包含了从第一节课到最后一节课的所有OJ习题题解&#xff0c;文章中每一题都给出了详尽的代码&#xff0c;并在每一题的关键部位加上了注释&#xff0c;记录下来的目的是方便自己以后进行…