1、第八章 函 数1主要内容第一节 C函数概述第二节 C函数的定义第三节 函数调用和参数传递第四节 数组作为函数的参数第五节 函数的多级调用第六节 局部变量和全局变量第七节 变量的存储类别第八节 内部函数和外部函数2第一节 C函数概述print_mess()print_mess()printfprintf(How do you do!n);(How do you do!n);printstarprintstar()()printfprintf(*n);(*n);main()(main()(见见ff1)ff1)printstarprintstar();();print_mess();print_me
2、ss();printstarprintstar();();3源文件1函数n函数2函数1源文件m源文件2一个C程序 一个C程序的源文件.4函数的概述Functions break large computing tasks into smaller one,and enable people to build on what others have done instead of starting over from scratch.5第二节 C函数的定义无参函数的定义类型标识符 函数名()说明部分语句有参函数的定义类型标识符 函数名(形式参数表列)说明部分语句6例如:int max(int x
3、,int y)int z;z=xy?x:y;return z;对形参说明的传统方式int max(x,y)int x,y;int z;z=xy?x:y;return z;7第三节 函数调用和参数传递3.1 形参和实参3.2 函数返回值3.3 函数调用的一般形式3.4 函数的调用方式3.5 被调用函数的说明83.1 形参和实参形式参数:在定义函数时,函数名后面的括号中的变量称为形式参数,简称形参。实际参数:在调用函数时,函数名后面括号中的表达式称为实际参数,简称实参。9例:int max(int x,int y)int z;if(x=y)z=x;else z=y;return(z);main()
4、int a,b,c;scanf(%d%d,&a,&b);c=max(a,b);printf(”%dn,c);10main()(ff2)int a,b;scanf(%d,%d,&a,&b);/*键入2,5*/printf(“a=%d,b=%dn”,a,b);/*显示a=2,b=5*/exch(a,b);printf(“a=%d,b=%dn”,a,b);/*显示a=2,b=5*/int exch(int x,int y)int t;printf(“x=%d,y=%dn”,x,y);/*显示x=2,y=5*/t=x;x=y;y=t;printf(“x=%d,y=%dn”,x,y);/*显示x=5,y
5、=2*/11关于形参和实参的说明:关于形参和实参的说明:1、形参的有效作用范围是:在其定义所在的函数内。2、实参对形参的数据传递是值传递,即单向传递。只由实参传给形参。思考思考:在主函数的最后插入:printf(x和y是:%d,%dn,x,y);结果?!结果?!2525abxy2552abxy123、对于有参函数,调用语句中的实参个数等于被调用函数的形参个数。若实参个数形参个数,去掉实参表中右边的几个参数。若实参个数=y)z=x;else z=y;return(z);main()float a,b;int c;scanf(%f%f,&a,&b);c=max(a,b);printf(”%dn,c
6、);153.3 函数调用的一般形式 函数名(实参表);例如:exch(a,b);exch(int x,int y)实参自右向左的逐个传递与形参。18main()ff5main()ff5 intint i;i;i=1;test(i=1;test(i+,i+,i);i);i=1;test(i,i=1;test(i,i+i+););test(inttest(int x,intx,int y)y)printf(xprintf(x=%=%dtydty=%dn,x,y);=%dn,x,y);执行后执行后:x=1 y=1x=1 y=1x=2 y=1x=2 y=119 3.4 函数的几种调用方式 prints
7、tarprintstar();();print_mess();print_mess();c=max(a,b);c=max(a,b);1.函数调用作为语句2.表达式中的函数调用3.函数调用作为函数的实际参数。printf(%dn,max(a,bprintf(%dn,max(a,b););203.5 被调用函数的几点说明1.被调函数必须是已经存在的函数。2.如果使用库函数,必须在本文件开头加上用#include命令将调用有关库函数时所用的信息包含到本文件中。例如:#include”stdio.h”3、如果是调用自己定义的函数,函数调用语句之前使用函数说明语句对该被调用函数作说明。说明形式为:类型标
8、识符 被调函数名(形参类型标识符);4、函数的两个操作概念函数定义函数说明21main()main()见见ff6ff6 double double power(int,floatpower(int,float););intint i;i;for(i=1;i9;i+)for(i=1;i9;i+)printfprintf(“%d%fn”,i,power(i,1.5);“%d%fn”,i,power(i,1.5);double double power(intpower(int n,float x)n,float x)intint i;double p=1;i;double p=1;for(i=1;
9、i=n;i+)p=p*x;for(i=1;i=n;i+)p=p*x;return(p);return(p);/*/*函数说明函数说明*/*/*函数调用函数调用*/*/*函数定义函数定义*/22有些情况下可以不做说明:1.被调用函数定义在调用函数之前,可以免去说明。double double power(intpower(int n,float x)/*n,float x)/*函数定义函数定义*/intint i;double p=1;i;double p=1;for(i=1;i=n;i+)p=p*x;for(i=1;i=n;i+)p=p*x;return(p);return(p);main()
10、main()intint i;i;for(i=1;i9;i+)for(i=1;iave2)if(ave1ave2)return(1);return(1);else return(-1);else return(-1);main()main()见见ff7ff7 intint i,k=0;float i,k=0;float a8=65,78,67,90,84,63,58,76,b8=62,79,a8=65,78,67,90,84,63,58,76,b8=62,79,65,88,80,65,60,74;65,88,80,65,60,74;for(i=0;i8;i+)for(i=0;i0)k=k+1;
11、if(better(ai,bi)0)k=k+1;printf(printf(%dn%dn,k,k););26l数组名作为函数的实际参数数组名作为函数的实际参数C语言中的数组名代表了数组在内存中存放的起始地址,所以数组名作为函数的参数传递的是数组的起始地址,属于“传地址”。说明:(1)用数组名作为函数的参数,必须对实参数组先定义,形参必须说明成与实参数组类型一致的数组。(2)形参数组和实参数组的数组名可以不一样,数组的大小也可以不一致。由于传递的是地址,所以形参数组和实参数组在内存中实际上是共用了连续的一块地址空间。27 用函数用函数average()average()求求3030个学生英语课的
12、平均成绩。见个学生英语课的平均成绩。见ff8ff8float average(mark,n)float average(mark,n)intint mark;mark;intint n;n;float float aveave;intint sum=0,i;sum=0,i;for(i=0;in;i+)for(i=0;in;i+)sum=sum+marki;sum=sum+marki;aveave=sum/n;=sum/n;return(avereturn(ave););main()main()intint i,score30;i,score30;printfprintf(请输入请输入3030个
13、学生的英语成绩:个学生的英语成绩:nn);for(i=0;i30;i+)for(i=0;i30;i+)scanf(scanf(%d%d,&scorei,&scorei););printf(printf(%5.1fn%5.1fn,average(score,30);,average(score,30);28第五节 函数的多级调用main函数的作用函数的嵌套调用函数的递归调用29主函数main的作用开始执行开始执行程序程序总控作用总控作用结束程序结束程序主函数主函数mainmain30函数的嵌套调用 函数函数1函数函数2函数函数3在程序的执行过成中,当调用一个函数时,在该函数中又在调用另一个函数。
14、31例题例题见见ff9ff9#include#include main()/*main()/*第一层第一层*/c();/*c();/*第二层第二层*/a()/*a()/*第三层第三层*/putchar(aputchar(a);/*);/*第四层第四层*/b();/*b();/*第四层第四层*/putchar(aputchar(a);/*);/*第四层第四层*/b()b()/*/*第四层第四层*/putchar(bputchar(b);/*);/*第五层第五层*/c()/*c()/*第二层第二层*/putchar(cputchar(c);/*);/*第三层第三层*/a();a();/*/*第三层
15、第三层*/putchar(cputchar(c);/*);/*第三层第三层*/该程序执行后显示该程序执行后显示 cabaccabac32函数的递归调用当函数被调用时,又同时调用自身,被称为函数递归调用。见P115直接递归间接递归33例:共计5个人,有如下关系:见ff18age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2 age(2)=age(1)+2age(1)=10 求第五个人的年龄?age(n)int n;int c;if(n=1)c=10;else c=age(n-1)+2;return(c);main()printf(%d,age(5);Age函
16、数共计调用5次,age(5)-age(1)递归调用共计进行4次在每一次调用时,不是立即得到递归值,而是一次一次地进行递归,直到age(1)为止。回推-得到函数关系递推-得到函数值递归条件-已知的值34例例:用递归方法求用递归方法求n!。见!。见ff11 n!=1 n=0,1 n*(n-1)!n1 6!-5!-4!-3!-2!-1!=1(已知条件已知条件)1!*2-2!*3-3!*4-4!*5-5!*6=720float fac(int n)float f;if(n=0|n=1)f=1;else f=fac(n-1)*n;return(f);main()int n;float y;scanf(“%d”,&n);y=fac(n);printf(“%d!=%10.2fn”,n,y);35第六节 局部变量和全局变量按照变量的作用范围,变量分为:局部变量在一个函数或复合语句内部定义的变量,也称内部变量。作用范围:在定义该变量的函数或复合语句内有效。全局变量函数外定义的变量。作用范围:从定义点开始到本源文件结束。36局部变量举例:float f1(int a)int b,c;a,b,c有效 int
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1