程序结构概念.
被调用函数声明
函数定义
例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.3 函数参数和返回值
一、形式参数 和 实际参数 形式参数 : 定义函数时,括号中说明的变量名 ; 实际参数 : 调用函数时,括号中给定的表达式 。
main( ) {int i,j,p; scanf("%d%d",&i,&j); p=f(i,j); printf ("%d",p); }
#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
(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 作用域
若某个变量仅能在源程序正文的某个范围内被 使用,则称源程序正文的这个范围为该变量的作 用域。 根据作用域的不同,将变量分类: 局部变量 全局变量
函数体
局部变量声明
执行语句
说明 :
1. 一个 C 程序由一个或多个函数组成;从 main() 开始,调用其它函数后,回到 main() 结束 ;
2. 分类 : 1)用户使用角度:库函数和用户自定义函数
2)调用关系:主调用函数和被调用函数
3)函数形式:无参函数 和 有参函数
例:求20 + 21+ 22 + 23 + … +220
例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); }
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;
retur?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); }
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; ...... }
return (f);
}
}
递归的特点
§7.4.2 函数的递归调用
递归问题的特点 : 1. 把一个问题转化为一个新问题,新 问题与原问题解法相同 ,只是所处理的 对象有所不同,随着问题的转化,问题 的规模有规律的递增或递减 。 2. 可以通过转化过程使问题得到解决。 3. 必须有一个明确的结束递归的条件。
形式:类型标识符 函数名(形式参数表列) { 函数声明部分 函数语句部分 } 说明:若不带回函数 值,或返回一个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); }
第 7章
函数
§7.1 函数
C 程序
程序结构概念 : 源程序文件n 源程序文件1 源程序文件2 1)较大的程序应分为若干个程序模块 ; 2)每个模块实现单一的特定功能; 函数1 函数n 3)由主函数开始执行,主函数调用子函数; 全 预 局 4)子函数之间可以互相调用。 处
…
理 命 令
变 量 声 明
函数首部
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); }
形参说明
§7.2.2 函数的调用 函数调用的一般形式 函数名(实参表列)
说明 : 1. 无参函数,括号不能省 ; 2. 实参表列中,各实参与形参在 个数、顺序、类 型上一一对应,参数间用逗号分隔。
调用函数的方式有三种: 函数语句、函数表达式、函数参数。 如: printf("******"); m=max(a,b)*20; printf("%d",max(a,b));
函数调用发生 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所占的存储单元被释放
二、函数的返回值
例 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
求三个数中最大数和最小数的差值
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!
§7.4.1
函数的嵌套调用
不能嵌套定义函数,可以嵌套调用函数 。
main函数 {
a函数 {
b函数 {
调用a函数
调用b函数
}
return(); } 后调用,先返回
return(); }
§7.4.2 函数的递归调用
在调用一个函数的过程中又出现直
接或间接地调用该函数本身,称为函数
的递归调用 。
例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); } } }
c 的有效 范围
a , b 的有效 范围
7.5.3 全局变量
1. 外部变量 :在函数之外定义的变量; 2. 外部变量是全局变量 ; 3. 作用范围: 从定义变量的位置开始到本源文件结束 4. 说明: (1) 作用 :提供一种函数间数据联系与共享的方法; (2) 全局变量与局部变量同名时,局部变量屏蔽外 部变量。 (3) 不要过多使用全局变量 ; 1) 占内存 2) 易产生副作用
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); }