C++面向对象程序设计实验指导书.docx
- 文档编号:7843988
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:82
- 大小:1,017.06KB
C++面向对象程序设计实验指导书.docx
《C++面向对象程序设计实验指导书.docx》由会员分享,可在线阅读,更多相关《C++面向对象程序设计实验指导书.docx(82页珍藏版)》请在冰豆网上搜索。
C++面向对象程序设计实验指导书
C++面向对象程序设计实验指导书
(v1.0)
刘恒洋谭智编
重庆工学院计算机学院
2007年9月
绪论
0.1写本书的目的
面向对象程序设计语言是现今最流行的编程语言之一,C++语言是作为最早最流行的面向对象编程语言之一而发展起来的。
学好C++语言不仅可以从面向过程的程序设计思想过渡到面向对象的程序设计思想,而且可以为以后学习其它的面向对象语言打下坚实的基础,使得学习其它的面向对象编程语言变得轻松、容易。
实验作为学习C++语言不可缺少的一个环节不仅可以加深学生对C++面向对象思想的理解,同时可以提高学生的动手编程能力,培养学生良好的编码习惯。
目前关于C++语言的理论教材比较多,但是适合学生练习的实验指导书却比较少,这严重影响了学生对C++这门课程的学习。
大多数情况下,学生学习C++语言之前都刚刚学习过C语言程序设计这门课程,从编程环境到编程语言同时转换过来需要一定的时间和合理的指引,同时在学习C++理论知识的过程中,学生很少也很难把C++程序设计和现在社会上比较流行的基于VC6.0的MFC程序设计联系起来,所以很难让学生在学习C++语言的同时,提升学生基于VC6.0的MFC程序设计的能力。
编写本书的目的就是从以上几点来考虑的,首先要把学生从以前的编程环境中脱离出来,然后循序渐进地介绍新的编程环境的新知识点,同时把C++的语法结构融入到基于VC6.0的MFC程序设计中去,从而实现学生轻松掌握C++这门程序设计语言和习惯编程环境以及理解C++语法和MFC之间的关系的目的,从而提高学生的程序设计能力和学生程序设计的成就感。
0.2本书的结构安排
实验课程的安排离不开理论课程的学习,本书的编排以知识点为核心,理论教材蓝本为《C++面向对象程序设计教程》(第2版)陈维兴林小茶编著,清华大学出版社出版。
通过为不同的知识点设计相应的实验程序,来达到学生练习和理解C++语言面向对象的思想的目的,同时本书还设计了一些程序设计课后练习题,设计本部分有三个目的:
一个是有些课堂练习中没有办法练习到的知识点将在这部分体现,指导老师可以根据需要来增删课堂的讲解内容;另一个是为一部分有能力有兴趣深入学习C++程序设计的同学提供一些练习题,从而提升这部分学生的程序设计能力;第三就是避免有些学生在做实验的过程中盲目按照指导书中的步骤一步一步地不加思考地写程序,学生要回答这些问题,就必须看懂这些程序中隐含的知识点,从而达到理论知识和实践知识更好地结合。
对于课堂练习,本书共安排了十个实验,共32个学时,实验安排如下:
实验一C++基础(2学时)
实验二类和对象—类的构建(2学时)
实验三类和对象—构造函数与析构函数(2学时)
实验四类和对象—对象传递与静态成员(2学时)
实验五派生与继承—单重派生(2学时)
实验六派生与继承—多重派生(2学时)
实验七多态性—函数与运算符重载(2学时)
实验八多态性—类型转换与虚函数(2学时)
实验九模板类的构造(2学时)
实验十C++的I/O流类库(2学时)
实验十一C++程序、Windows程序和MFC程序(3学时)
实验十二简单单文档MFC程序设计(3学时)
实验十三简单对话框程序设计(3学时)
实验十四简单数据库程序设计(3学时)
另外本书还安排了第三部分—综合练习,作为学生提高部分,学生通过第三部分的练习不仅可以巩固前面学到的基本知识,还可以扩充相关方面的程序设计知识,更为重要的是可以让学生自主地设计一个完整的系统,从而达到提高学生综合程序设计能力的目的。
0.3如何使用本书
面向对象程序设计语言出现的目的就是为了设计大型的软件系统,但是教学过程中很难让学生在课堂上实现一个大型的(甚至是成型)的系统,所以作为教师应该引导学生在实现一个简单的功能性的程序的同时让学生思考,思考如何把这个地方的技术实现到一个复杂的应用系统中去;另外教师要充分利用本书中第二部分的练习,引导学生去思考如何利用C++的相关技术从头到尾设计一个具有实用价值的应用程序。
作为学生如果只是简单地按照本书中提供的步骤一步一步完成某一个程序,而不去思考为什么要这样做的话,那么学生能学到的知识也仅仅是C++的语法而已,并不能真正理解C++面向对象的思想,最终不能设计出好的程序来。
所以学生不仅要全部实现本书中的课堂练习,得出正确的结果,而且在完成了程序后还要思考本程序为什么要这样设计,如果换成其它的程序设计语言会怎么实现,只有这样才能够真正理解C++的精髓,从而掌握C++。
另外学生在学习最后四个实验的时候一定不要忘记前面C++语法知识,能否合理地将C++的三大特性运用到MFC的程序设计中是提高程序运行效率,存储效率和程序封装性一个最有效的手段。
学生在设计本实验指导书第三部分程序的时候,需要自己查阅相关方面的技术资料才能完成相关功能,因为安排这部分的目的就是为了提升学生自主学习的能力和综合程序设计能力,因此这部分的内容并没有安排相关理论知识的讲解。
另外教师也可以把这部分的内容用于学生课程设计的程序设计题目。
注:
本书中所有的程序都采用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.2.1程序阅读
1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include
intmax_def(intx,inty)
{
return(x>y?
x:
y);
}
intmax_def(intx,inty,intz)
{
inttemp=0;
return(temp=(x>y?
x:
y))>z?
temp:
z;
}
doublemax_def(doublex,doubley)
{
return(x>y?
x:
y);
}
intmain()
{
intx1=0;
intx2=0;
doubled1=0.0;
doubled2=0.0;
x1=max_def(5,6);
x2=max_def(2,3,4);
d1=max_def(2.1,5.6);
d2=max_def(12.3,3.4,7.8);-----------------------------------------------------①
cout<<"x1="< cout<<"x2="< cout<<"d1="< cout<<"d2="< return1; } 问题一: 上述程序的输出结果是什么? 问题二: 哪些情况可以参与函数的重载? 问题三: ①处调用的是哪个函数? 问题四: ②处的输出结果为什么是d2=12,而不是d2=12.3? 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include intmain() { int*p1=newint;-----------------------------------------------------① int*p2=newint(0);-----------------------------------------------------② char*p3=newchar[64];-----------------------------------------------------③ return1; } 问题一: ①、②、③处动态申请内存分别代表什么不一样的意思? 问题二: 该程序存在什么隐患? 改正该程序使隐患消除。 3.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include voidswap(inta,intb) { inttemp=a; a=b; b=temp; } voidswap(int*a,int*b) { inttemp=*a; *a=*b; *b=temp; } intmain() { inti=5; intj=10; cout<<"Beforeswap: i="< swap(i,j);-----------------------------------------------------① cout<<"Afterthefirstswap: i="< swap(&i,&j);-----------------------------------------------------② cout<<"Afterthesecondswap: i="< return1; } 问题一: 上述程序的输出结果是什么? 问题二: ①处函数调用后并不能实现两个数的交换,而②处却可以,为什么? 问题三: ②处调用的是哪个重载函数? 1.2.2程序设计 1.使用函数重载的方法定义两个重名函数,分别求出整形数平面间两点间距离和双精度平面间两点间距离,如果没有输入第二点的坐标则默认为圆点(0,0)。 2.设计一个函数: exchange(floatx,floaty,floatz),当调用exchange(a,b,c)时,将a的内容赋值给b,b的内容赋值给c,c的内容赋值给a,要求采用引用的方式来实现。 1.3思考题 1.自己设计一个程序,测试const的三种用法: 指向常量的指针,常指针,指向常量的常指针。 2.编写一个函数,实现两个字符串变量的交换,要求参数用引用。 实验二类和对象—类的构建 2.1实验目的 1.类的定义; 2.类对象的使用; 3.类成员变量的定义和使用; 4.类成员函数的定义和使用; 5.理解类的作用域; 6.理解类的声明; 7.理解类中private和public权限的声明依据。 2.2实验内容 2.2.1程序阅读 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include classCDate { voidSet(intm,intd,inty) { month=m; day=d; year=y; } intIsLeapYear() { return(year%4==0&&year%100! =0)||(year%400==0); } public: voidPrint() { cout< } private: intmonth;intday;intyear; }; voidmain() { CDatea;-----------------------------------------------------① a.Set(10,15,2007); a.Print(); } 问题一: 以上程序编译能通过吗,为什么,应该如何改正? 问题二: 类CDate中分别有哪些成员函数和成员变量,它们分别属于哪种访问权限? 问题三: ①处语句的意思是什么? 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include intmonth;//全局变量 intday; intyear; voidSet(intm,intd,inty)-----------------------------------------------------a { : : month=m;-----------------------------------------------------① : : day=d; : : year=y; } classCDate { public: voidSet(intm,intd,inty)-----------------------------------------------------b { : : Set(m,d,y);-----------------------------------------------------② } voidPrint() { cout< } private: intmonth;//成员变量 intday; intyear; }; voidmain() { CDatea; a.Set(10,15,2007); a.Print(); } 问题一: ①处是在给成员变量赋值,还是在给全局变量赋值,如果去掉域作用符: : ,程序是否还能正确运行? 问题二: ②处调用的哪个函数,如果去掉域作用符: : ,程序是否还能正确运行? 问题三: 该程序的输出结果是什么,试解释该输出结果。 2.2.2程序设计 1.试设计一个复数类,该类有实部和虚部两个成员数据,成员数据采用私有访问权限,同时该类有两个共有成员函数,分别用来设置成员数据和输出成员数据,在主函数中分别采用对象方式,指针方式和引用方式来调用该类的公有函数设置和输出成员数据。 2.3思考题 1.试指出以下程序的错误,并改正之。 #include classCPoint { public: unsignedx, unsignedy; boolIsInCircle(CCircle*Circle) { return(((x-Circle->Center.x)*(x-Circle->Center.x) +(y-Circle->Center.y)*(y-Circle->Center.y))<=Circle->Radius*Circle->Radius); } }; classCCircle { public: unsignedRadius; CPointCenter; }; voidmain() { } 实验三类和对象—构造函数与析构函数 3.1实验目的 1.理解掌握this指针的作用和用法; 2.理解掌握构造函数的定义和作用; 3.掌握构造函数的使用; 4.理解掌握拷贝构造函数的定义和使用; 5.理解掌握构造函数的重载; 6.理解掌握析构函数的定义和使用。 3.2实验内容 3.2.1程序阅读 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include classCPoint { public: voidSet(intx,inty); voidPrint(); private: intx; inty; }; voidCPoint: : Set(intx,inty) { x=x; y=y; } voidCPoint: : Print() { cout<<"x="< } voidmain() { CPointpt; pt.Set(10,20); pt.Print(); } 问题一: 以上程序编译能通过吗,试解释该程序? 问题二: 以上程序的运行结构是否正确,如果不正确,试分析为什么,应该如何改正? 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include classCPerson { public: voidPrint(); private: CPerson(); private: intage; char*name; }; CPerson: : CPerson() { } voidCPerson: : Print() { cout<<"name="< } voidmain() { CPersonps(23,"张三"); ps.Print(); } 问题一: 以上程序存在三处大错误,在不改变主函数内容的前提下,试改正该程序。 3.2.2程序设计 1.设计实现一个CPoint类,满足以下要求: a.该类包含两个整型成员变量x(横坐标)和y(纵坐标),以及一个输出函数Print()用来输出横坐标和纵坐标,要求不可以在类的外部直接访问成员变量; b.可以采用没有参数的构造函数初始化对象,此时的成员变量采用默认值0; c.可以采用直接输入参数的方式来初始化该类的成员变量; d.可以采用其它的CPoint对象来初始化该类的成员变量; e.设计一个主函数来测试以上功能。 3.3思考题 1.设计一个CStudent(学生)类,并使CStudent类具有以下特点: a.该类具有学生姓名、学号、程序设计、信号处理、数据结构三门课程的成绩; b.学生全部信息由键盘输入,以提高程序的适应性; c.通过成员函数统计学生平均成绩,当课程数量增加时,成员函数无须修改仍可以求取平均成绩; d.输出学生的基本信息、各科成绩与平均成绩; e.学生对象的定义采用对象数组实现; f.统计不及格学生人数。 实验四类和对象—对象传递与静态成员 4.1实验目的 1.理解静态成员(静态数据成员、静态成员函数)的作用与使用; 2.理解友元(友元函数、友元类)的作用于使用; 3.理解常类型的使用。 4.2实验内容 4.2.1程序阅读 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include #include classCStudent { public: CStudent(char*n,inta); ~CStudent(); staticvoidSetAge(intage); private: char*name; intage; staticintnTotalObj; }; intCStudent: : nTotalObj=0; CStudent: : CStudent(char*n,inta) : age(a) { intnLen=strlen(n); name=newchar[nLen+1]; strcpy(name,n); name[nLen]='\0'; nTotalObj++; } CStudent: : ~CStudent() { delete[]name; nTotalObj--; } voidCStudent: : SetAge(intage) { this->age=age; } voidmain() { CStudentstu1("张三",25); CStudentstr2("李四",26); cout<<"CStudent: : nTotalObj="< : nTotalObj< } 问题一: 以上程序编译能通过吗,为什么? 问题二: 成员变量nTotalObj在程序中起什么作用,它是如何实现的? 问题三: 如果规定该程序的主函数和类CStudent中的成员变量的属性不允许改变,应该如何改正该程序? 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include #include classCStudent { public: CStudent(char*n,inta); ~CStudent(); private: char*name; intage; }; CStudent: : CStudent(char*n,inta) : age(a) { intnLen=strlen(n); name=newchar[nLen+1]; strcpy(name,n); name[nLen]='\0'; } CStudent: : ~CStudent() { delete[]name; } classCTeacher { public: CTeacher(char*tn,intta); ~CTeacher(); voidSetStuAge(inta); private: char*name; intage; CStudentstu; }; CTeacher: : CTeacher(char*tn,intta) : age(ta) { intnLen=strlen(tn); name=newchar[nLen+1]; strcpy(name,tn); name[nLen]='\0'; } CTeacher: : ~CTeacher() { delete[]name; } voidCTeacher: : SetStuAge(inta) { stu.age=a; } voidmain() { CStudentstu("张三",25); CTeachertea("李四",26); } 问题一: 以上程序有两大错误,试指出来,并改正之? 3.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include"iostream.h" classDate { private: constintyear; constintmonth; constintday; public: Date(inty,intm,intd); voidshowdate(); }; Date: : Date(inty,intm,i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 面向 对象 程序设计 实验 指导书