c++编程自定义函数

上传人:野鹰 文档编号:2906681 上传时间:2017-07-28 格式: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,模块化程序设计的特征:每个模块只做一件事情。模块之间的通信只允许通过调用模块来实现。某个模块只能被更高一级的模块调用。如果不存在调用与被调用关系,模块之间是不能直接通信的。所有模块都是使用控制结构设计成单入口、单出口的系统。,6,例4-2,将例4-1中重复执行的部分改写成函数,/ 函数

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

4、库中已编译过的函数一起加载。,8,4.2 函数的基本知识,一、函数的定义 包括以下元素函数名函数类型参数列表局部变量声明函数语句返回语句,函数头,函数体,9,函数定义的一般格式:函数类型 函数名(形式参数列表)/函数头,末尾没有; 局部变量声明; 语句1; 语句2; . return 语句;函数类型,即函数带回来的值的类型。缺省为int。如不返回任何值,则函数类型应指定为void(也是C的基本类型之一),10,形参,以接收从调用函数发送来的数据。形参列表包含了变量的声明,变量之间用逗号分隔开;一般格式为:type1 name1, type2 name2, , type n name n其中:

5、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) . 错形参可以没有,即“无参函数”。可以在参数列表的括号中使用关键字voidvoid PrintLine(void) .函数在没被调用时,形参只是一个符号。只有函数在被调用时,才由主调函数将

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

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

8、回值。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语言可以嵌套调用函数,即在调用函数的过程中,又调用另一个函数。,调fun( ),20,例4-4,用函数实现,21,三、函数的声明(函数原型) 返回类型 函数名(形式参数表);函

9、数原型是一条程序语句,必须以分号结束。C程序中的所有函数在使用之前都必须声明,即先声明后使用。如果被调函数的定义出现在主调函数之前,可以不必声明。函数原型声明可在所有函数(包括main)之前。全局原型,该函数对程序中的所有函数都是可用的。函数原型声明位于某函数定义之中。局部原型,该函数主要是被包含它们的函数使用。标准库函数的函数原型都在头文件中提供,可用 # include 包含这些原型文件。 函数原型和函数定义在返回类型、函数名和参数表上必须完全一致。 函数原型的参数表可不必包含参数名称,而只要包含参数类型即可。,例如: int max(int, int,int); 等价于:int max(

10、int a, int b,int c);,22,例4-5,随机函数rand 和srand的使用rand(),返回一个0RAND_MAX(32767)之间的随机整数。RAND_MAX和rand定义在头文件stdlib.h中计算机产生的是一个伪随机数,即这个随机数序列有一个长度,会出现重复用srand(int seed),其参数称为随机数序列种子。即不同的伪随机数序列种子,可以得到不同的伪随机数序列。一般采用系统时间作为随机数序列种子,例如: srand(unsigned int) time(NULL);,23,24,4.3 函数的类型,根据是否有参数,是否有返回值,可以将函数分为以下几种类型:类

11、型1:无参数、无返回值的函数。类型2:有参数、无返回值的函数。类型3:有参数、有返回值的函数。类型4:无参数、有返回值的函数。,25,一、无参数、无返回值的函数当函数没有参数时,不用从调用函数接收任何数据。同样,它也不返回值,调用函数不会从被调用函数中接收任何数据。,26,例4-6,请编写一个含有多个函数的程序,这些函数之间不进行任何数据通信。,27,28,二、有参数、无返回值的函数调用函数和被调用函数之间的数据通信情况:,29,实参和形参在数量、类型和顺序上必须匹配。实参的值被逐个赋给形参,30,必须保证函数调用有匹配的参数。实参形参,多余的实参将被丢弃;实参形参,未匹配的形参将被初始化为垃

12、圾值;数据类型的任何不匹配情况都将导致传递垃圾值。形参必须是有效的变量名,而实参可以是变量名、表达式或常量实参到形参的传递实现的是值的传递。被调函数中发生的一切不会影响到实参中的变量。例4-7,修改例4-6,使得在调用函数中包含参数。 void PrintLine(char ch); void value(float p, float r, int n);,31,32,33,三、有参数、有返回值的函数为确保程序间更高的可移植性,函数编码中往往不包含任何I/O操作。调用函数与被调用函数之间具有双向通信。,34,例4-8,修改例4-7中的value函数,使其能将计算的sum值返回给main函数,由

13、main函数按要求实现输出。同时扩展PrintLine函数,可将显示字符的长度作为参数传递。,35,36,四、无参数但有一个返回值的函数例4-9,设计一个与getchar 类似的函数来获取一个整数。,37,4.4 函数调用时参数的传递,在函数未被调用时,函数的形参并不占有实际的内存空间,也没有实际的值。 只有在函数被调用时才为形参分配存储单元,并将实参与形参结合。 实参类型必须与形参相符。 函数的参数传递指的就是形参与实参结合的过程。一、值调用 传值调用 直接将实参的值传递给形参。 单向传递。 形参的改变不会影响到实参。,38,例4-10,传值调用,将两个数的值换位。,39,执行主函数中的函数

14、调用语句:swap(x,y);,在swap 子函数中:,temp = a;,a = b;,b = temp;,返回主函数后:,40,例4-11,从键盘上输入字符,要求输入字符为0-9十个数字。,41,二、 数组作为函数参数 数组元素可以作为调用函数时的实参,用法同单个变量,是单向传递 数组名做函数的参数函数调用时只需传递数组名。 在函数定义中,形参的类型必须与实参数组的相同,数组的大小不必指定。 函数原型中的参数也必须定义为一个数组。 例4-12:调用一个函数求数组元素之和,42,43,44,例4-13, 请编写一个程序,使用一个函数来把有10个整数元素的数组按升序排列,45,46,例4-14

15、:调用一个函数求二维数组元素的最大值,47,例4-15:矩阵乘法,48,49,50,三、结构体作为函数的参数分别传递各个结构成员像普通变量一样来处理;如果结构很大,该方法就变得难以控制,效率也不高。传递整个结构将整个结构的副本传递给被调函数,函数对结构成员的任何修改都不会影响实参。,51,例,编写几个对点和矩形操作的函数。定义点的结构类型定义矩形的结构类型,52,1. 定义函数makepoint,它带有两个整型参数,并返回一个point类型的结构,53,2. addpoint函数:将两个点相加,54,注意要点:当函数的参数是一个结构类型时,主调、被调函数中相对应的实参、形参必须为相同的结构类型。当函数的返回值是一个结构时,必须将返回值赋给调用函数中的相同类型的结构变量。和其它类型的参数一样,结构类型的参数也是通过“值”传递的。例4-16,以将3个学生按成绩由高到低排序为例,55,

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

当前位置:首页 > 行业资料 > 其它行业文档

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