文档详情

C语言程序设计:第七章 函数

努力****83
实名认证
店铺
PPT
694.50KB
约52页
文档ID:190693862
C语言程序设计:第七章 函数_第1页
1/52

C 程 序 设 计第七章 函数7.1 概述 程序的组成:main()主函数和若干函数组成main()fun1fun2fun3funNfun11fun1NfunN1funN2fun1N1例如:main()pntstar();pntmsg();pntstar();pntstar()printf(“*n”);pntmsg()printf(“tGood,afternoon!n”);调用调用调用*Good,afternoon!*运行结果 说明:源文件:一个或多个函数组成一个程序:一个或多个源文件组成C程序从main()开始执行除主函数外,所有函数都是同等级的使用的角度,函数的种类:标准函数和自定义函数 从形式角度,函数的种类:有参函数和无参函数7.2 函数的应用类型类型 函数名函数名(形式参数列表形式参数列表)形式参数类型说明形式参数类型说明;说明部分说明部分 语句部分语句部分说明函数返回值的类型要符合标识符的要求!int max(x,y)int x,y;int z;z=(xy)?x:y;return z;有两个形式参数x和y说明形式参数x,y的类型,要加分号!函数体说明:形式参数可以缺省,无参函数。

pntstar()printf(“*n”);函数体可以缺省,空函数delay()有参函数:int max(x,y)int x,y;int z;z=(xy)?x:y;return z;但()不能缺省函数的调用main()int a,b,c;scanf(“%d%d”,&a,&b);c =max(a ,b );printf(“c=%d n”,c);int max(x,y)int x,y;int z;z=(xy)?x:y;return z;调用实际参数-实参函数的调用是用函数名(实参),主调函数主调函数用“实参”把数据传递给被调函数被调函数对应的形参,如:a的值传递给x,b的值传递给y被调函数通过return语句把结果传递给主调函数说明:在调用函数时,实参可以是变量、常量或表达式实参和形参类型必须一致字符型和整型可以互通在调用时,实参把数值传递给形参(赋值调用、值传递)因此实参变量和形参变量有各自的存储单元如果形参在函数中被修改,不会影响实参!函数定义可以在参数表中直接给出形参的类型:int max(int x,int y)函数返回值用return语句返回return语句有两种格式:return(返回值返回值);return 返回值;返回值;如果返回值与函数定义的类型不一致,则把返回值强制转换成函数类型。

如果没有return语句,则函数带回是一个不确定的值为了表明函数“不返回值”,通常定义函数的类型为voidvoid pntstar()printf(*n);无返回值函数,函数的类型为void=函数调用形式:函数名函数名(实参表列实参表列)8它可以作为函数语句,如例它可以作为函数语句,如例7.18函数可以出现在表达式中,如例函数可以出现在表达式中,如例7.218函数可以作为函数的参数,如例函数可以作为函数的参数,如例7.22,7.23=函数调用时,实参的求值顺序“自右到左”,例7.4=函数调用的基本要求:8被调用函数存在8主调函数必须知道被调函数的类型把被调用函数放在主调函数前定义,或在调用之前:类型 函数名();/*例7.5,7.51*/放在函数内部和函数外部说明均可7.52)8但如果被调函数类型是 int,则可以缺省8 如果调用库函数,为了说明函数类型,要把对应的“头文件”用:#include 头文件名包含进来如调用数学函数,则#include math.h7.3 函数的嵌套调用 在C语言中,函数是平行、独立的,无隶属关系除main()只能作为主调函数外,其他函数都可以作为主调函数和被调函数。

某函数作为被调函数,又调用其他函数这就形成了函数的嵌套调用函数 a调用函数 b 结束函数 b调用函数 c 结束函数 c 过程 结束函数嵌套调用的例子:用弦截法求方程用弦截法求方程:x3-5x2+16x-80=0 的根x y x1 f(x1)x2 f(x2)x1 x2 f(x2)f(x1)x f(x)x f(x)需要的函数1)求函数值:f(x)=x3-5x2+16x-802)求弦与 x 轴的交点:x=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1)3)叠代求根:给定x1,x2两点,求出对应的函数值f(x1)和f(x2)调用“求弦与 x 轴交点”求出交点 x,调用“求函数值”函数求对应的函数值判断有根区间:如果 f(x1)*f(x)0 则 把 x1 点移到 x 否则 把 x2点移到 x 直到 f(x)0 则该区间无根,重新输入否则:为有根区间,调用“求根函数”求根输入x1、x2,求f(x1)、f(x2)直到 f(x1)*f(x2)0 真 假 x1=x,y1=y x2=x,y2=y 直到fabs(y)=1e-6);return(x);main()float x1,x2,f1,f2,x;do printf(“input x1,x2:n”);scanf(“%f%f”,&x1,&x2);f1=f(x1);f2=f(x2);while(f1*f2=0);x=root(x1,x2);printf(“root is%8.4fn”,x);7.4 函数的递归调用 递归调用:在一个函数的执行过程中,出现直接或间接调用函数本身,叫函数的递归调用。

