第7章 利用函数实现模块化程序设计_第1页
第7章 利用函数实现模块化程序设计_第2页
第7章 利用函数实现模块化程序设计_第3页
第7章 利用函数实现模块化程序设计_第4页
第7章 利用函数实现模块化程序设计_第5页
已阅读5页,还剩153页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言程序设计地球物理与信息工程学院计算机系地球物理与信息工程学院计算机系第第7章章利用函数实现模块化程序设计利用函数实现模块化程序设计第7章 利用函数实现模块化程序设计2第第7章章 用函数实现模块化程序设计用函数实现模块化程序设计7.1 为什么要用函数为什么要用函数7.2 怎样定义函数怎样定义函数7.3 调用函数调用函数7.4 对被调用函数的声明和函数原型对被调用函数的声明和函数原型7.5 函数的嵌套调用函数的嵌套调用7.6 函数的递归调用函数的递归调用7.7 数组作为函数参数数组作为函数参数7.8 局部变量和全局变量局部变量和全局变量7.9 变量的存储方式和生存期变量的存储方式和生存期7.

2、10 关于变量的声明和定义关于变量的声明和定义7.11 内部函数和外部函数内部函数和外部函数第7章 利用函数实现模块化程序设计3第第7章章 用函数实现模块化程序设计用函数实现模块化程序设计7.1 为什么要用函数为什么要用函数7.2 怎样定义函数怎样定义函数7.3 调用函数调用函数7.4 对被调用函数的声明和函数原型对被调用函数的声明和函数原型7.5 函数的嵌套调用函数的嵌套调用7.6 函数的递归调用函数的递归调用7.7 数组作为函数参数数组作为函数参数7.8 局部变量和全局变量局部变量和全局变量7.9 变量的存储方式和生存期变量的存储方式和生存期7.10 关于变量的声明和定义关于变量的声明和定

3、义7.11 内部函数和外部函数内部函数和外部函数第7章 利用函数实现模块化程序设计4本章主要内容本章主要内容 函数的有关概念函数的有关概念l定义定义l调用调用l参数参数l返回值返回值l函数原型声函数原型声明明 函数嵌套调用函数嵌套调用 函数递归调用函数递归调用 数组名作函数参数数组名作函数参数 内部变量与外部变内部变量与外部变量量 变量的存储方式变量的存储方式 变量声明定义的区变量声明定义的区别别 内部函数与外部函内部函数与外部函数数例题例题 习题习题 典型算法典型算法函数参数单向值传递问题函数参数单向值传递问题多层嵌套调用多层嵌套调用函数递归调用函数递归调用数组名作参数数组名作参数排序排序求

4、最大值最小值求最大值最小值字符串处理字符串处理第7章 利用函数实现模块化程序设计57.1 为什么要用函数为什么要用函数复杂问题复杂问题模块化程序设计模块化程序设计函数实现一个特定的功能函数实现一个特定的功能每个函数可以被使用多次每个函数可以被使用多次-复用复用第7章 利用函数实现模块化程序设计6mainabcfghdeie用函数解决复杂问题用函数解决复杂问题第7章 利用函数实现模块化程序设计7可以使用可以使用库函数库函数可以使用可以使用自己编写的函数自己编写的函数在程序设计中在程序设计中要善于利用函数要善于利用函数可以可以减少重复编写程序段的工作量减少重复编写程序段的工作量同时可以同时可以方便

5、地实现模块化的程序设计方便地实现模块化的程序设计可以使用哪些函数?可以使用哪些函数?第7章 利用函数实现模块化程序设计8例题例题7-1例例7.1 输出以下的结果,用函数调用实现。输出以下的结果,用函数调用实现。*How do you do!*第7章 利用函数实现模块化程序设计9#include int main() void print_star( ); /声明函数声明函数 void print_message( ); /声明函数声明函数 print_star( ); /调用函数调用函数 print_message( ); /调用函数调用函数 print_star( ); /调用函数调用函数

6、return 0;void print_star( ) /定义函数定义函数 printf(*n); void print_message( ) /定义函数定义函数 printf( How do you do!n); 第7章 利用函数实现模块化程序设计10一个程序由一个或多个程序模块组成,一个程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件每一个程序模块作为一个源程序文件 一个源程序文件由一个或多个函数以及其一个源程序文件由一个或多个函数以及其他有关内容(如预处理指令、数据声明与他有关内容(如预处理指令、数据声明与定义等)组定义等)组成成程序的执行是从程序的执行是从main函数开始

