




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、7.1 函数是什么函数是什么7.2 函数的定义和调用函数的定义和调用7.3 函数的嵌套调用和递归调用函数的嵌套调用和递归调用7.4 数组作为函数参数数组作为函数参数7.5 变量的作用域和生存期变量的作用域和生存期7.6 内部函数和外部函数内部函数和外部函数7.7 提高部分提高部分P1687.1 函数是什么函数是什么如果程序的功能比较多,规模比较大,如果程序的功能比较多,规模比较大,把所有的程序代码都写在一个主函数把所有的程序代码都写在一个主函数中,就会使主函数变得庞杂、头绪不中,就会使主函数变得庞杂、头绪不清,使阅读和维护程序变得困难。清,使阅读和维护程序变得困难。P168有时程序中要多次实现
2、某一功能,就有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的程序需要多次重复编写实现此功能的程序代码。这使程序冗长,不精炼。代码。这使程序冗长,不精炼。7.1 函数是什么函数是什么P168采用采用“组装组装”的办法简化程序设计过程的办法简化程序设计过程事先编好一批函数实现各种不同的功能事先编好一批函数实现各种不同的功能用到什么用到什么函数函数就直接装就直接装使用使用就可以就可以这就是这就是模块化的程序设计模块化的程序设计7.1 函数是什么函数是什么P168函数就是功能函数就是功能(Function)每一个函数用来实现一个特定的功能每一个函数用来实现一个特定的功能函数的名字应反映其代
3、表的功能函数的名字应反映其代表的功能7.1 函数是什么函数是什么P168在设计一个较大的程序时,往往把它分在设计一个较大的程序时,往往把它分为若干个程序模块,每一个模块包括一为若干个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定个或多个函数,每个函数实现一个特定的功能。的功能。7.1 函数是什么函数是什么P168一个程序可由一个主函数和若干个其一个程序可由一个主函数和若干个其他函数构成。由主函数调用其他函数,他函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次可以被一个或多个函数调用任意多次7.1
4、函数是什么函数是什么P1687.1 函数是什么函数是什么P168mainabcfghdeie除了可以使用库函数外,除了可以使用库函数外,还可以还可以编写一编写一些些本领域或本单位常用到一些专用函数,本领域或本单位常用到一些专用函数,供本领域或本单位的人员使用供本领域或本单位的人员使用。、。、在程序设计中要善于利用函数,可以减在程序设计中要善于利用函数,可以减少各人重复编写程序段的工作量,同时少各人重复编写程序段的工作量,同时可以方便地实现模块化的程序设计。可以方便地实现模块化的程序设计。7.1 函数是什么函数是什么P1687.1 函数是什么函数是什么P168例例7.1 输出以下的结果,用函数调
5、用实现。输出以下的结果,用函数调用实现。 * How do you do! *7.1 函数是什么函数是什么P168解题思路:解题思路:u在输出的文字上下分别有一行在输出的文字上下分别有一行“*”号,显然不号,显然不必重复写这段代码,用一个函数必重复写这段代码,用一个函数print_star来来实现输出一行实现输出一行“*”号的功能。号的功能。u再写一个再写一个print_message函数来输出中间一函数来输出中间一行文字信息行文字信息u用主函数分别调用这两个函数用主函数分别调用这两个函数#include void main()void print_star(); void print_mes
6、sage(); print_star(); print_message(); print_star(); void print_star () printf(*n);void print_message() printf( How do you do!n);输出输出18个个*输出一行文字输出一行文字#include void main()void print_star(); void print_message(); print_star(); print_message(); print_star(); void print_star () printf(*n);void print_mes
7、sage() printf( How do you do!n);声明函数声明函数定义函数定义函数说明:说明:(1) 一个程序由一个或多个程序模块组成一个程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对于较每一个程序模块作为一个源程序文件。对于较大的程序,一般不把所有内容全放在一个源程大的程序,一般不把所有内容全放在一个源程序文件中,而是将它们分别放在若干个源文件序文件中,而是将它们分别放在若干个源文件中,由若干个源程序文件组成一个中,由若干个源程序文件组成一个C程序。这程序。这样便于分别编写、分别编译,提高调试效率。样便于分别编写、分别编译,提高调试效率。一个源程序文件可以为
8、多个一个源程序文件可以为多个C程序所调用。程序所调用。说明:说明:(2) 一个源程序文件由一个或多个函数以及其一个源程序文件由一个或多个函数以及其他有关内容组成。一个源程序文件是一个编译他有关内容组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。行编译的,而不是以函数为单位进行编译的。说明:说明:(3) 不论不论main函数出现在什么位置,函数出现在什么位置,总是从总是从main函数开始执行函数开始执行。如。如果果在在main函数中调函数中调用其他函数,在调用后流程返回到用其他函数,在调用后流程
9、返回到main函数函数,在,在main函数中结束整个程序的运行。函数中结束整个程序的运行。说明:说明:(4) 所有函数都是平行的,即在定义函数时是所有函数都是平行的,即在定义函数时是分别进行的,是分别进行的,是互相独立的互相独立的。一个函数并不从。一个函数并不从属于另一个函数,即函数属于另一个函数,即函数不能嵌套定义不能嵌套定义。函数。函数间可以互相调用,但不能调用间可以互相调用,但不能调用main函数。函数。main函数是函数是由由系统调用的。系统调用的。说明:说明: (5) 从用户使用的角度看,函数有两种。从用户使用的角度看,函数有两种。u库函数库函数,它是由系统提供的,用户不必自己定,它
10、是由系统提供的,用户不必自己定义而直接使用它们。应该说明,不同的义而直接使用它们。应该说明,不同的C语言语言编译系统提供的库函数的数量和功能会有一些编译系统提供的库函数的数量和功能会有一些不同,当然许多基本的函数是共同的。不同,当然许多基本的函数是共同的。u用户用户自己自己定义的函数定义的函数。它是用以解决用户专门。它是用以解决用户专门需要的函数。需要的函数。说明:说明:(6) 从函数的形式看,函数分两类。从函数的形式看,函数分两类。 无参函数无参函数。函数没有参数,一般用来执行。函数没有参数,一般用来执行固定的一组操作。无参函数可以带回或不带回固定的一组操作。无参函数可以带回或不带回函数值,
11、但一般以不带回函数值的居多。函数值,但一般以不带回函数值的居多。 有参函数有参函数。在调用函数时,要给出实参。在调用函数时,要给出实参。主调函数在调用被调用函数时,通过参数向被主调函数在调用被调用函数时,通过参数向被调用函数传递数据,一般情况下,执行被调用调用函数传递数据,一般情况下,执行被调用函数时会得到一个函数值,供主调函数使用。函数时会得到一个函数值,供主调函数使用。7.2 函数的定义和调用函数的定义和调用7.2.1 为什么要定义函数为什么要定义函数7.2.2 函数定义函数定义7.2.3 函数的调用函数的调用7.2.4 对被调用函数的声明和函数原型对被调用函数的声明和函数原型P170C语
12、言要求,在程序中用到的所有函数,语言要求,在程序中用到的所有函数,必须必须“先定义,后使用先定义,后使用”指定指定函数函数名字名字、函数、函数返回值类型返回值类型、函数、函数实现的实现的功能功能以及以及参数的个数与类型参数的个数与类型,将,将这些信息通知编译系统。这些信息通知编译系统。7.2.1 为什么要定义函数为什么要定义函数P170指定函数的名字,以便以后按名调用指定函数的名字,以便以后按名调用指定函数类型,即函数返回值的类型指定函数类型,即函数返回值的类型指定函数参数的名字和类型,以便在调指定函数参数的名字和类型,以便在调用函数时向它们传递数据用函数时向它们传递数据指定函数的功能。这是最
13、重要的,这是指定函数的功能。这是最重要的,这是在函数体中解决的在函数体中解决的7.2.1 为什么要定义函数为什么要定义函数P170如果程序中要调用库函数,只需用如果程序中要调用库函数,只需用#include指令把有关的头文件包含到指令把有关的头文件包含到本文件模块中即可。本文件模块中即可。如果想使用库函数中没有的函数,需要如果想使用库函数中没有的函数,需要程序设计者在程序中自己定义。程序设计者在程序中自己定义。7.2.1 为什么要定义函数为什么要定义函数P1707.2.2 函数定义函数定义1.怎样定义无参函数怎样定义无参函数函数名后面圆括号中空的,没有参数函数名后面圆括号中空的,没有参数定义无
14、参函数的一般形式为定义无参函数的一般形式为: 类型名类型名 函数名()函数名() 函数体函数体 P171包括声明部分和包括声明部分和语句部分语句部分指定函数指定函数值的类型值的类型7.2.2 函数定义函数定义1.怎样定义无参函数怎样定义无参函数函数名后面圆括号中空的,没有参数函数名后面圆括号中空的,没有参数定义无参函数的一般形式为定义无参函数的一般形式为: 类型名类型名 函数名()函数名() 函数体函数体 P171表示不需要表示不需要带回函数值带回函数值void7.2.2 函数定义函数定义2. 怎样定义有参函数怎样定义有参函数定义有参函数的一般形式为定义有参函数的一般形式为: 类型标识符类型标
15、识符 函数名(形式参数表列)函数名(形式参数表列) 函数体函数体 P1717.2.2 函数定义函数定义2. 怎样定义有参函数怎样定义有参函数 int max (int x,int y) int z; if(xy) z=x; else z=y; return(z); P171函数的功能函数的功能是什么是什么?求求x和和y二者二者中大者中大者7.2.3 函数的调用函数的调用1.调用无参函数的形式调用无参函数的形式 函数名函数名() 如如print_star()2. 调用无参函数的形式调用无参函数的形式 函数名(实参表列)函数名(实参表列)如如max(a,b)P172如果有多个如果有多个参数,用逗参
16、数,用逗号隔开号隔开例例7.2 输入两个整数,输出二者中的输入两个整数,输出二者中的大者。要求在主函数中输入两个整大者。要求在主函数中输入两个整数,用一个函数数,用一个函数max求出其中的大求出其中的大者,并在主函数中输出此值。者,并在主函数中输出此值。解题思路:解题思路:题目要求用一个题目要求用一个max函数实现比较两个函数实现比较两个整数,并将得到的大数带回主函数。显整数,并将得到的大数带回主函数。显然,二个整数中的大者也应该是整数,然,二个整数中的大者也应该是整数,因此因此max函数应当是函数应当是int型型。两个数是在主函数中输入的,在两个数是在主函数中输入的,在max函函数中进行比较
17、,因此应该定义为有参函数中进行比较,因此应该定义为有参函数,在函数调用时进行数据的传递数,在函数调用时进行数据的传递。#include int max(int x,int y) int z; if (xy) z=x; else z=y; return(z); 参数类型参数类型函数类型函数类型定义函数定义函数定义函数内定义函数内使用的变量使用的变量#include void main() int max(int x,int y); int a,b,c; printf(”please input two number:”); scanf(“%d,%d”,&a,&b); c = ma
18、x(a,b); printf(“max is %dn”,c); int max(int x,int y) int z; if (xy) z=x; else z=y; return(z); 调用函数调用函数 c=max(a,b); (main函数)函数)int max(int x, int y) (max函数)函数) int z; z=xy?x:y; return(z); #include void main() int max(int x,int y); int a,b,c; printf(”please input two number:”); scanf(“%d,%d”,&a,&a
19、mp;b); c = max(a,b); printf(“max is %dn”,c); int max(int x,int y) int z; if (xy) z=x; else z=y; return(z); if (xy) return(x);else return(y);#include void main() int max(int x,int y); int a,b,c; printf(”please input two number:”); scanf(“%d,%d”,&a,&b); c = max(a,b); printf(“max is %dn”,c); in
20、t max(int x,int y) int z; if (xy) z=x; else z=y; return(z); 形式参数形式参数实际参数实际参数函数调用的函数调用的过程过程:在定义函数中指定的形参,在未出现函数在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。调用时,它们并不占内存中的存储单元。在发生函数调用时,函数在发生函数调用时,函数max的形参被临的形参被临时分配内存单元。时分配内存单元。2a3bxy23实参实参形参形参函数调用的函数调用的过程过程:2a3bxy23实参实参形参形参调用结束,形参单元被释放调用结束,形参单元被释放实参单元仍保留并维持原值,没有
21、改变实参单元仍保留并维持原值,没有改变如果在执行一个被调用函数时,形参的值如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值发生改变,不会改变主调函数的实参的值调用函数的调用函数的方式方式:按函数在程序中出现的位置来分,可以有按函数在程序中出现的位置来分,可以有以下以下3种函数调用方式种函数调用方式. 函数语句函数语句调用没有返回值的函数,函数调用单独作调用没有返回值的函数,函数调用单独作为一个语句为一个语句 如例如例7.1中的中的“print_star();”调用函数的调用函数的方式方式:按函数在程序中出现的位置来分,可以有按函数在程序中出现的位置来分,可以有以下以下3
22、种函数调用方式种函数调用方式. 函数表达式函数表达式函数出现在一个表达式中,这种表达式称函数出现在一个表达式中,这种表达式称为函数表达式为函数表达式 如例如例7.2中的中的“c=max(a,b);”调用函数的调用函数的方式方式:按函数在程序中出现的位置来分,可以有按函数在程序中出现的位置来分,可以有以下以下3种函数调用方式种函数调用方式. 函数参数函数参数函数调用作为一个函数的实参函数调用作为一个函数的实参 如如printf (%d, max (a,b);7.2.4 对被调用函数的声明对被调用函数的声明和函数原型和函数原型P175在一个函数中调用另一个函数需要具备如在一个函数中调用另一个函数需
23、要具备如下条件:下条件:(1) 被调用函数必须是已经定义的函数(是库被调用函数必须是已经定义的函数(是库函数或用户自己定义的函数)函数或用户自己定义的函数)。(2) 如果使用库函数,应该在本文件开头如果使用库函数,应该在本文件开头加相加相应的应的#include指令指令。(3) 如果使用自己定义的函数,而该函数的位如果使用自己定义的函数,而该函数的位置在调用它的函数后面置在调用它的函数后面,应该应该进行函数进行函数声明声明7.2.4 对被调用函数的声明对被调用函数的声明和函数原型和函数原型P175函数原型的一般形式有两种函数原型的一般形式有两种:如如 int max(int x,int y);
24、 int max(int,int);原型说明可以放在文件的开头,这时原型说明可以放在文件的开头,这时本本文文件件中中所有函数都可以使用此函数所有函数都可以使用此函数7.3 函数的嵌套调用和递归调用函数的嵌套调用和递归调用P1777.3.1 函数的嵌套调用函数的嵌套调用7.3.2 函数的递归调用函数的递归调用7.3.1 函数的嵌套调用函数的嵌套调用调用一个函数的过程中,又调用一个函数的过程中,又可以可以调调用另一个函数用另一个函数P1777.3.1 函数的嵌套调用函数的嵌套调用P177main函数函数调用调用a函数函数结束结束a函数函数调用调用b函数函数b函数函数 例例7.3 输入输入4个整数,
25、找出其中最大的数。个整数,找出其中最大的数。用用一个一个函数来函数来实现实现。解题思路:解题思路:u定义定义max_4函数,找函数,找4个数中最大者个数中最大者umax_4中再多次调用中再多次调用max,找,找4个数中的大个数中的大者,然后把它作为函数值返回者,然后把它作为函数值返回main函数函数#include void main() int max_4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); m
26、ax=max_4(a,b,c,d); printf(max=%d n,max); 主函数主函数对对max_4 函数声明函数声明#include void main() int max_4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max_4(a,b,c,d); printf(max=%d n,max); 主函数主函数输入输入4个整数个整数#include void main() int max_
27、4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max_4(a,b,c,d); printf(max=%d n,max); 主函数主函数调用后肯定是调用后肯定是4个数中最大者个数中最大者输出最大者输出最大者int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d
28、); return(m); max_4函数函数对对max 函数声明函数声明int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); return(m); max_4函数函数a,b中较大者中较大者a,b,c中较大者中较大者a,b,c,d中最大者中最大者int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); retu
29、rn(m); max_4函数函数int max(int x,int y) if(xy) return x; else return y; max函数函数找找x,y中较大者中较大者int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); return(m); max_4函数函数int max(int x,int y) if(xy) return x; else return y; max函数函数return(xy?x:y);int max_4(int a,
30、int b,int c,int d)int max(int a,int b); m=max(a,b);m=max(m,c);m=max(m,d); return(m); int max(int x,int y) return(xy?x:y); #include void main() max=max_4(a,b,c,d); 7.3.2 函数的递归调用函数的递归调用P179在调用一个函数的过程中又出现直接或间在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的接地调用该函数本身,称为函数的递归调递归调用用。语言的特点之一就在于允许函数的递归语言的特点之一就在于允许函数的递归调用。调
31、用。7.3.2 函数的递归调用函数的递归调用P179 f2函数函数调用调用f1函数函数 int f(int x) int y,z; z=f(y); return (2*z); f函数函数调用调用f函数函数 f1函数函数调用调用f2函数函数应使用应使用if语句控制结束调用语句控制结束调用直接调用本函数直接调用本函数间接调用本函数间接调用本函数 例例7.6 有有5个学生坐在一起个学生坐在一起u问第问第5个学生多少岁?他说比第个学生多少岁?他说比第4个学生大个学生大2岁岁u问第问第4个学生岁数,他说比第个学生岁数,他说比第3个学生大个学生大2岁岁u问第问第3个学生,又说比第个学生,又说比第2个学生大
32、个学生大2岁岁u问第问第2个学生,说比第个学生,说比第1个学生大个学生大2岁岁u最后问第最后问第1个学生,他说是个学生,他说是10岁岁u请问第请问第5个学生多大个学生多大解题思路:解题思路:u要求第个年龄,就必须先知道第个年龄要求第个年龄,就必须先知道第个年龄u要求第个年龄必须先知道第个年龄要求第个年龄必须先知道第个年龄u第个年龄又取决于第个年龄第个年龄又取决于第个年龄u第个年龄取决于第个年龄第个年龄取决于第个年龄u每个学生年龄都比其前个学生的年龄大每个学生年龄都比其前个学生的年龄大解题思路:解题思路:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2a
33、ge(2)=age(1)+2age(1)=10) 1(2) 1()() 1(10)(nnagenagennage age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1) =10 age(2) =12 age(3) =14 age(4) =16 age(5) =18 回溯阶段回溯阶段 递推阶段递推阶段 age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1) =10 age(2) =12 age(3) =14 age(4) =1
34、6 age(5) =18 回回溯溯阶段阶段 递推阶段递推阶段结束递归的条件结束递归的条件#include int age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c); void main() printf(“%dn,age(5); age(5)输出输出age(5)mainc=age(4)+2age函数函数n=5c=age(3)+2age函数函数n=4c=age(1)+2age函数函数n=2c=age(2)+2age函数函数n=3c=10age函数函数n=1age(1)=10age(2)=12age(3)=14age(4)=1
35、6age(5)=1818例例7.5 分别用递推方法和递归方法求分别用递推方法和递归方法求!,即,即12 n。1.用递推方法求用递推方法求!解题思路:解题思路:u从从1开始,乘开始,乘2,再乘,再乘3一直乘到一直乘到n。这种。这种方法容易理解,也容易实现。递推法的特点是方法容易理解,也容易实现。递推法的特点是从一个已知的事实出发,按一定规律推下一个从一个已知的事实出发,按一定规律推下一个事实,再从这个新的已知的事实出发,再向下事实,再从这个新的已知的事实出发,再向下推出一个新的事实推出一个新的事实这是和递归不同的。这是和递归不同的。#include void main() long fac(in
36、t n); int n; long fact=0; printf(“input an integer number:”); scanf(“%d”,&n); fact=fac(n); printf(“%d!=%ldn”,n,fact); long fac(int n) int i; long fact=1; for(i=1;i=n;i+) fact=fact*i; return fact;2.用递归方法求用递归方法求!解题思路:解题思路:u递归的思路和递递归的思路和递推推是相反的,并不是先求是相反的,并不是先求1 再再 求求1 2再再 3,直到,直到 n,而是直接,而是直接从目标出发提出
37、问题:从目标出发提出问题: !等于等于!,而,而!,而,而1!是已知的,不必再回溯了是已知的,不必再回溯了) 1() 1() 1 , 0(1!nnnnnn#include void main() long fac(int n); int n,y; printf(input an integer number:); scanf(%d,&n); y=fac(n); printf(%d!=%ldn,n,y);long fac(int n) long f; if(n0) printf(“n0,data error!”); else if(n=0 | n=1) f=1; else f=fac(n
38、-1)*n; return(f); fac(5)输出输出fac(5)mainf=fac(4)5fac函数函数n=5f=fac(3)4fac函数函数n=4f=fac(1)2fac函数函数n=2f=fac(2)3fac函数函数n=3f=1fac函数函数n=1fac(1)=1fac(2)=2fac(3)=6fac(4)=24fac(5)=120120递归调用的特点:递归调用的特点:执行执行“未知未知未知未知递归边界条件已知递归边界条件已知已知已知已知已知”的过程。的过程。用递归方法解题的条件:用递归方法解题的条件:(1)所求解的问题能转化为用同一方法解决的所求解的问题能转化为用同一方法解决的子问题。
39、子问题。(2) 子问题的规模比原问题的规模小子问题的规模比原问题的规模小。(3) 必须要有递归结束条件,停止递归,否必须要有递归结束条件,停止递归,否则形成无穷递归,系统无法实现。则形成无穷递归,系统无法实现。7.4 数组作为函数参数数组作为函数参数7.4.1 数组元素作函数实参数组元素作函数实参7.4.2 数组名作函数参数数组名作函数参数P1847.4.1 数组元素作函数实参数组元素作函数实参 由于实参可以是表达式,而数组元素可以由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素可以是表达式的组成部分,因此数组元素可以作为函数的实参。作为函数的实参。P185例例7.6 有两
40、个运动队有两个运动队a和和b,各有,各有10个队员个队员,每个队员有一个综合成绩。将两个队的,每个队员有一个综合成绩。将两个队的每个队员的成绩按顺序一一对应地逐个比每个队员的成绩按顺序一一对应地逐个比较(即较(即a队第队第1个队员与个队员与b队第队第1个队员比个队员比,)。如果)。如果a队队员的成绩高于队队员的成绩高于b队相队相应队员成绩的数目多于应队员成绩的数目多于b队队员成绩高于队队员成绩高于a队相应队员成绩的数目队相应队员成绩的数目(例如,例如,a队蠃队蠃6次次,b队蠃队蠃4次次),则认为,则认为a队胜。统计出两队胜。统计出两队队员比较的结果队队员比较的结果(a队高于、等于和低于队高于、
41、等于和低于b队的次数队的次数)。解题思路:解题思路:u设两个数组设两个数组a和和b,各有,各有10个元素,分别存放个元素,分别存放10个队员的成绩个队员的成绩u将两个数组的相应元素逐个比较,用将两个数组的相应元素逐个比较,用3个变量个变量n,m,k分别累计分别累计a队队员高于、等于和低于队队员高于、等于和低于b队队员的次数队队员的次数u用一个函数用一个函数higher来判断每一次比较的结果来判断每一次比较的结果,如果,如果a队员高于队员高于b队员,结果为队员,结果为1,二者相,二者相等,结果为等,结果为0,a队员低于队员低于b队员,结果为队员,结果为-1。最后比较。最后比较n和和k即可得到哪队
42、胜的结果即可得到哪队胜的结果#include void main() int higher(int x,int y); int a10,b10,i,n=0,m=0,k=0; printf(enter array a:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n); printf(“enter array b:n”); for(i=0;i10;i+) scanf(%d,&bi); printf(n);输入输入a队队员成绩队队员成绩输入输入b队队员成绩队队员成绩for(i=0;ik) printf(a wins!n); else if (n
43、y) flag=1; else if(xy) flag=-1; else flag=0; return(flag); 7.4.2 数组名作函数参数数组名作函数参数P186希望在函数中处理整个数组的元素时,可希望在函数中处理整个数组的元素时,可以用数组名作为函数实参以用数组名作为函数实参注意,此时只是将数组的首元素的地址传注意,此时只是将数组的首元素的地址传递给所对应的形参,因此对应的形参应当递给所对应的形参,因此对应的形参应当是指针变量是指针变量(见第见第8章章)。例例7.7 有有10个学生成绩,用一个函数求全个学生成绩,用一个函数求全体学生的平均成绩。体学生的平均成绩。解题思路:解题思路:u
44、在主函数中定义一个实型数组在主函数中定义一个实型数组score,将输入,将输入的的10个学生成绩存放在数组中个学生成绩存放在数组中u设计函数设计函数average,用来求学生平均成绩,用来求学生平均成绩u需要把数组有关信息传递给需要把数组有关信息传递给average函数函数u采取用数组名作为实参,把数组地址传给采取用数组名作为实参,把数组地址传给average函数,在该函数中对数组进行处理函数,在该函数中对数组进行处理#include void main() float average(float array10); float score10,aver; int i; printf(inpu
45、t 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); aver=average(score); printf(average score is %5.2fn,aver); 数组名作实参数组名作实参float average(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver); 与与score共占同一存储单元共占同一存储单元实参、形参都是实参、形参都是float型型相当于相当于score0
46、相当于相当于scorei例例7.8 有两个班,学生数不同,编写一有两个班,学生数不同,编写一个函数,用来分别求各班的平均成绩。个函数,用来分别求各班的平均成绩。解题思路:解题思路:u问题的关键是用同一个函数求不同人数的班问题的关键是用同一个函数求不同人数的班级平均成绩级平均成绩u在定义形参时不指定大小,函数对不同人数在定义形参时不指定大小,函数对不同人数的班级都是适用的班级都是适用u由于由于数组名传递的是数组首地址数组名传递的是数组首地址,可以利用可以利用同一个函数求人数不同的班平均成绩同一个函数求人数不同的班平均成绩u在定义在定义average函数时,增加一个参数函数时,增加一个参数n,用来
47、指定当前班级的人数,用来指定当前班级的人数#include void main() float average(float array ,int n); float score_15=98.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(“%6.2fn”,average(score_1,5); printf(“%6.2fn”,average(score_2,10); float average(float array ,int n) int i; float aver,sum
48、=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);调用形式为调用形式为average(score_1,5)时时相当于相当于score_10相当于相当于score_1i相当于相当于5float average(float array ,int n) int i; float aver,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);调用形式为调用形式为average(score_2,10)时时相当于相当于score_20相当于相当
49、于score_2i相当于相当于10例例7.9 用一个函数实现用选择法对用一个函数实现用选择法对10个个整数按升序排列。整数按升序排列。解题思路:解题思路:u所谓选择法就是先将所谓选择法就是先将10个数中最小的数个数中最小的数与与a0对换对换;再将再将a1到到a9中最小的中最小的数与数与a1对换对换每比较一轮每比较一轮,找出一找出一个未经排序的数中最小的一个个未经排序的数中最小的一个u共比较共比较9轮轮a0 a1 a2 a3 a4 3 6 1 9 4 1 6 3 9 4 1 3 6 9 4 1 3 4 9 6 1 3 4 6 9小到大排序小到大排序#include void main()void
50、 sort(int array,int n); int a10,i; printf(enter the array:n); for(i=0;i10;i+) scanf(%d,&ai); sort(a,10); printf(The sorted array:n); for(i=0;i10;i+) printf(%d ,ai); printf(n); void sort(int array,int 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=ar
51、rayi; arrayi=t;在在sortisort9中,中,找找最小数最小数下标下标在在sortisort9中,中,最小数与最小数与sorti对换对换例例7.10 有有4个学生,个学生,5门课的成绩,设计门课的成绩,设计一个函数,用来求出其中的最高成绩。一个函数,用来求出其中的最高成绩。解题思路:解题思路:u先使变量先使变量max的初值为二维数组中第一个的初值为二维数组中第一个元素的值,然后将二维数组中各个元素的元素的值,然后将二维数组中各个元素的值与值与max相比,每次比较后都把相比,每次比较后都把“大者大者”存放在存放在max中,取代中,取代max的原值。全部元的原值。全部元素比较完后,
52、素比较完后,max 的值就是所有元素的最的值就是所有元素的最大值。大值。#include void main()float highest_score(float array45); float score45=61,73,85.5,87,90, 72,84,66,88,78, 75,87,93.5,81,96, 65,85,64,76,71 ; printf(“%6.2fn,highest_score(score);float highest_score(float array45) int i,j; float max; max=array00; for(i=0;i4;i+) for(j=
53、0;jmax) max=arrayij; return (max);7.5 变量的作用域和生存期变量的作用域和生存期7.5.1 变量的作用域变量的作用域-局部变量和全局变量局部变量和全局变量7.5.2 变量的存储方式和生存期变量的存储方式和生存期7.5.3 作用域和生存期的小结作用域和生存期的小结P1927.5.1 变量的作用域变量的作用域局部变量和全局变量局部变量和全局变量1 局部变量局部变量u在函数和复合语句内定义的变量,称为内部在函数和复合语句内定义的变量,称为内部变量或变量或局部变量局部变量u只在只在本函数或复合语句内本函数或复合语句内范围内有效范围内有效(从定从定义点开始到函数或复合
54、语句结束义点开始到函数或复合语句结束)u在此函数或复合语句以外是不能使用这些变在此函数或复合语句以外是不能使用这些变量的量的P192说明说明:(1) 主函数中定义的变量也只在主函数中有效主函数中定义的变量也只在主函数中有效,主函数也不能使用其他函数中定义的变量。主函数也不能使用其他函数中定义的变量。(2) 不同函数中可以使用相同名字的变量不同函数中可以使用相同名字的变量,它它们代表不同的对象们代表不同的对象,互不干扰互不干扰。(3) 形式参数也是局部变量。在函数中可以使形式参数也是局部变量。在函数中可以使用本函数定义的形参用本函数定义的形参,在函数外不能引用在函数外不能引用它它。(4) 在一个
55、函数内部在一个函数内部,可以在复合语句中定义可以在复合语句中定义变量变量,这些变量只在本复合语句中有效。这些变量只在本复合语句中有效。2 全局变量全局变量u一个程序可以包含一个或若干个源程序文件一个程序可以包含一个或若干个源程序文件(即程序模块即程序模块),而一个源文件可以包含一个或,而一个源文件可以包含一个或若干个函数若干个函数u在函数之外定义的变量是外部变量,也称为在函数之外定义的变量是外部变量,也称为全局变量全局变量(或全程变量或全程变量)u全局变量的有效范围为从定义变量的位置开全局变量的有效范围为从定义变量的位置开始到本源文件结束,在此范围内可以为本文件始到本源文件结束,在此范围内可以
56、为本文件中所有函数所共用中所有函数所共用2 全局变量全局变量u在一个函数中既可以使用本函数中的局部变在一个函数中既可以使用本函数中的局部变量,又可以使用有效的全局变量。量,又可以使用有效的全局变量。u如果在同一个源文件中,外部变量与局部变如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部量同名,则在局部变量的作用范围内,外部变量被变量被“屏蔽屏蔽”了,即它不起作用,此时局了,即它不起作用,此时局部变量是有效的。部变量是有效的。 例例7.11有有4个学生,个学生,5门课的成绩,要求门课的成绩,要求输出其中的最高成绩以及它属于第几个输出其中的最高成绩以及它属于第几个学生、
57、第几门课程。学生、第几门课程。解题思路:解题思路:u在例在例7.10中,通过调用中,通过调用highest_score函数,得到最高分函数,得到最高分u除了输出最高分以外,还要输出该分数是属除了输出最高分以外,还要输出该分数是属于第几个学生、笫几门课的信息,即需要输于第几个学生、笫几门课的信息,即需要输出出3个结果个结果u调用一个函数只能得到一个函数值,调用一个函数只能得到一个函数值,因此因此例例7.10程序无法解决这个问题程序无法解决这个问题u可以使用全局变量,通过全局变量从函数中可以使用全局变量,通过全局变量从函数中得到所需要的值得到所需要的值#include int Row,Column
58、; void main() float highest_score(float array45); float score45=61,73,85.5,87,90, 72,84,66,88,78,75,87,93.5,81,96, 65,85,64,76,71; printf(“he highest score is %6.2fn, highest_score(score); printf(Student No.is %dn Course No. is %dn,Row,Column);定义定义全局变量全局变量float highest_score(float array45) int i,j;
59、float max; max=array00; for(i=0;i4;i+) for(j=0;jmax) max=arrayij; Row=i; Column=j; return (max);行的序号赋给全局变量行的序号赋给全局变量Row将列的序号赋给全局变量将列的序号赋给全局变量Column score 函数调用函数调用 Row Column array max Row Columnmain函数函数highest_score函数函数建议不在必要时不要使用全局变量建议不在必要时不要使用全局变量全局变量全局变量RowColumn7.5.2 变量的存储方式和生存期变量的存储方式和生存期变量的变量的
60、生存期生存期:变量值存在的时间变量值存在的时间变量的两种变量的两种存储方式存储方式:静态存储方式和:静态存储方式和动态存储方式动态存储方式u静态静态存储方式是指在程序运行期间由系统分存储方式是指在程序运行期间由系统分配固定的存储空间的方式配固定的存储空间的方式u动态动态存储方式是在程序运行期间根据需要进存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式行动态的分配存储空间的方式P1957.5.2 变量的存储方式和生存期变量的存储方式和生存期全局变量采用静态存储方式全局变量采用静态存储方式,在程序开,在程序开始执行时给全局变量分配存储区,程序始执行时给全局变量分配存储区,程序执行完毕释放。在程序执行过程中它们执行完毕释放。在程序执行过程中它们占据固定的存储单元,而不是动态地进占据固定的存储单元,而不是动态地进行分配和释放。行分配和释放。P1957.5.2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外交学院《数据结构及应用算法》2023-2024学年第二学期期末试卷
- 年产30万吨精密铸造生产线项目可行性研究报告
- 人教版高中英语必修第三册UNIT 1 FESTIVALS AND CELEBRATIONS Section Ⅲ课件
- 采购销售代理协议书(2篇)
- 中国金手链项目可行性研究报告
- 2025年健康养生食品行业健康食品行业市场细分与消费者购买趋势报告
- 2025年互联网医疗平台在线问诊医生问诊沟通能力与质量控制报告
- 2025年互联网医疗平台在线问诊平台与患者健康数据安全治理政策环境分析报告
- 2025年互联网医疗平台在线问诊服务质量提升策略分析报告
- 2019-2025年教师资格之小学教育学教育心理学自我检测试卷A卷附答案
- SCB系列干式变压器使用说明书
- 2021年汽车吊载人吊篮作业安全专项措施
- 202x检察院工作总结汇报、述职报告PPT模板
- 高效液相色谱法分析(三聚氰胺)原始记录1
- 泌尿外科健康教育2膀胱冲洗健康宣教
- 全国公共英语等级考试三教材-Monolog-and-passage原文及翻译-一字一句输入的
- 焊接件通用技术要求
- 星子港件杂货港区总平面布置与码头结构设计
- 小学语文教师进城考考试试题及答案
- 汇川伺服追剪控制指导说明完整版
- CNC加工流程图最新
评论
0/150
提交评论