当前位置:首页 >> 其它课程 >>

C课件第10讲(09级)1


Program Design in C Language

第七章 函数

第十讲
?函数的嵌套调用 ?函数的递归调用 ?函数变量的作用域

2013-1-11

Page

1

Program Design in C Language

7.4.1 函数的嵌套调用 嵌套调用:在一个函数调用过程中又调用另一个函数。

例 嵌套调用: #include<stdio.h>
qian1( int x, int y ) { int c, s, t ; s=x+y; t=x-y; c=qian2(s, t); return (c); printf("c=%d\n", c); }
2013-1-11

qian2( int x , int y ) { return ( x + y ) ; } void main( ) { int a=1, b=2, c ; c=2*qian1(a, b); printf("c = %d\n", c); }
Page
2

Program Design in C Language

main函数

a 函数

b 函数

调用a 函数 调用b 函数

结束

2013-1-11

Page

3

Program Design in C Language

7.4.2 函数的递归调用 递归调用:在调用一个函数的过程中又出现直接或间 接地调用该函数本身。这样的函数称为递归函数。 递归调用必须可以满足一定条件时结束递归调用,否 则无限地递归调用将导致程序无法结束。 main函数 调用a 函数 a 函数 调用a 函数 a 函数

结束
2013-1-11

Page

6

Program Design in C Language

例 使用递归算法编写计算n!的函数。 #include<stdio.h> int fac(int n) n=5 { 5 * 4! if (n==1) return 2; (n==2) return 1; 4 * 3! else return n*fac(n-1); } 3 * 2! void main( ) 2 * 1! {int m; scanf ("%d",&m); 1 printf("%2d!=%d\n", m , fac(m)); }
2013-1-11

Page

7

Program Design in C Language

例: Hanoi塔问题
在一个塔座(设为塔1)上有若干个盘子,盘子 大小各不相等,按大盘在下、小盘在上的顺序叠放, 现要将其移至另一塔座(设为塔2)上去。问:仅依 靠一个附加的塔座(设为塔3),每次仅移动一个盘 子,且在整个移动过程中始终保持每个塔座上的盘子 均为大盘在下、小盘在上的叠放方式,如何移动?

1
2013-1-11

2

3
Page 12

Program Design in C Language

例: Hanoi塔问题 分析:对于n个盘子,只要能将上面的n-1片移至 塔座3上,最下面的一个就可以直接移至塔座2上。其 余的n-1个盘子既然能从塔座1移至塔座3,自然也可 照理移至塔座2,问题就解决了。每次使用同样的办 法解决最下面一个盘子的移动问题,一次次搬下去, 直到剩下最后一个盘子,直接移至塔座2就可以了

2013-1-11

Page 13

Program Design in C Language

void hanoi_ta(int n,char ta1,char ta2,char ta3);

void main( )
{ int n;

printf("Input the number of diskes:");
scanf("%d",&n); hanoi_ta(n,'1','2','3'); }
2013-1-11

Page 14

Program Design in C Language

/*continue*/ void hanoi_ta(int n,char ta1,char ta2,char ta3)

{ if(n==1)
printf("%c?%c\n",ta1,ta2);

else { hanoi_ta(n-1,ta1,ta3,ta2);
printf("%c?%c\n",ta1,ta2);

hanoi_ta(n-1,ta3,ta2,ta1);
} }
2013-1-11

Page 15

Program Design in C Language

7.5.1 变量的作用域 变量的作用范围 变量的作用范围也称变量的作用域,即变量 可以存储或访问的范围。 变量的作用域是指变量的“可见性”。

变量的分类:
1 局部变量

2

全局变量

2013-1-11

Page 16

Program Design in C Language

7.5.1 变量的作用域 1、 局部变量 ?局部变量:在一个函数内部定义的变量。 ?局部变量的作用范围仅限于本函数,即只有在本函数 内才能使用它们,其他函数不能使用它们。 ?说明: (1)在main( )中定义的变量只在主函数中有效,而不在 整个文件中有效。 (2)不同函数中可以使用相同名字的变量,它们代表不同 的对象,互不干扰。 (3) 形参也为局部变量。 (4)在函数内部,可在复合语句中定义变量,这个变量只 在本复合语句中有效。
2013-1-11

Page 17

Program Design in C Language

7.5.1 变量的作用域 局部变量举例: void main( ) { int x, y; float f1, f2; · · · } hanshu(int x, float y) { int a, b, c; · · · }
2013-1-11

Page 18

Program Design in C Language

void main( )

{int a,b;
…… {int c; c=a+b; … } …
2013-1-11

c的作用域

a、b的作用域

}
Page 19

Program Design in C Language

7.5.1 变量的作用域

