收藏 分享(赏)

天津理工大学C++期末考试.doc

上传人:HR专家 文档编号:11468740 上传时间:2020-05-09 格式:DOC 页数:35 大小:339.01KB
下载 相关 举报
天津理工大学C++期末考试.doc_第1页
第1页 / 共35页
天津理工大学C++期末考试.doc_第2页
第2页 / 共35页
天津理工大学C++期末考试.doc_第3页
第3页 / 共35页
天津理工大学C++期末考试.doc_第4页
第4页 / 共35页
天津理工大学C++期末考试.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、实验一 一、 明确的概念:(1)理解类和对象的概念;(具体见附一) 类是抽象的 对象是具体的 例如:你、我、他 都是人 那么 你、我、他就是对象 人就是类(2)掌握类与对象的定义方法; 类的定义:class 类名 /*定义这个类*/; /(别忘了最后的分号) 对象的定义: 类名 对象名(参数);(3)理解类的成员的访问控制的含义,公有和私有成员的区别; public:/访问属性为公有 通过外部直接访问 即:对象名.成员名或成员函数 private:/访问属性为私有 不能通过外部直接访问(不声明访问属性时 系统默认为私有) 当出现对象名.成员(私有)时 编译器报错 protected:/访问属性

2、为保护 与private类似 但protected属性的成员可以继承 private不能继承(4)掌握构造函数和析构函数的含义与作用、定义方式和实现; 构造函数:为数据成员开辟存储空间函数名必须与类名相同 之前绝对不许说明返回值类型 void也不行构造函数不能由用户调用 即:对象名.构造函数名(参数)是错误的 构造函数是随着对象的声明而调用的例如:class StudentStudent()cout”Hello.”endl;Int main(void)cout”Hello.”endl;Student A;运行结果:Hello./-这个Hello是主函数中的Hello./-是声明A对象时调用的构

3、造函数 构造函数中的Hello 析构函数功能与构造函数相反 注意调用时间和顺序(看书)附:如何知道 该程序析构函数的调用顺序是p3 p2 p1 ?答:将拷贝构造函数中 改为x=2*p.x; y=2*p.y析构函数中 在cout”Destructor is called.”之后添加”x=”x” y=”y后面的不变运行时 析构函数输出结果变为:Destructor is called. x=12 y=16Destructor is called. x=6 y=8Destructor is called. x=3 y=4Press any key to continue由此可知其调用顺序或者在拷贝构

4、造函数和析构函数中的cout语句的 endl; 之前加入this 来输出对象地址 再对号入座也可知调运顺序二、 练习项目1.输入下列程序,按要求进行实验,并记录实验的结果。#include using namespace std;class Coordinatepublic:Coordinate(int x1, int y1)x=x1; y=y1;Coordinate(Coordinate &p);Coordinate()coutDestructor is called.endl;int getx()return x;int gety()return y;private:int x, y;Co

5、ordinate:Coordinate(Coordinate &p)/拷贝构造函数x=p.x; y=p.y;coutCopy initianization constructor is called.endl;运行结果:Copy initianization constructor is called.Copy initianization constructor is called.p3=(3,4)Destructor is called.Destructor is called.Destructor is called.Press any key to continue调用构造函数调用拷贝

