深圳大学计软《面向对象的程序设计》实验13 运算符重载

news2025/1/18 20:13:35

A. 三维坐标点的平移(运算符重载)

题目描述

定义一个三维点Point类,利用友元函数重载"++“和”–"运算符,并区分这两种运算符的前置和后置运算。
在这里插入图片描述

要求如下:

1.实现Point类;

2.编写main函数,初始化1个Point对象,将这个对象++或–后赋给另外一个对象,并输出计算后对象的坐标信息。

输入

第1行:输入三个int类型的值,分别为一个Point对象p1的x,y,z坐标。

输出

第1行:Point对象p1后置++之后的坐标信息输出。

第2行:Point对象p1后置++操作后赋给另外一个Point对象p2的坐标信息。

第3行开始,依次输出前置++,后置–,前置–运算的坐标信息,输出格式与后置++一样。

输入样例1

10 20 30

输出样例1

x=11 y=21 z=31
x=10 y=20 z=30
x=11 y=21 z=31
x=11 y=21 z=31
x=9 y=19 z=29
x=10 y=20 z=30
x=9 y=19 z=29
x=9 y=19 z=29

提示

原值是最初输入的数值

第1行是p1后置++后,再输出

第2行是p1恢复原值,接着p1后置++同时复制给p2,p2输出

第3、4行是p1恢复原值,p1前置++同时输出,然后p1再输出

第5、6行是p1恢复原值,p1后置–后,再输出,接着输出一次原值

第7、8行是p1恢复原值,p1前置–同时输出,然后p1再输出

AC代码

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

class Point {
	int x, y, z;
public:
	Point(int x=0,int y=0,int z=0):
		x(x),y(y),z(z){}

	friend Point operator++(Point&a){
		a.x++; a.y++; a.z++;
		return a;
	}


	friend Point operator++(Point& a, int) {
		Point TEMP = a;
		a.x++; a.y++; a.z++;
		return TEMP;
	}

	friend Point operator--(Point& a) {
		a.x--; a.y--; a.z--;
		return a;
	}


	friend Point operator--(Point& a, int) {
		Point TEMP = a;
		a.x--; a.y--; a.z--;
		return TEMP;
	}

	void show() {
		cout << "x=" << x << " " << "y=" << y << " " << "z=" << z << endl;
	}
};

int main() {
	int x, y, z;
	cin >> x >> y >> z;
	Point p1(x, y, z);
	p1++;
	p1.show();//line 1
	p1--;
	Point p2 = (p1++);
	p2.show();//line 2

	p1--;
	(++p1).show();//line 3
	p1.show();// line 4

	p1--;
	p1--;
	p1.show();
	p1++;
	p1.show();

	//p1--;
	(--p1).show();
	p1.show();
	return 0;

}

B. 矩阵相加(运算符重载)

题目描述

已知一个矩阵包含行数m、列数n、数值data三个属性,包含初始化、输出、相加等操作,要求

1、在类定义中,矩阵的data属性是一个整数指针型指针。只有创建对象时,根据外来输入的行数和列数,才把指针变成一个二维数组

2、用运算符重载的方法实现两个矩阵对象的相加,矩阵相加是指两个矩阵的每个位置上的两个元素相加

3、用构造函数实现对象的初始化,用输出函数实现矩阵的输出。提示:在构造函数内做输入可以减少很多麻烦

整数指针变成二位数组的参考代码

//m和n是行数和列数

int m, n;

int **data;

int i, j;

cin>>m>>n;
data=new int*[m]; //先创建m行
for(i=0;i<m;i++)
{ data[i]=new int[n]; } //再创建n列

for (i=0; i<m; i++)
for (j=0; j<n; j++)
cin>>data[i][j];

输入

第一行输入t表示t个实例

第二行输入第一个示例的矩阵的行数和列数,两个矩阵的行数和列数都是相同的

第三行起,输入第一个矩阵的具体数据

依次类推,输入第二个矩阵的具体数据

依次类推,输入下一个示例的数据

输出

输出每两个矩阵相加的结果,每个示例结果之间用一个回车分隔开

输入样例1

2
2 3
1 2 3
4 5 6
-1 -2 -3
6 5 4
2 2
11 22
33 44
55 66
77 88

输出样例1

0 0 0
10 10 10
66 88
110 132

AC代码

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

