函数的分类和定义.ppt
《函数的分类和定义.ppt》由会员分享,可在线阅读,更多相关《函数的分类和定义.ppt(68页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、七、函数7.1 函数的分类和定义7.2 函数的说明和调用7.3 函数的嵌套调用7.4 函数的递归调用7.5 变量的作用域和存储类别7.6 预处理命令7.1 函数的分类和定义 函数是源程序的基本模块,它封装了完成某 一特定功能的程序代码和数据。语言不仅提供了极为丰富的库函数(如Turbo C提供了四百多个库函数),还允许用户建立 自己定义的函数。7.1.1 函数的分类 在语言中可从不同的角度对函数分类:从函数定义的角度:自定义函数自定义函数和系统库函数系统库函数 从主调函数和被调函数之间数据传送的角度:有参函数有参函数和无参函数无参函数 从有无返回值的角度:有返回值函数有返回值函数和无返回值函数
2、无返回值函数7.1.2 函数的定义函数定义的一般格式:函数值类型函数值类型 函数名(参数说明表)函数名(参数说明表)函数体函数体 其中:函数值类型函数值类型:函数返回值的类型。如:int float double char void 等,缺省按整型处理。无返回值的函数,函数值类型可选用void,如:void putpixel(int x,int y,int color)函数返回值是指针,应选用相应的指针类型标识 符,如:char *gets(char*string)函数名函数名:标识符,函数的名称。参数说明表参数说明表:由带数据类型说明的参数构成:类型名类型名 变量名,类型名变量名,类型名 变
3、量名,变量名,.这里的变量名称为形式参数形式参数,不给出具体数值。调用该函数时,给出具体数值,称为实际参数实际参数。函数体函数体:由说明语句和执行语句组成的程序模块。例1:编制一个将小写字母变为大写字母的函数。char low_to_upper(char c)if(c=a&c=z)return c-=32;return c;例2:编制一函数,功能为打印 n 个空格。void print_space(int n)int i;for(i=0;in;i+)printf();例3:编制求两整数最大公约数(greatest common divisor)的函数。int gcd(int a,int b)i
4、nt temp;while(b)temp=a%b;a=b;b=temp;return a;int gcd(int m,int n)int i,t;for(i=1;i=(m=n?m:n);i+)if(m%i=0&n%i=0)t=i;return t;7.2 函数的说明和调用7.2.1 函数的说明 调用函数必须遵循“先说明后调用先说明后调用”的原则。对库函数须把包含该函数原型(说明)的头文件 用include命令包含在源文件前部 Turbo C 中编有400 多个标准库函数。按功能分类 编组,分别在不同的头文件予以说明。头文件 功 能 math.h 常用数学函数 stdio.h 输入输出函数 ct
5、ype.h 字符函数 string.h 字符串函数 函数说明的一般形式:函数值类型函数值类型 函数名(参数说明表);函数名(参数说明表);如函数值是整型或字符型,可不必说明;如被调函数的定义在主调函数之前,可不必说明;如不说明函数参数,系统不检查参数传递正确性;参数说明表中可只说明形参类型,而无形参本身。7.2.2 函数调用及返回值1.函数的调用 一般形式:函数名(实参表)函数名(实参表)实参的类型、个数和顺序应与定义时的形参一致。调用方式:函数表达式:要求函数是有返回值的。函数语句:函数调用的一般形式加上分号即构成函数语句。函数实参:函数作为另一个函数调用的实参出现,要求函数 是有返回值的。
6、2.函数的返回值 终止执行函数有两种情况:遇到return语句或其他中止函数执行的语句。执行到函数最后一个右大括号。函数的返回值是通过函数中的return语句实现的:return 表达式;表达式;或 return(表达式);表达式);其中表达式表达式的值就是返回给主调函数的值。如果表达式表达式为空表达式,则无直接的返回值。如果函数值的类型和return语句中表达式表达式的值不 一致,则以函数类型为准。例1:编一个调用求两个整数最大公约数函数的程序。main()int i,j,k;int gcd(int,int);printf(n Input two integers:);scanf(%d%d,
7、&i,&j);k=gcd(i,j);printf(Greatest common divisor is%d,k);int gcd(int m,int n)int i,t;for(i=1;i=(m=a&*(s+i)=z)*(s+i)-=32;return s;例3:把字符串 t 接在字符串s之后,返回新字符串首 地址。char*strjion(char*s,char*t)char*p;p=s;/*保存s*/while(*s)s+;/*找字符串s末尾*/while(*s+=*t+);/*连接*/return p;/*返回指向连接后新字符串的指针*/【例 5.1】利用库函数中的产生随机数的函数,编
8、制100以内加法运算练习程序,连续答对 5 题程序 结束。说明:伪随机函数:int rand(),原型包含在 stdlib.h 中。每次调用 rand();产生一个随机整数。该数在 032767 之间。要产生0100的随机数,可写成表达式:rand()%100;要得到 a,b 区间的随机数,可写成表达式:a+rand()%(b-a)#include main()int a,b,c,i=0;while(i100)continue;printf(%d+%d=?,a,b);scanf(%d,&c);if(c=a+b)printf(The answer is right.);i+;else print
9、f(The answer is wrong!);i=0;printf(n Program is over.);7.2.3 函数参数的传递 函数调用时,主调函数把实参实参的值传送给被调函数的形参形参从而实现主调函数向被调函数的数据传送。1.形参和实参 定义函数中指定的形参形参变量变量,只在发生函数调用 时才被分配内存单元,在调用结束后,所占内存 单元即刻被释放,形参只有在函数内部有效。在函数调用时,先将实参实参的值赋给形参形参,然后执 行被调函数的函数体。实参实参与形参形参在数量上,类型上,顺序上应严格一 致。实参实参可以是常量、变量、表达式或函数等,要求有确定的值。实参实参对形参形参的数据传递
10、是“值传递值传递”,即单向传单向传递递。因此,函数执行中形参形参值的改变不会影响实参实参的 值。调用函数时的传值有一般的数值数值和地址值地址值两种,当形参形参是数组或指针变量,调用时给出的实参实参是 地址值(数组名或指针),被调函数用该地址 (数组名或指针)通过间接访问可以存取(改变)主调函数中所指向的变量的值。2.一般的数值传递例1:编制一个整数的n(n为正整数)次方幂函数。int power(int a,int n)/*求a的n次方幂函数*/int i,p=1;for(i=1;in;i+)p=p*a;return(p);main()int x,i;printf(Enter a intege
11、r:n);scanf(%d,&x);i=5;printf(The fifth power of%d is%d.n,x,power(x,i);例2:判断正整数是否为素数的函数。是则返回1;不是则返回0。#include math.hint isprime(int n)int i;if(n=1)return 0;if(n=2)return 1;for(i=2;i(int)sqrt(n);i+)if(n%i=0)return 0;return 1;main()int a;printf(Enter a integer:n);scanf(%d,&a);if(isprime(a)printf(%d is
12、prime,a);例3:请读程序:#include 输出结果为:。func(int a,int b)A)11 int c;B)20 c=a+b;C)21 return c;D)31main()int x=6,y=7,z=8,r;r=func(x-,y+,x+y),z-);printf(%dn,r);C3.地址值传递例4:调用交换两整型量的函数。void swap(int a,int b)int t;t=a;a=b;b=t;main()int x=5,y=10;swap(x,y);printf(x=%dty=%dn,x,y);运行结果:x=5 y=10 (实际未交换)实际未交换)改用指针作为函数
13、的参数。void swap(int*a,int*b)int t;t=*a;*a=*b;*b=t;main()int x=5,y=10;swap(&x,&y);printf(x=%dty=%dn,x,y);运行结果:x=10 y=5注:如果需要函数返回多值,可以通过指针参数或 全局变量来实现4.数组作为函数参数 实参用数组名,形参用数组例5:求字符串长度。int my_strlen(char s)int i;for(i=0;si!=0;i+);return i;main()char a50;gets(a);printf(strlen=%dn,my_strlen(a);例6:以下程序的运行结果是什
14、么?#include f(int a)int i=0;while(ai=10)printf(%d,ai);i+;main()int a=1,5,10,9,11,7;f(a+1);运行结果:5,10,9例7:请读程序:#include 结果是:_。f(int b,int n)A)720 int i,r=1;B)120 for(i=0;i=n;i+)C)24 r=r*bi;D)6 return r;main()int x,a=2,3,4,5,6,7,8,9;x=f(a,3);printf(%d,x);B例8:写出下列程序的运行结果func(int a3)int i,j,sum=0;for(i=0;
15、i3;i+)for(j=0;j3;j+)aij=i+j;if(i=j)sum=sum+aij;return(sum);main()int a33=1,3,5,7,9,11,13,15,17;int sum;sum=func(a);printf(nsum=%dn,sum);运行结果:sum=6 实参用数组名,形参用指针例9:求字符串长度。int my_strlen(char*s)int i;for(i=0;*(s+i)!=0;i+);return i;main()char a50;gets(a);printf(strlen=%dn,my_strlen(a);7.3 函数的嵌套调用 函数的嵌套调用
16、是指程序在调用函数过程中又调用其它函数的过程。例:把字符串首尾颠倒的函数。abcdefg gfedcbavoid reverse(char s)int i,j,t;for(i=0,j=strlen(s)-1;i j例1:把正整数 n 化为等价数码字符串的函数。如有正整数 234,要把它转换成字符串 234。编一个函数 void itos(int n,char s)n%10 4+0 4 s0 n/10 n,n=23 n%10 3+0 3 s1 n/10 n,n=2 n%10 2+0 2 s2 n/10 n,n=0 转换结束 调用字符串首尾颠倒的函数void itos(int n,char s)i
17、nt i=0;do si+=n%10+0;while(n/=10);si=0;reverse(s);main()int m;char a50;scanf(%d,&m);itos(m,a);printf(a=%sn,a);例2:给出年、月、日,问是星期几(星期日六 用06表示)。int isleap(int y)/*是闰年返回1,否则为0*/return(y%4=0&y%100!=0)|y%400=0);int days_pm(int y,int m)/*返回y年m月的天数*/int dpm13=0,31,28,31,30,31,30,31,31,30,31,30,31;return dpmm+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 分类 定义
限制150内