C 程序设计简明教程》-雷新贤 C06

上传人:E**** 文档编号:89385052 上传时间:2019-05-24 格式:PPT 页数:49 大小:323KB
返回 下载 相关 举报
C 程序设计简明教程》-雷新贤 C06_第1页
第1页 / 共49页
C 程序设计简明教程》-雷新贤 C06_第2页
第2页 / 共49页
C 程序设计简明教程》-雷新贤 C06_第3页
第3页 / 共49页
C 程序设计简明教程》-雷新贤 C06_第4页
第4页 / 共49页
C 程序设计简明教程》-雷新贤 C06_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《C 程序设计简明教程》-雷新贤 C06》由会员分享,可在线阅读,更多相关《C 程序设计简明教程》-雷新贤 C06(49页珍藏版)》请在金锄头文库上搜索。

1、第6章 函数,6.1 函数定义 6.2 函数调用 6.3 参数传递 6.4 变量的作用域与生存 6.5 函数应用案例 6.6 自主学习,函数的概念 例: 设计学生 信息管理系统 C 函数:实现一个特定功能的程序段。 标准函数:由系统提供,直接按规则使用。,信息管理,数据录入,查询,报表,维护,档案录入,成绩录入,选课,用户定义的函数:根据需要编写的程序段。 注:C 程序总是从main函数开始执行,在main函 数中结束整个程序的运行。 例: main() printstar(); print_mess(); printstar(); printstar() printf(“*n”); prin

2、t_mess() printf(“ How do you do!”); ,6.1函数定义 6.1.1 引例多边形面积计算 【例6.1】 已知多边形的各条边和对角线的长度,计算多边形的面积。 (1)分析 任意一个多边形可沿对角线分成若干个三角形,如图6-1所示,只要三角形面积可求,多边形的面积就迎刃而解。而如图6-2所示的任意一个三角形,已知三条边长x,y,z,它的面积可以用下面公式求得,其中c为三角形周长的一半。,(2)程序代码 #include #include float area(float x,float y,float z) float c,s; c=(x+y+z)/2; s=sqr

