天津理工大学C++期末考试.docx
《天津理工大学C++期末考试.docx》由会员分享,可在线阅读,更多相关《天津理工大学C++期末考试.docx(32页珍藏版)》请在冰豆网上搜索。
![天津理工大学C++期末考试.docx](https://file1.bdocx.com/fileroot1/2022-11/30/b6eae305-e91e-4655-999a-98312f413960/b6eae305-e91e-4655-999a-98312f4139601.gif)
天津理工大学C++期末考试
实验一
一、明确的概念:
(1)理解类和对象的概念;(具体见附一)
类是抽象的对象是具体的例如:
你、我、他都是人那么你、我、他就是对象人就是类
(2)掌握类与对象的定义方法;
类的定义:
class类名{…/*定义这个类*/};员名或成员函数
不能通过外部直接访问(不声明访问属性时系统默认为私有)当出现对象名.成员(私有)时编译器报错
与private类似但protected属性的成员可以继承private不能继承
(4)掌握构造函数和析构函数的含义与作用、定义方式和实现;
构造函数:
为数据成员开辟存储空间
函数名必须与类名相同之前绝对不许说明返回值类型void也不行
构造函数不能由用户调用即:
对象名.构造函数名(参数)是错误的
构造函数是随着对象的声明而调用的
例如:
classStudent{Student(){cout<<”Hello.”<Intmain(void)
{cout<<”Hello.”<StudentA;
}
运行结果:
Hello.<intgetx(){returnx;}
intgety(){returny;}
private:
intx,y;
};
Coordinate:
:
Coordinate(Coordinate&p){<}
intmain(){
Coordinatep1(3,4);
Coordinatep2(p1);
Coordinatep3=p2;
cout<<"p3=("<<()<<","<<()<<")"<return0;
}
(1)记录程序的运行结果
(2)将Coordinate类中带有两个参数的构造函数进行修改,在函数体内增加如下语句:
cout<<”Constructoriscalled.”<重新记录程序的运行结果,并解释输出结果。
(3)按下列要求进行测试。
在主函数体内,添加如下语句:
Coordinatep4;错误原因:
构造函数没有参数构造函数为Coordinate:
:
Coordinate(int,int)
Coordinatep5
(2);错误原因:
参数数量不对
1.
根据注释语句的提示实现类Date的成员函数,并将完整的程序编译、连接成功以保证程序能够正确运行。
#include<>
classDate{
public:
voidprintDate();
分析:
1.题目中Date类的数据成员为day,month,year且均为整型访问属性为私有主函数中声明了testDay对象
2.数据成员均为私有则不能通过=<数值>的方法来设置题目中给出了voidsetDay(int)voidsetMonth(int)和voidsetYear(int)三个成员函数去是指daymonth和year的值还有一个voidprintDate()来输出
3.准备工作结束开始编程看程序仅差4个成员函数未定义类外定义要写出作用域即该函数属于哪个类:
格式:
返回值类型作用域:
:
函数名参数表
voidDate:
:
setDay(intd)/*定义时必须要给形参一个名字这里给的是*/d{day=d}证结果出现溢出数据时查看是否写反了例如写成d=day了解设置函数的作用机制见附二
下面是一个计算器类的定义,请完成该类的成员函数的实现,并设计一个主函数使用该类和相关成员函数以测试
该类设计的正确性。
#include
usingnamespacestd;
classcounter
{
public:
counter(intnumber=0)定义一个类ClsName,要求该类设计如下:
(1)该类有两个整型数据成员x和y;
(2)为该类重载三个不同的构造函数:
分别为无参数、带一个参数和带两个参数的构造函数,要求在构造函数中输出必要的信息以示区别;
(3)设计2个成员函数用来读取数据成员x和y;
(4)设计2个成员函数用来设置数据成员x和y;
(5)设计1个成员函数用来在屏幕上打印输出数据成员x和y;
(6)在main()函数中用三个不同的构造函数创建3个对象,并使用所有的成员函数对这些对象进行必要的操作。
classClsName
{
public:
inta,b;
ClsName(inta,intb){cout<<"Constructbytwonumbers."<intgetx(){returnx;}因为x,y的访问属性为私有,不能由主函数直接访问所以会设置读取函数专门负责返回相应的值
重载:
函数名相同,参数的类型不同或者个数不同、或者都不同。
即根据带入参数的类型、数量的不同,来实现不同的功能
intgety(){returny;}
voidsetx(){cout<<"ChangeX:
";cin>>x;}
voidsety(){cout<<"ChangeY:
";cin>>y;}
voidprint(){cout<<"X="<private:
intx,y;
(1)中要求的两个整型数据成员
};
intmain()
{
inta,b;
cout<<"Test1:
Inputwith2numbers,nowpleaseinputtwonumbers:
"<cin>>a;cin>>b;
ClsNamet1(a,b);
();
();();
();
cout<<"\nTest2:
Inputwithanumbers,nowpleaseinputanumber:
";
cin>>a;
ClsNamet2(a);
();
();();
();
cout<<"\nTest3:
Withoutnumbers";
ClsNamet3;
();
();();
();
return0;
5.
建立类cylinder,包括两个数据成员radius和height,分别表示圆柱体的半径和高度,cylinder类的构造函数被传递了两个double值来初始化这两个成员;定义成员函数area()和volume用来求圆柱体的表面积和体积,定义成员函数print()打印cylinder类的相关信息。
最后,在主函数中对cylinder类的设计进行测试。
这题很简单没啥说的
#include<>
classcylinder
{
public:
voidset(doubler,doubleh){radius=r,height=h;}
doublearea(){return(radius*;}
doublevolume(){return(height*area());}
voidprint(){cout<<"Area="<
private:
doubleradius,height;
};
intmain()
{
inta,b;
cylinderv;
cout<<"Radius=";
cin>>a;
cout<<"Height=";
cin>>b;
(a,b);
();
return0;
}
6.
定义一个学生类CStudent实现简单的学籍管理功能,要求该类至少实现以下功能:
(1)录入学生的基本信息(包括姓名,学号,性别,年龄,专业,入学时间,各门功课成绩)
(2)输出学生的基本信息
(3)选课(输入时间和所选的课程)
(4)统计每门课的学分绩点
(5)统计每学期的平均学分绩点
(6)统计重考科目
(7)统计重修科目
#include
#include
usingnamespacestd;
constMAX=4;
classCStudent{
stringname,sex,ID,object,jtime;<for(inti=0;i{
cout<<"Subjectname:
";cin>>sbj[i];
cout<<"Mark:
";cin>>mark[i];
}
}
voidbaseprint().相当于score=score+...无法确定第一个score的值
retry=0;
for(i=0;i{
if(mark[i]>=60)score+=m_mark[i];2010-3-23”,否则会导致部分功能不正常
(5)掌握静态数据成员和静态成员函数的使用方法;
例如:
有Object类,拥有数据成员a,由Object类声明出的对象A、B、C,那么A、B、C都拥有各自的a,内存中也会分配出各自的内存空间A:
:
a,B:
:
a,C:
:
a(共3个)。
而如果将数据成员a声明为静态成员(static),那么A、B、C则共用一个内存空间a(只有1个)
最典型的例子是统计声明对象的数量
使用方法:
static数据类型数据成员名
由于不能直接对数据成员赋初值所以静态数据成员初始化方法为:
数据类型类名:
:
静态数据成员名=初值(注意:
1.是类名,不是对象名;2.之前不要加static)
静态成员函数
静态成员函数属于整个类而不是某个对象所以调用方法为类名:
:
静态成员函数名(参数表)
其他参看书P103几点说明
练习项目
Time类的框架定义如下:
#include<>
计一个用来表示直角坐标系的Location类,在主程序中创建类Location的两个对象A和B,要求A的坐标在第3象限,B的坐标点在第2象限,分别采用成员函数和友元函数计算给定两个坐标点之间的距离,要求按如下格式输出结果:
A(x1,y1),B(x2,y2)
Distance1=d1
Distance2=d2
其中:
x1,x2,y1,y2为指定的坐标值,d1和d2为两个坐标点之间的距离。
Location类框架可参考如下:
#include<>
#include
classLocation";}
private:
doublex,y;
};
Location:
:
Location(doublea,doubleb)
{
x=a;
y=b;
}
doubleLocation:
:
Getx()
{
returnx;
}
doubleLocation:
:
Gety()
{
returny;
}
doubleLocation:
:
distance1(Location&L)
{
returnsqrt(*+*);
}
intmain()
{
doublea,b;
cout<<"输入A点坐标(在第二象限):
"<cout<<"x(x<0):
";
for(;;)
{
cin>>a;
if(a<0)break;
cout<<"不对,再来一次:
";
}
cout<<"y(y>0):
";
for(;;)
{
cin>>b;
if(b>0)break;
cout<<"不对,再来一次:
";
}
LocationA(a,b);
cout<<"输入B点坐标(在第四象限):
"<cout<<"x(x>0):
";
for(;;)
{
cin>>a;
if(a>0)break;
cout<<"不对,再来一次:
";
}
cout<<"y(y<0):
";
for(;;)
{
cin>>b;
if(b<0)break;
cout<<"不对,再来一次:
";
}
LocationB(a,b);
cout<<"A("<<()<<","<<()<<")"<cout<<"B("<<()<<","<<()<<")"<cout<<"Distance1="<<(B)<cout<<"Distance2="<return0;
}
3.
使用C++的string类,将5个字符串按逆转后的顺序显示出来。
例如,逆转前的5个字符串是:
GermanyJapanAmericaBritainFrance
逆转后的顺序输出字符串是:
FranceBritainAmericaJapanGermany
#include
#include
usingnamespacestd;
intmain(void)
{
stringstr1,str2,str3,str4,str5;
cin>>str1>>str2>>str3>>str4>>str5;
cout<return0;
}
4.
设计一个模仿类magic来实现4*4的魔方阵。
类的框架如下:
#include
usingnamespacestd;
classmagic
5.
声明一个Employee类,数据成员包括:
一个long型的id,两个字符指针成员,代表职员的姓名和家庭住址,一个double数据,代表月薪。
成员函数有:
构造函数、析构函数、set_salary()和get_salary()代表修改和获取薪资、set_name()和get_name()代表修改和获取姓名、set_address()和get_address()代表修改和获取家庭住址,set_id()和get_id()用来修改获取当前职员的id号。
在主程序中,创建对象数组调用上述函数以测试Employee类设计的正确性。
Employee类的框架可参考:
#include
#include
usingnamespacestd;
classEmployeeet_id(a);
p=newchar[1000];
cout<<"员工姓名:
";cin>>p;
s[j].set_name(p);
p=newchar[1000];
cout<<"员工住址:
";cin>>p;
s[j].set_address(p);
cout<<"输入员工工资:
";
cin>>b;
s[j].set_salary(b);
}
for(j=0;j
s[j].print();
return0;
}
6.
声明一个Student类,在该类中包括一个数据成员:
score(代表课程成绩)、两个静态数据成员:
total_score(代表总分),count(代表学生总人数)。
成员函数有:
构造函数、析构函数、account(int)用于设置分数、静态成员函数sum()返回所有学生的总成绩、静态成员函数average()返回所有学生的平均成绩、print()用于打印当前学生对象的成绩等。
在主程序中,输入某班同学的成绩,并调用上述函数打印全班同学的成绩、求出全班学生的成绩之和与平均分等。
Student类的框架可参考:
#include
#include
usingnamespacestd;
classStudentccount(a);
}
cout<<"输出全班成绩:
"<intj=1;
while(i>0)
{
s[--i].print();
if(j++%6==0)cout<}
s[0].print2();
return0;}
注意:
静态成员和非静态成员的初始化方式的区别。
实验三派生与继承
(2010-3-23)
二、实验名称:
派生与继承。
三、实验目的:
(1)理解继承的含义,掌握派生类的定义方法和实现;
继承就是子承父类看书注意格式私有成员不能继承父类的保护成员继承成变为子类的私有成员
(2)理解公有继承下基类成员对派生类成员和派生类对象的可见性,能正确地访问继承层次中的各种类成员;
(3)理解保护成员在继承中的作用,能够在适当的时候选择使用保护成员以便派生类成员可以访问基类的部分非公开的成员;
(4)理解虚函数在类的继承层次中的作用,虚函数的引入对程序运行时的影响,能够对使用虚函数的简单程序写出程序结果。
四、练习项目
1.先定义“点”类Point,再由“点”类派生出“圆”类Circle。
#include<>
#definePI
classPoint多重继承中基类构造函数和析构函数的调用顺序
#include<>
classBase1
{
protected:
intdata1;
public:
Base1(inta=0)
{data1=a;
cout<<"BaseConstructor1\n";
}
~Base1()
{cout<<"BaseDestructor1\n";}
};
classBase2
{
protected:
intdata2;
public:
Base2(inta=0)
{data2=a;
cout<<"BaseConstructor2\n";
}
~Base2()
{cout<<"BaseDestructor2\n";}
};
classDerived:
publicBase1,publicBase2
{
intd;
public:
Derived(intx,inty,intz):
Base1(x),Base2(y)
{d=z;cout<<"DerivedConstructor\n";}
~Derived()
{cout<<"DerivedDestructor\n";}
voidShow()
{cout<};
voidmain()
{Derivedc(1,2,3);
();
}
(1)记录程序的运行结果
运行结果:
BaseConstructor1
BaseConstructor2
DerivedConstructor
1,2,3
DerivedDestructor
BaseDestructor2
BaseDestructor1
Pressanykeytocontinue
要求记住调用顺序
4.对象成员构造函数和析构函数的调用顺序
#include<>
classBase1
{
protected:
intdata1;
public:
Base1(inta=8)
{data1=a;
cout<}
~Base1()
{cout<};
classBase2
{
protected:
intdata2;
public:
Base2(inta=9)
{data2=a;
cout<}
~Base2()
{cout<};
classDerived:
publicBase1,publicBase2
{intd;
Base1b1,b2;
public:
Derived(intx,inty,intz):
Base1(x),Base2(y),b1(x+y),b2(x+z)
{d=z;cout<<"DerivedConstructor\n";}
~Derived()
{cout<<"DerivedDestructor\n";}
voidShow()
{cout<};
voidmain()
{Derivedc(1,2,3);
();
}
(1)记录程序的运行结果
1,BaseConstructor1
2,BaseConstructor2
3,BaseConstructor1
4,BaseConstructor1
DerivedConstructor
1,2,3
DerivedDestructor
4,BaseDestructor1
3,BaseDestructor1
2,BaseDestructor2
1,BaseDestructor1
Pressanykeytocontinue
5.编程题
假设某商店有如下几种货品:
衬衣、帽子、立柜。
每一种货物都有与其关联的说明信息。
衬衣:
单价、产地、库存量、布料;
帽子:
单价、产地、库存量、布料、样式(平顶或尖顶);
立柜:
单价、产地、库存量、木料、颜色。
对这些商品的操作有:
商品的进库(增加库存量),商品的出库(减少库存量),该类货
品总价格的计算。
要求自行设计数据结构,用类的继承与派生关系将上述的各种货品表示出来,并使用类
的构造函数来初始化每一类对象的初始数据。
而后将上述的商品管理计算机化,完成操作要
求的功能。
【实现方法提示】
1.设立3个不同的类来描述与处理3种不同的货品。
首先注意到上述3种货品数据之
间的相互关联关系,可使用C++基类及其派生类的定义方法,先抽象出(“提取”出)如下每
一货品都具有的“公有”数据构成一个所谓的基类base,而后再派生出所需的那3个类。
(1)base(基)类:
单价、产地、库存量;
(2)由base作为基类,派生出shirt(衬衣)类:
增加“布料”数据;
(3)由base出发,派生出wardrobe(立柜)类:
增加“木料”与“颜色”数据;
(4)而后又由shirt类出发(作为基类),派生出cap(帽子)类:
增加“样式”数据。