程序结构概念.

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

return (f);
}
}
递归的特点
§7.4.2 函数的递归调用
递归问题的特点 : 1. 把一个问题转化为一个新问题,新 问题与原问题解法相同 ,只是所处理的 对象有所不同,随着问题的转化,问题 的规模有规律的递增或递减 。 2. 可以通过转化过程使问题得到解决。 3. 必须有一个明确的结束递归的条件。
1
(n=1,2)
f(n-2)+f(n-1) (n>2)
long fibo(int n) { long f; if (n==1||n==2) f=1; else f=fibo(n-2)+fibo(n-1); return(f); }
§7.5 变量的作用域 7.5.1 作用域
若某个变量仅能在源程序正文的某个范围内被 使用,则称源程序正文的这个范围为该变量的作 用域。 根据作用域的不同,将变量分类: 局部变量 全局变量
double fac(int n) { double f; if (n==1||n==0) f=1; else f=fac(n-1)*n; return(f); }
fac(n) { ...
fac(n) { ... f=1;
{ ...
y=fac(4); f=fac(3)*4; f=fac(2)*3; f=fac(1)*2; 2 1 24 6 ... return(f); return (f); return (f); } } }
形式:类型标识符 函数名(形式参数表列) { 函数声明部分 函数语句部分 } 说明:若不带回函数 值,或返回一个int 类型数据,则类型标 识符也可以不写。 如:int max(int x, int y ) { int z ; z=x>y ? x : y ; return ( z ) ; }
main() ) main( { { int int a,b,c; a,b,c; scanf ("%d,%d",&a,&b); ("%d,%d",&a,&b); scanf 函数调用 c=max( a a ,b ,b ); ); c=max( printf printf ("max ("max is is %d\n",c); %d\n",c); } int max( int x, int y ) { int z; z=x>y?x:y; return (z); }
函数调用发生 i a 5 5 j b 9 9
int f(int a,int b) { int c; if (a>b) c=1; else if (a= =b) c=0; else c=-1; return c; return (c); }
函数调用结束
i
5
j
9
a,b所占的存储单元被释放
二、函数的返回值
思考: 用递归法求 1+2+3+…+n
(n=1) (n>1)
例 3.用递归的方法求Fibonacci数列的第n项的值
f(n)=
long fibo(int n); main() { int n; long y; scanf("%d",&n); y=fibo(n); printf("%d",y); }
§7.4.1
函数的嵌套调用
不能嵌套定义函数,可以嵌套调用函数 。
main函数 {
a函数 {
b函数 {
调用a函数
调用b函数
}
return(); } 后调用,先返回
return(); }
§7.4.2 函数的递归调用
在调用一个函数的过程中又出现直
接或间接地调用该函数本身,称为函数
的递归调用 。
例1 求三个数中最大数和最小数的差值
例3: 1!+5!+9!+…+21!
double jiec(int n) { double s=1.0; int i; for (i=1;i<=n;i++) s=s*i; return (s); } main( ) { double sum=0; int i; for(i=1;i<=21;i+=4) sum+=jiec(i); printf ("%.0lf\n",sum); }
#include <stdio.h> #include <math.h> main() { double s=0; double pow(double x,double y) int i; for(i=0;i<=20;i++) s+=pow(2,i); printf("%.0lf",s); }
§7.2.1 函数的定义
1!=1
0!=1
执行过程
main( ) { int n; double y; scanf ("%d",&n); y=fac(n); printf ("%d!=%.0lf",n,y); } double fac(int n) { double f; if (n==1||n==0) f=1; else f=fac(n-1)*n; return(f); }
int he(int n) { int s; if(n==1) s=1; else s=he(n-1)+n;1 ∑n= return(s); n*∑ (n-1) } main( ) { int n,y; scanf ("%d",&n); y=he(n); printf ("1+2+...+%d=%d",n,y); }
main( ) { float x; a; 例1:求下列函数的值 int y(float x); scanf ("%f",&a); scanf("%f",&x); 1 x>0 printf ("%d", y(x) y(a)); y(a) y= 0 x=0 }
三、程序举例
-1
x<0
a x x
5 5
int y(float x) { int z; if (x>0) z=1; else if (x<0) z=-1; else z=0; return(z); }
说明 : 1. 通过 return 语句获得返回值 ; 如: return(z) 2. 定义函数时指定函数返回值的类型;不加类型说明 的,按整型处理。(即函数返回值为整型时,可不 加类型说明。)
3. 为了明确表示“不带回值”,可以用“ void ” 定
义 “ 无类型 ”。(如:void print() )
来自百度文库
在主调函数前定义
§7.3 函数参数和返回值
一、形式参数 和 实际参数 形式参数 : 定义函数时,括号中说明的变量名 ; 实际参数 : 调用函数时,括号中给定的表达式 。
main( ) {int i,j,p; scanf("%d%d",&i,&j); p=f(i,j); printf ("%d",p); }
m ,n 有效
说明 : 1. 每个函数中定义的变量,只在定义它的函数中有效; 2. 不同函数可以使用相同名字的变量,但意义不同 ; 3. 形式参数是局部变量 ; 4. 可以在复合语句中定义变量,但它们只在本复合语 句中有效 。
main ( ) { int a,b; ...... { int c; c=a+b; ...... } ...... }
§7.2.3 对被调用函数的声明
1.被调函数必须存在; 2.若使用库函数:用#include命令包含有关库函数; 3.若使用用户自定义函数: 被调用函数在主调函数前定义,这样在主调函数 中可以不对调用函数类型进行声明。 否则在主调函数中必须对调用函数类型进行声明。
函数声明的形式: 函数类型 函数名(参数类型1,参数类型2,…);
例 2:求5!、16!和27!
double jiec(int n) 求:1!+5!+9! { double s=1.0; int i; +…+21! for (i=1;i<=n;i++) s=s*i; return (s); } main( ) { double a,b,c; a=jiec(5); b=jiec(16); c=jiec(27); printf ("%.0lf,%.0lf,%.0lf\n",a,b,c); }
“先定义,后使用”原则
函数类型 函数名(参数类型1 参数名,参数类型2 参数名2,…);
例 1: main( ) { float a,b,c; float add(float x,float y); scanf("%f,%f",&a,&b); c=add(a,b); printf("%f\n",c); } float add(float x,float y) { float z; z=x+y; return(z); }
函数体
局部变量声明
执行语句
说明 :
1. 一个 C 程序由一个或多个函数组成;从 main() 开始,调用其它函数后,回到 main() 结束 ;
2. 分类 : 1)用户使用角度:库函数和用户自定义函数
2)调用关系:主调用函数和被调用函数
3)函数形式:无参函数 和 有参函数
例:求20 + 21+ 22 + 23 + … +220
7.5.2 局部变量 在一个函数内部定义的变量,不能在此函数外使 用这些变量。只在函数内有效的变量 。
float f1(int a) { int b,c; ...... a , b, c 有效 } char f2(int x, int y) { int a,j; x ,y ,a ,j 有效 ...... } main ( ) { int m,n; ...... }
第 7章
函数
§7.1 函数
C 程序
程序结构概念 : 源程序文件n 源程序文件1 源程序文件2 1)较大的程序应分为若干个程序模块 ; 2)每个模块实现单一的特定功能; 函数1 函数n 3)由主函数开始执行,主函数调用子函数; 全 预 局 4)子函数之间可以互相调用。 处

