C语言程序设计教案 函数程序设计() 内容 说明 主要内容1.函数的概念、定义格式 2.函数的调用方法 3.函数的形式参数、实际参数和函数的返回值 重点1.函数的定义格式 2.函数的调用方法 3.函数的返回值 难点1.函数的定义格式 2.函数的调用方法 、问题的引入 在程序设计中,常将一些常用的功能模块编写成函数,放在函数库 中供公共选用,以减少重复编写程序段的工作量。 个较大的程序一般应分为若干个程序模块,每一个模块用来实现 个特定的功能。所有高级语言中都有子程序这个概念,用子程序实现 模块的功能。在C语言中,子程序的作用是由函数完成的。一个C程序 可由一个主函数和若干个函数构成,由主函数调用其它函数,其它函数 也可以相互调用。同一个函数可以被一个或多个函数调用任意多次。 函数的概念 定义:函数是一个可反复使用的程序段,其它的程序段均可通过调 用语句来执行这段程序 三、函数的分类 1.从用户使用的角度分 (1)系统函数:即库函数,由系统提供,用户可直接使用 结合例子 (2)用户自定义函数:为满足特定需要用户自己定义的函数。 讲解函数 2.从函数的形式分 的分类 (1)有参函数:被调用时需接受主调函数传递来的数据。 (2)无参函数:被调用时不需要主调函数传递数据 四、函数的定义 (1)有参函数的定义格式 存储类型说明符数据类型说明符函数名(形式参数表) 形式参数说明序列 重点是用 数据定义语句序列 户自定义 执行语句序列 函数 (2)无参函数的定义格式: 存储类型说明符数据类型说明符函数名() 数据定义语句序列; 执行语句序列
C 语言程序设计教案 函数程序设计(一) 内容 说明 主要内容 重点 难点 1.函数的概念、定义格式 2.函数的调用方法 3.函数的形式参数、实际参数和函数的返回值 结合例子 讲解函数 的分类 重点是 用 户自定义 函数 1.函数的定义格式 2.函数的调用方法 3.函数的返回值 1.函数的定义格式 2.函数的调用方法 一、问题的引入 在程序设计中,常将一些常用的功能模块编写成函数,放在函数库 中供公共选用,以减少重复编写程序段的工作量。 一个较大的程序一般应分为若干个程序模块,每一个模块用来实现 一个特定的功能。所有高级语言中都有子程序这个概念,用子程序实现 模块的功能。在 C 语言中,子程序的作用是由函数完成的。一个 C 程序 可由一个主函数和若干个函数构成,由主函数调用其它函数,其它函数 也可以相互调用。同一个函数可以被一个或多个函数调用任意多次。 二、函数的概念 定义:函数是一个可反复使用的程序段,其它的程序段均可通过调 用语句来执行这段程序。 三、函数的分类 1.从用户使用的角度分 (1)系统函数:即库函数,由系统提供,用户可直接使用。 (2)用户自定义函数:为满足特定需要用户自己定义的函数。 2.从函数的形式分 (1)有参函数:被调用时需接受主调函数传递来的数据。 (2)无参函数:被调用时不需要主调函数传递数据。 四、函数的定义 (1)有参函数的定义格式: 存储类型说明符 数据类型说明符 函数名(形式参数表) 形式参数说明序列; { 数据定义语句序列; 执行语句序列; } (2)无参函数的定义格式: 存储类型说明符 数据类型说明符 函数名() { 数据定义语句序列; 执行语句序列; }
C语言程序设计教案 举例 说明 说明 ①存储类型说明符 可以是 extern或 static两种。 exteri定义的函数叫做外部函数 可被其它编译单位中的函数调用: static定义的函数称内部函数,只 能被本编译单位中的函数调用。该项可省略,默认为外部函数 ②数据类型说明符 规定本函数返回值的数据类型。可是前面介绍的各种基本数据类 型,也可是指针型或“void”型,表示本函数无返回值 ③函数名 是一个标识符,在同一编译单位中函数不能重名 ④形式参数表 每个形式参数可是一个变量名、数组名、指针变量名、指针数组名 ⑤形式参数说明序列 若干条形式参数的说明语句,数据类型相同的形式参数可用一条说 明语句说明。语句格式为:数据类型形式参数1,… ⑥数据定义语句序列 由本函数中使用的变量、数组、指针变量等的定义语句组成 ⑦执行语句序列 由本函数中完成函数功能的程序段组成。在本序列中可以有一条返 回语句“ return(表达式):”,返回语句【 return】的功能是结束本函数 的运行,返回到主调函数的调用语句后继续执行。其中表达式的值就是 本函数的返回值 任何函数都有返回值,且只能有一个。当函数没有指明返回值,即 “ return;”或没有返回语句时,函数执行后实际上不是没有返回值,而 是返回一个不确定的值,有可能给程序带来某种意外的影响。因此,为 了保证函数不返回任何值,C语言规定,可以定义无类型函数,其形式 为: void函数名(形参表) 【例】编写一个函数,求2个整型数的最大值并返回这个最大值。 程序清单 scanf(“%d,%d”,&a,&b) c=max(a, b) printf(“max=%d”,c); z =x>y? x: y return(z) } 五、函数的调用 主调函数通过传递一定的信息来使用被调函数的功能 1.无返回值的函数调用格式 函数名(实际参数表) 此格式作为语句形式调用,最后有“;
C 语言程序设计教案 举例 说明 说明: ①存储类型说明符 可以是 extern 或 static 两种。extern 定义的函数叫做外部函数, 可被其它编译单位中的函数调用;static 定义的函数称内部函数,只 能被本编译单位中的函数调用。该项可省略,默认为外部函数。 ②数据类型说明符 规定本函数返回值的数据类型。可是前面介绍的各种基本数据类 型,也可是指针型或“void”型,表示本函数无返回值。 ③函数名: 是一个标识符,在同一编译单位中函数不能重名。 ④形式参数表 每个形式参数可是一个变量名、数组名、指针变量名、指针数组名 等。 ⑤形式参数说明序列 若干条形式参数的说明语句,数据类型相同的形式参数可用一条说 明语句说明。语句格式为:数据类型 形式参数 1,…; ⑥数据定义语句序列 由本函数中使用的变量、数组、指针变量等的定义语句组成。 ⑦执行语句序列 由本函数中完成函数功能的程序段组成。在本序列中可以有一条返 回语句“return(表达式);”,返回语句【return】的功能是结束本函数 的运行,返回到主调函数的调用语句后继续执行。其中表达式的值就是 本函数的返回值。 任何函数都有返回值,且只能有一个。当函数没有指明返回值,即 “return;”或没有返回语句时,函数执行后实际上不是没有返回值,而 是返回一个不确定的值,有可能给程序带来某种意外的影响。因此,为 了保证函数不返回任何值,C 语言规定,可以定义无类型函数,其形式 为: void 函数名(形参表) { …… } 【例】编写一个函数,求 2 个整型数的最大值并返回这个最大值。 程序清单: main() { int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“max=%d”,c); } int max(int x,int y) { int z; z=x>y?x∶y; return(z); } 五、函数的调用 主调函数通过传递一定的信息来使用被调函数的功能。 1.无返回值的函数调用格式 函数名(实际参数表); 此格式作为语句形式调用,最后有“;
C语言程序设计教案 2.有返回值的函数调用格式 变量名=函数名(实际参数表); 3.函数的调用过程 (1)为所有的形参分配内存,计算各个实际参数表达式的值,依 次赋予对应的形式参数。(若是“无参函数”,上述工作不执行) (2)进入函数体,执行函数中的语句,实现函数的功能,当执行 到“返回语句”时,计算返回值,释放本函数体中的变量等(静态型变 量不释放),收回分配给形参的内存,返回主调函数。 (3)继续执行主调函数中的后继语句。 4.函数调用时对被调函数的说明方法 (1)调用系统函数时,除少数系统函数(如 scanf、 printf等)外, 都要求在程序的开始用包含命令“# include”将定义系统函 数的库文件包含在本程序中 (2)如果被调函数和主调函数在一个源程序文件中,在书写顺序 上被调函数在主调函数之前出现:或者被调函数虽然在主调函数之后出 现,而被调函数的数据类型是整型或字符型,可不对被调函数加以说明 除上述2种情况为,都要对被调函数加以说明。 说明的位置一般在主调函数的函数体开头的数据说明语句部分。 格式:数据类型被调函数名(); (3)如果被调的用户函数和主调函数不在同一个源程序文件中,则 在定义函数的源程序文件中用下列方式将函数定义成外部函数 extern数据类型函数名(形式参数表) 同时在主调函数的函数体中,或所在源程序文件的开头将要调用的 函数说明成“外部函数 格式: extern数据类型被调函数名() 【例】根据三边长求出三角形的面积 #include 现在主调函 float sabc(float a, float b, float c) 数之前,不必 I float hl, s 说明。 hl=0.5*(a+b+c) s= sgrt(hl*(hl-a)*(h1-b)*(hI-c)) return (s) main() t float x, y, z, area scanf(“%f,%f,%f”,&x,&y,&z) if((x+y>z)&&(y+z>x)&&(z+x>y) printf(″该三角形面积等于%5.2fⅦn”,sabc(x,y,z)) printf(”不能构成三角形!n”) 六、小结 函数定义、调用方法; return语句
C 语言程序设计教案 2. 有返回值的函数调用格式 变量名=函数名(实际参数表); 3. 函数的调用过程 (1)为所有的形参分配内存,计算各个实际参数表达式的值,依 次赋予对应的形式参数。(若是“无参函数”,上述工作不执行) (2)进入函数体,执行函数中的语句,实现函数的功能,当执行 到“返回语句”时,计算返回值,释放本函数体中的变量等(静态型变 量不释放),收回分配给形参的内存,返回主调函数。 (3)继续执行主调函数中的后继语句。 4.函数调用时对被调函数的说明方法 (1)调用系统函数时,除少数系统函数(如 scanf、printf 等)外, 都要求在程序的开始用包含命令“#include”将定义系统函 数的库文件包含在本程序中。 (2)如果被调函数和主调函数在一个源程序文件中,在书写顺序 上被调函数在主调函数之前出现;或者被调函数虽然在主调函数之后出 现,而被调函数的数据类型是整型或字符型,可不对被调函数加以说明; 除上述 2 种情况为,都要对被调函数加以说明。 说明的位置一般在主调函数的函数体开头的数据说明语句部分。 格式:数据类型 被调函数名( ); (3)如果被调的用户函数和主调函数不在同一个源程序文件中,则 在定义函数的源程序文件中用下列方式将函数定义成外部函数: extern 数据类型 函数名(形式参数表) 同时在主调函数的函数体中,或所在源程序文件的开头将要调用的 函数说明成“外部函数“。 格式: extern 数据类型 被调函数名( ); 【例】根据三边长求出三角形的面积。 #include #include float sabc(float a,float b,float c) { float hl,s; hl=0.5*(a+b+c); s= sqrt(hl*(hl-a)*(hl-b)*(hl-c)) return (s); } main( ) { float x,y,z,area; scanf(“%f,%f,%f”,&x,&y,&z); if ((x+y>z)&&(y+z>x)&&(z+x>y)) printf(″该三角形面积等于%5.2f \n″, sabc(x, y, z)); else printf(″不能构成三角形!\n″); } 六、小结 函数定义、调用方法;return 语句; 被 调 函 数 出 现 在 主 调 函 数之前, 不必 说明
C语言程序设计教案 函数程序设计(二) 内容 说明 主要内容 函数调用中的数据传递方法 函数调用中的数据传递方法 难点 函数调用中的数据传递方法 函数调用中的数据传递方式 函数间传递数据的方式有:值传递;地址传递:返回值传递:全局 变量传递。前2种利用函数的参数来传递数据,后2种不是利用函数参 数传递数据。 1.值传递方式 ①是在形式参数和实际参数之间传递数据 ②所传递的是参数值 调用函数时,将实际参数的值求出赋予对应的形式参数。在函数体 中对形参的处理与实参无关。当函数体执行完毕,形参的值可能发生变 化,但返回后,形参的值不带回到对应的实参中 ③特点:参数值的单向传递 ④形参一般是变量:实参可是变量或表达式。 【例】调用函数时的数值传递 #include<stdio h x, int y); 结合例子 讲解值传 Int a. 递方式 a=10:b=20 /*说明两个变量并赋初值* printf("before swap: a=%d, b=%d\n", a, b) swap(a, b) *用变量a和b作为实际参数调用函数*/ printf("after swap a=%d, b=%d\n",a, b); void swap(int x, int y) /*借助临时变量temp交换两个形参变量ⅹ和y的值* printf("in swap x=%d, y=%d\n,x,y); 在调用swap时其各个参数和变量的状态和相互关系可用下图描述 在main两数中 在swap函数中 实参a 形参x
C 语言程序设计教案 函数程序设计(二) 内容 说明 主要内容 重点 难点 函数调用中的数据传递方法 结合例子 讲解值传 递方式 函数调用中的数据传递方法 函数调用中的数据传递方法 一、函数调用中的数据传递方式 函数间传递数据的方式有:值传递;地址传递;返回值传递;全局 变量传递。前 2 种利用函数的参数来传递数据,后 2 种不是利用函数参 数传递数据。 1.值传递方式 ① 是在形式参数和实际参数之间传递数据 ② 所传递的是参数值 调用函数时,将实际参数的值求出赋予对应的形式参数。在函数体 中对形参的处理与实参无关。当函数体执行完毕,形参的值可能发生变 化,但返回后,形参的值不带回到对应的实参中。 ③ 特点:参数值的单向传递 ④ 形参一般是变量;实参可是变量或表达式。 【例】 调用函数时的数值传递。 #include void swap(int x, int y); main ( ) { int a, b; a=10; b=20; /* 说明两个变量并赋初值 */ printf ("before swap: a=%d, b=%d\n", a, b); swap(a, b); /* 用变量 a 和 b 作为实际参数调用函数 */ printf ("after swap a=%d, b=%d\n", a, b); } void swap (int x, int y) { int temp; /* 借助临时变量 temp 交换两个形参变量 x 和 y 的值 */ temp = x; x = y; y = temp; printf ("in swap x=%d, y=%d\n", x, y); } 在调用 swap 时其各个参数和变量的状态和相互关系可用下图描述。 10 20 10 20 实参a 实参b 形参x 形参y 复制 复制 temp 在main函数中 在swap函数中
在程序中调用swap时,实参变量a和b的值传递给了形参变量x 和y,并且在函数的内部完成了x和y值的交换,但是x和y与a和b 各自使用自己的内存区域,它们之间仅仅在参数传递时进行了数值的传 递,所以变量x和y的变化并不影响变量a和b。 程序的实际运行结果为: before swap a=10, b=20 in swap x20, y=10 after swap a=10, b=20 如何在被调用函数中改变调用函数中变量的值,这就要使用指针变 量作为参数,这一问题将在后面详细讨论。 2.地址传递方式 ①是在形式参数和实际参数之间传递数据 ②所传递的是地址 调用函数时,将实际参数的地址赋予对应的形式参数作为其地址。 由于形参和实参的地址相同(占用相同的内存),所以调用时,可看成 将实参的值传递给形参:返回时,可看成将形参的值回带给对应的实参 ③特点:参数值的双向传递 ④形参是数组名或指针变量:实参是变量的地址、数组名或指针变 【例】判断一个整数数组中各元素的值,若大于0,则输出该值:若小 于或等于0,则输出0 void funcl(int a[l, int n) Int 1. printf("n数组a的值是:ln”) if(a[]=0)a[=0 print(4d”,a[) i int b[5],i printf("n请输入5个数:ln”) for(i=0,i<5;i++) scanf(%od”&b[]) printf("In数组b的初值是:Ⅶn”) for(i=0;i<5;++) printf(" %4d,, biD) funcl(b, 5) printi(n数组b的终值是:mn”); for(i=0;i<5;i++) printf(%4d”,b])
C 语言程序设计教案 在程序中调用 swap 时,实参变量 a 和 b 的值传递给了形参变量 x 和 y,并且在函数的内部完成了 x 和 y 值的交换,但是 x 和 y 与 a 和 b 各自使用自己的内存区域,它们之间仅仅在参数传递时进行了数值的传 递,所以变量 x 和 y 的变化并不影响变量 a 和 b。 程序的实际运行结果为: before swap a=10, b=20 in swap x=20, y=10 after swap a=10, b=20 如何在被调用函数中改变调用函数中变量的值,这就要使用指针变 量作为参数,这一问题将在后面详细讨论。 2.地址传递方式 ①是在形式参数和实际参数之间传递数据 ②所传递的是地址 调用函数时,将实际参数的地址赋予对应的形式参数作为其地址。 由于形参和实参的地址相同(占用相同的内存),所以调用时,可看成 将实参的值传递给形参;返回时,可看成将形参的值回带给对应的实参。 ③特点:参数值的双向传递 ④形参是数组名或指针变量;实参是变量的地址、数组名或指针变 量 【例】判断一个整数数组中各元素的值,若大于 0,则输出该值;若小 于或等于 0,则输出 0。 void func1(int a[ ],int n) { int i; printf(“\n 数组 a 的值是:\n”); for(i=0;i<n;i++) { if(a[i]<=0) a[i]=0; printf(“%4d”,a[i]); } } main( ) { int b[5],i; printf(“\n 请输入 5 个数:\n”); for(i=0;i<5;i++) scanf(“%d”,&b[i]); printf(“\n 数组 b 的初值是:\n”); for(i=0;i<5;i++) printf(“%4d”,b[i]); func1(b,5); printf(“\n 数组 b 的终值是:\n”); for(i=0;i<5;i++) printf(“%4d”,b[i]); }
举例 说明 【例】若在主函数中变量a=5,b=10,编写一个函数交换主函数中两 个变量的值,使变量a=10,b=5。(指针也可以作为函数的参数,它的 作用是将一个变量的地址传递到另一个函数中。) i void swap(int *x, int *y) a,b,*p, *q /*说明两个变量并赋初值* printf("交换前:a=%d,b=%dn",a,b) swap(p,q),/*用变量a和b作为实际参数调用函数* printf("交换后:a=%d,b=%dn",a,b) void swap( int *x, int *y) Int temp;/*借助临时变量交换两个形参变量ⅹ和y的值* 结合例子 temp=*X, 讲解地址 传递方式 temp 程序输出如下: 交换前:a=5b=10 交换后:a=10b=5 swap()函数中使用两个指针变量x和y作为形参。程序运行时,先 执行main()函数中的给a和b赋值语句,使a的值为5,b的值为10, 并将a和b的地址分别赋给p和q,见下图(a)。main()函数调用swap() 函数时,将实参的值传送给形参变量。虚实结合后,x和p指向的是同 存储单元,y和q指向的是同一存储单元,见下图(b)接着执行swap() 函数体,使*x和*y的值交换,也就是a和b的值的交换,见下图(c) 函数调用结束后,x和y被释放,情况如下图(d)。最后在man(函数 中输出的a和b的值是经过交换的值 运用指针变量作参数,可以在被调函数中改变主调函数中定义的变 量的值
C 语言程序设计教案 举例 说明 【例】 若在主函数中变量 a=5,b=10,编写一个函数交换主函数中两 个变量的值,使变量 a=10,b=5。(指针也可以作为函数的参数,它的 作用是将一个变量的地址传递到另一个函数中。) #include main ( ) { void swap(int *x, int *y); int a, b,*p,*q; a=5; b=10; /* 说明两个变量并赋初值 */ p=&a;q=&b; printf ("交换前:a=%d, b=%d\n", a, b); swap(p, q); /* 用变量 a 和 b 作为实际参数调用函数 */ printf ("交换后:a=%d, b=%d\n", a, b); } void swap ( int *x, int *y) { int temp; /* 借助临时变量交换两个形参变量 x 和 y 的值 */ temp = *x; *x =*y; *y = temp; } 程序输出如下: 交换前:a=5 b=10 交换后:a=10 b=5 swap( )函数中使用两个指针变量 x 和 y 作为形参。程序运行时,先 执行 main( )函数中的给 a 和 b 赋值语句,使 a 的值为 5,b 的值为 10, 并将 a 和 b 的地址分别赋给 p 和 q,见下图(a)。main( )函数调用 swap( ) 函数时,将实参的值传送给形参变量。虚实结合后,x 和 p 指向的是同 一存储单元,y 和 q 指向的是同一存储单元,见下图(b)。接着执行 swap( ) 函数体,使*x 和*y 的值交换,也就是 a 和 b 的值的交换,见下图(c)。 函数调用结束后,x 和 y 被释放,情况如下图(d)。最后在 main( )函数 中输出的 a 和 b 的值是经过交换的值。 &a &b 5 10 a b (a) &a &b 5 10 a b (b) x y &a &b &a &b 10 5 a b (c) x y &a &b &a &b 10 5 a b (d) p q p q q p q p 运用指针变量作参数,可以在被调函数中改变主调函数中定义的变 量的值。 结合例子 讲解地址 传递方式
C语言程序设计教案 3.值传递和地址传递方式的区别 ①值传递:传递的是数值 ②地址传递:传递的是变量地址。 、小结 调用函数时,数据的传递主要是通过形参与实参相结合来实现的 被调用者需从调用处获得多少数据,就应该定义多少个形参。 在函数调用时,实参的个数及其顺序必须与形参的个数及其顺序完全一重点强调 致,其类型必须与形参的类型相同或赋值兼容。 函数使用 三、思考与练习 中应注意 从键盘输入10个浮点数,求出其和及平均值。要求编写求和及求的问题 平均值的函数
C 语言程序设计教案 3.值传递和地址传递方式的区别 ①值传递:传递的是数值 ②地址传递:传递的是变量地址。 二、小结 调用函数时,数据的传递主要是通过形参与实参相结合来实现的, 被调用者需从调用处获得多少数据,就应该定义多少个形参。 在函数调用时,实参的个数及其顺序必须与形参的个数及其顺序完全一 致,其类型必须与形参的类型相同或赋值兼容。 三、思考与练习 从键盘输入 10 个浮点数,求出其和及平均值。要求编写求和及求 平均值的函数。 重点强调 函数使用 中应注意 的问题
C语言程序设计教案 函数程序设计(三) 内容 说明 主要内容1.函数的嵌套调用 2.函数的递归调用简 函数的嵌套调用 函数的嵌套调用 函数的嵌套调用 在调用一个函数的过程中,又调用另一个函数。 main函数 a函数 b函数 ③ 调用b函数 调用a函数 结束 【例】求两个数的最小公倍数(函数的嵌套调用方法)。 #include<stdio h gbs(int x, int y) 注意嵌套 int z, f. 调用的 zgys(x, y) 方法 return f gys( int a, int b) i int r r=%ob while(r!=0) fa=b b=r ra%b; i return b i int m, n,p, printf("input m, n") scanf("%d, %d", &m, &n) p=gbs(m, n)
C 语言程序设计教案 函数程序设计(三) 内容 说明 主要内容 重点 难点 1. 函数的嵌套调用 2. 函数的递归调用简介 函数的嵌套调用 函数的嵌套调用 一、函数的嵌套调用 在调用一个函数的过程中,又调用另一个函数。 【例】求两个数的最小公倍数(函数的嵌套调用方法)。 #include gbs(int x,int y) { int z,f; z=gys(x,y); f=x*y/z; return f; } gys(int a,int b) { int r; r=a%b; while(r!=0) {a=b;b=r;r=a%b;} return b; } main() { int m,n,p; printf("input m,n"); scanf("%d,%d",&m,&n); p=gbs(m,n); printf("%d\n",p); } main 函数 调用 a 函数 结束 a 函数 调用 b 函数 b 函数 ① ② ③ ④ ⑤ ⑦ ⑥ ⑧ ⑨ 注意嵌套 调用的 方法
C语言程序设计教案 此程序中,函数main()调用了gbs()、gbs()调用函数gys(), 实现了嵌套调用 C语言规定:不限制嵌套调用的层数,嵌套调用的层数仅受计算机内 存的限制 函数的递归调用 1.定义:在调用一个函数的过程中又出现直接或间接地调用该函数 本身 如图所示 f函数 f函数 f2函数 调用f函数 调用n函数 调用f1函数 直接调用本函数 间接调用本函数 2.递归过程必须解决两个问题 (1)递归计算的公式 (2)递归结束的条件 3.递归过程的算法描述 if(递归结束条件) return递归结束条件下的返回值) else return(递归计算公式) 4.递归调用函数的调用方法和一般函数的调用方法完全相同 E、小结 递归定义、调用方法、执行过程、递归的算法。 四、思考与练习 写几个函数:a、输入10个职工的姓名和职工号b、按职工号有小到 大顺序排序,姓名顺序也随之调整c、要求输入一个职工号,用折半查找 的方法找出该职工的姓名,从主函数输入要查询的职工号,输出该职工的 姓名
C 语言程序设计教案 此程序中,函数 main()调用了 gbs()、gbs()调用函数 gys(), 实现了嵌套调用。 C 语言规定:不限制嵌套调用的层数,嵌套调用的层数仅受计算机内 存的限制。 二、函数的递归调用 1.定义: 在调用一个函数的过程中又出现直接或间接地调用该函数 本身。 如图所示: 2.递归过程必须解决两个问题 (1) 递归计算的公式 (2) 递归结束的条件 3.递归过程的算法描述: if (递归结束条件)return 递归结束条件下的返回值); else return (递归计算公式); 4.递归调用函数的调用方法和一般函数的调用方法完全相同 三、小结 递归定义、调用方法、执行过程、递归的算法。 四、思考与练习 写几个函数:a、输入 10 个职工的姓名和职工号 b、按职工号有小到 大顺序排序,姓名顺序也随之调整 c、要求输入一个职工号,用折半查找 的方法找出该职工的姓名,从主函数输入要查询的职工号,输出该职工的 姓名。 f 函数 调用 f 函数 直接调用本函数 调用 f2 函数 调用 f1 函数 f1 函数 f2 函数 间接调用本函数
C语言程序设计教案 函数程序设计(四) 内容 说明 主要内容1、变量的作用域 2、变量的存储类别 3、内部函数和外部函数 重点 变量的作用域 变量的作用域 、变量的作用域、局部变量和全局变量 1、变量的作用域规则 变量只能在它的作用范围内使用,变量的作用域与定义变量的位置有 2、局部变量 在一个函数内部(或复合语句内部)定义的变量是内部变量,它只在 本函数范围内有效 ①函数不能使用其他函数中定义的变量 ②不同函数中可使用相同名字的变量,它们代表不同的对象,互不干 扰。 ③形式参数也是局部变量 函数内部,在复合语句中定义的变量只在本复合语句中有效 局部变量也称为内部变量。局部变量是在函数内定义的。其作用域仅 限于本函数内,其它函数是不能访问这些变量的 例如 nt funcl (int a) /*函数fncl*/ i int b, c: 结合例子 /*函数func2*/ 讲解局部 i int y, z; 变量的作 用域 maino /*主函数main*/ i int m, n funcl(m) func2(n) 在函数 fungI()内定义了三个变量,a为形参,b和c为一般变量。在 uncle()的范围内a、b、c有效,或者说a、b、c变量的作用域限于 funcl() 内。同理,x、y、z的作用域限于func2()内。m、n的作用域限于main() 函数内。 关于局部变量的作用域还要说明以下几点 ①主函数中定义的变量也只能在主函数中使用,不能在其它函数中使 用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是 个函数,它与其它函数是平等关系 ②形参也属于局部变量
C 语言程序设计教案 函数程序设计(四) 内容 说明 主要内容 重点 难点 1、变量的作用域 2、变量的存储类别 3、内部函数和外部函数 结合例子 讲解局部 变量的作 用域 变量的作用域 变量的作用域 一、变量的作用域、局部变量和全局变量 1、变量的作用域规则 变量只能在它的作用范围内使用,变量的作用域与定义变量的位置有 关。 2、局部变量 在一个函数内部(或复合语句内部)定义的变量是内部变量,它只在 本函数范围内有效。 ①函数不能使用其他函数中定义的变量 ②不同函数中可使用相同名字的变量,它们代表不同的对象,互不干 扰。 ③形式参数也是局部变量 函数内部,在复合语句中定义的变量只在本复合语句中有效。 局部变量也称为内部变量。局部变量是在函数内定义的。其作用域仅 限于本函数内,其它函数是不能访问这些变量的。 例如: int func1(int a) /*函数 func1*/ { int b, c; ……} int func2(int x) /*函数 func2*/ { int y,z; ……} main() /*主函数 main*/ { int m,n; func1(m); func2(n); } 在函数 func1( )内定义了三个变量,a 为形参,b 和 c 为一般变量。在 func1( )的范围内 a、b、c 有效,或者说 a、b、c 变量的作用域限于 func1( ) 内。同理,x、y、z 的作用域限于 func2( )内。 m、n 的作用域限于 main( ) 函数内。 关于局部变量的作用域还要说明以下几点: ①主函数中定义的变量也只能在主函数中使用,不能在其它函数中使 用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是 一个函数,它与其它函数是平等关系。 ② 形参也属于局部变量