7、的,如果函数开始的,如果在在main函数中调用其他函数,在调用后流函数中调用其他函数,在调用后流程返回到程返回到main函数,在函数,在main函数中结束整函数中结束整个程序的运行。个程序的运行。所有函数都是平行的,即在定义函数时是所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。即函数不能分别进行的,是互相独立的。即函数不能嵌套定义嵌套定义说明:说明:第7章 利用函数实现模块化程序设计11从用户使用的角度看,函数有两种从用户使用的角度看,函数有两种 库函数库函数 用户自己定义的函数用户自己定义的函数从函数的形式看,函数分两类从函数的形式看,函数分两类 无参函数无参函数 有参函有参

8、函数数函数的种类函数的种类第7章 利用函数实现模块化程序设计127.2 怎样定义函数怎样定义函数7.2.1 为什么要定义函数为什么要定义函数7.2.2 定义函数的方法定义函数的方法第7章 利用函数实现模块化程序设计137.2.1 为什么要定义函数为什么要定义函数C语言要求,在程序中用到的所有函数,语言要求,在程序中用到的所有函数,必须必须先定义,后使用先定义,后使用 指定函数的名字指定函数的名字,以便以后按名调用,以便以后按名调用 指定函数类型指定函数类型,即函数返回值的类型,即函数返回值的类型 指定函数参数的名字和类型指定函数参数的名字和类型,以便在调用函,以便在调用函数时向它们传递数据数时

9、向它们传递数据 指定函数的功能指定函数的功能。这是最重要的,这是在函。这是最重要的,这是在函数体中解决的数体中解决的第7章 利用函数实现模块化程序设计14p 对于对于库函数,程序设计者只需用库函数,程序设计者只需用#include指令把有关的头文件包含到本文件模块中指令把有关的头文件包含到本文件模块中即可即可 #include #include #include第7章 利用函数实现模块化程序设计157.2.2 定义函数的方法定义函数的方法1、定义无参函数定义无参函数定义无参函数的一般形定义无参函数的一般形式为式为:类型名类型名 函数名函数名 (void) 函数体函数体 类型名类型名 函数名函数

10、名( ) 函数体函数体 第7章 利用函数实现模块化程序设计162、定义有参函数定义有参函数定义有参函数的一般形式为定义有参函数的一般形式为:类型名类型名 函数名函数名(形式参数表列形式参数表列) 函数体函数体第7章 利用函数实现模块化程序设计173、定义空函数定义空函数定义定义空空函数的一般形式为函数的一般形式为:类型名类型名 函数名函数名( ) 作用:作用:先用空函数占一个位置,以后先用空函数占一个位置,以后逐逐步步扩充扩充好处好处:程序结构清楚,可读性好,以后程序结构清楚,可读性好,以后扩充新功扩充新功 能方便,对程序结构影响能方便,对程序结构影响不大不大第7章 利用函数实现模块化程序设计

11、187.3 调用函数调用函数7.3.1 函数调用的形式函数调用的形式7.3.2 函数调用时的数据传递函数调用时的数据传递7.3.3 函数调用的过程函数调用的过程7.3.4 函数的返回值函数的返回值第7章 利用函数实现模块化程序设计197.3.1 函数调用的形式函数调用的形式按函数调用在程序中出现的形式和位置来按函数调用在程序中出现的形式和位置来分,可以有以下分,可以有以下3种函数调用方式种函数调用方式:. 函数调用语句函数调用语句u把函数调用单独作为一个语句把函数调用单独作为一个语句, 如如 printf_star();u这时不要求函数带回值,只要求函数完成一定的操作这时不要求函数带回值,只要