理 命 令
变 量 声 明
函数首部
被调用函数声明
函数定义
例2: float add(float x,float y) { float z; z=x+y; return(z); } main( ) { float a,b,c; scanf("%f,%f",&a,&b); c=add(a,b); printf("%f\n",c); }
形参说明
§7.2.2 函数的调用 函数调用的一般形式 函数名(实参表列)
说明 : 1. 无参函数,括号不能省 ; 2. 实参表列中,各实参与形参在 个数、顺序、类 型上一一对应,参数间用逗号分隔。
调用函数的方式有三种: 函数语句、函数表达式、函数参数。 如: printf("******"); m=max(a,b)*20; printf("%d",max(a,b));
c 的有效 范围
a , b 的有效 范围
7.5.3 全局变量
1. 外部变量 :在函数之外定义的变量; 2. 外部变量是全局变量 ; 3. 作用范围: 从定义变量的位置开始到本源文件结束 4. 说明: (1) 作用 :提供一种函数间数据联系与共享的方法; (2) 全局变量与局部变量同名时,局部变量屏蔽外 部变量。 (3) 不要过多使用全局变量 ; 1) 占内存 2) 易产生副作用
例1
求三个数中最大数和最小数的差值
main( )
输入
调用函数dif 输出 结束
dif函数
max函数
调用函数max
调用函数min min函数
例 2. 用递归法求 n!
n!=
1 n*(n-1)!
(n=1或n=0) (n>1) double fac(int n);
n!=n*(n-1)! (n-1)!=(n-1)*(n-2)! ... 2!=2*1!
double fac(int n); main( ) { int n; double y; scanf ("%d",&n); y=fac(n); printf ("%d!=%.0lf",n,y); } 以n=4为例,执行过程如下: main( ) { ... fac(n) { ... fac(n)
int max(int x,int y,int z) { int r; r=x>y?x:y; int min(int x,int y,int z) { int r; r=x<y?x:y;
return(r>z?r:z); }
return(r<z?r:z); }
int dif(int x,int y,int z) { return max(x,y,z)-min(x,y,z); } main() { int a,b,c,d; scanf("%d%d%d",&a,&b,&c); d=dif(a,b,c); printf("Max-Min=%d\n",d); }
相关文档
最新文档