c++编程自定义函数

上传人:wt****50 文档编号:54644384 上传时间:2018-09-16 格式:PPT 页数:92 大小:2.91MB
返回 下载 相关 举报
c++编程自定义函数_第1页
第1页 / 共92页
c++编程自定义函数_第2页
第2页 / 共92页
c++编程自定义函数_第3页
第3页 / 共92页
c++编程自定义函数_第4页
第4页 / 共92页
c++编程自定义函数_第5页
第5页 / 共92页
点击查看更多>>
资源描述

《c++编程自定义函数》由会员分享,可在线阅读,更多相关《c++编程自定义函数(92页珍藏版)》请在金锄头文库上搜索。

1、1,第2-4讲 自定义函数,函数的基本知识 函数的定义 函数的参数 函数的返回值 函数的调用 函数调用的一般形式 调用的方式 嵌套调用 递归调用 函数与数组 局部变量和全局变量 变量的动态存储方式和静态存储方式,2,4.1 概述,C语言函数分为两类: 库函数 scanf printf sqrt cos strcmp 自定义函数 main 每个程序必须有一个main函数 表明程序运行的起始点 只用一个main编程,可能使程序太大、太复杂 例4-1,输出如图所示内容:,3,4,在面向过程的程序设计中,一个较为复杂的程序一般通过模块化,分解成主模块与若干子模块的组合,即一个主函数与若干子函数。 “分

2、”的优点: 便于自上而下的模块化编程; 通过在适当的地方使用函数,可以减短源程序的长度; 更容易定位和隔离有错误的函数,便于进一步的检查; 函数可以被其他多个程序使用。 模块化程序设计 可以把大型程序组织成小而独立的程序段(模块),它们单独命名,是单个的可调用的程序单元。 在C语言中,每个模块就是一个函数,负责完成单个任务。 C语言程序一般都由许多小的函数组成。,5,模块化程序设计的特征: 每个模块只做一件事情。 模块之间的通信只允许通过调用模块来实现。 某个模块只能被更高一级的模块调用。 如果不存在调用与被调用关系,模块之间是不能直接通信的。 所有模块都是使用控制结构设计成单入口、单出口的系

3、统。,6,例4-2,将例4-1中重复执行的部分改写成函数,/ 函数声明(原型),/ 函数调用,/ 函数定义(函数体),函数派生数据类型 函数名标识符 函数具有与之相关的类型 使用之前,函数名及其类型必须已经声明和定义。,7,多函数程序 函数就是含有执行某个特定任务的代码块。 函数一旦设计和封装后,就可以看作是一个“黑盒子”,它从主程序中获得一些数据,并返回一个值。 函数操作的内部细节对程序的其他部分是不可见的。 程序所知道的函数就是:输入什么数据以及输出什么数据。 每个C程序至少包含一个函数,即main函数(主函数)。由主函数调用其它函数,其它函数也可以互相调用。同一个函数可以被一个或多个函数

4、调用任意多次。 一个程序可以保存在一个或多个源文件中。各个文件可以单独编译,并可以与库中已编译过的函数一起加载。,8,4.2 函数的基本知识,一、函数的定义 包括以下元素 函数名 函数类型 参数列表 局部变量声明 函数语句 返回语句,函数头,函数体,9,函数定义的一般格式: 函数类型 函数名(形式参数列表)/函数头,末尾没有; 局部变量声明; 语句1; 语句2; return 语句; 函数类型,即函数带回来的值的类型。 缺省为int。 如不返回任何值,则函数类型应指定为void(也是C的基本类型之一),10,形参,以接收从调用函数发送来的数据。 形参列表包含了变量的声明,变量之间用逗号分隔开;

5、一般格式为: type1 name1, type2 name2, , type n name n 其中: type1 , type2 , type n 是类型标识符,表示形参的类型; name1, name2, , name n 是形参名。 float quadratic(int a, int b, intc) double power(double x, int n) float mul(float x, float y) int sum(int a, int b) int sum(int a, b) 错 形参可以没有,即“无参函数”。可以在参数列表的括号中使用关键字void void Pr

