C++实验指导书.docx
《C++实验指导书.docx》由会员分享,可在线阅读,更多相关《C++实验指导书.docx(17页珍藏版)》请在冰点文库上搜索。
![C++实验指导书.docx](https://file1.bingdoc.com/fileroot1/2023-7/11/96ebe510-f83a-44d6-aae2-d1dcd042ce27/96ebe510-f83a-44d6-aae2-d1dcd042ce271.gif)
C++实验指导书
《面向对象程序设计》实验指导书
第一部分实验教学大纲
课程名称:
面向对象程序设计实验
一、课程简介及基本要求
面向对象的程序设计是一门实践性很强的课程,每个学生必须完成一定数量的上机作业。
通过上机作业进一步加深对课程基本内容的理解。
同时,在程序设计方法及上机操作等基本技能和科学作风方面受到比较系统的、严格的训练。
由于学生编程和上机的熟悉程度往往差别较大,本大纲所要求的实验为每个学生必须完成的实验,即最低要求。
其它上机内容由学生在教师指导下自选,内容可以是习题中编写的程序,也可以是学生解决实际问题中所编写的程序。
二、实验课程目的与要求
实验课是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
本课程使学生熟悉C++的语法特性,了解C与C++的区别和兼容性;理解面向对象程序设计的基本原理,包括类、对象、抽象、封装、继承和多态性等关键要素以及其关键语法特性—类;掌握用C++编写面向对象程序的一般方法;了解VC++编程环境。
三、主要仪器设备
每人一台计算机,基本配置:
奔腾III-600MHZ以上、40G~60G硬盘,128M内存。
装有C++builder或VisualC++或其他的C++编译软件。
四、实验方式与基本要求
实验分两类:
基本实验和综合性实验。
基本实验是按章节进行,根据教学大纲要求,有针对性地练习。
综合性实验往往跨单元处理问题。
学生上机时,按要求填写实验报告和回答思考题。
要求把每次实验的程序文本和运行结果存入到本人的用户目录下或专用软盘上供指导老师检查。
五.考核与报告
本课程实验考试方式是考查,按一般课程考试方式进行,主要内容包括实验操作和实验报告,实验成绩占该课程形成性考核成绩的10~20%。
实验报告的规范:
实验完成后填写统一的实验报告单,给出实验内容题目、年级、姓名、学号、指导教师、完成日期,并详细填写:
实验目的、实验程序、实验结果及分析、存在的问题。
实验一、C++开发环境应用(2学时)
1、实验目的
(1)了解C++开发工具的特点
(2)熟悉C++开发环境
(2)学习用C++编写标准的C++程序
2、实验任务
使用C++来建立一个非图形化的标准C++程序,编译、运行下例程序:
#include
voidmain(void)
{
cout<<”Hello!
\n”;
cout<<”WelcometoC++!
\n”;
}
3、实验步骤
(1)启动VisualC++开发环境
(2)创建一个项目
a.单击File菜单中的New选项,显示示新建对话框
b.选择Win32ConsoleApplication(VC++)。
c.选择项目所在路径及输入项目的名称
d.依次按‘下一步’直至完成为止。
(3)至此,已经建立好工程相关的文件,在生成的main函数中写入必要的内容即可。
(4)继续下面的步骤:
a.建立C++源程序文件
●选菜单命令Project|AddtoProject|New,弹出New对话框
●在New对话框的Files选项卡中选择C++SourceFile,并填入文件名称,单击OK按钮,完成新建C++源程序文件
b.编辑C++源程序文件
●在文件编辑窗口中输入代码
●完成后,选择菜单File|Save保存这个文件
c.建立并运行可执行程序
●选择菜单命令Build,建立可执行程序
如果你正确输入了源程序,此时便成功地生成了可执行程序。
如果程序有语法错误,则屏幕下方的状态窗口中会显示错误信息,根据这些错误信息对源程序进行修改后,重新选择菜单命令Build建立可执行程序。
选择菜单命令Run,运行程序,观察屏幕显示内容。
d.关闭工作空间
选择菜单命令File|ColseWorkSpace关闭工作空间。
1.熟悉VisualC++实验环境
[实验步骤]
(1)启动DeveloperStudio,看看初始化界面由哪些部分组成
(2)查看各菜单项,看看都有哪些子菜单和命令
(3)将鼠标放置于各工具条图标上,系统会自动显示该图标代表的命令含义,了解一下都有哪些命令。
(4)在任意工具条上单击鼠标右键,弹出式菜单上将显示所有可用的工具条,选择其中没有对号(√)的项,看看有什么效果,再选择有对号的项,又有什么效果?
(5)将鼠标移动到任意工具条上,将鼠标放到图标间隙,按下鼠标左键不放,移动鼠标到屏幕中间,有什么现象发生?
再将它拖回到原来位置,有什么现象发生?
(6)将鼠标移动到左边的工作区窗口,按下鼠标左键不放,移动鼠标到屏幕中间,有什么现象发生?
再将它拖回到原来位置,有什么现象发生?
7)将鼠标移动到下边的输出窗口,按鼠标右键,弹出一个菜单,选择其中的菜单项"Hide",结果如何?
要重新显示该窗口,选择菜单View|Output,窗口是不是又显示出来了?
(8)学习使用帮助系统。
如果你用的是VisualC++5.0,则在工作区窗口的InfoView中选择你感兴趣的内容,双击它,在文档区显示具体的帮助信息。
如果你用的是VisualC++6.0,选择菜单Help|Contents,启动MSDN联机帮助系统,学习使用该帮助系统。
联机帮助系统是一个相对独立的程序,它和DeveloperStudio是两个程序,但是它的启动和停止都受DeveloperStudio影响。
MSDN联机帮助系统运行的前提条件是DeveloperStudio在运行。
(9)选File|Exit退出DeveloperStudio。
2.控制台应用
用AppWizard建立一个控制台应用,在终端上输出"Hello"。
术语:
“控制台应用程序”是一个在DOS窗口中运行的基于字符的程序。
由于这种模式的应用程序比Windows程序简单,我们先选择利用VisualC++来建立这样一个应用,这样使得我们可以将精力先投入到学习使用C++编程语言,而不需要把过多的精力投入到学习复杂的Windows编程中去。
[实验步骤]
1)创建第一个应用
首先创建一个项目(project),项目将代表你的应用,存放你应用的所有信息,包括源文件、资源文件、编译连接设置等。
创建项目的步骤为:
(1)启动DeveloperStudio
(2)从主菜单中选择File|New,将显示出New对话框
(3)选择Projects标签,并从列表中单击Win32ConsoleApplication
(4)在“Location”编辑框中输入你的工作目录名称,如c:
\student\your_name(自建吧)
(5)在对话框的右上角的“projectname”编辑框内键入项目的名字,如"Hello",系统将自动为你的项目分配一个默认的目录
(6)单击OK继续
(7)如果是VC6.0,系统将显示一个询问项目类型的程序向导,选择“anemptyproject”
(8)单击Finish或OK结束配置,创建应用程序
这时系统为你创建一个新的项目,并且在左边的工作区窗口中将出现你项目的名字。
工作区窗口除原来的InfoView标签外又增加了两个标签(如果是VisualC++6.0,则没有InfoView标签):
ClassView和FileView。
ClassView从类的角度显示项目中建立的各个类,双击某个类名将会在右边的文档显示区显示类的定义文件并把文件的当前位置定位到所选的类;FileView显示构成项目的各个文件,选择某一文件将会在右边的文档显示区显示文件内容;InfoView是VC5的帮助文件目录,在这里可以选择所要获取帮助的标题,在右边将显示帮助内容。
2)编辑你的第一个C++源程序
用下面的方法在你创建的项目中添加一个文件:
(1)在主菜单上选择File|New
(2)在New对话框中选择File标签,单击“C++SourceFile”
(3)选中AddtoProject复选框
(4)在右边的Filename编辑框中为文件指定一个名字,如Hello,系统将自动为你加上后缀.cpp。
新的空白文件将自动打开,显示在文档显示区。
在文件中输入以下内容(不包括上下两条横线):
//helloworldexample
#include
intmain(){
cout<<"hello!
"<return0;//正常返回
}
仔细检查你输入的内容,确保内容正确
-->[常用编辑命令]
虽然许多编辑命令可以通过菜单和工具栏实现,但大量的编辑命令都可以通过键盘实现。
以下命令通常用键盘实现:
*撤消前一次操作。
当你进行了一次错误的操作时,可以通过敲击键盘上的Ctrl+Z完成;
*重复前一次操作。
通过敲击Ctrl+Y实现
*剪切一行。
用Ctrl+L来删除一行并将它放到剪切板中
*剪切。
将选中的文本删除并将它放到剪切板中,用Ctrl+X实现
*复制。
将选中的文本复制到剪切板中,用Ctrl+C实现
*粘贴。
将剪切板中的内容放到编辑器中文本的当前位置处(由光标指示)。
,用Ctrl+V实现
要想了解关于键盘操作命令的完整列表,可以选择Help菜单下的KeyboardMap。
你没有必要记住所有的命令,有些根本不常用。
3)保存你的源文件
单击工具栏中的"save"图标,或者选择File|Save来保存你的文件。
C++源文件的扩展名为.cpp。
扩展名非常重要,DeveloperStudio根据文件的扩展名来区分文件类型,并且根据文件类型提供相应的编辑帮助(如正确的语法高亮显示)。
4)编译、连接得到可执行程序
编辑结束后,仔细检查你输入的内容,看有无错误。
确认没有错误之后,选择主菜单的Build|BuildHello.exe来编译你的项目(也可以按功能键F7)。
如果你输入的内容没有错误,那么,在屏幕下方的输出窗口将会显示:
hello.exe-0error(s),0warning(s)
如果在编译时得到错误或警告,是你的源文件出现错误,再次检查你的源文件,看是否有错误,改正它。
5)改正源程序中的错误
编译的错误会在DeveloperStudio的下方的输出窗口显示出来,逐个查看这些错误的内容,用鼠标双击,光标可以自动移动到发生错误的源程序的相应地点,仔细检查你的源程序,改正发生错误的地方,注意是否否遗留了分号、引号或括号等。
改正后,再重复步骤4)的操作,直到编译连接通过为止。
6)运行你的第一个程序
你可以有三种方式运行你的程序:
*在开发环境中运行程序
选择Build|Executehello.exe(或者Ctrl+F5),在开发环境中执行你的程序。
程序运行以后将显示一个类似于DOS的窗口,在窗口中输出一行“hello",紧接着在下面显示“Pressanykeytocontinue",这句话是系统提示你按任意键退出当前运行的程序,回到开发环境中。
按任意键,窗口关闭,退回到VisualC++开发环境。
我们实验中将用这种方式运行程序。
*在DOS环境下运行程序
打开DOS窗口,改变工作路径到项目目录,该目录是你在创建目录时指定的。
如果你不记得了,可以在DeveloperStudio中的工作区窗口中选择项目名称(这里是“hellofiles"),然后选择菜单View|Properties,将可以显示出项目路径。
切换到debug子目录下,运行hello.exe,程序将输出:
'hello'。
实验二、分支与循环(3学时)
1、实验目的:
(1)学会编写简单的C++程序。
(2)练习使用简单的输入输出。
(3)熟悉各种流程控制语句的功能。
2、实验任务:
(1)输入并运行程序:
用do-while语句编程,求自然数1~10之和。
程序正确运行之后,去掉源程序中的#include语句,重新编译,观察会有什么问题。
(2)do-while语句用for语句代替,完成相同的功能。
(3)编程计算图形的面积。
程序可计算圆形、长方形、正方形的面积,运行时先提示用户选择图形的类型,然后,对圆形要求用户输入半径值,对长方形要求用户输入长和宽的值,对正方形要求用户输入边长的值,计算出面积后将其显示出来。
3、实验步骤
(1)建立一个控制台应用程序项目lab3_1,向其中添加一个C++源文件lab3_1.cpp,输入程序,检查一下确认没有输入错误,选择菜单命令编译源程序,再选择Execute运行程序,观察输出结果。
(2)程序正确运行之后,在源程序第一行”#include”前面加注释标记”//”使之成为注释行,重新编译,观察编译的结果。
(3)另建立一个项目lab3_2,包含一个C++源程序lab3_2.cpp,将do-while语句用for语句代替,完成与实验任务1相同的功能。
(4)建立项目lab3_3,计算图形面积。
圆形的面积计算公式为S=PI*r*r,长方形的面积计算公式为S=a*b,正方形的面积市场计算公式为S=a*a。
程序中定义一个整型变量iType表示图形的类型,用cout语句输出提示信息让用户选择图形的型,用cin读入iType的值,然后,使用switch语句判断图形的类型,分别提示用户输入需要的参数值,计算出面积的值后用cout语句显示出来。
最后编译运行程序。
参考程序如下:
//lab3_3.cpp
#include
constfloatPI=3.1416;
voidmain()
{
intiType;
floatradius,a,b,area;
cout<<”图形的类型?
(1为圆形,2为长方形,3为正方形):
”;
switch(iType)
{
case1:
cout<<“圆的半径为:
”;
cin>>radius;
area=PI*radius*radius;
cout<<”面积为”<
break;
case2:
cout<<”矩形的长为:
”;
cin>>a;
cout<<”矩形的宽为:
”;
cin>>b;
area=a*b;
cout<<”面积为:
”<
break;
case3:
cout<<”正方形的边长为:
”;
cin>>a;
area=a*a;
cout<<”面积为:
”<
break;
default:
cout<<”不是合法的输入值!
”<}
}
实验三、函数与重载(3学时)
1、实验目的:
(1)掌握函数的定义和调用方法。
(2)练习重载函数使用。
(3)练习函数模板的使用
(4)练习使用系统函数。
2、实验任务:
(1)编写一个函数把华氏温度转换为摄氏温度,转换公式为:
C=(F-32)*5/9。
(2)编写重载函数Max1可分别求取两个整数,三个整数,两个双精度数,三个双精度数的最大值。
(3)使用重函数模板重新实现上小题中的函数Max1。
(4)使用系统函数pow(x,y)计算xy的值,注意包含头文件math.h。
(5)用递归的方法编写函数求Fibonacci级数,观察递归调用的过程。
3、实验步骤:
编写函数floatConvert(floatTempFer),参数的返回值都为float类型,实现算法C=(F-32)*5/9,在main()函数中实现输入、输出。
程序名为lab6_1.cpp.
(1)分别编写四个同名函数max1,实现函数重载,在main()函数中测试函数功能。
程序名:
lab6_2.cpp。
(2)使用函数模板实现求任意类型数的最大值,针对不同的参数个数,编写两个同名函数模板max1,其参数个数不同,实现函数重载,在main()函数中测试函数的功能。
和序名:
lab6_3.cpp。
(3)在main()函数中提示输入两个整数x,y,使用cin语句得到x,y的值,调用pow(x,y)函数计算x的y次幂的结果,再显示出来。
程序名:
lab6_4.cpp。
(4)编写递归函数intfib(intn),在主程序中输入n的值,调用fib函数计算Fibonacci级数。
公式为fib(n)=fib(n-1)+fib(n-2),n>2;fib
(1)=fib
(2)=1。
使用if语句判断函数的出口,在程序中用cout语句输出提示信息。
程序名:
lab6_5.cpp。
#include//lab6_5
intfib(intn);
intmain()
{
intn,answer;
cout<<”Enternumber:
”;
cin>>n;
cout<<”\n\n”;
answer=fib(n);
cout<return0;
}
intfib(intn)
{
if(n<3)return1;
elsereturnfib(n-2)+fib(n-1);
}
实验四、类的定义与使用(3学时)
1、实验目的:
(1)掌握类的定义和使用
(2)掌握类的定义和对象的声明
(3)复习具有不同访问属性的成员的访问方式。
(4)观察构造函数和析构函数的执行过程。
(5)学习类的聚集使用方法。
2、实验任务
(1)定义一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,有两个公有成员函数run、stop。
其中rank为枚举类型CPU_Rank,定义为enumCPU_Rank={P1=1,P2,P3,P4,P5,P6,P7},frequency为单位为MHz的整型数,voltage为浮点型的电压值。
观察构造函数和析构函数的调用顺序。
(2)定义一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,定义并实现这个类。
(3)(选做)设计一个用于人事管理的People(人员)类。
考虑到通用性,这里只抽象出所有类型人员都具有的属性:
number(编号)、sex(性别)、birthday(出生日期)、id(身份证号)等等。
其中“出生日期”定义为一个“日期”类内嵌子对象。
用成员函数实现对人员信息的录入和显示。
要求包括:
构造函数和析构函数、拷贝构造函数、内联成员函数。
3、实验步骤
定义枚举类型CPU_Rank,例如enumCPU_Rank{P1=1,P2,P3,P4,P5,P6,P7},再定义CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等私有数据成员,定义成员函数run、stop,用来输出提示信息,在构造函数和析构函数中也可以输出提示信息。
在主程序中定义一个CPU类的对象,调用其成员函数,观察类对象的构造与析构顺序,以及成员函数的调用。
程序名:
lab7_1.cpp。
//lab7_1.cpp
#include
enumCPU_Rank(P1=1,P2,P3,P4,P5,P6,P7);
classCPU
{
private:
CPU_Rankrank;
Intfrequency;
Floatvoltage;
Public:
CPU(CPU_Rankr,intf,floatv)
{
rank=r;
frequency=f;
voltage=v;
cout<<”构造了一个CPU!
”<}
~CPU(){cout<<”析构了一个CPU!
”<CPU_RankGetRank()const{returnrank;}
IntGetFrequency()const{returnfrequency;}
FloatGetVoltage()const{returnvoltage;}
VoidSetRank(CPU_Rankr){rank=r;}
VoidSetFrequency(intf){frequency=f;}
VoidSetVoltage(floatv){voltage=v;}
VoidRun(){cout<<”CPU开始运行!
”<VoidStop(){cout<”<};
voidmain()
{
CPUa(P6,300,2.8);
i.Run();
a.Stop();
}
实验五、类的继承与多态性(3学时)
1、实验目的:
(1)学习定义和使用类的继承关系,定义派生类。
(2)熟悉不同继承方式下对基类成员的访问控制。
(3)学习利用虚基类解决二义性问题
(4)掌握运算符重载的方法
(5)学习使用虚函数实现动态多态性。
2、实验任务
(1)定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(intn)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?
编程试试看。
(2)定义一个基类BaseClass,有整型成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
(3)定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。
自行车类有高度(height)等属性,汽车类有座位数(SeatNum)等属性。
从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。
如果不把vehicle设置为虚基类,会有什么问题?
编程试试看。
(4)(选做)从实验七中的people(人员)类派生出student(学生)类,添加属性:
班号charclassNo[7];从people类派生出teacher(教师)类,添加属性:
职务charprincipalship[11]、部门chardepartment[21]。
从student类派生出graduate(研究生)类,添加属性:
专业charsubject[21]、导师teacheradviser;从graduate类和teacher类派出TA(助教生)类,注意虚基类的使用。
重载相应的成员函数,测试这些类。
(5)定义Point类,有坐标x,y两个成员变量;对Point类重载“++”、“--”运算符,实现对坐标值的改变。
(6)定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。
观察虚函的作用。
(7)(选做)前面实验中的People类重载“==”运算符和“=”运算符,“==”运算符判断两个People类对象的id属性是否相等;“=”运算符实现People类对象的赋值操作。
3、实验步骤
(1)编写程序定义基类Animal,成员变量age定义为私有的。
构造派生类dog,在其成员函数SetAge(int