12、求函数完成一定的操作第7章 利用函数实现模块化程序设计20. 函数表达式函数表达式u函数调用出现在另一个表达式中函数调用出现在另一个表达式中, 如如u c=max(a,b);u这时要求函数带回一个确定的值以参加表达式的运算这时要求函数带回一个确定的值以参加表达式的运算. 函数参数函数参数函数调用作为另一函数调用时的实参函数调用作为另一函数调用时的实参, 如如 mmax(a,max(b,c);其中其中max(b,c)是一次函数调用,它的值作为是一次函数调用,它的值作为max另一次调用的实参另一次调用的实参第7章 利用函数实现模块化程序设计217.3.2 函数调用时的数据传递函数调用时的数据传递

13、1.1.形式参数和实际参数形式参数和实际参数定义函数时函数名后面的变量名称为定义函数时函数名后面的变量名称为形式形式参数参数(简称(简称形参形参)主调函数中调用一个函数时,函数名后面参主调函数中调用一个函数时,函数名后面参数称为数称为实际参数实际参数(简称(简称实参实参)p形式参数形式参数是在首行定义的变量等!是在首行定义的变量等!p实际参数实际参数可以是常量、变量或表达式可以是常量、变量或表达式第7章 利用函数实现模块化程序设计222.2.实参和形参间的数据传递实参和形参间的数据传递在调用函数过程中,系统会把实参的值传递在调用函数过程中,系统会把实参的值传递给被调用函数的形参给被调用函数的形

14、参或者说,或者说,形参从实参得到一个值形参从实参得到一个值该值在函数调用期间有效,可以参加该值在函数调用期间有效,可以参加被调被调函函数中的运算数中的运算从从实参实参到到形参形参的值传递的的值传递的单向单向的!没有返回的!没有返回的过程!的过程!单向值传递!单向值传递!第7章 利用函数实现模块化程序设计23例例7.2 输入两个整数,要求输出其中值较大输入两个整数,要求输出其中值较大者。者。 要求用函数来找到大数。要求用函数来找到大数。先编写先编写max函数:函数:int max(int x,int y) int z; z=xy?x:y; return(z); 第7章 利用函数实现模块化程序设计

15、24#include int main() int max(int x,int y); int a,b,c; printf(two integer numbers: ); scanf(%d,%d,&a,&b); c=max(a,b); printf(max is %dn,c); 实参可以是常量、变量或表达式实参可以是常量、变量或表达式第7章 利用函数实现模块化程序设计25int max(int x, int y ) int z; z=xy?x:y; return(z); #include int main() int max(int x,int y); int a,b,c; p

16、rintf(two integer numbers: ); scanf(%d,%d,&a,&b); c=max( a , b ); printf(max is %dn,c); 调用时:调用时:从实参到形参,单向值传递!从实参到形参,单向值传递!返回时:返回时:带回一个值!带回一个值!第7章 利用函数实现模块化程序设计267.3.3 函数调用的过程函数调用的过程在定义函数中指定的形参,在未出现函数在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。调用时,它们并不占内存中的存储单元。在发生函数调用时,函数在发生函数调用时,函数max的形参被临的形参被临时分配内

17、存单元。时分配内存单元。2a3bxy23实参实参形参形参第7章 利用函数实现模块化程序设计27调用结束,形参单元被释放调用结束,形参单元被释放实参单元仍保留并维持原值,没有改变实参单元仍保留并维持原值,没有改变如果在执行一个被调用函数时,如果在执行一个被调用函数时,形参的值发生形参的值发生改变,改变,2a3bxy23实参实参形参形参不会改变主调函数的实参的值不会改变主调函数的实参的值! !第7章 利用函数实现模块化程序设计28#include int main() int f(int x,int y); int a=5,b=8; printf(a=%d,b=%dn,a,b); f(a,b);

18、printf(a=%d,b=%dn,a,b); return 0;int f(int x,int y) x=x+9; y=y*3; return 0;第7章 利用函数实现模块化程序设计29#include int main() int f(int x,int y); int a=5,b=8; printf(a=%d,b=%dn,a,b); f(a,b); printf(a=%d,b=%dn,a,b); return 0;int f(int x,int y) x=x+9; y=y*3; printf(x=%d,y=%dn,x,y); return 0;第7章 利用函数实现模块化程序设计30#in

19、clude int main() int f(int x,int y); int a=5,b=8; printf(a=%d,b=%dn,a,b); f( a , b ); printf(a=%d,b=%dn,a,b); return 0;int f(int x , int y ) x=x+9; y=y*3; printf(x=%d,y=%dn,x,y); return 0;a到到x,b到到y,都是单向传递的,都是单向传递的没有没有x到到a,y到到b的传递的传递第7章 利用函数实现模块化程序设计31#include int main() int f(int x,int y); int a=5,b

20、=8; printf(a=%d,b=%dn,a,b); f( a+6 , b+8 ); printf(a=%d,b=%dn,a,b); return 0;int f(int x , int y ) x=x+9; y=y*3; printf(x=%d,y=%dn,x,y); return 0;第7章 利用函数实现模块化程序设计327.3.4 函数的返回值函数的返回值希望通过函数调用使主调函数能得到希望通过函数调用使主调函数能得到确定的值确定的值, 这就是这就是函数值函数值(函数的返回值函数的返回值) 函数的返回值是通过函数中的函数的返回值是通过函数中的return语句获得的语句获得的 一个函数中

21、可以有一个以上的一个函数中可以有一个以上的return语句语句, 执行到哪一个执行到哪一个return语句语句, 哪一个哪一个就就起作用起作用 return语句后面的括号可以不要语句后面的括号可以不要u函数值的类型函数值的类型, 应当在定义函数时指定函数值的类型应当在定义函数时指定函数值的类型u在定义函数时指定的函数类型一般应该和在定义函数时指定的函数类型一般应该和return语句中的语句中的表达式类型一致表达式类型一致u如果函数值的类型和如果函数值的类型和return语句中表达式的值不一致语句中表达式的值不一致, 则则以函数类型为准以函数类型为准第7章 利用函数实现模块化程序设计33例例7.

22、3#include int 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); return 0;int max(float x, float y) float z; z=xy?x:y; return( z ) ;第7章 利用函数实现模块化程序设计34例例7.3#include int main() int max(float x,float y); float a,b; float c; scanf(%f,%f,&

23、;a,&b); c=max(a,b); printf(max is %f n,c); return 0;int max(float x, float y) float z; z=xy?x:y; return( z ) ;第7章 利用函数实现模块化程序设计35例例7.3#include int main() float max(float x,float y); float a,b; float c; scanf(%f,%f,&a,&b); c=max(a,b); printf(max is %f n,c); return 0;float max(float x, flo

24、at y) float z; z=xy?x:y; return( z ) ;第7章 利用函数实现模块化程序设计367.4 对被调用函数的声明和函数原型对被调用函数的声明和函数原型 在一个函数中调用另一个函数需要具备在一个函数中调用另一个函数需要具备如下条件:如下条件:被调用函数必须是已经定义的函数(是库函被调用函数必须是已经定义的函数(是库函数或用户自己定义的函数)数或用户自己定义的函数)如果使用库函数,应该在本文件开头如果使用库函数,应该在本文件开头加相应加相应的的#include指令指令如果使用自己定义的函数,而该函数的位置如果使用自己定义的函数,而该函数的位置在调用它的函数后面,在调用它

25、的函数后面,应该声明应该声明第7章 利用函数实现模块化程序设计37用用add函数实现函数实现求和。在求和。在main函数中输入函数中输入输出。输出。求得的和是求得的和是float型,型,add函数为函数为float型型。add有两个参数,也分别是有两个参数,也分别是float型,型,float型。型。使用使用add函数前要有声明。函数前要有声明。例例7.4 输入两个实数,用一个函数求出它们之输入两个实数,用一个函数求出它们之和。和。第7章 利用函数实现模块化程序设计38#include int main() float add(float x, float y); float a,b,c; p

26、rintf(Please enter a and b:); scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %fn,c); return 0;float add(float x,float y) float z; z=x+y; return(z); 第7章 利用函数实现模块化程序设计39#include int main() float add(float m, float n); float a,b,c; printf(Please enter a and b:); scanf(%f,%f,&a,&b); c=add

