




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第5章章 函数函数第第1章章 C语言概述语言概述第第2章章 基本数据类型和运算基本数据类型和运算第第3章章 结构化程序设计结构化程序设计第第5章章 函数函数第第6章章 指针指针第第7章章 复合结构类型复合结构类型第第8章章 编译预处理编译预处理第第4章章 数组及字符串数组及字符串课程概述课程概述 附录附录5.1 C程序的模块结构程序的模块结构5.2 函数的分类函数的分类5.3 函数的定义和调用函数的定义和调用5.4 函数间的参数传递函数间的参数传递5.5 函数的嵌套与递归函数的嵌套与递归5.6系统函数系统函数5.7变量的存储类别、作用域、生存变量的存储类别、作用域、生存期期 第第9章章 位运
2、算位运算第第10章章 文件文件函数函数第第5章章教学目标教学目标 掌握掌握C函数的定义和调用方法函数的定义和调用方法 熟悉函数间的数据传递方法熟悉函数间的数据传递方法 了解变量和函数的存储类型对函数调用的影响了解变量和函数的存储类型对函数调用的影响 掌握递归函数的设计等掌握递归函数的设计等5.1.1 C程序的模块化结构概念程序的模块化结构概念5.1 C程序的模块结构程序的模块结构1. C语言的模块化语言的模块化 2. C函数逻辑关系示意函数逻辑关系示意一个一个C程序由一个具有固定程序由一个具有固定名称名称main()的主函数和若干个的主函数和若干个以标识符命名的其他函数组以标识符命名的其他函数
3、组成,通常用成,通常用main()函数描述程函数描述程序的总体框架,其他函数则序的总体框架,其他函数则完成某种特定的子功能。完成某种特定的子功能。一个一个C程序执行时,总是从程序执行时,总是从main()函数开始,由函数开始,由main()函函数调用其他函数,而其他函数调用其他函数,而其他函数又可以相互调用。数又可以相互调用。5.1.1 C程序的模块化结构概念程序的模块化结构概念5.1 C程序的模块结构程序的模块结构1. C语言的模块化语言的模块化 2. C函数逻辑关系示意函数逻辑关系示意main( )fun1( );fun2( );fun1( );fun11( );fun2( );fun21
4、( );fun22( );fun11( );fun21( );fun22( );5.1.2 函数的概述函数的概述5.1 C程序的模块结构程序的模块结构1. 函数的概述函数的概述 2. 例例5.1函数本质上是一个完成特定函数本质上是一个完成特定功能的段程序,该段程序可以功能的段程序,该段程序可以被其他函数调用。除了主函数被其他函数调用。除了主函数之外,其他的函数是不能独立之外,其他的函数是不能独立运行的。运行的。程序的全部工作都是由各程序的全部工作都是由各式各样的函数完成的,所以也式各样的函数完成的,所以也把语言称为函数式语言。把语言称为函数式语言。5.1.2 函数的概述函数的概述5.1 C程序
5、的模块结构程序的模块结构1. 函数的概述函数的概述 2. 例例5.1例例5.1 一个简单函数调用的例子。一个简单函数调用的例子。#includehello() /* hello函数函数 */ printf (Hello,human n);main() hello(); /* 调用调用hello函数函数*/程序的运行结果如下:程序的运行结果如下:Hello,human2. 从形式角度从形式角度3. 作用范围角度作用范围角度4. 从返回值角度从返回值角度1. 从定义的角度从定义的角度5.2 函数的分类函数的分类从函数定义的角度看,函数可分从函数定义的角度看,函数可分为用户函数和系统函数两种。为用户
6、函数和系统函数两种。(1)用户函数:用户函数是用户)用户函数:用户函数是用户按需要编写的函数。按需要编写的函数。(2)系统函数:由语言系统提)系统函数:由语言系统提供,用户无须定义,也不必在程供,用户无须定义,也不必在程序中作类型说明,只需在程序前序中作类型说明,只需在程序前包含有该函数原型的头文件即可包含有该函数原型的头文件即可在程序中直接调用。在程序中直接调用。2. 从形式角度从形式角度3. 作用范围角度作用范围角度4. 从返回值角度从返回值角度1. 从定义的角度从定义的角度5.2 函数的分类函数的分类从函数形式上来看,可以将函从函数形式上来看,可以将函数分为无参函数和有参函数两种。数分为
7、无参函数和有参函数两种。(1)无参函数:无参函数即在函)无参函数:无参函数即在函数定义、函数说明及函数调用中数定义、函数说明及函数调用中均不带参数。均不带参数。(2)有参函数:有参函数也称为)有参函数:有参函数也称为带参函数。带参函数。在函数定义及函数说明时都有在函数定义及函数说明时都有参数,称为形式参数(简称为形参数,称为形式参数(简称为形参);参);在函数调用时也必须给出参数,在函数调用时也必须给出参数,称为实际参数(简称为实参)。称为实际参数(简称为实参)。2. 从形式角度从形式角度3. 作用范围角度作用范围角度4. 从返回值角度从返回值角度1. 从定义的角度从定义的角度5.2 函数的分
8、类函数的分类如果从函数起作用的范围来分,如果从函数起作用的范围来分,又可以将函数分为外部函数和内部又可以将函数分为外部函数和内部函数。函数。(1)外部函数:可以被任何编译)外部函数:可以被任何编译单位调用的函数称为外部函数。单位调用的函数称为外部函数。(2)内部函数:只能在本编译单)内部函数:只能在本编译单位中被调用的函数称为内部函数。位中被调用的函数称为内部函数。2. 从形式角度从形式角度3. 作用范围角度作用范围角度4. 从返回值角度从返回值角度1. 从定义的角度从定义的角度5.2 函数的分类函数的分类从函数有无返回值角度,又可把从函数有无返回值角度,又可把函数分为有返回值函数和无返回函数
9、分为有返回值函数和无返回值函数两种。值函数两种。(1)有返回值函数:有返回值函)有返回值函数:有返回值函数被调用执行完后将向调用者返数被调用执行完后将向调用者返回一个执行结果,称为函数返回回一个执行结果,称为函数返回值。值。(2)无返回值函数:无返回值函)无返回值函数:无返回值函数用于完成某项特定的处理任务,数用于完成某项特定的处理任务,执行完成后不向调用者返回函数执行完成后不向调用者返回函数值。值。5.3.1 函数的说明函数的说明5.3 函数的定义和调用函数的定义和调用函数类型函数类型 函数名函数名(数据类型数据类型 形式参数形式参数1,数据类型数据类型 形式形式参数参数2,数据类型数据类型
10、 形式参数形式参数n); 2. 传统格式传统格式函数的类型说明函数的类型说明 函数名函数名(带有类型说明带有类型说明的参数表的参数表) 函数体函数体;1. 现代格式现代格式5.3.2 函数的定义函数的定义5.3 函数的定义和调用函数的定义和调用2. 传统格式传统格式函数的类型说明函数的类型说明 函数名函数名(不带类型说明不带类型说明的参数表的参数表) 参数的类型说明参数的类型说明; 函数体函数体;1. 现代格式现代格式5.3.2 函数的定义函数的定义5.3 函数的定义和调用函数的定义和调用134562函数名函数名函数名是编译系统识别函数的依据,除函数名是编译系统识别函数的依据,除了了main(
11、)函数有固定名称外,其他函数由函数有固定名称外,其他函数由用户按标识符的规则自行命名。用户按标识符的规则自行命名。函数名与其后的圆括号之间不能留空格,函数名与其后的圆括号之间不能留空格,C编译系统依据一个标识符后有没有圆括编译系统依据一个标识符后有没有圆括号来判定它是不是函数。号来判定它是不是函数。函数名是一个常数,代表该段程序代码函数名是一个常数,代表该段程序代码在内存中的首地址,也叫函数入口地址。在内存中的首地址,也叫函数入口地址。5.3.2 函数的定义函数的定义5.3 函数的定义和调用函数的定义和调用134562函数的形式参数函数的形式参数函数的形式参数也称形参,用来建立函函数的形式参数
12、也称形参,用来建立函数之间的数据联系。当一个函数被调用数之间的数据联系。当一个函数被调用时,形参接收来自调用函数的实在参数时,形参接收来自调用函数的实在参数(也称实参),实现函数与函数之间的(也称实参),实现函数与函数之间的数据通信,称为虚实结合或哑实结合。数据通信,称为虚实结合或哑实结合。当形参有多个时,相互之间用逗号隔开。当形参有多个时,相互之间用逗号隔开。函数名后面的圆括号中是空白或函数名后面的圆括号中是空白或void的的函数称为无参函数。如:函数称为无参函数。如:float sub(void)或或float sub()5.3.2 函数的定义函数的定义5.3 函数的定义和调用函数的定义和
13、调用134562函数的返回值函数的返回值函数在运行结束时将运算结果返回到调函数在运行结束时将运算结果返回到调用函数,称为函数的返回值。用函数,称为函数的返回值。函数的返回值是由函数的返回值是由return语句完成的,语句完成的,其中,作为返回值的变量或表达式可以其中,作为返回值的变量或表达式可以用圆括号括住,也可以省略圆括号。用圆括号括住,也可以省略圆括号。当函数无返回值时,当函数无返回值时,return的作用是将的作用是将控制权交给调用函数,而不是返回一个控制权交给调用函数,而不是返回一个值。值。5.3.2 函数的定义函数的定义5.3 函数的定义和调用函数的定义和调用134562函数的数据类
14、型函数的数据类型函数的数据类型指的是该函数返回值的函数的数据类型指的是该函数返回值的类型,可以是类型,可以是char、int、float、double和和指针等。如果省略函数的数据类型,则指针等。如果省略函数的数据类型,则默认为默认为int型。型。如果如果return中的表达式类型与函数类型中的表达式类型与函数类型不一致,则编译系统自动将表达式的类不一致,则编译系统自动将表达式的类型转换成函数的类型后返回。型转换成函数的类型后返回。无返回值的函数可以定义为无值类型。无返回值的函数可以定义为无值类型。在传统格式中,定义无值类型时,函数在传统格式中,定义无值类型时,函数名前不加任何关键字;在现代格
15、式中,名前不加任何关键字;在现代格式中,则显式地加上关键字则显式地加上关键字void。5.3.2 函数的定义函数的定义5.3 函数的定义和调用函数的定义和调用134562函数的存储类型函数的存储类型函数的存储类型用来表示该函数能否被函数的存储类型用来表示该函数能否被其他程序文件中的函数调用。其他程序文件中的函数调用。当一个程序文件中的函数允许被另一个当一个程序文件中的函数允许被另一个程序文件中的函数调用时,可以将它定程序文件中的函数调用时,可以将它定义成义成extern型,否则,就要定义成型,否则,就要定义成static型。型。如果在函数定义时缺省存储类型,则默如果在函数定义时缺省存储类型,则
16、默认为认为extern。5.3.2 函数的定义函数的定义5.3 函数的定义和调用函数的定义和调用134562函数体函数体函数体是函数实现特定处理功能的语句函数体是函数实现特定处理功能的语句集合,其形式与集合,其形式与main函数完全相同。函数完全相同。C语言允许一个函数调用另一个函数,语言允许一个函数调用另一个函数,但不允许在一个函数体内再定义另一个但不允许在一个函数体内再定义另一个函数。函数。5.3.2 函数的定义函数的定义5.3 函数的定义和调用函数的定义和调用1. 有参函数的定义有参函数的定义2.无参函数的定义无参函数的定义 有参函数定义的一般形式为:有参函数定义的一般形式为:类型标识符
17、类型标识符 函数名函数名(数据类型数据类型 形式参形式参数数1,数据类型数据类型 形式参数形式参数2,数据类型数据类型 形式参数形式参数n) 函数体函数体说明:形参是变量,必须在形参表中说明:形参是变量,必须在形参表中给出形参的类型说明。给出形参的类型说明。5.3.3 有参函数和无参函数有参函数和无参函数5.3 函数的定义和调用函数的定义和调用定义的一般形式定义的一般形式1. 有参函数的定义有参函数的定义2.无参函数的定义无参函数的定义 #includeint max(int a, int b,int c) int max;max=a;if(ab) max=b;if(maxc) max=c;r
18、eturn(max);main()int max(int a,int b,int c);int z,m,n,y;printf(input three numbers:n);scanf(%d%d%d,&m,&n,&y);z=max(m,n,y);printf(The max is %d,z);5.3.3 有参函数和无参函数有参函数和无参函数5.3 函数的定义和调用函数的定义和调用例例5.2程序的运行情况为:程序的运行情况为:input three numbers:23 1 78 The max is 781. 有参函数的定义有参函数的定义2.无参函数的定义无参函数的定义
19、类型标识符类型标识符 函数名(函数名( ) 函数体函数体其中:类型标识符和函数名称为函数头。其中:类型标识符和函数名称为函数头。类型标识符指明了本函数的类型,函数的类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。类型实际上是函数返回值的类型。无参函数无返回值时的函数类型符可以写无参函数无返回值时的函数类型符可以写为为void。例如:例如:void Hello()() printf(Hello humann);5.3.3 有参函数和无参函数有参函数和无参函数5.3 函数的定义和调用函数的定义和调用定义的一般形式定义的一般形式1. 函数的简单调用函数的简单调用2.调用的形式调用的
20、形式 函数调用的一般形式为:函数调用的一般形式为: 被调用函数名被调用函数名(参数表达式参数表达式1,参数参数表达式表达式2,参数表达式参数表达式n);其中,参数前不加数据类型说明,其中,参数前不加数据类型说明,参数表达式可以是常量、变量或表参数表达式可以是常量、变量或表达式。各个参数表达式之间用逗号达式。各个参数表达式之间用逗号分割。分割。使用使用C语言的库函数就是函数简单语言的库函数就是函数简单调用的方法。例如:调用的方法。例如:main() printf(*n); 上述程序在上述程序在main()函数中调用输函数中调用输出函数出函数printf来输出一行星号。来输出一行星号。5.3.4
21、函数的调用函数的调用5.3 函数的定义和调用函数的定义和调用1. 函数的简单调用函数的简单调用2.调用的形式调用的形式 函数作为表达式中的一项出现在表函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的达式中,以函数返回值参与表达式的运算。这种方式要求函数有返回值。运算。这种方式要求函数有返回值。例如:例如:z=max(x,y)*8;其中,函数其中,函数max是赋值表达式的一是赋值表达式的一部分,它的值乘以部分,它的值乘以8后再赋予变量后再赋予变量z。5.3.4 函数的调用函数的调用5.3 函数的定义和调用函数的定义和调用函数表达式函数表达式1. 函数的简单调用函数的简单调用2.调用
22、的形式调用的形式 函数调用的一般形式加上分号即构函数调用的一般形式加上分号即构成函数语句。例如:成函数语句。例如:printf(%d,m);max(x,y); 等都是以函数语句的方式调用函数。等都是以函数语句的方式调用函数。5.3.4 函数的调用函数的调用5.3 函数的定义和调用函数的定义和调用函数语句函数语句1. 函数的简单调用函数的简单调用2.调用的形式调用的形式 函数作为另一个函数调用的实际参函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回数出现。这种情况是把该函数的返回值作为实参传递给调用函数,因此要值作为实参传递给调用函数,因此要求该函数必须有返回值。例如:求该函数必须
23、有返回值。例如:printf(%d,max(m,n); 上述语句是把上述语句是把max函数的返回值函数的返回值又作为又作为printf函数的实参来使用。函数的实参来使用。5.3.4 函数的调用函数的调用5.3 函数的定义和调用函数的定义和调用函数实参函数实参(1)调用系统函数时,需要用)调用系统函数时,需要用#include“头文件名头文件名.h”将定义系将定义系统函数的库文件包含在本程序中。统函数的库文件包含在本程序中。(2)调用函数和被调用函数在一个编译单元中,则在书写顺序)调用函数和被调用函数在一个编译单元中,则在书写顺序上被调用函数比调用函数先出现;或者被调用函数虽然在调用上被调用函数
24、比调用函数先出现;或者被调用函数虽然在调用函数之后出现,而被调用函数的类型是整型或字符型,可以不函数之后出现,而被调用函数的类型是整型或字符型,可以不对被调用函数加以说明。除了上述两种情况以外,都要对被调对被调用函数加以说明。除了上述两种情况以外,都要对被调用函数加以说明。用函数加以说明。函数说明的位置一般在调用函数的函数体开头的数据说明语函数说明的位置一般在调用函数的函数体开头的数据说明语句中,说明的格式为:句中,说明的格式为:数据类型数据类型 被调用函数名被调用函数名();5.3.4 函数的调用函数的调用5.3 函数的定义和调用函数的定义和调用函数调用时,需要对调用函数进行说明,说明时需要
25、注意以下几点:函数调用时,需要对调用函数进行说明,说明时需要注意以下几点:(3)被调用函数和调用函数不在一个编译单元,需)被调用函数和调用函数不在一个编译单元,需在定义函数的编译单元中用下列方式将被调用函数在定义函数的编译单元中用下列方式将被调用函数定义成外部函数:定义成外部函数: extern 数据类型数据类型 函数名函数名(形式参形式参数表数表);在主调用函数的函数体中,或所在编译单元的开在主调用函数的函数体中,或所在编译单元的开头将要调用的函数说明成头将要调用的函数说明成“外部函数外部函数”。具体的说。具体的说明语句格式为:明语句格式为:extern 数据类型数据类型 被调函数名被调函数
26、名();5.3.4 函数的调用函数的调用5.3 函数的定义和调用函数的定义和调用函数调用时,需要对调用函数进行说明,说明时需要注意以下几点:函数调用时,需要对调用函数进行说明,说明时需要注意以下几点:2. 形参和实参形参和实参的特点的特点3. 用用return语句语句返回函数的值返回函数的值1. 形参和实参形参和实参的概念的概念5.4.1 函数的参数和值函数的参数和值5.4 函数间的参数传递函数间的参数传递形参出现在函数定义中,在整个函数形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使体内都可以使用,离开该函数则不能使用。用。实参出现在主调函数中,进入被调函实参出现在主调函数
27、中,进入被调函数后,实参变量也不能使用。数后,实参变量也不能使用。形参和实参两者相互配合进形参和实参两者相互配合进行数据传行数据传送。送。发生函数调用时,主调函数把实参的发生函数调用时,主调函数把实参的值传送给被调函数的形参,从而实现主值传送给被调函数的形参,从而实现主调函数向被调函数的数据传送。调函数向被调函数的数据传送。2. 形参和实参形参和实参的特点的特点3. 用用return语句语句返回函数的值返回函数的值1. 形参和实参形参和实参的概念的概念5.4.1 函数的参数和值函数的参数和值5.4 函数间的参数传递函数间的参数传递 例例5.4 求求m个自然数之和。个自然数之和。下图所示为对应的
28、下图所示为对应的N-S流程图。流程图。输入一个整数mfor i=m-1 to 1m=m+i输出m个自然数之和输出m的值sum函数2. 形参和实参形参和实参的特点的特点3. 用用return语句语句返回函数的值返回函数的值1. 形参和实参形参和实参的概念的概念5.4.1 函数的参数和值函数的参数和值5.4 函数间的参数传递函数间的参数传递例例5.4的程序代码如下:的程序代码如下:#includeint sum(int m) /*求和函数求和函数sum的定义的定义*/int i;for(i=m-1;i=1;i-) m=m+i;printf(sum=%dn,m);main()int m;printf
29、(please input number:n);scanf(%d,&m); /*输入自然数的输入自然数的个数个数m的值的值*/sum(m); /*调用求和函数调用求和函数sum*/printf(m=%dn,m); /*输出输出m的值的值*/程序的运行情况为:程序的运行情况为:please input number:200sum=20100m=2002. 形参和实参形参和实参的特点的特点3. 用用return语句语句返回函数的值返回函数的值1. 形参和实参形参和实参的概念的概念5.4.1 函数的参数和值函数的参数和值5.4 函数间的参数传递函数间的参数传递(1)实参可以是常量、变量、表达
30、式和函)实参可以是常量、变量、表达式和函数等,并且必须具有确定的值。数等,并且必须具有确定的值。 (2)形参只在函数内部有效。函数调用结)形参只在函数内部有效。函数调用结束后则不能再使用该形参变量。束后则不能再使用该形参变量。(3)函数调用中发生的数据传送是单向的。)函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。参的值反向地传送给实参。(4)实参和形参在数量上、类型上、顺序)实参和形参在数量上、类型上、顺序上应严格一致,否则会发生上应严格一致,否则会发生“类型不匹配类型不匹配”的错误。的错误。2. 形参和实
31、参形参和实参的特点的特点3. 用用return语句语句返回函数的值返回函数的值1. 形参和实参形参和实参的概念的概念5.4.1 函数的参数和值函数的参数和值5.4 函数间的参数传递函数间的参数传递(1)要想返回函数的值,只能通过)要想返回函数的值,只能通过return语句来实现。语句来实现。return 语句的一般形式为:语句的一般形式为:return 表达式表达式;或者为:或者为:return(表达式表达式);return语句的功能是计算表达式的值,并返语句的功能是计算表达式的值,并返回给主调函数。回给主调函数。(2)函数值为整型时,在函数定义时可以)函数值为整型时,在函数定义时可以省去类型
32、说明。省去类型说明。(3)函数值的类型和函数定义中说明的函)函数值的类型和函数定义中说明的函数的类型应保持一致。数的类型应保持一致。(4)不返回函数值的函数可以明确定义为)不返回函数值的函数可以明确定义为“空类型空类型”,空类型的说明符为,空类型的说明符为“void”。1. 两种形式两种形式 2. 例例5.5 数组用作函数参数有两种形式,一种是数组用作函数参数有两种形式,一种是把数组元素作为实参使用;另一种是把把数组元素作为实参使用;另一种是把数组名作为函数的形参和实参使用。数组名作为函数的形参和实参使用。当数组名作为实参向被调用函数传递时,当数组名作为实参向被调用函数传递时,只传递数组的地址
33、,而不是将整个数组只传递数组的地址,而不是将整个数组元素都复制到函数中去,即用数组名作元素都复制到函数中去,即用数组名作为实参调用被调用函数,调用时指向该为实参调用被调用函数,调用时指向该数组第一个元素数组第一个元素的指针被传递给了被调的指针被传递给了被调用函数。用函数。5.4.2 用数组作为函数参数进行传递用数组作为函数参数进行传递5.4 函数间的参数传递函数间的参数传递1. 两种形式两种形式 2. 例例5.5 例例5.5 把数组名作为函数参数应用举把数组名作为函数参数应用举例。例。#includeint xs(int *n); void main() int m10, i; for(i=0
34、; i10; i+)mi=i; xs(m); /*按指针方式传递数组按指针方式传递数组*/ int xs(int *n)int j; for(j=0; j10; j+) printf(%3d, *(n+);printf(n);5.4.2 用数组作为函数参数进行传递用数组作为函数参数进行传递5.4 函数间的参数传递函数间的参数传递该程序的运行结果如下:该程序的运行结果如下:0 1 2 3 4 5 6 7 8 91. 实例一实例一 2. 实例二实例二 定义一个函数定义一个函数index(),其中包含两个形参:一个是字,其中包含两个形参:一个是字符型,另一个是字符串,该函数的返回值为整数。函符型,另
35、一个是字符串,该函数的返回值为整数。函数的功能是计算字符型数据在字符串中出现的次数,数的功能是计算字符型数据在字符串中出现的次数,并将出现的次数作为该函数的返回值。要求编写该函并将出现的次数作为该函数的返回值。要求编写该函数,同时编写主函数调用该函数。数,同时编写主函数调用该函数。下图所示为对应的下图所示为对应的N-S流程图。流程图。 5.4.3 参数传递举例参数传递举例5.4 函数间的参数传递函数间的参数传递count=0, i=0当stri 不等于0stri等于c?真假count=count+1i=i+1返回count的值index函数输入一个字符串存入str1输入一个待查找的字符输出待查
36、找字符在指定串中出现的次数1. 实例一实例一 2. 实例二实例二 程序代码如下:程序代码如下:#includeint index(char c,char str); /*函数说明函数说明*/void main()char str110,c;puts(nPlease enter a string:);gets(str1); /*输入一个字符串输入一个字符串*/puts(nPlease enter a char you want to look for:);c=getchar(); /*输入一个字符输入一个字符*/printf(nThere are %d characters %c in stri
37、ng %s, index(c,str1),c,str1); /*调用函数并输出结果调用函数并输出结果*/ 5.4.3 参数传递举例参数传递举例5.4 函数间的参数传递函数间的参数传递1. 实例一实例一 2. 实例二实例二 int index(char c,char str) /*函数定义函数定义*/int i,count;count=0; /*计数器清零计数器清零*/i=0;while(stri!=0) /*字符串未结束字符串未结束*/ if(stri=c) count+; /*当前字符为当前字符为C,计数器加,计数器加1*/ i+;return count; /*返回计数器的值返回计数器的值
38、*/ 5.4.3 参数传递举例参数传递举例5.4 函数间的参数传递函数间的参数传递该程序的运行结果如下:该程序的运行结果如下:Please enter a string:helloworld Please enter a char you want to look for:l There are 3 characters l in string helloworld1. 实例一实例一 2. 实例二实例二 编写一个函数输出如下图案。用参数编写一个函数输出如下图案。用参数n控制输出的行数,参数值的取值范围是控制输出的行数,参数值的取值范围是19,超过这个范围,函数不做任何输,超过这个范围,函数不做
39、任何输出,返回整数出,返回整数0;否则,输出如下所示;否则,输出如下所示的图案后返回整数的图案后返回整数1。编写该函数,并编写主函数调用该函编写该函数,并编写主函数调用该函数。数。 1 222 33333 4444444 555555555 5.4.3 参数传递举例参数传递举例5.4 函数间的参数传递函数间的参数传递1. 实例一实例一 2. 实例二实例二 下图所示为对应的下图所示为对应的N-S流程图。流程图。 5.4.3 参数传递举例参数传递举例5.4 函数间的参数传递函数间的参数传递输入一个整型变量n定义整型变量i和jn=1&n=9真假for i=1 to n输出数字前的空格for
40、j=n-i to 1输出数字for j=1 to 2*i-1输出换行符!i是否为真?真假返回1返回0print函数i=print(i)输出Error data!输出print的值1. 实例一实例一 2. 实例二实例二 程序代码如下:程序代码如下:#include main() int i,n;printf(nPlease enter 1 integer:);scanf(%d,&n);i=print(n);if(!i)printf(Error data!n); printf(The value of print is %d!,i);int print(int n) int i,j;if(
41、n=1&n=9) 5.4.3 参数传递举例参数传递举例5.4 函数间的参数传递函数间的参数传递1. 实例一实例一 2. 实例二实例二 for(i=1;i=1;j-) /*输出数字前的空格输出数字前的空格*/ printf( ); for(j=1;j1)1. 简介简介 2. 例例5.6 下面是求下面是求n阶层的程序:阶层的程序:#includefloat fac(int n)float f;if(n0) printf(n%cn,x,z); else move(m-1,x,z,y); printf(%c-%cn,x,z); move(m-1,y,x,z); main() int h; pr
42、intf(nPlease input number:n); scanf(%d,&h); printf(the step to moving %2d diskes:n,h); move(h,a,b,c); 5.5.2 函数的递归函数的递归5.5 函数的嵌套与递归函数的嵌套与递归3. 例例5.7 当当m=3 时程序运行的结果为:时程序运行的结果为:input number:3 the step to moving 3 disks:a-ca-bc-ba-cb-ab-ca-c12【函数名】【函数名】 abs【用法】【用法】int abs(int i);【 例例5.8】#include #inc
43、lude int main() int number = -2541; printf(number is: %d absolute value is: %dn, number, abs(number); return 0; 34 5.6.1 常用的数学函数常用的数学函数5.6 系统函数系统函数56789求整数的绝对值求整数的绝对值【运行结果运行结果】number is: -2541 absolute value is: 254112【函数名】【函数名】 cos 【用法】【用法】 double cos(double x); 【 例例5.9】 #include #include int main(
44、) double ret; double x = 0.6; ret = cos(x); printf(The cosine of %lf is %lfn, x, ret); return 0; 34 5.6.1 常用的数学函数常用的数学函数5.6 系统函数系统函数56789求余弦函数求余弦函数【运行结果运行结果】The cosine of 0.600000 is 0.82533612【函数名】【函数名】 exp 【用法】【用法】double exp(double x); 【例【例5.10】 #include #include int main() double ret; double x =
45、8.0; ret = exp(x); printf(e raised to the power of %lf (e %lf) = %lfn,x, x, ret);return 0; 34 5.6.1 常用的数学函数常用的数学函数5.6 系统函数系统函数56789求指数函数求指数函数(e的的x次方次方)【运行结果运行结果】e raised to the power of 8.000000 (e 8.000000) = 2980.95798712【函数名】【函数名】 labs 【用法】【用法】long labs(long n); 【例【例5.11】 #include #include int ma
46、in() long int ret; long int x = -12345678L; ret=labs(x); printf(“number: %ld abs value: %ldn”, x, ret); return 0; 34 5.6.1 常用的数学函数常用的数学函数5.6 系统函数系统函数56789取长整型绝对值取长整型绝对值【运行结果运行结果】number: -12345678 abs value: 1234567812【函数名】【函数名】 log 【用法】【用法】 double log(double x); 【例【例5.12】 #include #include int main(
47、) double ret; double x = 5.8928; ret = log(x); printf(The natural log of %lf is %lfn, x, ret); return 0; 34 5.6.1 常用的数学函数常用的数学函数5.6 系统函数系统函数56789求对数函数求对数函数【运行结果运行结果】The natural log of 5.892800 is 1.77373112【函数名】【函数名】 pow 【用法】【用法】 double pow(double x, double y); 【例【例5.13】 #include #include int main()
48、 double x = 3.0, y = 4.0; printf(%lf raised to %lf is %lfn, x, y, pow(x, y); return 0; 34 5.6.1 常用的数学函数常用的数学函数5.6 系统函数系统函数56789指数函数指数函数(x的的y次方次方)【运行结果运行结果】3.000000 raised to 4.000000 is 81.00000012【函数名】【函数名】 sin 【用【用 法】法】double sin(double x); 【例【例5.14】#include #include int main() double ret, x = 0.5
49、; ret = sin(x); printf(The sin() of %lf is %lfn, x, ret); return 0; 34 5.6.1 常用的数学函数常用的数学函数5.6 系统函数系统函数56789求正弦函数求正弦函数【运行结果运行结果】The sin() of 0.500000 is 0.47942612【函数名】【函数名】 sqrt 【用法】【用法】double sqrt(double x); 【例【例5.15】 #include #include int main() double x = 9.0, ret; ret = sqrt(x); printf(The squa
50、re root of %lf is %lfn, x, ret); return 0; 34 5.6.1 常用的数学函数常用的数学函数5.6 系统函数系统函数56789计算平方根函数计算平方根函数【运行结果运行结果】The square root of 9.000000 is 3.00000012【函数名】【函数名】 tan 【用法】【用法】double tan(double x); 【例【例5.16】 #include #include int main() double ret, x; x = 0.5; ret = tan(x); printf(The tan of %lf is %lfn,
51、 x, ret); return 0; 34 5.6.1 常用的数学函数常用的数学函数5.6 系统函数系统函数56789求正切函数求正切函数【运行结果运行结果】The tan of 0.500000 is 0.5463021【函数名】【函数名】 itoa 【用法】【用法】char *itoa(int value, char *string, int radix); 【例【例5.17】 #include #include int main() int number = 23516; char string30; itoa(number, string, 10); printf(integer =
52、 %d string = %sn, number, string); return 0; 2 5.6.2 字符函数字符函数5.6 系统函数系统函数3整数转换为字符串函数整数转换为字符串函数【运行结果运行结果】integer = 23516 string =235161【函数名】【函数名】 tolower 【用法】【用法】int tolower(int c); 【例【例5.18】 #include #include #include int main(void) int length, i; char *string = THIS IS A STRING; length = strlen(str
53、ing); for(i=0; ilength; i+) stringi = tolower(stringi); printf(%sn,string); return 0; 2 5.6.2 字符函数字符函数5.6 系统函数系统函数3字符转换成小写字母函数字符转换成小写字母函数【运行结果运行结果】this is a string1【函数名】【函数名】 toupper 【用法】【用法】int toupper(int c); 【例【例5.19】 #include #include #include int main(void) int length, i; char *string=this is a
54、 string; length = strlen(string); for(i=0;ilength;i+) stringi=toupper(stringi); printf(%sn,string); return 0; 2 5.6.2 字符函数字符函数5.6 系统函数系统函数3字符转换成大写字母函数字符转换成大写字母函数【运行结果运行结果】THIS IS A STRING1【函数名】【函数名】 gettime 【用法】【用法】void gettime(struct time *timep); 【例【例5.20】#include #include int main() struct time t
55、; gettime(&t); printf(The current time is: %2d:%2d:%2d.%2dn, t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund); return 0; 2 5.6.3 其他函数其他函数5.6 系统函数系统函数取得当前系统时间函数取得当前系统时间函数【运行结果运行结果】(运行程序时的系统时间)(运行程序时的系统时间)The current time is:14:10:38.911【函数名】【函数名】 rand 【用法】【用法】void rand(void); 【例【例5.21】 #include #include
56、 int main() int i; printf(Ten random numbers from 0 to 99nn); for(i=0; i10; i+) printf(%dn, rand()%100); return 0; 说明:由于说明:由于rand()函数返回值为随机数,所以上述程函数返回值为随机数,所以上述程序每次执行的结果不相同。序每次执行的结果不相同。2 5.6.3 其他函数其他函数5.6 系统函数系统函数 随机数发生器函数随机数发生器函数【运行结果运行结果】Ten random numbers from 0 to 9946308290561795154826变量的完整定义格式
57、为:变量的完整定义格式为: 存储类型标识符存储类型标识符 类型标识符类型标识符 变量名表;变量名表;在函数(包括主函数)内部或复合语句的说明部分所在函数(包括主函数)内部或复合语句的说明部分所定义的变量称为局部变量。局部变量的作用域仅在它定义的变量称为局部变量。局部变量的作用域仅在它所定义的函数体或复合语句之内。所定义的函数体或复合语句之内。5.7.1 变量的作用域变量的作用域5.7 变量的存储类别、作用域、生存期变量的存储类别、作用域、生存期auto及及register型变量的初始化是在程序执行期间型变量的初始化是在程序执行期间完成的,它们所在的函数或程序段每次被调用时,完成的,它们所在的函
58、数或程序段每次被调用时,初始化都要进行一次。初始化都要进行一次。【例例5.22】auto型变量的初始化举例。型变量的初始化举例。#include found() auto int x=3; /*关键字关键字auto可以省略,可以省略,auto int a=2; 与与 int a=2; 二者等价。二者等价。*/x+;return x;main() int i;for(i=0;i3;i+)printf(%d ,found(); auto及及register型变量的初始化型变量的初始化5.7.2 变量的存储类别和生存期变量的存储类别和生存期5.7 变量的存储类别、作用域、生存期变量的存储类别、作用域
59、、生存期【运行结果运行结果】4 4 4auto或或register型变量的值只在它们所在的函数型变量的值只在它们所在的函数或程序段执行期间才被保留,一旦它们所在的或程序段执行期间才被保留,一旦它们所在的函数或程序段执行结束,其值就不再有效。函数或程序段执行结束,其值就不再有效。【例【例5.23】auto型变量生存期举例。型变量生存期举例。#include found() auto int x=3;x+;return x;main() int x=6,i;for(i=0;i3;i+) printf(%dn,found(); auto及及register型变量的生命期型变量的生命期5.7.2 变量
60、的存储类别和生存期变量的存储类别和生存期5.7 变量的存储类别、作用域、生存期变量的存储类别、作用域、生存期上述程序在编译时将报错,上述程序在编译时将报错,因为在因为在found()中的中的x被定被定义在内层花括号中,在离义在内层花括号中,在离开内层花括号后,开内层花括号后,x就变就变成未定义,因而不能引用。成未定义,因而不能引用。static型变量的初始化是在编译期间完成的,只进型变量的初始化是在编译期间完成的,只进行一次;它的生存期和程序的生存期相同。因此,行一次;它的生存期和程序的生存期相同。因此,当它所在的函数多次被调用时,将不再进行初始当它所在的函数多次被调用时,将不再进行初始化,每次调用结束后,其值也将被保留。化,每次调用结束后,其值也将被保留。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年现代车库整体改造及绿色能源系统安装合同
- 二零二五年度时尚门面租赁与品牌孵化支持合同
- 二零二五年租赁房屋维修责任合同下载
- 2025版矿山居间代理合同范本详解
- 二零二五年度云计算解决方案第三方技术实施合同
- 二零二五年度数字经济平台合作购销合同
- 二零二五年度350兆数字集群对讲机销售代理合同
- 二零二五年度ktv员工绩效考核与激励合同范本
- 二零二五年度商业综合体工程承包施工合同范本
- 沛县初二月考数学试卷
- 玉米种植技术课件
- 老年护理知识和技能培训
- 海尔售后培训课件
- 儿童职业体验医生课件
- 2025至2030年中国海上应急救援行业市场运行态势及投资前景研判报告
- 员工健康教育与健康促进继续教育或专题培训制度
- 医美注射美容治疗知情同意书
- CJ/T 385-2011城镇燃气用防雷接头
- 人工智能提示词工程师试题含答案
- 旅行社自愿离团免责协议书10篇
- 成人术中非计划低体温预防与护理-中华护理学会团体标准
评论
0/150
提交评论