《C面向对象程序设计实验指导书.doc》由会员分享,可在线阅读,更多相关《C面向对象程序设计实验指导书.doc(81页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C+面向对象程序设计实验指导书(v1.0)刘恒洋 谭智编重庆工学院计算机学院2007年9月目录绪论10.1 写本书的目的10.2 本书的结构安排10.3 如何使用本书2实验一 C+基础31.1 实验目的31.2 实验内容31.2.1 程序阅读31.2.2 程序设计51.3 思考题5实验二 类和对象类的构建62.1 实验目的62.2 实验内容62.2.1程序阅读62.2.2 程序设计82.3思考题8实验三 类和对象构造函数与析构函数93.1 实验目的93.2 实验内容93.2.1程序阅读93.2.2 程序设计103.3思考题11实验四 类和对象对象传递与静态成员124.1 实验目的124.2 实
2、验内容124.2.1程序阅读124.2.2 程序设计15实验五 派生与继承单重派生165.1 实验目的165.2 实验内容165.2.1程序阅读165.2.2 程序设计18实验六 派生与继承多重派生196.1 实验目的196.2 实验内容196.2.1程序阅读196.2.2 程序设计226.3思考题22实验七 多态性函数与运算符重载237.1 实验目的237.2 实验内容237.2.1程序阅读237.2.2 程序设计257.3思考题26实验八 多态性类型转换与虚函数278.1 实验目的278.2 实验内容278.2.1程序阅读278.2.2 程序设计298.3思考题29实验九 模板类的构造30
3、9.1 实验目的309.2 实验内容309.2.1程序阅读309.2.2 程序设计329.3思考题32实验十 C+的I/O流类库3310.1 实验目的3310.2 实验内容3310.2.1程序阅读3310.2.2 程序设计3410.3思考题34实验十一 C+程序、Windows程序和MFC程序3611.1 实验目的3611.2 实验内容3611.2.1 实验描述3611.2.2 实验步骤3711.2.3 实验结果分析4311.3思考题45实验十二简单单文档MFC程序设计4612.1 实验目的4612.2 实验内容4612.2.1 实验描述4612.2.2 实验步骤4712.2.3 实验结果52
4、12.3思考题53实验十三简单对话框程序设计5413.1 实验目的5413.2 实验内容5413.2.1 实验描述5413.2.2 实验步骤5413.2.3 实验结果6113.3思考题61实验十四简单数据库程序设计6314.1 实验目的6314.2 实验内容6314.2.1 实验描述6314.2.2 实验步骤6414.2.3 实验结果7114.3思考题72综合练习73总结74参考书目75绪论0.1 写本书的目的面向对象程序设计语言是现今最流行的编程语言之一,C+语言是作为最早最流行的面向对象编程语言之一而发展起来的。学好C+语言不仅可以从面向过程的程序设计思想过渡到面向对象的程序设计思想,而且
5、可以为以后学习其它的面向对象语言打下坚实的基础,使得学习其它的面向对象编程语言变得轻松、容易。实验作为学习C+语言不可缺少的一个环节不仅可以加深学生对C+面向对象思想的理解,同时可以提高学生的动手编程能力,培养学生良好的编码习惯。目前关于C+语言的理论教材比较多,但是适合学生练习的实验指导书却比较少,这严重影响了学生对C+这门课程的学习。大多数情况下,学生学习C+语言之前都刚刚学习过C语言程序设计这门课程,从编程环境到编程语言同时转换过来需要一定的时间和合理的指引,同时在学习C+理论知识的过程中,学生很少也很难把C+程序设计和现在社会上比较流行的基于VC6.0的MFC程序设计联系起来,所以很难
6、让学生在学习C+语言的同时,提升学生基于VC6.0的MFC程序设计的能力。编写本书的目的就是从以上几点来考虑的,首先要把学生从以前的编程环境中脱离出来,然后循序渐进地介绍新的编程环境的新知识点,同时把C+的语法结构融入到基于VC6.0的MFC程序设计中去,从而实现学生轻松掌握C+这门程序设计语言和习惯编程环境以及理解C+语法和MFC之间的关系的目的,从而提高学生的程序设计能力和学生程序设计的成就感。0.2 本书的结构安排实验课程的安排离不开理论课程的学习,本书的编排以知识点为核心,理论教材蓝本为C+面向对象程序设计教程(第2版)陈维兴 林小茶编著,清华大学出版社出版。通过为不同的知识点设计相应
7、的实验程序,来达到学生练习和理解C+语言面向对象的思想的目的,同时本书还设计了一些程序设计课后练习题,设计本部分有三个目的:一个是有些课堂练习中没有办法练习到的知识点将在这部分体现,指导老师可以根据需要来增删课堂的讲解内容;另一个是为一部分有能力有兴趣深入学习C+程序设计的同学提供一些练习题,从而提升这部分学生的程序设计能力;第三就是避免有些学生在做实验的过程中盲目按照指导书中的步骤一步一步地不加思考地写程序,学生要回答这些问题,就必须看懂这些程序中隐含的知识点,从而达到理论知识和实践知识更好地结合。对于课堂练习,本书共安排了十个实验,共32个学时,实验安排如下:实验一C+基础(2学时)实验二
8、类和对象类的构建(2学时)实验三类和对象构造函数与析构函数(2学时)实验四类和对象对象传递与静态成员(2学时)实验五派生与继承单重派生(2学时)实验六派生与继承多重派生(2学时)实验七多态性函数与运算符重载(2学时)实验八多态性类型转换与虚函数(2学时)实验九模板类的构造(2学时)实验十C+的I/O流类库(2学时)实验十一C+程序、Windows程序和MFC程序(3学时)实验十二简单单文档MFC程序设计(3学时)实验十三简单对话框程序设计(3学时)实验十四简单数据库程序设计(3学时)另外本书还安排了第三部分综合练习,作为学生提高部分,学生通过第三部分的练习不仅可以巩固前面学到的基本知识,还可以
9、扩充相关方面的程序设计知识,更为重要的是可以让学生自主地设计一个完整的系统,从而达到提高学生综合程序设计能力的目的。0.3 如何使用本书面向对象程序设计语言出现的目的就是为了设计大型的软件系统,但是教学过程中很难让学生在课堂上实现一个大型的(甚至是成型)的系统,所以作为教师应该引导学生在实现一个简单的功能性的程序的同时让学生思考,思考如何把这个地方的技术实现到一个复杂的应用系统中去;另外教师要充分利用本书中第二部分的练习,引导学生去思考如何利用C+的相关技术从头到尾设计一个具有实用价值的应用程序。作为学生如果只是简单地按照本书中提供的步骤一步一步完成某一个程序,而不去思考为什么要这样做的话,那
10、么学生能学到的知识也仅仅是C+的语法而已,并不能真正理解C+面向对象的思想,最终不能设计出好的程序来。所以学生不仅要全部实现本书中的课堂练习,得出正确的结果,而且在完成了程序后还要思考本程序为什么要这样设计,如果换成其它的程序设计语言会怎么实现,只有这样才能够真正理解C+的精髓,从而掌握C+。另外学生在学习最后四个实验的时候一定不要忘记前面C+语法知识,能否合理地将C+的三大特性运用到MFC的程序设计中是提高程序运行效率,存储效率和程序封装性一个最有效的手段。学生在设计本实验指导书第三部分程序的时候,需要自己查阅相关方面的技术资料才能完成相关功能,因为安排这部分的目的就是为了提升学生自主学习的
11、能力和综合程序设计能力,因此这部分的内容并没有安排相关理论知识的讲解。另外教师也可以把这部分的内容用于学生课程设计的程序设计题目。注:本书中所有的程序都采用VC+6.0(英文版)编程环境,并且全部在该环境下编译运行通过!实验一 C+基础1.1 实验目的1进一步了解和熟悉VC+6.0开发环境,学会在VC+6.0环境下调试程序;2熟悉C+中简单的标准输入输出函数的实用;3理解const修饰符的作用,并学会应用const修饰符;4理解内置(内联)函数的优缺点并学会使用内置函数;5理解和使用函数重载以及带默认参数的函数;6使用new和delete进行动态内存管理;7理解和使用引用。1.2 实验内容1.
12、2.1 程序阅读1理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include int max_def(int x, int y)return (xy?x:y);int max_def(int x, int y, int z)int temp = 0;return (temp=(xy?x:y)z?temp:z;double max_def(double x, double y)return (xy?x:y);int main()int x1 = 0;int x2 = 0;double d1 = 0.0;double d2 = 0.0;x1 = max_def(5,6);
13、x2 = max_def(2,3,4);d1 = max_def(2.1,5.6);d2 = max_def(12.3,3.4,7.8);-coutx1=x1endl;coutx2=x2endl;coutd1=d1endl;coutd2=d2endl;-return 1;问题一:上述程序的输出结果是什么?问题二:哪些情况可以参与函数的重载?函数参数的类型不同,或者参数的个数不同,或者二者兼而有之。问题三:处调用的是哪个函数?调用的是def(int x, int y, int z)这个函数。问题四:处的输出结果为什么是d2=12,而不是d2=12.3?因为调用的是def(int x, int y
14、, int z)这个函数,所以输出值为整型。2理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include int main()int *p1 = new int; -int *p2 = new int(0); -char *p3 = new char64; -delete p3;return 1;问题一:、处动态申请内存分别代表什么不一样的意思?1处代表new动态分配存放一个整数的内存空间,并将其首地址赋给指针变量p1.2处代表new动态分配内空间,并将0作为初始值赋给首地址p2。3处代表new动态分配存放数组的内存空间,并将首地址赋给指针变量p3.问题二:该程序存在
15、什么隐患?改正该程序使隐患消除。没有释放动态分配的数组存储空间,同意导致没有足够的内存满足分配要求,导致动态分配空间失败。3理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include void swap(int a, int b)int temp = a;a = b;b = temp;void swap(int *a, int *b)int temp = *a;*a = *b;*b = temp;int main()int i = 5;int j = 10;coutBefore swap: i=i,j=jendl;swap(i,j); -coutAfter the f
16、irst swap: i=i,j=jendl;swap(&i,&j); -coutAfter the second swap: i=i,j=jendl;return 1;问题一:上述程序的输出结果是什么?问题二:处函数调用后并不能实现两个数的交换,而处却可以,为什么?因为1处调用的函数是void swap(int a, int b),i、j将值传给a、b后,a、b值的交换与i、j无关所以不能实现两个数的交换。2处调用的函数是void swap(int *a, int *b),将i、j地址传给*a、*b,*a、*b交换数值即交换i、j地址,所以i、j值交换了。问题三:处调用的是哪个重载函数?调用
17、void swap(int *a, int *b) 这个函数。1.2.2 程序设计1使用函数重载的方法定义两个重名函数,分别求出整形数平面间两点间距离和双精度平面间两点间距离,如果没有输入第二点的坐标则默认为圆点(0,0)。#include int fun_c(int i0,int j0,int i1,int j1)return (i0-i1)*(i0-i1)+(j0-j1)*(j0-j1);double fun_c(double x0,double y0,double x1,double y1)return (x0-x1)*(x0-x1)+(y0-y1)*(y0-y1);int main()
18、int i0=1,i1=2,j0=3,j1=4;/(i0,j0) (i1,j1)分别为两个点double x0=1.1,x1=2.2,y0=3.3,y1=4.4;/(x0,y0) (x1,y1)分别为两个点cout距离为fun_c( i0, j0, i1, j1)endl;cout距离为fun_c( x0, y0, x1, y1)endl; return 0;2设计一个函数:exchange(float x, float y, float z),当调用exchange(a,b,c)时,将a的内容赋值给b,b的内容赋值给c,c的内容赋值给a,要求采用引用的方式来实现。#include void
19、exchange(float &x, float &y, float &z)float temp = x;x=z;z=y;y = temp;int main()float a= 5;float b = 10;float c=15;coutBefore exchange: a=a,b=b,c=cendl;exchange(a,b,c);coutAfter the first exchange: a=a,b=b,c=cendl;return 1;1.3 思考题1自己设计一个程序,测试const的三种用法:指向常量的指针,常指针,指向常量的常指针。2编写一个函数,实现两个字符串变量的交换,要求参数用
20、引用。实验二 类和对象类的构建2.1 实验目的1类的定义;2类对象的使用;3类成员变量的定义和使用;4类成员函数的定义和使用;5理解类的作用域;6理解类的声明;7理解类中private和public权限的声明依据。2.2 实验内容2.2.1程序阅读1理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include class CDatevoid Set(int m, int d, int y ) month = m ; day = d ; year = y ; int IsLeapYear() return (year%4 = 0 & year%100 != 0)|(yea
21、r%400 = 0); public:void Print() coutmonth/day/yearendl;private:int month; int day; int year;void main()CDate a; - a.Set(10,15,2007) ; a.Print();问题一:以上程序编译能通过吗,为什么,应该如何改正?问题二:类CDate中分别有哪些成员函数和成员变量,它们分别属于哪种访问权限?问题三:处语句的意思是什么?2理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include int month;/全局变量 int day; int year
22、;void Set(int m,int d,int y) -a:month=m; -:day=d; :year=y;class CDatepublic: void Set(int m,int d,int y) -b :Set(m,d,y); -void Print() coutmonth/day/yearendl;private: int month; /成员变量int day; int year;void main()CDate a; a.Set(10,15,2007) ;a.Print();问题一:处是在给成员变量赋值,还是在给全局变量赋值,如果去掉域作用符:,程序是否还能正确运行?问题二
23、:处调用的哪个函数,如果去掉域作用符:,程序是否还能正确运行?问题三:该程序的输出结果是什么,试解释该输出结果。2.2.2 程序设计1试设计一个复数类,该类有实部和虚部两个成员数据,成员数据采用私有访问权限,同时该类有两个共有成员函数,分别用来设置成员数据和输出成员数据,在主函数中分别采用对象方式,指针方式和引用方式来调用该类的公有函数设置和输出成员数据。2.3思考题1试指出以下程序的错误,并改正之。#include class CPointpublic:unsigned x,unsigned y; bool IsInCircle(CCircle *Circle) return (x-Circ
24、le-Center.x)*(x-Circle-Center.x)+(y-Circle-Center.y)*(y-Circle-Center.y)Radius*Circle-Radius);class CCirclepublic: unsigned Radius; CPoint Center;void main()实验三 类和对象构造函数与析构函数3.1 实验目的1理解掌握this指针的作用和用法;2理解掌握构造函数的定义和作用;3掌握构造函数的使用;4理解掌握拷贝构造函数的定义和使用;5理解掌握构造函数的重载;6理解掌握析构函数的定义和使用。3.2 实验内容3.2.1程序阅读1理解下面的程序,
25、并在VC+6.0下运行查看结果,回答程序后面的问题。#include class CPointpublic:void Set(int x,int y);void Print();private:int x;int y;void CPoint:Set(int x,int y)x = x;y = y;void CPoint:Print()coutx=x,y=yendl;void main()CPoint pt;pt.Set(10,20);pt.Print();问题一:以上程序编译能通过吗,试解释该程序?问题二:以上程序的运行结构是否正确,如果不正确,试分析为什么,应该如何改正?2理解下面的程序,并
26、在VC+6.0下运行查看结果,回答程序后面的问题。#include class CPersonpublic:void Print();private:CPerson();private:int age;char *name;CPerson:CPerson()void CPerson:Print()coutname=name,age=ageendl;void main()CPerson ps(23,张三);ps.Print();问题一:以上程序存在三处大错误,在不改变主函数内容的前提下,试改正该程序。3.2.2 程序设计1设计实现一个CPoint类,满足以下要求:a 该类包含两个整型成员变量x(
27、横坐标)和y(纵坐标),以及一个输出函数Print()用来输出横坐标和纵坐标,要求不可以在类的外部直接访问成员变量;b可以采用没有参数的构造函数初始化对象,此时的成员变量采用默认值0;c可以采用直接输入参数的方式来初始化该类的成员变量;d可以采用其它的CPoint对象来初始化该类的成员变量;e设计一个主函数来测试以上功能。3.3思考题1设计一个CStudent(学生)类,并使CStudent类具有以下特点:a该类具有学生姓名、学号、程序设计、信号处理、数据结构三门课程的成绩;b学生全部信息由键盘输入,以提高程序的适应性;c通过成员函数统计学生平均成绩,当课程数量增加时,成员函数无须修改仍可以求
28、取平均成绩;d输出学生的基本信息、各科成绩与平均成绩;e学生对象的定义采用对象数组实现; f统计不及格学生人数。实验四 类和对象对象传递与静态成员4.1 实验目的1理解静态成员(静态数据成员、静态成员函数)的作用与使用;2理解友元(友元函数、友元类)的作用于使用;3理解常类型的使用。4.2 实验内容4.2.1程序阅读1理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include #include class CStudentpublic:CStudent(char *n, int a);CStudent();static void SetAge(int age);pri
29、vate:char *name;int age;static int nTotalObj;int CStudent:nTotalObj = 0;CStudent:CStudent(char *n, int a):age(a)int nLen = strlen(n);name = new charnLen+1;strcpy(name,n);namenLen = 0;nTotalObj+;CStudent:CStudent()delete name;nTotalObj-;void CStudent:SetAge(int age)this-age = age;void main()CStudent
30、stu1(张三,25);CStudent str2(李四,26);coutCStudent:nTotalObj=CStudent:nTotalObjendl;问题一:以上程序编译能通过吗,为什么?问题二:成员变量nTotalObj在程序中起什么作用,它是如何实现的?问题三:如果规定该程序的主函数和类CStudent中的成员变量的属性不允许改变,应该如何改正该程序?2理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include #include class CStudentpublic:CStudent(char *n, int a);CStudent();private
31、:char *name;int age;CStudent:CStudent(char *n, int a):age(a)int nLen = strlen(n);name = new charnLen+1;strcpy(name,n);namenLen = 0;CStudent:CStudent()delete name;class CTeacherpublic:CTeacher(char *tn, int ta);CTeacher();void SetStuAge(int a);private:char *name;int age;CStudent stu;CTeacher:CTeacher
32、(char *tn, int ta):age(ta)int nLen = strlen(tn);name = new charnLen+1;strcpy(name,tn);namenLen = 0;CTeacher:CTeacher()delete name;void CTeacher:SetStuAge(int a)stu.age = a;void main()CStudent stu(张三,25);CTeacher tea(李四,26);问题一:以上程序有两大错误,试指出来,并改正之?3理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include iostream.
33、hclass Dateprivate:const int year;const int month;const int day;public:Date(int y,int m,int d);void showdate();Date:Date(int y,int m,int d)year = y;month = m;day = d;void Date:showdate()coutyear/month/dayendl;void main()const Date obj(2007,10,30);obj.showdate();问题一:以上程序有两大错误,试指出来,并改正之(要求主函数和类Date的数据
34、成员属性不可以改动)?4.2.2 程序设计1某商店经销一种货物。货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,因此,商店需要记录下目录库存的总重量。试用C+模拟商店货物购进和卖出的情况。实验五 派生与继承单重派生5.1 实验目的1理解继承的含义以及声明;2理解共有派生、私有派生和保护派生的含义以及使用;3理解单派生类中构造函数和析构函数的调用顺序。5.2 实验内容5.2.1程序阅读1理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include iostream.hclass CBasepublic:CBase(int a):a(a)protecte
35、d:void print()couta=aendl;private:int a;class CDerive : public CBasepublic:void print()CBase:print();coutb=bendl;private:int b;void main()CDerive d;d.print();CBase b;b.print();问题一:以上程序有两大错误,试指出来,并改正之?2理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include iostream.hclass CBasepublic:CBase(int a):a(a)coutbase st
36、ructureendl;CBase()coutbase destructureendl;void print()couta=aendl;protected:int a;class CDerive : public CBasepublic:CDerive(int a, int b,int c):CBase(a),b(b),c(c)coutderive structureendl;CDerive()coutderive destructureendl;void print()CBase:print();coutb.a=b.aendl;coutc=cendl;private:CBase b;int
37、c;void main()CDerive d(1,2,3); -d.print();问题一:以上程序的输出结果是什么,说明为什么?问题二:处语句执行完后,d.b.a的值为多少?5.2.2 程序设计1定义点CPoint类作为基类,在此基础上派生出直线CLine类和圆CCircle类,并要求基类和各派生类具有以下特点:aCLine类含有计算直线长度和斜率的成员函数;bCCircle类含有计算圆面积的成员函数。实验六 派生与继承多重派生6.1 实验目的1理解多重派生的定义;2理解多重派生中构造函数与析构函数的调用顺序;3理解多重派生中虚拟基类的作用;6.2 实验内容6.2.1程序阅读1理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。class CBase1public:CBase1(int a):a(a)coutbase1 structure.endl;CBase1()coutbase1 destructure.endl;void print()couta=aendl;protected:int a;class CBase2public:CBase2(int b):b(b)coutbase2 structure.endl;CBase2()