27、(a,b); printf(sum is %fn,c); return 0;float add(float m,float n) float z; z=m+n; return(z); 第7章 利用函数实现模块化程序设计40#include int main() float add(float u, float v); float a,b,c; printf(Please enter a and b:); scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %fn,c); return 0;float add(float u,float v

28、) float z; z=u+v; return(z); 第7章 利用函数实现模块化程序设计41#include int main() float add(float , float ); float a,b,c; printf(Please enter a and b:); scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %fn,c); return 0;float add(float x,float y) float z; z=x+y; return(z); 第7章 利用函数实现模块化程序设计42 函数原型一般形式有两种函数原型一

29、般形式有两种: float add(float x, float y); float add(float, float); 原型说明可以放在文件的开头,这时所有原型说明可以放在文件的开头,这时所有函数都可以使用此函数函数都可以使用此函数第7章 利用函数实现模块化程序设计43例题例题编写一个函数,判断一个数是否是素数编写一个函数,判断一个数是否是素数分析,输入分析,输入m判断判断m是否是素数是否是素数如果是,输出如果是,输出1,如果不是,输出,如果不是,输出0应该是从实参传来应该是从实参传来m的值,的值,m是形参。函数是形参。函数的返回值是的返回值是1代表是素数,代表是素数,0代表不是素数代表不

30、是素数第7章 利用函数实现模块化程序设计44int prime(int m) int i; for(i=2;im;i+) if(m%i=0)return 0; return 1;再编写一个主函数,求再编写一个主函数,求200以内的孪生素数。孪生素以内的孪生素数。孪生素数是差是数是差是2的素数,如:的素数,如:3和和5,5和和7,等等,等等第7章 利用函数实现模块化程序设计45#include int main() int prime(int m); int m; for(m=3;m198;m+=2) if(prime(m)&prime(m+2) printf(%3d,%3dn,m,m+

