C语言程序设计基础第6章函数.ppt_第1页
C语言程序设计基础第6章函数.ppt_第2页
C语言程序设计基础第6章函数.ppt_第3页
C语言程序设计基础第6章函数.ppt_第4页
C语言程序设计基础第6章函数.ppt_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第 六 章 函 数 n函数的基本使用 n函数的嵌套调用 n函数的递归调用 n变量存储特征 n宏 函数的概念 k! n!+ m! f=1; for(i=1; i void main() int k, m, n; float fk, fm, fn; scanf(“%d%d%d“, fk=1; for(i=1; i void main() int k, m, n; float fk, fm, fn; float fact(int n); scanf(“%d%d%d“, fm = fact(m); fn = fact(n); fk = fact(k); printf(“%fn“, fm/(fn+fk); float fact(int n) int i; float f=1; for(i=1; i void main() int k, m, n; float fk, fm, fn; float fact(int n);/*声明*/ scanf(“%d%d%d“, fm = fact(m); fn = fact(n); fk = fact(k); printf(“%fn“, fm/(fn+fk); float fact(int n) int i; float f=1; for(i=1; i void main() int in; printf(“1. INPUT 2.EDIT 3. PROCESS 4.PRINT 5.EXITn“); while(1) printf(“please input 1-5:“); scanf(“%d“, if (in=5) break; switch(in) case 1: input( ); break; case 2: edit( ); break; case 3: process( ); break; case 4: print( ); break; void input( ) /* .成绩输入 */ . void edit( ) /* 成绩修改 */ 4个函数的定义 void process( ) /* 成绩统计 */ . void print( ) /* 成绩打印 */ . 函数的定义和调用 void main() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); 调用 定义 float fact(int n) int i; float f=1; for(i=1; i=n) f1=1; for(i=1;i 形参 函数的参数 函数名(实际参数表) main() x=output( ); output( ) printf(”*n”); printf(”* very good *n”); printf(”*n”); main( ) int x,y,z; int max (int a , int b ); scanf(“%d%d”, z=max(x, y); printf(“%d”,z); int max (int a , int b ) int c ; c=ab ? a : b ; return( c ) ; 问题: 实参可以是表达 式吗? 如果实参和形参 的类型不一样? 返回值类型 函数名(形式参数表) void main() int m, n; float fk, fm, fn; float fact(int n); fm = fact(6); float fact(int n) int i; float f=1; for(i=1; ib ? a : b ; return( c ) ; int 问题: 如果返回值的类 型与return (exp) 中的exp不一致? 实参 实参与形参 参数传递 void main() int x, y, z; scanf(“%d%d”, z=max( x, y ); printf(“%d”,z) int max(int a , int b ) int c; c=ab ? a : b; return c; 常量 变量 表达式 形参:变量 实参与形参 参数传递 int max(int a , int b ) int c; c=ab ? a : b; return c; void main() int x, y, z; scanf(“%d%d”, z=max( x, y ); printf(“%d”,z) x 3 y 5 z a b c 5 3 5 5 1、实参与形参:个数相同、类型一致、按顺序传递 2、实参 - 形参,值传递 单向 形参值的变化不会影响实参的值 实参和形参可以同名 实参与形参 参数传递 void main() int x, y, z; scanf(“%d%d”, z=max( x, y ); printf(“%d”,z) int max(int a , int b ) int c; c=ab ? a : b; return c; void main( ) int b, a; scanf(“%d%d“, swap( printf(“%d%d“, b, a); 阅读程序 void swap(int *x, int* y) int t; t =* x; *x = *y; *y = t; 输入 3 5 函数的说明 void swap(int a, int b) int t; t = a; a = b; b = t; void main( ) int x, y; scanf(“%d%d“, swap(x, y); printf(“%d%d“, x, y); void main( ) int x, y; scanf(“%d%d“, swap(x, y); printf(“%d%d“, x, y); void swap(int a, int b) int t; t = a; a = b; b = t; void swap(int a, int b); 函数在被调用前必须先定义和说明! 函数调用小结 函数调用时,实参计算值,复制给相应位置的形参; 函数执行完后,通过return (exp),可返回结果。 调用其他函数, 必须先说明! 有多个实参时 后面的先计算 形参的改变 不影响实参 数量、类型、顺序 一致 一个结果 分析函数调用过程 # include void main() int k, m, n; float fk, fm, fn; float fact(int n); scanf(“%d%d%d“, fm = fact(m); fn = fact(n); fk = fact(k); printf(“%fn“, fm/(fn+fk); float fact(int n) int i; float f=1; for(i=1; in) return 1; else return 0; for(m=100; m # include void main() float a, b, c; float area(float a, float b, float c); float s(float a, float b, float c); scanf(“%f%f%f“, printf(“%fn“, area(a, b, c); float area(float a, float b, float c) float ss; ss=s(a,b,c); return sqrt(ss*(ss-a)*(ss-b)*(ss-c); float s(float a, float b, float c) return (a+b+c)/2; 递归式 递归出口 函数的递归调用(递归函数) 求n! 递归定义 n! = n * (n-1)! (n 1) n! = 1 (n = 0,1) void main() float fact(int n); printf(“%fn“, fact(5); float fact(int n) float res; if(n=0 | n=1) res=1; else res = n*fact(n-1); return res; fact(n)=n*fact(n-1); 递归函数求 n! 的实现过程 fact(3) 3*fact(2) 2*fact(1) 1 2 6 float fact(int n) float res; if(n=0 | n=1) res=1; else res = n*fact(n-1); return res; 函数的递归调用(递归函数) n用递归实现的问题,满足两个条件: 问题可以逐步简化成自身较简单的形式(递归 式) n! = n * (n-1)! n n-1 i = n + i i=1 i=1 递归最终能结束(递归出口) 两个条件缺一不可 解决递归问题的两个着眼点 变量作用范围(作用域) 在函数内定义的变量(包括形参)。 局部变量 作用范围:本函数内部。 定义在复合语句内的变量。 作用范围:复合语句内部。 全局变量:在函数以外定义的变量,不从属于 任一函数。 作用范围:从定义处到源文件结束(包括各 函数) 变量作用范围示例 n区分局部变量和全局变量 int x=1; void main( ) int a=2; int b=3; f( ); int t=4 ; void f( ) int x=5, b=6; . int a=7; x=? a=? b=? b=? x=? b=? t=? a=? x=1 a=2 b=3 b没定义 x=5 b=6 t=4 a没定义 若局部变量与 全局变量同名 ,局部变量优 先 变量作用范围示例 int x=1; int f(int x) return(x+); main( ) int y; y=f(2) ; x=f(x) ; printf(“%d%d”, y, x); x=1 变量作用范围 n如果局部变量与全局变量同名 ,局部变量优先。 n不要滥用全局变量。副作用 int x=1; void f1() x+; void f2() x=5; void main( ) x=10; f1(); printf(“%d “, x); f2(); printf(“%d “, x); 11 5 变量存储形式和生存期 1、动态存储 自动变量(auto): 普通的局部变量 int x, y; auto int x, y; char c1; auto char c1; 函数调用时,才定义变量,分配存储单元; 函数调用结束,收回存储单元。 即使对同一函数的几次调用,分配的存储单元也 不同。 fact(3) 3*fact(2) 2*fact(1) 1 2 6 float fact(int n) float res; if(n=0 | n=1) res=1; else res = n*fact(n-1); return res; n=3 n=2 n=1 变量存储形式 2、静态存储 在静态存储区分配单元 执行程序时定义变量,分配单元,运行结束时 收回。 全局变量 静态局部变量 静态全局变量 int k; main() int i; k=2; for(i=4; i0; i-) fun(); fun() int j=2; printf(“j=%d, k=%dn“, j, k); k=k*k; j=j*j; 示例 j=2, k=2 j=2, k=4 j=2, k=16 j=2, k=256 作用域 生存期 int gobal=1; void fun(); void main() int i; for(i=0; i 只在tcinclude 文件夹下找 适用于系统头文件 “ 除此之外,还到程序所在文件夹下查找 适用于自定义头文件 二、使用工程文件 extern long fact(int k); void main() int n; long t; scanf(“%d“, t = fact(n); printf(“%ldn“, t); 文件名 file1.c long fact(int k) int i; long res=1; for (i=1; i=k ; i+) res = res * i; return res; 文件名 F2.c 外部变量 两个文件分别独立编译, 进行连接时会自动连接 file1.obj和 file2.obj,形成一个完整的可执行文件。 int x; extern int f1(); void main() f1( ); 文件名 file1.c extern x; /*使用file1.c中的全 局变量 x */ f1( ) 文件名 file2.c 扩大全局变量 的作用域 调用另一模块 中的函数 静态全局变量 静态全局变量(或函数)将只限制在一个文件中使 用,可以避免不同人编写程序时的相互干扰。 static int x; extern int f1(); void main() f1( ); 文件名 file1.c extern x; /*使用file1.c中的全 局变量 x */ static int f1( ) 文件名 file2.c 无法引用 无法调用 限制全局变量的作用域 变量存储类别小结 存储类别 函数内函数外 初值 作用域生存期作用域生存期 局部 变量 auto / register随机 静态局部变量0 全局 变量 静态全局变量 本文件 0 全局变量0 宏定义

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论