面向对象程序设计VC实验指导书.docx
- 文档编号:23754372
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:59
- 大小:994.83KB
面向对象程序设计VC实验指导书.docx
《面向对象程序设计VC实验指导书.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计VC实验指导书.docx(59页珍藏版)》请在冰豆网上搜索。
面向对象程序设计VC实验指导书
《面向对象程序设计(VC++)》
实验指导书
XXX编
XXXXX学院
前言
计算机程序设计时一门实践性很强的课程,因此学时过程中仅仅通过阅读教科书或听课时补可能完全掌握的,学习程序设计的作重要的环节就是多上机实践。
凡是学过程序设计的人,往往都有类似的感觉:
教科书上的例题能看懂,上课时老师的例题能听懂,可到了自己编程时却又无从下手。
而老师上课再三强调的问题,学生上机时还是照样会错误百出。
同时,由于学生的实践经验有限,调试程序时找错、改错的过程非常艰难,有时甚至花几个小时都调不同一个程序,不但效率低下,而且容易失去学习的兴趣。
本实验指导书的目的就在于给学生的编程学习提供一些指导,帮助学生快速的完成程序的调试,使学生在实践的过程中少一些曲折,多一点成功的乐趣。
为了满足不同层次的学生的需要,每一部分的实验内容都按由易到难的顺序编排,前面的题目一般都有较详细的指导,后面的提高部分(或选作部分)一般指给出提示,供学习基础较好的学生使用,充分挖掘每个人的潜力。
为了提高实验课的效率,学生需要做到:
每次实验之前都要准备好实验内容,包括:
明确实验步骤,编写出实验中要调试的程序,编写调时程序时需要的测试数据以及程序应有的运行结果。
实验过程中做好调试记录,包括主要实验步骤、关键代码、测试结果、出现的错误及其原因分析与解决措施。
实验结束后要整理实验内容,编写实验报告,回答实验内容中提出的思考题,并总结实验中用到的主要知识点。
本书中所有的程序都在Windows环境下的VisualC++6.0系统中调试通过。
实验一继承与派生
(1)
一、实验目的
1.掌握派生类的定义,理解派生与继承的原理;
2.熟悉三种派生方式下派生类对基类成员的继承特点、访问权限。
重点掌握公有派生的应用。
3.掌握派生类中构造函数和析构函数的编写与调用。
二、实验内容
1.运行下面含有派生类的程序,思考:
(1)类B的函数sets()能否访问类A中的成员变量m和n?
为什么?
(2)如果在类A中把m和n定义为私有成员,再编译源程序,有何错误?
为什么?
(3)如果将类B改为私有派生,函数main应如何修改?
为什么?
2.定义一个人员类,数据成员包括:
序号(整型)、姓名(字符串)、性别(字符型),成员函数包括设置一个人的信息、获取一个人的各项信息、输出一个人的所有信息。
派生一个学生类,新增成员包括:
英语、数学、计算机三门的成绩(实型)、平均成绩(实型),成员函数包括:
输入/设置一个学生的信息、计算该学生的平均成绩、输出一个学生的所有信息、获取学生的各项信息。
派生一个教师类,新增成员包括:
系部(字符串)、教龄(整型)、薪水(实型),成员函数包括:
设置教师信息、获取教师信息、输出教师信息。
编写主函数,定义学生类、教师类的对象,并调用成员函数设置/输出信息。
三、实验步骤
1.编辑源程序,代码如下:
#include
usingnamespacestd;
classA
{
protected:
intm,n;
public:
voidset(inta,intb)
{
m=a;n=b;
}
voidshow()
{
cout< } }; classB: publicA {ints; public: voidsets() {s=m*n;} voidshows() { cout< } }; voidmain() { Bobj; obj.set(2,3); obj.show(); obj.sets(); obj.shows(); } 2.调试: 编译、连接、用Debug单步(快捷键F10)调试。 调试结果如图1-1: 图1-1Debug单步调试窗口 说明: 通过调试窗口,察看类的继承关系(obj与A),理解公有派生的成员访问特性。 单步执行时,在右下脚的调试窗口中的Name列中添加要查看的表达式: sizeofobj和sizeofint。 当执行到obj.shows()时,数据成员m、n、s的值分别是2,3,6。 右边显示一个obj对象所占的空间是12字节,其中一个int型数据占4字节。 四、实验提示 实验内容2的提示: 1.为了在派生类中能直接访问基类的数据成员,在基类中将数据成员的访问属性设置为protected。 2.派生类的派生方式为public,即公有派生。 3.思考: 若将基类的数据成员的访问属性设置为private,则在派生类中如何访问基类的数据成员? 五、实验报告 1. 1、按照内容1提出的思考题,逐步修改源程序,并回答问题。 2、内容2的程序代码及编程思路说明。 3、按照实验提示修改源程序,并回答思考题。 4、总结三种派生方式的特点。 实验二继承与派生 (2) 一、实验目的 1.掌握派生类中构造函数和析构函数的编写与调用。 2.掌握带有指针类型数据成员时,动态内存分配的使用。 3.掌握默认形参值的在构造函数中的应用。 二、实验内容 1.运行下面含有派生类的程序,单步调试,理解派生类的构造函数和析构函数的执行过程。 #include #include usingnamespacestd; classCAnimal { public: CAnimal(char*pName="noname"); ~CAnimal(); voidsetName(char*pName); char*getName(void); private: charname[20]; }; CAnimal: : CAnimal(char*pName) { strcpy(name,pName); cout<<"调用CAnimal的构造函数! "< } voidCAnimal: : setName(char*pName) { strcpy(name,pName); } CAnimal: : ~CAnimal() { cout<<"调用CAnimal的析构函数"< } char*CAnimal: : getName() { returnname; } classCCat: publicCAnimal { public: CCat() { cout<<"调用CCat的构造函数"< } ~CCat() { cout<<"调用CCat的析构函数"< } voidDispName() { cout<<"猫的名字是: "< } voidsetWight(intw) { weight=w; } voidDispWight() { cout<<"猫的体重是: "< } private: intweight; }; voidmain() {CCatcat; cat.DispName(); cat.DispWight(); cat.setName("Snoopy"); cat.setWight (1); cat.DispName(); cat.DispWight(); } 思考: 为什么第一次输出对象cat的名字时是noname,而体重是随机数? 2.将CAnimal类中的构造函数中的默认初值noname去掉,在派生类Ccat中,构造函数该如何编写? 修改源程序并调试。 3.将Canimal类中的charname[20];改为char*name;则原程序中的构造函数该如何修改? 4.修改“实验一”中的第2题,添加每个类的构造函数和析构函数。 并在主函数中调用。 思考: 构造函数的执行过程如何? 析构函数呢? 三、实验提示 1.若将charname[20];改为char*name,则构造函数中要使用动态内存分配技术首先申请一片空间用于保存姓名,用name指向该空间。 并且在析构函数中要释放空间。 2.当基类的构造函数带有参数(且没有默认参数值)时,在派生类的构造函数中必须编写相应的构造函数,为基类的构造函数提供参数。 四、实验报告 五、实验报告 1. 5、按照回答内容1提出的思考题 2.整理去掉默认值后的构造函数代码和相关注释。 3.整理内容3的构造函数的代码及相关注释。 4.整理实验一的构造函数和系构函数以及主函数,并回答思考题。 实验三多态性 一、实验目的 1.掌握函数重载和运算符重载的方法。 2.熟悉使用虚函数实现动态多态性。 二、实验内容 1.编写4个重载函数Double(x),返回值为输入参数的两倍;参数类型分别为int、long、float和double,返回值类型与参数类型一样。 编写主函数进行验证。 思考: 函数重载的条件是什么? 此类重载实现的是编译时的多态性还是运行时的多态性? 系统如何确定调用哪个重载的函数? 2.定义一个坐标类coord,包括数据成员x(横坐标)、y(纵坐标),重载的构造函数coord()(缺省值为0,0)和coord(intx0,inty0),显示点的坐标函数print(),重载“++”的函数(使横坐标和纵坐标各加1)。 编写如下主函数,分别显式和隐式调用运算符++重载函数,理解运算符重载的实质: voidmain() {coordobj(10,30); ++obj;obj.print(); obj.operator++();obj.print(); } 思考: 重载的构造函数和重载的运算符函数实现的是编译时的多态性还是运行时的多态性? 系统如何确定调用哪个重载的函数? 运算符重载的实质是什么? 3.定义抽象类Shape,包括计算面积的函数GetArea()、计算周长的函数GetPerim()。 定义派生类Rectangle和Circle,包括构造函数和析构函数,重载计算周长和面积的函数。 编写主函数,定义基类的指针变量sp,使sp指向派生类的对象,通过sp访问派生类的成员函数。 4.(选作)在第2题的基础上,添加类coord的友元函数实现重载运算符“+”,实现对横坐标、纵坐标各增加一个偏移量nOffset。 比如,实现obj=obj+5,此时偏移量nOffset=5。 思考: 若要实现obj=10+obj,该如何对运算符“+”重载? 三、实验提示 1.对于第1题,可将类得声明与实现放在一个C++文件中;对于第2题和第3题,可将类的定义放在头文件(选择File/New/Files/C/C++HeaderFile)中,将类的实现放在实现文件(.cpp)中。 2.第2题的运算符“++”的重载定义为类的成员函数,没有形参。 3.第3题中,基类中的计算面积和周长的函数均定义为纯虚函数,virtualfloatGetArea()=0; 四、实验报告: 1.各程序的设计思想及源代码 2.代码运行测试结果 3.总结经态多态性和动态多态性的实现方法的不同。 实验四函数模板 一、实验目的: 1、理解模板的概念及作用 2、掌握函数模板的定义与使用。 1、熟悉常用的排序方法: 起泡排序、选择排序、插入排序。 二、实验内容: 1、编写一个函数模板,实现两个参量的交换。 编写主函数,调用函数模板,实现对两个整型数、实数、字符型数据、结构体类型数据、复数的交换。 2、编写函数模板,实现求给定数组中的最大值的操作。 编写主函数,调用函数模板,实现对int型、double型、char型数组的操作。 3、[选作]编写[起泡排序/选择排序/插入排序]的函数模板,调用该模板对int型数组进行升序排序并输出排序后的结果。 [三种排序选择其一] 思考: 如果将int型数组改为student对象数组(student类包括学生的学号、姓名、成绩),并调用排序的函数模板按照成绩进行排序,将如何定义student类? 三、实验提示: 1、设函数模板的类型参数为T,则两个形参的类型为T类型的引用(T&)或指针。 2、函数类型为类型参数T,函数的形参有两个: 指向数组元素的指针和数组长度。 参照例题9_2。 3、参照教材9.3中的排序函数模板,编写输出数组元素的函数模板,然后在主函数中调用排序模板对数组排序,调用输出模板输出排序后的结果。 四、实验报告: 1、写出程序的设计思想及源代码。 2、根据运行测试结果,总结模板的使用方法。 实验五类模板 一、实验目的: 1、掌握类模板的定义与使用。 2、掌握线性群体(数组类、栈类)的定义与使用。 3、熟悉链表的基本操作。 二、实验内容: 1、参照例题9_4定义栈类模板,然后定义结构体类型(学号、成绩),在主程序中输入多个学生的学号和成绩,调用栈类模板进行数据的保存并输出。 2、参照例9_5,定义一个简单的数组类模板,数据成员包含: 数组类型指针(即数组名)、数组大小(元素个数);成员函数包括: 构造函数(参数为数组大小,默认20)、析构函数、取数组元素函数(即重载运算符“[]”)、数组的整体赋值(即重载运算符=)。 编写主函数,利用数组类模板,定义存放第1题中的结构体类型数据的数组,并存放n个学生的考试成绩。 然后计算平均成绩并显示。 其中,学生数提示用户输入。 3、[选作]在例9_6的单向链表类中增加一个成员函数: 从链表头删除一个结点。 并改写main()进行调用。 三、实验步骤: 1、 (1)创建一个project,定义栈类模板或将已经定义好的栈类文件添加到此project中。 (2)定义头文件: stu_score.h,实现结构类型的定义: structstu_score{ intno; doublescore; }; (3)创建C++源程序文件main.cpp: 包含栈类模板的头文件: 循环输入多个学生的信息、压栈保存。 循环输出学生成绩(出栈)。 2、 (1)创建project: ch9_ex2 (2)定义数组类模板头文件: Array.h,声明类的构成。 (3)定义数组类模板的实现文件: Array.cpp。 注意: 成员函数均为函数模板。 (4)添加包含结构体类型的头文件stu_score.h: 右击ch9_ex2,选择AddFilestoProject……,根据提示选择要添加的文件,点击“确定”即可。 (5)创建主程序文件main.cpp,在主程序文件中调用数组类模板实现数据的输入输出。 3、从链表头删除一个接点的参考代码如下: intList: : Deltete_Head_Node() { Node*pre; if(m_head==0) { cout<<"thechainisempty! "< } else { pre=m_head; m_head=m_head->m_next; deletepre; return1; } } 四、实验报告: 1、整理程序的设计思想及源代码。 2、记录运行测试结果。 实验六输入/输出流 一、实验目的: 1、理解输入/输出流与流类库。 2、掌握输入/输出流对象的使用,特别是文件流的常用操作方法。 二、实验内容: 输入/输出流的综合应用题: 1、定义类Cstudent,数据成员包括学号(字符数组)、姓名(字符数组)、三门课的成绩(实型数组),成员函数包括从键盘输入一个学生信息、输出一个学生信息到显示器。 编写主程序,输入n个学生的信息,然后依次输出。 要求: 姓名可包含空格,学生个数n提示用户输入,输出时要按列对齐的格式、小数点后精确到1位小数。 2、改写上题主程序,将用户输入的学生信息写入二进制文件student.txt中;然后再从文件中读出并显示在屏幕上。 3、在类Cstudent中增加运算符“<<”、“>>”的重载函数。 4、[选作]定义学生数组类,按学号删除一个学生记录、修改学生的成绩、查询学生的成绩、统计各分数段的人数以及每门课的平均成绩。 5、[选作]编写函数fun(intn),实现: 对一个4位数的整数加密,返回加密后的密码。 加密方法: 每位数字加上5然后除以10的余数代替该数字,再将第一位和第四位交换、第二位和第三位交换。 编写主程序,提示用户输入4位整数的密码,经加密后写入文件。 三、实验提示: 1、定义类Cstudent时,输入学生信息的成员函数中要区分不同类型的数据成员,分别采用cin、get、getline函数,同时要及时用cin.get()读取多余的换行符,以免影响下面的输入。 参见教案例题11_3中的输入部分。 2、学生信息的写入操作数域数据块写入,一次将整个学生对象数组写入文件,也可以用循环,每次写一个学生的信息(即一个数据元素)。 使用write()函数。 3、提取、插入运算符的重载可以使得对文件的输入/输出与标准设备一样。 比如: iostream&operator<<(iostream&myfile,Cstudent&stu) {myfile.write(stu.strName,sizeof(strName);//写入姓名 myfile.write(stu.No,sizeof(No));//写入学号 myfile.write((char*)score,sizeof(double)*3);//写入3门课的成绩,score //为数组名 returnmyfile;} 调用: file1< 参照以上代码编写提取运算符的重载函数,并改写main函数进行调用。 四、实验报告: 1、整理程序的设计思想及关键源代码。 2、记录运行测试结果。 实验七Windows应用程序 一、实验目的: 1、理解Windows应用程序结构和消息驱动机制。 2、理解MFC程序的启动流程和消息映射机制。 二、实验内容: 1、创建Win32Application应用程序,实现: 显示对话框“问候” 2、。 3、 4、 5、 6、 7、 8、 9、 #include intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow) { MessageBox(NULL,“你好,我的VisualC++世界! ”, “问候”,0); return0; } 思考: WinMain()函数的作用是什么? MessageBox()函数的作用是什么? 根据运行结果,分析它的各个参数的意义并查阅该函数原型进行确认。 2、创建Win32Application应用程序,实现: 程序运行时,显示标题为“我的窗口”对话框,当单击鼠标左键时,弹出标题为“问候”的对话框,内容为“你好,我的VC++世界! ” 2、。 程序代码如下: 显示“问候”对话框的完整程序 #include LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口消息函数 //主函数WinMain intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance, LPSTRlpCmdLine,intnCmdShow) { HWNDhwnd; MSGmsg; WNDCLASSwndclass;//定义窗口类对象 //设置窗口属性 wndclass.style=CS_HREDRAW|CS_VREDRAW;//窗口样式: 当水平或垂直 //尺寸发生变化时,窗口重画 wndclass.lpfnWndProc=WndProc;//确定该窗口消息的处理函数 wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hInstance=hInstance;//设置该应用程序的句柄 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//设置图标句柄 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//设置光标句柄 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景颜色为白色 wndclass.lpszMenuName=NULL;//窗口菜单名 wndclass.lpszClassName="HelloWin";//窗口类名 //注册窗口 if(! RegisterClass(&wndclass)) { MessageBox(NULL,"窗口注册失败! ","HelloWin",0); } //创建窗口 hwnd=CreateWindow("HelloWin",//窗口类名 "我的窗口",//窗口标题 WS_OVERLAPPEDWINDOW,//窗口样式为可重叠式 CW_USEDEFAULT,//指定窗口的位置和大小 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,//父窗口句柄 NULL,//菜单资源句柄 hInstance,//应用程序的实力句柄 NULL);//窗口函数使用的额外数据 //显示窗口 ShowWindow(hwnd,nCmdShow);//参数二指定窗口的显示状态,如SW_MAXIMIZE,SW_SHOW等 //更新窗口 UpdateWindow(hwnd); //进入消息循环 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg);//将键盘命令转换成WMXXX消息 DispatchMessage(&msg);//分发消息给对应的窗口 } returnmsg.wParam; } //窗口消息处理函数 LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam, LPARAMlParam) { switch(message) { caseWM_LBUTTONDOWN: //单击鼠标左键消息 MessageBox(NULL,"你好,我的VisualC++世界! ","问候",0); return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 VC 实验 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)