C语言程序设计-第7章 函数_第1页
C语言程序设计-第7章 函数_第2页
C语言程序设计-第7章 函数_第3页
C语言程序设计-第7章 函数_第4页
C语言程序设计-第7章 函数_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第 7章 函数,主要内容,7.1 概述,7.2 函数的定义,7.3 函数的参数和返回值,7.4 函数的调用,大学计算机基础,2,网络信息中心教研室,主要内容,7.8 函数应用举例,7.7 内部函数和外部函数,7.6 变量的作用域与存储类别,7.5 数组作函数参数,大学计算机基础,3,网络信息中心教研室,大学计算机基础,网络信息中心教研室,4,7.1 概述,1、一个c语言程序由一个或多个源程序文件组成(适合分别编写,编译,提高编程效率)。 2、一个源程序文件由一个或多个函数组成(以源文件为单位进行编译)。 3、 c语言程序的执行顺序:从main函数开始,调用其它函数后回到main函数中, 结束整

2、个程序的运行(系统定义的函数)。,大学计算机基础,网络信息中心教研室,5,7.1 概述,4、所有函数都是平行的,即函数相互独立,不可以嵌套定义,但可以相互调用,嵌套调用,递归调用(不可以调用main函数)。,大学计算机基础,网络信息中心教研室,6,7.2 函数的定义,1、无参函数定义(一般是执行一组操作) 类型标识符 函数名( ) 变量声明部分; 执行语句部分; ,指定函数返回值的类型,省略为int; 空类型(void)表示无返回值用,有效的C语言标识符:规则同变量命名,例如: #include main( ) /* 主函数 */ printf(“n”); ,大学计算机基础,网络信息中心教研室

3、,7,7.2 函数的定义,2、有参函数定义 类型标识符 函数名(类型名 形式参数1,类型名 形式参数2,) 变量声明部分; 执行语句部分; ,例如 int max (int x, int y) /*函数头*/ int z; /*函数体中变量的声明*/ z=xy ? x : y; /*执行语句部分*/ return(z); /*执行语句部分*/ ,形参的数据类型,形参名称:命名规则同变量名,指定函数返回值的类型,省略为int; 空类型(void)表示无返回值用,大学计算机基础,网络信息中心教研室,8,7.2 函数的定义,#include int max (int x, int y) /*函数头*

