西安交大C++程序设计第十章作业.docx

上传人:b****5 文档编号:7612297 上传时间:2023-01-25 格式:DOCX 页数:26 大小:465.42KB
下载 相关 举报
西安交大C++程序设计第十章作业.docx_第1页
第1页 / 共26页
西安交大C++程序设计第十章作业.docx_第2页
第2页 / 共26页
西安交大C++程序设计第十章作业.docx_第3页
第3页 / 共26页
西安交大C++程序设计第十章作业.docx_第4页
第4页 / 共26页
西安交大C++程序设计第十章作业.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

西安交大C++程序设计第十章作业.docx

《西安交大C++程序设计第十章作业.docx》由会员分享,可在线阅读,更多相关《西安交大C++程序设计第十章作业.docx(26页珍藏版)》请在冰豆网上搜索。

西安交大C++程序设计第十章作业.docx

西安交大C++程序设计第十章作业

西安交通大学实验报告

课程__计算机程序设计__实验名称__多态性__第1页共44页

系别__________实验日期2014年5月31日

专业班级______组别_____________实验报告日期2014年5月31日

姓名________学号__报告退发(订正、重做)

同组人_________________________________教师审批签字

一、实验目的

理解掌握多态的使用方法,学会用虚函数。

二、实验内容

(一)第一题:

定义一个类Base,该类含有虚函数display,然后定义它的两个派生类FirstB和SecondB,这两个派生类均含有公有成员函数display,在主程序中,定义指向基类Base的指针变量ptr,并分别定义Base、FirstB、Second的对象b1、f1、s1,让ptr分别指向b1、f1、s1的起始地址,然后指向执行这些对象的成员函数display。

1.源程序代码:

#include

usingnamespacestd;

classBase

{

public:

virtualvoiddisplay()

{

cout<<"sound!

sound!

sound!

";

}

};

classFirstB:

publicBase

{

public:

voidvirtualdisplay()

{

cout<<"miao!

miao!

miao!

";

}

};

classSecondB:

publicBase

{

public:

voidvirtualdisplay()

{

cout<<"wang!

wang!

wang!

";

}

};

intmain()

{

Base*ptr;

Baseb1;

FirstBf1;

SecondBs1;

cout<<"指向基类Base:

\t";

ptr=&b1;

ptr->display();

cout<<"\n指向派生类FirstBase:

\t";

ptr=&f1;

ptr->display();

cout<<"\n指向派生类SecondB:

\t";

ptr=&s1;

ptr->display();

cout<

return0;

}

2.实验结果:

(二)第二题:

扩充例10-5,从中派生一个正方形类和圆柱体类,写一个测试程序,输出正方形的面积和圆柱体的体积。

1.源程序代码:

验结果:

(三)第三题:

扩充实例编程中的日期类,为Date增加一个成员函数,可以判断日期是否为系统当前日期。

从键盘输入你的生日,如果今天是你的生日则显示:

“HarryBirthday!

”否则显示“还有**天是你的生日”或者“你的生日已经过去了**天,距离明年生日还有**天”。

1.源程序代码:

<

cout<<"Pleaseinputyourbirthday:

";

inta,b;

cin>>a>>b;

Datebirthday(a,b);

(birthday);

cout<

return0;

}

2.实验结果:

四、第四题:

完成上一章实验第5题红颜色的函数功能:

5、采用继承方式定义一个三层生日蛋糕类,不论基类还是派生类都至少包含5个函数:

构造函数、设置数据成员函数、求蛋糕体积、运算符>重载函数、输出生日祝词与蛋糕形状函数。

并编写主函数测试各成员函数。

继承方式如下:

首先定义圆柱体形状蛋糕类,只有3个数据成员,半径、高、生日祝词。

然后派生出圆柱体_方柱体蛋糕类,即在圆柱体形状上增加方柱体形状。

假定方柱体的正方形面积小于圆柱体的圆形面积,注意方柱体的高与正方形的边长不一定相等。

再用圆柱体_方柱体蛋糕类派生出圆柱体_方柱体_菱形体蛋糕类,即在方柱体形状上增加菱形柱体形状。

假定菱形柱体的菱形面积小于方柱体的正方形面积。

提示:

①?

运算符>重载指两个蛋糕对象的体积大小。

?

②基类和派生类数据成员不能定义为public。

③设置数据成员函数、求蛋糕体积、求蛋糕表面积函数、输出生日祝词与蛋糕形状函数均为同名重载函数,例如分别采用函数名为init()、volume()、area()、output()。

程序运行参考图如下:

(红颜色的功能下一章实验完成)

1.源程序代码:

验结果:

五、第五题:

(必做题)定义一个一元二次方程类,通过继承方式定义一元三次方程类,再继承定义一元四次方程类。

类中至少包含构造函数、求根函数、运算符+重载函数、运算符-重载函数、运算符==重载函数、输出方程的函数等6个函数,并编写主函数测试各成员函数。