6、构造函数(见书P89)int main()Coordinate p1(3,4);Coordinate p2(p1);Coordinate p3=p2;coutp3=(p3.getx(),p3.gety()endl;程序结束时 调用析构函数 注意析构函数的调用顺序 从上至下 依此为 p3 p2 p1的析构函数return 0;(1) 记录程序的运行结果(2) 将Coordinate类中带有两个参数的构造函数进行修改,在函数体内增加如下语句:cout”Constructor is called.”endl;重新记录程序的运行结果,并解释输出结果。(3) 按下列要求进行测试。在主函数体内,添加如下语

7、句:Coordinate p4; 错误原因:构造函数没有参数 构造函数为Coordinate:Coordinate(int ,int)Coordinate p5(2); 错误原因:参数数量不对2.根据注释语句的提示实现类Date的成员函数,并将完整的程序编译、连接成功以保证程序能够正确运行。#include class Datepublic:void printDate();/显示日期分析:1.题目中 Date类的数据成员为day, month, year 且均为整型访问属性为私有 主函数中声明了testDay对象2.数据成员均为私有 则不能通过tesDay.day=的方法来设置 题目中给出了

8、 void setDay(int) void setMonth(int) 和void setYear(int)三个成员函数去是指day month 和 year 的值 还有一个void printDate()来输出3.准备工作结束 开始编程 看程序 仅差4个成员函数未定义 类外定义 要写出作用域 即该函数属于哪个类: 格式: 返回值类型 作用域:函数名 参数表 void Date:setDay (int d)/*定义时必须要给形参一个名字 这里给的是*/d day=d/设置了day的值 其他函数依此类推 输出函数就不用再唠叨了4.验证结果 出现溢出数据时查看是否写反了 例如写成d=day 了解

9、设置函数的作用机制 见附二void setDay(int);/设置日的值void setMonth(int); /设置月的值void setYear(int); /设置年的值private:int day, month, year;int main()Date testDay;testDay.setDay(5);testDay.setMonth(10);testDay.setYear(2010);testDay.printDate();void Date:setDay(int d)day=d;void Date:setMonth(int m)month=m;void Date:setYear(

10、int y)year=y;void Date:printDate()coutyear/month/dayendl;3.下面是一个计算器类的定义,请完成该类的成员函数的实现,并设计一个主函数使用该类和相关成员函数以测试该类设计的正确性。#include using namespace std;class counterpublic:counter(int number=0)/构造函数value=number; void increment();/给value原值加1void decrement();/给value原值减1int getvalue();/取得计数器值int print();/显示计

11、数private:int value;/数据成员;void counter:increment()value+;coutThe counter has increased by 1endl;/(其中的cout语句可以不写)void counter:decrement()value-;coutThe counter has decreased by 1endl;int counter:getvalue()return value;int counter:print()coutnDisplay:getvalue()endlendl;return 0;int main()couta;counter

12、c(a); /输入a 并将a作为参数 通过构造函数为对象中的value赋值c.increment();c.print();/题目要求验证 所以使用输出函数一次验证value的值c.decrement();c.print();return 0;4.定义一个类ClsName,要求该类设计如下:(1)该类有两个整型数据成员x和y;(2)为该类重载三个不同的构造函数:分别为无参数、带一个参数和带两个参数的构造函数,要求在构造函数中输出必要的信息以示区别;(3)设计2个成员函数用来读取数据成员x和y;(4)设计2个成员函数用来设置数据成员x和y;(5)设计1个成员函数用来在屏幕上打印输出数据成员x和y;

13、(6)在main()函数中用三个不同的构造函数创建3个对象,并使用所有的成员函数对这些对象进行必要的操作。class ClsNamepublic:int a,b;ClsName(int a,int b)coutConstruct by two numbers.endl;x=a,y=b;/以下三个(2)中要求的重载构造函数ClsName(int a)coutConstruct by 1 number.endl;x=a,y=b;/题目要求加以区别,所以cout输出不同内容加以区分ClsName(void)coutConstruct without a number.endl;x=a,y=b;int

14、 getx()return x;因为x,y的访问属性为私有,不能由主函数直接访问 所以会设置读取函数专门负责返回相应的值重载:函数名相同,参数的类型不同或者个数不同、或者都不同。 即根据带入参数的类型、数量的不同,来实现不同的功能int gety()return y;void setx()coutx;void sety()couty;void print()coutX=getx()tY=gety()endl;private:int x,y;(1)中要求的两个整型数据成员;int main()int a,b;coutTest1:Input with 2 numbers, now please i

15、nput two numbers:a;cinb;ClsName t1(a,b);t1.print();t1.setx();t1.sety();t1.print();couta;ClsName t2(a);t2.print();t2.setx();t2.sety();t2.print();coutnTest3:Without numbers;ClsName t3;t3.print();t3.setx();t3.sety();t3.print();return 0;5.建立类cylinder,包括两个数据成员radius和height,分别表示圆柱体的半径和高度, cylinder类的构造函数被传

16、递了两个double值来初始化这两个成员;定义成员函数area()和volume用来求圆柱体的表面积和体积,定义成员函数print()打印cylinder类的相关信息。最后,在主函数中对cylinder类的设计进行测试。这题很简单 没啥说的#includeclass cylinderpublic:void set(double r,double h)radius=r,height=h;double area()return (radius*3.14);double volume()return (height*area();void print()coutArea=area()tVolume=

17、volume()endl;private:double radius,height;int main()int a,b;cylinder v;couta;coutb;v.set(a,b);v.print();return 0;6.定义一个学生类CStudent实现简单的学籍管理功能,要求该类至少实现以下功能:(1) 录入学生的基本信息(包括姓名,学号,性别,年龄,专业,入学时间,各门功课成绩)(2) 输出学生的基本信息(3) 选课(输入时间和所选的课程)(4) 统计每门课的学分绩点(5) 统计每学期的平均学分绩点(6) 统计重考科目(7) 统计重修科目#include#includeusing

18、 namespace std;const MAX=4;class CStudentstring name,sex,ID,object,jtime;/分别存储姓名 性别 学号 专业 入学时间int age;/存储年龄int markMAX;/设立一个数组存放成绩string sbjMAX;/设立string数组来存放科目名称int retry,redo;/统计重考重修数量string t_chose,s_chose;/存放选课时间和选课名称int m_pointMAX,m_markMAX;/存放每门功课的学分和绩点int markerMAX;/存放重修科目的角标(有时不止挂掉一科 可能会很多 所

19、以声明称数组)为什么建立数据时使用的数组?通过对角标的控制 便可以把一行数据全部对应起来请看下面数据对应关系:角标科目名称(sbji)成绩(marki)学分(m_marki)0数学4461C语言9262英语724 便于统计也可以方便地调用出一门科目的全部内容int marker2MAX;/存放重修科目角标public:CStudent()cout构造CStudent 开始录入基本信息endl;coutname;coutID;coutsex;coutage;coutobject;coutjtime;coutNow please input your marks.endl;for(int i=0;

20、iMAX;i+)coutsbji;coutmarki;void baseprint()/按(2)要求 输出基本信息cout基本信息:endl;cout学生姓名:namet学号:IDt年龄:aget性别sexendl;cout入学时间:jtimet专业:objectendl;cout成绩:endl;for(int i=0;iMAX;i+)coutsbji:markit;coutendl;void chose()/按(3)要求 设置选课函数couts_chose;coutt_chose;void Point()/按(4)要求 for(int i=0;iMAX;i+)cout请设置sbjim_mar

21、ki;coutendl;coutendl;int score=0,j=0;/给score赋初值 防止溢出 因为后面有score+=.相当于score=score+. 无法确定第一个score的值retry=0;for(i=0;i=60)score+=m_marki;/成绩及格垒加学分else retry+;markerj+=i;/否则不及格 便要重考 将重考数量自增/其中markerj+=i是将当时重修科目的角标记录下来float s=0;for(i=0;iMAX;i+)if(m_mark=0)m_pointi=0;coutsbji学分绩点均为0endl;continue;float(m_po

22、inti=4-(100-(float)marki)*(100-(float)marki)/1600);/绩点的计算方法s+=m_pointi;coutsbji所获学分:m_markit绩点:m_pointiendl;cout平均绩点为:s/MAXendl;coutendl;void check()if(retry=0)cout无重考科目;elsecout重考数目为:retry包括endl;for(int i=0;iretry;i+)coutsbjmarkerit;coutendl;redo=0;coutendl;int temp,j=0;cout输入重考分数endl;for(i=0;iretr

23、y;i+)coutsbjmarkeritemp;if(temp60)redo+;marker2j+=markeri;coutendl;if(redo=0)cout无重修科目;elsecout重修数目为:redo包括endl;for(i=0;iredo;i+)coutsbjmarker2it;coutendl;int main(void)CStudent a;a.baseprint();a.chose();a.Point();a.check();return 0;注意:(1)新设计的类中所需要的数据成员需要根据所要实现的功能自行设计;(2)用一个演示程序完成对所设计的新类的功能测试,并给出测试数

24、据和实验结果;(3)为增加程序可读性,请在程序中对类成员进行适当注释说明;补充实验题:(1)教材134页【3.33】-【3.36】实验二 (2010-3-23)实验名称:复杂形式的对象。实验目的:(1)掌握对象数组、对象指针和string类的使用方法;把对象想象成一种数据类型 比如整型 有整型数组吧(int a10)自然也有对象数组对象指针以以上类似 有时涉及到动态联编()String类 不如说是string类型 类似于智能化的字符串数组(2)掌握对象数组、对象指针和对象引用作为函数参数的使用方法;主要看书 实际用的不多 注意对象数组初始化方法(书P77中上的说明)(3)掌握类对象作为成员的使

25、用方法;了解就行(4)掌握友元的概念和使用方法;通常的,通过A对象想要访问B对象的私有成员是不可能的 而通过友元就可以做到需要注意的是 友元函数虽然在类内声明 但是友元函数不是成员函数 独立于类外 所以类外定义是不能加作用域“:”另外,由于使用的Visual C+6.0不是完全使用C+标准 编程时如果遇到 报错内容为一堆大写字母 且错误位置指向友元函数的话 把#include using namespace std;改为#include 还有!只有上述情况才可以把头文件加上“.h”,否则会导致部分功能不正常(5)掌握静态数据成员和静态成员函数的使用方法;例如:有Object类,拥有数据成员a,

26、由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几点说明练习项目3

27、5Time类的框架定义如下:#include/Powered by Zuki & X.Dukeclass Time/声明Time类public:Time(int A=0,int B=0,int C=0) / 带默认参数的构造函数hour=A;minute=B;second=C;/ set functionsvoid setTime(int a,int b,int c)/ 设置hour, minute, secondcoutRun Setime Function=24|a0)cout小时输入错误 再来一次a;else break;hour=a; void setMinute(int a)/ 设置

28、minute (确保数据在合理范围)for(;)if(a=60|a0)coutn分钟输入错误 再来一次a;else break;minute=a; void setSecond( int a)/ 设置second (确保数据在合理范围)for(;)if(a=60|a0)cout秒输入错误 再来一次a;else break;second=a; / get functions int getHour()/ 返回 hourreturn hour; int getMinute()/ 返回 minute return minute; int getSecond()/ 返回 secondreturn se

29、cond; void printUniversal()/ 按24小时格式输出时间:23:56:12 coutgetHour():getMinute():getSecond()12)cout(hour-12):minute:second(PM)endl;elsecouthour:minute:second(AM)endl;private:int hour;/ 0 - 23 (24小时格式)int minute; / 0 - 59int second; / 0 - 59; / Timel类定义结束int main()Time t;int a,b,c;couta;coutb;coutc;t.setT

