实验九 运算符重载基础
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();
}