C语言程序设计No.9--第八章函数.ppt_第1页
C语言程序设计No.9--第八章函数.ppt_第2页
C语言程序设计No.9--第八章函数.ppt_第3页
C语言程序设计No.9--第八章函数.ppt_第4页
C语言程序设计No.9--第八章函数.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

C 程序设计 1 引入 若程序有上百行, 那么怎么调试最方便? 如果我们设计一个程序完成下面的计算: 其中,m、n为正整数且mn 该如何设计程序最有效? ? 自顶向下 逐步细化 模块化设计 结构化编程 C 程序设计 2 如要设计并开发一个“财政信息系统”,如何着手? 需求分析 系统设计 程序编写 进 一 步 展 开 自顶向下 逐步细化 模块化设计 结构化编程 C 程序设计 3 如要设计并开发一个“财政信息系统”,如何着手? C 程序设计 4 C 程序设计 5 第八章 函数 (第09讲) 主讲: 刘怀亮 经济管理学院信息管理系 C 程序设计 7 第八章 函数 内容提要: 8.1 概述 8.2 函数定义的一般形式 8.3 函数参数和函数的值 8.4 函数的调用 8.5 函数的嵌套调用 8.6 函数的递归调用 8.7 数组作为函数参数 8.8 局部变量全局变量 8.9 变量的存储类别 8.10 内部函数和外部函数 C 程序设计 8 8.1 概述 一个C程序可以分为若干个函数; 每个程序有且仅有一个主函数(main),其他函数都 是“子函数”; 子函数可以相互调用, 但主函数不能被调用 一个C源程序由一个或 多个文件构成,一个 源程序文件是一个编译单位 main abc defghhi eg C 程序设计 9 #include void printstar() printf(“*n“); void printmessage( ) printf(“Hello, world.n“); printstar( ); void main( ) printstar( ); printmessage( ); 8.1 概述 1. C程序的执行从main函数 开始,调用其他函数后仍回 到main函数,程序在main函数 结束时结束。 2.所有子函数都是平行的,任 何子函数都不属于其他函数 3.从用户的角度看,函数可分为: 标准函数,即库函数 自定义函数 4.从函数形式看,可分为: 无参数函数:如 printmessage( ) 有参数函数:如 printstar( int n) 说明 #include void printstar( int n) int i; for(i=0;i void printstar() printf(“*n“); void printmessage( ) printf(“Hello, world.n“); printstar( ); void main( ) printstar( ); printmessage( ); #include void printstar( int n) int i; for(i=0;i void printstar(int n) int i; for(i=0;i void printstar(int n) int i; for(i=0;i int max(int x, int y) int z; z=(xy)?x:y; return(z); void main( ) int a,b,c; scanf(“%d%d”, c=max(a,b); printf(“Max is %dn”,c); 形式参数说明方法: 类型说明 变量名,类型说明 变量名, 若定义成max(int x,y)? 错误! 因为形参 要单个定义! 多个形参需单独说明 如: void printhello( ) printf(“Hello, world.n”); 如: int max( int x, int y) int z; z=(xy)?x:y; return(z); 又如: void printhello( char name ) printf(“Hello, %sn”,name); C 程序设计 12 8.2 函数定义的一般形式 函数定义的一般形式: 类型说明 函数名(形式参数说明) 函数体 一般情况下,函数由两部分组成: 局部变量: 函数体内定义的变量, 其有效范围仅限于所在的 函数内部,离开函数体则 无意义。 局部变量说明 语句 #include int max(int x, int y) int z; z=(xy)?x:y; return(z); void main( ) int a,b,c; scanf(“%d%d”, c=max(a,b); printf(“Max is %dn”,c); 说明 C 程序设计 13 8.3 函数参数和函数的值 一个C程序由若干个函数组成,各函数调用时经 常需要传递一些数据。即调用函数把数据传递给 被调用函数,经被调用函数处理后,得到一个确 定的结果,在返回调用函数时,把这结果返回调 用函数。 #include void main( ) int a,b,c; int max(int x,int y); scanf(“%d,%d“, c=max(a,b); printf(“Max is %d“,c); int max(int x, int y) int z; z=xy ? x : y; return(z); c=max(a,b); (main 函数) (max 函数) max(int x, int y) int z; z=xy?x:y; return(z); 例 比较两个数并输出大者. 程序8-004 函数声明 C 程序设计 14 8.3 函数参数和函数的值 一、形参与实参 形式参数:定义函数时函数名后括号中的参数 实际参数:调用函数时函数名后括号中的参数 说明: max有个形式参数x和y 形参x和y只在函数max中使用 a和b是主函数中定义的变量 main函数调用函数max a和b为函数max的实参 #include void main() int a,b,c; scanf(“%d %d“, c=max(a,b); printf(“Max is %d“,c); max(int x, int y) int z; z=xy ? x : y; return(z); 形参 实参 用于函数间数据的传递 23 89 Max is 89 C 程序设计 15 8.3 函数参数和函数的值 1、定义函数时,必须说明形参 的类型,形参只能是变量或数组。 2、函数被调用前,形参不占用 内存;函数调用结束后,形参所占 用的内存也将被回收。 3、实参可以是常量,变量或表达式。 4、实参与形参的类型必须一致,个数相同。 5、C中实参对形参的数据传递是“值传递”,即单向传递。它 仅由参数的对应位置确定,与名字无关。 6、若形参与实参类型不一致,自动按形参类型转换 函数调用转换 7、形参在函数被调用前不占内存;函数调用时为形参分配 内存;调用结束,内存释放 #include void main() int a,b,c; scanf(“%d,%d“, c=max(a,b); printf(“Max is %d“,c); int max(int x, int y) int z; z=xy?x:y; return(z); 说明 C 程序设计 16 8.3 函数参数和函数的值 二、函数的返回值 1、返回函数值的方法 函数的返回值也就是函数值, 是一个确定的值。 如果一个函数有返回值,就必 须使用return语句。 一个函数中可以有一个以上的 return语句,但不论执行到哪 个return都将结束函数的调用 返回主调函数。 return语句中的括号可以省略 ;renturn后面的值可以是一 个表达式。 #include void main() int a,b,c; scanf(“%d,%d“, c=max(a,b); printf(“Max is %d“,c); int max(int x, int y) int z; z=xy?x:y; return (z); C 程序设计 17 8.3 函数参数和函数的值 二、函数的返回值 2、函数值的类型 函数的类型即函数值的类 型。如: 函数max是int型 的也就是函数值是int型 省略了类型说明的函数是 int型的 return语句中表达式的值 一般应与函数类型一致. 如果不一致,则需要进行 类型转换.只有函数型数 据可以进行自动类型转换 ,以函数类型为准. #include void main() int a,b,c; scanf(“%d,%d“, c=max(a,b); printf(“Max is %d“,c); int max(int x, int y) int z; z=xy?x:y; return (z); C 程序设计 18 8.3 函数参数和函数的值 二、函数的返回值 3、不需要返回值的函数 如果函数中没有使用 return语句,函数返回的 是一个不确定的数值。 如果一个函数不需要返回 值(表示一个过程),可以 用void做类型说明。 如果一个函数被声明为 void类型,就不允许再引 用它的返回值(即只能用 函数语句形式调用)。 #include void printstar() printf(“*n”); void printmessage() printf(“Hello,world.n”); printstar(); void main() printstar(); printmessage(); C 程序设计 19 8.4 函数的调用 一、函数调用的一般形式: 函数名(实参表列) 说明: 如果调用无参函数,实参列表可以 忽略,但括号不能省略. 实参的个数和形参一般相等. 实参与形参的类型应一一对应,必 要时使用类型转换. 注意: 不同系统中,实参的计算顺序不 同.计算机上一般是从右到左.为 避免由此引起的混乱,一般应在调 用函数前计算出实参的值。 #include int f(int a, int b) int c; if (ab) c=1; else if(a=b) c=0; else c=-1; return c; void main() int i=2,p; p=f(i,+i); printf(“%dn“,p); printf(“%d“,i); 0 3 程序8-005 int j; j=i; j+; p=f(i,j); 思考: 程序运行 结果是什 么? #include int f(int a, int b) int c; if (ab) c=1; else if(a=b) c=0; else c=-1; return c; void main() int i=2, p; int j; j=i; j+; p=f(i,j); printf(“p=%dn“,p); printf(“i=%dn“,i); printf(“j=%dn“,j); 程序8-006 p= -1 i= 2 j= 3 C 程序设计 20 8.4 函数的调用 二、函数调用的方式 1、函数语句 形式为: 函数名(实参表列) 如:printfmessage( ); printf(“%d”,p); 说明:这种方式不要求函 数带返回值,函数仅完成 一定的操作. 2、函数表达式 函数的返回值参与运算 如:m=max(a,b); m=3*max(a,b); printf(“Max is%d”,max(a,b); 说明:这种调用方式不 能用于void型函数。 C 程序设计 21 8.4 函数的调用 3、函数调用执行过程 按从右向左的顺序,计 算实参中各表达式的 值 按照位置,将实参的 值一一对应地传送给 形参 执行被调用函数 当遇到return(表达式) 语句时,计算表达式 的值,并返回主函数 #include int iabs (float x) return (x0 ? x: -x); void main() float x=-1.8,y; y=iabs(2*x); printf(“x=%fn iabs(x)=%fn2x=%f“, x,y,2*x); 程序8-007 C 程序设计 22 8.4 函数的调用 四、函数的原形说明 在程序中调用函数需满足 以下条件: 1、被调函数必须存在,且 遵循“先定义后使用”的 原则 2、如果被调函数的定义在 主调函数之后(位置),可 以先给出原形说明. 原形说明的形式为: #include float f (float a) return 2*x*x+3*x+1; void main() float x; scanf(“%f”, printf(“y=%fn“,f(x); 类型说明 函数名(参数类型,参数类型,); 编译出错! #include void main( ) int a,b,c; int max(int x,int y); scanf(“%d,%d“, c=max(a,b); printf(“Max is %d“,c); int max(int x, int y) int z; z=xy ? x : y; return(z); 程序8-004 函数声明 C 程序设计 23 8.5 函数的嵌套调用 嵌套调用是指在一个函 数的函数体中又调用了 其他函数. 程序的执行过程如下: #include void printstar() printf(“*n”); void printmessage() printf(“Hello,world.n”); printstar(); void main() printstar(); printmessage(); main printstar( ) printmessage( ) printmessage( ) printstar( ) printstar( ) printstar( ) 第一层第二层 第三层 C 程序设计 24 8.6 函数的递归调用 引入: 许多数学函数都是用递归调用形式定义的: 如: 1 当n=0、1 n!= n*(n-1)! 当n1 1 当n=0 xn= x* xn-1 当n0 long dg(int n) long f; if(n1) age(5) =age(4)+2 age(4) =age(3)+2 age(3) =age(2)+2 age(2) =age(1)+2 age(1) =10 age(2) =12 age(3) =14 age(4) =16 age(5) =18 回推阶段递推阶段 C 程序设计 26 8.6 函数的递归调用 程序举例: 有5个人坐在一起,问第5个人多少岁?答:比第4个人大2岁. 第4个人说他比第3个人大2岁, 第2个人比第1个人大2岁。 问第1个人时回答是10岁。 第5个人到底是多大? #include int age(int n) int c; if (n= =1)c=10; else c=age(n-1)+2; return c; 递归结束条件 age(5) age(4) age(3) age(2) age(1)10 12 14 16 18 函数调用过程: 栈用栈来暂 存数据 void main() printf(“%d”,age(5); C 程序设计 27 Hanoi塔问题 一块板上有三根针,A,B,C。A针上套有64个大小不 等的圆盘,大的在下,小的在上。要把这64个圆盘从A 针移动C针上,每次只能移动一个圆盘,移动可以借助B 针进行。但在任何时候,任何针上的圆盘都必须保持大 盘在下,小盘在上。 8.6 函数的递归调用 Hanoi塔程序 move(int n, int x, int y, int z) if(n=1) printf(“%c%cn“,x,y); else move(n-1,x,z,y); printf(“%c%cn“,x,y); move(n-1,z,y,x); main() int h; printf(“ninput number:n“); scanf(“%d“, printf(“移动%2d 个盘子步骤:n“,h); move(h,a,b,c); 程序8-010 C 程序设计 28 8.6 函数的递归调用 递归调用是指在调用一个函数时又直接或间接地 调用了函数本身。 直接递归调用 间接递归调用 int f(int x) int y,z; z=f(y); 程序执行过程 f函数开始 调用f函数 f函数结束 int f1(int x) int f2(int x ) int y,z; int y,z; z=f2(y); z=f1(y); 程序执行过程 f1函数开始 f2函数开始 调用f2函数 调用f1函数 f1函数结束 f2函数结束 注意 这两个递归都无法结束。 因此应含有某条件控制递 归调用结束。 C 程序设计 29 8.7 数组作为函数的参数 一、数组元素做函数实参 与变量做实参一样,数组元 素做实参是“值传递”。 值传递方式 方式:函数调用时,为形参 分配单元,并将实参的值复 制到形参中;调用结束,形 参单元被释放,实参单元仍 保留并维持原值 特点:形参与实参占用不同 的内存单元 单向传递 #include int max(int x,int y) return (xy? x:y); void main( ) int a10,i,m; printf(“Enter 10 integer:n”); for(i=0;i int max (int x,int n) int i,m; m=x0; for (i=1;i void sort(int x,int n) int i,j,k,t; for(i=0;ib:a:b; return c; void main() int a=8; printf(“%dn”,max(a,b); C 程序设计 37 8.9 变量的存储类别 一、变量的动态存储和静态存储 全局变量与局部变量: 变量的作用域

温馨提示

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

评论

0/150

提交评论