6、intLine(void) 函数在没被调用时,形参只是一个符号。只有函数在被调用时,才由主调函数将实际参数(实参)赋予形参。,11,函数体,包含了函数声明及完成任务所需的语句。依次为: 1) 局部变量,即本函数所需的变量; 2) 完成函数任务的语句; 3) return 语句,返回函数所得的值。 不返回函数值可以省略return语句,但要注意把函数的返回类型声明为void。 函数体可以为空,即“空函数”。此函数不作任何工作,没有任何实际作业。(可先占位,再补充) 几种典型的示例:,12,13,函数的类型和返回值 函数的返回值类型应当属于某个确定的类型。如果在定义函数时不指定函数类型,系统会隐含

7、指定函数类型为int,函数结束也需返回一个int型值。 函数的返回值由 return 语句给出。 return(表达式); 或 return 表达式; 如果函数没有返回值,函数名前的类型标识符为void,return 语句可省略不写。 如果return中的值与函数值的类型不一致,则以函数类型为准。即在返回时先作隐含的类型转换,然后再返回。,/ 3.5 被转换成 3 后返回给主函数,14,例4-3,编写一个函数用于获取三个整数的最大值。,15,二、函数的调用 函数的调用一般格式: 函数名 (实参列表); 实参列表中的参数应与函数原型中形参的个数相同、类型相符 一一对应。 主调函数向被调函数以值传

8、递的方式传递。,16,17,函数调用的执行过程,18,函数调用的方式 函数调用可以作为一条语句出现,这时函数可以没有返回值。 PrintLine(); 函数调用也可以出现在表达式中,这时必须有一个明确的返回值。 a=mul(10,5); printf(“%dn“, mul(a, b) ); If( mul(m, n) total ) printf(“Large“); 函数不能用在赋值语句的左边。 mul(a, b) 15; 错,19,函数的嵌套调用 C语言 不允许函数嵌套定义,即:在函数定义中再定义一个函数是非法的。 C语言的函数定义都是互相平行、独立的。 C语言可以嵌套调用函数,即在调用函数

9、的过程中,又调用另一个函数。,调fun( ),20,例4-4,用函数实现,21,三、函数的声明(函数原型) 返回类型 函数名(形式参数表); 函数原型是一条程序语句,必须以分号结束。 C程序中的所有函数在使用之前都必须声明,即先声明后使用。如果被调函数的定义出现在主调函数之前,可以不必声明。 函数原型声明可在所有函数(包括main)之前。全局原型,该函数对程序中的所有函数都是可用的。 函数原型声明位于某函数定义之中。局部原型,该函数主要是被包含它们的函数使用。 标准库函数的函数原型都在头文件中提供,可用 # include 包含这些原型文件。 函数原型和函数定义在返回类型、函数名和参数表上必须

10、完全一致。 函数原型的参数表可不必包含参数名称,而只要包含参数类型即可。,例如: int max(int, int,int); 等价于:int max(int a, int b,int c);,22,例4-5,随机函数rand 和srand的使用 rand(),返回一个0RAND_MAX(32767)之间的随机整数。 RAND_MAX和rand定义在头文件stdlib.h中 计算机产生的是一个伪随机数,即这个随机数序列有一个长度,会出现重复 用srand(int seed),其参数称为随机数序列种子。即不同的伪随机数序列种子,可以得到不同的伪随机数序列。一般采用系统时间作为随机数序列种子,例如

11、: srand(unsigned int) time(NULL);,23,24,4.3 函数的类型,根据是否有参数,是否有返回值,可以将函数分为以下几种类型: 类型1:无参数、无返回值的函数。 类型2:有参数、无返回值的函数。 类型3:有参数、有返回值的函数。 类型4:无参数、有返回值的函数。,25,一、无参数、无返回值的函数 当函数没有参数时,不用从调用函数接收任何数据。同样,它也不返回值,调用函数不会从被调用函数中接收任何数据。,26,例4-6,请编写一个含有多个函数的程序,这些函数之间不进行任何数据通信。,27,28,二、有参数、无返回值的函数 调用函数和被调用函数之间的数据通信情况:,