局部变量的使用:说出下列程序的运行结果 #include <stdio.h>
void f2(int x,int y) { x++; y++;}

void f1(int x,int y)
{ int n=0;

f2(x, y);
printf("n=%d,x=%d,y=%d\n",n,x,y); }
2013-1-11

/*continue*/

Page 20

Program Design in C Language

7.5.1 变量的作用域 void main( )

{
int n=2,a=3,b=4; f1(a,b); printf("n=%d,a=%d,b=%d\n",n,a,b); }

n=0, x=3, y=4 n=2, a=3, b=4
2013-1-11

Page 21

Program Design in C Language

7.5.1 变量的作用域 2、 全局变量 ?全局变量:在函数外定义的变量,也称外部变量。 ?作用范围:从其定义的地方开始直至源程序文件 的结束。 全局变量通常放在源程序的开始处。

全局变量命名时,首字母大写,其余字母小写。

2013-1-11

Page 22

Program Design in C Language

7.5.1 变量的作用域

全局变量举例
int Abc, D1 ; void main() { float f1, f2 ; · · · } float Ka, Hc ; hanshu(int x, int y) { double c, e ; · · · }
2013-1-11

全局变量 Abc,D1 的作用域

全局变量Ka, Hc的作用域

Page 23

Program Design in C Language

7.5.1 变量的作用域

例:

运行结果: int X=3; 1)3 int func( ) { int c=0 ; 2)13 c+=X; X+= 10 ; return ( c ) ; } void main( ) { int k=2; k=func( ) ; printf("1)%d\n", k ) ; k=func( ) ; printf("2)%d\n", k ) ; }
Page 24

2013-1-11

Program Design in C Language

说明:

(1) 在一个函数中既可使用本函数中的局部变量,又 可使用有效的全局变量; (2) 若外部变量与局部变量同名,则在局部变量的作 用范围内,外部变量不起作用。
(3) 全局变量沟通整个文件中的所有函数; (4) 全局变量可以减少函数形参与实参的个数; (5) 全局变量降低了函数使用的通用性; (6) 全局变量在程序的全部执行过程中都占有存储单 元,所以,不必要时不使用;
2013-1-11

Page 25

Program Design in C Language

(7) 若要在定义外部变量之前引用该外部变量,则用 extern作“外部变量说明”;外部变量说明和外部 变量定义不同,定义只有一次,在所有函数外,说 明在函数内; int max(int x, int y) {……} void main( ) {extern int A,B; /*外部变量说明*/ printf(“%d”,max(A,B)); } int A=13,B=-8; /*外部变量定义*/
2013-1-11

Page 26

Program Design in C Language

7.5.1 变量的作用域

例:
int M = 5 ; 运行结果: int fun( int x, int y ) { int M = 10 ; 5 return ( x*y-M ) ; } void main( ) { int a=7, b = 5 ; printf(" %d\n", fun( a, b )/M ) ; }

2013-1-11

Page 27

Program Design in C Language

7.5.1 变量的作用域 例 已知一个一维数组,用一个函数求数组最大数、 最小数和平均数。 #include <stdio.h> int Num,Max,Min; int average(int array[ ]) {int i, array_aver; array_aver=Max=Min=array[0]; for(i=1;i<Num;i++) {if(array[i]>Max) Max=array[i]; else if(array[i]<Min) Min=array[i];
2013-1-11

Page 28

Program Design in C Language

7.5.1 变量的作用域 /*continue*/ array_aver+=array[i];} array_aver/=Num; return array_aver; } void main( ) { int aver,n[5]={23,2,4,5,6}; Num=5; aver=average(n); printf("max=%d,min=%d,average=%d\n", Max,Min,aver); }
2013-1-11

Page 29

Program Design in C Language

7.5.1 变量的作用域 全局变量的特点: 优点: ? 利用全局变量可以从函数中得到一个以上的返回值。 ? 利用全局变量可以减少函数中实参和形参的个数。 缺点: ? 全局变量在程序运行过程中始终都占用存储单元,而 不是在函数被调用时才临时分配存储单元。 ? 函数的通用性降低。 ? 在同一个源程序中,当全局变量与局部变量同名,在 局部变量的作用域内,全局变量不起作用,即全局变 量被"屏蔽"。
2013-1-11

Page 30

Program Design in C Language

上机实验内容:

⑴ 熟悉函数的嵌套调用和递归调用;编辑
和运行课本第七章的例[7.8]~[7.11]

⑵《实验教程》第7章函数
实验3

2013-1-11

Page 33

Program Design in C Language

预习:

第七章 函数
§7.6 ~§7.7

2013-1-11

Page 34


相关文章:
更多相关标签: