当前位置:文档之家› c++多态性习题

c++多态性习题

04.设计一个点类Point,实现点对象之间的各种运算。
解:
Point类提供了6个运算符重载函数(参加程序中的代码和注释),以实现相应的运算。
本题程序如下:
#include
class Point
{
int x,y;
public:
Point(){x=y=0;}
Point(int i,int j){x=i;y=j;}
Point(Point &);
~Point(){}
void offset(int,int); // 提供对点的偏移
void offset(Point); // 重载,偏移量用Point类对象表示
bool operator==(Point); // 运算符重载,判断两个对象是否相同
bool operator!=(Point); // 运算符重载,判断两个对象是否不相同
void operator+=(Point); // 运算符重载,将两个点对象相加
void operator-=(Point); // 运算符重载,将两个点对象相减
Point operator+(Point ); // 运 算符重 载,相加并将结果放在左操作数中
Point operator-(Point); // 运算符重载,相减并将结果放在左操作数中
int getx(){return x;}
int gety(){return y;}
void disp()
{
cout<<"("<}
};
Point::Point(Point &p)
{
x=p.x; y=p.y;
}
void Point::offset(int i,int j)
{
x+=i; y+=j;
}
void Point::offset(Point p)
{
x+=p.getx(); y+=p.gety();
}
bool Point::operator==(Point p)
{
if(x==p.getx()&&y==p.gety())
return 1;
else
return 0;
}
bool Point::operator!=(Point p)
{
if(x!=p.getx()||y!=p.gety())
return 1;
else
return 0;
}
void Point::operator+=(Point p)
{
x+=p.getx(); y+=p.gety();
}
void Point::operator-=(Point p)
{
x-=p.getx(); y-=p.gety();
}
Point Point::operator+(Point p)
{
this->x+=p.x; this->y+=p.y;
return *this;
}
Point Point::operator-(Point p)
{
this->x-=p.x;this->y-=p.y;
return *this;
}
void main()
{
Point p1(2,3),p2(3,4),p3(p2);
cout<<"1:"; p3.disp();
p3.offset(10,10);
cout<<"2:"; p3.disp();
cout<<"3:"<<(p2==p3)<cout<<"4:"<<(p2!=p3)<p3+=p1;
cout<<"5:"; p3.disp();
p3-=p2;
cout<<"6:"; p3.disp();
p3=p1+p3; // 先将p1+p3的结果放在p1中,然后赋给p3,所以p1=p3
cout<<"7:"; p3.disp();
p3=p1-p2;
cout<<"8:"; p3.disp();
}

本程序的执行结果如下:
1:(3,4)
2:(13,14)
3:0
4:1
5:(15,17)
6:(12,13)
7:(14,16)
8:(11,12)

05.设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期减去天数、两日期相差的天数等。
解:
在Date类中设计如下重载运算符函数:
Date operator+(int days); 返回一日期加一天数得到的日期
Date operator-(int days); 返回一日期减去天数得到的日期
int operator-(Date &b); 返回两日期相差的天数
在实现这些重载运算符函数调用以下私有成员函数:
leap(int); 判断指定的年份是否为闰年
dton(Date &); 将指定日期转换为从0年0月0日起的天数
ntod(int); 将指定的0年0月0日起的天数转换为对应的日期
本题程

