版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、关于函数及其应用1第一张,PPT共七十二页,创作于2022年6月 10.1 函数的基本概念 一个较大的程序一般由若干个程序模块(子程序 )组成, 每一个模块(子程序)来完成一定的功能。在C语言中, 子程序的作用是由函数来实现的。 一个C程序可由一个主函数和若干个函数构成,由主函数调用其它函数,其它函数也可互相调用。同一个函数可以被一个或多个函数调用任意多次。 下图是一个程序中函数调用的示意图:第二张,PPT共七十二页,创作于2022年6月main( )A( )B( )C( )D( )E( )F( )G( )E( )H( )H( )H( )G( )函数调用示意图:调用第三张,PPT共七十二页,创
2、作于2022年6月 (1). 一个源程序文件由一个或多个函数组成.一个源程序 文件是一个编译单位,而不是以函数为单位进行编译.说明: (2). 一个C程序可由一个或多个源程序文件组成. 这样可以分别进行编写,编译,调试. 一个源文件可以为 多个C程序公用. (3). 所有函数是平行的, 一个函数并不从属于另一个函 数 , 函数可以相互调用,但不能调用main( )函数.第四张,PPT共七十二页,创作于2022年6月(4). 从使用角度来分, 函数可分为: 数学函数 (#include math.h) 字符函数 (#include ctype.h) 库函数 字符串函数 (#include str
3、ing.h) 输入输出函数 (#include stdio.h) 动态存储分配函数 (#include stdlib.h) . 自定义函数:第五张,PPT共七十二页,创作于2022年6月 从函数的形式来分; 无参函数:主调函数没有数据传给被调函数 有参函数:主调函数可以将数据传给被调函数 空函数: 什么也不干,先占位置,以后扩展功能第六张,PPT共七十二页,创作于2022年6月一. 函数定义的一般形式:(自定义函数) (1). 无参函数的定义形式: 类型标识符 函数名( ) 函数体 函数定义一律不能加分号 (;) !说明: 类型标识符是指函数返回值的类型. 如果函数不要返回值,可写上void.
4、第七张,PPT共七十二页,创作于2022年6月(2). 有参函数定义: 类型标识符 函数名(形式参数表列) 声明部分 语句 形式参数例: int add ( int x, int y ) int z; z=x+y; return z; 注: 返回值z 的类型(int)应与类型标识符统一。第八张,PPT共七十二页,创作于2022年6月1、函数参数与函数值;(1)形参与实参:例:main( ) int a,b,c; scanf(“%d, %d”, &a, &b); c=max(a, b); printf(“max is %d”, c); int max(int x, int y) /*定义有参函数
5、max*/ int z; z=xy ? x : y; return(z); x,y为形参a,b为实参10.2 函数的参数第九张,PPT共七十二页,创作于2022年6月b. 实参可以是常量、变量、或表达式,但要求有确定值. 如: max(3, a+b) ; c. 实参与形参的类型应一致,一 一对应。说明:a. 形参变量(上例中的x,y), 在未调用时,并不占 用存储单元,当进行函数调用时,形参才分配内存 单元,调用结束后,形参就释放掉。第十张,PPT共七十二页,创作于2022年6月d. 实参对形参的数据传递是单向传值,只能是由实参传 给形参,而不能相反进行。 实参、形参在内存中,占据不同单元。
6、2 a b 3 2 x 3 y 即使形参单元中的值发生变化,也不会影响实参单元的值. 函数调用后,形参单元释放掉,实参单元仍保留。第十一张,PPT共七十二页,创作于2022年6月例10.9 阅读一下程序,写出程序运行结果#include int swap(int x, int y)int temp;temp=x;x=y;y=temp;return 0;int main()int a, b;scanf(%d%d, &a, &b);swap(a,b);printf(%d,%dn,a, b);return 0;Ch10_10_9.c 即使形参单元中的值发生变化,也不会影响实参单元的值. 两变量进行交
7、换.第十二张,PPT共七十二页,创作于2022年6月2. 函数的返回值与return语句: 执行C语言程序就是调用一个个函数,函数被调用 时,可以返回某一个值作为该函数的值(供主函数使用)。需要返回值时,在函数中返回的地方使用return语句: return(表达式); 这里表达式的值就是函数的返回值。第十三张,PPT共七十二页,创作于2022年6月说明: a. return 语句后面的括号可省去: 如: return(z); return z ; return 后面可以是一个表达式. 第十四张,PPT共七十二页,创作于2022年6月 b. 当函数不需要带回返回值,C语言有二种方法处理 : .
8、使用不带表达式的return语句,如: return; .连return也不用,这是因为函数末尾,隐含一个return 语句 ,当遇到后面的大括号“” , 就把控制权交给主调 函数。第十五张,PPT共七十二页,创作于2022年6月 为了明确表示不带回值,可用“void“定义。 如: void printstar( ); 这样可以保证函数不带回任何值.c. 若函数不指定带值返回,并不是不返回什么值,可能 返回一个不定值。 因为不考虑使用,即使返回是不定值,也无多大关系。 第十六张,PPT共七十二页,创作于2022年6月#includeint add(int x, int y)int z;z=x+
9、y;return z;int main()int a, b, c;scanf(%d %d, &a, &b);c=add(a,b);printf(c=%dn, c);return 0; 例:10.1 函数值传递的例子.(P149) 函数在被调用前必须先定义或说明!Ch10_10_1.c第十七张,PPT共七十二页,创作于2022年6月例:10.2 函数地址传递的例子.(P150) 输入一个由数字组成的字符串,转换成一个整数.#includeint ctoi(char *p) int sum=0; while(*p) sum=sum*10; sum=sum+(*p-0); p+; return su
10、m;int main( ) char str5; int x; printf(“string is :n); scanf(%s,str); x=ctoi(str); printf(“integer is %dn,x); return 0;数组名作为函数的参数 Ch10_10_2.c*p-0 把一个字符数字转成数字.第十八张,PPT共七十二页,创作于2022年6月3、函数的调用:(1). 函数调用的方式: 有以下三种函数调用方式: a. 函数语句: 函数作为一条语句, 不要求函数带回值,完成一定的 功能、操作。如: printstar( ); b. 函数表达式: 函数调用出现在一个表达式中。 如
11、: c=z*max(a,b); 这时要求函数带回一个确定的值, 以参加运算。第十九张,PPT共七十二页,创作于2022年6月 c. 函数参数: 如:printf(“%d” , max(a,b) ); max(a,b) 作为 printf函数的一个参数。 第二十张,PPT共七十二页,创作于2022年6月10.3 系统函数的应用 C语言提供了十分丰富的库函数.这些函数可分为: 1. 数学函数,如: sin(), sqrt() 函数等.它们的包含文件是: “math.h”. 2. 字符串函数,如: gets(),strcmp()函数等.它们的包含文件是: “string.h”. 3. 输入输出函数,
12、它们的包含文件是: “stdio.h”. 第二十一张,PPT共七十二页,创作于2022年6月10.3.1 数学函数 常用的数学函数有: (1). sqrt(): double sqrt(double x); 计算 ; x应=0 (2). fabs(): double fabs(double x); 计算 x 的绝对值 x (3). pow(): double pow(double x,double y); 计算xy 的值 (4). exp(): double exp(double x); 计算 ex 的值第二十二张,PPT共七十二页,创作于2022年6月例10.3 求z=xy+c 的值,在C语
13、言中xy可调用系统函数 pow()函数来求得。#include #include /必须加入数学库头文件int main()double x, y, z, c;printf(Please input x y cn);scanf(%lf%lf%lf, &x, &y, &c);z=pow(x,y)+c;printf(z=%lfn, z);return 0;C+另一注解方法第二十三张,PPT共七十二页,创作于2022年6月例10.4 利用循环的方法产生1100间的10个随机数,并在屏幕上显示.关于 rand() 随机函数: rand()会返回一随机数值,范围在0至RAND_MAX 间. 第二十四张,
14、PPT共七十二页,创作于2022年6月#include #includevoid main( ) printf( RAND_MAX =%ld n,RAND_MAX);说明: RAND_MAX是一宏定义值. 是系统最大的被rand()返回的值. 其值可用下列程序输出:视系统不同而不同(32767).第二十五张,PPT共七十二页,创作于2022年6月2. srand(seed)函数: srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用time(0)的返回值来当做seed. 如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。 3.
15、time() 函数返回从1970年开始经历时间的秒数。第二十六张,PPT共七十二页,创作于2022年6月例10.4 利用系统函数rand(),此函数产生1100间的10个随机数,此函数在头件 stdlib.h进行了声明.#include#include #include int main()int i,j;srand(time(0);for(i=0; i S2 函数返回值为0 S1 S2 函数返回值0第三十一张,PPT共七十二页,创作于2022年6月例10.5 从键盘输入两个字符串,把两个字符串连接后输出到屏幕#include #include int main()char s180, s28
16、0;gets(s1);gets(s2);strcat(s1,s2);puts(s1);return 0;gets()以回车结束输入.ch10_5.c第三十二张,PPT共七十二页,创作于2022年6月例10.6从键盘输入一个字符串,求这一字符串长度#include #include int main()int x;char str80;gets(str);x=strlen(str);printf(该字符串长度:%dn, x);return 0;ch10_6.c第三十三张,PPT共七十二页,创作于2022年6月10.3.3 字符操作函数与转换函数1. isalnum(): 函数原型: int is
17、alnum(int ch); 检查ch是否为字母或数字. 是字母或数字返回1, 否则返回0.2. isalpha(): 函数原型: int isalpha(int ch); 检查ch是否为字母. 是字母返回1, 否则返回0.第三十四张,PPT共七十二页,创作于2022年6月3. islower(): 函数原型:int islower(int ch); 检查ch是否为小写字母(az) . 是返回1, 否则返回0.4. isxdigit(): 函数原型:int isxdigit(int ch); 检查ch是否为一个十六进制字符(09或af或AF). 是返回1, 否则返回0.第三十五张,PPT共七十
18、二页,创作于2022年6月 5. atoi() 函数原型:int atoi(char *str) 函数功能:将(一含有数字内容的)字符串转换成一个整数数值. 头文件: #include #include int main() int n; char str =12345.78; n=atoi(str); printf(string=%s integer=%dn,str,n); return 0; 第三十六张,PPT共七十二页,创作于2022年6月例10.7 从键盘输入一些字符,输出其中的大写字符与十六进制字符,当输入字符结束字符#include #include int main()char
19、ch;while( ( ch=getchar() ) != )if(isupper(ch) | isxdigit(ch) ) printf(%3c, ch);printf(n);return 0;ch10_7.c第三十七张,PPT共七十二页,创作于2022年6月10.4 自定义函数 C语言允许用户自定义函数. 例如: 下面是一个自定义函数,功能是求两个整数之和. int add(int x,int y) int z; z=x+y; return z; 第三十八张,PPT共七十二页,创作于2022年6月 关于对被调用函数的声明和函数原型: 在一个函数中调用另一个函数(即被调函数)需要具备哪些条件
20、? a. 函数要存在(库函数或自定义函数). 此外还要: b. 如果是库函数,一般应在文件开头用#include命令把 相关函数的一些信息包括进去. 第三十九张,PPT共七十二页,创作于2022年6月 如果用户自己定义了一个函数,同时主调函数与被 调函数在同一源文件中: 一般情况下,主调函数中要对被调用函数的作一声明. 函数声明 即向编译系统声明将要调用此函数, 并将有关信息通知编译系统.第四十张,PPT共七十二页,创作于2022年6月例: main( ) float a, b, c; scanf(“”%f,%f”,&a,&b); c=add(a,b); printf(“sum is %f”,
21、c); float add(float x,float y) float z; z=x+y; return(z); 对被调函数的声明float add(float x,float y ); 函数声明是一语句,要加分号 ;自定义add函数. C语言在进行编译时是从上到下逐行进行的,如果没有对函数进行声明,如上例,当编译到 “c=add(a,b);” 时, 并不知道add是不是函数名,也无法判断实参(a和b)的类型与个数正确与否?第四十一张,PPT共七十二页,创作于2022年6月 (1). “定义”与“声明”不是一回事. “定义”: 是指对函数功能的确定,包括指定函数名,函数值类型, 形参及其类型
22、,函数体等. 它是一个完整的, 独立的函数 单位. 说明: 而“声明”的作用: 则是把函数的名字,函数的类型,以及形参的类型,个 数和顺序通知编译系统,以便在调用该函数时系统按此 检查.第四十二张,PPT共七十二页,创作于2022年6月(2). 其实,在函数声明中也可以不写形参名,而只写形参的 类型. 如: float add (float, float); (3). 在C语言中,以上的函数声明称为函数原型. 使用函数原型的主要作用是: 利用它在程序的编译阶 段, 对被调函数的合法性进行全面检查. 第四十三张,PPT共七十二页,创作于2022年6月 函数原型的一般形式:(a). 函数类型 函数
23、名( 参数类型1, 参数类型2, .)(b). 函数类型 函数名( 参数类型1 参数名1, 参数类型2 参数名2, .)函数原型 第一种是基本的形式,为了便于阅读,也允许加上参数名.但编译系统并不检查参数名,因此参数名是什么都无所谓.第四十四张,PPT共七十二页,创作于2022年6月(4). 对被调函数声明,在下列三种情况下可省略:说明:(a).如果函数的返回值是整型,或字符型可以省去(以 前我们遇到的大多是这种情况)。 系统自动按整型处理,建议加以说明为好。(b). 被调用函数的定义位置出现在主调函数之前,可省 去声明,这时编译系统已知道了已定义的函数类型, 会自动处理. 如下例:第四十五张
24、,PPT共七十二页,创作于2022年6月 float add(float x,float y) /*定义add函数*/ float z; z=x+y; return(z); main( ) float add(float x,float y ); float a, b, c; scanf(“”%f,%f”,&a,&b); c=add(a,b); printf(“sum is %f”,c) 此处不必对add()作声明(c). 此外,在文件开头(所有函数定义之前),对函数进 行了函数的统一声明,可省去在主调函数中的声明。第四十六张,PPT共七十二页,创作于2022年6月如: char letter
25、(char,char ); /* 这三行处于所有函数之前, float f1(float,float ); 且在函数外部.*/ int i2( float,float); main( ) /* main内不必说明所调用函数类型 */ char letter(char c1,char c2) /*定义letter()函数*/ . float f1(float x, float y ) /*定义f1( )函数*/ . int i2(float j, float k) /*定义i2( )函数*/ . 第四十七张,PPT共七十二页,创作于2022年6月#include int fun(int n)in
26、t s=1, i;if(n=0) s=1;else for(i=1;i=n; i+) s = s*i;return s;int main()int a, b;scanf(%d, &a);b=fun(a);printf(%d的阶乘为%dn, a,b);return 0;例10.8 从键盘输入一个整数(0-16),求此数的阶乘。Ch10_10_8.c第四十八张,PPT共七十二页,创作于2022年6月例10.10 输入二个整数,进行函数调用,问能否实现实参a,b的交换。#includeint swap(int *p3,int *p4) int m; m=*p3; *p3=*p4; *p4=m; re
27、turn 0; int main( ) int a,b; int *p1,*p2; printf(Please input a,b :); scanf(%d,%d,&a,&b); p1=&a; p2=&b; swap(p1,p2); printf(a=%d,b=%dn,a,b); return 0; 8P1 a运行: 8,3(回车)输出: 3,8 3P2 8P33P4Ch10_10_10.c指针为参数第四十九张,PPT共七十二页,创作于2022年6月10.5 函数的应用例10.11 在main函数中定义了一个整型数组并初始化,通过调用自定义函数sum把数组中-1前的所有元素值相加.#inclu
28、de int sum(int b ) int s=0, i=0; while( bi!=-1 ) s += bi+; return s;int main() static int a=1,2,3,4,5,6,7,8,9,-1,6; printf(Total=%dn, sum(a) ); return 0;Ch10_10_11.c数组名作为函数的参数进行调用.第五十张,PPT共七十二页,创作于2022年6月例10.14 输入一行英文字符,统计其中有多少单词,单词之间以空格为分隔#include int main()char string81;int num;gets(string);num=nu
29、mword(string);printf(There are %d wordsn, num);return 0;第五十一张,PPT共七十二页,创作于2022年6月int numword(char *str)int i, num=0, word=0;char ch;for(i=0; (ch=stri )!= 0; i+)if(ch=) word=0;else if(word=0) word=1; num+; return num; num 统计单词个数, word用来判断是否单词的标志.(1). 当前字符为空格: 未出现新单词 ,word=0, num 不累加。(2). 当前字符为非空格(分两种
30、情况):a. 前一字符为空格(word=0),新词出 现, word=1, num 加1 .b. 前一字符为非空格(word=1),未出 现新单词, num 不加1 .Youarestudents.第五十二张,PPT共七十二页,创作于2022年6月 (1). 函数的嵌套调用: C语言中的函数是平行的,不允许嵌套定义。 所有函数的作用域都处于同一嵌套深度,即不允许在函数体中又定义另一个函数. 但允许嵌套调用函数,即在调用一个函数的过程中,又调用另一个函数。10.6 函数的嵌套与递归调用第五十三张,PPT共七十二页,创作于2022年6月 main( ) a( )函数 b( )函数 调用函数a( )
31、 调用函数b( ) . 结束 return return 如:第五十四张,PPT共七十二页,创作于2022年6月例 求三角形面积 area2=s(s-a)(s-b)(s-c)s=(a+b+c)/2smainarea# include # include void main() float a, b, c; float area(float a, float b, float c); float s(float a, float b, float c); scanf(%f%f%f, &a, &b, &c); printf(%fn, area(a, b, c);float area(float a
32、, float b, float c) float ss; ss=s(a,b,c); return sqrt(ss*(ss-a)*(ss-b)*(ss-c); float s(float a, float b, float c) return (a+b+c)/2;对被调函数的声明第五十五张,PPT共七十二页,创作于2022年6月开始调用(2).函数的递归调用(recursive) 调用一个函数的过程中, 出现了直接或间接地调用 该函数本身 , 称之为函数的递归调用。 C语言的特点之一是允许函数的递归调用。 递归调用可以简明 , 高效的解决问题(问题的一方面)。a. 直接递归调用; int f
33、(int x) int y , z; . z=f(y); return(z*z); 第五十六张,PPT共七十二页,创作于2022年6月b. 间接递归调用: int f1(int x) int y,z; z=f2(y); return(z*z); int f2(int a ) int c; c=f1(a); return(3+c); 两种调用都是无休至的自我调用。可以用if语句来控制这种情况. 第五十七张,PPT共七十二页,创作于2022年6月 通常用求一个数的阶乘为例来说明递归函数。 1 (n=0,1) n!= n*(n-1)! (n1)例:10.18第五十八张,PPT共七十二页,创作于202
34、2年6月 float fac(int n) float f; if (n0) printf (“n0, data error!”); exit(0); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f) ; int main( ) int n ;float y; printf(“input a integer number:”); scanf(“%d”,&n); y=fac(n); printf(“%d!=%f”, n, y); n n-1 下面设 n=3,进行调用:ch10_10_18.c第五十九张,PPT共七十二页,创作于2022年6月fa
35、c(int n) else if (n=1|n=0) f =1; else f=fac(n-1)*3; return(f); main() . ( n= =3 ) y=fac(n); . fac(int n) . ( n= =2)else if (n=1|n=0) f = 1; else f=fac(n-1)*2; return(f); fac(int n) . ( n= =1)else if (n=1|n=0) f = 1; else f=fac(n-1)*n; return(f); 11*2第六十张,PPT共七十二页,创作于2022年6月 调用fac函数计算3的阶乘时的情况: f=fac(
36、2)*3 1. 这时函数将调用自己,因此仍然要理解为调用一个单 独的函数。 2. 每一次当C语言中的任意函数被调用(不管是否递归), 函数都将获得自己的一套局部变量和形式参数。 3. 函数递归时,必须有个if语句,迫使函数返回,进而结 束递归.第六十一张,PPT共七十二页,创作于2022年6月 1.数组名作函数参数: 如:main( ) int array10; f1(array,10); f1(int arr,int n) .array0,arr0array, arr函数的应用第六十二张,PPT共七十二页,创作于2022年6月 实际上,实参数组与形参数组共同占用一段内存空间. 在函数调用过程
37、中,如果形参数组arr的元素值发生变化,相应实参数组的元素也发生同样变化. .array0,arr0array, arr第六十三张,PPT共七十二页,创作于2022年6月2.用多维数组名作函数参数: 在被调用函数中对形参数组的定义时, 可以指定每一维的大小,也可以省略第一维的大小说明: 如 int array310; 或: int array 10;第六十四张,PPT共七十二页,创作于2022年6月例: 有一个3*4 的数组,求所有元素中的最大值.ch10_10_18_1.c#include int max_value(int array4) int i,j,max; max=array00; for(i=0;i3;i+) for(j=0;jmax) max=arrayij; return (max); int main() int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf(max_value is %dn,max_value(a); return 1; 第六十五张,PPT共七十二页,创作于2022年6月例21: 建立一个数组a,有10个元素,通过函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 甲流乙流培训课件
- 雪佛兰销售培训课件
- 培训课件包教学课件
- 《抗菌药物概论课件》课件
- 小学生比赛课件模板
- 三会一课工作参考计划1
- 小学生保险课件下载
- 《产品品牌与管理本》课件
- 广东省惠州市惠城区第十一小学-六年级英语家长会【课件】
- 2021年内蒙古自治区呼和浩特市大学英语6级大学英语六级真题(含答案)
- 食物损失和浪费控制程序
- 特种设备安全管理电梯模拟考核题库888题(含标准答案)
- 债权法学习通超星期末考试答案章节答案2024年
- 关于农机安装合同模板
- 2024解读《弘扬教育家精神》全文
- TCI 373-2024 中老年人免散瞳眼底疾病筛查规范
- TCCIAT 0046-2022 混凝土剪力墙结构装配式组合壳体系技术规程
- GB/Z 44118.1-2024电能质量技术管理第1部分:总则
- 2024年银行招聘笔试真题题库
- 小区物业续聘方案
- 石油钻采专用设备制造考核试卷
评论
0/150
提交评论