30、ime(a,b,c);t.printStandard();t.printUniversal();return 0;2.设计一个用来表示直角坐标系的Location类,在主程序中创建类Location的两个对象A和B,要求A的坐标在第3象限,B的坐标点在第2象限,分别采用成员函数和友元函数计算给定两个坐标点之间的距离,要求按如下格式输出结果:A(x1, y1), B(x2, y2)Distance1=d1Distance2=d2其中:x1, x2, y1, y2为指定的坐标值,d1和d2为两个坐标点之间的距离。Location类框架可参考如下:#include#includeclass Loca

31、tion/声明类Locationpublic:Location(double,double);/构造函数double Getx();/成员函数,取x坐标的值double Gety();/成员函数,取y坐标的值double distance1(Location&);/成员函数,求两坐标点之间的距离friend double distance2(Location &A, Location &B)/友元函数,求两坐标点之间的距离return sqrt(A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);Location(void)coutDestrcted.;private

32、:double x,y;Location:Location(double a,double b)x=a;y=b;double Location:Getx()return x;double Location:Gety()return y;double Location:distance1(Location &L)return sqrt(L.x-x)*(L.x-x)+(L.y-y)*(L.y-y);int main()double a,b;cout输入A点坐标(在第二象限):endl;coutx(xa;if(a0)break;cout不对,再来一次:;cout0):;for(;)cinb;if(b

33、0)break;cout不对,再来一次:;Location A(a,b);cout输入B点坐标(在第四象限):endl;cout0):;for(;)cina;if(a0)break;cout不对,再来一次:;couty(yb;if(b0)break;cout不对,再来一次:;Location B(a,b);coutA(A.Getx(),A.Gety()endl;coutB(B.Getx(),B.Gety()endl;coutDistance1=A.distance1(B)endl;coutDistance2=distance2(A,B)endl;return 0;3.使用C+的string类,

34、将5个字符串按逆转后的顺序显示出来。例如,逆转前的5个字符串是:Germany Japan America Britain France逆转后的顺序输出字符串是:France Britain America Japan Germany#include#includeusing namespace std;int main(void)string str1,str2,str3,str4,str5;cinstr1str2str3str4str5;coutstr5 str4 str3 str2 str1endl;return 0;4.设计一个模仿类magic来实现4*4的魔方阵。类的框架如下:#in

35、cludeusing namespace std;class magic/声明魔方阵类magicpublic:void getdata();/输入初值成员函数void setfirstmagic();/设置初始魔方成员函数int generate();/生成最终魔方成员函数int printmagic();/显示魔方成员函数private:int m44;int step;int first;int sumj;void magic:getdata()coutfirst;coutstep;void magic:setfirstmagic()int temp;temp=m00=first;for(

36、int i=0,j=0;i4;i+)for(j=0;j4;j+)if(i=0&j=0)continue;temp+=step;mij=temp;sumj=m00+m33;int magic:generate()int i,j;for(i=0,j=3;i4;i+,j-)mij=sumj-mij;mii=sumj-mii;return 0;int magic:printmagic()coutendl;for(int i=0,j;i4;i+)for(j=0;j4;j+)coutmijt;coutendl;return 0;int main(void)magic m;m.getdata();m.setfirstmagic(

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

当前位置:首页 > 网络科技 > 计算机原理

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报