实验九 运算符重载基础

A. 分数的加减乘除(运算符重载)

题目描述

Fraction类的基本形式如下:
在这里插入图片描述
要求如下

1.实现Fraction类;common_divisor()和contracted()函数体可为空,不实现具体功能。

2.编写main函数,初始化两个Fraction对象的,计算它们之间的加减乘除。

输入

第1行:依次输入第1个和第2个Fraction对象的分子和分母值。

输出

每行依次分别输出加减乘除计算后的Fraction对象(直接输出分数值,不需要约简)。

输入样例

1 3 2 5

输出样例

fraction=11/15
fraction=-1/15
fraction=2/15
fraction=5/6

参考代码

#include<iostream>
using namespace std;
class Fraction
{
	int numerator,denominator;
	int common_divisor(){}
	void contracted(){}
	public:
		Fraction(int a=0,int b=1):numerator(a),denominator(b){}
		Fraction(Fraction& p)//拷贝构造 
		{
			numerator=p.numerator;
			denominator=p.denominator;
		}
		//运算符重载
		Fraction operator+(Fraction f1);
		Fraction operator-(Fraction f1);
		Fraction operator*(Fraction f1);
		Fraction operator/(Fraction f1);
		//初始化
		void Set(int a=0,int b=1)
		{
			numerator=a;
			denominator=b;
		}
		void disp()
		{
			cout<<"fraction="<<numerator<<"/"<<denominator<<endl;
		 } 
};
Fraction Fraction::operator+(Fraction f1)
{
	Fraction temp;
	temp.numerator=numerator*f1.denominator+f1.numerator*denominator;
	temp.denominator=denominator*f1.denominator;
	return temp;
}
Fraction Fraction::operator-(Fraction f1)
{
	Fraction temp;
	temp.numerator=numerator*f1.denominator-f1.numerator*denominator;
	temp.denominator=denominator*f1.denominator;
	return temp;
}
Fraction Fraction::operator*(Fraction f1)
{
	Fraction temp;
	temp.numerator=numerator*f1.numerator;
	temp.denominator=denominator*f1.denominator;
	return temp;
}
Fraction Fraction::operator/(Fraction f1)
{
	Fraction temp;
	temp.numerator=numerator*f1.denominator;
	temp.denominator=denominator*f1.numerator;
	return temp;
}
int main()
{
	int n1,d1,n2,d2;
	cin>>n1>>d1>>n2>>d2;
	Fraction f1(n1,d1),f2(n2,d2);
	Fraction res;
	res=f1+f2;
	res.disp();
	res=f1-f2;
	res.disp();
	res=f1*f2;
	res.disp();
	res=f1/f2;
	res.disp();
}

B. 复数的加减乘运算(运算符重载)

题目描述

定义一个复数类,通过重载运算符:+、-、*,实现两个复数之间的各种运算。
在这里插入图片描述
要求如下

1.实现Complex类;

2.编写main函数,初始化两个Complex对象,计算它们之间的加减乘,并输出结果。

复数相乘的运算规则

设z1=a+bi,z2=c+di(a、b、c、d∈R)是任意两个复数,那么它们的积(a+bi)(c+di)=(ac-bd)+(bc+ad)i.

输入

第1行:输入两个数值,分别为第一个Complex对象的实部和虚部。

第2行:输入两个数值,分别为第二个Complex对象的实部和虚部。

输出

第1行:两个Complex对象相加后的输出结果。

第2行:两个Complex对象相减后的输出结果。

第3行:两个Complex对象相乘后的输出结果。

输入样例

10 20
50 40

输出样例

Real=60 Image=60
Real=-40 Image=-20
Real=-300 Image=1400

参考代码