12、29,实参和形参在数量、类型和顺序上必须匹配。实参的值被逐个赋给形参,30,必须保证函数调用有匹配的参数。 实参形参,多余的实参将被丢弃; 实参形参,未匹配的形参将被初始化为垃圾值; 数据类型的任何不匹配情况都将导致传递垃圾值。 形参必须是有效的变量名,而实参可以是变量名、表达式或常量 实参到形参的传递实现的是值的传递。被调函数中发生的一切不会影响到实参中的变量。 例4-7,修改例4-6,使得在调用函数中包含参数。 void PrintLine(char ch); void value(float p, float r, int n);,31,32,33,三、有参数、有返回值的函数 为确保程序

13、间更高的可移植性,函数编码中往往不包含任何I/O操作。 调用函数与被调用函数之间具有双向通信。,34,例4-8,修改例4-7中的value函数,使其能将计算的sum值返回给main函数,由main函数按要求实现输出。同时扩展PrintLine函数,可将显示字符的长度作为参数传递。,35,36,四、无参数但有一个返回值的函数 例4-9,设计一个与getchar 类似的函数来获取一个整数。,37,4.4 函数调用时参数的传递,在函数未被调用时,函数的形参并不占有实际的内存空间,也没有实际的值。 只有在函数被调用时才为形参分配存储单元,并将实参与形参结合。 实参类型必须与形参相符。 函数的参数传递指

14、的就是形参与实参结合的过程。 一、值调用 传值调用 直接将实参的值传递给形参。 单向传递。 形参的改变不会影响到实参。,38,例4-10,传值调用,将两个数的值换位。,39,执行主函数中的函数调用语句:swap(x,y);,在swap 子函数中:,temp = a;,a = b;,b = temp;,返回主函数后:,40,例4-11,从键盘上输入字符,要求输入字符为0-9十个数字。,41,二、 数组作为函数参数 数组元素可以作为调用函数时的实参,用法同单个变量,是单向传递 数组名做函数的参数 函数调用时只需传递数组名。 在函数定义中,形参的类型必须与实参数组的相同,数组的大小不必指定。 函数原

15、型中的参数也必须定义为一个数组。 例4-12:调用一个函数求数组元素之和,42,43,44,例4-13, 请编写一个程序,使用一个函数来把有10个整数元素的数组按升序排列,45,46,例4-14:调用一个函数求二维数组元素的最大值,47,例4-15:矩阵乘法,48,49,50,三、结构体作为函数的参数 分别传递各个结构成员 像普通变量一样来处理; 如果结构很大,该方法就变得难以控制,效率也不高。 传递整个结构 将整个结构的副本传递给被调函数,函数对结构成员的任何修改都不会影响实参。,51,例,编写几个对点和矩形操作的函数。 定义点的结构类型 定义矩形的结构类型,52,1. 定义函数makepo

16、int,它带有两个整型参数,并返回一个point类型的结构,53,2. addpoint函数:将两个点相加,54,注意要点: 当函数的参数是一个结构类型时,主调、被调函数中相对应的实参、形参必须为相同的结构类型。 当函数的返回值是一个结构时,必须将返回值赋给调用函数中的相同类型的结构变量。 和其它类型的参数一样,结构类型的参数也是通过“值”传递的。 例4-16,以将3个学生按成绩由高到低排序为例,55,56,4.5 函数的递归调用,函数可以直接或间接地调用自身,称为递归调用。 直接调用: 间接调用:,void fun1(void) fun1( ); / 调用fun1自身 ,57,递归的条件 1)须有完成函数任务的语句。 2)有一个确定是否能避免无限的递归调用的测试。 3)一个递归调用语句。该语句的参数应该逐渐逼近不满足条件,以致最后断绝递归。 4)先测试,后递归调用。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 机械/制造/汽车 > 机械理论及资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号