C++程序设计实验指导书第四版Word格式.docx
《C++程序设计实验指导书第四版Word格式.docx》由会员分享,可在线阅读,更多相关《C++程序设计实验指导书第四版Word格式.docx(28页珍藏版)》请在冰豆网上搜索。
destructor."
intadd(){returnx+y;
private:
intx,y;
};
intmain()
TAddp1(3,4);
cout<
x+y="
p1.add()<
TAddp2(30,40);
p2.add()<
return0;
三、实验步骤
启动VisualC++6.0——选择菜单“开始/程序/MicrosoftVisualStudio6.0/MicrosoftVisualC++6.0”,启动后的用户界面如图1-1所示。
图1-1VisualC++6.0用户界面
1、创建新工程
(1)单击菜单“文件/新建”,显示“新建:
对话框,如图1-2所示。
(2)在此对话框的列表栏中,选择“Win32ConsoleApplication”(Win32控制台应用程序”)。
在“工程”栏中输入一个工程名,如实验一。
在位置文本框中选择工程所在的路径,如图中所示H:
\C++实验\实验一。
单击“确定”按钮。
图1-2“新建”对话框
(3)在弹出的“Win32ConsolApplication-Step1of1”对话框中选择Anemptyproject单选项。
然后单击“Finish”按钮,如图1-3所示。
图1-3“Win32ConsolApplication-Step1of1”对话框
(4)在“新建工程信息”对话框中单击“确认”按钮,完成工程创建过程。
2、创建C++源程序文件
(1)编辑C++源程序:
编辑C++源程序时,选择“文件”菜单项,在弹出的子菜单中选择新建(热键为Ctrl+N),出现如图1-4所示的窗口。
图1-4“新建”窗口
(2)选择“文件”选项卡,在此属性页中选择“C++SourceFile”,如图1-4所示,单击“确定”,出现如图1-5所示的编辑屏幕。
图1-5“C++”源程序编辑
(3)在“C++源程序编辑”窗口下编辑C++源程序。
在编辑窗口键入C++源程序。
如图1-6所示,输入以下源程序:
图1-6编辑C++源程序
3.编译连接和运行源程序
(1)选择菜单项“编译”,出现“编译”的下拉菜单,在该下拉式菜单中选择“编译eg1-1.cpp”菜单项,这时系统开始对当前的源程序进行编译,在编译过程中,编译器会将错误信息显示在屏幕下方的“编译”窗口中。
错误信息包括错误所在大致位置和错误的性质。
用户可根据这些错误信息进行修改。
上述程序的“编译”窗口,如图1-7所示。
图1-7“编辑”窗口
(2)编译无错误后,可进行连接生成可执行文件(.exe),这时选择“编译”下拉菜单中的“构件eg1-1.exe”选项。
“编译”窗口出现如图1-8所示的信息说明编译连接成功,并生成以源文件名为名字的可执行文件(eg1-1.exe)。
图1-8编译连接信息
(3)执行可执行文件的方法是选择“编译”菜单项中“执行eg1-1.exe”选项。
这时,运行该可执行文件,并将结果显示在另外一个显示执行文件输出结果的窗口中,如图1-9所示。
图1-9运行C++程序结果
4.关闭工作区、打开工作区
单击菜单“文件/关闭工作区”,关闭工作区。
单击菜单“文件/打开工作区”,在弹出的对话框中选定“H:
\C++实验\实验一\实验一.dsw”,单击“打开”按钮,则可打开工作区,对已建立的工程文件进行修改。
5.根据实验步骤1-4,建立、编译并运行实验程序1。
四、实验要求
1.
复习教材有关内容。
2.
掌握VC控制台应用程序的开发、调试步骤。
3.
完成实验报告。
实验二类的定义和对象的使用
一、实验目的
1、掌握类的概念、类的定义格式、类与结构的关系、类的成员属性和类的封装性;
2、掌握类对象的定义;
3、理解类的成员的访问控制的含义,公有、私有和保护成员的区别;
4、掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。
能够根据给定的要求定义类并实现类的成员函数。
二、实验内容
1、定义一个学生类(Cstudent),其中数据成员有学号、姓名、年龄,数学,外语,计算机课程的成绩,以及若干成员函数。
同时编写主函数使用这个类,实现对学生数据的赋值和输出。
要求:
(1)使用构造函数完成数据的输入;
(2)使用成员函数print()实现数据的输出;
(3)编写主函数,定义对象数组,完成相应功能;
(4)编写函数search(Cstudentstu[],intn),以学号n为参数,在数组中查找学号是n的学生,并返回该生的全部信息。
2、定义日期类Date。
(1)可以设置日期;
(2)日期加一天操作;
(3)输出函数,输出格式为“XXXX年XX月XX日”;
(4)编写主函数,定义对象,完成相应功能。
三、实验要求
1、写出程序,并调试程序,要给出测试数据和实验结果。
2、整理上机步骤,总结经验和体会。
3、完成实验报告和上交程序。
实验三多文件结构及静态成员和对象数组的使用
1、掌握自定义头文件的方法;
2、学会建立和调试多文件程序;
3、了解静态成员的使用;
4、掌握对象数组的使用。
1、编写一个函数,求从n个不同的数中取r个数的所有选择的种数。
(1)将main()函数放在一个.cpp文件中;
(2)将fn(intn),Cnr(intn,intr)放在另一个.cpp文件中;
(3)将函数原型说明放在一个头文件中;
(4)建立一个项目,将这三个文件加到你的项目中,编译连接使你的程序正常运行。
2、文件point.h中定义有一个点类Point,具有两个实数坐标。
希望主程序使用这个类完成下述功能:
(l)主程序为类point申请10个连续存储空间。
(2)要求调用一个函数Set()从键盘输入10个对象的属性,并顺序存入申请的内存中。
(3)要求调用一个函数Display()显示10个对象的值。
(4)要求调用一个函数Length(),计算将这些点连成一条折线时,这条折线的长度。
(5)程序结束时,删除申请的内存。
(6)演示析构对象(动态对象或堆对象)的执行顺序。
设计这个类和各个函数并验证运算结果的正确性。
1、写出程序,并调试程序,要给出测试数据和实验结果。
2、整理上机步骤,总结经验和体会。
3、完成实验报告和上交程序。
实验四类的继承和派生
1、理解继承的含义,掌握派生类的定义方法和实现;
2、理解公有继承下基类成员对派生类成员和派生类对象的可见性,能正确地访问继承层次中的各种类成员;
3、理解保护成员在继承中的作用,能够在适当的时候选择使用保护成员以便派生类成员可以访问基类的部分非公开的成员;
4、条件编译的运用。
多文件结构的进一步使用。
1、编写一个程序计算出球、圆柱和圆锥的表面积和体积。
(1)定义一个基类,至少含有一个数据成员半径,并设为保护成员;
(2)定义基类的派生类球、圆柱、圆锥,都含有求表面积和体积的成员函数和输出函数;
(3)编写主函数,求球、圆柱、圆锥的表面积和体积。
2、编写一个学生和教师数据输入和显示程序。
其中,学生数据有编号、姓名、班级和成绩,教师数据有编号、姓名、职称和部门。
(1)将编号、姓名输入和显示设计成一个类person;
(2)设计类person的派生类:
学生类student和教师类teacher;
(3)各个类的声明放在相应的头文件中(*.h),类的实现放在相应的实现文件中(*.cpp):
person.h,person.cpp,student.h,student.cpp,teacher.h,teacher.cpp;
(4)编写一个主文件(SY4_2.cpp),在该文件中分别定义student、teacher的对象,完成相应功能。
实验五多继承
1、理解多继承的概念
2、多继承中构造与析构的应用。
1、输入以下程序,分析运行结果。
classB1
B1(inti)
{
b1=i;
cout<
构造函数B1."
b1<
}
voidprint(){cout<
intb1;
classB2
B2(inti)
b2=i;
构造函数B2."
b2<
intb2;
classB3
B3(inti)
b3=i;
构造函数B3."
b3<
intgetb3(){returnb3;
intb3;
classA:
publicB2,publicB1
A(inti,intj,intk,intl):
B1(i),B2(j),bb(k)
a=l;
构造函数A."
a<
voidprint()
B1:
:
print();
B2:
inta;
B3bb;
voidmain()
Aaa(1,2,3,4);
aa.print();
}
2、修改上面的4个类,添加析构函数,在析构函数中输出各私有数据成员的值。
并分析结果。
实验六虚函数的使用
1、理解多态的概念。
2、理解函数的静态联编和动态联编。
3、掌握虚函数的定义。
4、理解虚函数在类的继承层次中的作用、虚函数的引入对程序运行时的影响,掌握其使用。
虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行动态联编,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。
通常此类指针或引用都声明为基类的,它可以指向基类或派生类的对象。
多态指同一个方法根据其所属的不同对象可以有不同的行为。
虚函数是C++中用于实现多态(polymorphism)的机制。
核心理念就是通过基类访问派生类定义的函数
1、录入下面程序,并分析结果:
complex>
classBase
{
Base(){cout<
Base-ctor"
~Base(){cout<
Base-dtor"
virtualvoidf(int){cout<
Base:
f(int)"
virtualvoidf(double){cout<
f(double)"
virtualvoidg(inti=10){cout<
g()"
i<
classDerived:
publicBase
Derived(){cout<
Derived-ctor"
<
~Derived(){cout<
Derived-dtor"
voidf(complex<
double>
){
Derived:
f(complex)"
voidg(inti=20){
intmain()
sizeof(Base)<
sizeof(Derived)<
Baseb;
Derivedd;
Base*pb=newDerived;
b.f(1.0);
d.f(1.0);
pb->
f(1.0);
b.g();
d.g();
g();
deletepb;
2、录入下面程序,分析运行结果:
Base():
data(count)
++count;
~Base()
--count;
}
staticintcount;
intdata;
intBase:
count;
publicBase
Derived():
data(count),data1(data)
~Derived()
intdata1;
intDerived:
count=10;
Base*pb=newDerived[3];
pb[2].data<
((static_cast<
Derived*>
(pb))+2)->
data1<
delete[]pb;
count<
实验七抽象类的使用
1、了解抽象类的概念;
2、灵活应用抽象类。
1、录入下面程序,分析编译错误信息。
new>
assert.h>
classAbstract
Abstract()
cout<
"
inAbstract()\n"
;
virtualvoidf()=0;
Abstract*p=newAbstract;
p->
f();
2、基类shape类是一个表示形状的抽象类,area()为求图形面积的函数。
请从shape类派生三角形类(triangle)、圆类(circles)、并给出具体的求面积函数。
#include<
iostream.h>
classshape
virtualfloatarea()=0;
3、定义一个抽象类Base,在该类中定义一个纯需函数virtualvoidabstractMethod()=0;
在函数的实现中输出"
abstractMethodiscalled."
,派生一个基于Base的派生类Derived,在派生类Derived的abstractMethod方法中首先调用基类的abstractMethod方法,在输出"
abstractMethodiscalled"
,最后编写主函数,其内容如下:
Base*pBase=newDerived;
pBase->
abstractMethod();
deletepBase;
分析运行结果。
实验八运算符重载和友元
1、掌握运算符重载和友元的概念;
2、掌握使用friend重载运算符的方法。
1、设计一个类,用自己的成员函数重载运算符,使对整型的运算符=、+、-、*、/适用于分数运算。
(1)输出结果是最简分数(可以是带分数);
(2)分母为1,只输出分子。
2、用友元函数重载运算符,使对整型的运算符=、+、-、*、/适用于分数运算。
实验九STL的使用
1、掌握VC中STL的使用方法;
2、掌握容器(container)、模板(template)、游标(Iterator)、算法(Algorithms)、分配器(Allocator)、向量(vector)等知识的应用。
1、vector向量的使用(目的:
理解STL中的向量),输入以下程序并运行、分析结果。
//#include"
stdafx.h"
-如果使用预编译的头文件就包含这个头文件
vector>
//STL向量的头文件。
这里没有"
.h"
。
//包含cout对象的头文件。
//保证在程序中可以使用std命名空间中的成员。
char*szHW="
HelloWorld"
//这是一个字符数组,以”\0”结束。
intmain(intargc,char*argv[]){
vector<
char>
vec;
//声明一个字符向量vector(STL中的数组)
//为字符数组定义一个游标iterator。
iteratorvi;
//初始化字符向量,对整个字符串进行循环,
//用来把数据填放到字符向量中,直到遇到”\0”时结束。
char*cptr=szHW;
//将一个指针指向“HelloWorld”字符串
while(*cptr!
='
\0'
vec.push_back(*cptr);
cptr++;
//push_back函数将数据放在向量的尾部。
//将向量中的字符一个个地显示在控制台
for(vi=vec.begin();
vi!
=vec.end();
vi++)
//这是STL循环的规范化的开始——通常是"
!
="
,而不是"
//因为"
在一些容器中没有定义。
//begin()返回向量起始元素的游标(iterator),end()返回向量末尾元素的游标(iterator)。
cout<
*vi;
}//使用运算符“*”将数据从游标指针中提取出来。
endl;
//换行
2、容器和游标的使用,输入以下程序,并调试、分析结果
#pragmawarning(disable:
4786)
string>
map>
typedefmap<
int,string,less<
int>
>
INT2STRING;
voidmain(){
INT2STRINGtheMap;
INT2STRING:
iteratortheIterator;
stringtheString="
intindex;
theMap.insert(INT2STRING:
value_type(0,"
Zero"
));
value_type(1,"
One"
value_type(2,"
Two"
value_type(3,"
Three"
value_type(4,"
Four"
value_