4、/ int z; /*函数体中变量的声明*/ z=xy ? x : y; /*执行语句部分*/ return(z); /*执行语句部分*/ main() int a, b, c; printf(“请输入两个整数:”); scanf(“%d,%d”, ,大学计算机基础,网络信息中心教研室,9,7.3 函数的参数和返回值,1,形式参数和实际参数,大学计算机基础,网络信息中心教研室,10,7.3.1 形式参数和实际参数,1,定义函数时函数名后面括号中的变量名称,2,形式参数的概念,实际参数的概念,调用函数时函数名后面括号中的参数,实参与形参说明 形参在函数调用前不占用内存。因为形参只有在函数被调用时

5、才分配内存单元,调用结束后立即释放所占内存。 形参只能是变量,而实参可以是常量,变量或表达式。(必须有确定的值) 被定义函数中必须指定形参的类型。 实参与形参的个数、类型应一致。 实参对形参的数据传递是单向传递,只能由实参传给形参,反之不可以。,大学计算机基础,网络信息中心教研室,11,7.3.1 形式参数和实际参数,例、调用函数时的数据传递 #include sum (int x, int y, int z) /*3.为x,y,z开辟单元接受实参的值*/ z= x + y; /*4.执行函数体*/ /*5.结束调用,x,y,z被释放*/ main( ) int a=1, b=2, c=0;/

6、*1.开辟三个单元a,b,c分别存1,2,0*/ sum (a, b, c); /*2.调用函数,a,b,c是实参*/ printf (“c=%dn”,c); /*6.输出c值*/ ,此例说明:C函数调用是传值调用, 即参数值的传递是单向的,不能在 函数体内改变实参的值。,大学计算机基础,网络信息中心教研室,12,7.3.2 函数的返回值,(1)函数的返回值是通过return语句实现。return语句形式: return(表达式); return 表达式; return; /*没有确定返回值*/ (2)若函数不需要返回值,函数体中可以不含return语句,此时执行到函数体最后一条语句后,自动执

7、行一条return语句。 (3)函数返回值类型:定义函数时应予以指定,若不加指定,则当做整型(int)处理。同时返回值类型应与return语句表 达式类型一致, 若不一致,以函数值类型为准进行转换。 (4)为了明确表示不带回返回值,可以用“void”定义 “空类型”。,大学计算机基础,网络信息中心教研室,13,7.3.2 函数的返回值,例:将上例修改为以下程序 #include int sum (int x, int y) /*3.为x,y开辟单元并接受实参的值1/2*/ int z; /*4.在函数内使用的变量*/ z=x+y; /*5.执行函数体*/ return z; /*6.结束调用,

8、x,y,z被释放,z值为返回值*/ main() int a=1, b=2, c; /*1.开辟三个单元a,b,c*/ c=sum (a, b); /*2.调用函数,a,b,是实参,返回值赋给c*/ printf (“c=%dn”,c); /*7.输出c值*/ ,大学计算机基础,网络信息中心教研室,14,7.4 函数的调用,大学计算机基础,网络信息中心教研室,15,7.4.1 函数调用的形式和方式,函数调用的形式,1,无参函数调用: 函数名 ( ); /*括号不能省略*/ 有参函数调用: 函数名 (实参列表); /*实参之间用逗号隔开*/,大学计算机基础,网络信息中心教研室,16,7.4.1

9、函数调用的形式和方式,函数调用的方式,2,(1)函数语句:把函数作为一个语句(不用函数返回值)。如: display_star (); (2)函数表达式:函数包含在表达式中(用函数的返回值继续参与运算),要求函数带回确定的返回值。如 c=2*max(a,b); (3)函数参数:把函数调用作为另一个函数的实参。如 m=max(max(a, b), max(c, d);,max(a,b)和max(c,d)函数的返回值作为另一次函数max()调用的个实参!,大学计算机基础,网络信息中心教研室,17,7.4.2 被调函数的声明,函数声明的形式,1,函数类型 函数名(参数类型1,参数类型2,);或 函数

10、类型 函数名(参数类型1 参数名1,参数类型2 参数名2, );,大学计算机基础,网络信息中心教研室,18,7.4.2 被调函数的声明,(1)将要声明的函数必须是已存在的函数 (2)函数声明语句中参数列表可以省略参数名,但不可以省略参数类型,次序以及数目应保持一致。 (3)如果在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必对所调用的函数再作声明 (4)如果所调用函数的定义出现在主调函数之前,可以不必声明。 (5)如果被调函数的返回值类型是整形或字符型,可以不必声明。,函数声明的说明,2,大学计算机基础,网络信息中心教研室,19,7.4.3 嵌套调用,指在调用一个函数的过

11、程中又可以调用另一个函数,嵌套调用的概念,大学计算机基础,网络信息中心教研室,20,7.4.3 嵌套调用,例、利用嵌套调用求1!+2!+3!+20!的值 设计思路:先设计一个求n!的函数,再设计求和的函数,主函数调用求和函数,求和函数调用求n!的函数。 #include,stdio.h int fac (int); /*函数fac原型声明*/ float sum (int); /*函数sum的原型声明*/ main() float add; add=sum (20); /*主函数调用sum函数*/ printf (“add=%e”,add); /*sum返回值超过int型和long型的范围*/

12、 ,float sum (int n) /*求n以内的自然数的阶乘和*/ int k; float s=0; for (k=1;k%cn,a,c); hanoi(n-1,b,a,c); ,void main() int n; printf(请输入盘数:n); scanf(%d, ,程序如下:,大学计算机基础,网络信息中心教研室,28,7.4.5 程序举例,例、 求Fibonacci数列的第n项。 Fibonacci数列定义如下,分析:数列具备递归条件 题目给出递推公式,F(n)=F(n-1)+F(n-2) 且有递归终止的条件 n=1或n=2是有确定值1,大学计算机基础,网络信息中心教研室,29

13、,7.4.5 程序举例,#include long fibo(int ); main() long f; int n; scanf (“%d”, ,long fibo (int n) long f; if (n=1|n=2) f=1; else f=fibo(n-1)+fibo(n-2); return f; ,程序如下:,大学计算机基础,网络信息中心教研室,30,7.5 数组作函数实参,大学计算机基础,网络信息中心教研室,31,7.5.1 数组元素作函数实参,数组元素作函数实参,跟普通变量一样,是单向值传递。,【例7-10】数组元素作函数实参的实例。,#include void pan(in

14、t n) if(n0) printf(%d ,n); else printf(0 ); ,void main() int a5,i; printf(请输入5个数:n); for(i=0;i5;i+) scanf(%d, ,大学计算机基础,网络信息中心教研室,32,7.5.2 数组名作函数实参,用数组名作为函数实际参数时,不是把数组元素的值传递给形式参数数组,而是把实参数组的起始地址传递给形参数组。也就是说,使得两个数组就共用同一段存储单元。这种参数传递有时也可以称为“地址传递”。 说明: (1) 应分别在主调函数和被调用函数中定义数组。 (2) 实参数组应与形参数组类型保持一致。 但允许 (1

15、) 实参数组与形参数组大小可以不一致。 (2) 形参数组可以不指定大小,但数组名后面的方括号不能少。,大学计算机基础,网络信息中心教研室,33,7.5.2 数组名作函数实参,【例7-11】有一个数组score,内放10个学生成绩,求平均成绩。程序如下:,#include main( ) float average(float b10); float score10,aver; int i; printf (“input 10 scores:n”); for (i=0;i10;i+) scanf (“%f”, ,大学计算机基础,网络信息中心教研室,34,7.5.2 数组名作函数实参,float

16、average (float b10) int i; float aver, sum=0; for (i=0;i10;i+) sum=sum+bi; aver=sum/10; return(aver); ,大学计算机基础,网络信息中心教研室,35,7.5.2 数组名作函数实参,【例7-12】形参数组可以不定义长度。,float average(float array,int n) int i; float aver,sum=0; for(i=0;in;i+) sum+=arrayi; aver=sum/n; return aver; ,#include void main() float av

17、erage(float array,int n); float score1=98.5,97,91.5,60,55; float score2=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5; printf(score1的平均值是%6.2fn,average(score1,5); printf(score2的平均值是%6.2fn,average(score2,10); ,大学计算机基础,网络信息中心教研室,36,7.5.3 多维数组名作函数实参,数组B: 11,52,56,67,25 45,89,54,69,89 96,63,68,79,86,编写一个函数,

18、求任意二维数组中所有奇数的平方根之和。通过调用该过程计算并输出PA+PB的值(保留5位小数);其中PA为数组A中所有奇数平方根的和,PB为数组B中所有奇数平方根的和。两个数组的数据分别如下:,数组A: 23,45,56,13,34 34,74,85,54,76 56,98,56,76,67 98,54,83,12,59 33,87,74,48,62,大学计算机基础,网络信息中心教研室,37,#include #include main() int55=23,45,56,13,34,34,74,85,54,76,56,98,56,76,67,98,54,83,12,59,33,87,74,48,

19、62; int b35=11,52,56,67,25,45,89,54,69,89,96,63,68,79,86; float pa,pb; pa=sum(a,5,5); pb=sum(b,3,5); printf(%.5fn,pa+pb); ,7.5.3 多维数组名作函数实参,大学计算机基础,网络信息中心教研室,38,float sum(int a,int m,int n) int i,j; float s=0; for(i=0;im;i+) for(j=0;jn;j+) if(ai*n+j%2!=0) s+=sqrt(ai*n+j); return s; ,7.5.3 多维数组名作函数实参

20、,大学计算机基础,网络信息中心教研室,39,7.6 变量的作用域与存储类别,大学计算机基础,网络信息中心教研室,40,7.6.1 变量的作用域,(1)在一个函数内部定义的变量是局部变量, 只能在函数内部使用。 (2)在主函数内部定义的变量也是局部变量, 其它函数也不能使用主函数中的变量。 (3)形式参数是局部变量。 (4)在复合语句中定义的变量是局部于复合语句的变量, 只能在复合语句块中使用。 (5)局部变量在函数被调用的过程中分配存储单元,结束调用时释放内存。 (6)同一个函数内有局部变量不允许重名,但不同函数中局部变量可以重名。,局部变量,1,内部变量,大学计算机基础,网络信息中心教研室,

21、41,7.6.1 变量的作用域,main () int k , a=0; for (k=1; k=2; k+) int a=1; a+; printf (“k=%d,a=%dn”,k, a); printf (“k=%d,a=%dn”,k, a); ,局部变量举例:,大学计算机基础,网络信息中心教研室,42,7.6.1 变量的作用域,全局变量,2,(1) 在函数外部定义的变量是全局变量, 其作用域是变量定义位置至整个程序文件结束。 (2)非必要时不要使用全局变量:整个过程中全局变量都要占存储单元;降低了函数的通用性 ;降低程序的清晰性。 (3)如果在同一个源文件中,全局变量与局部变量同名,则在

22、局部变量的作用范围内,全局变量不起作用。,外部变量,大学计算机基础,网络信息中心教研室,43,7.6.1 变量的作用域,全局变量被局部变量屏蔽实例,#include int a=1; /*定义全局变量*/ f( ) int a=2; /*定义局部变量*/ printf (“f:a=%dn”,a); g( ) printf (“g:a=%dn”,a); ,main( ) int a=3; /*定义局部变量*/ printf (“main:a=%dn”,a); f( ); g( ); ,大学计算机基础,网络信息中心教研室,44,7.6.2 变量的存储类别,静态存储方式: 指在程序运行期间分配固定的存储空间的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论