class Matrix {
	int m, n, ** data;
public:
	Matrix(int m,int n):m(m),n(n) {
		data = new int* [m];
		for (int i = 0; i < m; i++)
			data[i] = new int[n];
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
				cin >> data[i][j];
	}

	Matrix(const Matrix& a) {
		m = a.m;
		n = a.n;
		data = new int* [m];
		for (int i = 0; i < m; i++)
			data[i] = new int[n];
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
				data[i][j] = a.data[i][j];
	}

	void print() {
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				if (j)
					cout << " ";
				cout << data[i][j];
			}
			cout << endl;
		}
	}

	~Matrix(){
		for (int i = 0; i < m; i++)
			delete[]data[i];
		delete[]data;
	}


	Matrix operator +(const Matrix& a) {
		Matrix TEMP(a);
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
				TEMP.data[i][j] += data[i][j];
		return TEMP;
	}
};

int main() {
	int t;
	cin >> t;
	while (t--){
		int m, n;
		cin >> m >> n;
		Matrix a(m, n), b(m, n);
		(a + b).print();
	}
}

C. 字符串比较(运算符重载)

题目描述

定义一个字符串类str,用来存放不定长的字符窜,重载运算符"= =“、”<“、”>",用于两个字符窜的等于、小于和大于的比较运算。
在这里插入图片描述

要求如下:

1.实现str类;

2.编写main函数,初始化三个str对象A、B、C,然后用这三个对象去测试重载的运算符。如果A>B,则输出A的字符串;否则输出B的字符串。如果A<C,则输出A的字符串;否则输出C的字符串。如果B==C,则输出B的字符串;否则输出C的字符串。

输入

输入3行,每行为一个字符串,初始化三个str对象。

输出

输出比较之后的结果字符串,每个比较的结果一行。

输入样例1

i am a student
i love China
i love China

输出样例1

i love China
i am a student
i love China

AC代码

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

class Str {
	char* p;
public:
	Str() {}
	Str(char* s) {
		int len = strlen(s) + 1;
		p = new char[len];
		strcpy(p, s);
		p[len - 1] = '\0';
	}

	friend bool operator>(Str& a, Str& b) {
		return strcmp(a.p, b.p) > 0;
	}

	friend bool operator<(Str& a, Str& b) {
		return strcmp(a.p, b.p) < 0;
	}

	friend bool operator==(Str& a, Str& b) {
		return strcmp(a.p, b.p) == 0;
	}

	~Str()
	{
		delete[]p;
	}

	void print() {
		cout << p << endl;
	}

};

int main() {
	string t;
	getline(cin, t);
	Str a((char*)t.c_str());
	getline(cin, t);
	Str b((char*)t.c_str());
	getline(cin, t);
	Str c((char*)t.c_str());

	if (a > b)
		a.print();
	else
		b.print();
	if (a < c)
		a.print();
	else c.print();

	if (b == c)
		b.print();
	else c.print();
	return 0;
}

D. 四进制加法(运算符重载)

题目描述

定义一个四进制的类,重定义“+”号实现四进制数的累加。

输入

第一行输入所需要的四进制数的个数

第二行开始,依次输入四进制数

输出

所有输入四进制数累加的和

输入样例1

3
13
2
21

输出样例1

102

AC代码

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

class Myclass {
	int v;

	//4 -> 10
	int to_10(int value) {
		int sum = 0;
		string temp = to_string(value);
		for (int i = 0; i < temp.length(); i++) {
			sum += pow(4, i) * (temp[temp.length() - 1 - i] - '0');
		}
		return sum;
	}

	int to_4(int value) {
		string ans;
		while (value) {
			ans = to_string(value % 4) + ans;
			value /= 4;
		}
		return stoi(ans);
	}

public:
	Myclass() {
		cin >> v;
	}

	Myclass(int v) :v(v) {}


	Myclass operator+(const Myclass& a) {
		int sum = to_10(v) + to_10(a.v);
		sum = to_4(sum);
		return Myclass(sum);
	}

	int getValue() { return v; }

};

int main() {
	int n;
	cin >> n;
	vector<Myclass>v(n);
	Myclass sum(0);
	for (auto& it : v) {
		sum = sum + it;
	}
	cout << sum.getValue();

	return 0;
}

E. 学生生日差值计算(运算符重载)

题目描述

定义一个学生类Student,包含该学生的姓名、出生年、月、日 ,重定义 “-”号实现两个学生之间相差多少天的比较。并利用重载的“-”运算符,求所有学生中年龄相差最大的两个人的名字以及相差天数。

