C语言:函数.ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言程序设计
8.6 函数的递归调用
•函数的递归调用 ——函数直接或间接地调用自身称为递归调用。
例:计算n!
当 n>0 时: n!=n*(n-1)!
1
(n=0, 1)
n!=
n•(n-1)! (n>1)
(n-1)!=(n-1)*(n-2)! int fac( int n )
…… n=0时 n!=1
{ int f; if( n<=1 ) f=1; else f=n*fac(n-1);
12.4
C语言程序设计
汉诺塔问题
假设三个塔,第一个塔上有从小到大堆积的一叠金 属片,一次从一个塔搬运一片到另一个塔,只能从塔顶 搬运,不允许大的金属片压在小的金属片上,求解将金 属片全部搬运到第三个塔上的过程。
12.5
C语言程序设计
递归解决
❖步骤: 先将A上n-1片搬运到中间B塔上; 将A最后一片搬运到目标C塔上; 将B上n-1片借助A搬运到目标C塔上;
static float x,y; ..
}
//i,j是外部静态变量。
//x,y是内部静态变量。
12.23
C语言程序设计
外部静态变量的性质: 作用域:是定义它的源文件。对于该文件之外的文件不可见即不能使用。
生命期:是程序的整个执行过程。所分配的存储空间在整个程序执行过程
中都归该变量所有,直到程序执行结束时才释放。
例如:
float add(floatx, float y)
{ static float z; z=z+x+y;
//static 型变量在程序编译时,自动赋初值0。
return(z); }
//变量 z在函数结束时,并不释放,保留原值。
main( )
{ float s,x=2,y=3;
s=add(x,y); s=add(x,y); }
内部静态变量的概念:内部静态变量是在函数或分程序内定义,它的使用局 限于定义它的函数或分程序。
内部静态变量的定义格式: static 数据类型标识符 变量名表;
例如:static char buf[1024]; static int m,p;
12.21
C语言程序设计
内部静态变量的性质:
生命期(全局): 它的生命期是整个程序的执行过程,内部静态变量 的数据在函数(或分程序)的调用结束时并不消失,下次调用时可继 续使用原保留值。
❖递归终结条件: 当n=1时,直接搬运;
例如:A上有3个
1. A 2个
B
2. A 1个
C
3. B 2个
C
1.1 A 1分解 1.2 A
1.3 C
3.1 B 3分解 3.2 B
3.3 A
12.6
C B B
A C C
C语言程序设计
程序代码:
Void move(char x, char y)
{
printf(“%c---->%c\n”,x,y);
return (f );
}
12.2
C语言程序设计
y =fac(3);
以计算3!为例,调用 fac(3);
int fac( int n ) { int f;
if( n<=1 ) f=1; else f=n*fac(n-1); return (f ); }
n为3 f=3*fac(2);
n为2 f=2*fac(1 );
12.17
C语言程序设计
例:
example(float x,float y)
{
//对于这一对花括号 i,j,c1,c2是内部变量。
int i,j;
char c1,c2;
{
//对于这一对花括号 i,j,c1,c2是外部变量。
double d1,d2; int m,n; int u,v;
d1,d2,m,n,u,v 的作用域
使用方法: auto int x; 称变量x为自动存储类型的变量,简称自动变量。 static float y; 称变量y为静态存储类型的变量,简称静态变量
12.16
C语言程序设计
1、自动型变量(auto型)
(1)概念
自动型变量是在函数内部定义的一种变量,它局限于该函数或所在的分程 序。故也称为局部变量。
不同源文件中外部静态变量可以同名,各文件的外部静态变量有其自己的
存储空间,同名变量不会冲突。
file1
file2
min=array[i];
ave=average(score,10);
sum=sum+array[i]; }
Printf(“max=%6.2f\nmin =%6.2f\naverage=%6.2f
aver=sum/n;
\n”,Max,Min,ave);
return(aver);
}
}
12.12
C语言程序设计
C语言程序设计
利用全局变量传递数据
例: 有一个一维数组,内放10个学生成绩,写一个函数,求
出平均分,最高分和最低分。
float Max=0,Min=0;
float average(float array[],int n)
{int i;
main( )
float aver, sum=array[0];
存放 static变量、 extern变量。
存放 auto变量、 register变量、函数的返回值、被调用函数的形参、 保存调用现场的数据。
12.15
C语言程序设计
8.9 变量的存储类别
变量有两个属性:
数据类型和数据的存储类型
C语言有四种存储类型,即:
• auto自动型。 • register寄存器型。 • static静态型。 • extern外部型或全局型。
printf("\nmain\n");
printf(“k=%d x=%d y=%d\n",k,x,y);
other( );
printf(“main\n”);
printf(“k=%d x=%d y=%d\n",k,x,y);
} other( ) { int k=100;
int x=200; int y=300; printf(“other\n”);
存中数据的读写操作速度。
(3)寄存器变量的适用场合 程序中使用频繁的变量,例如,在程序循环结构中,循环次数很多的循
环中,把循环变量定义为寄存器变量,可以大大提高程序处理的速度。
例: main( ) { register int i, sum; for(i=1,sum=0;i<=100;i++) sum=sum+i; printf(“sum=%d”,sum); }
//S=5 //S=10
12.22
C语言程序设计
(2)外部静态变量
外部静态变量的概念: 外部静态变量是在函数外部定义的变量。
外部静态变量的定义格式(内部静态变量的定义相同): static 数据类型标识符 变量名表;
例如: static int i,j; example( ) { int n,m;
返回6(3*2) 返回2(2*1)
n为1 递推
f=1;
回归
返回1
12.3
C语言程序设计
程序代码
float fac(int n) { float f;
if(n==0 || n==1) return 1; return fac(n-1)*n; }
main() { int n;
float y; scanf("%d",&n); y=fac(n); printf("%d!=%ld\n",n,y); }
数据
运算符
语句 函数
局部变量
文件
全局变量
程序
12.9
C语言程序设计
局部变量
在一个函数内部定义的变量,是内部变量,它只在本函数范围内 有效,即只在本函数内才能使用。称为局部变量。
(1) 主函数中定义的变量也是如此。 (2)不同函数中可以使用相同名字的变量,互不干扰。 (3)函数的形参也是一种局部变量。 (4)在函数内部,可以在复合语句中定义变量,这些变量只在本 复合语句中有效。
(2)自动型变量的定义格式 [auto] 数据类型标识符 变量名;其中,auto可以省略。
auto int b,c=3;
(3)自动型变量定义的位置 自动型变量定义的位置在函数或分程序的开始位置。
(4)自动型变量的性质 自动型变量是局部的动态变量。它的作用范围限于函数或分程序所在的花
括号“{ }”内。其生存期是在执行所属的分程序这段时间区间。该函数或 分程序执行结束时,释放其空间,变量中的数据消失。
ห้องสมุดไป่ตู้12.10
C语言程序设计
全局变量
在函数外定义的变量是外部变量,外部变量是全局变量。可以为本文 件中其他函数所共用。有效范围从定义位置开始到本源文件结束。
int p=1, q=5; int max(int x,int y) { …… } main() { int a,b; …… }
12.11
全局变量p、q的 作用范围
{
…
auto int k; …
K的作用域
}
}
}
12.18
x,y 的作用域 i,j,c1,c2 的作用域
C语言程序设计
2、寄存器型变量(register型)
(1)寄存器变量的概念 寄存器变量是把变量的数据存放在计算机CPU的寄存器中的变量。
(2)寄存器变量的优点 数据操作速度快。 CPU对寄存器中数据的读写操作速度要远远快于对内
写程序运行结果
#include<stdio.h> int sum(int x,int y) { int k; k=x+y; return k; } void main() { int i,s=0;
for(i=0;i<3;i++) { s=s+sum(2,3);
printf("%d\t",s); }
12.1
能存放其它类型的数据。
12.20
C语言程序设计
3、静态型变量(static型)
概念
静态变量是静态存储分配的变量。即在运行时,在特定的存储区内为其 分配相应的存储空间;所分配的存储空间在整个程序运行中自始至终归该 变量使用,自始至终都不释放。
静态变量分内部静态变量和外部静态变量两种。 (1)内部静态变量
}
12.13
C语言程序设计
变量的生存期
从变量值存在的时间角度考虑,分为: ❖静态存储方式:程序运行期间分配固定的存储 空间的方式。 ❖动态存储方式:程序运行期间根据需要进行动 态分配存储空间的方式。
12.14
C语言程序设计
内存中供用户使用的存储空间:
用户区 程序区 静态存储区 动态存储区
存储器
存放执行程序的代码
{ float ave,score[10];
Max=Min=array[0];
int i;
for(i=1; i<n; i++)
{ if(array[i]>max) max=array[i];for(i=0;i<10;i++);
else if(array[i]<min)
scanf(“%f”, &score[i]);
外部变量与局部变量同名
例:
int a=3,b=5;
a,b是外部变量。
max(int a, int b);
a,b是为局部变量。
{ int c;
c=a>b? a : b; return(c);
形参a,b作用范围
}
main( )
{ int a=8; printf(“%d ”,max(a,b));
局部变量a作用范围
}
void hanoi( int n, char one, char two, char three )
{
if( n==1 )
move(one,three);
else
{ hanoi( n-1,one,three,two );
move(one,three);
hanoi( n-1,two,one,three );
main k=1 x=10 y=20 other k=100 x=200 y=300 main k=1 x=10 y=20
printf(“k=%d x=%d y=%d\n",k,x,y);
}
12.8
C语言程序设计
变量是程序中最活跃的元素,因为它代表的是各种 类型的数据。
变量的作用域
从变量的使用范围(空间角度)来划分:
} }
main()
{
int n;
scanf( "%d",&n );
hanoi( n, ’A’, ‘B’, ‘C’ );
}
12.7
C语言程序设计
例:读程序,写出程序运行结果。
main( )
{ int k=1; int x=10; int y=20;
//函数main和函数 other中定义的变量k、x、y, 它们的名字虽然相同,但它们是相互独立的, 系统为其分配各自的存储空间,它们互不相干。
CPU
数据
寄存器
数据
数据
数据
12.19
C语言程序设计
(4)寄存器变量的性质 寄存器变量是局部的自动变量或形参。它的作用域、生命期局限在函数或分
程序内,函数或分程序执行结束时,寄存器变量就被释放,寄存器变量中的数 据消失。
(5)寄存器变量定义的格式 register 数据类型标识符 变量名表;
(6)寄存器变量存放数据的类型 寄存器变量存放数据的类型为:int型、 short型、 char型。寄存器变量不