#include<iostream>
using namespace std;
class Complex{
	float Real,Image;
	public:
		Complex(float x=0,float y=0):Real(x),Image(y){}
		friend Complex operator+(Complex& c1,Complex& c2);
		friend Complex operator-(Complex& c1,Complex& c2);
		friend Complex operator*(Complex& c1,Complex& c2);
		void show()
		{
			cout<<"Real="<<Real<<' '<<"Image="<<Image<<endl;
		}
};
Complex operator+(Complex& c1,Complex& c2)
{
	Complex temp;
	temp.Real=c1.Real+c2.Real;
	temp.Image=c1.Image+c2.Image;
	return temp;
}
Complex operator-(Complex& c1,Complex& c2)
{
	Complex temp;
	temp.Real=c1.Real-c2.Real;
	temp.Image=c1.Image-c2.Image;
	return temp;
}
Complex operator*(Complex& c1,Complex& c2)
{
	Complex temp;
	temp.Real=c1.Real*c2.Real-c1.Image*c2.Image;
	temp.Image=c1.Image*c2.Real+c1.Real*c2.Image;
	return temp;
}
int main()
{
	float r1,i1,r2,i2;
	cin>>r1>>i1>>r2>>i2;
	Complex c1(r1,i1),c2(r2,i2);
	Complex res;
	res=c1+c2;
	res.show();
	res=c1-c2;
	res.show();
	res=c1*c2;
	res.show();
	
}

C. 字符串的加减(运算符重载)

题目描述

定义一个字符串类str,该类中包含2个属性,字符串长度和一个char型指针保存字符串内容。增加以下运算符的重载:+、- 。+运算符表示把2个字符串拼接成一个字符串。-运算符表示例如a2-a1,则删除a2中出现的a1字符串。
在这里插入图片描述
要求如下

1.实现str类;

2.编写main函数,初始化2个str对象A、B,输出这2个对象相加后的对象C的结果信息。输出C与B之间相减后的结果信息。

(提示:strstr(char a,charb)可以从a字符串中查找出b首次出现的地址)

输入

第1行:输入一个字符串,初始化第一个str对象。

(提示:通过cin. getline(char *,int strCount)可以输入一个字符串到char数组中)

第2行:输入一个字符串,初始化第二个str对象。

输出

第1行:输出两个字符串相加后的长度和字符串。

第2行:输出两个字符串相减后的长度和字符串。

输入样例

i am a 
student!

输出样例

length=15 i am a student!
length=7 i am a 

参考代码

#include<iostream>
#include<cstring>
using namespace std;
class Str{
	int length;
	char *p;
	public:
		Str(){}
		Str(char *s)
		{
			p=new char[100];
			strcpy(p,s);
			length=strlen(s);
		}
		Str(const Str& obj)
		{
			p=new char[100];
			strcpy(p,obj.p);
			length=strlen(p);
		}
		~Str()
		{
			if(p!=NULL) delete []p;
		}
		friend Str operator+(const Str& s1,const Str& s2);
		friend Str operator-(const Str& s1,const Str& s2);
		void operator=(const Str& obj)
		{
			p=new char[obj.length+1];
			length=obj.length;
			strcpy(p,obj.p);
		}
		void show()
		{
			cout<<"length="<<length<<' '<<p<<endl;
		}
};
Str operator+(const Str& s1,const Str& s2)
{
	Str temp;
	
	temp.length=s1.length+s2.length;
	temp.p=new char[temp.length+1];
	strcat(s1.p,s2.p);
	strcpy(temp.p,s1.p);
	return temp;
}
Str operator-(const Str& s1,const Str& s2)
{
	Str temp;
	temp.p=new char[100];
	temp.length=s1.length-s2.length;
	strcpy(temp.p,s1.p);
	*(strstr(temp.p,s2.p))='\0';
	//cout<<"length="<<temp.length<<' '<<temp.p<<endl;
	return temp;
}
int main()
{
	char st1[100],st2[100];
	cin.getline(st1,100);
	Str s1(st1);
	cin.getline(st2,100);
	Str s2(st2);
	Str c(s1+s2);
	c.show();
	Str d(c-s2);
	d.show();
}

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

题目描述

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

输入

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

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

输出

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

输入样例

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

输出样例

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

参考代码