输入

第一行:输入所需要输入的学生个数;

第二行开始,依次输入每个学生的姓名、出生年、月、日。

输出

输出年龄相差最大的两个人的名字以及相差天数。

输入样例1

3
Tom 1995 1 1
Joe 1995 2 28
Jimmy 1996 1 8

输出样例1

Tom和Jimmy年龄相差最大,为372天。

AC代码

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

class Date {
	int y, m, d;
public:
	Date() { cin >> y >> m >> d; }

	Date operator++() {
		int days[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
		if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
			days[1]++;
		d++;

		if (d > days[m - 1]) {
			d = 1;
			m++;
		}

		if (m > 12) {
			m = 1;
			y++;
		}

		return *this;
	}

	bool operator<(const Date& a) {
		if (y != a.y)
			return y < a.y;
		if (m != a.m)
			return m < a.m;
		if (d != a.d)
			return d < a.d;
	}

	bool operator==(const Date& a) {
		if (y != a.y)
			return false;
		if (m != a.m)
			return false;
		if (d != a.d)
			return false;
		return 1;
	}

	bool operator!=(const Date& a) {
		if (y != a.y)
			return 1;
		if (m != a.m)
			return 1;
		if (d != a.d)
			return 1;
		return 0;
	}

	int operator - (const Date& a) {
		int cnt = 0;
		Date a1 = *this;
		Date a2 = a;
		if (a2 < a1)
			swap(a1, a2);
		while (a1 != a2) {
			++a1; cnt++;
		}

		return cnt;
	}

};

class Student {
	string name;
	Date birthday;
public:
	Student(string n, Date b) :name(n), birthday(b) {

	}

	friend int operator-(Student& a, Student& b) {
		return a.birthday - b.birthday;
	}

	string getName() {
		return name;
	}

};

int main() {
	int n;
	cin >> n;
	vector<Student>v;
	for (int i = 0; i < n; i++) {
		string name;
		cin >> name;
		Date birthday;
		Student s(name, birthday);
		v.push_back(s);
	}

	int s1, s2;
	int cnt = -1;
	for (int i = 0; i < n - 1; i++)
		for (int j = i + 1; j < n; j++) {
			if (cnt < v[i] - v[j]) {
				cnt = v[i] - v[j];
				s1 = i; s2 = j;
			}
		}

	cout << v[s1].getName() << "和" << v[s2].getName() << "年龄相差最大,为" << cnt << "天。" << endl;

}

F. 时钟调整(运算符前后增量)

题目描述

假定一个时钟包含时、分、秒三个属性,取值范围分别为011,059,0~59,具体要求如下:

1、用一元运算符++,并且是前增量的方法,实现时钟的调快操作。例如要把时钟调快5秒,则执行5次” ++<对象> “ 的操作

2、用一元运算符–,并且是后增量的方法,实现时钟的调慢操作。例如要把时钟调慢10秒,则执行10次” <对象>-- “的操作

3、用构造函数的方法实现时钟对象的初始化,用输出函数实现时钟信息的输出

clock是系统内部函数,所以不要用来做类名或者其他

输入

第一行输入时钟的当前时间时、分、秒

第二行输入t表示有t个示例

第三行输入t个整数x,如果x为正整数,则表示执行调快操作,使用重载运算符++;如果x为负整数,则表示执行调慢操作,使用重载运算符–

每次的调快或调慢操作都是承接上一次调整后的结果进行,例如先调快10秒,再调慢2秒,那么调慢2秒是接着调快10秒后的结果进行的

输出

每行输出每个时钟调整操作后的时分秒

输入样例1

11 58 46
4
5 70 -22 -55

输出样例1

11:58:51
0:0:1
11:59:39
11:58:44

AC代码

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

class Clock {
	int h, m, s;
public:
	Clock() {
		cin >> h >> m >> s;
	}

	Clock operator ++() {
		s++;
		if (s == 60) {
			s = 0;
			m++;
		}

		if (m == 60) {
			m = 0;
			h++;
		}

		if (h == 12) {
			h = 0;
		}
		return *this;
	}

	Clock operator --(int) {
		s--;
		if (s == -1) {
			s = 59;
			m--;
		}
		if (m == -1) {
			m = 59;
			h--;
		}
		if (h == -1)
			h = 11;
		return *this;
	}