序如下:
#include
int day_tab[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,31,30,31,30,31}};
// day_tab 二维数组存放各月天数,第一行对应非闰年,第二行对应闰年
class Date
{
int year,month,day;
int leap(int);
int dton(Date &);
Date ntod(int);
public:
Date(){}
Date(int y,int m,int d)
{
year=y;month=m;day=d;
}
void setday(int d){day=d;}
void setmonth(int m){month=m;}
void setyear(int y){year=y;}
int getday(){return day;}
int getmonth(){return month;}
int getyear(){return year;}
Date operator+(int days)
{
static Date date;
int number=dton(*this)+days;
date=ntod(number);
return date;
}
Date operator-(int days)
{
static Date date;
int number=dton(*this);
number-=days;
date=ntod(number);
return date;
}
int operator-(Date &b)
{
int days=dton(*this)-dton(b)-1;
return days;
}
void disp()
{
cout<}
};
int Date::leap(int year)
{
if(year%4==0&&year%100!=0||year%400==0) // 是闰年
return 1;
else // 不是闰年
return 0;
}
int Date::dton(Date &d)
{
int y,m,days=0;
for(y=1;y<=d.year;y++)
if(leap(y))
days+=366;
else
days+=365;
for(m=0;mif(leap(d.year))
days+=day_tab[1][m];
else
days+=day_tab[0][m];
days+=d.day;
return days;
}
Date Date::ntod(int n)
{
int y=1,m=1,d,rest=n,lp;
while(1)
{
if(leap(y))
{
if(rest<=366)
break;
else
rest-=366;
}
else
{
if(rest<=365)
break;
else
rest-=365;
}
y++;
}
y--;
lp=leap(y);
while(1)
{
if(lp)
{
if(rest>day_tab[1][m-1])
rest-=day_tab[1][m-1];
else
break;
}
else
{
if(rest>day_tab[0][m-1])
rest-=day_tab[0][m-1];
else
break;
}
m++;
}
d=rest;
return Date(y,m,d);
}
void main()
{
Date now(2002,6,12),then(2003,2,10);
cout<<"now:"; now.disp();
cout<<"then:"; then.disp();
cout<<"相差天数:"<<(then-now)<Date d1=now+100,d2=now-100;
cout<<"now+100:"; d1.disp();
cout<<"now-100:"; d2.disp();
}

本程序的执行结果如下:
now:2002.6.12
then:2003.2.10
相差天数:242
now+100:2002.9.20
now-100:2002.3.4


题6.设计一个三角形类Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符“+”,以实现求两个三角形对象的面积之和。
解:
在Triangle类中设计一个友元函数operator+(Triangle t1,Triangle t2),它重载运算符"+",返回t1和t2两个三角形的面积之和。
本题程序如下:
#include
#include
class Triangle
{
int x,y,z;
double area;
public:
Triangle(int i,int j,int k)
{
double s;
x=i;y=j;z=k;
s=(x+y+z)/2.0;
area=sqrt(s*(s-x)*(s-y)*(s-z));
}
void disparea()
{
cout<<"Area="<}
friend double operator+(Triangle t1,Triangle t2)
{
return t1.area+t2.area;
}
};
void main()
{
Triangle t1(3,4,5),t2(4,5

,6);
double s;
cout<<"t1:"; t1.disparea();
cout<<"t2:"; t2.disparea();
s=t1+t2;
cout<<"总面积="<}
本程序执行结果如下:
t1:Area=6
t2:Area=9.92157
总面积=15.9216

-----------------------------------------------------------

题7.习题6的重载运算符“+”友元函数只能返回两个三角形的面积之和,不能计算三个三角形的面积之和,改进一下,使之能计算任意多个三角形的面积之和。
解:
习题6的重载运算符为什么不能计算3个三角形的面积之和呢?对于式子:s=t1+t2+t3,先计算t1+t2,返回一个double数然后再进行该double数+t3的计算,显然没有这样的重载运算符“+”友元函数,只需要添加这样重载运算符“+”友元函数即可。
本题程序如下:
#include
#include
class Triangle
{
int x,y,z;
double area;
public:
Triangle(int i,int j,int k)
{
double s;
x=i;y=j;z=k;
s=(x+y+z)/2.0;
area=sqrt(s*(s-x)*(s-y)*(s-z));
}
void disparea()
{
cout<<"Area="<}
friend double operator+(Triangle t1,Triangle t2)
{
return t1.area+t2.area;
}
friend double operator+(double d,Triangle t)
{
return d+t.area;
}
};
void main()
{
Triangle t1(3,4,5),t2(4,5,6),t3(5,6,7),t4(6,7,8);
double s;
cout<<"t1:"; t1.disparea();
cout<<"t2:"; t2.disparea();
cout<<"t3:"; t3.disparea();
cout<<"t4:"; t4.disparea();
s=t1+t2+t3+t4;
cout<<"总面积="<}
本程序的执行结果如下:
t1:Area=6
t2:Area=9.92157
t3:Area=14.6969
t4:Area=20.3332
总面积=50.9517

-------------------------------------------------------

题8.设计一个学生类student,包括姓名和三门课程成绩,利用重载运算符”+“将所有学生的成绩相加放在一个对象中,再对该对象求各门课程的平均分。
解:
#include
#include
#include
class student
{
char name[10];
int deg1,deg2,deg3;
public:
student(){}
student(char na[],int d1,int d2,int d3)
{
strcpy(name,na);
deg1=d1;deg2=d2;deg3=d3;
}
friend student operator+(student s1,student s2)
{
static student st;
st.deg1=s1.deg1+s2.deg1;
st.deg2=s1.deg2+s2.deg2;
st.deg3=s1.deg3+s2.deg3;
return st;
}
void disp()
{
cout<}
friend void avg(student &s,int n)
{
cout<}
};
void main()
{
student s1("Li",78,82,86),s2("Zheng",75,62,89);
student s3("Ma",89,87,95),s4("Xu",54,78,66),s;
cout<<"输出结果"<s1.disp();
s2.disp();
s3.disp();
s4.disp();
s=s1+s2+s3+s4; // 调用重载运算符
avg(s,4); // 友元函数求平均分
}
本程序的执行结果如下:
输出结果:
Li 78 82 86
Zheng 75 62 89
Ma 89 87 95
Xu 54 78 66
平均分 74 77 84

---------

---------------------------------------------------

题9.在Time类中设计如下重载运算符函数:
Time operator+(Time); 返回一时间加上另一时间得到的新时间
Time operator-(Time); 返回一时间减去另一时间得到的新时间
本题程序如下:
#include
class Time
{
int hour,minute,second;
public:
Time(){}
Time(int h,int m,int s)
{
hour=h;minute=m;second=s;
}
Time(int h,int m)
{
hour=h;minute=m;second=0;
}
void sethour(int h){hour=h;}
void setminute(int m){minute=m;}
void setsecond(int s){second=s;}
int gethour(){return hour;}
int getminute(){return minute;}
int getsecond(){return second;}
Time operator+(Time);
Time operator-(Time);
void disp()
{
cout<}
};
Time Time::operator+(Time t)
{
int carry,hh,mm,ss;
ss=getsecond()+t.getsecond();
if(ss>60)
{
ss-=60;
carry=1; // 进位标记
}
else carry=0;
mm=getminute()+t.getminute()+carry;
if(mm>60)
{
mm-=60;
carry=1;
}
else carry=0;
hh=gethour()+t.gethour()+carry;
if(hh>24)
hh=24;
static Time result(hh,mm,ss);
return result;
}
Time Time::operator-(Time t)
{
int borrow,hh,mm,ss;
ss=getsecond()-t.getsecond();
if(ss<0)
{
ss+=60;
borrow=1; // 借位标记
}
else borrow=1;
mm=getminute()-t.getminute()-borrow;
if(mm<0)
{
mm+=60;
borrow=1;
}
else borrow=0;
hh=gethour()-t.gethour()-borrow;
if(hh<0)
hh+=24;
static Time result(hh,mm,ss);
return result;
}
void main()
{
Time now(2,24,39);
Time start(17,55);
Time t1=now-start,t2=now+start;
cout<<"输出结果:"<cout<<" now: "; now.disp();
cout<<" start:"; start.disp();
cout<<" 相差: "; t1.disp();
cout<<" 相加: "; t2.disp();
}
本程序的执行结果如下:
输出结果:
now:2:24:39
start:17:55:0
相差:8:28:39
相加:20:19:39

相关主题
文本预览
相关文档 最新文档