第7章函数-模块化程序设计-预处理命令_第1页
第7章函数-模块化程序设计-预处理命令_第2页
第7章函数-模块化程序设计-预处理命令_第3页
第7章函数-模块化程序设计-预处理命令_第4页
第7章函数-模块化程序设计-预处理命令_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

1、第7章 函数-模块化程序设计 C语言程序设计 第七章第七章 函数函数概述函数定义的一般形式函数参数和函数的值函数的调用函数的嵌套调用函数的递归调用数组作为函数参数局部变量和全局变量(自习)变量的存储类别(自习)内部函数和外部函数(自习)运行一个多文件的程序(自习)本章学习目标:本章学习目标: C语言程序设计 第七章第七章 函数函数认识到函数是一种简化程序结构的重要手段;认识到函数是一种简化程序结构的重要手段;理解函数调用和函数调用过程中的参数传递;理解函数调用和函数调用过程中的参数传递;理解函数原型理解函数原型(声明声明)和怎样写函数原型;和怎样写函数原型;能够用前几章的知识实现简单的函数;能

2、够用前几章的知识实现简单的函数;能够用能够用return语句实现函数的返回值;语句实现函数的返回值;能够理解函数调用过程中形式参数和实际参能够理解函数调用过程中形式参数和实际参数的关系,理解数组名作为函数参数时代表的数的关系,理解数组名作为函数参数时代表的意义;意义;能够理解函数的嵌套调用和递归调用机制能够理解函数的嵌套调用和递归调用机制 。7.1 概述概述函数的概念函数的概念 C语言程序设计 第七章第七章 函数函数 一个大的程序一般应分为若干个程序模块,每个模块实一个大的程序一般应分为若干个程序模块,每个模块实现一个特定的功能,这些模块称为子程序,在现一个特定的功能,这些模块称为子程序,在C

3、 C语言中子程语言中子程序用函数实现。序用函数实现。函数是函数是C语言中模块化编程的最小单位。语言中模块化编程的最小单位。mainabca1abb1b2不能被调用不能被调用所有函数都是所有函数都是平行的,不能平行的,不能嵌套定义嵌套定义分为分为:库函数和库函数和自定义函数自定义函数 C语言程序设计 第七章第七章 函数函数多个函数的常用调用方法多个函数的常用调用方法一、常规方法:一、常规方法:各函数包含在一个文件中各函数包含在一个文件中例例T7-1.c #include void main( ) void printstar( ); void print_message( ); printsta

4、r( ); print_message( ); printstar( ); void printstar( ) printf (“* n” ); void print_message( ) printf (“ How do you do!n”) ; 运行结果:运行结果: * How do you do! * * C语言程序设计 第七章第七章 函数函数二二 、文件包含的方法、文件包含的方法 在主函数中使用文件包含预编译命令(宏定义),将在主函数中使用文件包含预编译命令(宏定义),将不在本文件而在其它文件中的函数进行预编译处理把各文不在本文件而在其它文件中的函数进行预编译处理把各文件中的函数包含到

5、本文件中来,然后一起进行编译、连接件中的函数包含到本文件中来,然后一起进行编译、连接、运行。、运行。 T7-1-1.c p1( ) printf (“* n”); T7-1-2.c p2( ) printf (“ How do you do! n”); T7-1-3.c #include “T7-1-1.c”#include “T7-1-2.c”main( ) p1( ); p2( ) ; p1( ) ; 运行结果同上运行结果同上几点说明:几点说明:(1)(1)一个源文件由一个或者多个函数组成。一个源文件由一个或者多个函数组成。(2)(2)一个一个C C程序由一个或者多个源文件组成。程序由一个

6、或者多个源文件组成。(3)C(3)C程序的执行从程序的执行从main main 函数开始。函数开始。(4)(4)所有的子函数都是平行的。所有的子函数都是平行的。(5)(5)从用户的角度看,函数分库函数和自定义从用户的角度看,函数分库函数和自定义函数。函数。(6)(6)函数形式:函数形式:主调函数无数据传送给被调函主调函数无数据传送给被调函数数,可带或不带返回值。可带或不带返回值。主调函数与被调函数间有参数主调函数与被调函数间有参数传递传递,主调函数可将实参传送给被调函数的主调函数可将实参传送给被调函数的形参形参, 被调函数的数据可返回主调函数。被调函数的数据可返回主调函数。 C语言程序设计 第

