《第六章 函数-精品文档资料整理.pptx》由会员分享,可在线阅读,更多相关《第六章 函数-精品文档资料整理.pptx(69页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、函数 C语言程序设计 函数概述函数定义的一般形式函数参数和函数的值函数的调用函数的嵌套调用函数的递归调用数组作为函数参数局部变量和全局变量变量的存储类别内部函数和外部函数运行一个多文件的程序本章学习目标:本章学习目标: C语言程序设计 函数认识到函数是一种简化程序结构的重要手段;认识到函数是一种简化程序结构的重要手段;理解函数调用和函数调用过程中的参数传递;理解函数调用和函数调用过程中的参数传递;理解函数原型理解函数原型(声明声明)和怎样写函数原型;和怎样写函数原型;能够用前几章的知识实现简单的函数;能够用前几章的知识实现简单的函数;能够用能够用return语句实现函数的返回值;语句实现函数的
2、返回值;能够理解函数调用过程中形式参数和实际参能够理解函数调用过程中形式参数和实际参数的关系,理解数组名作为函数参数时代表的数的关系,理解数组名作为函数参数时代表的意义;意义;能够理解函数的嵌套调用和递归调用机制能够理解函数的嵌套调用和递归调用机制 。6.1 概述概述函数的概念函数的概念 C语言程序设计 函数一个大的程序一般应分为若干个程序模块,每个模块一个大的程序一般应分为若干个程序模块,每个模块实现一个特定的功能,这些模块称为子程序,在实现一个特定的功能,这些模块称为子程序,在C C语言语言中子程序用函数实现。中子程序用函数实现。mainabca1abb1b2不能被调用不能被调用所有函数都
3、是所有函数都是平行的,不能平行的,不能嵌套定义嵌套定义分为分为:库函数和库函数和自定义函数自定义函数 C语言程序设计 函数一、常规方法:一、常规方法:各函数包含在一个文件中各函数包含在一个文件中例例T6-1.c #include void main( ) void printstar( ); void print_message( ); printstar( ); print_message( ); printstar( ); void printstar( ) printf (*n ); void print_message( ) printf ( How do you do!n) ; 运行
4、结果:运行结果: * How do you do! * * C语言程序设计 函数二、二、文件包含的方法文件包含的方法 在主函数中使用文件包含预编译命令,将不在在主函数中使用文件包含预编译命令,将不在本文件而在其它文件中的函数进行预编译处理把本文件而在其它文件中的函数进行预编译处理把各文件中的函数包含到本文件中来,然后一起进各文件中的函数包含到本文件中来,然后一起进行编译、连接、运行。行编译、连接、运行。 T6-1-5.c #include T6-1-2.c#include T6-1-3.cmain( ) p1( ); p2( ) ; p1( ) ; 运行结果同上运行结果同上几点说明:几点说明:
5、(1)一个源文件由一个或者多个函数组成。(2)一个C程序由一个或者多个源文件组成。(3)C程序的执行从main 函数开始。(4)所有的子函数都是平行的。(5)从用户的角度看,函数分库函数和自定义函数。(6)函数形式:无无参函数参函数主调函数无数据传送给被调函数,可带或不带返回值。有有参函数参函数主调函数与被调函数间有参数传递,主调函数可将实参传送给被调函数的形参, 被调函数的数据可返回主调函数。 C语言程序设计 函数根据(1)(2)(3)可知,逻辑上一个C语言程序是由函数构成的。C语言程序从主函数开始执行,在主函数中调用其他函数,这些函数可能又调用别的函数,主函数执行完毕代表整个程序结束。主函
6、数只能调用不能被调用。物理上一个程序由一个或者若干个文件(源文件)构成,函数分别放置在这些文件中。6.2 函数定义的一般形式函数定义的一般形式无参函数的定义形式无参函数的定义形式v类型名:类型名:l用于指定函数带回的值的类型,不写时为用于指定函数带回的值的类型,不写时为int型。型。l不带回值时可以不写。不带回值时可以不写。 C语言程序设计 函数类型名类型名 函数名函数名()() 声明声明部分部分 语句语句例例 无参函数无参函数 printstar( ) printf(*n); 或或 printstar(void) printf(*n); 有参函数定义有参函数定义的现代形式的现代形式 C语言程
7、序设计 函数类型名类型名 函数名函数名(形式参数表列形式参数表列) 声明部分声明部分 语句语句例例 有参有参函数(现代风格)函数(现代风格) int max(int x,int y) int z; z=xy?x:y; return(z); 例例 有参函数(现代风格有参函数(现代风格) int max(int x, y) int z; z=xy?x:y; return(z); C语言程序设计 函数有参函数定义有参函数定义的传统形式的传统形式v即即把对形参的声明放在函数定义的下一行把对形参的声明放在函数定义的下一行类型标识符类型标识符 函数名函数名(形式参数表列形式参数表列)形参类型说明形参类型说
8、明 声明声明部分部分 语句语句例例 有参函数(传统风格)有参函数(传统风格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 空函数空函数v为扩充功能预留,在主调函数中先占一个位置。为扩充功能预留,在主调函数中先占一个位置。 C语言程序设计 函数类型标识符类型标识符 函数名函数名()() 例例 空函数空函数 dummy( ) 6.3 函数参数和函数的值函数参数和函数的值形式参数和实际形式参数和实际参数参数在在调用函数时,多数情况下,主调函数和被调用函调用函数时,多数情况下,主调函数和被调用函数之间有数之间有数据传递关系数据传递关系,这就是,这
9、就是有参函数有参函数。v形式参数:形式参数:定义函数定义函数时函数名后面括号中的时函数名后面括号中的变量变量名称(简称形参)。名称(简称形参)。v实际参数实际参数:在主调函数中在主调函数中调用另一个函数时,在调用另一个函数时,在该函数该函数后面后面括号中括号中的参数(可以是一个表达式)。的参数(可以是一个表达式)。 C语言程序设计 函数 C语言程序设计 函数例例6.2比较两个数并输出大者比较两个数并输出大者#include void main() int max(int x,int y); /对对max函数的声明函数的声明 int a,b,c; scanf(%d,%d,&a,&b); c=ma
10、x(a,b); /调用调用max函数函数 printf(Max is %d,c);max(int x, int y) /定义定义max函数函数 int z; z=xy?x:y; return(z);形参形参实参实参c=max(a,b);max(int x, int y) int z; z=xy?x:y; return(z); 运行:运行:7,8 Max is 8v 几点说明:几点说明:l 实参可以是实参可以是常量、变量或表达式常量、变量或表达式。必须有。必须有确定确定的值。的值。当函数当函数调用时,将实参的值传递给形参,若是数组名,则传送的是调用时,将实参的值传递给形参,若是数组名,则传送的是
11、数组首地址数组首地址。 l 形参必须指定类型,只能是简单变量或数组,形参必须指定类型,只能是简单变量或数组,不能是常量或不能是常量或表达式。表达式。l 形参与实参形参与实参类型一致,个数类型一致,个数相同相同,顺序顺序相同。相同。l 若形参与实参类型不一致,自动按形参类型转换若形参与实参类型不一致,自动按形参类型转换函数函数调用调用转换。转换。l 形参在函数被调用前不占形参在函数被调用前不占内存内存;函数函数调用时为形参分配内存;调用时为形参分配内存;调用结束,内存调用结束,内存释放。释放。l 实参对形参的数据传送是实参对形参的数据传送是值传送值传送,也是,也是单向单向传送,当被调函传送,当被
12、调函数的形参发生变化时,并不改变主调函数实参的值。数的形参发生变化时,并不改变主调函数实参的值。形、实形、实参占据的是不同的存储单元参占据的是不同的存储单元 。 C语言程序设计 函数 C语言程序设计 函数例:例:形、实参占据的是不同的存储单元形、实参占据的是不同的存储单元#include void main( ) int a=2,b=3; printf (a=%d, b=%dn,a, b); printf(&a=%x,&b=%xn,&a,&b); add(a,b); printf(a=%d,b=%dn, a,b); printf(&a=%x,&b=%xn, &a,&b); add(int x,
13、int y) x=x+8; y=y+12; printf(x=%d,y=%dn,x,y); printf(&x=%x,&y=%xn,&x,&y); 2+8=103+12=152312feec12fef012ff4412ff40 xayb运行结果:运行结果: a=2, b=3&a=12ff44,&b=12ff40 x=10,y=15&x=12feec,&y=12fef0a=2,b=3&a=12ff44,&b=12ff40函数的返回值函数的返回值v返回语句形式:返回语句形式: return(表达式表达式);或或 return 表达式表达式; v功能:使程序控制从被调用函数返回功能:使程序控制从被调
14、用函数返回到到主调主调函数函数中,同时把中,同时把返值返值带带给给主调主调函数函数v说明:说明: 函数函数的返回值,必须用的返回值,必须用 return 语句带回。语句带回。 return 语句只能把语句只能把一个返值一个返值传递给调用函数。传递给调用函数。 函数中可有多个函数中可有多个return语句,语句,执行哪一个由程序执行哪一个由程序执行情况来定。执行情况来定。 如:如: if(ab) return(a); else return(b); C语言程序设计 函数说明:说明: return 后的值可以是一个表达式,如:后的值可以是一个表达式,如:return(x y ? x : y); 返
15、回值的类型为返回值的类型为定义的定义的函数类型,不指定的按函数类型,不指定的按整型整型处理。处理。 如:如: int max(int x, int y) float min(float a,float b) double abc(float d1,float d2) 若若 return 语句中表达式类型与函数类型不一致,则转换为函语句中表达式类型与函数类型不一致,则转换为函数类型。数类型。 若无若无return语句,遇语句,遇时,自动返回调用函数。时,自动返回调用函数。可能返回一个可能返回一个不确定或无用的值不确定或无用的值 。 无返回值的函数,定义为无返回值的函数,定义为 void 类型。类
16、型。 C语言程序设计 函数 printstar() printf(*);main() int a; a=printstar(); printf(%d,a);例:例:无无return语句,语句,函数带回不确定值函数带回不确定值输出:输出:10void printstar() printf(*);main() int a; a=printstar(); printf(%d,a);编译错误!编译错误! C语言程序设计 函数 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; 例:无返回值函数例:无返回值函数例例6.3: 函数返回值类型转换函数
17、返回值类型转换#include void main() int max(float x,float y); float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);输入:输入:1.5,2.5输出:输出:Max is 26.4 函数的调用函数的调用主调函数:主调函数:主动去调用其它函数主动去调用其它函数 被调函数:被其它函数所调用被调函数:被其它函数所调用函数调用的一般形式函数调用的一般形式函数名(实参表列)函
18、数名(实参表列)v说明:说明:l实参表列:有确定值的数据或表达式实参表列:有确定值的数据或表达式l实参与形参实参与形参个数相等,类型一致,按顺序一一对应,个数相等,类型一致,按顺序一一对应,当当有多个实参时,实参间有多个实参时,实参间用用 ,分隔分隔l实参表求值顺序,因系统而定(实参表求值顺序,因系统而定(Turbo C 自右向左自右向左)l调用无参函数时,实参表列为空,但调用无参函数时,实参表列为空,但( )不能省不能省 C语言程序设计 函数函数调用的方式函数调用的方式按函数在程序中出现的位置,有三种调用方式:按函数在程序中出现的位置,有三种调用方式:v函数语句:函数语句:以独立的语句去调用
19、函数。不要求有返回以独立的语句去调用函数。不要求有返回值,仅完成一定的操作。值,仅完成一定的操作。 例例 printstar(); printf(Hello,World!n);v函数表达式:函数表达式: 函数返回一个确定值,以参加表达式的运算。不可用函数返回一个确定值,以参加表达式的运算。不可用于于void例例 m=max(a,b)*2;v函数参数:函数参数:函数调用作为另一个函数的参数。函数调用作为另一个函数的参数。 例例 printf(%d,max(a,b); /*输出大数输出大数*/ m=max(a,max(b,c); /*三数比大小三数比大小*/ C语言程序设计 函数对被调用函数的声明
20、和函数原型对被调用函数的声明和函数原型v对被调用函数要求:对被调用函数要求:l必须是必须是已存在已存在的函数的函数l库函数库函数: #include l用户自定义函数:用户自定义函数:如果被调函数定义在主调如果被调函数定义在主调函数之后,那么函数之后,那么在主调函数中对被调函数作在主调函数中对被调函数作声明。声明。 C语言程序设计 函数 函数声明函数声明 一般形式:一般形式:函数类型函数类型 函数名函数名(形参类型形参类型 形参名形参名,. ); 或:或: 函数类型函数类型 函数名函数名(); 作用:告诉编译系统作用:告诉编译系统函数类型、参数个数及类型,以便检函数类型、参数个数及类型,以便检
21、验验 C语言中函数声明称为语言中函数声明称为函数原型函数原型。 函数定义函数定义与与函数声明函数声明不同,声明只与函数定义的第一行相不同,声明只与函数定义的第一行相同。声明可以不写同。声明可以不写形参名形参名,只写,只写形参类型形参类型。 函数说明位置:函数说明位置:程序的数据说明部分(函数内或外)程序的数据说明部分(函数内或外)v说明:说明:l旧版本旧版本C中函数声明不采用函数原型,只声明中函数声明不采用函数原型,只声明函数名函数名和和函数类型函数类型。如:。如: float add( )l函数调用之前,如果未对函数作声明,则编译函数调用之前,如果未对函数作声明,则编译系统把第一次遇到的函数
22、形式作为函数声明,系统把第一次遇到的函数形式作为函数声明,并默认为并默认为int型。即:函数类型是型。即:函数类型是int型型可以不可以不作函数声明,作函数声明,最好作声明最好作声明。l被调用函数的定义(程序)在主调函数之前,被调用函数的定义(程序)在主调函数之前,可以不加函数声明。可以不加函数声明。l在所有函数定义前,已在函数外部做了函数声在所有函数定义前,已在函数外部做了函数声明,则在各主调函数中可以不加函数声明。明,则在各主调函数中可以不加函数声明。 C语言程序设计 函数#include float add(float x, float y) float z; z=x+y; return
23、(z);main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);void main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);char letter(char,char);float f(float,float);int I(float,float);main()char letter(char c1,c
24、har c2)float f(float x,float y)Int I(float j,float k)6.5 函数的嵌套调用函数的嵌套调用 C语言程序设计 函数 不允许嵌套定义不允许嵌套定义,函数,函数间平行、独立。间平行、独立。 C中的函数:中的函数: 允许嵌套调用允许嵌套调用,即在,即在调某调某函数过程函数过程中调另中调另一函数。一函数。main( )调用函数调用函数a结束结束a函数函数b函数函数调用函数调用函数b C语言程序设计 函数#include int fun1(int x,int y);void main(void) int a,b; scanf(%d%d,&a,&b); p
25、rintf(The result is:%dn,fun1(a,b) );int fun1(int x,int y) int fun2(int m); return ( fun2(x)+fun2(y) );int fun2(int m) return (m*m);例例 输入两个整数,求平方和输入两个整数,求平方和输入:输入: 3 4输出:输出: The result is: 25 C语言程序设计 函数#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void ma
26、in() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d);例例 求三个数中最大数和最小数的差值求三个数中最大数和最小数的差值int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z);int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z);main( )调用函数调用函
27、数dif输出输出结束结束dif函数函数max函数函数调用函数调用函数max调用函数调用函数minmin函数函数skip6.6 函数的递归函数的递归调用调用递归:递归:反复嵌套地执行同一操作反复嵌套地执行同一操作函数的递归调用:函数的递归调用:在调用一个函数的过程中反复调用本函数在调用一个函数的过程中反复调用本函数递归调用方式递归调用方式v直接递归调用:直接递归调用:在函数体内又调用自身在函数体内又调用自身 C语言程序设计 函数f( )调调fint f(int x) int y,z; z=f(y); . return(2*z);v间接递归调用:间接递归调用:当函数当函数1去调用另一函数去调用另一
28、函数2时时,而另一函数而另一函数2反过来又调用函数反过来又调用函数1自身。自身。 C语言程序设计 函数调调f2调调f1f1( )f2( )int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);v解决上述两例子中解决上述两例子中无无终止递归调用终止递归调用的方法是:确的方法是:确定好定好结束递归的条件结束递归的条件。 条件成立,进行递归条件成立,进行递归 用用if语句控制语句控制 条件不成立,结束递归条件不成立,结束递归 C语言程序设计 函数例例6.7 有有5个人,第
29、个人,第5个人比第个人比第4个人大个人大2岁,第岁,第4个人比第个人比第3个人大个人大2岁,岁,第第2个人比第个人比第1个人大个人大2岁,第岁,第1个人个人10岁,问第岁,问第5个人多大?个人多大? age(5) age(4) age(3) age(2) age(1) =2+age(4) =2+age(3) =2+age(2) =2+age(1) =10=18 =16 =14 =12 10 n=1数学模型:数学模型:age(n)= age(n-1)+2 n1age(int n) int c; if(n=1) c=10; else c=2+age(n-1); return(c); #includ
30、e void main( ) printf(%dn, age(5);运行结果:运行结果:18u 有些问题,可以用递推,也可以用递归的方法解决。有些问题,可以用递推,也可以用递归的方法解决。v 递推递推:从一个已知的事实出发从一个已知的事实出发,按一定规律推出下一个事实按一定规律推出下一个事实,再再从已知的新的事实从已知的新的事实,推出下一个新的事实推出下一个新的事实. C语言程序设计 函数例例 用用递推法递推法求求5! ,即从即从1开始开始, 乘乘2, 乘乘3.一直一直到到5#include void main( ) int i, s=1; for(i=1;i1)#include void m
31、ain() float fac(int n); int n; float y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y);float fac(int n) float f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f);运行:运行:input a integer number:1010! = 3628800例例6.6 用递归方法求用递归方法求n!十九世纪未,欧洲珍
32、奇商店出现一种汉诺塔游戏,推销材料介绍说:古代印度布拉玛庙里的僧侣们正在玩这种游戏,如果游戏结束,世界未日即来临。是一个只能用递归方法解决的问题。是一个只能用递归方法解决的问题。 规则及分析: n个盘子从一根针移到另一根针,每次只能移动一个盘子,不允许大盘在小盘上面。 共有三根针,n个盘子由A移到C,需移动的次数是2n -1, 若64个盘子移动的次数为: 264 - 1=18, 446, 744, 073, 709, 551, 600 一年的秒数是:365 x 24 x 60 x 60=31536000 1844674407370951160031536000 =58494217355年 即:
33、5849亿年, 从能源角度推算, 太阳系寿命只有150亿年 C语言程序设计 函数例例6.7 Hanoi(汉诺)塔问题(汉诺)塔问题 BCAv方法与步骤方法与步骤l将将A上上n-1个盘子借助个盘子借助C移到移到B 。l把把A上剩下一个盘子送到上剩下一个盘子送到Cl将将n-1个盘子从个盘子从B借助借助A移到移到C C语言程序设计 函数BCAv简化实例:简化实例:将将A上上3个盘子移到个盘子移到C步骤:步骤:1. A上两个盘子借助上两个盘子借助C移到移到B 2. A上最后一个盘子移到上最后一个盘子移到C (可直接完成)(可直接完成) 3. B上两个盘子借助上两个盘子借助A移到移到C 第一步进一步分解
34、:第一步进一步分解: 1.1 A上一个盘子从上一个盘子从AC 1.2 A上一个盘子从上一个盘子从AB 1.3 C上一个盘子从上一个盘子从CB 第三步进一步分解:第三步进一步分解: 3.1 B上一个盘子从上一个盘子从BA 3.2 B上一个盘子从上一个盘子从BC3.3 A上一个盘子从上一个盘子从ACv结论:结论:上面三个步骤包含两类操作上面三个步骤包含两类操作l步骤步骤1和和3都是将都是将n-1个盘子从一个针移到另一个针上个盘子从一个针移到另一个针上(n1时时),这是一个递归的过程;,这是一个递归的过程;方法一样,只是针的名方法一样,只是针的名称不同而已,为使问题一般化,将步骤称不同而已,为使问题
35、一般化,将步骤1和和3表示为:将表示为:将one 针上的针上的n-1个盘子移到个盘子移到two针,借助针,借助 three针,只是对针,只是对应关系不同。应关系不同。第一步对应关系:第一步对应关系:one A two B three C 第三步对应关系:第三步对应关系:one B two C three A l将将1个盘子从一个针上移到另一针上。个盘子从一个针上移到另一针上。v因此,可以用两个函数分别实现上面两类操作,因此,可以用两个函数分别实现上面两类操作,用用hanoi函数实现第一类操作,用函数实现第一类操作,用move函数实现第函数实现第2类操作。类操作。lhanoi(n,one,two
36、,three) 将将n个盘从个盘从 one three借助借助twolmove(x,y) 将将1个盘从个盘从x y座,座,x、y根据情况取代根据情况取代ABC座中的座中的1个。个。 C语言程序设计 函数 C语言程序设计 函数例例6.7 用递归方法解决用递归方法解决Hanoi(汉诺)塔问题的程序(汉诺)塔问题的程序 #include void main() void hanoi(int n,char one,char two,char three); int m; printf(Input the number of diskes:); scanf(%d,&m); printf(The step
37、 to moving %3d diskes:n,m); hanoi(m,A,B,C);void hanoi(int n,char one,char two,char three)void move(char x, char y); if(n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); void move(char x, char y) printf(%c-%cn,x, y); 运行:运行: input number of diskes: 3 the s
38、tep to moving 3 diskes: A C A B C B A C B A B C A C6.7 数组作为函数参数数组作为函数参数数组元素数组元素作函数实参作函数实参值值传递。传递。数组名数组名作函数参数作函数参数只是将数组的只是将数组的首元素的首元素的地址地址传递给对应的形参,与之对应的形参应该传递给对应的形参,与之对应的形参应该是是数组名数组名或或指针变量指针变量。 C语言程序设计 函数 C语言程序设计 函数例例 输入输入10个学生的成绩,并且求出平均个学生的成绩,并且求出平均成绩成绩 float average(float array10) int i; float aver
39、,sum=array0; for( i=1; i10; i+ ) sum=sum+arrayi; aver=sum/10; return (aver);#include void main() float average(float array10); float score10, aver; int i; printf(Input 10 scores: n); for( i=0; i10; i+ ) scanf(%f, &scorei); printf(n); aver=average(score); printf(Average is: %5.2f, aver);.2109score562
40、312.88array说明说明: C语言程序设计 函数v 地址传递地址传递 调用调用函数时,对形参数组元素的操作,实际上也是对实参函数时,对形参数组元素的操作,实际上也是对实参数组元素的操作。数组元素的操作。v 在主调函数与被调函数分别定义数组在主调函数与被调函数分别定义数组,且类型且类型应一致。应一致。 如如:array是形参数组名,是形参数组名,score是实参数组是实参数组名名v 形参形参数组大小数组大小(多维数组第一维多维数组第一维)可不可不指定。指定。 在在定义数组时在数组名后面跟一个空的方定义数组时在数组名后面跟一个空的方括弧。括弧。v C编译对形参数组大小不检查,即使定义了也不起
41、作用编译对形参数组大小不检查,即使定义了也不起作用。v 形参形参数组名是数组名是地址变量地址变量 。调用时,只是将实参数组的调用时,只是将实参数组的首地址首地址传传给形参数组,因此给形参数组,因此scoren和和arrayn指的是同一单元指的是同一单元。v 数组名作函数参数时,实参和形参两个数组数组名作函数参数时,实参和形参两个数组,形参数组的元素值改变会使实参数组元素的值同时变化。形参数组的元素值改变会使实参数组元素的值同时变化。 C语言程序设计 函数例例 求两组学生的平均成绩,求两组学生的平均成绩,形参数组长度缺省形参数组长度缺省 #include void main() float av
42、erage(float array ,int n); float score_15=96.5,97,91.5,60,55; float score_210=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5; printf(The average of clase A is %6.2fn,average(score_1,5); printf(The average of clase B is %6.2fn,average(score_2,10);float average(float array ,int n) int i; float aver,sum=arr
43、ay0; for( i=1; in; i+ ) sum=sum+arrayi; aver=sum/n; return (aver);运行:运行:The average of class A is 80.40The average of class B is 76.20用用多维数组名作函数参数多维数组名作函数参数v可以用多维数组名作可以用多维数组名作实参实参和和形参形参v形参数组定义时,只能形参数组定义时,只能省略第一维的大小说明省略第一维的大小说明。lC编译不检查第一维的大小,而且数组名作函数参数编译不检查第一维的大小,而且数组名作函数参数是地址传送,所以形参数组第一维大小任意,可以和是地址传
44、送,所以形参数组第一维大小任意,可以和实参数组的维数不同。实参数组的维数不同。实参实参数组定义:数组定义:int score510形参数组定义:形参数组定义:int array310 或或 int array810l合法合法的定义:的定义:int array310; 或或 int array 10l错误的定义:错误的定义:int array ; int array3 ; C语言程序设计 函数 C语言程序设计 函数例例 求求34矩阵中各元素的最大值矩阵中各元素的最大值 #include void main()int max_value(int array 4); int a34=1,3,5,7,
45、2,4,6,8,15,17,34,12; printf(max value is %dn,max_value(a);int max_value(int array34) int i,j,k,max; max=array00; for(i=0;i3;i+) for(j=0;jmax) max=arrayij; return(max);多维形参数组第一维维数多维形参数组第一维维数可省略可省略,第二维必须相同第二维必须相同 int array46.9 局部变量和全局变量局部变量和全局变量变量按其作用域,可分为局部变量和全局变量。变量按其作用域,可分为局部变量和全局变量。局部变量局部变量内部变量内部变
46、量v定义:在定义:在函数内定义函数内定义,只在本函数内有效只在本函数内有效v说明:说明:lmain中定义的变量只在中定义的变量只在main中有效中有效l不同函数中不同函数中同名变量同名变量,占不同内存单元占不同内存单元l形参形参属于属于局部变量局部变量l可定义在复合语句中有效的变量可定义在复合语句中有效的变量l局部变量可用存储类型局部变量可用存储类型:auto register static(默认为默认为auto) C语言程序设计 函数 C语言程序设计 函数float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,
47、n; .a,b,c有效有效x,y,i,j有效有效m,n有效有效例例 不同函数中同名变量不同函数中同名变量void main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4 C语言程序设计 函数运行结果:5 4 3 2 1例例 复合语句中变量复合语句中变量#define N 5void mai
48、n() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp; temp=ai; ai=aN-i-1; aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);main() int a, b; int c; c=a+b; a,b 范围范围c 范围范围全局变量全局变量外部变量外部变量v定义:在定义:在函数外定义函数外定义,可为,可为本文件所有函数共用,本文件所有函数共用,也叫外部变量。也叫外部变量。v有效范围:从有效范围:从定义变量的位置开始定义变量的位置开始到本源文件结到本源文件结束,及有束,及有extern说明说明
49、的其它源文件的其它源文件v几点说明:几点说明:l全局变量的使用全局变量的使用,增加了函数间数据联系的渠道增加了函数间数据联系的渠道,同同一文件中的所有函数都能引用全局变量的值一文件中的所有函数都能引用全局变量的值,当某当某函数改变了全局变量的值时函数改变了全局变量的值时,便会影响其它的函数便会影响其它的函数。 C语言程序设计 函数l习惯上,全局变量名的第一个字母用大写习惯上,全局变量名的第一个字母用大写.l使用全局变量可以减少函数的实参和形参个数。使用全局变量可以减少函数的实参和形参个数。l全局变量在程序执行的全过程都占用存储单全局变量在程序执行的全过程都占用存储单元。元。l不利于程序的移植。
50、程序的可读性变差。不利于程序的移植。程序的可读性变差。l不必要时不要使用全局变量不必要时不要使用全局变量 C语言程序设计 函数int p=1,q=5;float f1(a)int a; int b,c; .int f3().char c1,c2;char f2(int x,int y) int i,j; main() int m,n; .c1,c2的作用范围的作用范围p,q的作用范围的作用范围 C语言程序设计 函数例例 全局变量的作用域及其使用情况全局变量的作用域及其使用情况int a=1; f1( ) int b; b=a+3; printf(f1:a=%d, b=%d n,a, b); f