版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《程序设计》教案
诲南软件职业技本学浣
(2006-2007学年度第一学期)
教师姓名:李文大
系部:软件工程系
授课专业:软件技术
授课班级:05软件技术3班
目录
课题01:6.0开发环境..................................................
课题02:数据类型、表达式、语句...................................................
课题03:数组.....................................................................
课题04:结构类型.................................................................
课题05:函数......................................................................
课题06:函数参数..................................................................
课题07:内联函数与递归函数........................................................
课题08:函数重载..................................................................
课题09:指针.....................................................................
课题10:指针与数组、字符串指针..................................................
课题11:指针与函数...............................................................
课题12:指针与动态分配内存......................................................
课题13:引用.....................................................................
课题14:类与对象.................................................................
课题15:类的静态成员与常量成员..................................................
课题16:友元.....................................................................
课题17:运算符重载...............................................................
课题18:继承与派生...............................................................
课题19:派生关系中的二义性处理..................................................
课题20:虚基类...................................................................
课题21:多态性与虚函数...........................................................
课题22:模板.....................................................................
课题23:文件、流与的流类库......................................................
课题24:插入与提取运算符的重载..................................................
课题25:磁盘文件
课题01:6.0开发环境
一、教学目标:
1.掌握6.0开发工具的选单、工具栏、项目、工作区等概念
2.掌握使用编写控制台应用程序
3.掌握使用进行程序调试
二、教学重点:
1.掌握6.0开发工具的选单、工具栏、项目、工作区等概念
三、教学难点:
1.使用编写控制台应用程序。
2.使用进行程序调试
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
是公司推出的目前使用极为广泛的基于平台的可视化开发环境。6.0是在
以往版本不断更新的基础上形成的,由于其功能强大、灵活性好、完全可扩展以
与具有强有力的支持,在各种语言开发工具中脱颖而出,成为目前最为流行的语
言集成开发环境。
(二)、讲授新课
1.开发环境概述
:板书或幻灯片演示下图
★:6.0开发环境包括:
★标题栏
★工具栏
★选单
★项目工作区窗口
★输出窗口
★状态栏
★文档窗
依次介绍各项功能,详细介绍选单、工具栏、项目工作区。
2.简单的控制台应用程序
使用创建一个控制台应用程序,使学生理解“工程”概念,熟悉项目的程序
框架,以与如何添加程序代码、编译、运行。
以下面程序为例,讲述如何建立控制台应用程序:
【例】
<>
(*IJ)
,,
0;
【运行结果】:
【例】利用投影演示P18例。
3.程序调试
在软件开发过程中,大部分的工作往往体现在程序的调试上。调试一般按这
样的步骤进行:
“修正语法错误一设置断点一启用调试器一控制程序运行一查看和修改变
量的值”
★修正语法错误
■I/试最初的任务主要是修正一些语法错误,比如:
■未定义或入合法的标识符
■数据类型或参数类型与个数不匹配。
★设置断点
■用调试的断点可以有以下类型:
■为之断点
■数据断点
■条件断点
★启用调试器
★6.0创建的项目,系统会自动为项目创建32版本的默认配置,选择””
选单“”命令,就可以启动调试器了。
★控制程序运行
可以通过''控制程序运行。
★查看和修改变量的值
在程序调试的时候会自动显示““和“"两个调试窗口,通过这两个窗口可以查
看或修改当前运行程序的变量的值。
课题02:数据类型、表达式、语句
一、教学目标:
1.掌握程序结构、基本组成
2.掌握的基本数据类型、基本输入/输出
3.掌握运算符、表达式
4.掌握基本语句
二、教学重点:
1程序结构、基本组成
2基本数据类型、输入输出
三、教学难点:
I运算符、表达式
2基本语句
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
是在20世纪80年代初期由贝尔实验室设计的一种在C语言的基础上增加了
而向对象支持的语言,她是目前应用最为广泛的编程语言。今天我们来学习他的
基本结构、数据类型、运算符和表达式、基本语匀。
(二)、讲授新课
1.程序结构
一个程序往往由预处理命令、语句、函数、变量和对象、输入与输出以与注
释几个部分组成。
★预处理命令
★包括:宏定义命令、文件包含命令和条件编译命令
★语句
语句是组成程序的基本单元
★函数
一个程序是由若干个函数组成。一个程序中有且仅有一个主函数.
★变量和对象
★是面向对象的语言,所以在中相比C语言多了对象,她是“类”的实例
★输入输出
程序中总是少不了输入和输出语句。
★注释
注释可以提高程序的不读性、帮助程序员理解,在程序运行中不执行。
★在编写程序时,还要注意程序的书写风格,要注意缩进和注释。在编
写程序时,标识符应该遵循以下原则:
★合法性
★有效性
★异读性
2.基木数据类型
数据类型分为基本数据类型、派生类型以与复合类型3类。基本数据类型包
括:
以与上述类型的变种,包括
P29表2.1列出了的基本数据类型
★根据数据在程序中的可变性,我们将数据分为:
★常量
■整型常量
■浮点型常量
■字符常量
■字符串常置
■符号常量
★变量
■变量定义
■变量的初始化
要注意一个未初始化的变量不是没有数值,而是取决于变量在系统中的存储
形式,她可能是系统的默认值或无效值。
3.基本输入、输出
中是通过标准的输入流和标准输出流来实现数据的输入输出。
【举例】
【举例】
4,运算符和表达式
■用来记述运算的符号称为运算符,按照操作数的个数可以分为:
■单目运算符
■双目运算符
■三目运算符
■根据其功能可以分为:
■算术运算符
■赋值运算符
■关系运算符
■逻辑运算符
■位运算符
变量、常量通过一个或多个运算符组合起来就构成了表达式,比如有关系运
算符构成的表达式成为关系表达式。
■5.基本语句
■提供了如表达式语句、复合语句、选择语句和循环语句等,满足了结构
化程序设计所需要的3中基本结构。
■选择语句
■条件语句
■开关语句
■循环语句
以上基本语句和C语言保持一致。
课题()3:数组
一、教学目标:
1.了解构造类型的意义
2.了解数组的概念
3.掌握一维数组、多维数组的定义
二、教学重点:
1.一维数组的定义
2.数组的基本操作
三、教学难点:
1.多维数组将维处理过程与多维数组的存储
2.字符串数组的使用
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
在计算机所处理的数据中,最常见的,也是最需要由计算机高速处理的数据
是成批出现的同一类型的数据,语言中把这类数据称为数组。例如:
•监测系统在一段时间内获得的检测、采样值,可能是型或型数
据的数组:
•一个管理系统的数据库,可能是一系列结构类型(记录)数据的序列;
•一幅电视图像,可能是其每个像素的颜色与灰度值(整型数)的二维阵列。
任何一种类型的一批数据,都可以组成数组,例如型,型,型数据可以组成数
组;这些基本类型的派生类型(如型,型,型)的数据,枚举、结构、联合类型
的数据,以至由用户或系统定义的类(类型)的对象,都可以组成数组。
(二)、讲授新课
1.一维数组
由n个同一类型数据组成的一维序列,构成一维数组,一维数组的下标为0,…,
lo
1.一维数组的说明
任何一种已知类型数据都可说明为数组,数组说明的格式为:
〈类型名X数组名>[<元素数>]={<初值表>};
类型名:可以是基本类型名,基本类型的派生类型名,类名,枚举类型名,
结构,联合类型名(也可以是枚举、结构联合的类型说明)。关于指针数组将在下节说
明。还有数组类型的数组就是多维数组了,也将在下面介绍。
数组名:标识符,数组名有两个附加作用:
(1)是表示数组元素的下标变量。如[2]表示数组的第三个元素。
(2)它还是一个指向数组的首元指针。
元素数:一个正整数,指出数组的元素个数,或数组的大小()。元素数要用方括号
括起来。方括号口不可缺省,元素数则有时可缺省,这时必须赋初值,系统按所赋的
初值个数确定数组的大小。
初值表:可缺省c是由花括号(,}括起来且用逗号'分开的初始化常
量值。例如:
[100],A[10][10],B[]={4,3,2};
[26];
[4]={(3.2,4.7),10.0,0.0)};
其中,数组[100]未赋初值。
数组A[10][10]为一个二维数组,未赋初值。
数组B□已赋初值,元素数为3。
数组[4]是用户定义的类型的数组,数组有4个元素,其中前
两个元素已赋初值,初值分别为(3.2,4.7),(0.0,0.0)o
2.数组的操作一一下标变量
语言未提供对于数组整体进行操作的运算符和运算。对于数组的操作是
通过对于其元素,即下标变量进行的。下标变量的格式为:
<数组名>[〈下标)]
下标:整数,或整型表达式,其取值范围为0〜1数组元素总数,例
如:
A[4];
共有四个下标变量:A[0],A[l],A[2],A[3]o
对于下标变量可进行下列操作。
(1)赋值。可以三种方式进行:
①初始化:
A[4]={1,2,3);
相当于一次为A[0],A[l],A[2]赋值为1,2,3o
②赋值语句:
A[3]=4*A[l];
相当丁把4木2=8赋值A[3]。
③输入语句:
>>A[0];
或
(0;i<4;)>>A[i];
后者可通过键盘操作,为数组的四个元素依次赋值。
(2)一般运算。
下标变量可与同一类型的一般变量一样参加它所允许的运算。如:
A[0]A[2];
<<A[O]<<ZZ,Z<<A[1]*A[2];
等等。
下标也可以是一个表达式,如:
A[4]={1,2,3,4);
A[3]=A[A[2][1]]*4;
下标表达式应注意其值应保持在0〜1范围之内。
2.多维数组
若干同一类型的数据m列n行的矩阵,则可称为二维数组,二维数组亦可视为一维数
组的数组。
A[m][n];
说明了一个二维数组,它有mXn个元素,它也可以视为由n个一维数组A[m]
组成的(一维)数组。类似地,还可以说明三维,四维数组,二维以上的数组统
称为多维数组。
1.说明和初始化
多维数组的说明(以二维为例):
〈类型名X数组名>[<行数〉]卜列数>]
类型名:同前节说明。
数组名:同前节说明。
行数:正整数。
列数:正整数。
例如:
⑵⑶;
该二维数组共有2行3列,元素个数为2*3=60
在二维数组中,为数组赋初值的方式有:
a[2][3]={{1,2,3},{4,5,6));
亦可写为:
a[2][3]={1,2,3,4,5,6);
二者效果是一样的。系统将按逐行的次序顺序为各元素赋值。其次序为:
a[0][0][0][l][0][2],
a[l][0][l][l][l][2]
对于三维以上的高维数组,其赋值方法是一样的。
2.二维数组的操作
对于二维数组的操作,同样是通过对其元素即下标变量的操作来进行的。
操作中应注意:
(1)注意下标表达式的取值范围:
A[m][n];
则下标变量中i的值应在0〜1之间,j的值应在0〜1之间。
(2)当只有一个下标时:
A[i](0<=i<=1)
表示的是一个一维数组,其元素个数为n,这些元素可用下标变量:
A[i][0][i][l],-[i][l]
来表示。
(3)更高维的数组,其定义和操作类似。
3.数组与字符串
从表面上看,一个字符串就是一个字符数组,但在语言中,二者并不完全相
同,读者在涉与到字符串处理时,必须注意。字符串是一个以串尾符、(了结尾的
字符类型数组。从下面的例子可看出其区别:
2[]=〃〃;
3[7]={%);
4[7]={'n」a」\01
这说明了四个字符型数组,它们是互不相同的。
课题()4:结构类型
一、教学目标:
1.了解结构类型的意义
2.掌握结构类型的定义与应用方法
3.掌握结构数组的使用方法
二、教学重点:
1.结构类型的定义
2.结构类型使用方法
三、教学难点:
1.结构数组的使用方法
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
实际应用中往往需要把若干种不同类型的数据组合为一个导出类型,这就是
结构类型。数组是把若干相同类型的数据放在一起,结构则是把若干不同的数据
放在一起。例如,一个公司雇员的数据可能包括:
[20];
[11];
则我们如何处理这样的数据呢?下面就让我们来学习一种新的构造数据类型一
结构体。
(二)、讲授新课
对公司雇员数据进行处理或检索时,把它们组成结构类型会更方便:
[20];
[11];
语言中的结构是作为类似于类的概念处理的,这一点将在以后学习中说明,在本章结
构(以与联合)类型仅作为一种构造数据类型。
I.结构类型与结构变量说明
结构类型说明的格式为:
〈类型名〉(〈成员表>};
类型名:标识符.
成员表:<类型>〈成员1>;<类型)<成员2>;...〈类型)〈成员n〉;
结构类型的变量说明的格式为:
[]<结构类型名〉〈变量名表》;
变量说明中的关键字可以省略(C语言中不可),变量名表与一般
变量说明一样,其赋初始值的方法可从下面的例子中了解:
[20];
[111;
);结构类型的定义
12;变量12的说明
34二{''〃,2107.5,};
变量34(赋初值)的说明
结构类型与其变量的说明也可放在一起:
[20];
[11];
)12;
2.结构变量的引用和赋值
一个结构变量由若干分量组成,对结构分量的存取由圆点运算符实现,例如,
在上例中,雇员1的姓名可表示为1,其号码可表示为1。因此,为结构变量赋
值,除了在变量说明中赋初值(如为4赋初值)的方法外,还可以用赋值语句或
输入语句为结构分量赋值的方法:
3八〃;
3=;
»3;
»3;
无论采用哪种方法为结构分量赋值,都必须保证类型一致。
语言还允许直接对结构变量赋值,卜面的赋值语句也是允许的:
1=4;
3=4;
一般,数组变量不能这样直接赋值。
3.结构数组
结构类型的数据也可以组成数组,称为结构数组。结构数组在许多实际应用问题
中的采用非常普遍,例如,通讯录,学生成绩单,商业销售记录,人事档案,资料
登记表等等。下面的结构数组是一个公司的雇员档案:
[20];
[11];
[100];
数组的每一个分量是一个雇员的档案数据。
课题()5:函数
一、教学目标:
1.了解函数的作用、意义
2.掌握函数的说明、调用、返回
3.掌握函数的使用方法
二、教学重点:
1.函数的说明
2.函数的调用
三、教学难点:
1.函数返回
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
函数概念是语言中最重要的概念之一,函数设计是程序设计的主要部分或实
质部分。函数在程序设计中的意义体现在四个方面。
(1)从历史上说,函数的思想来源于子程序,(如语言中的子程序),把程序
中反复出现的相同或相近的程序改写成子程序,可以大大缩短程序的长度。函数
实际上是参数化的子程序。
(2)从结构化程序设计()的观点来看,函数绝不仅仅是为了缩短程序长度,更
重要的是通过函数设计,可以把整个程序要完成的整体的复杂的计算任务,分解
为一个个较小的,相对简单的子任务。这种模块化的程序易设计,易阅读,易调
试,易维护,较少出错。
(3)从运算的角度说、函数就是语言提供的由用户定义的运算。运算符是系统
提供的运算,而函数是由用户自己定义的运算。
(4)作为面向对象程序设计()语言的,以类为核心,类由数据和方法组成,方
法就是对数据的运算和处理,亦即类的函数成员。故函数设计同样是的重要组
成部分。
(二)、讲授新课
1.函数的说明
程序允许两种函数说明语句的形式,我们把它们分别称为函数原型(或
函数声明)和函数定义。
[1].函数原型
函数原型(亦称函数声明)用来指出函数的名称,类型和参数,其格式为:
[〈属性说明〉]〈类型〉〈函数名〉(〈参数表〉);
例如:
(a,b);
(&s,&t);
属性说明:可缺省,一般可以是下面的关键字之一:,,,
等。
表示该函数为内联函数;
表示该函数为静态函数;
表示该函数为虚函数;
表示该函数为某类。的友元函数。
其含义的细节在后面有关章节介绍。
类型:指函数的返回类型。C语言规定除了特别情形(()函数和类的构造函数,析构
函数)之外,所有函数都必须在说明中指出返回类型。一个函数可能有多个结果,不一
定都用返回值的方式输出(还可通过全局变■,引用参数和指针等方式传出)计算结果,
但函数调用作为一个表达式,该表达式的值则只能是函数的返回值。
函数名:一个标识符。
参数表:它可能为空,或〈类型〉〈参数名〉,〈类型〉〈参数名》…的
形式。
例如:()
(x)
(b)
其中,函数原型中的参数表可忽略参数名,如:
它们与函数原型(a,b);(&s,&t);是等价
的,事实上在编译时,函数原型中的参数名是被忽略的,后者的参数表中的符
号'&\表示该参数为引用型参数,用以区别于一般的赋值型参数,其用法在下面
介绍。
[2].函数定义
函数定义与函数原型的主要区别是它还包括函数体,其格式为:
[〈属性说明〉]〈类型〉〈函数名〉(〈参数表〉)〈函数体〉
属性说明,返回类型,函数名与函数原型一致,参数表中不可省略参数名。
函数体:由{和}括起来的复合语句即程序块。
5_1的最后12行就是一个函数定义。从函数说明语句的介绍,我们可以看到程序中各
种语句的分类(说明语句,表达式语句,控制语句和复合语句)并不是一个简单的划分
概念。函数定义本身是一种说明语句,但其函数体则是一个复合语句。而在函数体内部
又可能包含说明语句,表达式语句,控制语句和复合语句。
总之,这种分类和区分是明确的,但它们之间又有互相包含的关系。
2.函数调用
函数调用是已定义函数的一次实际运行,(与某类型的一个变量和后文中某类
的一个对象类似),函数调用是函数定义的一个“实例二
函数说明中的参数称为形式参数(形参),函数调用中的参数称为实际参数(实参),函
数调用一般出现在表达式中或独立形成一个函数调用语句,例如:
=(一q/2+a)+(-q/2-a):
(a,b);
函数调用的两要素是函数名和实参表:
〈函数名〉(〈实参表〉)
实参表中的参数的类型、个数、顺序必须与函数说明的参数表(形参表)相一致。
赋值型的实参可以是一个表达式。在上节5」的。中两次出现函数(x)调用,其具体
的调用实施过程如下:
(I)根据调用语句中的函数名0在整个程序中搜索同名函数定义;
(2)对实参数的参数个数,类型,顺序进行核对,判定是否与函数定义中的形参表对应
一致,在上例中只有一个浮点型参数;
(3)根据参数的类型(值参数或引用参数)进行值参数的值传递或引用参数的换名,在
上例中即是要把实参表达式的值计算出来赋给形参x;
(4)运行函数体代码;
(5)返回调用点,并返回所要求的函数值,即返回计算结果的值。
3.函数的返回
函数的返回完成两项任务:
(1)把运行控制从函数体返回到函数调用点。在上例中就是在计算
(2)之后再返回到语句:()+()的计算过程中。
(2)根据返回值要求,返向所需要的数据值。
函数的返回值有下面几种情形:
1.返回类型
如果函数无值返回,应说明为类型。例如:
函数仅需完成打印和显示工作,不需返回任何数据,这类函数调用一般形成一
个函数调用语句。
未作类型说明的函数,系统认为是类型函数,应返回一整型值。
2.返回数值类型
最常见的函数是返回一个数值的函数。例如:
(a,b);
(x);
这类函数的调用表达式可以出现在表达式语句中。
当函数要返回的数值不止一个时,情况比较复杂,一般它可以以结构或类的形式,也
可以以结构,数组或对象指针类型方式实现,这样的实例在后面的章节可以见到。
3.返回引用类型
值返回方式是C和语言中唯一的返回方式,语言提供的引用返回概念是其特
有的一种很强的功能,当函数定义中把该函数说明为某类型的引用类型时,该
函数调用后返回的不单是值,而是包含返回值的变量(或对象)。由于返回引用
与引用类型有关,所以这样的实例将在下节介绍。
课题06:函数参数
一、教学目标:
1.进一步了解函数的应用
2.了解函数参数
3.了解函数的值调用和引用调用
二、教学重点:
I.函数参数形式
三、教学难点:
I.函数值调用和引用调用
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
函数的参数的设置和使用是函数设计中非常直要的部分。
(二)、讲授新课
1.函数参数
语言允许函数无参,有一个或多个参数,而且还支持不定个数参数的
函数。
(I)无参函数:其函数说明为下列形式:
();输出指定的数据
O;输出变量X的值
用或空表示无参。
(2)一个或多个参数:
多数函数有一个或多个确定的个数、确定的类型和顺序的参数,例如:
(n,*){…};对n元整形数组
进行排序
(a,b,c){…};
/*求三个实数中最大者。*/
等等。定义中应注意参数表的组成。因为在语言中,不同的函数是根据函
数名和参数表二者来区分的,只有二者完全一致才是同一函数。
(3)不定个数参数:
有些应用问题中参数个数是变化的。例如设计一个计费函数,为了计
算通话费,不同的通话类型(如市话,长途,数据与通讯,机等)有不同数
目的参数。
处理参数个数不定的情形,可有不同的途径。例如:
(n,*a);
这个函数可对n长的浮点数组进行排序,n是变化的;由于a是数组的首
元指针,因此这个函数实际上是可以进行对任意多个浮点数排序的处理。
语言有的版本还提供一些库函数,支持处理形如:
(i,…):
的不定参数函数。
语言,允许参数表中包含无名参数,主要是为了区分函数,例如:
f(a,b){a+b*b;}
f(a,b,)(a*a+b;)
两个不同的函数问名,但由于第一个函数包含一无名参数,使得在调用时能够
被区分,f(x,y)是第一个函数的调用,f(x,y,0)是第二个函数的调用。
程序还允许为函数定义可缺省参数,这种函数调用时具有灵活性,
如:
(a,b,c=O){
a*a+b*b+c*c:
其中参数c为可缺省参数,下面的调用方式都是合法的(x,y,z为型变量):
(x,y,z)
(x+y,x—y)
参数表中可有任意多个参数指定为可缺省参数,但所有可缺省参数必须列
后。在调用该函数时,一般不允许部分缺省,即要么省去全部缺省参数,要么
一个也不省。
2.函数值调用和引用调用
语言在进行函数调用时,对参数的处理有两种方式,赋值型和引用型,
即值调用方式和引用调用方式。前者是普通的形式,在c语言中只有这种方式;
语言中增加了引用调用形式,这种形式与语言中的变量参数调用方
式相似。
1.赋值调用方式
在执行函数调用时,在检查函数名与参数表之后,首先为值参数分配内存,
然后计算各对应的实参表达式,并把计算的值赋给刚刚创建的参数变量,进而
开始函数体的运行。
赋值形参:在函数定义的参数中,除了被说明为引用(&)的参数之外,
其余所有类型的形参都属于赋值形参。
凡是赋值形参,在函数的每次调用时,都必须为每•个赋值形参创建•个
新的参数变量。
实参表达式:另一方面,函数调用语句中,与赋值形参相对应的实参可以
是指定类型的常量、变量或表达式。在执行函数调用时应把该表达式的值计算
出来,作为初值赋给刚刚为赋值形参创建的参数变量。这是赋值调用方式名称
的由来。
2.引用调用方式
引用形参:函数定义的参数表中,名字前加上符号&的参数为引用形参。
例如:
(&a,&b){
=a;
a=b;
b=;
形参a,b为引用形参,这时其函数原型可写为:
引用形参在调用过程中的参数传递机制不同于赋值形参。其要点是:
(1)函数的调用语句中对应于引用形参的实参必须是同一类型的变量,非
变量的表达式则不允许。
(2)参数传递的内容不是实参的值,而是地址,其实际的效果是令对应的
引用形参在调用过程中,作为一个变量名指向作为实参的这个变量,与赋值形
参的不同在这里体现出来,在引用调用过程中并不创建新的参数变量!
(3)在函数体程序块的运行中,引用形参的每次出现,由于它现在已经是
指向实参变量,因此相当于全用实参变量所代替。即起到了所谓的“换名”的
作用。
(4)在函数体程序运行结束,控制转回调用点时,该引用形参与实参变量
的对应关系也就终止了。但是在调用过程中对J•这个实参变量的所有处理和操
作的结果,却保留下来。这一点也是区别于赋值调用的。
课题07:内联函数与递归函数
一、教学目标:
1.进一步掌握函数的应用
2.了解内联函数
3.掌握递归函数的使用
二、教学重点:
1.函数嵌套
2.内联函数
三、教学难点:
1.函数的递归调用
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
(二)、讲授新课
1.内联函数
内联()函数的设置是不同于C的特征之一。
(1)在程序中符合下列条件的函数:
①函数说明前冠以“"关键字的函数;
②类内定义的函数成员,将在第七章介绍。
(2)在编译过程中,凡内联函数,系统把它的执行代码插入到该函数的每个调用点,
从而使程序执行过程中,每次该函数调用时不需控制转移,但该函数代码可能有多个
拷贝山现在目标程序中。也就是说,把多次调用的函数说明为内联函数,会使目标程序
占用的空间加大,而运行时间得到节省。
(3)为了优化程序、提高程序的运行效率,一般把函数体短小而乂频繁调用的函数说
明为内联函数较好。
(4)利用编译预处理的宏定义方式,也可以实现类似于内联函数的功能。
不过,内联函数的方式更为方便和可靠。例如,下面几个内联函数定义可以用带参数的
宏定义方式实现:
(a,b){(a>b)a;b;)
(a){(a>=0)a:0;}
(a,b){l(X).O*a/b;}
(a,b){t;;;;;}
(x){(x%2==1)1:0;}
对应的宏定义为:
#()((a>b)a:b)求较大者
#(a)((a>=0)a:0)求绝对值
#()(100.0*a/b)求百分比
#(t,a,b){;;;}交换的值
#(x)((x%2==1)1:0)判断x是否为奇数
虽然这些带参数的宏定义的功能与对应的内联函数基本一致,但仍然是有差别
的,宏定义中的参数和计算结果没有类型说明,编译时不可能进行类型检查,是
不安全的,更无法区分赋值参数和引用参数,很容易出错。因此,语言的编程中,
当某段计算短小而又经常被重复时,建议采用内联函数,少用宏定义实现。
2.函数嵌套
一个函数的函数体中包含一个或多个函数调用语句,即称为函数嵌套。嵌套
的含义是,如果函数A要调用函数B,也就是说,函数A的定义要依赖于函数B
的定义。因此函数B的定义或函数B的原型必须出现在函数A的定义语句之
前。
为了保证返回后继续正常运行,函数调用过程开始时需要做更多的事
情:
1)建立被调用函数的栈空间;
2)保存调用函数的运行状态和返回地址;
3)传递参数;
4)把程序控制转交给被调用函数。
3.函数的递归
递归函数的设计在程序设计中占有重要的地位。
函数A在其函数体中直接包含它自己的调用语句,这种调用称为直接递归调用,
函数A称为(直接)递归函数。函数A在其函数体中间接地包含对它自己的调
用,例如A调用函数B,但函数B又调用函数A,则函数A称为(间接)递归函
数。下面是一个(直接)
递归函数的例子:
(n){
(n<2=I;
(n—1)*n;
递归函数的实际计算过程与递归次序相反,例如,设4,计算(4)的递归次序是:(4)一
>(3)->(2)->(1),而实际计算过程则正好相反:(1)=1,(2)(1)*2=2,⑶⑵*3=6,
(4)(3)*4=24.
在一般情况下,应注意:
(1)无论是直接递归还是间接递归都必须保证在有限次调用之后能够结束。例如函数
中的参数n在递归调用中每次减1,总可达到<2的状态而结束。
(2)函数调用时系统要付出时间和空间代价,在环境条件相同的情形下,总是非递归程
序效率较高。
课题08:函数重载
一、教学目标:
L了解函数重载的意义
2.掌握函数重载的条件
3.学会使用函数重载
二、教学重点:
I.函数重载的条件
三、教学难点:
1.函数重载的使用
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
(二)、讲授新课
函数重载实际上是函数名重载,即支持多个不同的函数采用同一名字。例如:
(n){(nVO?:n;}
(f){(f<0)f=;f;}
(d){(d<0);d;)
三个函数都是求绝对值,采用同一个函数名,更符合人们的习惯(这一点在C语
言和其它语言中是不允许的。它们规定,在同一个程序块中一个名字只允许有一
种含义)。在程序中经常出现这样的情况:对若干种不同的数据类型求和,虽然数
据本身差别很大(例如整数求和,向量求和,矩阵求和),具体的求和操作差别
也很大,但完成不同求和操作的函数却可以取相同的名字(例如,等)。
许多差别很大的打印函数可以都用名,显示函数可以都用,从键盘或文件获取信
息都称作,发送称为,接收称为等等。函数名的重载并不是为了节省标识符(标
识符的数量是足够的),而是为了方便程序员的使用,这一点很重要。
实现函数的重载必须满足下列条件之一:
(I)参数表中对应的参数类型不同:
(2)参数表中参数个数不同;
(3)参数表中不同类型参数的次序不同。
例如:
();整型
O;类的对象
(n,a[1);
(n,a[],n);
在定义同名函数时应注意:
(1)返回类型不能区分函数,例如:
();错误
在调用时系统无法区分选择对应函数。
(2)采用引用参数不能区分函数,例如:
(&);错误
(&);错误
(3)为些派生基本类型的参数虽然可以区分同名函数,但在使用中必须注意,例如:
对这种函数的调用必须注意:
3,b;
5,d;
调用语句
b=(a):
d=(c);
b=(-3);
b=(3);
d=(3*a);
其中(3)因实参3既可以是型,也可以型,故这里可能出现二义性。
(4)包含可缺省参数时,可能造成二义性,例如:
(a,b,c=0);
(a,b);
程序设计中应避免这种情形出现。上面的二义性的情形是指系统面对某一函
数调用语句,有两个或两个以上同名函数与之匹配;而另一种情况下,曰于
数据类型之间的复杂转换关系也可能造成找不到与之匹配的函数定义。遇到
无准确匹配的函数定义时,系统并不马上按出错处理,它按下面的方式处理:
(1)通过数组名与指针变量,函数名与函数指针,某类型变量与常量之间的转换,
再查是否可实现匹配;
(2)把实参类型从低到高(按字长由短到长)进行基本类型与其派生类型的转换,再
检查是否可匹配;
(3)查有无己定义的可变个数参数的函数,如有把它归为该函数。在进行上述尝试性
的处理之后可能出现仍无匹配或匹配不唯一的情况,这时可能输出出错信息或错误地
运行。
课题()9:指针
一、教学目标:
1.了解指针类型基本概念
2.掌握指针类型变量的定义
3.掌握指针类型的基本运算
二,教学重点:
1.选择排序算法
2.指针变量的定义
三、教学难点:
I.指针变量的基本运算
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
在前面的学习中,我们曾引入数组类型,它与本章介绍的指针和引用类型是
语言提供的三种导出类型,正确灵活地使用数组,指针和引用类型,是设计高质
量的程序所必经掌握的技术。结构在只有数据成员时,也是一种导出数据类型,
不过,语言允许用户为结构设计函数成员,实际上是用户为该结构类型设计的运
算,因此,结构也是用户定义的类或类型。程序中所处理的数据主要以变量(和
对象)的形式出现。每个变量有两个最主要的属性,那就是变量的内容和地址。
下面我们将举例说明指针的概念与应用。
(二)、讲授新课
1.选择排序算法
首先我们来看看一个选择排序算法。排序的任务是把已经存在一个数组里的
n个数按从大到小的顺序排列,可以采用多种不同的方法实现,选择排序算法
的思路简单,容易理解,每次总是从无序的序列中选出最大者,交换到序列的
左端,于是,无序的序列越来越短,经过1步,达到排序的目的。
演示工程。
主函数做了三件事:
1)为长度为n的数组[n]输入n个随机数,作为排序算法处理的对象,
程序中取20,是为了显示输出结果方便,也可取1000或更大,实际输入的
值是整数也是为了显示清楚。利用库函数()产生伪随机数形成无序数组,
由用户输入一个随机数(例如6523)作为可使无序数组的20个数的
随机性较好。
2)调用函数0进行排序。
3)把经过排序的数组[20]的值输出。
在上面的例子中我们用到了指针,下面我们就来看看指针类型的语法规则。
2.指针类型
2.1指针变量说明
指针类型的变量说明格式为:
〈类型名〉*〈指针变量名〉二〈初值〉;
类型名:任一基本类型名,基本类型的派生类型名,用户定义的类、枚举类型、结构
与联合类型名。类型名为时,称为不确定类型的指钎类型。类型名也可以是由〈类型
名〉*表示的指针类型名这时称为多级指针(指针类型的指针)。
符号*:表示其后说明的变量为指针变量(这里的“*”不是运算符)。
指针变量名:标识符。
初值:可缺省。它可以是该类型的某一变量的地址。
3.0,b,c[4];*;
*P12J=L);
2.2指针变量的操作
1.取地址运算&和取内容运算*
取地址运算为一单目运算,运算符为&.例如:
3,*;
其中表示变量a的地址,它可以作为指针的值。使用&时应注意:
(1)其后只可用一变量名,而不可为一字面常量或一般表达式。
(2)赋值时,与a的类型应一致。
取内容运算为一单目运算,运算符为*.例如:
3,*;
*5;
«a«*;
2.数组指针的算术运算
如果指针变量是指向数组的,例如:
a[20];
3.指针的关系运算
指针变量可以参加关系运算。这要分三种情况:
(1)一般指针可以进行相等和不等的比较,指向同一变量(地址)者为相
等,否则不等。
(2)任一指针可以和指针常量进行相等和不等的比较。如一指针p
已经指向了某变量,则它不等于。
(3)数组指针,可以指向该数组的各个元素,且一个数组的各个元素在内
存中是顺序存放的,故数组指针之间不但可以进行相等和不等比较,也可以进
行大于,小于,大于等于,小于等于等的比较。
课题10:指针与数组、字符串指针
一、教学目标:
1.进一步了解指针的用途
2.掌握指针与数组的儿种关系
3.掌握字符串指针的应用
二、教学重点:
1.指针与数组的三种不同表示
2.字符串指针的表示
三、教学难点:
1.指针与数组三种表示形式的区别
2.字符串指针相关的几个函数
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
前面的学习中我们学习了如何定义指针变量,以与指针的基本运算,木节我
们将继续学习指针与数组
(二)、讲授新课
1.指针与数组
1.指向数组元素的指针
前面被简单地称为数组指针的,实际上应更确切地称之为指向数组元素的
指针,例如:
n[10];
则指针指向数组n的首元n[0]。在这里
与
101;
起相同的效果,因为数组名就是一个指向其首元的一个指针常量。
2.指向数组的指针
把数组作为整体,称为指向数组的指针,对于这类指针,其说明语句格式
为:
〈类型名〉(*〈指针变量名〉)[〈数组元素数〉];
而指向多维数组的指针说明中,最后一项[〈数组元素数〉「可有多个。
例如:
(*)[41;
表示指针变量是一个指向一维整型数组的指针,该数组包含四个整型元素。
一般指向数组的指针由多维数组的操作中被赋值:
A[2][4]:
(*)[4];
这时指针指向一维数组A[0],(A[0]有四个元素),执行增量运算
后,指向一维数组A[l],数组后1]的四个元素是A[l][l],A[l][2],
A[l][3]o
它们也可表示为(*)[0],(*)[1],(*)[2],(*)[3]o
从指向数组指针和指向数组元素指针的区别,可以看到:虽然指针变量的
内容都是地址,但指针变量的类型(指向的对象类型)则决定了该地址指向的
存储区的大小,例如:
*10110];
(*)[4]:
3.指针数组
由指针组成的数组,常常在程序中出现,其说明格式为:
(类型名〉*〈数组名〉[〈元素数〉]
n维指针数组为:
〈类型名〉*〈数组名〉[〈元素数>][〈元素数2〉上”[〈元素数n〉];
从上面格式可知:
(1)它比一般数组增加了符号。
(2)它比指向数组的指针,少了一对括号“()”。例如:
a,b,c,d,A[2][4];
*pl[4]={};
*p2[2]={A[0][l]};
其中,指针数组由四个整型指针组成,把四个整型变量a,b,c,d的地址赋给它们作
初值是合法的。
2,字符串指针
字符串是一种特殊的数据形式,在数组一节,我们已经指出字符串和字符
数组的关系。语言对于字符串的操作提供了多种手段,其中利用字符串指
针是最方便的一种。
1.说明与初始化
字符串指针没有自己独立的形式,其说明语句的格式与字符类型指针相同,例如:
'a1:
*1;
*2="";
[10]="”;
*3;
字符串指针有时可以按不同于一般指针变量的方式操作,即有时它可以表示字符串整
体,而不是单单表示当前指向的那个字符。
2.字符串的整体输入输出
把字符串作为字符数组,然后按字符依次进行输入输出是可行的(如上述),
但比较麻烦。因此,再提供整体输入输出的方法。
把字符串变量用字符数组或字符串指针的形式表示,然后直接进行操
作:
>>〈字符串);
<<〈字符串);
3.字符串指针数组
以字符串指针组成的数组使用起来比较方便,例如:
就是一个字符串指针数组,它的每个元素指向一个字符串常量。于是
[0],[1],⑵,⑶将分别表示“”,"",“”,
“Ip”。
4.利用字符串指针的标准函数
在头文件中,C++系统提供若干串处理函数的说明,它们大都利
用字符串指针,下面列出几例:
(1)求字符串长度。
返回字符串的长度(不包括串尾符)。
(2)字符串拷贝:
*(*1,*2);
把字符串2拷贝给字符小(覆盖原来内容),返回的地址。
(3)字符串连接:
*(*1,*2);
把字符串2连接到字符串1的后面(使1加长),返回1的地址。
(4)字符串比较:
(*1,*2);
课题11:指针与函数
一、教学目标:
1.体会指针与函数的密切关系
2.了解指针与函数的几种应用
3.掌握几种函数与指针应用的方法
二、教学重点:
I.指针作为函数参数
2.函数返回指针
三、教学难点:
1.指针函数
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
指针与函数的关系密切,主要分三部分,指针作函数参数,作函数返回类型
和指向函数的指针。函数指针在语言是没有的
(二)、讲授新课
I.指针作函数参数
指针是一种特殊类型的数据,它的值是另外某种类型的变量的地址。因此,指针作函数
的参数可以起到其它类型参数所起不到的作用。C++语言中,函数的参数(引用型参
数除外)在调用过程中,须把实参(表达式)的值赋给仅在调用过程中有意义的形参,参
加到函数体的运算之中。这样的机制很难实现对相对于函数的外部的“全局”变量作某
些处理。
利用指针可以解决两个数交换问题,()函数可以定义为:
2.函数返回指针
返回值为指针的函数称为指针型函数,其返回类型的说明应指明指针的对
象类型后加符号。例如:
*(m){
(m<1m>4)?[0]:[m];
这个函数()返回的是字符串指针,可直接调用函数()
来进行字符串的输入输出。
指针型函数的设计,应注意返回的指针在该函数被调,书的域内是有确切的
对象变量的。切不可返回指向函数内说明的局部变量或参数变量的指针,或无
指向的指针。
3.函数指针
函数不是数据,但它与变量还是有两点相通之处:•个是它有类型(返回
类型),另一个是它也有地址,称为人口地址,故在有的书中也勉强地把函数仍
归为一种特殊的数据“类型”。
函数的地址也可作指针的值,这就是函数指针。
函数指针的说明格式与函数的原型相似,主要区别是:原来的〈函数名〉,
用*〈函数指针名〉所代替,例如:
其中是一个函数指针变量,由于对的说明中已规定了函数的返回类
型(有时还包括存储类型)和参数表,因此,指针只能够指向这类函数。例
如:
fl();
f2();
f3();
f4();
设fl234是4个已说明的函数,这时,下面的说明和赋值,就有合法
与不合法的区别:
(*)()1;合法
(*1)()1;不合法
4;合法
2;不合法
3;合法
C++语言本身不允许把函数作为参数,然而有了函数指针,就可以通过
函数指针,起到把函数作为参数的作用。例如:
用来计算函数定积分的函数(),对于不同的函数计算其定积分值,
应该有一个函数参数,在C++程序中用函数指针可以方便地解决这个问题:
(a,b,(*)()):
参数给出定积分的上下限,函数指针则指向被积函数(其函数体从
略)。在使用时可以对不同的浮点函数和上下限,调用()计算其定积
分:
3.2,4.2;
fl(){...}:函数体从略
f2()1..};函数体从略
(*)()1:函数指针1指向函数门
<<(a,b,)<<;
a=4.0;10.5;
2;1指向函数f2
<<(a,b,)<<;
两次调用分别计算两个不同函数和f2的定积分值,这样的功能没有函数
指针是难以实现的。
课题12:指针与动态分配内存
一、教学目标:
1.了解指针动态内存分配
2.掌握动态分配内存运算符
3.学会使用指针进行内存动态分配
二、教学重点:
1.动态分配运算符
三、教学难点:
I.指针内存的动态分配使用
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
前面的学习过程中,我们知道指针可以指向“其他”的变量,则它除了指向
其它变量之外,可不可以自己也能够分配空间呢?下面我们就来学习指针如何
分配内存空间。
(二)、讲授新课
1.动态分配运算符
在前面,我们己经介绍了动态分配运算符和。和的使用,也是语言优于C语言
的特征之一。
运算是程序中除了变量说明之外,又一种生成变量的方法,不过用
生成的变量为无名动态变量,它返回的是一个该类型的指针值,程序通过指针
对这个变量进行操作。例如:
*,5;
*,3.0;
;生成一动态类型变量
[4];生成动态类型数组
(4.7);生成动态类型变量且赋初值
*=a*a;动态变量*被赋值
(0:i<4;i++)动态型数组的每个分量被赋值
*(+i)='a';
*;动态变量*参加运算
运算用来撤消或释放由生成的动态变量,例如:
;释放指向的动态变量
;释放指向的动态变量
[];释放指向的动态数组
动态变量与一般变量的主要区别就是它可以在程序运行过程中任意被撤销。而一
般变量则必须在其所说明的程序块结束时自动撤销。
2.用指针进行内存动态分配
C++程序中对变量、数组等的说明实际上就是为它们进行内存分配,所分配的空间与其内
容,通过变量名引用。用这种方式为变量分配空间,其占用形式比较死板。有了运算符和,就可
以实现一种动态分配内存的形式,即通过指针引用,而内存的分配和释放可以在程序的任何地方
进行C语言中没有运算符和,其动态内存分配依靠若干店函数完成,比较复杂,这也是语言优
于C语言的特点之一。例如:
这样就生成了三个(浮点型、字符型、整型)变量,但它们没有名字。由于三个
变量的地址分别存在指针,和,故在程序中使用这三个变量时,全通过指针:
*='A';
*=5;
*=4.7:
当不再需要这些变量时,可在程序的任何地点释放掉它们:
注意,这里释放的是动态的()变量,而不是指针变量(,)。这种动态生成的
变量,在使用上方便灵活,其必要条件就是应用相应的指
针来操纵它。读者在使用动态变量时应注意的是,要保护动态变量的地址。例如
在执行
;之后,不要轻易地冲掉指针中的值,假如执行了;语句之后,再释放原来生
成的动态变量:;已经达不到原来的目标了。
C++中运算类似于语言中过程的使用,不过它不作为相应的函数处理。C+
+还保留了从C语言中继承下来用于动态存储分配的(),()等标准函数,它
们已经可以为和运算所取代。
课题13:引用
一、教学目标:
I.了解引用类型的概念
2.掌握引用类型和指针的区别
3.学会使用引用类型
二、教学重点:
1.引用类型的概念
2.引用类型的定义
三、教学难点:
1.引用和指针的区别
2.引用类型的使用
四、课时安排:
2节课
五、教具准备:
多媒体教室
六、教学方法:
讲授
七、教学过程:
(一)、复习导入
引用()是C++语言特有的(C和语言不具备)数据形式。它的存在不
仅像数组和指针那样依赖于已有的类型,而且它还依赖于一个已有的变量。从直
观上说,一个引用变量是一个已定义的变量的别名。这种引用型变量在作为函数
的参数和返回类型时,其使用方式与指针类型有相似性。
(二)、讲授新课
L引用变量的说明
引用变量的说明格式与指针变量说明相似:
〈类型名〉&〈变量名〉=(对象变量名〉;
与指针说明的区别是:
(1)用符号'&'代替符号。
(2)赋初值部分不可缺省。
例如:
5,;
引用变量,相当于整型变量和1的别名,即:
=3;
其效果为变量和同时被赋值为3。
2;
其效果是变帚和同时在原火值5的恭础上加2,即改变为7。
2.引用和指针的比较
C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《医疗机构消毒技术规范》试题与答案
- 2026年高考化学上海卷真题试卷(+答案)
- 2026年北京市辅警人员招聘考试试题解析及答案
- 2026年湖南省株洲中小学教师招聘考试题库含答案
- 2026年保密基本知识真题试卷含答案
- 2026年安徽省淮南市高职单招数学考试试题及答案
- 第五节 生态系统的相对稳定性教学设计高中生物北师大版2019选择性必修2 生物与环境-北师大版2019
- 本册综合教学设计小学综合实践活动五年级下册人民版
- 第十四节 认识生命 教学设计 -康龙教版初中心理健七年级下册
- 河南省周口市郸城县多校2026届九年级下学期3月阶段检测英语试卷(含答案含听力原文无音频)
- 集团子公司安全责任制度
- 三年(2023-2025)辽宁中考语文真题分类汇编:专题09 记叙文阅读(解析版)
- 行政单位打卡考勤制度
- 2026物业管理行业职业技能竞赛物业管理员考试试题及答案
- 新能源汽车动力电池回收合同协议2025
- 中央公务员考试试题及答案
- 机器人手术术中视野暴露优化策略
- 子宫内膜息肉诊治课件
- 2×200MW火力发电厂电气部分设计
- 成都职业技术学院2025年四季度编制外公开(考试)招聘23名工作人员笔试考试参考试题及答案解析
- 听力学基础与临床
评论
0/150
提交评论