1、实验12 运算符重载实验12 运算符重载(2)牛旭艳 智能二班 20110807201一、实验目的1、进一步理解运算符重载,运用成员函数和友元函数等方法实现运算符的重载。二、实验内容1、重载函数调用运算符(),将以下的二维数组的下标表示方法:chessBoardrowcolumn改为常用的表示方法:chessBoard(row,column)2、重载下标运算符使之返回集合中最大的元素、次最大的元素以及第三大的元素。3、开发多项式类Polynomial,多项式的每一项用数组表示,每项包含一个系数和一个指数。例如:2x4的指数为4,系数为2。请开发一个完整的Polynomial类,包括构造函数、析
2、构函数以及get函数和set函数。该类还要提供下述重载的运算符(分别使用成员函数和友元函数):1)重载加法运算符+,将两个多项式相加;2)重载减法运算符-,将两个多项式相减;3)重载赋值运算符=,将一个多项式赋给另外一个多项式;4)重载乘法算符*,将两个多项式相乘;5)重载加法赋值运算符+=、减法赋值运算符-=以及乘法赋值运算符*=。4设计一个日期类Date,,要求:(1)包含年(year)、月(month)和日(day)私有数据成员。(2)包含构造函数,重载关于一日期加上天数的加法运算符+、重载关于一日期减去天数的减加运算符-、重载输出运算符等。提示:由于各C+编译器对于重载输入/出运算符为
3、友元的兼容性都存在问题,最好重载输入/出运算符不声明为成员函数与友元函数,而声明一般函数,为编程更方便,可增加一些成员函数,比如: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的天数
4、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月份天数:285设计一个时间类Time,要求:(1)包含时(hour)、分(minute)和秒(second)私有数据成员。(2)包含构造函数,重载关于一时间加上另一时
5、间的加法运算符+、重载关于一时间减去另一时间的减加运算符-、重载输出运算符等。提示:可仿照第4题编程实现,可将时间转换成秒数,将秒数转成时间进行辅助编程。时间转换成秒数:秒数 = 时 * 3600 + 分 * 60 + 秒秒数转换成时间:时 = 秒数 / 3600分 = (秒数 - 时 * 3600) / 60秒 = 秒数 % 60为编程更方便,可增加一些成员函数,比如:void SetHour(int hh); / 设置小时 void SetMinute(int mm); / 设置分钟 void SetSecond(int ss); / 设置秒 int GetHour() const; /
6、返回小时 int GetMinute() const; / 返回分钟 int GetSecond() const; / 返回秒3、实验程序及结果1、#includeusing namespace std;class chessBoardprivate: int a22;public: chessBoard(int y,int b,int c,int d) a00=y; a01=b; a10=c; a11=d; int & operator()(int b,int c);int & chessBoard:operator()(int b,int c) return abc;int main()
7、chessBoard v(1,2,3,4); v(0,1)=v(1,0); coutv(0,1)endl; return 0;2、#includeclass xiabiaopublic: xiabiao()/构造函数赋予数组初值 for(int i = 0;i 5) jihei =(-1)* 2 * i; else jihei =i + 3; cout所有元素:= 0;i-) coutjiheit; int & operator(int a) int t; for(int i = 0;i 10;i+)/冒泡排序 大的放前面 for(int j = 0;j 9-i;j+) if(jihejjih
8、ej+1) t = jihej; jihej = jihej+1; jihej+1 = t; return jihea-1; private: int jihe10;int main() xiabiao xi; cout最大的为:xi1endl; cout第二的为:xi2endl; cout第三的为:xi3endl; return 0;3、#include #include class Polynomialpublic: Polynomial(); Polynomial operator+(const Polynomial&)const; Polynomial operator-(const
9、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 exponents100; int coefficients100; void
10、polynomialCombine(Polynomial&);/合并同类项;Polynomial:Polynomial() for(int i=0;i100;i+)/置零 coefficientsi=0; exponentsi=0; void Polynomial:PrintPolynomial() const/输出函数 int start;/输出累加系数 bool zero=false; if(coefficients0)/常数存在 coutcoefficients0; start=1; zero=true; else if(coefficients1) coutcoefficients1x
11、; /常量不存在,输出指数为1的项 if(exponents1!=0)&(exponents1!=1) coutexponents1; zero=true; start=2; for(int x=start;x100;x+) /输出其他各项 if(coefficientsx!=0) coutsetiosflags(ios:showpos)coefficientsx resetiosflags(ios:showpos)x; if(exponentsx!=0)&(exponentsx!=1) coutexponentsx; zero=true; if(!zero) /多项式为空 cout0; co
12、utendl;Polynomial Polynomial:operator+(const Polynomial& r) const Polynomial temp; bool exponentExists; temp.coefficients0=coefficients0+r.coefficients0; /计算常量之和 for(int s=1;(s100)&(r.exponentss!=0);s+) temp.coefficientss=r.coefficientss; temp.exponentss=r.exponentss; for(int x=1;x100;x+) /计算其他各项之和
13、exponentExists=false; for(int t=1;(t100)&(!exponentExists);t+) if(exponentsx=temp.exponentst) temp.coefficientst+=coefficientsx; exponentExists=true; if(!exponentExists) temp.exponentss=exponentsx; temp.coefficientss+=coefficientsx; s+; return temp;Polynomial &Polynomial:operator+=(const Polynomial
14、&r) *this=*this+r; return *this;Polynomial Polynomial:operator-(const Polynomial &r)const Polynomial temp; bool exponentExists; temp.coefficients0=coefficients0-r.coefficients0; for(int s=1;(s100)&(exponentss!=0);s+) temp.coefficientss=coefficientss; temp.exponentss=exponentss; for(int x=1;x100;x+)
15、exponentExists=false; for(int t=1;(t100)&(!exponentExists);t+) if(r.exponentsx=temp.exponentst) temp.coefficientst-=r.coefficientsx; exponentExists=true; if(!exponentExists) temp.exponentss=r.exponentsx; temp.coefficientss-=r.coefficientsx; s+; return temp;Polynomial &Polynomial:operator-=(const Pol
16、ynomial& r) *this=*this-r; return *this;Polynomial Polynomial:operator*(const Polynomial& r) Polynomial temp; int s=1; for(int x=0;(x100)&(x=0|coefficientsx!=0);x+) for(int y=0;(y100)&(y=0|r.coefficientsy!=0);y+) if(coefficientsx*r.coefficientsy) if(exponentsx=0)&(r.exponentsy=0) temp.coefficients0+
17、=coefficientsx*r.coefficientsy; else temp.coefficientss= coefficientsx*r.coefficientsy; temp.exponentss=exponentsx+r.exponentsy; s+; polynomialCombine(temp); /合并同类项 return temp;void Polynomial:polynomialCombine(Polynomial& w) Polynomial temp=w; int exp; for(int x=0;x100;x+) w.coefficientsx=0; w.expo
18、nentsx=0; for(x=1;x100;x+) exp=temp.exponentsx; for(int y=x+1;y100;y+) if(exp=temp.exponentsy) temp.coefficientsx+=temp.coefficientsy; temp.exponentsy=0; temp.coefficientsy=0; w=temp;Polynomial &Polynomial:operator*=(const Polynomial& r) *this=*this*r; return *this;void Polynomial:EnterTerms()/初始函数
19、bool found=false; int numberOfTerms,c,e; coutnumberOfTerms; for(int n=1;n=numberOfTerms;n+) coutc; coute; if(c!=0) if(e=0)/初始置零 coefficients0+=c;/常数 continue; for(int term=1;(term100)&(coefficientsterm!=0);term+)/找是否阶数相同 if(e=exponentsterm) coefficientsterm+=c; exponentsterm=e; found=true; if(!found
20、)/阶数不同 另外储存 coefficientsterm+=c; exponentsterm=e; void main() Polynomial a,b,c,t,d; a.EnterTerms(); b.EnterTerms(); coutendlFirst polynomial is:; a.PrintPolynomial(); coutendlSecond polynomial is:; b.PrintPolynomial(); coutendlAdding the polynomials yields:; c=a+b; c.PrintPolynomial(); coutendl+=the
21、 polynomials yields:; t=a; a+=b; a.PrintPolynomial(); coutendlSubtracting the polynomials yields:; a=t; c=a-b; c.PrintPolynomial(); coutendl-=the polynomials yields:; a-=b; a.PrintPolynomial(); coutendlMultiplying the polynomials yields:; a=t; c=a*b; c.PrintPolynomial(); coutendl*=the polynomials yi
22、elds:; a*=b; a.PrintPolynomial(); coutendl;4、#includeiostream.hclass Datepublic: 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(istream&, Date&);private: int year,mounth,date,m;Date:Date(int a,int b
23、,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) coutyear年mounth月date日endl; else cout刚才输入的天数不符合要求!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(dat
24、e+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+;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1