31、2);int prime(int m) int i; for(i=2;im;i+) if(m%i=0)return 0; return 1;第7章 利用函数实现模块化程序设计46第第7章章 用函数实现模块化程序设计用函数实现模块化程序设计7.1 为什么要用函数为什么要用函数7.2 怎样定义函数怎样定义函数7.3 调用函数调用函数7.4 对被调用函数的声明和函数原型对被调用函数的声明和函数原型7.5 函数的嵌套调用函数的嵌套调用7.6 函数的递归调用函数的递归调用7.7 数组作为函数参数数组作为函数参数7.8 局部变量和全局变量局部变量和全局变量7.9 变量的存储方式和生存期变量的存储方式和生存

32、期7.10 关于变量的声明和定义关于变量的声明和定义7.11 内部函数和外部函数内部函数和外部函数第7章 利用函数实现模块化程序设计477.5 函数的嵌套调用函数的嵌套调用 语言的函数定义是互相平行、独立的语言的函数定义是互相平行、独立的 即即函数不能嵌套定义函数不能嵌套定义 但可以嵌套调用函数但可以嵌套调用函数 即即调用一个函数的过程中,又调用一个函数的过程中,又可以可以调用另调用另一个函数一个函数第7章 利用函数实现模块化程序设计48main函数函数调用调用a函数函数结束结束a函数函数调用调用b函数函数b函数函数第7章 利用函数实现模块化程序设计49例例7.5 输入输入4个整数,找出其中最

33、大的数。用函数的个整数,找出其中最大的数。用函数的嵌套调用来处理。嵌套调用来处理。解题思路:解题思路: main只负责输入输出,把求只负责输入输出,把求4个数的最大值的任个数的最大值的任务交给一个务交给一个max4函数去做。现在就需要编写一个函数去做。现在就需要编写一个max4函数,完成求函数,完成求4个数的最大值个数的最大值 max4函数求最大值时,调用函数求最大值时,调用max2函数求两个数函数求两个数的较大值。的较大值。1. max函数以前我们编写过函数以前我们编写过第7章 利用函数实现模块化程序设计50#include int main() int max4(int a,int b,i

34、nt c,int d); int a,b,c,d,max; printf(4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max4(a,b,c,d); printf(max=%d n,max); return 0; 第7章 利用函数实现模块化程序设计51int max4(int a,int b,int c,int d) int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return(m); int max2(int

35、 a,int b) if(ab) return a; else return b; 第7章 利用函数实现模块化程序设计52第第7章章 用函数实现模块化程序设计用函数实现模块化程序设计7.1 为什么要用函数为什么要用函数7.2 怎样定义函数怎样定义函数7.3 调用函数调用函数7.4 对被调用函数的声明和函数原型对被调用函数的声明和函数原型7.5 函数的嵌套调用函数的嵌套调用7.6 函数的递归调用函数的递归调用7.7 数组作为函数参数数组作为函数参数7.8 局部变量和全局变量局部变量和全局变量7.9 变量的存储方式和生存期变量的存储方式和生存期7.10 关于变量的声明和定义关于变量的声明和定义7.

36、11 内部函数和外部函数内部函数和外部函数第7章 利用函数实现模块化程序设计537.6 函数的递归调用函数的递归调用 在调用一个函数的过程中又出现直接或间在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的接地调用该函数本身,称为函数的递归调递归调用用。 语言的特点之一就在于允许函数的递归语言的特点之一就在于允许函数的递归调用。调用。第7章 利用函数实现模块化程序设计54 f2函数函数调用调用f1函数函数 int f(int x) int y,z; z=f(y); return (2*z); f函数函数调用调用f函数函数 f1函数函数调用调用f2函数函数应使用应使用if语句控制结

37、束调用语句控制结束调用直接调用本函数直接调用本函数间接调用本函数间接调用本函数第7章 利用函数实现模块化程序设计55 例例7.6 有有5个学生坐在一起个学生坐在一起u问第问第5个学生多少岁?他说比第个学生多少岁?他说比第4个学生大个学生大2岁岁u问第问第4个学生多少岁?他说比第个学生多少岁?他说比第3个学生大个学生大2岁岁u问第问第3个学生多少岁?他说比第个学生多少岁?他说比第2个学生大个学生大2岁岁u问第问第2个学生多少岁?他说比第个学生多少岁?他说比第1个学生大个学生大2岁岁u问第问第1个学生多少岁?他说是个学生多少岁?他说是10岁岁请问第请问第5个学生多大个学生多大第7章 利用函数实现模

38、块化程序设计56解题思路:解题思路:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10) 1n(2) 1n(age)n(age) 1n(10)n(age第7章 利用函数实现模块化程序设计57 #include int main() int age(int n); printf(NO.5,age:%dn,age(5); return 0; int age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c); ) 1n(2) 1n(age)n(age

39、) 1n(10)n(age第7章 利用函数实现模块化程序设计58例例7.7 用递归方法求!用递归方法求!解题思路:解题思路:找出求阶乘的递推公式找出求阶乘的递推公式)n()!n(n),n(!n!n11101编写一个编写一个递归函数递归函数实现递推公式实现递推公式主函数中输入,调用被调函数,输出主函数中输入,调用被调函数,输出第7章 利用函数实现模块化程序设计59int fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0 | | n=1) f=1; else f=fac(n-1)*n; return(f); )n()!n(n)

