C++实验指导书.docx
《C++实验指导书.docx》由会员分享,可在线阅读,更多相关《C++实验指导书.docx(46页珍藏版)》请在冰豆网上搜索。
C++实验指导书
《面向对象程序设计》
实验指导书
《面向对象程序设计实验》课程组
二0一三年三月
实验预备实验环境和工具使用,多文件应用程序的开发过程3
实验一类与对象7
实验二运算符重载9
实验三继承与多态性12
实验四模板20
实验五综合应用程序一(选做一个)23
实验六使用MFC进行可视化编程25
实验七综合应用程序二(选做一个)41
实验预备实验环境和工具使用
多文件应用程序的开发过程
一、实验目的与要求
VisualC++提供了一个集源程序编辑、代码编译与调试于一体的开发环境,这个环境称为集成开发环境,对于集成开发环境的熟悉程度直接影响程序设计的效率,本实验通过学习VisualC++6.0界面的常用组成情况,并学习各种常用的窗口、菜单、按钮的意义和功能,并通过一些简单的程序设计,目的是使学生对用户界面、菜单和工具栏有一个全面的了解并掌握主要菜单命令。
●了解VisualC++集成开发环境的界面组成;
●理解菜单命令的含义
●掌握“New:
”菜单命令、“Breakpoints”菜单命令、“Build”菜单命令、“SourceBrower”菜单命令、工具栏的定制和修改、联机帮助。
●简单的程序设计
二、实验设备与平台
实验设备要求每个学生一台电脑,其中运行环境为VC++6.0系统。
三、实验内容及步骤
1.上机实验内容
●VisualC++集成开发环境的用户界面识别;
●新文件、新工程项目、工作区的创建;
●设置、查看和删除断点;
●编译和运行程序;
●浏览资源信息;
●工具栏的定制和修改;
●联机帮助的使用;
●熟悉VisualC++编写控制台模式程序的方法;
上机输入例题,调试并运行,并观察结果;
●上机编写一个程序
实验1调试并编译程序。
在VisualC++下,编写控制台模式的程序和在DOS下编写程序相似,具有简单方便的特点,一般用于后台程序的编写。
控制台模式下程序的编写有两种方法,一是创建一个C++源程序文件,二是创建一个控制台模式的工程。
⑴创建一个C++源程序文件
1启动VisualC++,单击“File”菜单下的“New”菜单命令,出现“New”对话框。
然后选择“Files”选项卡,在此选项卡的左侧,单击“C++SourceFiles”:
在选项卡的右侧,选择源程序存放的位置(location)以及源程序文件名(File),然后单击【OK】按钮。
注意C++源程序文件的扩展名为.cpp。
2在编辑区输入源程序,程序内容如下:
#include
voidmain()
{for(inti=0;i<3;i++)
{cout<<"Hello!
myfriend!
\n";}
}
3程序输入之后,请认真检查,然后按键或工具栏中的
(Build)按钮或者选择“Build”菜单命令,系统提示是否创建一个默认的工程工作区,单击【是】按钮即可。
4系统开始编译源程序并链接相应的文件,如果没有错误则在集成开发环境下方的状态栏中出现下列提示“0error(s),0warning(s)”,此时可以按+键或按下状态栏中的
按钮或者选择“Build”菜单的“Excute1_1.exe”运行程序,然后观察程序运行结果。
用户也可以在DOS(Windows98)下或控制台模式下(Windows2000或WindowsXP)直接键入文件名“1_1.exe”也可以运行程序。
⑵创建一个控制台模式的工程
1启动VisualC++,单击“File”菜单下的“New”菜单命令,出现“New”对话框。
然后选择“Projects”选项卡,在此选项卡的左侧,单击“Win32ConsoleApplication”;在选项卡的右侧,选择工程文件存放的位置(location)以及工程文件名(ProjectName)。
然后单击【OK】按钮。
2在“Win32ConsoleApplication-Step1of1”对话框中选择应用程序的类型“Anemptyproject”,单击【Finish】按钮。
3在集成开发环境的左侧单击“FileView”属性页,右键单击“SourceFiles”,选择“AddFilestoFolder…”。
在“文件名”中填入文件名,此时也可以选择存在的文件。
4此时在“SourceFiles”左侧出现一个加号,单击加号,出现新的源程序文件“1_1.cpp”,双击此文件,在集成开发环境的右侧输入例1_1.
5按照创建一个C++源程序文件的第④个步骤编译和运行程序。
图1-1向工程中添加源程序文件
图1-2选择添加的源程序文件的文件名与类型
实验2:
上机输入《C++程序设计基础》例5-9,例5-10调试并编译程序、运行通过。
实验3:
上机编写一个程序并运行通过,定义一个Box(盒子)类,在该类定义中包括:
数据成员:
length(长),width(宽),height(高);成员函数:
构造函数Box设置盒子长、宽、高三个初始数据,函数volume计算并输出盒子的体积。
在main函数中,要求创建Box对象,并求盒子的体积。
实验4:
设置、查看和删除断点。
打开实验3的工作区文件,此时,可以设置断点。
在VisualC++6.0中,断点分为位置断点(Location)、数据断点(Data)、消息断点(Message)三种类型。
本次实验只练习位置断点的设置、查看和删除。
图1-3右键单击设置断点
a)设置位置断点。
有两种方法可以设置位置断点,一是右键单击断点所在行,如图1-4所示,单击“Insert/RemoveBreakpoint”,断点所在行会出现红色的圆,标识断点设置成功。
二是让光标到达相应位置,然后单击“Edit”菜单的“Breakpoints”命令,出现如图1-5所示的“Breakpoints”对话框,在“Breakat”处选择断点所在行即可。
b)查看位置断点。
某行设置断点之后,行首位置有一个红圆,源程序较长时,查看比较麻烦,可以单击“Edit”菜单的“Breakpoints”命令,出现如图1-4所示的“Breakpoints”对话框,在对话框的左下角“Breakpoints”处看到所有的断点。
c)删除位置断点。
有两种方法可以删除位置断点,一是右键单击断点所在行,单击“RemoveBreakpoint”删除断点;二是在如图1-5所示的“Breakpoints”对话框的“Breakpoints”处选择断点,然后选择“Remove”删除断点。
图1-4“断点”对话框
实验5:
工具栏的定制和修改。
用户可以定制工具栏,只需选择“Tools”、“Customize”、“Toolbars”,如图1-8所示,选择所要定制的工具即可。
用户可以根据自己的需要添加新的工具栏,或者对已有工具栏进行修改,如添加新按钮、删除已有按钮等。
若需要添加工具栏,只需选择“Tools”、“Customize”、“Toolbars”、“New”选项,然后输入相应的名字即可。
实验6:
使用联机帮助
VisualC++6.0提供了详细的帮助信息,用户安装MSDN之后,可以通过选择集成开发环境中的“Help”菜单下的“Contents”命令就可以进入帮助系统。
在源文件编辑器中把光标定位在一个需要查询的单词处,然后按键也可以进入VisualC++6.0的帮助系统。
图1-5定制工具栏
实验一类与对象
一、实验目的与要求
(1)掌握类和对象的概念、定义和使用方法。
(2)掌握不同特性对象成员的访问方法,以及this指针的概念和使用方法。
(3)掌握构造函数和析构函数的使用方法。
(4)掌握静态成员的使用方法。
(5)掌握友员的使用方法。
学会使用VC6的Debug的功能跟踪构造函数、析构函数的执行顺序。
二、实验设备与平台
实验设备要求每个学生一台电脑,其中运行环境为VC++6.0系统。
三、实验内容及步骤
(1)定义一个score类,其中包括私有数据成员和公有成员函数,即
num学号
Math高等数学成绩
English英语成绩
Programming程序设计成绩
inscore()输入学号和各科成绩,并且计算平均成绩
showscore(时)输出学号和各科成绩
使用score类,输入某班n(事先不能确定)个学生的学号和各科成绩,然后求各个学生的平均成绩,并列表输出学生的学号、各科成绩和平均成绩。
(2)写出下列程序的执行结果,然后上机进行验证。
用VC6的Debug的功能跟踪构造函数、析构函数和成员函数的执行顺序。
#include
classTEST
{public:
TEST(){cout<<"调用构造函数"<x=2;y=50;z=9;}
TEST(inta,intb,intc)
{
cout<<"调用重载构造函数"<x=a;y=b;z=c;
}
voiddisplay()
{
cout<<"x="<}
intmax(inta,intb)
{
if(a>b)returna;elsereturnb;
}
~TEST()
{
cout<<"调用析构函数"<cout<"<}
private:
intx,y,z;
};
voidmain()
{
TESTobj1;
obj1.display();
TESTobj2(33,20,80);
obj2.display();
}
(3)假设某城市人人所得税的税基为2000元,而其征收个人所得税的规定如下:
不超过税基免征税,按超过税基部分征收所得税。
超过部分在2000元以下,征税5%;5000元以下,征税10%;10000元以下,征税15%;10000元以上,征税20%。
建立一个incomec类,共包含的数据成员和成员函数如下:
income数据成员,表示职工的实际收
wage静态数据成员,表示职工工资
taxrate静态数据成员,表示税率
setWage(doublem)成员函数,设置工资值
getTaxrate()静态成员函数,计算税率
calIncome()静态成员函数,计算职工的实际收入
在主函数中,实例化不同的incomec类对象,并计算它们的实际收入。
(4)建立一个复数类imaginary,其私有数据成员x和y表示复数的实部和虚部,构造函数imaginary用于对复数的实部和虚部初始化,友员函数add,sub,mul和div分别用于进行复数的加、减、乘和除法运算,静态函数show用于显示运算结果。
在主函数中,实例化两个复数,并输入一个运算符,按运算符选择相应的友员函数进行复数运算,然后输出运算结果。
实验指导
(1)对本实验第
(1)题,由于事先不知道学生的人数,所以在程序中可以使用动态对象数组来描述每个学生的数据和对学生的数据进行的操作。
(2)为跟踪本实验第
(2)题程序中的构造函数、析构函数和成员函数的执行,先在VisualC++主窗口中打开源程序文件,并对该程序文件进行编译。
然后使用VC6Debug的F11和F10功能键分步执行并跟踪程序。
注意观察构造函数的执行时机。
(3)假设有两个复数a+bi和c+di,则复数的加、减、乘和除法运算规定如下
(a+bi)+(c-di)=(a+c)+(b+d)i
(a+bi)-(c+di)=(a-c)+(b-d)i
(a+bi)*(c+di)=(ac-bd)+(bc+ad)i
(a+bi)/(c+di)=(ac+bd)/(c2+d2)+(bc-ad)/(c2+d2)i
实验二运算符重载
一、实验目的及要求
1、掌握用成员函数重载运算符的方法。
2、掌握用友元函数重载运算符的方法。
二、实验设备与平台
1、硬件环境:
微型计算机,2、软件环境:
VisualC++6.0;
三、实验内容及步骤
1、重载运算符“<<”和“>>”的算法实现。
#include"iostream.h"
classPoint
{intx,Y:
public:
Point(){};
friendistream&operator>>(istream&in,Point&p);//重载运算符”>>”
friendostream&operator<<(ostream&out,Point&p);//重载运算符”<<”
};
istream&operator>>(istream&in,Point&p)
{
cout<<"请输入x,y的值:
"<cout<<"x=";
in>>p.x;
cout<<"y=";
in>>p.y;
returnin;
}
ostream&operator<<(ostream&out,Point&p)
{
out<<"输出x,y的值"<out<<"x="<
returnout;
}
voidmain()
{PointP;
Cin>>P;
Count<
}
2、求最后的长方形面积。
给出程序的运行结果。
#include"iostream.h"
classOblong//定义长方形类
{
intlength,width;//定义长、宽变量
public:
Oblong(){;}//构造函数
Oblong(intx,inty)//构造函数
{
length=x:
width=y:
}
Oblongoperator,(Oblongo);//声明逗号运算符重载成员函数
Oblongoperator+(Oblongo);//声明加号运算符重载成员函数
voidDisp()
{
cout<<"面积:
"<}
};
OblongOblong:
:
operator,(Oblongo)//逗号运算符重载成员函数的实现
{
Oblongtemp;
temp.length=o.length;
temp.width=o.width;
returntemp;
}
OblongOblong:
:
operator+(Oblongo)
{
Oblongtemp;
temp.length=o.length+length;
temp.width=o.width+width:
returntemp;
}
voidmain()
{
Oblongo1(2,2),o2(5,7),o3(10,20);//建长方形类的3个对象
o1.Disp();//显示对象of的面积
o1=(ol,o1+o2);//先计算o1,再计算ol+o2,返回ol+o2的结果
ol.Disp():
o1=(o1,o2+o3,o3);
o1.Disp();
}
3、编写程序,有两个均为3行3列的矩阵ml和m2,求两个矩阵之和。
重载运算符“+”、“>>”和“<<”,使之能用于矩阵相加、输入和输出。
四、思考问题及课后练习
1、定义一个复数类,通过重载运算符:
“ *”,“/”,直接实现二个复数之间的乘除运算。
编写一个完整的程序,测试重载运算符的正确性。
要求乘法"*"用友元函数实现重载,除法"/"用成员函数实现重载。
分析:
两复数相乘的计算公式为:
(a+b i)*(c+d i)=(ac-bd )+(ad+bc) i
两复数相除的计算公式为:
(a+b i)/(c+d i)=(ac+bd)/(c*c+d*d)+(bc-ad)/(c*c+d*d) i
2、设计一个学生类Student,包括姓名和三门课的成绩,利用重载运算符“+”将所有学生的成绩放入一个对象中,再对该对象求各门课程的平均分。
3、编写一个时间类,实现时间对象的加、减运算并输出。
实验三继承与多态性
一、实验目的及要求
1、掌握继承、基类和派生类的概念。
2、掌握初始化基类成员的方法。
3、掌握派生类对基类的继承。
4、学习虚函数和纯虚函数的定义与使用方式。
5、理解抽象类的概念,学习如何用指针指向其他的派生类,实现多态性。
6、掌握抽象类的定义与使用方式,并注意指针的用法。
7、学习如何使用虚函数、纯虚函数、抽象类和实现类的多态性。
二、实验设备与平台
1、硬件环境:
微型计算机,2、软件环境:
VisualC++6.0;
三、实验内容及步骤
1、定义派生类的实例
#include"stdafx.h"
#include"string.h"
#include"iostream.h"
classSTUDENT
{protected:
charm_no[12],m_name[11];
intm_sex,m_year,m_month,m_day;
public:
STUDENT(){}
voidset(char*no,char*name,intsex,intyear,intmonth,intday)
{strcpy(m_no,no);
strcpy(m_name,name);
m_sex=sex;
m_year=year;
m_month=month;
m_day=day;
}
voidset_no(char*no)
{strcpy(m_no,no);}
voidset_name(char*name)
{strcpy(m_name,name);}
voidset_sex(intsex)
{m_sex=sex;}
voidset_year(intyear)
{m_year=year;}
voidset_month(intmonth)
{m_month=month;}
voidset_day(intday)
{m_day=day;}
char*get_no()
{returnm_no;}
char*get_name()
{returnm_name;}
intget_sex()
{returnm_sex;}
intget_year()
{returnm_year;}
intget_month()
{returnm_month;}
intget_day()
{returnm_day;}
};
classCLASS:
publicSTUDENT
{protected:
intm_c,m_english;
public:
CLASS(){}
voidset_c(intc)
{m_c=c;}
voidset_english(intenglish)
{m_english=english;}
intget_c()
{returnm_c;}
intget_english()
{returnm_english;}
voidlist()
{cout<<"\n学号:
"<cout<<"\n姓名:
"<cout<<"\n性别:
"<<((m_sex==0)?
"女":
"男");
cout<<"\n出生日期:
"<cout<<"\nC++:
"<cout<<"\n英语:
"<}
};
intmain(intargc,char*argv[])
{
charstr[100];
intx,i;
CLASSs[10];
for(i=0;i<=1;i++)
{cout<<"\n\n请输入学生的学号:
";
cin>>str;
s[i].set_no(str);
cout<<"姓名:
";
cin>>str;
s[i].set_name(str);
cout<<"性别:
";
cin>>x;
s[i].set_sex(x);
cout<<"出生日期:
";
cin>>x;
s[i].set_year(x);
cin>>x;
s[i].set_month(x);
cin>>x;
s[i].set_day(x);
cout<<"C++:
";
cin>>x;
s[i].set_c(x);
cout<<"英语:
";
cin>>x;
s[i].set_english(x);
}
for(i=0;i<=1;i++)
s[i].list();
cout<<"\n\n";
return0;
}
2、多重继承的实例
#include"stdafx.h"
#include"iostream.h"
classBASE1
{public:
voidshow_i()
{cout<
protected:
inti;
};
classBASE2
{public:
voidshow_j()
{cout<protected:
intj;
};
classDERIVED:
publicBASE1,publicBASE2
{public:
voidset(intx,inty)
{i=x;j=y;}
};
intmain(intargc,char*argv[])
{DERIVEDobj;
obj.set(5,7);
obj.show_i();
obj.show_j();
return0;
}
3、有一个图书馆类,内有数据成员“借书卡号”和“书名”;还有一个学生类,内有数据成员“姓名”。
试设计一个读者类,它是图书馆类和学生类的派生类,继承了它们的所有数据成员和成员函数,在此基础上要添加一个查找函数,可根据输入的读者姓名,显示出该读者的相关信息。
程序设计:
(1)定义一个图书馆类Library,其主要功能是记录读者的借书卡号和书名。
(2)定义一个学生类Student,它的主要作用是记录读者的姓名。
(3)定义一个通过读者类