实验12 运算符重载.docx
《实验12 运算符重载.docx》由会员分享,可在线阅读,更多相关《实验12 运算符重载.docx(31页珍藏版)》请在冰豆网上搜索。
实验12运算符重载
实验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++编译器对于重载输入/出运算符为友元的兼容性都存在问题,最好重载输入/出运算符不声明为成员函数与友元函数,而声明一般函数,为编程更方便,可增加一些成员函数,比如:
voidSetYear(inty);//设置年
intSetMonth(intm);//设置月
intSetDay(intd);//设置日
intGetYear()const;//返回年
intGetMonth()const;//返回月
intGetDay()const;//返回日
staticintIsLeapyear(inty);//判断年份y是否为润年
staticintGetDays(inty);//年份y的天数
staticintGetDays(constDate&d);//日期d当前月份的天数
staticintDateToNum(constDate&d);//返回从公元1年1月1日起的天数
staticDateNumToDate(intn);//由从公元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
为编程更方便,可增加一些成员函数,比如:
voidSetHour(inthh);//设置小时
voidSetMinute(intmm);//设置分钟
voidSetSecond(intss);//设置秒
intGetHour()const;//返回小时
intGetMinute()const;//返回分钟
intGetSecond()const;//返回秒
3、实验程序及结果
1、
#include
usingnamespacestd;
classchessBoard
{
private:
inta[2][2];
public:
chessBoard(inty,intb,intc,intd)
{
a[0][0]=y;
a[0][1]=b;
a[1][0]=c;
a[1][1]=d;
}
int&operator()(intb,intc);
};
int&chessBoard:
:
operator()(intb,intc)
{
returna[b][c];
}
intmain()
{
chessBoardv(1,2,3,4);
v(0,1)=v(1,0);
cout<return0;
}
2、
#include
classxiabiao
{
public:
xiabiao()//构造函数赋予数组初值
{
for(inti=0;i<10;i++)
if(i>5)
jihe[i]=(-1)*2*i;
else
jihe[i]=i+3;
cout<<"所有元素:
"<for(i=9;i>=0;i--)
cout<}
int&operator[](inta)
{
intt;
for(inti=0;i<10;i++)//冒泡排序大的放前面
for(intj=0;j<9-i;j++)
{
if(jihe[j]{
t=jihe[j];
jihe[j]=jihe[j+1];
jihe[j+1]=t;
}
}
returnjihe[a-1];
}
private:
intjihe[10];
};
intmain()
{
xiabiaoxi;
cout<<"最大的为:
"<cout<<"第二的为:
"<cout<<"第三的为:
"<return0;
}
3、
#include
#include
classPolynomial
{
public:
Polynomial();
Polynomialoperator+(constPolynomial&)const;
Polynomialoperator-(constPolynomial&)const;
Polynomialoperator*(constPolynomial&);
Polynomial&operator+=(constPolynomial&);
Polynomial&operator-=(constPolynomial&);
Polynomial&operator*=(constPolynomial&);
voidEnterTerms();//输入函数
voidPrintPolynomial()const;//打印函数
private:
intexponents[100];
intcoefficients[100];
voidpolynomialCombine(Polynomial&);//合并同类项
};
Polynomial:
:
Polynomial()
{
for(inti=0;i<100;i++)//置零
{
coefficients[i]=0;
exponents[i]=0;
}
}
voidPolynomial:
:
PrintPolynomial()const//输出函数
{
intstart;//输出累加系数
boolzero=false;
if(coefficients[0])//常数存在
{
cout<start=1;
zero=true;
}
else
{
if(coefficients[1])
{
cout<if((exponents[1]!
=0)&&(exponents[1]!
=1))
cout<<'^'<zero=true;
}
start=2;
}
for(intx=start;x<100;x++)//输出其他各项
if(coefficients[x]!
=0)
{
cout<:
showpos)<<:
showpos)<<'x';
if((exponents[x]!
=0)&&(exponents[x]!
=1))
cout<<'^'<zero=true;
}
if(!
zero)//多项式为空
cout<<'0';
cout<}
PolynomialPolynomial:
:
operator+(constPolynomial&r)const
{
Polynomialtemp;
boolexponentExists;
temp.coefficients[0]=coefficients[0]+r.coefficients[0];//计算常量之和
for(ints=1;(s<100)&&(r.exponents[s]!
=0);s++)
{
temp.coefficients[s]=r.coefficients[s];
temp.exponents[s]=r.exponents[s];
}
for(intx=1;x<100;x++)//计算其他各项之和
{
exponentExists=false;
for(intt=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++;
}
}
returntemp;
}
Polynomial&Polynomial:
:
operator+=(constPolynomial&r)
{
*this=*this+r;
return*this;
}
PolynomialPolynomial:
:
operator-(constPolynomial&r)const
{
Polynomialtemp;
boolexponentExists;
temp.coefficients[0]=coefficients[0]-r.coefficients[0];
for(ints=1;(s<100)&&(exponents[s]!
=0);s++)
{
temp.coefficients[s]=coefficients[s];
temp.exponents[s]=exponents[s];
}
for(intx=1;x<100;x++)
{
exponentExists=false;
for(intt=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++;
}
}
returntemp;
}
Polynomial&Polynomial:
:
operator-=(constPolynomial&r)
{
*this=*this-r;
return*this;
}
PolynomialPolynomial:
:
operator*(constPolynomial&r)
{
Polynomialtemp;
ints=1;
for(intx=0;(x<100)&&(x==0||coefficients[x]!
=0);x++)
for(inty=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);//合并同类项
returntemp;
}
voidPolynomial:
:
polynomialCombine(Polynomial&w)
{
Polynomialtemp=w;
intexp;
for(intx=0;x<100;x++)
{
w.coefficients[x]=0;
w.exponents[x]=0;
}
for(x=1;x<100;x++)
{
exp=temp.exponents[x];
for(inty=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*=(constPolynomial&r)
{
*this=*this*r;
return*this;
}
voidPolynomial:
:
EnterTerms()//初始函数
{
boolfound=false;
intnumberOfTerms,c,e;
cout<<"Enternumberofpolynomialterms:
";
cin>>numberOfTerms;
for(intn=1;n<=numberOfTerms;n++)
{
cout<<"Entercoefficient:
";//系数
cin>>c;
cout<<"Enterexponent:
";//阶数
cin>>e;
if(c!
=0)
{
if(e==0)//初始置零
{
coefficients[0]+=c;//常数
continue;
}
for(intterm=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;
}
}
}
}
voidmain()
{
Polynomiala,b,c,t,d;
a.EnterTerms();
b.EnterTerms();
cout<";
a.PrintPolynomial();
cout<";
b.PrintPolynomial();
cout<";
c=a+b;
c.PrintPolynomial();
cout<";
t=a;
a+=b;
a.PrintPolynomial();
cout<";
a=t;
c=a-b;
c.PrintPolynomial();
cout<";
a-=b;
a.PrintPolynomial();
cout<";
a=t;
c=a*b;
c.PrintPolynomial();
cout<";
a*=b;
a.PrintPolynomial();
cout<}
4、
#include"iostream.h"
classDate
{
public:
Date(inta=0,intb=0,intc=0);
voidSet_Date(inta,intb,intc);
voidGet_Date();
Dateoperator+(int);
Dateoperator-(int);
friendostream&operator<<(ostream&,Date&);
friendistream&operator>>(istream&,Date&);
private:
intyear,mounth,date,m;
};
Date:
:
Date(inta,intb,intc)
{
year=a;
mounth=b;
date=c;
m=1;
}
voidDate:
:
Set_Date(inta,intb,intc)
{
year=a;
mounth=b;
date=c;
}
voidDate:
:
Get_Date()
{
if(m==1)
cout<else
cout<<"刚才输入的天数不符合要求!
"<}
DateDate:
:
operator+(inta)
{
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++;