c++编程自定义函数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、有参数、无返回值的函数
调用函数和被调用函数之间的数据通信情况:
function1() { ……….. ……….. function2(a) ……….. ……….. }
参数值
无返回值
function2(x) { ……….. ……….. ……….. ……….. ……….. }
29
实参和形参在数量、类型和顺序上必须匹配。实
必须完全一致。 函数原型的参数表可不必包含参数名称,而只要包含 例如: int max(int, int,int); 参数类型即可。
等价于:int max(int a, int b,int c);
22
例4-5,随机函数rand 和srand的使用 rand(),返回一个0~RAND_MAX(32767)之间的随 机整数。 RAND_MAX和rand定义在头文件stdlib.h中 计算机产生的是一个伪随机数,即这个随机数序列 有一个长度,会出现重复 用srand(int seed),其参数称为随机数序列种子。 即不同的伪随机数序列种子,可以得到不同的伪随 机数序列。一般采用系统时间作为随机数序列种子, 例如: srand((unsigned int) time(NULL));
控制
function1() { ……….. ……….. function2() ……….. ……….. }
无输入
无输出
控制
function2() { ……….. ……….. ……….. ……….. ……….. }
26
例4-6,请编写一个含有多个函数的程序,这些
函数之间不进行任何数据通信。
27
28
例4-7,修改例4-6,使得在调用函数中包含参数。 void PrintLine(char ch); void value(float p, float r, int n);
31
32
33
三、有参数、有返回值的函数
为确保程序间更高的可移植性,函数编码中往往不 包含任何I/O操作。 调用函数与被调用函数之间具有双向通信。
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) { ......}
×错 形参可以没有,即“无参函数”。可以在参数列表的括号中 使用关键字void void PrintLine(void) {......} 函数在没被调用时,形参只是一个符号。只有函数在被调用 时,才由主调函数将实际参数(实参)赋予形参。
int sum(int a, b) { ......}
main( ) 调fun( ) 结束
fun( )
fun1( )
调fun1( )
return
return
20
例4-4,用函数实现
a bc
三、函数的声明(函数原型)
返回类型 函数名(形式参数表); 函数原型是一条程序语句,必须以分号结束。 C程序中的所有函数在使用之前都必须声明,即先声明 后使用。如果被调函数的定义出现在主调函数之前,可 以不必声明。
1
第2-4讲 自定义函数
函数的基本知识 函数的定义 函数的参数 函数的返回值 函数的调用 函数调用的一般形式 调用的方式 嵌套调用 递归调用 函数与数组 局部变量和全局变量 变量的动态存储方式和静态存储方式
2
4.1 概述
C语言函数分为两类:
库函数 scanf printf sqrt cos strcmp
函数)。由主函数调用其它函数,其它函数也可 以互相调用。同一个函数可以被一个或多个函数 调用任意多次。
一个程序可以保存在一个或多个源文件中。各个文件
可以单独编译,并可以与库中已编译过的函数一起加 载。
8
4.2 函数的基本知识 一、函数的定义
包括以下元素 函数名 函数类型 函数头 参数列表 局部变量声明 函数语句 函数体 返回语句
21
函数原型声明可在所有函数(包括main)之前。——全局原型,
该函数对程序中的所有函数都是可用的。 函数原型声明位于某函数定义之中。——局部原型,该函数主 要是被包含它们的函数使用。 标准库函数的函数原型都在头文件中提供,可用 # include 包 含这些原型文件。
函数原型和函数定义在返回类型、函数名和参数表上
便于自上而下的模块化编程; 通过在适当的地方使用函数,可以减短源程序的长度; 更容易定位和隔离有错误的函数,便于进一步的检查; 函数可以被其他多个程序使用。
模块化程序设计
它们单独命名,是单个的可调用的程序单元。 在C语言中,每个模块就是一个函数,负责完成单 个任务。 C语言程序一般都由许多小的函数组成。
35
36
四、无参数但有一个返回值的函 数
例4-9,设计一个与getchar 类似的函数来获取一 个整数。
Biblioteka Baidu
37
4.4 函数调用时参数的传递
在函数未被调用时,函数的形参并不占有实际的内存空
间,也没有实际的值。 只有在函数被调用时才为形参分配存储单元,并将实参 与形参结合。 实参类型必须与形参相符。 函数的参数传递指的就是形参与实参结合的过程。
function1() { ……….. ……….. function2(a) ……….. ……….. }
参数值
函数结果
function2(x) { ……….. ……….. ……….. ……….. return(b); }
34
例4-8,修改例4-7中的value函数,使其能将计
算的sum值返回给main函数,由main函数按要 求实现输出。同时扩展PrintLine函数,可将显示 字符的长度作为参数传递。
main( ) 调 mul(10,5) 保存: 返回地址 当前现场 mul(10,5)
恢复: 主调程序现场 返回地址
结束
返回
18
函数调用的方式
函数调用可以作为一条语句出现,这时函数可以没有
返回值。
PrintLine();
函数调用也可以出现在表达式中,这时必须有一个明
23
24
4.3
函数的类型
根据是否有参数,是否有返回值,可以将函数分为 以下几种类型:
类型1:无参数、无返回值的函数。 类型2:有参数、无返回值的函数。 类型3:有参数、有返回值的函数。 类型4:无参数、有返回值的函数。
25
一、无参数、无返回值的函数
当函数没有参数时,不用从调用函数接收任何数据。 同样,它也不返回值,调用函数不会从被调用函 数中接收任何数据。
系统。
6
例4-2,将例4-1中重复执行的部分改写成函数
函数--派生数据类型
// 函数声明(原型)
•函数名--标识符 •函数具有与之相关的类型 // 函数调用 •使用之前,函数名及其类 型必须已经声明和定义。
// 函数定义(函数体)
7
多函数程序
函数就是含有执行某个特定任务的代码块。 函数一旦设计和封装后,就可以看作是一个“黑盒 子”,它从主程序中获得一些数据,并返回一个值。 函数操作的内部细节对程序的其他部分是不可见的。 程序所知道的函数就是:输入什么数据以及输出什么 数据。 每个C程序至少包含一个函数,即main函数(主
参的值被逐个赋给形参
main() { 实参 .............. function1(a1, a2, a3, ......, am) .............. }
函数调用
被函数调用
function1(f1, f2, f3, ......, fn) { .............. 形参 .............. }
9
函数定义的一般格式: 函数类型 函数名(形式参数列表)//函数头,末尾没有; { 局部变量声明; 语句1; 语句2; ...... return 语句; }
函数类型,即函数带回来的值的类型。
缺省为int。
如不返回任何值,则函数类型应指定为void(也是C的基本
类型之一)
10
形参,以接收从调用函数发送来的数据。
自定义函数 main
每个程序必须有一个main函数
表明程序运行的起始点
只用一个main编程,可能使程序太大、太复杂
例4-1,输出如图所示内容:
3
4
在面向过程的程序设计中,一个较为复杂的程序一般通
过模块化,分解成主模块与若干子模块的组合,即一个 主函数与若干子函数。 “分”的优点:
一、值调用—— 传值调用
直接将实参的值传递给形参。
单向传递。 形参的改变不会影响到实参。
38
例4-10,传值调用,将两个数的值换位。
39
执行主函数中的函数 调用语句:swap(x,y);
x
1 1
y
2
a
在swap 子函数中: temp = a; 1 2 x y 1 a temp 1 2 b
有任何实际作业。(可先占位,再补充) 几种典型的示例:
12
13
函数的类型和返回值
函数的返回值类型应当属于某个确定的类型。如果在定义函数
时不指定函数类型,系统会隐含指定函数类型为int,函数结束 也需返回一个int型值。 函数的返回值由 return 语句给出。 return(表达式); 或 return 表达式; 如果函数没有返回值,函数名前的类型标识符为void,return 语句可省略不写。 如果return中的值与函数值的类型不一致,则以函数类型为准。 即在返回时先作隐含的类型转换,然后再返回。
// 3.5 被转换成 3 后返回给主函数
14
例4-3,编写一个函数用于获取三个整数的最大
值。
15
二、函数的调用
函数的调用一般格式:
函数名 (实参列表);
实参列表中的参数应与函数原型中形参的个数相同、
类型相符—— 一一对应。 主调函数向被调函数以值传递的方式传递。
16
17
函数调用的执行过程
可以把大型程序组织成小而独立的程序段(模块),
5
模块化程序设计的特征: 每个模块只做一件事情。 模块之间的通信只允许通过调用模块来实现。 某个模块只能被更高一级的模块调用。 如果不存在调用与被调用关系,模块之间是不能直接 通信的。
所有模块都是使用控制结构设计成单入口、单出口的
2 b
a = b;
x a temp 1 1 2 y 2
b = temp; 1 2 x y
2 a temp 2 y 1 1 b
确的返回值。
a=mul(10,5); printf("%d\n", mul(a, b) ); If( mul(m, n) > total ) printf("Large");
函数不能用在赋值语句的左边。
mul(a, b) = 15;
×错
19
函数的嵌套调用 C语言 不允许函数嵌套定义,即:在函数定义中再 定义一个函数是非法的。 C语言的函数定义都是互相平行、独立的。 C语言可以嵌套调用函数,即在调用函数的过程中, 又调用另一个函数。
30
必须保证函数调用有匹配的参数。 实参>形参,多余的实参将被丢弃; 实参<形参,未匹配的形参将被初始化为垃圾值; 数据类型的任何不匹配情况都将导致传递垃圾值。
形参必须是有效的变量名,而实参可以是变量名、表
达式或常量 实参到形参的传递实现的是值的传递。被调函数中发 生的一切不会影响到实参中的变量。
形参列表包含了变量的声明,变量之间用逗号分隔开;一般
格式为: type1 name1, type2 name2, ……, type n name n 其中: type1 , type2 ……, type n 是类型标识符,表示形 参的类型; name1, name2, ……, name n 是形参名。
11
函数体,包含了函数声明及完成任务所需的语句。依
次为:
1) 局部变量,即本函数所需的变量; 2) 完成函数任务的语句; 3) return 语句,返回函数所得的值。 不返回函数值可以省略return语句,但要注意把函数的返回 类型声明为void。
函数体可以为空,即“空函数”。此函数不作任何工作,没