提示:

①两个一元三次方程对应相加仍然是一个一元三次方程;②求根方法采用迭代方法,迭代公式为:

Xn+1=Xn-F(Xn)/F’(Xn),结束迭代的条件|F(Xn+1)|<10-7与|Xn+1-Xn|<10-7同时成立;③一元三次方程的一般形式如下:

F(X)=AX3+BX2+CX+D=0。

输出方程格式为:

A*X^3+B*X^2+C*X+D=0;④两个一元三次方程对应相加和对应相减仍然是一元三次方程。

⑤假定类中的方程系数能求解出实根。

不考虑方程存在虚根和无根的情况。

求根函数应该有一个参数,该参数指明迭代初值。

例如方程2X3-4X2+3x-6=0在附近的根。

又例如方程X3+12X2+48X+64=0在附近的根。

例如方程X4-10X3+35X2-50x+24=0在附近的根。

又例如方程X4+12X3+54X2+108X+81=0在附近的根。

因此类中数据成员除了系数外,还应考虑迭代初值作为数据成员。

1.源程序代码:

#include

#include

usingnamespacestd;

classEquation2

{

protected:

doubleA,B,C;

doubleX0;

public:

Equation2(doublea=1,doubleb=1,doublec=1,doublex0=

{

Set(a,b,c,x0);

}

voidSet(doublea,doubleb,doublec,doublex0)

{

A=a;

B=b;

C=c;

X0=x0;

}

doubleroot()

{

doubleX=X0;

doubletemp;

do

{

temp=X;

X=X-((A*X*X+B*X+C)/(2*A*X+B));

}while(fabs(X)>=10e-7||fabs(temp-X)>=10e-7);

returnX;

}

Equation2operator+(Equation2eq2)

{

A=A+;

B=B+;

C=C+;

return*this;

}

Equation2operator-(Equation2eq2)

{

A=;

B=;

C=;

return*this;

}

Equation2operator==(Equation2eq2)

{

if(A/==B/&&B/==C/

cout<<"YES!

";

else

cout<<"NO!

";

return*this;

}

voidPrint()

{

cout<

}

};

classEquation3:

publicEquation2

{

protected:

doubleD;

public:

Equation3(doublea=1,doubleb=1,doublec=1,doubled=1,doublex0=

{

Set(a,b,c,d,x0);

}

voidSet(doublea,doubleb,doublec,doubled,doublex0)

{

Equation2:

:

Set(a,b,c,x0);

D=d;

}

doubleroot()

{

doubleX=X0;

doubletemp;

do

{

temp=X;

X=X-((A*X*X*X+B*X*X+C*X+D)/(3*A*X*X+2*B*X+C));

}while(fabs(X)>=10e-7||fabs(temp-X)>=10e-7);

returnX;

}

Equation3operator+(Equation3eq3)

{

A=A+;

B=B+;

C=C+;

D=D+;

return*this;

}

Equation3operator-(Equation3eq3)

{

A=;

B=;

C=;

D=;

return*this;

}

Equation3operator==(Equation3eq3)

{

if(A/==B/&&B/==C/&&C/==D/

cout<<"YES!

";

else

cout<<"NO!

";

return*this;

}

voidPrint()

{

cout<

}

};

classEquation4:

publicEquation3

{

protected:

doubleE;

public:

Equation4(doublea=1,doubleb=1,doublec=1,doubled=1,doublee=1,doublex0=

{

Set(a,b,c,d,e,x0);

}

voidSet(doublea,doubleb,doublec,doubled,doublee,doublex0)

{

Equation3:

:

Set(a,b,c,d,x0);

E=e;

}

doubleroot()

{

doubleX=X0;

doubletemp;

do

{

temp=X;

X=X-((A*X*X*X*X+B*X*X*X+C*X*X+D*X+E)/(4*A*X*X*X+3*B*X*X+2*C*X+D));

}while(fabs(X)>=10e-7||fabs(temp-X)>=10e-7);

returnX;

}

Equation4operator+(Equation4eq4)

{

A=A+;

B=B+;

C=C+;

D=D+;

E=E+;

return*this;

}

Equation4operator-(Equation4eq4)

{

A=;

B=;

C=;

D=;

E=;

return*this;

}

Equation4operator==(Equation4eq4)

{

if(A/==B/&&B/==C/&&C/==D/&&D/==E/

cout<<"YES!

";

else

cout<<"NO!

";

return*this;

}

voidPrint()

{

cout<

}

};

intmain()

{

Equation2equation2(2,3,4,,equation21;

Equation3equation3(2,3,4,5,,equation31;

Equation4equation4(2,3,4,5,6,,equation41;

cout<<"方程为:

\n";

();

cout<

();

cout<

();

cout<

cout<<"测试根:

\n二次:

";

cout<<();

cout<<"\n三次:

";

cout<<();

cout<<"\n四次:

";

cout<<();

cout<<"测试加法:

\n二次:

";

equation2+equation21;

();

cout<<"\n三次:

";

equation3+equation31;

();

cout<<"\n四次:

";

equation4+equation41;

();

cout<<"\n测试减法:

\n二次:

";

equation2-equation21;

();

cout<<"\n三次:

";

equation3-equation31;

();

cout<<"\n四次:

";

equation4-equation41;

();

return0;

}

2.实验结果:

六、第六题:

给自定义虚数类增加运算符*、/、++、--、==重载,注意++和--分前置和后置两种情况,编写主函数加以测试。

1.源程序代码:

验结果:

3.问题分析:

(七)第七题:

完善上一章定义大整数类的题目,成员函数包括加、减以及判大小,注意用运算符重载,编写主函数加以测试。

1.源程序代码:

#include

#include

#include

#include

usingnamespacestd;

classczs

{

intnum[100];

intlen;

charsign;

public:

czs()

{

for(inti=0;i<100;i++)

num[i]=0;

len=0;

sign='';

}

voidset(char*str)

{

if(str[0]=='-')

{

str++;

sign='-';}

elseif(str[0]=='+')

{

str++;

sign='';}

len=strlen(str);

for(inti=100-len;i<100;i++)

num[i]=str[i+len-100]-'0';

}

voidprint()

{

cout<

inti=100-len;

while(num[i]==0)

i++;

if(i>=100)

cout<<"0";

for(;i<100;i++)

cout<

cout<

}

czsoperator+(czs&a)

{

if(sign==

{

intb=max(len,;

for(inti=99;i>100-b;i--)

{

num[i]=num[i]+[i];

num[i-1]=num[i-1]+num[i]/10;

num[i]=num[i]%10;

}

num[100-b]=num[100-b]+[100-b];

}

else

{

if(len>

for(inti=99;i>=len;i--)

{

num[i]=num[i][i];

if(num[i]<0)

{

num[i]=num[i]+10;

num[i-1]--;

}

}

elseif(len<

{

sign=;

for(inti=99;i>=len;i--)

{

num[i]=[i]-num[i];

if(num[i]<0)

{

num[i]=num[i]+10;

[i-1]--;

}

}

}

else

{

intb=0;

for(inti=100-len;i<100;i++)

if(num[i]!

=[i])

{

if(num[i]<[i])

b=1;

break;

}

if(b)

{

sign=;

for(inti=99;i>=len;i--)

{

num[i]=[i]-num[i];

if(num[i]<0)

{

num[i]=num[i]+10;

[i-1]--;

}

}

}

else

{

for(inti=99;i>=len;i--)

{

num[i]=num[i][i];

if(num[i]<0)

{

num[i]=num[i]+10;

num[i-1]--;

}}

}

}

}

return*this;

}

czsoperator-(czsa)

{

if(sign!

=

{

intb=max(len,;

for(inti=99;i>100-b;i--)

{

num[i]=num[i]+[i];

num[i-1]=num[i-1]+num[i]/10;

num[i]=num[i]%10;

}

num[100-b]=num[100-b]+[100-b];

}

else

{

if(len>

for(inti=99;i>=len;i--)

{

num[i]=num[i][i];

if(num[i]<0)

{

num[i]=num[i]+10;

num[i-1]--;

}

}

elseif(len<

{

if(sign='')

sign='-';

else

sign='';

for(inti=99;i>=len;i--)

{

num[i]=[i]-num[i];

if(num[i]<0)

{

num[i]=num[i]+10;

[i-1]--;

}

}

}

else

{

intb=0;

for(inti=100-len;i<100;i++)

if(num[i]!

=[i])

{

if(num[i]<[i])

b=1;

break;

}

if(b)

{

if(sign='')

sign='-';

else

sign=;

for(inti=99;i>=len;i--)

{

num[i]=[i]-num[i];

if(num[i]<0)

{

num[i]=num[i]+10;

[i-1]--;

}

}

}

else

{

for(inti=99;i>=len;i--)

{

num[i]=num[i][i];

if(num[i]<0)

{

num[i]=num[i]+10;

num[i-1]--;

}

}

}

}

}

return*this;

}

czsoperator>(czs&a)

{

czs:

:

operator-(a);

if(sign=='-')

cout<<"<";

else

{

inti=100-len;

while(num[i]==0&&i<100)

i++;

if(i==100)

cout<<"=";

else

cout<<">";

}

return*this;

}

};

voidmain()

{

chara[100],c[100],b[100];

czsd,e,f;

cout<<"请输入三个数:

"<

cin>>a>>b>>c;

(a);

(b);

(c);

cout<<"前两个数的和为:

"<

d+e;

();

cout<<"前两个数的和减去第三个数为:

"<

d-f;

();

cout<<"减去后所得的数";

d>f;

cout<<"第三个数";

cout<

}

2.实验结果:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1