3、t(c*(c-x)*(c-y)*(c-z); return s; void main( ) float a,b,c,d,e,f,g,s1,s2,s3; printf(“请输入多边形5条边长:“); /输入的边长和对角线长必须能构成5边形 scanf(“%f%f%f%f%f“, ,6.1.2 函数定义 (1)无参函数: 函数类型 函数名() 函数体语句块 return 返回值; (2)有参函数: 函数类型 函数名(形式参数表列) 函数体语句块 return 返回值; ,函数类型:指定函数值的类型,若是 void 表示函数没有返回值。 函数名: 应该取有助记忆的名字。 形式参数:传递数据之用(接收

4、数据)。 例: int max(int x,int y) int z; z=xy?x:y; return(z); 函数体语句块:是实现函数功能的代码。 return语句:结束函数代码的执行并返回,同时将值带给主调函数。 【例6.2】 编一函数求两个数的最大值。,#include float max(float a, float b) if(ab) return a; /返回变量a的值 else return b; /返回变量b的值 void main( ) float a,b,c; printf(“请输入两个数:“); scanf(“%f%f“, 运行结果如图所示。,6.2函数调用 6.2.1

5、 函数调用 函数的调用方式:(三种) 语句:main() printstar(); . void printstar() printf(“*n”); 表达式: main() int a,b,c; c=max(a,b); int max(int x,int y) . 函数参数: 例: m=max(a,max(b,c);,调用过程:,void display( ) ,int max(int x, int y) ,void main( ) c=max(a,b); display( ); ,调用过程: 在C 语言中函数调用的整个过程就是栈空间操作的过程。 函数调用时的工作: 给函数的形式参数和内部变量

6、分配存储空间。 保护调用函数的运行状态和返回地址。 传递参数。 将控制转交被调函数。 函数调用结束,分配的存储空间被收回 例: main() f2(int s) int c,b,a=6;b=12; int x; c=max( a,b); int max(int x,int y) int z; ;f2(n); ,6.2.2 函数声明 被调用函数必须已经存在(库函数、用户定义) 是库函数,必须在源程序开始用#include 命令 包含有关信息。例: #include “math.h” 用户定义的函数: .定义在主调函数之前,不必加以说明。 .在主调函数中,对被调用函数加以说明(函数声明 )。 如下

7、面这段程序: #include void fun (int x, int y); / 函数声明 void main( ) fun(2, 4) ; /函数调用 void fun(int x, int y) / 函数定义 ,【例6.3】对x=1,2,.,10,求函数f(x)=x-10*cos(x)-5*sin(x)的最大值。 #include #include void main() float f(float); /函数声明 f float max,x; max=f(1); /调用函数 for(x=2;x=10;x+) if(maxf(x) max=f(x); printf(“%.3f“,max

8、); float f(float y) /定义函数 y=y-10*cos(y)-5*sin(y); return (y); ,【例6.4】利用生成随机整数的库函数rand( )产生若干个随机整数。库函数rand( )需要的头文件为stdlib.h。 #include #include void main( ) int i; printf(“产生5个 0 到 9 之间的随机数序列:“); for(i=0; i5; i+) printf(“%d “, rand( )%10); 运行结果如图所示。,6.2.3 函数嵌套和递归调用 在C语言中函数的定义都是独立的、平行的。即一个函数的定义体中不能包含另

9、一个函数的定义。但可以在调用一个函数的过程中,又调用另一个函数。 例: f1() f2(); f2() f3(); f3() . main() .f1();,递归是一种解决问题的方法,将一个大问题逐步划分为规模更小且处理方式相同的新问题,直到新问题可以轻而易举地解决。比如说一个人要搬50块石头,他想,只要先搬走49块,那剩下的一块就能搬完了;然后考虑那49块,只要先搬走48块,那剩下的一块就能搬完了。递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。,【例6.5】 用递归法求n!。 求n!可以用n(n-1)!来计算,而(n-1)!=(n-1)(n-2)!,

10、这样不断递推下去,最终问题归结到求1!。表示该问题的递归公式如下: 可以用一个函数来描述上述过程: #include int fac (int n) if(n0) printf(“data error! “); return 0; else if (n=0|n=1) / 递归终止条件 return 1; else return n*fac (n-1); / 递归公式 * ,主函数调用fac,求输入整数的阶乘: void main( ) int n; printf(“请输入一个整数:“); scanf(“%d“, 运行结果如图所示:,整个求阶乘的过程都是在fac中完成的,假设要求3!,递归调用的

11、过程如下:,例:用递归程序打印如下的图形: * * * * * * * pt(int i) * * * * * * int j; * * * * * static k=1; * * * * for(j=0;jk;j+)printf(“ “); * * * for(j=0;ji;j+)printf(“*”); * * printf(“n”); * k+=1; i-; main() if(i!=0) pt(i); int i; scanf(%d”, ,6.3 参数传递 6.3.1 形参和实参 形式参数:定义函数时为准备接收数据而设。 实际参数:调用函数时将确定的数据传给对应形参 main() in

12、t a,b,c; scanf(“%d,%d”, ,7 1,7 1,7,6.3.2 传值和传地址 1. 值传递方式 实参的值 形参(变量) void swap(int x, int y) int a; a=x,x=y,y=a; main() int a,b; scanf(“%d,%d”, 若运行时输入 10 ,20 输出为 ?,10 20,10 20,2. 地址传递方式 实参 形参 形参:数组名或者指针变量 void swap(int *x, int *y) int a; a=*x,*x=*y,*y=a; main() int a,b; scanf(“%d,%d”, 若运行时输入 10 ,20

13、输出为 ?,6.3.3 数组作为参数 数组作为函数参数有两种形式: (1)数组元素作为参数,这与前面介绍的普通变量作参数一样,相当于传值。 (2)数组名作为参数,这里只介绍形参和实参均为数组的情况,其他在第8章介绍。 如果实参、形参都是数组名,则传递方式为传地址方式。调用时,将实参数组的首地址赋予对应形参数组作为其首地址,也就是形参数组与实参数组拥有相同地址,即他们占用了相同的内存,即这段内存是主调函数的数组和被调函数的数组共享的。这就是说,在函数中对形参数组的修改,实际上就是对实参数组的修改,所以当函数执行完返回主调函数时,发现主调函数中的数组也发生了变化。数组作为参数传递的核心是实参数组和

14、形参数组“共享”存储空间。,【例6.6】数组元素作为参数 #include void swap(int x,int y) int z; z=x; x=y; y=z; void main( ) int a2=1,2; swap(a0,a1); printf(“a0=%d a1=%dn“,a0,a1); 运行结果如图所示:,【例6.7】数组名作为参数 #include void swap (int x ) int z; z=x0; x0=x1; x1=z; void main( ) int a2=1,2; swap (a); printf(“a0=%d a1=%dn“,a0,a1); 运行结果如图

15、所示。,【例】将数组中最大数与第一个数交换。 void f ( int b ,int n) int max,max_i,i; max=b0,max_i=0; for ( i=1; in; i+) if ( maxbi ) max=bi;max_i=i; max=b0,b0=bmax_i,bmax_i=max; return; main() void f(); int a10,i; for( i=0;i10;i+) scanf(“%d”, ,6.4 变量的作用域与生存期 C程序常常由主函数和子函数组成,一个在主函数中可以访问的变量,在子函数中就不一定能访问。我们把变量可以使用的程序区域称为变量的作用域。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号