40、,n(!n!n11101第7章 利用函数实现模块化程序设计60#include int main() int fac(int n); int n; int y; printf(input an integer number:); scanf(%d,&n); y=fac(n); printf(%d!=%dn,n,y); return 0;第7章 利用函数实现模块化程序设计61再例:猴子吃桃问题再例:猴子吃桃问题先找出递推公式,编写一个函数实现递推先找出递推公式,编写一个函数实现递推公式,再编写主函数调用,输出结果。公式,再编写主函数调用,输出结果。 时时当当(时时当当10n1, 2*)1

41、)1n(peach10n, 1)n(peach第7章 利用函数实现模块化程序设计62#includeint peach(int n) int p; if(n=10) p=1; else p=(peach(n+1)+1)*2; return(p);void main() printf( %dn,peach(1); 时时当当(时时当当10n1, 2*)1)1n(peach10n, 1)n(peach第7章 利用函数实现模块化程序设计63 例例7.8 Hanoi(汉诺)塔问题。古代有一(汉诺)塔问题。古代有一个梵塔,塔内有个梵塔,塔内有3个座个座A、B、C,开始时,开始时座上有座上有64个盘子,盘子

42、大小不等,大的个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这在下,小的在上。有一个老和尚想把这64个盘子从座移到座,但规定每次只允个盘子从座移到座,但规定每次只允许移动一个盘,且在移动过程中在许移动一个盘,且在移动过程中在3个座上个座上都始终保持大盘在下,小盘在上。在移动都始终保持大盘在下,小盘在上。在移动过程中可以利用过程中可以利用B座。要求编程序输出移座。要求编程序输出移动一盘子的步骤。动一盘子的步骤。ABC第7章 利用函数实现模块化程序设计647.7 数组作为函数参数数组作为函数参数7.7.1 数组元素作函数实参数组元素作函数实参7.7.2 数组名作函数参数数组名作函数参数

43、7.7.3 多维数组名作函数参数多维数组名作函数参数第7章 利用函数实现模块化程序设计657.7.1 数组元素作函数实参数组元素作函数实参 函数的实参可以是:变量、常量、表达式函数的实参可以是:变量、常量、表达式等,只要有具体的值就可以等,只要有具体的值就可以 数组元素当然也可以作函数的实参数组元素当然也可以作函数的实参 数组元素不能作函数形参!数组元素不能作函数形参!例例7.9 输入输入10个数,要求输出其中值最个数,要求输出其中值最大的元素和大的元素和 该数是第几个数。该数是第几个数。第7章 利用函数实现模块化程序设计66例例7.9 输入输入10个数,要求输出其中值最个数,要求输出其中值最

44、大的元素和大的元素和 该数是第几个数。该数是第几个数。 算法设计:算法设计:定义数组定义数组a,用来存放,用来存放10个数个数设计函数设计函数max,用来求两个数中的大者,用来求两个数中的大者在主函数中定义变量在主函数中定义变量m,初值为,初值为a0,每次,每次调用调用max函数后的返回值存放在函数后的返回值存放在m中中1.用用打擂台打擂台算法,依次将数组元素算法,依次将数组元素a1到到a9与与m比较,最后得到的比较,最后得到的m值就是值就是10个数个数中的最大者中的最大者第7章 利用函数实现模块化程序设计67#include int main() int max(int x,int y);

45、int a10,m,n,i; for(i=0;i10;i+) scanf(%d,&ai); for(i=1,m=a0,n=0;im) m=max(m,ai); n=i; printf(largest number is %dn,m); printf(%dth number.n,n+1);int max(int x,int y) return(xy?x:y); 第7章 利用函数实现模块化程序设计68#include int main() int max(int x,int y); int a10,m,n,i; for(i=0;i10;i+) scanf(%d,&ai); for(

46、i=1,m=a0,n=0;im) m=max(m,ai); n=i; printf(largest number is %dn,m); printf(%dth number.n,n+1);int max(int x,int y) return(xy?x:y); 第7章 利用函数实现模块化程序设计697.7.2 数组名作函数参数数组名作函数参数 数组名可以用作函数的参数数组名可以用作函数的参数 实参和形参都要用数组名实参和形参都要用数组名 用数组名作函数用数组名作函数参数时,从实参向形参参数时,从实参向形参传传递的是递的是数组首元素的地址数组首元素的地址例例7.10 有一个一维数组有一个一维数组