7、七章第七章 函数函数根据根据(1)(2)(3)可知,逻辑上一个可知,逻辑上一个C语言程语言程序是由函数构成的,序是由函数构成的,C语言程序从语言程序从主函数主函数开始执行,在主函数中调用其他函数,开始执行,在主函数中调用其他函数,这些函数可能又调用别的函数,主函数这些函数可能又调用别的函数,主函数执行完毕代表整个程序结束。主函数只执行完毕代表整个程序结束。主函数只能调用不能被调用。能调用不能被调用。一个程序由一个或者若干个文件一个程序由一个或者若干个文件(源文件源文件)构成,函数分别放置在这些文件中。构成,函数分别放置在这些文件中。7.2 函数定义的一般形式函数定义的一般形式无参函数的定义形式

8、无参函数的定义形式v类型标识符:类型标识符:l用于指定函数带回的值的类型,不写时为用于指定函数带回的值的类型,不写时为int型。型。l不带回值时可以不写。不带回值时可以不写。 C语言程序设计 第七章第七章 函数函数类型标识符类型标识符 函数名函数名()() 说明部分说明部分 语句语句例例 无参函数无参函数 printstar( ) printf(“*n”); 或或 printstar(void ) printf(“*n”); 有参函数定义的一般形式有参函数定义的一般形式 C语言程序设计 第七章第七章 函数函数类型标识符类型标识符 函数名函数名(形式参数表列形式参数表列) 说明部分说明部分 语句

9、语句例例 有参函数有参函数 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); 空函数空函数v为扩充功能预留,在主调函数中先占一个位置。为扩充功能预留,在主调函数中先占一个位置。 C语言程序设计 第七章第七章 函数函数类型标识符类型标识符 函数名函数名()() 例例 空函数空函数 dummy( ) 7.3 函数参数和函数的值函数参数和函数的值形式参数和实际参数形式参数和实际参数v形式参数:定义函数时函数名后面括号中的变量名形式参数:定

10、义函数时函数名后面括号中的变量名v实际参数:调用函数时函数名后面括号中的表达式实际参数:调用函数时函数名后面括号中的表达式 C语言程序设计 第七章第七章 函数函数例例7.2比较两个数并输出大者比较两个数并输出大者#include void main() int max(int x,int y); int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);max(int x, int y) int z; z=xy?x:y; return(z);形参形参实参实参c=max(a,b);(main 函数)函数)(max

11、 函数)函数)max(int x, int y) int z; z=xy?x:y; return(z); 运行:运行:7,8 Max is 8v几点说明:几点说明:l实参可以是常量、变量或表达式。必须有确定的实参可以是常量、变量或表达式。必须有确定的值。值。当函数调用时,将实参的值传递给形参,若当函数调用时,将实参的值传递给形参,若是数组名,则传送的是数组是数组名,则传送的是数组首地址首地址。 l形参必须指定类型,只能是简单变量或数组,不形参必须指定类型,只能是简单变量或数组,不能是常量或表达式能是常量或表达式l形参与实参形参与实参类型一致,个数相同顺序相同。类型一致,个数相同顺序相同。l若形

12、参与实参类型不一致,自动若形参与实参类型不一致,自动按形参类型转按形参类型转换换函数调用转换函数调用转换l形参在函数被调用前不占内存形参在函数被调用前不占内存;函数调用时为形函数调用时为形参分配内存;调用结束,内存释放参分配内存;调用结束,内存释放l实参对形参的数据传送是值传送,也是单向传送,实参对形参的数据传送是值传送,也是单向传送,当被调函数的形参发生变化时,并不改变主调函当被调函数的形参发生变化时,并不改变主调函数实参的值。数实参的值。形、实参占据的是不同的存储单元形、实参占据的是不同的存储单元 C语言程序设计 第七章第七章 函数函数 C语言程序设计 第七章第七章 函数函数例:例:形、实

13、参占据的是不同的存储单元形、实参占据的是不同的存储单元#include int add(int x,int y) ;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,int y) x=x+8; y=y+12; printf(“x=%d,y=%dn”,x,y)

