实验12 运算符重载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验12 运算符重载(2)
牛旭艳智能二班 20110807201
一、实验目的
1、进一步理解运算符重载,运用成员函数和友元函数等方法实现运算符的重载。
二、实验内容
1、重载函数调用运算符(),将以下的二维数组的下标表示方法:
chessBoard[row][column]改为常用的表示方法:
chessBoard(row,column)
2、重载下标运算符使之返回集合中最大的元素、次最大的元素以及第三大的元素。
3、开发多项式类Polynomial,多项式的每一项用数组表示,每项包含一个系数和一个指数。
例如:2x4的指数为4,系数为2。
请开发一个完整的Polynomial类,包括构造函数、析构函数以及"get"函数和"set"函数。
该类还要提供下述重载的运算符(分别使用成员函数和友元函数):
1)重载加法运算符+,将两个多项式相加;
2)重载减法运算符-,将两个多项式相减;
3)重载赋值运算符=,将一个多项式赋给另外一个多项式;
4)重载乘法算符*,将两个多项式相乘;
5)重载加法赋值运算符+=、减法赋值运算符-=以及乘法赋值运算符*=。
4.设计一个日期类Date,,要求:
(1)包含年(year)、月(month)和日(day)私有数据成员。
(2)包含构造函数,重载关于一日期加上天数的加法运算符+、重载关于一日期减去天数的减加运算符-、重载输出运算符<<与输入运算符>>等。
提示:由于各C++编译器对于重载输入/出运算符为友元的兼容性都存在问题,最好重载输入/出运算符不声明为成员函数与友元函数,而声明一般函数,为编程更方便,可增加一些成员函数,比如:
void SetYear(int y); // 设置年
int SetMonth(int m); // 设置月
int SetDay(int d); // 设置日
int GetYear() const; // 返回年
int GetMonth() const; // 返回月
int GetDay() const; // 返回日
static int IsLeapyear(int y); // 判断年份y是否为润年
static int GetDays(int y); // 年份y的天数
static int GetDays(const Date &d); // 日期d当前月份的天数
static int DateToNum(const Date &d); // 返回从公元1年1月1日起的天数
static Date NumToDate(int n); //由从公元1年1月1日起的天数返回日期
润年条件:年份能被4整除,并且年份不能被100整除,或者年份能被400整除
润年天数:366
平年天数:365
润年2月份天数:29
平年2月份天数:28
5.设计一个时间类Time,要求:
(1)包含时(hour)、分(minute)和秒(second)私有数据成员。
(2)包含构造函数,重载关于一时间加上另一时间的加法运算符+、重载关于一时间减去另一时间的减加运算符-、重载输出运算符<<与输入运算符>>等。
提示:可仿照第4题编程实现,可将时间转换成秒数,将秒数转成时间进行辅助编程。
时间转换成秒数:
秒数= 时* 3600 + 分* 60 + 秒
秒数转换成时间:
时= 秒数/ 3600
分= (秒数- 时* 3600) / 60
秒= 秒数% 60
为编程更方便,可增加一些成员函数,比如:
void SetHour(int hh); // 设置小时
void SetMinute(int mm); // 设置分钟
void SetSecond(int ss); // 设置秒
int GetHour() const; // 返回小时
int GetMinute() const; // 返回分钟
int GetSecond() const; // 返回秒
三、实验程序及结果
1、
#include<iostream>
using namespace std;
class chessBoard
{
private:
int a[2][2];
public:
chessBoard(int y,int b,int c,int d)
{
a[0][0]=y;
a[0][1]=b;
a[1][0]=c;
a[1][1]=d;
}
int & operator()(int b,int c);
};
int & chessBoard::operator()(int b,int c) {
return a[b][c];
}
int main()
{
chessBoard v(1,2,3,4);
v(0,1)=v(1,0);
cout<<v(0,1)<<endl;
return 0;
}
2、
#include<iostream.h>
class xiabiao
{
public:
xiabiao()//构造函数赋予数组初值
{
for(int i = 0;i < 10;i++)
if(i>5)
jihe[i] =(-1)* 2 * i;
else
jihe[i] =i + 3;
cout<<"所有元素:"<<endl;
for(i = 9;i >= 0;i--)
cout<<jihe[i]<<"\t";
}
int & operator[](int a)
{
int t;
for(int i = 0;i < 10;i++)//冒泡排序大的放前面for(int j = 0;j < 9-i;j++)
{
if(jihe[j]<jihe[j+1])
{
t = jihe[j];
jihe[j] = jihe[j+1];
jihe[j+1] = t;
}
}
return jihe[a-1];
}
private:
int jihe[10];
};
int main()
{
xiabiao xi;
cout<<"最大的为:"<<xi[1]<<endl;
cout<<"第二的为:"<<xi[2]<<endl;
cout<<"第三的为:"<<xi[3]<<endl;
return 0;
}
3、
#include <iostream.h>
#include <iomanip.h>
class Polynomial
{
public:
Polynomial();
Polynomial operator+(const Polynomial&)const;
Polynomial operator-(const Polynomial&)const;
Polynomial operator*(const Polynomial&);
Polynomial& operator+=(const Polynomial&);
Polynomial& operator-=(const Polynomial&);
Polynomial& operator*=(const Polynomial&);
void EnterTerms();//输入函数
void PrintPolynomial( )const;//打印函数
private:
int exponents[100];
int coefficients[100];
void polynomialCombine(Polynomial&);//合并同类项};
Polynomial::Polynomial()
{
for(int i=0;i<100;i++)//置零
{
coefficients[i]=0;
exponents[i]=0;
}
}
void Polynomial::PrintPolynomial() const//输出函数{
int start;//输出累加系数
bool zero=false;
if(coefficients[0])//常数存在
{
cout<<coefficients[0];
start=1;
zero=true;
}
else
{
if(coefficients[1])
{
cout<<coefficients[1]<<'x'; //常量不存在,输出指数为1的项
if((exponents[1]!=0)&&(exponents[1]!=1))
cout<<'^'<<exponents[1];
zero=true;
}
start=2;
}
for(int x=start;x<100;x++) //输出其他各项
if(coefficients[x]!=0)
{
cout<<setiosflags(ios::showpos)<<coefficients[x]
<<resetiosflags(ios::showpos)<<'x';
if((exponents[x]!=0)&&(exponents[x]!=1))
cout<<'^'<<exponents[x];
zero=true;
}
if(!zero) //多项式为空
cout<<'0';
cout<<endl;
}
Polynomial Polynomial::operator+(const Polynomial& r) const
{
Polynomial temp;
bool exponentExists;
temp.coefficients[0]=coefficients[0]+r.coefficients[0]; //计算常量之和for(int s=1;(s<100)&&(r.exponents[s]!=0);s++)
{
temp.coefficients[s]=r.coefficients[s];
temp.exponents[s]=r.exponents[s];
}
for(int x=1;x<100;x++) //计算其他各项之和
{
exponentExists=false;
for(int t=1;(t<100)&&(!exponentExists);t++)
if(exponents[x]==temp.exponents[t])
{
temp.coefficients[t]+=coefficients[x];
exponentExists=true;
}
if(!exponentExists)
{
temp.exponents[s]=exponents[x];
temp.coefficients[s]+=coefficients[x];
s++;
}
}
return temp;
}
Polynomial &Polynomial::operator+=(const Polynomial &r)
{
*this=*this+r;
return *this;
}
Polynomial Polynomial::operator-(const Polynomial &r)const
{
Polynomial temp;
bool exponentExists;
temp.coefficients[0]=coefficients[0]-r.coefficients[0];
for(int s=1;(s<100)&&(exponents[s]!=0);s++)
{
temp.coefficients[s]=coefficients[s];
temp.exponents[s]=exponents[s];
}
for(int x=1;x<100;x++)
{
exponentExists=false;
for(int t=1;(t<100)&&(!exponentExists);t++)
if(r.exponents[x]==temp.exponents[t])
{
temp.coefficients[t]-=r.coefficients[x];
exponentExists=true;
}
if(!exponentExists)
{
temp.exponents[s]=r.exponents[x];
temp.coefficients[s]-=r.coefficients[x];
s++;
}
}
return temp;
}
Polynomial &Polynomial::operator-=(const Polynomial& r) {
*this=*this-r;
return *this;
}
Polynomial Polynomial::operator*(const Polynomial& r)
{
Polynomial temp;
int s=1;
for(int x=0;(x<100)&&(x==0||coefficients[x]!=0);x++)
for(int y=0;(y<100)&&(y==0||r.coefficients[y]!=0);y++)
if(coefficients[x]*r.coefficients[y])
if((exponents[x]==0)&&(r.exponents[y]==0))
temp.coefficients[0]+=coefficients[x]*r.coefficients[y];
else
{
temp.coefficients[s]= coefficients[x]*r.coefficients[y];
temp.exponents[s]=exponents[x]+r.exponents[y];
s++;
}
polynomialCombine(temp); //合并同类项
return temp;
}
void Polynomial::polynomialCombine(Polynomial& w)
{
Polynomial temp=w;
int exp;
for(int x=0;x<100;x++)
{
w.coefficients[x]=0;
w.exponents[x]=0;
}
for(x=1;x<100;x++)
{
exp=temp.exponents[x];
for(int y=x+1;y<100;y++)
if(exp==temp.exponents[y])
{
temp.coefficients[x]+=temp.coefficients[y];
temp.exponents[y]=0;
temp.coefficients[y]=0;
}
}
w=temp;
}
Polynomial &Polynomial::operator*=(const Polynomial& r) {
*this=*this*r;
return *this;
}
void Polynomial::EnterTerms()//初始函数
{
bool found=false;
int numberOfTerms,c,e;
cout<<"Enter number of polynomial terms:";
cin>>numberOfTerms;
for(int n=1;n<=numberOfTerms;n++)
{
cout<<"Enter coefficient:";//系数
cin>>c;
cout<<"Enter exponent:";//阶数
cin>>e;
if(c!=0)
{
if(e==0)//初始置零
{
coefficients[0]+=c;//常数
continue;
}
for(int term=1;(term<100)&&(coefficients[term]!=0);term++)//找是否阶数相同
if(e==exponents[term])
{
coefficients[term]+=c;
exponents[term]=e;
found=true;
}
if(!found)//阶数不同另外储存
{
coefficients[term]+=c;
exponents[term]=e;
}
}
}
}
void main()
{
Polynomial a,b,c,t,d;
a.EnterTerms();
b.EnterTerms();
cout<<endl<<"First polynomial is:";
a.PrintPolynomial();
cout<<endl<<"Second polynomial is:";
b.PrintPolynomial();
cout<<endl<<"Adding the polynomials yields:";
c=a+b;
c.PrintPolynomial();
cout<<endl<<"+=the polynomials yields:";
t=a;
a+=b;
a.PrintPolynomial();
cout<<endl<<"Subtracting the polynomials yields:";
a=t;
c=a-b;
c.PrintPolynomial();
cout<<endl<<"-=the polynomials yields:";
a-=b;
a.PrintPolynomial();
cout<<endl<<"Multiplying the polynomials yields:";
a=t;
c=a*b;
c.PrintPolynomial();
cout<<endl<<"*=the polynomials yields:";
a*=b;
a.PrintPolynomial();
cout<<endl;
}
4、
#include"iostream.h"
class Date
{
public:
Date(int a=0,int b=0,int c=0);
void Set_Date(int a,int b,int c);
void Get_Date();
Date operator+(int);
Date operator-(int);
friend ostream& operator<<(ostream&, Date&);
friend istream& operator>>(istream&, Date&); private:
int year,mounth,date,m;
};
Date::Date(int a,int b,int c)
{
year=a;
mounth=b;
date=c;
m=1;
}
void Date::Set_Date(int a,int b,int c)
{
year=a;
mounth=b;
date=c;
}
void Date::Get_Date()
{
if(m==1)
cout<<year<<"年"<<mounth<<"月"<<date<<"日"<<endl;
else
cout<<"刚才输入的天数不符合要求!"<<endl;
}
Date Date::operator+(int a)
{
if(a>28)
{
m=0;
return *this;
}
else
{
if((year%400==0)||((year%4==0)&&(year%100!=0)))
{
if((mounth==4)||(mounth==6)||(mounth==9)||(mounth==11))
{
if((date+a)<=30)
date=date+a;
else
{
date=date+a-30;
mounth++;
}
}
else
{
if(mounth==2)
{
if((date+a)<=29)
date=date+a;
else
{
date=date+a;
mounth++;
}
}
else
{
if((date+a)<=31)
date=date+a;
else
{
date=date+a-31;
if(mounth==12)
{
year++;
mounth=1;
}
else
mounth++;
}
}
}
}
else
{
if((mounth==4)||(mounth==6)||(mounth==9)||(mounth==11)) {
if((date+a)<=30)
date=date+a;
else
{
date=date+a-30;
mounth++;
}
}
else
{
if(mounth==2)
{
if((date+a)<=28)
date=date+a;
else
{
date=date+a-28;
mounth++;
}
}
else
{
if((date+a)<=31)
date=date+a;
else
{
date=date+a-31;
if(mounth==12)
{
year++;
mounth=1;
}
else
mounth++;
}
}
}
}
return *this;
}
}
Date Date::operator-(int a)
{
if(a>28)
{
m=0;
return *this;
}
else
{
if((year%400==0)||((year%4==0)&&(year%100!=0)))
{
if((mounth==5)||(mounth==7)||(mounth==10)||(mounth==12))
{
if(date>=a)
date=date-a;
else
{
date=date-a+30;
mounth--;
}
}
else
{
if(mounth==3)
{
if(date>=a)
date=date-a;
else
{
date=date-a+29;
mounth--;
}
}
else
{
if(date>=a)
date=date-a;
else
{
date=date-a+31;
if(mounth==1)
{
year--;
mounth=12;
}
else
mounth--;
}
}
}
}
else
{
if((mounth==5)||(mounth==7)||(mounth==10)||(mounth==12)) {
if(date>=a)
date=date-a;
else
{
date=date-a+30;
mounth--;
}
}
else
{
if(mounth==3)
{
if(date>=a)
date=date-a;
else
{
date=date-a+28;
mounth--;
}
}
else
{
if(date>=a)
date=date-a;
else
{
date=date-a+31;
if(mounth==1)
{
year--;
mounth=12;
}
else
mounth--;
}
}
}
}
return *this;
}
}
ostream& operator<<(ostream& output,Date &a)
{
cout<<a.year<<"年"<<a.mounth<<"月"<<a.date<<"日"<<endl;
return output;
}
istream& operator>>(istream& input,Date &a)
{
cout<<"年: ";
cin>>a.year;
cout<<"月: ";
cin>>a.mounth;
cout<<"日: ";
cin>>a.date;
return input;
}
int main()
{
Date a,b;
int x,y,z;
cout<<"请输入第一个日期:"<<endl;
cout<<"年: ";
cin>>x;
cout<<"月 :";
cin>>y;
cout<<"日: ";
cin>>z;
a.Set_Date(x,y,z);
cout<<"请输入第二个日期:"<<endl;
cin>>b;
cout<<"请输入需要加上的天数:"<<endl;
cin>>z;
a=a+z;
cout<<"日期"<<a<<"加上"<<z<<"天"<<"得到的日期为:"<<endl;
a.Get_Date();
cout<<"请输入需要减去的天数:"<<endl;
cin>>z;
a=a-z;
cout<<"日期"<<a<<"减去"<<z<<"天"<<"得到的日期为:"<<endl;
a.Get_Date();
return 0;
}
5、
#include"iostream.h"
class Time
{
public:
Time();
void Set_Time(int a,int b,int c);
void Get_Time();
Time operator+(Time &);
Time operator-(Time &);
friend ostream& operator<<(ostream&,Time &);
friend istream& operator>>(istream&,Time &);
private:
int hour,minute,second;
};
Time::Time()
{
hour=0;
second=0;
minute=0;
}
void Time::Set_Time(int a,int b,int c)
{
hour=a;
minute=b;
second=c;
}
void Time::Get_Time()
{
cout<<hour<<"小时"<<minute<<"分钟"<<second<<"秒"<<endl; }
Time Time::operator+(Time &a)
{
int i=0,j=0;
if((second+a.second)<60)
second=second+a.second;
else
{
second=second+a.second-60;
i=1;
}
if(minute+a.minute+i<60)
minute=minute+a.minute+i;
else
{
minute=minute+a.minute+i-60;
j=1;
}
hour=hour+a.hour+j;
return *this;
}
Time Time::operator-(Time &a)
{
int i=0,j=0;
if(second>=a.second)
second=second-a.second;
else
{
second=second-a.second+60;
i=1;
}
if(minute>=(a.minute+i))
minute=minute-a.minute-i;
else
{
minute=minute-a.minute-i+60;
j=1;
}
hour=hour-a.hour-j;
return *this;
}
ostream& operator<<(ostream&output,Time&a)
{
cout<<a.hour<<"小时"<<a.minute<<"分钟"<<a.second<<"秒"<<endl;
return output;
}
istream& operator>>(istream&input,Time&a)
{
cout<<"小时: ";
cin>>a.hour;
cout<<"分钟: ";
cin>>a.minute;
cout<<"秒: ";
cin>>a.second;
return input;
}
int main()
{
Time a,b,c;
int x,y,z;
cout<<"输入第一个时间:"<<endl;
cout<<"小时: ";
cin>>x;
cout<<"分钟: ";
cin>>y;
cout<<"秒: ";
cin>>z;
a.Set_Time(x,y,z);
cout<<"输入第二个时间:"<<endl;
cin>>b;
c=a+b;
cout<<"第一个时间"<<a<<"加上第二个时间"<<b<<"得到的时间是:"<<c<<endl;
c=a-b;
cout<<"第一个时间"<<a<<"减去第二个时间"<<b<<"得到的时间是:"<<c<<endl;
return 0;
}。