47、score,内放,内放10个学生成绩,个学生成绩,求平均成绩。求平均成绩。第7章 利用函数实现模块化程序设计70算法设计:算法设计: 编写一个函数编写一个函数average,用来求,用来求n个数的平均值。个数的平均值。 在主函数中完成输入输出。在主函数中完成输入输出。 主函数需要传递给主函数需要传递给average函数的参数有两个:函数的参数有两个:多少个数求平均值?即:个数多少个数求平均值?即:个数n这些数放在什么地方?即:数组名,本质是数组的首这些数放在什么地方?即:数组名,本质是数组的首地址地址 所以,所以,average有两个参数,个数有两个参数,个数n,数组名,数组名编写主函数,输入

48、编写主函数,输入10个成绩的值,调用个成绩的值,调用average函数求平均值,输出结果函数求平均值,输出结果第7章 利用函数实现模块化程序设计71double average(double a ,int n) int i; double aver,sum=0; for(i=0;in;i+) sum=sum+ai; aver=sum/n; return(aver);#includeint main() double average(double a ,int n); double score10,aver; int i; for(i=0;i10;i+) scanf(%lf,&score

49、i); aver=average(score,10); for(i=0;i10;i+) printf(%g ,scorei); printf(nThe average:%gn,aver); return 0;第7章 利用函数实现模块化程序设计72#includedouble average(double a ,int n) int i; double aver,sum=0; for(i=0;in;i+) sum=sum+ai; aver=sum/n; return(aver);int main() double score10,aver; int i; for(i=0;i10;i+) scan

50、f(%lf,&scorei); aver=average(score,10); for(i=0;i10;i+) printf(%g ,scorei); printf(nThe average:%gn,aver); return 0;第7章 利用函数实现模块化程序设计73#includedouble average(double a ,int n) int i; double aver,sum=0; for(i=0;in;i+) sum=sum+ai; aver=sum/n; return(aver);int main() double score10,aver; int i; for(

51、i=0;i10;i+) scanf(%lf,&scorei); aver=average(score,10); for(i=0;i10;i+) printf(%g ,scorei); printf(nThe average:%gn,aver); return 0;第7章 利用函数实现模块化程序设计74例例7.11 有两个班级,分别有有两个班级,分别有35名和名和30名学生,调用名学生,调用一个一个average函数,分别求这两个班的学生函数,分别求这两个班的学生的平均成绩。的平均成绩。 算法设计:算法设计:求平均值的函数可以直接用上题中的函数求平均值的函数可以直接用上题中的函数aver

52、age主函数中,对两个班分别调用主函数中,对两个班分别调用average函数就函数就可以求得两个班的平均分可以求得两个班的平均分第7章 利用函数实现模块化程序设计75#include int main() double average(double a,int n); double score130,score235; int i; for(i=0;i30;i+)scanf(%lf,&score1i); for(i=0;i35;i+)scanf(%lf,&score2i); printf(%6.2fn,average(score1,30); printf(%6.2fn,aver

53、age(score2,35); return 0;第7章 利用函数实现模块化程序设计76double average(double a ,int n) int i; double aver,sum=0; for(i=0;in;i+) sum=sum+ai; aver=sum/n; return(aver);第7章 利用函数实现模块化程序设计77例例7.12 用选择法对数组中用选择法对数组中10个整数按由小到个整数按由小到大排序大排序算法设计:算法设计:用一个函数用一个函数sort完成排序的过程完成排序的过程在在main函数中输入函数中输入10个整数个整数然后调用排序函数然后调用排序函数再输出排

