c语言 课件第5章.ppt
《c语言 课件第5章.ppt》由会员分享,可在线阅读,更多相关《c语言 课件第5章.ppt(80页珍藏版)》请在三一文库上搜索。
1、1,第5章 函数,C 语言程序设计,2019/2/21,2019/2/21,2,第5章 函数与预处理命令,5.1 概述 5.2 函数的定义与调用 5.3 数组作函数参数 5.4 函数的嵌套调用和递归调用 5.5 局部变量和全局变量及其作用域 5.6 变量的存储类别及变量的生存期 5.7 函数的存储分类,2019/2/21,3,5.1 概述, 程序结构清晰,可读性好。 减少重复编码的工作量。 可多人共同编制一个大程序,缩短程序设计周期,提高程序设计和调试的效率。,使用函数的 好处,2019/2/21,4,【例5.1】求一个整数的立方。,int cube (int x) /* 函数定义 */ re
2、turn (x * x * x); main( ) int f, a; printf(“nEnter an integer number:“); scanf(“%d“, ,程序运行情况如下: Enter an integer number:2 2 * 2 * 2 = 8,函数调用,程序的执行总是 从main函数开始,2019/2/21,5, 一个C源程序可以由一个或多个源程序文件组成。C编译系统在对C源程序进行编译时是以文件为单位进行的。 一个C源程序文件可以由一个或多个函数组成。所有函数都是独立的。主函数可以调用其它函数,其它函数可以相互调用。 在一个C程序中,有且仅有一个主函数main。C
3、程序的执行总是从main函数开始,调用其它函数后最终回到main函数,在main函数中结束整个程序的运行。,说明,2019/2/21,6, 函数的种类,从函数定义形式分: 有参函数: 在主调(用)函数和被调(用)函数之间通过参数进行数据传递, 如: int cube (int x) 无参函数: 如:getchar( ) 在调用无参函数时,主调函数不需要将数据传递给无参函数。,从使用的角度看: 标准函数(库函数) 库函数是由系统提供的。如:getchar( )、sin(x)等。在程序中可以直接调用它们。附录A列出了C的部分库函数。 用户自定义函数。 如:例7.1中的cube函数。,2019/2/
4、21,7,【例5.2】无参函数的定义与调用。,void welcome ( ) printf(“*n“); printf(“ Welcome to China n“); printf(“*n“); main( ) welcome( );,程序的输出结果如下: * Welcome to China *,2019/2/21,8,5.2.1 函数的定义,函数定义的一般形式,函数类型 函数名(类型名 形式参数1, ) 说明语句 执行语句 ,例如:求两个数的最大值。 int max(int x,int y) int z; z = x y ? x : y; return( z ); ,类型省略时默认为in
5、t类型,2019/2/21,9,int max(x,y) int x,y; int z; z = x y ? x : y; return( z ); ,int max(x,y) int x,y; 或 int max(int x,y) ,或 int max(x,y) int x,y,z; z = x y ? x : y; return( z ); ,花括号中也可以为空,这种函数叫空函数 。 不能在函数体内定义其他函数,即函数不能嵌套定义。,形参也可以这样定义,2019/2/21,10,函数名(实参表列),在C语言中,把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数调用。例如
6、: welcome( ); if (iabs (a)max) max=iabs(a); m=max(c,max(a,b);,5.2.2 函数的调用,函数调用的一般形式:,2019/2/21,11,int sum100( ) int i,t=0; for (i=1; i=100; i+) t+=i; return (t); main( ) int s; s=sum100( ); printf(“%dn“, s); ,程序输出结果: 5050,int sum ( int x ) int i,t=0; for (i=1; i=x; i+) t+=i; return (t); main( ) int
7、s; s=sum (100); printf(“%dn“, s); ,【例5.3】求1100的累加和。,思考:两个程序有何不同,程序输出结果: 5050,?,2019/2/21,12,void swap(int x, int y) int z; z=x; x=y; y=z; printf(“nx=%d,y=%d“,x ,y); main( ) int a= 10,b=20; swap(a,b); printf(“na=%d,b=%dn“,a,b); ,5.2.3 函数参数与函数的返回值,1函数的形式参数与实际参数,程序输出结果: x=20,y=10 a=10,b=20,形式参数(形参),实际参
8、数(实参),【例5.4】编一程序,将主函数中的两个变量的值传递给swap函数中的两个形参,交换两个形参的值。,单向值传递,2019/2/21,13,有关形参和实参的说明:, 当函数被调用时才给形参分配内存单元。调用结束,所占内存被释放。 实参可以是常量、变量或表达式,但要求它们有确定的值。 实参与形参类型要一致,字符型与整型可以兼容。 实参与形参的个数必须相等。在函数调用时,实参的值赋给与之相对应的形参。“单向值传递”。,注意:在TC中,实参的求值顺序是从右到左。,2019/2/21,14,【例5.5】函数调用中实参的求值顺序。,void fun(int a,int b) printf(“a=
9、%d,b=%dn“,a,b); main( ) int m=5; fun(3+m, m+); ,程序输出结果: a=9,b=5,2019/2/21,15,2.函数的类型与函数的返回值,说明: 函数的类型决定了函数返回值的类型。若省略函数的类型,系统默认其为int型。 无返回值的函数应将其类型定义为void (空)类型。, 函数的类型,【例5.6】输出两个数中的大数。,max(int x,int y) int z; z=xy?x:y; return (z); /* 返回z的值 */ main( ) int a,b,c; scanf(“%d,%d“, ,2019/2/21,16,函数的返回值是通过
10、return语句带回到主调函数的,功能:终止函数的运行,返回主调函数,若有返回值,将返回值带回主调函数。,说明: 若函数没有返回值,return语句可以省略。 return语句中的表达式类型一般应和函数的类型一致,如果不一致,系统自动将表达式类型转换为函数类型。, 函数的返回值,return 语句格式:,return (表达式); 或 return 表达式 ; 或 return;,2019/2/21,17,【例5.8】计算并输出圆的面积。,s(int r) return 3.14*r*r; main( ) int r,area; scanf(“%d“, ,自动转换为int型,思考: 若要得到单
11、精度实型的圆面积,程序应如何修改,程序运行情况如下: 2 12,?,2019/2/21,18,5.2.4 对被调函数的声明和函数原型,变量要先定义后使用,函数也如此。即被调函数的定义要出现在主调函数的定义之前。如swap函数: 允许整型函数(且参数也是整型)的定义出现在主调函数之后。如max函数: 如果非整型函数在主调函数之后定义,则应在主调函数中或主调函数之前对被调函数进行声明。,void swap(int x, int y) main( ) swap(a,b); ,main( ) c=max(a,b); max(int x,int y) ,2019/2/21,19,对被调函数进行声明的一般
12、形式,函数类型 函数名(参数类型1 参数名1,); 或 函数类型 函数名(参数类型1,参数类型2,);,思考: 以下哪种情况需要在主调函数中对被调函数声明 被调函数定义在前,主调函数定义在后。 主调函数定义在前,被调函数定义在后,且被调函数的类型不是整型的。 被调函数定义在后,但被调函数的类型是整型。,第二种形式省略了参数名,此种形式也称为函数的原型。,?,2019/2/21,20,main( ) void calc(float x,float y,char opr); float a,b; char opr; printf(“nInput expression:“); scanf(“%f%c
13、%f“, ,对被调函数的声明,【例5.9】计算并输出两个数的和、差、积、商。,2019/2/21,21,图 5.2 验证哥德巴赫猜想,【例5.10】 哥德巴赫猜想之一是任何一个大于5的偶数都可以表示为两个素数之和。验证这一论断。,2019/2/21,22,#include “math.h“ int prime(int n); main( ) int a,b,c,n; scanf(“%d“, ,/* 穷举法判断素数 */ int prime(int n) int i; for (i=2; i=sqrt(n); i+) if (n%i=0) return 0; return 1; ,可以在main
14、函数的前面对prime函数进行声明。实际上,该声明可以省略,为什么?,程序如下:,2019/2/21,23,5.3 数组作函数参数,5.3.1 一维数组元素作函数参数,main( ) int a5,i,m ; for (i=0; i5; i+) scanf(“%d“, ,【例5.11】求5个数中的最小值。,int min(int x, int y) return (xy?x:y); ,用打擂台方法求最小值。m相当于擂主,2019/2/21,24,5.3.2 一维数组名作函数参数,数组名表示数组在内存中的起始地址。 例如:数组a在内存中从2000地址开始存放,则a的值为2000。2000是地址值
15、,是指针类型的数据(第8中将介绍指针类型),不能把它看成是整型或其他类型数据。 实参是数组名,形参也应定义为数组形式,形参数组的长度可以省略,但 不能省,否则就不是数组形式了。 【例5.12】用冒泡法将10个整数排序。,2019/2/21,25,void sort(int b ,int n); void printarr(int b ); main( ) int a10 = 11,22,63,97,58,80,45, 32,73,36; printf(“Before sort:n“); printarr(a); sort(a,10); printf(“After sort:n“); print
16、arr(a); ,void printarr(int b10) int i; for (i=0; i10; i+) printf(“%5d“,bi); printf(“n“);,void sort(int b , int n) int i,j,t; for (i=1; ibj+1) t=bj;bj=bj+1;bj+1=t; ,2019/2/21,26,图5.3 调用sort函数,2000,b,形参 b 实际是一个 可以存放地址的变量,a:2000,实参赋给形参,2019/2/21,27,#include “stdio.h“ main( ) void scat(char str1 ,char s
17、tr2 ); char s150,s250; int i,k; printf(“Input s1:“); gets(s1); printf(“Input s2:“); gets(s2); scat(s1,s2); printf(“Output s1:%sn“,s1); printf(“Output s2:%sn“,s2); ,void scat(char str1 ,char str2 ) int i=0,k=0; while (str1i!=0) i+; while (str2k!=0) str1i=str2k; i+; k+; str1i=0; ,scat函数还可简化为: void sca
18、t(char str1 ,char str2 ) int i=0,k=0; while (str1i) i+; while (str1i+=str2k+); ,【例5.13】编程序,实现字符串连接。,2019/2/21,28,以二维数组为例。二维数组名作实参时,对应的形参也应该定义为一个二维数组形式。对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。 【例5.14】编程序,将矩阵转置。设转置前为a矩阵,转置后为b矩阵,如下所示:,思路:将a00b00,a01 b10,a02b20, a10b01,aijbji,。,5.3.3 多维数组作函数参数,2019/2/21,29,voi
19、d turn( ); main( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i,j,b43; turn(a,b); printf(“array b:n“); for (i=0; i4; i+) for (j=0; j3; j+) printf(“%5d“,bij); printf(“n“); ,/* 矩阵转置函数 */ void turn(int arra 4,int arrb 3) int r, c; for (r=0; r3;r+) for (c=0; c4; c+) arrbcr=arrarc; ,2019/2/21,30,5.4 函数的嵌套调用
20、和递归调用,main函数 调用函数 A; ,函数 A 调用函数 B; ,函数 B ,5.4.1 函数的嵌套调用,2019/2/21,31,【例5.15】函数的嵌套调用,main( ) int n=3; printf (“%dn“,sub1(n); ,sub1(int n) int i,a=0; for (i=n; i0; i-) a+=sub2(i); return a ; ,sub2(int n) return n+1; ,程序输出结果: 9,2019/2/21,32,5.4.2 函数的递归调用,1递归的基本概念,递归调用:一个函数直接或间接地调用了它本身,就称为函数的递归调用。 递归函数:
21、在函数体内调用该函数本身。,int sub(int x) int y,z; if( ) z=sub(y); else return ; ,例如:,直接调用sub 函数本身,2019/2/21,33,2递归函数的执行过程,【例5.16】编一递归函数求n!。,思路:以求4的阶乘为例: 4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。 递归结束条件:当n=1或n=0时,n!=1。 递归公式:,2019/2/21,34,程序如下:,float fact (int n) float f=0; if(n0) printf(“n0,error!“); else if (n=0 | n=1
22、) f=1; else f=fact(n-1)*n; return (f); ,main( ) int n; float y; printf(“nInput n:“); scanf(“%d“, ,运行情况如下: Input a integer number:4 4!=24,2019/2/21,35,递归调用过程,2019/2/21,36,3编制递归函数的方法, 数值型问题递归函数的编程方法 对于数值型问题,首先要找出解题的数学公式,这个公式必须是递归定义的,且所处理的对象要有规律地递增或递减,然后确定递归结束条件。 【例5.17】编一递归函数求xn 。 思路:首先把xn转化成递归定义的公式,再
23、找出递归结束条件:当n=0时,xn=1。,2019/2/21,37,程序如下:,long xn(int x,int n) long f=0; if (n0) printf(“n0,data error!n“); else if (n=0) f=1; else f=x*xn(x,n-1); return (f); main( ) int n,x; long y; scanf(“%d,%d“, ,程序运行情况如下: 2,10 1024,2019/2/21,38, 非数值型问题递归函数的编程方法,有些问题不能直接用数学公式求解。非数值型问题比数值型问题更难找出递归的算法。它不能用一个递归公式表示。解
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c语言 课件第5章 语言 课件
链接地址:https://www.31doc.com/p-2142625.html