	void print() {
		cout << h << ":" << m << ":" << s << endl;
	}
};

int main() {
	Clock c;
	int t;
	cin >> t;
	while (t--)
	{
		int n;
		cin >> n;
		if (n > 0) {
			while (n > 0){
				++c;
				n--;
			}
			c.print();
		}

		else {
			while (n < 0)
			{
				c--;
				n++;
			}
			c.print();
		}
	}
	return 0;
}

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

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

相关文章

关于2023年造林施工、林业设计资质,新办、年审的最新通知!

一、资质类别省林学会本年度开展认定的资质种类包括&#xff1a;造林绿化类&#xff08;含施工资质、监理资质&#xff09;、林业有害生物防治类&#xff08;含防治资质、监理资质&#xff09;和林业调查规划设计类。二、认定标准资质认定执行以下标准&#xff1a;1.造林绿化施…

边缘计算:万字长文详解高通SNPE inception_v3安卓端DSP推理加速实战

本文是在以下文章的基础上编写&#xff0c;关于SNPE环境部署和服务器端推理可以参考上一篇文章&#xff1a; 边缘计算&#xff1a;万字长文详解高通SNPE inception_v3推理实战_seaside2003的博客-CSDN博客 本文最/关键的是利用SNPE在安卓环境不同的runtimes&#xff08;CPU/G…

高通 Android10/12 4 6dof Camera+2RGBCamera异常处理经验总结

1 背景&#xff1a;此需求apk距离之前更改时间将近9个月&#xff0c;我们这边原来跟驱动那边对接指令和角度 后续没有改过&#xff0c;测试部说apk cameaid提示信息不正确。 2 原因&#xff1a;因为之前用的1.0基线&#xff08;Android 10) 后面由于客户功能需求变更&#xff…

进程信号生命周期详解

信号和信号量半毛钱关系都没有&#xff01; 每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定 义 #define SIGINT 2 查看信号的机制&#xff0c;如默认处理动作man 7 signal SIGINT的默认处理动作是终止进程&#xff0c;SIGQUIT的默认处理…

23届春招结束_分享java岗面试心得

23届春招结束_分享java岗面试心得 从一月10日开始投简历&#xff0c;经历了两个月的面试与学习&#xff0c;成功拿到了12k13薪的国企offer&#xff0c;春招结束了 一、经历秋招&#xff0c;被所谓的金九银十给坑惨了 在秋招的时候&#xff0c;经过网友&#xff08;美团java岗…

九龙证券|利好政策密集发布,机构扎堆看好的高增长公司曝光

新能源轿车销量和保有量快速增长&#xff0c;带来了充电桩商场的微弱需求。 日前&#xff0c;商务部部长王文涛表明&#xff0c;本年将在落实好方针的一起&#xff0c;活跃出台新方针办法&#xff0c;比方辅导当地展开新能源轿车下乡活动&#xff0c;优化充电等使用环境&#x…

Vue3中的h函数

文章目录简介简单使用参数使用计数器进阶使用函数组件插槽专栏目录请点击 简介 众所周知&#xff0c;vue内部构建的其实是虚拟DOM&#xff0c;而虚拟DOM是由虚拟节点生成的&#xff0c;实质上虚拟节点也就是一个js对象事实上&#xff0c;我们在vue中写的template,最终也是经过…

Unity RectTransform Scale Handler - 如何在Runtime运行时拖动缩放窗口尺寸

文章目录简介变量说明实现光标移入移出鼠标拖动距离Anchor 锚点目标尺寸扩展方向简介 本文介绍如何在Runtime运行时拖动缩放UI窗口的尺寸&#xff0c;如图所示&#xff0c;在示例窗口的左上、上方、右上、左方、右方、左下、下方、右下&#xff0c;分别放置了一个拖动柄&#…

Spring之基于注解方式实例化BeanDefinition(1)

最近开始读Spring源码&#xff0c;读着读着发现里面还是有很多很好玩的东西在里面的&#xff0c;里面涉及到了大量的设计模式以及各种PostProcessor注入的过程&#xff0c;很好玩&#xff0c;也很复杂&#xff0c;本文就是记录一下我学习过程中的主干流程。 在开始我们源码解读…

2023年湖北武汉中级工程师怎么申请?申报渠道有哪些?启程别

2023年湖北武汉中级工程师怎么申请?申报渠道有哪些&#xff1f;启程别 武汉市中级工程师怎么报名&#xff1f;很多人不知道中级职称怎么申请&#xff0c;在哪里申请&#xff0c;那么启程别来告诉大家&#xff0c;启程别是谁&#xff0c;进入百度搜索启程别就知道啦 武汉中级工…

【学习Docker(七)】详细讲解Jenkins部署SpringCloud微服务项目,Docker-compose启动

Jenkins部署SpringCloud微服务项目&#xff0c;Docker-compose启动 座右铭&#xff1a;《坚持有效输出&#xff0c;创造价值无限》 本文介绍使用Jenkins部署SpringCloud微服务项目&#xff0c;Docker-compose启动。 之前写过安装Jenkins的过程&#xff0c;这里就不写安装细节了…

[oeasy]python0099_雅达利大崩溃_IBM的开放架构_兼容机_oem

雅达利大崩溃 回忆上次内容 个人计算机浪潮已经来临 苹果公司迅速发展微软公司脱离mits准备做纯软件公司IBM用大型机思路制作的5100惨败 Commodore 64 既做计算机又做游戏机 计算机行业和游戏行业 跟随着底层技术不断迭代已经进入了战乱纷纷的年代最终又会如何呢&#xff1f…

31 openEuler使用LVM管理硬盘-管理物理卷

文章目录31 openEuler使用LVM管理硬盘-管理物理卷31.1 创建物理卷31.2 查看物理卷31.3 修改物理卷属性31.4 删除物理卷31 openEuler使用LVM管理硬盘-管理物理卷 31.1 创建物理卷 可在root权限下通过pvcreate命令创建物理卷。 # pvcreate [option] devname ...其中&#xff1…

【linux工具】Tmux简明教程

A Quick and Easy Guide to tmux (hamvocke.com) 一、说明 我们常用ubuntu&#xff0c;用altctlT实现终端窗口弹出。然而当需要多个终端一起工作&#xff0c;切换的效率就成了问题。 tmux是ubuntu下&#xff0c;终端窗口工具。该工具能实现多窗口分屏显示、多个会话在一个终端…

【13】linux命令每日分享——groupadd建立组

大家好&#xff0c;这里是sdust-vrlab&#xff0c;Linux是一种免费使用和自由传播的类UNIX操作系统&#xff0c;Linux的基本思想有两点&#xff1a;一切都是文件&#xff1b;每个文件都有确定的用途&#xff1b;linux涉及到IT行业的方方面面&#xff0c;在我们日常的学习中&…

时间复杂度的计算

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【数据结构初阶&#xff08;C实现&#xff09;】 文章目录123456789时间复杂度&#xff08;就是一个函数&#xff09;的计算&#xff0c;…

Flutter开发圆形计时进度条RingProgressBar

演示 先看效果图&#xff1a; 由于无法截取动态图&#xff0c;我就截过程中的两张图片表达了&#xff0c;我想应该能看得懂。 功能1.设置进度条半径 2.设置进度条宽度 3.设置进度条最大值 4.设置进度条背景色以及前景色 5.是否显示进度条文字 6.文字样式设置 7.点击进度条和进…

机器学习100天(三十七):037 朴素贝叶斯-挑个好西瓜!

《机器学习100天》完整目录:目录 机器学习100天,今天讲的是:朴素贝叶斯-挑个好西瓜! 红色石头已经了解了贝叶斯定理和朴素贝叶斯法,接下来已经可以很自信地去买瓜了。买瓜之前,还有一件事情要做,就是搜集样本数据。红色石头通过网上资料和查阅,获得了一组包含 10 组样…

打印名片-课后程序(Python程序开发案例教程-黑马程序员编著-第二章-课后作业)

实例3&#xff1a;文本进度条 进度条以动态方式实时显示计算机处理任务时的进度&#xff0c;它一般由已完成任务量与剩余未完成任务量的大小组成。本实例要求编写程序&#xff0c;实现图1所示的进度条动态显示的效果。 下载中下载完成图1文本进度条 实例分析 在本实例中可以将…

【java】alibaba Fastjson --全解史上最快的JSON解析库

文章目录前序Fastjson 简介Fastjson 的优点速度快使用广泛测试完备使用简单功能完备下载和使用将 Java 对象转换为 JSON 格式JSONField创建 JSON 对象JSON 字符串转换为 Java 对象使用 ContextValueFilter 配置 JSON 转换使用 NameFilter 和 SerializeConfigFastjson 处理日期F…