天津理工大学C++期末考试.docx
《天津理工大学C++期末考试.docx》由会员分享,可在线阅读,更多相关《天津理工大学C++期末考试.docx(66页珍藏版)》请在冰豆网上搜索。
天津理工大学C++期末考试
实验一
一、明确的概念:
(1)理解类和对象的概念;(具体见附一)
类是抽象的对象是具体的例如:
你、我、他都是人那么你、我、他就是对象人就是类
(2)掌握类与对象的定义方法;
类的定义:
class类名{…/*定义这个类*/};//(别忘了最后的分号)
对象的定义:
类名对象名(参数);
(3)理解类的成员的访问控制的含义,公有和私有成员的区别;
public:
//访问属性为公有通过外部直接访问即:
对象名.成员名或成员函数
private:
//访问属性为私有不能通过外部直接访问(不声明访问属性时系统默认为私有)当出现对象名.成员(私有)时编译器报错
protected:
//访问属性为保护与private类似但protected属性的成员可以继承private不能继承
(4)掌握构造函数和析构函数的含义与作用、定义方式和实现;
构造函数:
为数据成员开辟存储空间
函数名必须与类名相同之前绝对不许说明返回值类型void也不行
构造函数不能由用户调用即:
对象名.构造函数名(参数)是错误的
构造函数是随着对象的声明而调用的
例如:
classStudent{Student(){cout<<”Hello.”<Intmain(void)
{cout<<”Hello.”<StudentA;
}
运行结果:
Hello.//<-这个Hello是主函数中的
Hello.//<-是声明A对象时调用的构造函数构造函数中的Hello
析构函数功能与构造函数相反注意调用时间和顺序(看书)
二、
练习项目
1.
输入下列程序,按要求进行实验,并记录实验的结果。
#include
usingnamespacestd;
classCoordinate
{
public:
Coordinate(intx1,inty1){x=x1;y=y1;}
Coordinate(Coordinate&p);
~Coordinate(){cout<<"Destructoriscalled."<intgetx(){returnx;}
intgety(){returny;}
private:
intx,y;
};
Coordinate:
:
Coordinate(Coordinate&p){//拷贝构造函数
x=p.x;y=p.y;
cout<<"Copyinitianizationconstructoriscalled."<}
intmain(){
Coordinatep1(3,4);
Coordinatep2(p1);
Coordinatep3=p2;
cout<<"p3=("<return0;
}
(1)记录程序的运行结果
(2)将Coordinate类中带有两个参数的构造函数进行修改,在函数体增加如下语句:
cout<<”Constructoriscalled.”<重新记录程序的运行结果,并解释输出结果。
(3)按下列要求进行测试。
在主函数体,添加如下语句:
Coordinatep4;←错误原因:
构造函数没有参数构造函数为Coordinate:
:
Coordinate(int,int)
Coordinatep5
(2);←错误原因:
参数数量不对
2.
根据注释语句的提示实现类Date的成员函数,并将完整的程序编译、连接成功以保证程序能够正确运行。
#include
classDate{
public:
voidprintDate();//显示日期
分析:
1.题目中Date类的数据成员为day,month,year且均为整型访问属性为私有主函数中声明了testDay对象
2.数据成员均为私有则不能通过tesDay.day=<数值>的方法来设置题目中给出了voidsetDay(int)voidsetMonth(int)和voidsetYear(int)三个成员函数去是指daymonth和year的值还有一个voidprintDate()来输出
3.准备工作结束开始编程看程序仅差4个成员函数未定义类外定义要写出作用域即该函数属于哪个类:
格式:
返回值类型作用域:
:
函数名参数表
voidDate:
:
setDay(intd)/*定义时必须要给形参一个名字这里给的是*/d{day=d}//设置了day的值其他函数依此类推输出函数就不用再唠叨了
4.验证结果出现溢出数据时查看是否写反了例如写成d=day了解设置函数的作用机制见附二
voidsetDay(int);//设置日的值
voidsetMonth(int);//设置月的值
voidsetYear(int);//设置年的值
private:
intday,month,year;
};
intmain(){
DatetestDay;
testDay.setDay(5);
testDay.setMonth(10);
testDay.setYear(2010);
testDay.printDate();
};
voidDate:
:
setDay(intd){day=d;}
voidDate:
:
setMonth(intm){month=m;}
voidDate:
:
setYear(inty){year=y;}
voidDate:
:
printDate(){cout<3.
下面是一个计算器类的定义,请完成该类的成员函数的实现,并设计一个主函数使用该类和相关成员函数以测试
该类设计的正确性。
#include
usingnamespacestd;
classcounter
{
public:
counter(intnumber=0)//构造函数
{
value=number;
}
voidincrement();//给value原值加1
voiddecrement();//给value原值减1
intgetvalue();//取得计数器值
intprint();//显示计数
private:
intvalue;//数据成员
};
voidcounter:
:
increment(){value++;cout<<"Thecounterhasincreasedby1"<voidcounter:
:
decrement(){value--;cout<<"Thecounterhasdecreasedby1"<intcounter:
:
getvalue(){returnvalue;}
intcounter:
:
print(){cout<<"\nDisplay:
"<intmain(){
cout<<"Pleaseinputoriginnumber:
";//定义counter类的几个对象并调用有关成员函数
inta;
cin>>a;
counterc(a);//输入a并将a作为参数通过构造函数为对象中的value赋值
c.increment();
c.print();//题目要求验证所以使用输出函数一次验证value的值
c.decrement();
c.print();
return0;
}
4.
定义一个类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."<(2)中要求的重载构造函数
ClsName(inta){cout<<"Constructby1number."<ClsName(void){cout<<"Constructwithoutanumber."<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);
t1.print();
t1.setx();t1.sety();
t1.print();
cout<<"\nTest2:
Inputwithanumbers,nowpleaseinputanumber:
";
cin>>a;
ClsNamet2(a);
t2.print();
t2.setx();t2.sety();
t2.print();
cout<<"\nTest3:
Withoutnumbers";
ClsNamet3;
t3.print();
t3.setx();t3.sety();
t3.print();
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*3.14);}
doublevolume(){return(height*area());}
voidprint(){cout<<"Area="<
private:
doubleradius,height;
};
intmain()
{
inta,b;
cylinderv;
cout<<"Radius=";
cin>>a;
cout<<"Height=";
cin>>b;
v.set(a,b);
v.print();
return0;
}
6.
定义一个学生类CStudent实现简单的学籍管理功能,要求该类至少实现以下功能:
(1)录入学生的基本信息(包括,学号,性别,年龄,专业,入学时间,各门功课成绩)
(2)输出学生的基本信息
(3)选课(输入时间和所选的课程)
(4)统计每门课的学分绩点
(5)统计每学期的平均学分绩点
(6)统计重考科目
(7)统计重修科目
#include
#include
usingnamespacestd;
constMAX=4;
classCStudent{
stringname,sex,ID,object,jtime;//分别存储性别学号专业入学时间
intage;//存储年龄
intmark[MAX];//设立一个数组存放成绩
stringsbj[MAX];//设立string数组来存放科目名称
intretry,redo;//统计重考重修数量
stringt_chose,s_chose;//存放选课时间和选课名称
intm_point[MAX],m_mark[MAX];//存放每门功课的学分和绩点
intmarker[MAX];//存放重修科目的角标(有时不止挂掉一科可能会很多所以声明称数组)
为什么建立数据时使用的数组?
通过对角标的控制便可以把一行数据全部对应起来
请看下面数据对应关系:
角标
科目名称(sbj[i])
成绩(mark[i])
学分(m_mark[i])
0
数学
44
6
1
C语言
92
6
2
英语
72
4
便于统计也可以方便地调用出一门科目的全部内容
intmarker2[MAX];//存放重修科目角标
public:
CStudent()
{
cout<<"构造CStudent开始录入基本信息"<cout<<"Name:
";cin>>name;
cout<<"ID:
";cin>>ID;
cout<<"Sex:
";cin>>sex;
cout<<"Age:
";cin>>age;
cout<<"YourObject:
";cin>>object;
cout<<"Timeyoujointhecolleage:
";cin>>jtime;
cout<<"Nowpleaseinputyourmarks."<for(inti=0;i{
cout<<"Subjectname:
";cin>>sbj[i];
cout<<"Mark:
";cin>>mark[i];
}
}
voidbaseprint()//按
(2)要求输出基本信息
{
cout<<"基本信息:
"<cout<<"学生:
"<"<"<cout<<"入学时间:
"<"<