1、杜红燕 编C+程序设计课程试验指导书长 沙 学 院 计 算 机 科 学 和 技 术 系前 言本书是C+程序设计课程试验指导书。初学程序设计人,全部有一个体会,看程序轻易,但自己动手写程序难,甚至感觉无从下手,究其原因就在于没有把握住学习程序设计根本方法,学习程序设计关键是多实践,经过上机体会和掌握程序设计思想和方法,经过上机验证程序正确性,为此我们编写了这本试验指导书。本书关键内容分为三个部分,第一部分为试验内容,对每个试验试验目标、试验类型、试验课时、试验原理及知识点、试验环境(硬件环境、软件环境)和试验内容及步骤进行简单介绍,第二部分为试验指导,对每个试验试验方法,试验步骤及补充试验知识进
2、行具体介绍,第三部分为试验汇报。C+程序设计环境有很多,在这里我们选择是MicroSoft Visual C+ 6.0。对书中每个试验题目,在试验指导部分全部给出了编程提醒,部分试验给出了程序参考代码,最终还介绍了常见标准库函数函数原型。需要强调一点,程序设计是一个创作过程,处理一个问题方法不是唯一,所以请大家在阅读本书试验指导之前,已经独立思索过对这些问题处理方法,这么才有利于程序设计水平提升。 编者2 月目 录第一部分 试验内容试验1:类定义和结构2试验2:堆和拷贝结构函数、静态组员和友元、运算符重载4试验3:经过继承进行软件渐增式开发8试验4:I/O流和文件操作.11试验5:模板和异常处
3、理13第二部分 试验指导Visual C+ 6.0集成环境.16试验1:类定义和结构26试验2:堆和拷贝结构函数、静态组员和友元、运算符重载31试验3:经过继承进行软件渐增式开发34试验4:I/O流和文件操作.39试验5:模板和异常处理 43C/C+常见标准库函数 46第一部分试验内容试验1:类定义和结构一、试验目标1、掌握类定义和使用2、学习结构类方法3、掌握怎样定义结构函数和析构函数4、掌握初始化对象方法5、了解面向对象程序设计思想二、试验类型验证三、试验课时4课时四、试验原理及知识点1、类定义2、类组员访问控制3、类数据组员和组员函数4、结构函数和析构函数5、对象定义和初始化五、试验环境
4、(硬件环境、软件环境)1、软件:Windows 操作系统,Visual C+ 6.02、硬件:CPU 飞跃;内存64兆以上(最好128兆以上);六、试验内容及步骤1、定义一个描述学生通讯录类,数据组员包含:姓名、学校、电话号码和邮编;组员函数包含:输出各个数据组员值,分别设置和获取各个数据组员值。2、将第一个上机试验题中组员函数Init改为结构函数,将组员函数FreeSpace改为析构函数。增加一个缺省结构函数,使指针pName,pSchool和pNum初值为0,使Box包含空字符串。3、定义分数类Rational,要求在private部分用整数表示分子和分母,分子和分母以简化形式表示,即24
5、/36应该以2/3形式表示,并提供public组员函数实现以下功效:(1) 两个分数相加,结果表示为简化形式;(2) 两个分数相减,结果表示为简化形式;(3) 按a/b形式输出分数值,a、b为整数;(4) 按浮点数形式输出分数值。七、思索和练习1、编写Time类,要求:(1) 包含年、月、日、时、分、秒信息;(2) 结构函数将类对象初始化为系统目前时间(使用头文件time.h中time()函数);(3) 能按标准格式输出对象表示时间。2、编写矩形类,要求能够提醒用户输入矩形长度和宽度,并显示该矩形长度、宽度和面积。试验2:堆和拷贝结构函数、静态组员和友元、运算符重载一、试验目标1、领会拷贝结构
6、函数实质2、学会使用堆对象分配和释放3、领会运算符重载意义4、学会使用this指针5、了解友元语法和含义6、在此基础上领会和掌握面向对象程序设计思想。二、试验类型验证三、试验课时4课时四、试验原理及知识点1、堆对象分配和释放2、拷贝结构函数3、类复合4、This指针5、静态数据、友元函数和友元类6、运算符重载概念7、单目运算符重载8、双目运算符重载9、重载流插入和流提取运算符10、赋值运算符重载五、试验环境(硬件环境、软件环境)1、软件:Windows操作系统,Visual C+ 6.02、硬件:CPU 飞跃;内存64兆以上(最好128兆以上);六、试验内容及步骤1、建立一个Stock类,含有
7、股票代码和股票现价两个数据组员。用new自动为Stock类对象分配内存,并将股票”600001”,现价8.89存入内存对应域中。在类中增加静态数据组员记载创建对象个数,增加拷贝结构函数并调用。2、对以下圆柱类Column定义:class Column public:Column(double x, double y, double r, double h);Column();double area();/求圆柱面积double volume();/求圆柱体积private:double height;/高度double radius;/半径double x;/底面圆心x坐标double y;/
8、底面圆心y坐标;要求:(1) 实现类Column中四个组员函数;(2) 增加一个友元函数,实现从键盘读取四个double类型数据对类Column对象进行赋值功效;(3) 增加一个友元函数,实现将类Column对象输出到屏幕功效,输出信息包含对象基础信息和对象面积和体积。3、对于下面定义类Test:class Test private:int a;double b;要求:(1) 为类Test每个数据组员增加一个set函数,并使这些set函数全部能够被连续调用;(2) 为类Test每个数据组员增加一个get函数。(3) 假如要求全部get函数全部能够被连续调用,这些函数该怎样编写?4、 定义一个复
9、数类,经过重载运算符: *,/,直接实现二个复数之间乘除运算。编写一个完整程序,测试重载运算符正确性。要求乘法“*”用友元函数实现重载,除法“/”用组员函数实现重载。七、思索和练习1、定义一个复数类,经过重载运算符: *,/,直接实现二个复数之间乘除运算。编写一个完整程序,测试重载运算符正确性。要求乘法“*”用友元函数实现重载,除法“/”用组员函数实现重载。2、定义包含年、月、日信息日期类Date,并重载二元运算符“+”,使之含有日期对象和整数(天数)相加功效,并编程测试。3、下列程序定义了一实部为real,虚部为imag复数类complex,要求重载运算符“+”、“-”、“*”实现复数对象加
10、法、减法、乘法运算,并编写测试程序。假如要进行a = b + c * d;(a、b、c、d全部是类Complex对象)这么运算,需要重载赋值运算符吗?为何?class Complexpublic:complex(double r=0, double i=0)real=r; imag=i; private:double real, imag;4、于下面类MyString,要求重载部分运算符后能够计算表示式:a = b + c;,其中a、b、c全部是类MyString对象。请重载对应运算符并编写程序测试。class MyString public:MyString(char *s) str = n
11、ew charstrlen(s)+1;strcpy(str, s);MyString() delete str;private:char *str;5、对于下面Time类:class Time public:Time(int h = 0, int m = 0, int s = 0);private:int hour, minute, second;要求:(1) 实现结构函数,是类Time数据组员能够得到正确赋值;(2) 重载流插入运算符,根据hh-mm-ss格式输入类Time对象。试验3:经过继承进行软件渐增式开发一、试验目标1、掌握继承方法,了解多态性2、掌握虚函数使用方法,观察其多态性3、
12、掌握软件渐增式开发方法二、试验类型设计三、试验课时6课时四、试验原理及知识点1、继承和派生基础概念2、继承定义3、基类和派生类对象转换4、类指针使用5、多态性意义和作用6、虚函数定义方法7、抽象基类作用和定义方法8、虚析构函数作用和使用方法9、怎样在程序中实现多态性10、软件渐增式开发方法五、试验环境(硬件环境、软件环境)1、软件:Windows操作系统,Visual C+ 6.02、硬件:CPU 飞跃;内存64兆以上(最好128兆以上);六、试验内容及步骤1、下面是一个形状类Shape,编写类Shape派生类:圆类Circle、三角形类Triangle和矩形类Rectangle,并重定义基类
13、组员函数使之返回正确结果(show函数要输出对象基础信息),然后编写程序测试它们。class Shape public:/形状面积double area() return 0;/形状周长double girth() return 0;/输出对象信息void show() coutShape Object: b+c,ba+c,ca+b;编写程序,输入a,b,c,检验a,b,c是否满足以上条件,如不满足,由cerr输出相关犯错信息。2、建立两个磁盘文件f1.dat和f2.dat,编写程序实现以下工作:(1) 从键盘输入20个整数,分别存放在两个磁盘文件中(每个文件放10个);(2) 从f1.dat
14、读入10个数,然后存放到f2.dat文件原有数据后面;(3) 从f2.dat中读入20个整数,将它们按从小到大次序存放到f2.dat(不保留原来数据)。3、设计一个管理图书目标简单程序,提供基础功效包含:可连续将新书存入文件“book.dat”中,新书信息加入到文件尾部;也能够依据输入书名进行查找;把文件“book.dat”中同书名全部书显示出来。为简单起见,描述一本书信息包含:书号,书名,出版社和作者。试验5: 模板和异常处理一、试验目标了解模板概念、定义,了解C+异常处理机制。二、试验类型验证三、试验课时4课时四、试验原理及知识点1、异常基础概念2、异常触发、传输和处理3、类属程序设计4、
15、模板定义和使用五、试验环境(硬件环境、软件环境)1、软件:Windows操作系统,Visual C+ 6.02、硬件:CPU 飞跃;内存64兆以上(最好128兆以上);六、试验内容及步骤1、编写一个程序,使用new运算符动态分配空间,当空间分配失败时抛出异常,并捕捉处理该异常,处理异常时要考虑不能有内存泄漏。2、写一个函数模板,求数组中最大元素。使得函数调用时,数组类型和返回值类型能够是整数也能够是双精度类型。3、以下是一个整数栈类定义:const int SIZE=100;class Stackpublic:Stack(); Stack();void Push(int n);int Pop(
16、);private:int stackSIZE;int tos;(1) 编写一个栈类模板(包含其组员函数定义),方便为任何类型对象提供栈数据结构操作(2) 在应用程序中创建整数栈、字符栈和浮点数栈,并提供部分数据供进栈、退栈和打印操作七、思索和练习求一元二次方程式ax2+bx+c=0实根,假如方程没有实根,则利用异常处理机制输出相关警告信息。第二部分试验指导Visual C+ 6.0集成环境一、VC+6.0关键菜单、工具可视化和面向对象编程技术是当今世界流行编程技术,在众多开发工具中,Microsoft企业VC+6.0独树一帜,深得广大程序员青睐。VC+6.0提供了编写应用程序全部工具,它包含
17、了很多单独组件,并由窗口、对话框、菜单、工具栏等组成了一个统一整体。首先,看一下开启主界面:1.VC+6.0菜单Visual C+ 6.0菜单栏图所表示,其中包含File,Edit,View等共九个菜单选择项,经过它们,你能够轻松地完成编辑程序和资源、编译、链接及调试程序等各项工作。要激活菜单栏中菜单有两种方法:一是用鼠标左键直接单击对应菜单,另一个方法是在按住Alt键同时,按下对应菜单热键,比如要激活Edit菜单只要按下Alt+E键即可。下图 是Visual C+ 6.0主菜单,当激活某个菜单后,会弹出对应下拉子菜单。其中包含了多个菜单项,用于实施对应功效或命令有部分常见菜单命令含有快捷键,
18、比如File菜单中New菜单命令,它快捷键是Ctrl+N,只要直接按下此快捷键就能够实施对应菜单命令。有菜单项显示为灰色,表示这些菜单命令在此时为禁用状态。以下介绍多个常见菜单,这些在以后编程中会常常使用。1、 File文件菜单File菜单图所表示,其中包含了多种对文件进行操作选项,如加载、保留、打印和退出等。各菜单项功效分述以下:New菜单项(Ctrl+N)此菜单项快捷键是Ctrl+N。用于创建新文件、工程、工作区或其它文档。当您选中此菜单项后,屏幕将会出现New对话框,图所表示。其中包含了4个选项卡:File、Project、Workspace和Other Documents。在File选
19、项卡中,您能够选择创建多种文件,当选中Add to project复选框时,则新创建文件将加入到目前工程中。表1-1 New对话框中可创建项目类型工程选项 说 明ATL COM AppWizard 创建ATL应用程序Cluster Resource Type Wizard 创建多重资源类型Custom AppWizard 创建自定义AppWizardDatabase Project 创建数据库项目DevStudio Add-in Wizard 创建自动化宏Extended Stored Proc Wizard 创建扩展存放过程ISAPI Extension Wizard 创建Internet服
20、务器或过滤器 Makefile 创建Make文件MFC ActiveX ControlWizard 创建ActiveX控件程序MFC AppWizard dll 创建MFC动态链接库MFC AppWizard exe 创建MFC可实施程序Utility Project 创建实用工具项目Win32 Application 创建Win32应用程序Win32 Console Application 创建Win32控制台应用程序 此项即为控制台程序项目Win32 Dynamic-Link Application 创建Win32动态链接库Win32 Static Library 创建Win32静态库在新
21、建立程序时,首先要建立工程项目文件,依据程序类型选择工程。上表说明了多种工程项目标说明。File选项卡中能够创建文件类型见表1-2New对话框中可创建文件类型 文件选项 说 明ActiveX Server Page 创建活动服务器页Binary File 创建二进制文件Bitmap File 创建位图文件C/C+ Header File 创建C/C+头文件C+ Source File 创建C+源文件Cursor File 创建光标文件HTML Page 创建HTML文件Icon File 创建图标文件2、编辑菜单Edit菜单中命令是用来使用户便捷地编辑文件内容,如进行删除、复制等操作,其中大多
22、数命令功效和windows中标准字处理程序编辑命令一致。3、VIEW菜单:view菜单中命令关键用来改变窗口和工具栏显示方法,激活调试时所用各个窗口等。4、插入菜单Insert菜单中命令关键用于项目及资源创建和添加。5、Project菜单Project菜单中命令关键用于项目操作,如项目中添加源文件等。6、Build菜单Build菜单中命令关键用来应用程序编译、连接、调试、运行。7、工具菜单Tools菜单中命令关键用于选择或制订开发环境中部分实用工具。8、窗口菜单Windows菜单中命令关键用于文档窗口操作。如排列文档、打开或关闭一个文档窗口、重组或切分文档窗口等。9、帮助菜单Visual C+
23、6.0同大多数其它Windows 应用软件一样,提供了大量具体帮助信息,而Help菜单便是得到这些帮助信息最有效和最关键路径。2.VC+6.0标准工具栏 标准工具栏中工具按钮命令大多数是常见文档编辑命令,如新建、保留、撤消、恢复、查找等。 小型编连工具栏 小型编连工具栏提供了常见编译、连接操作命令。 二、用VC+6.0开发控制台程序1.开启VC+6.0,选择“文件”菜单下“新建”命令。弹出下列对话框。2.选择Win32 Console Application项目,给项目起个名称如hello,并设置存放路径,点击确定后到以下图示:3.选择一个空项目,点击确定。4.再点击新建菜单项:在弹出对话框中
24、,选择文件选项,并选择C+ Source File,为文件起名并设置好文件路径:5.这时,在打开代码编辑窗口里输入代码。6.点击编译按钮和Build按钮并运行得到结果以下:试验1:类定义和结构1、定义一个描述学生通讯录类,数据组员包含:姓名、学校、电话号码和邮编;组员函数包含:输出各个数据组员值,分别设置和获取各个数据组员值。编程提醒:(1)因为姓名、学校和电话号码数据长度是可变,可使用动态数据结构。邮编长度是固定,可定义一个字符数组来存放邮编。将数据组员均定义为私有。(2)用一个组员函数输出全部组员数据,用一个组员函数完成初始化,用四个组员函数分别设置姓名、学校、电话号码和邮编,再用四个组员
25、函数分别获取姓名、单位、电话号码和邮编。(3)主函数完成简单测试工作。类定义参考:class COMMUprivate:char *pName;/姓名,数据组员为私有 char *pSchool;/单位 char *pNum;/电话号码char Box10;/邮编public:void Print(void);/输出数据组员void Init(char *,char *,char *,char *);/完成初始化void FreeSpace(void);/释放数据组员占用空间void SetName(char *name);/置姓名void SetScool(char *unit);/置学校名
26、称void SetNum(char *num);/置电话号码void SetBox(char *mailnum);/置邮编char *GetName(void);/取姓名char *GetScool(void );/取学校char *GetNum(void);/取电话号码char *GetBox(void)/取邮编;2、将第一个上机试验题中组员函数Init改为结构函数,将组员函数FreeSpace改为析构函数。增加一个缺省结构函数,使指针pName,pSchool和pNum初值为0,使Box包含空字符串。编程提醒:(1) 缺省结构函数完成数据组员初始化,依据试验题要求,该缺省结构函数能够是:C
27、OMMU()/缺省结构函数pName = pSchool = pNum =0;Box0 = 0; (2) 用结构函数COMMU替换组员函数Init功效,只要将函数名Init改为COMMU,即: COMMU(char *name,char *unit,char *num,char *b)/重载结构函数pName = new char strlen(name)+1;strcpy(pName,name);pSchool = new char strlen(unit)+1;strcpy(pSchool,unit);pNum = new char strlen(num)+1;strcpy(pNum,nu
28、m);strcpy(Box,b);(3) 用析构函数COMMU替换组员函数FreeSpace,该析构函数为:COMMU( )/析构函数 if(pName) delete pName;if(pSchool) delete pSchool;if(pNum) delete pNum;3、定义分数类Rational,要求在private部分用整数表示分子和分母,分子和分母以简化形式表示,即24/36应该以2/3形式表示,并提供public组员函数实现以下功效:(1) 两个分数相加,结果表示为简化形式;(2) 两个分数相减,结果表示为简化形式;(3) 按a/b形式输出分数值,a、b为整数;(4) 按浮点
29、数形式输出分数值编程提醒:完整程序参考代码:/Rational.hclass Rational public:Rational(int fz, int fm);void add(Rational &one);void sub(Rational &one);void print();void outputAsFloat();private:void simple();int fenzi;int fenmu;/Rational.cpp#include Rational.h#include #include Rational:Rational(int fz, int fm)fenzi = fz;if
30、 (fm != 0)fenmu = fm;elsefenmu = 1;simple();void Rational:add(Rational & one)int a, b;a = fenmu * one.fenmu;b = fenzi * one.fenmu + fenmu * one.fenzi;fenmu = a;fenzi = b;simple();void Rational:sub(Rational & one)int a, b;a = fenmu * one.fenmu;b = fenzi * one.fenmu - fenmu * one.fenzi;fenmu = a;fenzi
31、 = b;simple();void Rational:print()coutfenzi / fenmuendl;void Rational:outputAsFloat()float a = (float)fenzi/fenmu;couta 1; i-)if (abs(fenzi) % i = 0 & abs(fenmu) % i = 0)fenzi = fenzi / i;fenmu = fenmu / i;/main.cpp#include Rational.hmain()Rational a(24, 18), b(12, 36), c(6, 8);a.add(b);b.sub(c);a.
32、print();a.outputAsFloat();b.print();b.outputAsFloat();return 0;试验2:堆和拷贝结构函数、静态组员和友元、运算符重载1、建立一个Stock类,含有股票代码和股票现价两个数据组员。用new自动为Stock类对象分配内存,并将股票”600001”,现价8.89存入内存对应域中。在类中增加静态数据组员记载创建对象个数,增加拷贝结构函数并调用。编程提醒:(1) 堆对象分配Stock p;p=new Stock;(2) 堆对象释放delete p;(3) 堆对象赋值p-set(“600001”,8.89);(4) 拷贝结构函数Stock(St
33、ock &s);思索:拷贝结构函数函数体应完成什么功效?(5) 静态数据组员static int N_count;思索:静态数据组员在程序中什么位置初始化?在程序中什么位置计数?2、对以下圆柱类Column定义:class Column public:Column(double x, double y, double r, double h);Column();double area();/求圆柱面积double volume();/求圆柱体积private:double height;/高度double radius;/半径double x;/底面圆心x坐标double y;/底面圆心y坐标
34、;要求:(1) 实现类Column中四个组员函数;(2) 增加一个友元函数,实现从键盘读取四个double类型数据对类Column对象进行赋值功效;(3) 增加一个友元函数,实现将类Column对象输出到屏幕功效,输出信息包含对象基础信息和对象面积和体积。编程提醒:友元函数申明:void friend set(Column &t);void friend print(Column &t);3、对于下面定义类Test:class Test private:int a;double b;要求:(1) 为类Test每个数据组员增加一个set函数,并使这些set函数全部能够被连续调用;(2) 为类Te
35、st每个数据组员增加一个get函数。(3) 假如要求全部get函数全部能够被连续调用,这些函数该怎样编写?编程提醒:要满足类对象能够连续调用其组员函数,这些组员函数返回值就必需是调用该函数对象本身,所以返回类型是该类型引用,返回值则是*this4、定义一个复数类,经过重载运算符: *,/,直接实现二个复数之间乘除运算。编写一个完整程序,测试重载运算符正确性。要求乘法“*”用友元函数实现重载,除法“/”用组员函数实现重载。编程提醒:(1) 两复数相乘计算公式为:(a+b i)*(c+d i)=(acbd )+(ad+bc) i(2) 两复数相除计算公式为:(a+b i)/(c+d i)=(ac+bd)/(c*c+d*d)+(bc-ad)/(c*c+d*d) i(3) 复数类及运算符重载函数可定义为: class Complexfloat Real, Image;public:Complex(float r=0,float i=0) Real=r;Image=i;void Show()cout Real=RealtImage=Imagen;friend Complex operator *(Complex &, Complex &);/重载运算符*Complex operator /(Complex &);/重载运算