54、序好的再输出排序好的10个整数个整数sort需要从主函数传递来两个参数:需要从主函数传递来两个参数: 数组名数组名; 排序数据的个数排序数据的个数sort不需要返回值!不需要返回值!sort函数的排序方法采用函数的排序方法采用“选择法选择法”第7章 利用函数实现模块化程序设计78 int a10; 数组元素下标为数组元素下标为0到到9,设从小,设从小到大排序。到大排序。 “选择法选择法”排序的过程:排序的过程:第第1步:在步:在a0到到a9中找到最小的一个,与中找到最小的一个,与a0交换交换第第2步:在步:在a1到到a9中找到最小的一个,与中找到最小的一个,与a1交换交换第第3步:在步:在a2

55、到到a9中找到最小的一个,与中找到最小的一个,与a2交换交换第第4步:在步:在a3到到a9中找到最小的一个,与中找到最小的一个,与a3交换交换第第5步:在步:在a4到到a9中找到最小的一个,与中找到最小的一个,与a4交换交换第第6步:在步:在a5到到a9中找到最小的一个,与中找到最小的一个,与a5交换交换第第7步:在步:在a6到到a9中找到最小的一个,与中找到最小的一个,与a6交换交换第第8步:在步:在a7到到a9中找到最小的一个,与中找到最小的一个,与a7交换交换第第9步:在步:在a8到到a9中找到最小的一个,与中找到最小的一个,与a8交换交换第7章 利用函数实现模块化程序设计79第第0步:

56、在步:在a0到到a9中找到最小的一个,与中找到最小的一个,与a0交换交换第第1步:在步:在a1到到a9中找到最小的一个,与中找到最小的一个,与a1交换交换第第2步:在步:在a2到到a9中找到最小的一个,与中找到最小的一个,与a2交换交换第第3步:在步:在a3到到a9中找到最小的一个,与中找到最小的一个,与a3交换交换第第4步:在步:在a4到到a9中找到最小的一个,与中找到最小的一个,与a4交换交换第第5步:在步:在a5到到a9中找到最小的一个,与中找到最小的一个,与a5交换交换第第6步:在步:在a6到到a9中找到最小的一个,与中找到最小的一个,与a6交换交换第第7步:在步:在a7到到a9中找到

57、最小的一个,与中找到最小的一个,与a7交换交换第第8步:在步:在a8到到a9中找到最小的一个,与中找到最小的一个,与a8交换交换总结为:总结为: 第第i步:在步:在ai到到a9中找到最小的一个,中找到最小的一个,与与ai交换交换i的值是从的值是从0到到8第7章 利用函数实现模块化程序设计80int a10; 数组元素下标为数组元素下标为0到到9,设从小,设从小到大排序。到大排序。“选择法选择法”排序的过程:排序的过程:第第0步:在步:在a0到到a9中找到最小的一个,与中找到最小的一个,与a0交换交换k=0;for(j=1;j10;j+) if(ajak) k=j; t=ak; ak=a0; a

58、0=t; 第第1步:在步:在a1到到a9中找到最小的一个,与中找到最小的一个,与a1交换交换k=1;for(j=2;j10;j+) if(ajak) k=j; t=ak; ak=a1; a1=t; 第7章 利用函数实现模块化程序设计81k=0;for(j=1;j10;j+) if(ajak) k=j; i=0t=ak; ak=a0; a0=t; k=1;for(j=2;j10;j +) if(ajak) k=j; i=1t=ak; ak=a1; a1=t;k=2;for(j=3;j10;j+) if(ajak) k=j; i=2t=ak; ak=a2; a2=t;k=8;for(j=9;j10

59、;j+) if(ajak) k=j; i=8t=ak; ak=a8; a8=t;第7章 利用函数实现模块化程序设计82void sort(int a , int n) int i,j,k,t; for(i=0;i9;i+) k=i; for(j=i+1;j10;j+) if(ajak) k=j; t=ak; ak=ai; ai=t; for(i=0;in-1;i+)for(j=i+1;j n;j+) if(ajak) k=j;第7章 利用函数实现模块化程序设计83void sort(int a , int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=

60、i+1;jn;j+) if(ajak) k=j; t=ak; ak=ai; ai=t; #include int main() void sort(int a ,int n); int a10,i; for(i=0;i10;i+) scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n); return 0; 第7章 利用函数实现模块化程序设计847.7.3 多维数组名作函数参数多维数组名作函数参数例例7.13 有一个有一个的矩阵,求所有的矩阵,求所有元素中的最大值。元素中的最大值。算法设计:算法设计:先使变量先使变量max的初值等于矩阵中第一个元素的值,的初值等于矩阵中第一个元素的值,然后将矩阵中各个元素的值与然后将矩阵中各个元素的值与max相比,每次比较相比,每次比较后都把后都把“大者大者”存放在存放在max中,全部元素比较完后,

温馨提示

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

评论

0/150

提交评论