14、; printf(“&x=%x,&y=%xn”,&x,&y); 2+8=103+12=1523ffd2ffd4ffd6ffd8xayb运行结果:运行结果: a=2,b=3&a=18ffd6,&b=18ffd8 x=10,y=15 &x=18ffd2,&y=18ffd4a=2, b=3&a=18ffd6,&b=18ffd8函数的返回值函数的返回值v返回语句形式:返回语句形式: return(表达式表达式);或或 return 表达式表达式; v功能:使程序控制从被调用函数返回到功能:使程序控制从被调用函数返回到调用函

15、数中,同时把返值带给调用函数调用函数中,同时把返值带给调用函数 C语言程序设计 第七章第七章 函数函数15v说明:说明:l函数的返回值,必须用函数的返回值,必须用 return 语句带回。语句带回。lreturn 语句只能把一个返值传递给调用函数。语句只能把一个返值传递给调用函数。l函数中可有多个函数中可有多个return语句,语句,执行哪一个由执行哪一个由程序执行情况来定。程序执行情况来定。 if(ab) return(a); else return(b); lreturn 后的值可以是一个表达式,如:后的值可以是一个表达式,如:return(x y ? x : y);l返回值的类型为返回值

16、的类型为定义的函数类型定义的函数类型,不指定的,不指定的按整型处理。按整型处理。如:如: int max(int x, int y) float min(float a,float b) double abc(float d1,float d2)l若若 return 语句中表达式类型与函数类型不一语句中表达式类型与函数类型不一致,则转换为致,则转换为函数类型函数类型。l若无若无return语句,遇语句,遇时,自动返回调用函数。时,自动返回调用函数。可能返回一个不确定或无用的值可能返回一个不确定或无用的值 。l无返回值的函数,定义为无返回值的函数,定义为 void 类型。类型。 C语言程序设计

17、第七章第七章 函数函数 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; 例:无返回值函数例:无返回值函数例例7.3: 函数返

18、回值类型转换函数返回值类型转换#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 27.4 函数的调用函数的调用主调函数:主调函数:主动去调用其它函数主动去调用其它函数 被调函数:被其它函数所调用被调函数:被其它函数所调用函数调用的一般形式函数调

19、用的一般形式函数名(实参表列)函数名(实参表列)v说明:说明:l实参表列:有确定值的数据或表达式实参表列:有确定值的数据或表达式l实参与形参实参与形参个数相等,类型一致,按顺序一个数相等,类型一致,按顺序一一对应,一对应,当有多个实参时,实参间用当有多个实参时,实参间用“ ,”分隔分隔l实参表求值顺序,因编译器而定(一般实参表求值顺序,因编译器而定(一般 自右自右向左向左)l调用无参函数时,实参表列为空,但调用无参函数时,实参表列为空,但( )不不能省能省 C语言程序设计 第七章第七章 函数函数 C语言程序设计 第七章第七章 函数函数#include void main() int f(int

20、 a,int b); int i=2,p; p=f(i,+i); printf(%d,p);int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);例例7.4 参数求值顺序参数求值顺序按自右向左求值按自右向左求值函数调用等于函数调用等于f(3,3)运行结果:运行结果:0按自左向右求值按自左向右求值函数调用等于函数调用等于f(2,3)运行结果:运行结果:- 1为使程序有通用性:为使程序有通用性:Printf(“%d,%d”,i,i+); /*同样存在此情况同样存在此情况*/函数调用的方式函数调用的

