}
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;