int habo(y)int y;int x,z;x=habo(z);f1(x)int x;int y,t;t=f2(y);f2(u)int u;int k,j;j=f1(k)age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 gae(1)=10 age(2)=12 age(3)=14 age(4)=16 age(5)=18 递推过程 回归过程 例例 7.7 age(int n)int c;if(n=1)c=10;else c=age(n-1)+2;return c;main()printf(%d,age(5);递归必须两个条件:1)递归式:要求有前后关系2)终止条件:递归何时结束例7.9 汉诺塔问题A B C A B C A B C A B C A B C A B C A B C A B C A B C A B C A B C想办法,借助 C 把上2、3 两块从A移到B 然后把1从A移到C3 2 1 A B C想办法,然后把1从A移到C3 2 1 A B C想办法,最后借助A把2、3从B移到C 3 2 1 A B C 3 2 17.5 数组作为函数参数数组作为函数的参数有两种方式:数组元素作为函数的参数 整个数组作为函数的参数 数组元素作为函数的参数数组元素作为函数的参数(例例7.10)large(x,y)int x,y;int flag;if(xy)flag=1;else if(xy)flag=-1;else flag=0;return flag;main()int a10,b10,i,n=0,m=0,k=0;for(i=0;i10;i+)scanf(“%d”,&ai);for(i=0;i10;i+)scanf(“%d”,&bi);for(i=0;ib%d timesna=b%d timesn,ab%d timesn”,n,m,k);数组元素作为函数的实参数组在内存中的存储 假设定义:int array10;在内存中寻找具有20个字节的连续单元,来存放数组array10。

数组名array表示该连续单元的起始地址10005100071000910011100131001510017100191002110023array数组名作为函数参数float average(array)float array10;int i;float aver,sum=0;for(i=0;i10;i+)sum=sum+arrayi;aver=sum/10;return aver;main()float score10,av;int i;printf(“Input 10 numbers:n”);for(i=0;iy)?x:y;return z;501300 a b501300 x y 把a的值赋给x b的值赋给y 在函数中,对形参进行修改,只影响形参本身,对实参不产生任何影响main()int a,b,c;scanf(“%d%d”,&a,&b);c=max(a,b);printf(“max=%dn”,c);printf(“x=%d,y=%dn”,a,b);max(x,y)int x,y;int z;z=(xy)?x:y;x=1000;y=2000;return z;赋地址调用赋地址调用:主调函数把实参的地址传递给被调函数的形参。

这时,实参和形参的元素公用内存单元score0score1score9 array0 array1 array9 在函数中,对形参的变动,将影响到实参void sort(array,n)int array,n;int i,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;t=arrayk;arrayk=arrayi;arrayi=t;main()int a10,i;for(i=0;i10;i+)scanf(“%d”,&ai);sort(a,10);for(i=0;i10;i+)printf(“%d “,ai);对形参的修改,将影响到实参多维数组作为函数的参数 max_value(array)int array4;int i,j,k,max;max=array00;for(i=0;i3;i+)for(j=0;jmax)max=arrayij;return max;main()static int b34=1,3,5,7,2,4,6,9,15,17,34,12;printf(“max is%dn”,max_value(b);7.6 局部变量和全局变量max(x,y)int x,y;int z;z=(xy)?x:y;return z;main()int a,b;int z;scanf(“%d%d”,&a,&b);z=max(a,b);printf(“max=%dn”,z);在函数内部定义的变量,叫局部变量。

在max()函数中的z、在main()函数中的a、b、z为局部变量 在不同的函数中,相同的变量名属于不同的对象,相互无关形参也是一种局部变量main()int a10,i;for(i=0;i10;i+)scanf(“%d”&ai);for(i=0;i9;i+)int k,j,t;k=i;for(j=i;jak)k=j;t=ai;ai=ak;ak=t;for(i=0;i10;i+)printf(“%d“,ai);printf(“n”);在复合语句中也可以定义局部变量在复合语句中定义的局部变量,只在该复合语句中有效,出了复合语句无效!全局变量全局变量 float max,min;float average(ar,n)float ar;int n;int i;float av,sum=ar0;max=min=ar0;for(i=1;imax)max=ari;else if(arimin)min=ari;sum+=ari;av=sum/n;return av;main()float ave,score10;int i;for(i=0;iy?x:y;return z;main()extern int a,b;printf(“%d”,max(a,b);int a=13,b=-90;如果在全局变量之前,要引用该变量,必须进行说明。

在同一个文件中,如果局部变量和全局变量,在局部变量有效范围内,以全部变量不起作用ex7_17)7.7 动态存储变量和静态存储变量 变量的存储类别:用户区 程序区 静态存储区 动态存储区 存储:全局变量、静态存储变量 存储:函数的形参、局部变量、现场保护数据在C语言中,变量和函数有数据类型和数据存储类别数据类型:int、char、float、double等存储类别:auto static register extern 局部变量的存储方式 自动变量:不作专门说明为动态变量如:int a,b,c;auto int a,b,c;存放在动态存储区赋初值:在执行期间;不赋初值为随机值局部静态变量:函数调用结束后,保留原值ex7_18)存储在静态存储区中,在整个程序运行期间不释放编译时对变量初始化,不赋初值时,其初值为0 寄存器变量:控制器内存运算器寄存器变量把变量直接存放在运算器的寄存器中,需要时直接从寄存器中取值ex7_20 寄存器变量定义:register 类型 变量表列;只能用于自动变量和形参全局变量和静态变量不能定义成寄存器变量数目有限一般变量的存储过程:全局变量的存储方式:在函数外进行定义。

存储在静态存储区中允许所有的函数中引用一个程序可以由多个文件组成 Turbo C工程文件的概念 要引用其他文件的外部变量:extern 类型 变量列表;只允许本文件中的函数引用:static 类型 变量列表;7.8 内部函数和外部函数 内部函数:如果一个函数只允许本文件中其他函数调用,则定义成内部函数:static 类型 函数名(形参表)如果定义时加上extern说明,extern 类型 函数名(形参表)则该函数为外部函数外部函数允许其他文件中的函数调用该函数缺省说明为外部函数。

下载提示
相关文档
正为您匹配相似的精品文档