#include<iostream>
#include<stdlib.h>
using namespace std;
class Student{
	string name;
	int y,m,d,totald;
	public:
		Student(){}
		Student(string n,int y1,int m1,int d1):name(n),y(y1),m(m1),d(d1){}
		void set(string n,int y1,int m1,int d1)
		{
			name=n;
			y=y1;
			m=m1;
			d=d1;
		}
		friend int operator-(Student &s1,Student &s2);
		bool isleap()
		{
			if(y%4==0&&y%100!=0||y%400==0) return true;
			else return false;	
		}
		int totalday();//总天数 
		friend void max(Student *p,int n);
};
bool leap(int ye)
{
	if(ye%4==0&&ye%100!=0||ye%400==0) return true;
	else return false;	
}
int Student::totalday()
{
	totald=0;
	int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	if(isleap()) mon[2]=29;
	for(int i=1;i<m;i++)
	{
		totald+=mon[i];
	}
	totald+=d;
	return totald;
}
int operator-(Student &s1,Student &s2)
{
	int temp=0,tag=0;
	int temp_y=0,temp_m=0; 
	if(s1.y>s2.y) 
	{
		for(int i=s2.y+1;i<s1.y;i++)//计算相差年份的天数 
		{
			if(leap(i)) temp+=366;
			else temp+=365; 
		}
		if(s2.isleap()) tag=366;
		else tag=365;
		temp=temp+s1.totalday()+(tag-s2.totalday());
		return temp;
	}
	else if(s1.y==s2.y) 
	{
		temp=abs(s1.totalday()-s2.totalday());
		return temp;
	}
	else 
	{
		for(int i=s1.y+1;i<s2.y;i++)//计算相差年份的天数 
		{
			if(leap(i)) temp+=366;
			else temp+=365; 
		}
		if(s1.isleap()) tag=366;
		else tag=365;
		temp=temp+s2.totalday()+(tag-s1.totalday());
		return temp;
	}
}
void max(Student *pa,int n)
{
	int max=0;
	string name1,name2;
	for(int i=0;i<n-1;i++)//找最大值 
	{
		for(int j=i+1;j<n;j++)
		{
			if(max<(pa[i]-pa[j])) 
			{
				max=pa[i]-pa[j];
				name1=pa[i].name;
				name2=pa[j].name;
			}
		}
	}
	cout<<name1<<"和"<<name2<<"年龄相差最大,为"<<max<<"天。"<<endl;
}
int main()
{
	int t;
	cin>>t;
	Student *p=new Student[t];
	string n1;
	int y1,m1,d1;
	for(int i=0;i<t;i++)
	{
		cin>>n1>>y1>>m1>>d1;
		p[i].set(n1,y1,m1,d1);
	}
	max(p,t);
	delete []p;
	return 0; 
	
}

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

题目描述

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

输入

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

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

输出

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

输入样例

3
13
2
21

输出样例

102

参考代码

#include<iostream>
#include<cmath>
using namespace std;
class Fourth{
	int num;
	public:
		Fourth(){num=0;}
		Fourth(int a):num(a){}
		void set(int a)
		{
			num=a;
		}
		Fourth operator+(const Fourth &a)
		{
			Fourth res;
			int sum=0,count=0,i;
			sum=num+a.num;
			int temp=sum; 
			//判断加完的数为几位数
			while(temp)
			{
				
				count++;
				temp/=10;
			}
			for(i=0;i<count;i++)
			{//最后一位数大于等于4,需进位 
				int flag=sum%10;
				res.num+=(sum%10%4)*pow(10,i);
				if(sum%10>=4)
				{
					
					sum/=10;
					sum=sum+flag/4;//进位 
				}
				else 
				{
					sum/=10;
				}
			}
			if(sum!=0) res.num+=(sum%10%4)*pow(10,i);
			return res;
		}
		void show()
		{
			cout<<num<<endl;
		}
		
};
int main()
{
	int n,a;
	cin>>n;
	Fourth *p=new Fourth[n];
	Fourth result;
	for(int i=0;i<n;i++)
	{
		cin>>a;
		p[i].set(a);
	} 
	for(int i=0;i<n;i++)
	{
		result=result+p[i];
	}
	result.show();
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值