c++运算符重载实验

运算符重载


这次的实验课毕竟是花了我一点时间的我觉得蛮有趣的分享给你们

题目一

1.编写一个程序,其中设计一个时间类Time,用来保存时、分、秒等私有数据成员,通过重载操作符“+”实现两个时间的相加。要求将小时范围限制在大于等于0分钟范围限制在0-59分,秒钟范围限制在0-59秒。

class Time {
public:
	Time(int h = 0, int m = 0, int s = 0);
	Time operator+(Time &);
	void disptime(string);
private:
	int hours;
	int minutes;
	int seconds;
};
#include<iostream>
#include<iomanip>
using namespace std;
class Time {
	private:
		int hours;
		int minutes;
		int seconds;
	public:
		int getHours() {
			return hours;
		}
		int getMinutes() {
			return minutes;
		}
		int getSeconds() {
			return seconds;
		}
		void setHours(int h) {
			hours=h;
		}
		void setMinutes(int m) {
			minutes=m;
		}
		void setSeconds(int s) {
			seconds=s;
		}
		Time(int h=0,int m=0,int s=0);
		Time operator+(Time &);
		void disptime();
};
Time::Time(int h,int m,int s) {
	hours=h;
	minutes=m;
	seconds=s;
	if(seconds>=60) {
		seconds%=60;
		minutes+=1;
	}
	if(minutes>=60) {
		minutes%=60;
		hours+=1;
	}
}
Time Time::operator+(Time &time) {
	return Time(hours+time.getHours(),minutes+time.getMinutes(),seconds+time.getSeconds());
}
void Time::disptime() {
	cout<<"时间为:"<<setw(2)<<setfill('0')<<getHours()<<":"<<setw(2)<<getMinutes()<<":"<<setw(2)<<getSeconds()<<endl;
}
int main() {
	Time time1(1,56,4);
	Time time2(1,3,56);
	Time time3;
	time3=time1+time2;
	time3.disptime();
	return 0;
}

题目二

  1. 编写一个程序,用于进行集合的并、差和交运算。例如输入整数集合{9 5 4 3 6 7}和{2 4 6 9},计算出它们进行集合的并、差和交运算后的结果。
    【提示】
    (1)可用以下表达式实现整数集合的基本运算:
    s1+s2 两个整数集合的并运算
    s1-s2 两个整数集合的差运算
    s1s2 两个整数集合的交运算
    (2)参考以下Set类的框架,用于完成集合基本运算所需的各项功能。
    class Set{public:
    Set::Set();
    void Set::input(int d);//向集合中添加一个元素
    int Set::length();//返回集合中元素的个数
    int Set::getd(int i);//返回集合中位置i的元素
    void Set::disp();//输出集合的所有元素
    Set Set::operator+(Set s1);//成员运算符重载函数,实现两集合的并运算
    Set Set::operator-(Set s1);//成员运算符重载函数,实现两集合的差运算
    Set Set::operator
    (Set s1);//成员运算符重载函数,实现两集合的交运算
    Set Set::operator=(Set s1);//成员运算符重载函数,实现两集合的赋值运算
    protected:
    int len;//统计集合中元素的个数
    int s[MAX];//存放集合中的元素
    };
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX=100;
class Set {
	protected:
		int len;//统计集合中的元素
		int s[MAX];//存放集合中的元素
	public:
		Set() {
			len=0;
			s[MAX]=0;
		}
		Set(int *a,int n) { //n为数组长度
			for(int i=0; i<n; i++) {
				s[i]=a[i];
			}
			len=n;
		}
		void input(int d);
		int length();
		int getd(int i);
		void disp();
		Set operator+(Set s1);
		Set operator-(Set s1);
		Set operator*(Set s1);
		Set operator=(Set s1);

};
void Set::input(int d) {
	s[len++]=d;
}
void Set::disp() {
	cout<<"{";
	for(int i=0; i<len; i++) {
		cout<<s[i]<<" ";
	}
	cout<<"}"<<endl;
}
int Set::length() {
	return len;
}
int Set::getd(int i) {
	return s[i];
}
bool equal(int a,int b) {
	if(a==b)return true;
	return false;
}
//集合的并
Set Set::operator+(Set s1) {
	Set set;
	for(int i=0; i<len; i++) {
		set.input(s[i]);
	}
	for(int j=0; j<s1.length(); j++) {
		set.input(s1.s[j]);
	}
	sort(set.s,set.s+set.length());
	//去掉相邻重复元素
	int n=unique(set.s,set.s+set.length())-set.s;//获取长度
	set.len=n;
	return set;
}

//集合的交
Set Set::operator*(Set s1) {
	Set set;
	for(int i=0; i<len; i++) {
		for(int j=0; j<s1.length(); j++) {
			if(equal(s[i],s1.s[j])) {
			set.input(s[i]);
			}
		}
	}

	return set;
}

//集合的差
Set Set::operator-(Set s1) { //前一个集合减后一个集合
	Set set;
	int flag2;
	for(int i=0; i<len; i++) {
		flag2=1;
		for(int j=0; j<s1.length(); j++) {
			if(equal(s[i],s1.s[j])) {
				flag2=0;
				break;
			}
		}
		if(flag2) { //说明不一样
			set.input(s[i]);
		}
	}
	return set;
}
Set Set::operator=(Set s1) {
	this->len=s1.len;
	for(int i=0; i<s1.len; i++){
		this->s[i]=s1.getd(i);
	}
	sort(this->s,this->s+this->length());
	return *this;
}
int main() {
//输入集合{954367} {2469}计算集合的并差和交运算
	int a1[]= {9,5,4,3,6,7};
	int a2[]= {2,4,6,9};
	Set s1(a1,6),s2(a2,4),s3;
	cout<<"集合s1:";s1.disp();
	cout<<"集合s2:";s2.disp();
	s3=s1+s2;
	cout<<"集合的并";s3.disp();
	s3=s1-s2;
	cout<<"集合的差";s3.disp();
	s3=s1*s2;
	cout<<"集合的交";	s3.disp();
	s3=s1;
	cout<<"将s1赋值给s3:";s3.disp();
	return 0;
}

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(1) 测试日期成员函数,在主函数中列出菜单选项,可以完成日期的加减比较等测试功能。 (2) 完善程序功能,在日期相加的菜单选项中增加日期加天数,结果为新日期;日期家月份,结果为新日期,要考虑闰年情况。 (3) 完善程序功能,在日期相减的菜单选项中增加日期减天数,结果为新日期;日期减月份,结果为新日期,要考虑闰年情况。 (4) 显示日期增加显示星期及英文形式的月份的功能。 (5) 增加输入的甄别功能,即输入非法数据(如负数、日期超过31天、时间超过24小等情况)的识别显示功能。 (1) 仿照日期编写时间CTime_t,可以完成时间的设置、运算、比较等功能。 (2) 增加时间的输入功能,既可以选择输入格式,可以输入hh:mm:ss格式的信息。 (3) 增加时间的输出格式,可以输出12小时间格式。 (4) 编写时间和日期的派生CDati,完成日期与时间的联合设置、运算、比较等功能,要求该派生可以完成:日期时间加天数或时间等于新的日期时间,日期时间减天数或等于新的日期时间,两个日期时间相减等于天数或时间等工作,在程序中考虑闰年等具体情况,并载各种运算符。 (5) 增加输入的甄别功能,即输入非法数据,即输入非法数据(如负数、日期超过31天、时间超过24小等情况)的识别显示功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值