1、saw锯sawedsawed / sawnspread传播spreadspreadwin获胜wonwonsaw锯sawedsawed / sawnfeed喂fedfedburn燃烧burnt / burnedburnt / burnedmay可以mightmistake误认mistookmistakenstand站立stoodstoodflee逃跑fledfledC+程序设计教案海南软件职业技术学院Hainan Software Profession Institute(2006-2007学年度第一学期)教师姓名: 季文 天 系 部: 软 件 工 程 系 授课专业: 软 件 技 术 授课班级:
2、 05软件技术 3班 目录课题01:Visual C+6.0开发环境2课题02:C+数据类型、表达式、语句5课题03: 数组7课题04: 结构类型11课题05:函数13课题06:函数参数16课题07:内联函数与递归函数19课题08:函数重载21课题09: 指针23课题10: 指针与数组、字符串指针26课题11: 指针与函数28课题12: 指针与动态分配内存31课题13: 引用33课题14: 类与对象36课题15: 类的静态成员及常量成员39课题16: 友元43课题17: 运算符重载46课题18: 继承与派生49课题19: 派生关系中的二义性处理53课题20: 虚基类56课题21: 多态性与虚函
3、数59课题22: 模板62课题23: 文件、流及C+的流类库66课题24: 插入与提取运算符的重载69课题25: 磁盘文件I/O70课题01:Visual C+6.0开发环境一、教学目标:1.掌握Visual C+6.0开发工具的选单、工具栏、项目、工作区等概念2.掌握使用VC编写控制台应用程序3.掌握使用VC进行程序调试二、教学重点:1、掌握Visual C+6.0开发工具的选单、工具栏、项目、工作区等概念三、教学难点:1、使用VC编写控制台应用程序。2、使用VC进行程序调试四、课时安排:2节课五、教具准备:多媒体教室六、教学方法:讲授七、教学过程:(一)、复习导入Visual C+是Mic
4、rosoft公司推出的目前使用极为广泛的基于Windows平台的可视化开发环境。Visual C+ 6.0 是在以往版本不断更新的基础上形成的,由于其功能强大、灵活性好、完全可扩展以及具有强有力的Internet支持,在各种C+语言开发工具中脱颖而出,成为目前最为流行的C+语言集成开发环境。(二)、讲授新课1、开发环境概述:板书或幻灯片演示下图:Visual C+6.0开发环境包括:l 标题栏l 工具栏l 选单l 项目工作区窗口l 输出窗口l 状态栏l 文档窗依次介绍各项功能,详细介绍选单、工具栏、项目工作区。2、简单的控制台应用程序使用Appwinzard创建一个控制台应用程序,使学生理解“
5、工程”概念,熟悉项目的程序框架,以及如何添加程序代码、编译、运行。以下面程序为例,讲述如何建立控制台应用程序:【例Ex_Hello】#include int main(int argc,char* argv)cout”Hello world”;return 0;【运行结果】:【例Ex_Hello】利用投影演示P18例Ex_Hello。3、程序调试在软件开发过程中,大部分的工作往往体现在程序的调试上。调试一般按这样的步骤进行:“修正语法错误设置断点启用调试器控制程序运行查看和修改变量的值”l 修正语法错误调试最初的任务主要是修正一些语法错误,比如:n 未定义或不合法的标识符n 数据类型或参数类型
6、及个数不匹配。l 设置断点用C+调试的断点可以有以下类型:n 为之断点n 数据断点n 条件断点l 启用调试器Visual C+ 6.0创建的项目,系统会自动为项目创建Win32 Debug版本的默认配置,选择”build”选单-“start debug”-“Go”、”step into” 、 “Run to cursor”命令,就可以启动调试器了。l 控制程序运行可以通过”step into ,step over ,step out ,run to cursor”控制程序运行。l 查看和修改变量的值在程序调试的时候VC会自动显示”Watch”和”Variables”两个调试窗口,通过这两个窗口
7、可以查看或修改当前运行程序的变量的值。课题02:C+数据类型、表达式、语句一、教学目标:1.掌握C+程序结构、基本组成2.掌握C+的基本数据类型、基本输入/输出3.掌握C+运算符、表达式4.掌握C+基本语句二、教学重点:1.C+程序结构、基本组成2.C+基本数据类型、输入输出三、教学难点:1.C+运算符、表达式2.C+基本语句四、课时安排:2节课五、教具准备:多媒体教室六、教学方法:讲授七、教学过程:(一)、复习导入C+是在20世纪80年代初期由贝尔实验室设计的一种在C语言的基础上增加了面向对象支持的语言,她是目前应用最为广泛的编程语言。今天我们来学习他的基本结构、数据类型、运算符和表达式、基
8、本语句。(二)、讲授新课1、C+程序结构一个C+程序往往由预处理命令、语句、函数、变量和对象、输入与输出以及注释几个部分组成。l 预处理命令包括:宏定义命令、文件包含命令和条件编译命令l 语句语句是组成程序的基本单元l 函数一个C+程序是由若干个函数组成。一个程序中有且仅有一个主函数main.l 变量和对象C+是面向对象的语言,所以在C+中相比C语言多了对象,她是“类”的实例l 输入输出程序中总是少不了输入和输出语句。l 注释注释可以提高程序的可读性、帮助程序员理解,在程序运行中不执行。在编写C+程序时,还要注意程序的书写风格,要注意缩进和注释。在编写程序时,标识符应该遵循以下原则:l 合法性
9、l 有效性l 异读性2、基本数据类型C+数据类型分为基本数据类型、派生类型以及复合类型3类。基本数据类型包括:l charl intl floatl double以及上述类型的变种,包括l shortl longl signedl unsignedl voidP29表2.1列出了C+的基本数据类型根据数据在程序中的可变性,我们将数据分为:l 常量n 整型常量n 浮点型常量n 字符常量n 字符串常量n 符号常量l 变量n 变量定义n 变量的初始化要注意一个未初始化的变量不是没有数值,而是取决于变量在系统中的存储形式,她可能是系统的默认值或无效值。3、基本输入、输出C+中是通过标准的输入流cin和
10、标准输出流cout来实现数据的输入输出。【举例:Ex_CoutEnd】【举例:Ex_Algorism】4、运算符和表达式C+用来记述运算的符号称为运算符,按照操作数的个数可以分为:n 单目运算符n 双目运算符n 三目运算符根据其功能可以分为:n 算术运算符n 赋值运算符n 关系运算符n 逻辑运算符n 位运算符变量、常量通过一个或多个运算符组合起来就构成了表达式,比如有关系运算符构成的表达式成为关系表达式。5、基本语句C+提供了如表达式语句、复合语句、选择语句和循环语句等,满足了结构化程序设计所需要的3中基本结构。n 选择语句n 条件语句 if elsen 开关语句switchn 循环语句n w
11、hilen do whilen for以上基本语句和C语言保持一致。课题03: 数组一、教学目标:1.了解构造类型的意义2.了解数组的概念3.掌握一维数组、多维数组的定义二、教学重点:1一维数组的定义2数组的基本操作三、教学难点:1多维数组将维处理过程及多维数组的存储2字符串数组的使用四、课时安排:2节课五、教具准备:多媒体教室六、教学方法:讲授七、教学过程:(一)、复习导入在计算机所处理的数据中,最常见的,也是最需要由计算机高速处理的数据是成批出现的同一类型的数据,C+语言中把这类数据称为数组。例如: 监测系统在一段时间内获得的检测、采样值,可能是int 型或float 型数据的数组; 一个
12、管理系统的数据库,可能是一系列结构类型(记录)数据的序列; 一幅电视图像,可能是其每个像素的颜色及灰度值(整型数)的二维阵列。任何一种类型的一批数据,都可以组成数组,例如int 型,float 型,char 型数据可以组成数组;这些基本类型的派生类型(如long 型,double 型,unsigned char 型)的数据,枚举、结构、联合类型的数据,以至由用户或系统定义的类(类型)的对象,都可以组成数组。(二)、讲授新课1、一维数组由n 个同一类型数据组成的一维序列,构成一维数组,一维数组的下标为0,n-1。1一维数组的说明任何一种已知类型数据都可说明为数组,数组说明的格式为: ;类型名:可
13、以是基本类型名,基本类型的派生类型名,类名,枚举类型名,结构,联合类型名(也可以是枚举、结构联合的类型说明)。关于指针数组将在下节说明。还有数组类型的数组就是多维数组了,也将在下面介绍。数组名:标识符,数组名有两个附加作用:(1)是表示数组元素的下标变量。如array2表示数组的第三个元素。(2)它还是一个指向数组的首元指针。元素数:一个正整数,指出数组的元素个数,或数组的大小(size)。元素数要用方括号“”括起来。方括号不可缺省,元素数则有时可缺省,这时必须赋初值,系统按所赋的初值个数确定数组的大小。初值表:可缺省。是由花括号,括起来且用逗号,分开的初始化常量值。例如:int list 1
14、00,A1010 ,B4,3,2;char ch26;complex com4=(3.2,4.7),(0.0,0.0);其中,数组list100未赋初值。数组A1010为一个二维数组,未赋初值。数组B已赋初值,元素数为3。数组com4是用户定义的complex 类型的数组,数组有4 个元素,其中前两个元素已赋初值,初值分别为(3.2,4.7),(0.0, 0.0)。2数组的操作下标变量C+语言未提供对于数组整体进行操作的运算符和运算。对于数组的操作是通过对于其元素,即下标变量进行的。下标变量的格式为:下标:整数,或整型表达式,其取值范围为0n-1,n=数组元素总数,例如:int A4;共有四个
15、下标变量:A0,A1,A2,A3。对于下标变量可进行下列操作。(1)赋值。可以三种方式进行:初始化:int A41,2,3 ;相当于一次为A0,A1,A2 赋值为1,2,3。赋值语句:A3= 4* A1 ;相当于把4*2=8 赋值A3。输入语句:cinA0 ;或for(int i=0;i4;i+) cinAi;后者可通过键盘操作,为数组的四个元素依次赋值。(2)一般运算。下标变量可与同一类型的一般变量一样参加它所允许的运算。如:A0+= A2+;coutA0” ”A1*A2;等等。下标也可以是一个表达式,如:int A41,2,3,4;A3AA2-A1*4;下标表达式应注意其值应保持在0n-1
16、 范围之内。2、多维数组若干同一类型的数据m 列n 行的矩阵,则可称为二维数组,二维数组亦可视为一维数组的数组。int Amn;说明了一个二维数组,它有mn 个元素,它也可以视为由n 个一维数组int Am组成的(一维)数组。类似地,还可以说明三维,四维数组,二维以上的数组统称为多维数组。1说明和初始化多维数组的说明(以二维为例):类型名:同前节说明。数组名:同前节说明。行数:正整数。列数:正整数。例如:char ch23;该二维数组共有2 行3 列,元素个数为2*3= 6。在二维数组中,为数组赋初值的方式有:int a23=1,2,3,4,5,6;亦可写为:int a23=1,2,3,4,5
17、,6;二者效果是一样的。系统将按逐行的次序顺序为各元素赋值。其次序为:a00,a01,a02,a10,a11,a12对于三维以上的高维数组,其赋值方法是一样的。2二维数组的操作对于二维数组的操作,同样是通过对其元素即下标变量的操作来进行的。操作中应注意:(1)注意下标表达式的取值范围:char Amn;则下标变量Aij中i 的值应在0m-1 之间,j 的值应在0n-1 之间。(2)当只有一个下标时:Ai(O = i = n-1)表示的是一个一维数组,其元素个数为n,这些元素可用下标变量:Ai0,Ai1,Ain-1来表示。(3)更高维的数组,其定义和操作类似。3、 数组与字符串从表面上看,一个字
18、符串就是一个字符数组,但在C+语言中,二者并不完全相同,读者在涉及到字符串处理时,必须注意。字符串是一个以串尾符0结尾的字符类型数组。从下面的例子可看出其区别:char string17=China;char string2 = China;char string37= c,h,i,n,a ;char string47= c,h,i ,n,a,0;这说明了四个字符型数组,它们是互不相同的。课题04: 结构类型一、教学目标:1.了解结构类型的意义2.掌握结构类型的定义及应用方法3.掌握结构数组的使用方法二、教学重点:1结构类型的定义2结构类型使用方法三、教学难点:1结构数组的使用方法四、课时安排
19、:2节课五、教具准备:多媒体教室六、教学方法:讲授七、教学过程:(一)、复习导入实际应用中往往需要把若干种不同类型的数据组合为一个导出类型,这就是结构类型。数组是把若干相同类型的数据放在一起,结构则是把若干不同的数据放在一起。例如,一个公司雇员的数据可能包括:char name20;enum male,femalesex;float salary;char phone11;那么我们如何处理这样的数据呢?下面就让我们来学习一种新的构造数据类型结构体。(二)、讲授新课对公司雇员数据进行处理或检索时,把它们组成结构类型会更方便:struct Employee char name20;enum mal
20、e,femalesex;float salary;char phone11;C+语言中的结构是作为类似于类的概念处理的,这一点将在以后学习中说明,在本章结构(以及联合)类型仅作为一种构造数据类型。1、结构类型与结构变量说明结构类型说明的格式为:struct ;类型名:标识符。成员表: ; ;. ;结构类型的变量说明的格式为:struct ;变量说明中的关键字struct 可以省略(C 语言中不可),变量名表与一般变量说明一样,其赋初始值的方法可从下面的例子中了解:struct Employee char name20;enum male,femalesex;float salary;char
21、phone11; / 结构类型Employee 的定义struct Employee gy1,gy2; / 变量gy1,gy2 的说明Employee gy3,gy4=“John Smith”,male,2107.5,02223501234;/ 变量gy3,gy4(赋初值)的说明结构类型及其变量的说明也可放在一起:struct Employee char name20;enum male,femalesex;float salary;char phone11;gy1,gy2;2、结构变量的引用和赋值一个结构变量由若干分量组成,对结构分量的存取由圆点运算符“.”实现,例如,在上例中,雇员gy1
22、的姓名可表示为 gy1.name,其电话号码可表示为gy1.phone。因此,为结构变量赋值,除了在变量说明中赋初值(如为gy4 赋初值)的方法外,还可以用赋值语句或输入语句为结构分量赋值的方法:gy3.name = “Tom Green”;gy3.sex = male;cin gy3.salary;cin gy3.phone;无论采用哪种方法为结构分量赋值,都必须保证类型一致。C+语言还允许直接对结构变量赋值,下面的赋值语句也是允许的:gy1 = gy4;gy3 = gy4;一般,数组变量不能这样直接赋值。3、结构数组结构类型的数据也可以组成数组,称为结构数组。结构数组在许多实际应用问题中的
23、采用非常普遍,例如,通讯录,学生成绩单,商业销售记录,人事档案,资料登记表等等。下面的结构数组是一个公司的雇员档案:struct Employee char name20;enum male,femalesex;float salary;char phone11;Employee efile100;数组的每一个分量是一个雇员的档案数据。课题05:函数 一、教学目标:1.了解函数的作用、意义2.掌握函数的说明、调用、返回3.掌握函数的使用方法二、教学重点:1函数的说明2函数的调用三、教学难点:1函数返回四、课时安排:2节课五、教具准备:多媒体教室六、教学方法:讲授七、教学过程:(一)、复习导入函
24、数概念是C+语言中最重要的概念之一,函数设计是程序设计的主要部分或实质部分。函数在C+程序设计中的意义体现在四个方面。(1)从历史上说,函数的思想来源于子程序,(如BASIC 语言中的子程序),把程序中反复出现的相同或相近的程序改写成子程序,可以大大缩短程序的长度。函数实际上是参数化的子程序。(2)从结构化程序设计(SP)的观点来看,函数绝不仅仅是为了缩短程序长度,更重要的是通过函数设计,可以把整个程序要完成的整体的复杂的计算任务,分解为一个个较小的,相对简单的子任务。这种模块化的程序易设计,易阅读,易调试,易维护,较少出错。(3)从运算的角度说,函数就是C+语言提供的由用户定义的运算。运算符
25、是系统提供的运算,而函数是由用户自己定义的运算。(4)作为面向对象程序设计(OOP)语言的C+,以类为核心,类由数据和方法组成,方法就是对数据的运算和处理,亦即类的函数成员。故函数设计同样是OOP 的重要组成部分。(二)、讲授新课1、函数的说明C+程序允许两种函数说明语句的形式,我们把它们分别称为函数原型(或函数声明)和函数定义。1函数原型函数原型(亦称函数声明)用来指出函数的名称,类型和参数,其格式为:属性说明类型函数名(参数表);例如:int add (int a, int b);inline void swap (float & s, float & t);void print (cha
26、r *) ;属性说明:可缺省,一般可以是下面的关键字之一:inline,static,virtual,friend 等。inline 表示该函数为内联函数;static 表示该函数为静态函数;virtual 表示该函数为虚函数;friend 表示该函数为某类(class)的友元函数。其含义的细节在后面有关章节介绍。类型:指函数的返回类型。C +语言规定除了特别情形(main()函数和类的构造函数,析构函数)之外,所有函数都必须在说明中指出返回类型。一个函数可能有多个结果,不一定都用返回值的方式输出(还可通过全局变量,引用参数和指针等方式传出)计算结果,但函数调用作为一个表达式,该表达式的值则只
27、能是函数的返回值。函数名:一个标识符。参数表:它可能为空,void 或类型参数名,类型参数名 的形式。例如: main()print(void)cuberoot(float x)add(int a,int b)其中,函数原型中的参数表可忽略参数名,如:int add(int, int)void swap(float &, float &)它们与函数原型int add (int a, int b); void swap (float & s, float & t); 是等价的,事实上在编译时,函数原型中的参数名是被忽略的,后者的参数表中的符号&表示该参数为引用型参数,用以区别于一般的赋值型参数,
28、其用法在下面介绍。2函数定义函数定义与函数原型的主要区别是它还包括函数体,其格式为:属性说明类型函数名(参数表)函数体属性说明,返回类型,函数名与函数原型一致,参数表中不可省略参数名。函数体:由和括起来的复合语句即程序块。program 5_1 的最后12 行就是一个函数定义。从函数说明语句的介绍,我们可以看到程序中各种语句的分类(说明语句,表达式语句,控制语句和复合语句)并不是一个简单的划分概念。函数定义本身是一种说明语句,但其函数体则是一个复合语句。而在函数体内部又可能包含说明语句,表达式语句,控制语句和复合语句。总之,这种分类和区分是明确的,但它们之间又有互相包含的关系。2、函数调用函数
29、调用是已定义函数的一次实际运行,(与某类型的一个变量和后文中某类的一个对象类似),函数调用是函数定义的一个“实例”。函数说明中的参数称为形式参数(形参),函数调用中的参数称为实际参数(实参),函数调用一般出现在表达式中或独立形成一个函数调用语句,例如:xrcuberoot(q2a)cuberoot(q2a);swap (a, b);函数调用的两要素是函数名和实参表: ()实参表中的参数的类型、个数、顺序必须与函数说明的参数表(形参表)相一致。赋值型的实参可以是一个表达式。在上节program5_1 的main()中两次出现函数cuberoot(x)调用,其具体的调用实施过程如下:(1) 根据调
30、用语句中的函数名(cuberoot)在整个程序中搜索同名函数定义;(2) 对实参数的参数个数,类型,顺序进行核对,判定是否与函数定义中的形参表对应一致,在上例中只有一个浮点型参数;(3) 根据参数的类型(值参数或引用参数)进行值参数的值传递或引用参数的换名,在上例中即是要把实参表达式的值计算出来赋给形参x;(4) 运行函数体代码;(5) 返回调用点,并返回所要求的函数值,即返回计算结果croot 的值。3、函数的返回函数的返回完成两项任务:(1) 把运行控制从函数体返回到函数调用点。在上例中就是在计算cuberoot(-q/2+a)之后再返回到语句xr = cuberoot () + cube
31、root () 的计算过程中。(2) 根据返回值要求,返回所需要的数据值。函数的返回值有下面几种情形:1.返回void 类型如果函数无值返回,应说明为void 类型。例如:void print( ) coutHello World !;void show( ) coutb) return a; return b;inline float ABS (float a) return ( a=0)? a: 0-a; inline float PERCENT (float a, float b) return 100.0 * a / b;inline void SWAP (int a, int b)
32、int t; t=a; a=b; b=t; return;inline bool ISODD (int x) return (x %2 = = 1)?1: 0; 对应的宏定义为:# define MAX (a,b) (ab)? a: b) / 求较大者# define ABS (a) ( a = 0 )? a: 0-a ) / 求绝对值# define PERCENT (a,b) (100.0 * a / b ) / 求百分比# define SWAP (t, a, b) int t=a; a=b; b=t; / 交换a,b 的值# define ISODD (x) (x %2 = = 1) 1: 0 ) / 判断x 是否为奇数虽然这些带参数的宏定义的功能与对应的内联函数基本一致,但仍然是有差别的,宏定义中的参数和计算结果没有类型说明,编译时不可能进行类型检查,是不安全的,更无法区分赋值参数和引用参数,很容易出错。因此,C+语言的编程中,当某段计算短小而又经常被重复时,建议采用内联函数,少用宏定义实现。2、函数嵌套一个函数的函数体中包含一个或多个函数调用语句,即称为函数嵌套。嵌套的含义是,如果函数A 要调用函数B,也就是说,函数A 的定义要依赖于函数B 的定义。因此函数B 的定义或函数B 的原型必须出现在函数A 的定义语句之前。为了保证返回后继续正常运行,