21、方式按函数在程序中出现的位置,有三种调用方式:按函数在程序中出现的位置,有三种调用方式:v函数语句:函数语句:以独立的语句去调用函数。不要求有以独立的语句去调用函数。不要求有返回值,仅完成一定的操作。返回值,仅完成一定的操作。 例例 printstar(); printf(“Hello,World!n”);v函数表达式:函数表达式: 函数返回一个确定值,以参加表达式的运算。函数返回一个确定值,以参加表达式的运算。不不可用于可用于void定义函数类型定义函数类型例例 m=max(a,b)*2;v函数参数:函数参数:函数调用作为另一个函数的参数。函数调用作为另一个函数的参数。 例例 printf(

22、“%d”,max(a,b); /*输出大数输出大数*/ m=max(a,max(b,c); /*三数比大小三数比大小*/ C语言程序设计 第七章第七章 函数函数对被调用函数的声明和函数原型对被调用函数的声明和函数原型v对被调用函数要求:对被调用函数要求:l必须是必须是已存在已存在的函数的函数l库函数库函数: #include l用户自定义函数:用户自定义函数:如果被调函数定义如果被调函数定义在主调函数之后,那么在主调函数之后,那么在主调函数中在主调函数中对被调函数作声明。对被调函数作声明。 C语言程序设计 第七章第七章 函数函数22v函数声明函数声明l一般形式:一般形式:函数类型函数类型 函数

23、名函数名(形参类型形参类型 形参名形参名,. ); 或或 函数类型函数类型 函数名函数名();l作用:告诉编译系统作用:告诉编译系统函数类型、参数个数函数类型、参数个数及类型,以便检验及类型,以便检验l函数定义函数定义与与函数声明函数声明不同,不同,函数声明只是函数声明只是对编译系统的一个说明,通知系统在本函对编译系统的一个说明,通知系统在本函数中所调用的函数是什么类型,函数声明数中所调用的函数是什么类型,函数声明是一个说明语句,必须以是一个说明语句,必须以分号分号结束!结束! 声明声明可以不写可以不写形参名形参名,只写,只写形参类型形参类型。v函数声明位置:函数声明位置:程序的数据说明部分程

24、序的数据说明部分(函数内或外)(函数内或外) 声明是不开辟内存的,仅仅告诉编译器,要声明的部分存在,要预留一点声明是不开辟内存的,仅仅告诉编译器,要声明的部分存在,要预留一点空间。定义则需要开辟内存。空间。定义则需要开辟内存。 C语言程序设计 第七章第七章 函数函数#include void main() float add(float x,float y ); /*对被调用函数的声明对被调用函数的声明*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, fl

25、oat y) /*函数首部函数首部*/ float z; /*函数体函数体 z=x+y; return(z); float add(float,float);例例7.5 对被调用的函数作声明对被调用的函数作声明输入:输入:3.6 ,6.5输出:输出:sum is 10.10000024v说明:说明:l被调用函数的定义(程序)在主调函数之后,被调用函数的定义(程序)在主调函数之后,则则必须在主调函数里面,对被调函数进行声明必须在主调函数里面,对被调函数进行声明。需要说明的是,如果在需要说明的是,如果在TC编译环境里面,当被调函数编译环境里面,当被调函数是有返回值,且返回值的数据类型是整型或字符型

26、是有返回值,且返回值的数据类型是整型或字符型,可以不对被调函数加以声明。可以不对被调函数加以声明。l被调用函数的定义(程序)在主调函数之前,被调用函数的定义(程序)在主调函数之前,可以不加函数声明。可以不加函数声明。l在所有函数定义前,已在函数外部做了函数声在所有函数定义前,已在函数外部做了函数声明,则在各主调函数中可以不加函数声明。明,则在各主调函数中可以不加函数声明。 C语言程序设计 第七章第七章 函数函数#include float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%

27、f,&a,&b); c=add(a,b); printf(sum is %f,c);void main() float a,b; int max(float x,float y); 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(c

28、har c1,char c2)float f(float x,float y)Int I(float j,float k) C语言程序设计 第七章第七章 函数函数main()调调fun()结束结束fun()返回返回保存:保存:返回地址返回地址当前现场当前现场恢复:恢复:主调程序现场主调程序现场返回地址返回地址函数调用的执行过程函数调用的执行过程7.5 函数的嵌套调用函数的嵌套调用 C语言程序设计 第七章第七章 函数函数 不允许嵌套定义不允许嵌套定义,函数间的关系是平行的、独立的。,函数间的关系是平行的、独立的。 C中的函数:中的函数: 允许嵌套调用允许嵌套调用,即在调用某函数过程中又调用另一函

29、数。,即在调用某函数过程中又调用另一函数。main( )调用函数调用函数a结束结束a函数函数b函数函数调用函数调用函数b27 C语言程序设计 第七章第七章 函数函数#include int fun1(int x,int y);void main(void) int a,b; scanf(“%d%d”,&a,&b); printf(“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)

30、;例例 输入两个整数,求平方和输入两个整数,求平方和输入:输入: 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 main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d);例例 求三个数中最大数和最小数的差值求三个数中最大数和最小数的

31、差值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( )调用函数调用函数dif输出输出结束结束dif函数函数max函数函数调用函数调用函数max调用函数调用函数minmin函数函数skip7.6 函数的递归调用函数的递归调用递归:递归:在函数调用过程中,直接或间接的调用自身。在函数调用过

32、程中,直接或间接的调用自身。递归调用方式递归调用方式v直接递归调用:直接递归调用:在函数体内又调用自身在函数体内又调用自身 C语言程序设计 第七章第七章 函数函数f( )调调fint f(int x) int y,z; z=f(y); . return(2*z);30v间接递归调用:间接递归调用:当函数当函数1去调用另一函数去调用另一函数2时时,而而另一函数另一函数2反过来又调用函数反过来又调用函数1自身。自身。 C语言程序设计 第七章第七章 函数函数调调f2调调f1f1( )f2( )int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(i

33、nt t) int a,c; c=f1(a); . return(3+c);v解决无终止递归调用的方法是:确定好结束递解决无终止递归调用的方法是:确定好结束递归的条件。归的条件。 条件成立,进行递归条件成立,进行递归 用用if语句控制语句控制 条件不成立,结束递归条件不成立,结束递归 C语言程序设计 第七章第七章 函数函数例例7.7 有有5个人,第个人,第5个人比第个人比第4个人大个人大2岁,第岁,第4个人比第个人比第3个人大个人大2岁,岁,第第2个人比第个人比第1个人大个人大2岁,第岁,第1个人个人10岁,问第岁,问第5个人多大?个人多大? age(5) age(4) age(3) age(

34、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); #include void main( ) printf(“%d n”, age(5);运行结果:运行结果:18有些问题,可以用递推,也可以用递归的方法解决。有些问题,可以用递推,也可以用递归的方法解决。v递推递推:从一个从一个已知的事实已知的事实出发出发,按一定

35、规律推出下按一定规律推出下一个事实一个事实,再从已知的新的事实再从已知的新的事实,推出下一个新的推出下一个新的事实事实. C语言程序设计 第七章第七章 函数函数例例 用递推法求用递推法求n! ,即从即从1开始开始, 乘乘2, 乘乘3.一直到一直到n #include void main( ) int i, s=1; for(i=1;i=5;i+) s=s* i; printf(“s=%d n”,s); 运行结果:运行结果:s=12033v递归递归:在函数调用自身时在函数调用自身时,要要给出结束递归的条件给出结束递归的条件。l先回推再递推先回推再递推l如:如:n!,!, 5!=5 4! 4!=4

36、 3! 3!=3 2! 2!=2 1! 1!=1 0!=1 C语言程序设计 第七章第七章 函数函数 1 (n=0,1) n!= n*(n-1)! (n1)#include void main() 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

37、=fac(n-1)*n; return(f);运行:运行:input a integer number:1010! = 3628800例例7.8 用递归方法求用递归方法求n! C语言程序设计 第七章第七章 函数函数例例7.9 Hanoi(汉诺)塔问题(汉诺)塔问题 BCAv方法与步骤方法与步骤l将将A上上n-1个盘子借助个盘子借助C移到移到B 。l把把A上剩下一个盘子送到上剩下一个盘子送到Cl将将n-1个盘子从个盘子从B借助借助A移到移到C C语言程序设计 第七章第七章 函数函数BCAv简化实例:简化实例:将将A上上3个盘子移到个盘子移到C步骤:步骤:1. A上两个盘子借助上两个盘子借助C移到

38、移到B 2. A上最后一个盘子移到上最后一个盘子移到C (可直接完成)(可直接完成) 3. B上两个盘子借助上两个盘子借助A移到移到C 第一步进一步分解:第一步进一步分解: 1.1 A上一个盘子(上一个盘子(红色红色)从)从AC 1.2 A上一个盘子(上一个盘子(蓝色蓝色)从)从AB 1.3 C上一个盘子(上一个盘子(红色红色)从)从CB 第三步进一步分解:第三步进一步分解: 3.1 B上一个盘子(上一个盘子(红色红色)从)从BA 3.2 B上一个盘子(上一个盘子(蓝色蓝色)从)从BC3.3 A上一个盘子(上一个盘子(红色红色)从)从AC36v结论:结论:上面三个步骤包含两类操作上面三个步骤包

39、含两类操作l步骤步骤1和和3都是将都是将n-1个盘子从一个个盘子从一个移到另一个移到另一个上上(n1时时),这是一个递归的过程;,这是一个递归的过程;方法一样,只是针的名方法一样,只是针的名称不同而已,为使问题一般化,将步骤称不同而已,为使问题一般化,将步骤1和和3表示为:将表示为:将one上的上的n-1个盘子移到个盘子移到two,借助,借助 three,只是对,只是对应关系不同。应关系不同。第一步对应关系:第一步对应关系:one A two B three C 第三步对应关系:第三步对应关系:one B two C three A l将将1个盘子从一个针上移到另一针上。个盘子从一个针上移到另

40、一针上。v因此,可以用两个函数分别实现上面两类操作,因此,可以用两个函数分别实现上面两类操作,用用hanoi函数实现第一类操作,用函数实现第一类操作,用move函数实现第函数实现第二类操作。二类操作。lhanoi(n,one,two,three) 将将n个盘从个盘从 one three借助借助twolmove(x,y) 将将1个盘从个盘从x y座,座,x、y根据情况取代根据情况取代ABC座中的座中的1个。个。 C语言程序设计 第七章第七章 函数函数37 C语言程序设计 第七章第七章 函数函数例例7.9 用递归方法解决用递归方法解决Hanoi(汉诺)塔问题的程序(汉诺)塔问题的程序 #inclu

41、de 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 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,

42、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 step to moving 3 diskes: A C A B C B A C B A B C A C387.7 数组作为函数参数数组作为函数参数数组元素作函数实参数组元素作函数实参值传递值传递 C语言程序设计 第七章第七章 函数函数例例8.10 两个数组比较大小两个数组比较大小 432105a562312107688

43、432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2n=0m=0k=1n=0m=1k=1n=1m=1k=1n=1m=1k=2n=2m=1k=239 C语言程序设计 第七章第七章 函数函数#include void main() int large(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); pri

44、ntf(Enter array b:n); for(i=0;i10;i+) scanf(%d,&bi); printf(n); for(i=0;ibi%d timesn”,n); printf(“ai=bi%d timesn”,m); printf(“aik) printf(“array a is larger than array bn”); else if(ny) flag=1; else if(x bi 4 time ai = bi 1 time ai bi 5 time array a is large then array b数组名可作函数参数数组名可作函数参数实参和形参都用

45、数组名实参和形参都用数组名 C语言程序设计 第七章第七章 函数函数例例7.11 求学生的平均成绩求学生的平均成绩 float average(float array10) int i; float aver,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;

46、 i+ ) scanf(%f, &scorei); printf(“n”); aver=average(score); printf(Average is: %5.2f, aver);.2109score562312.88array几点说明:几点说明: C语言程序设计 第七章第七章 函数函数v地址传递地址传递l调用函数时,对形参数组元素的操作,调用函数时,对形参数组元素的操作,实际上也是对实参数组元素的操作。实际上也是对实参数组元素的操作。v在主调函数与被调函数分别定义数组在主调函数与被调函数分别定义数组,且类且类型应一致型应一致l如:如:array是形参数组名,是形参数组名,scor

47、e是实参数是实参数组名。组名。v形参数组大小形参数组大小(多维数组第一维多维数组第一维)可不指定可不指定l在定义数组时在数组名后面跟一个空在定义数组时在数组名后面跟一个空的方括弧的方括弧lC编译对形参数组大小不检查,即使编译对形参数组大小不检查,即使定义了也不起作用。定义了也不起作用。v形参数组名是形参数组名是地址变量地址变量 l调用时,只是将实参数组的调用时,只是将实参数组的首地址首地址传传给形参数组,给形参数组,l 因此因此scoren和和arrayn指的是同一单指的是同一单元元43 C语言程序设计 第七章第七章 函数函数例例7.12 求两组学生的平均成绩,求两组学生的平均成绩,形参数组长

48、度缺省形参数组长度缺省 #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(“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(

49、float array ,int n) int i; float aver,sum=array0; 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 78.20v数组名作函数参数时,实参和形参数组名作函数参数时,实参和形参两个数组两个数组共占同一段内存单元共占同一段内存单元,形,形参数组的元素值改变会使实参数组参数组的元素值改变会使实参数组元素的值同时变化。元素的值同时变化。 C语言程序设计 第七章

50、第七章 函数函数用多维数组名作函数参数用多维数组名作函数参数v可以用多维数组名作实参和形参可以用多维数组名作实参和形参v形参数组定义时,形参数组定义时,只能省略第一维的大小说明只能省略第一维的大小说明。lC编译不检查第一维的大小,而且数组名作编译不检查第一维的大小,而且数组名作函数参数是地址传送,所以函数参数是地址传送,所以形参数组第一维形参数组第一维大小任意,可以和实参数组的维数不同大小任意,可以和实参数组的维数不同。 如,实参数组定义:如,实参数组定义:int score510,则,则形参数组可以定义:形参数组可以定义:int array310 或或 int array810l合法的定义:

51、合法的定义:int array310; 或或 int array 10l错误的定义:错误的定义:int array ; int array3 ; C语言程序设计 第七章第七章 函数函数50 C语言程序设计 第七章第七章 函数函数例例7.14 求求34矩阵中各元素的最大值矩阵中各元素的最大值 #include void main()int max_value(int array 4); int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf(max value is %dn,max_value(a);int max_value(int array34) int i

52、,j,k,max; max=array00; for(i=0;i3;i+) for(j=0;jmax) max=arrayij; return(max);多维形参数组第一维维数多维形参数组第一维维数可省略可省略,第二维必须相同第二维必须相同 int array4 C语言程序设计 第七章第七章 函数函数例例 求求二维数组中各行元素之和二维数组中各行元素之和get_sum_row(int x3, int result ,int row, int col) int i,j; for(i=0;irow;i+) resulti=0; for(j=0;jcol;j+) resulti+=xij;main(

53、) int a23=3,6,9,1,4,7; int sum_row2,row=2,col=3,i; get_sum_row(a,sum_row,row,col); for(i=0;irow;i+) printf(The sum of row%d=%dn,i+1,sum_rowi);314679asum_rowxresult1812527.8 局部变量和全局变量局部变量和全局变量变量按其作用域,可分为局部变量和全局变量。变量按其作用域,可分为局部变量和全局变量。局部变量局部变量内部变量内部变量v定义:在定义:在函数内定义函数内定义,只在本函数内有效只在本函数内有效v说明:说明:lmain中定义

54、的变量只在中定义的变量只在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,

55、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

56、5void main() 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有效范围:从有效范围:从定义变量的位置开始定义变量的位置开始到本到本源文件结束,及有外部型(源文件结束

57、,及有外部型(extern)说明说明的其它源文件的其它源文件v几点说明:几点说明:l全局变量的使用全局变量的使用,增加了函数间数据联增加了函数间数据联系的渠道系的渠道,同一文件中的所有函数都能同一文件中的所有函数都能引用全局变量的值引用全局变量的值,当某函数改变了全当某函数改变了全局变量的值时局变量的值时,便会影响其它的函数。便会影响其它的函数。 C语言程序设计 第七章第七章 函数函数l习惯上,全局变量名的第一个字母用习惯上,全局变量名的第一个字母用大写。大写。l使用全局变量可以减少函数的实参和使用全局变量可以减少函数的实参和形参个数。形参个数。l不必要时不要使用全局变量不必要时不要使用全局变

58、量u全局变量在程序执行的全过程都占全局变量在程序执行的全过程都占用存储单元。用存储单元。u不利于程序的移植。程序的可读性不利于程序的移植。程序的可读性变差。变差。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语言程序设计 第七章第七章

59、函数函数例例 全局变量的作用域及其使用情况全局变量的作用域及其使用情况int a=1; f1( ) int b; b=a+3; printf(“f1:a=%d, b=%d n”,a, b); f2( ) int a, b; a=5; b=a+3; printf(“f2: a=%d, b=%d n”,a, b); f3( ) int b; a=6; b=a+3; printf(“f3:a=%d, b=%d n”,a, b); void main( ) int b=3; printf(“1.main : a=%d, b=%d n”,a, b); f1( ); printf(“2.main : a=

60、%d, b=%d n”,a, b); f2( ); printf(“3.main : a=%d, b=%d n”,a, b); f3( ); printf(“4.main : a=%d, b=%d n”,a, b); 运行:运行: 1.main:a=1, b=3 f1:a=1, b=4 2.main:a=1, b=3 f2:a=5, b=8 3.main:a=1, b=3 f3:a=6, b=94.main:a=6, b=3 C语言程序设计 第七章第七章 函数函数例例7.15 外部变量与局部变量同名外部变量与局部变量同名#include int a=3,b=5;void main() int max(int a, int b); int a=8; printf(max=%d,max(a,b);int max(int a, int b) int c; c=ab?a:b; return(c);运行结果:运行结果:max=8例例 外部变量副作用外部变量副作用int i

温馨提示

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

最新文档

评论

0/150

提交评论