c语言课件第七章.ppt
《c语言课件第七章.ppt》由会员分享,可在线阅读,更多相关《c语言课件第七章.ppt(71页珍藏版)》请在三一办公上搜索。
1、共 71 页 第 1 页,第七章,大连理工大学,函 数,共 71 页 第 2 页,本章要点函数的定义函数的调用函数间的数据传递变量的存储类型变量的作用范围内部函数和外部函数,共 71 页 第 3 页,C程序是函数的集合体,每个函数是一个独立的程序模块。有一个主函数,若干个子函数,程序总是从主函数开始执行;函数可集中或分散存放在一个或多个源程序文件中。所有子函数地位平等,可互相调用、自我调用。引入函数的优点:减少重复编写程序的工作量;使程序便于调试和阅读。,函数,C语言程序的结构,7.1 函数的概念和函数的定义,共 71 页 第 4 页,数学函数 math.h字符和字符串函数 ctype.h,s
2、tring.h输入/输出函数 stdio.h动态存储分配函数 calloc(),malloc(),C函数的分类,共 71 页 第 5 页,7-1 输入三个整数,计算它们的和并输出运算结果。main()int a,b,c,sum;scanf(%d,%d,%d,int add(int x,int y,int z)int s;s=x+y+z;return s;,函数示例,定义的求和函数,共 71 页 第 6 页,7.1.2 函数的定义,定义函数应包括的内容:(1)指定函数的名字,以便以后按名调用;(2)指定函数的类型,即函数值的类型;(3)指定函数的参数的名字和类型(有参);(4)指定函数执行的操作
3、,即函数完成的功能。,在程序中用到的所有函数,必须先定义,后使用。,共 71 页 第 7 页,定义函数的一般形式类型标识符 函数名(形式参数表)说明部分 语句,共 71 页 第 8 页,1.无参函数的定义形式 类型标识符 函数名()说明部分 语句,例7-1 print_message()printf(How are you!n);,共 71 页 第 9 页,例7-2 int max(int x,int y)int z;z=xy?x:y;return z;,类型标识符 函数名(形式参数表列)说明部分 语句,int max(x,y)int x,y;int z;z=xy?x:y;return z;,
4、形参变量的说明(传统形式),形参变量的说明(现代形式),2.有参函数的定义形式,共 71 页 第 10 页,3.形式参数说明形式参数:在定义函数时函数名后面括弧中的变量名在形参表中说明的形参,在函数体中不再说明,可以同一般变量一样直接使用。形参调用前不占内存单元,调用时占用,调用后释放。形参是函数的内部变量,只在函数内部才有意义。对每个形参必须指明其名字和数据类型。多个形参用逗号分隔。,共 71 页 第 11 页,7.1.3 函数的调用,1.函数调用的一般形式为:函数名(实际参数列表);或 函数名(实际参数列表)说明:实参必须有确定的值,可以是常量、变量、表达式及函数调用。实参与形参的类型、个
5、数、顺序必须一致。多个实参用逗号分隔。,2.执行过程:计算各个表达式;把得到值赋给对应的形参;执行函数体;遇到return语句或执行完最后一条语句,返回到函数调用处。,共 71 页 第 12 页,(1)函数语句:(把函数调用作为一个语句)一般形式:函数名(实际参数表);使用情况:这种方式常用于调用一个可以忽略返回值或没有返回值的函数,只要求函数完成一定的操作。例如:print_message();,3.函数调用的具体方式,(2)函数表达式:(函数调用出现在一个表达式中)一般形式:变量名=函数表达式 使用情况:这种表达式称为函数表达式。要求函数带回 一个确定的值参加表达式的运算。例如:c=3+m
6、ax(a,b);d=pow(c,i);,共 71 页 第 13 页,7.1.4 函数的返回值,2.函数的返回值语句 一般形式:return 表达式;或 return(表达式);功能:退出函数,将表达式的值带回主调函数,回到程序原来的位置继续执行。,定义:通过函数调用使主调函数得到一个确定 的值,称为函数的返回值。,共 71 页 第 14 页,说明:return语句只能把一个返回值传递给调用函数。返回值的类型为定义的函数类型,若return语句中表达式类型与函数类型不一致,以函数类型为准。返回值可以是有确定值的常量、变量或表达式,也可以是地址。当返值是地址时,应该用指针接受。无返回值的函数,定义
7、为void类型(无类型函数)。一个函数中可以有多个返回语句。,共 71 页 第 15 页,例7-3 用函数facto计算 m 阶乘。main()int m;long mm;long facto();scanf(%d,函数执行过程,main()mm=facto(m);,facto(x)return(y);,调用,返回,函数调用,共 71 页 第 16 页,main()int a,b,c;scanf(“%d,%d”,例7-4 int max(int x,int y)int z;z=xy?x:y;return(z);,形参:通知系统 要预留内存位置.,实参:在运行时把值传给函数.,把函数的 结果赋给
8、函数名,形参与实参、函数名与返回值之间的关系,共 71 页 第 17 页,/*1*/*2*/*3*/*4*/*5*/*11*/*12*/*13*/*14*/*15*/*16*/,main()int a,b,c;scanf(%d,%d,断点,保护断点和现场,转向11,入口,虚实结合a-x,b-y,返回断点恢复现场带回函数值,数据在函数间的传递,共 71 页 第 18 页,int max(x,y)int x,y;int z;if(xy)z=x;else z=y;return(z);,返回整型函数值,int max(x,y)int x,y;int z;if(xy)z=x;else z=y;retur
9、n;,返回不确定的函数值,max(x,y)int x,y;int z;if(xy)z=x;else z=y;,无返回语句在此返回,缺省类型说明,数据返回值,共 71 页 第 19 页,例7-5用函数计算浮点数x的n次方,其中n为int型(n=0),double power(double x,int n)double p=1;int i;if(n0)for(i=1;i=n;i+)p=p*x;return p;,main()printf(“%lf”,power(3,5);,共 71 页 第 20 页,值传递:在函数调用时,实参将其值传递给形参。实参对形参的数据传递是“值传递”,即单向传递,只由实参
10、传递给形参,而不能由形参传回来给实参。实参与形参占用不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。在执行一个被调用函数时,形参的值如果发生变化,并不会改变主调函数中实参的值。,7.1.5 函数参数的传递方式,值传递的优点:被调用的函数不可能改变调用函数中变量的值,而只能改变它的局部的临时副本。,值传递的缺点:每个形式参数仅能传递一个数据,不适用需要在函数之间传递大量数据。,地址传递:将实参的地址传递给形参,实参和形参指向同一内存空间,对形参的修改,可以直接影响实参。,共 71 页 第 21 页,例7-6 编写函数
11、交换两个变量的值。#include“stdio.h”swap(int x,int y)int temp;temp=x;x=y;y=temp;printf(x=%d,y=%dn,x,y);main()int a,b;a=5;b=10;printf(a=%d,b=%dn,a,b);swap(a,b);printf(a=%d,b=%dn,a,b);,运行结果:a=5,b=10 x=10,y=5a=5,b=10,共 71 页 第 22 页,7.1.6 函数的声明,问题的提出:C语言程序可由若干文件组成,每一个文件可以单独编译。若函数使用在定义之前,必须在调用函数前为编译程序提供所用函数的返回值类型和参
12、数的类型、个数,以保证函数调用成功,就需要对函数声明。,同变量一样,函数的调用也应该遵循“先说明,后使用”的原则。,函数声明的一般形式:类型标识符 函数名(类型1 形参1,类型2 形参2,);功能:通知编译程序函数值类型、参数个数及类型,为编译程序进行类型检查提供依据。,共 71 页 第 23 页,main()float add(float x,float y);float a,b,c;scanf(“%f,%f”,/*定义add函数*/float add(float x,float y)float z;z=x+y;return(z);,对被调用函数的说明,作为表达式被调用,共 71 页 第 2
13、4 页,3.函数声明和函数定义的区别,函数声明的作用是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。,函数定义是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。,函数声明与函数定义的首部唯一区别:函数说明语句的()之后必须有分号,而函数定义头部的()之后没有分号。,共 71 页 第 25 页,4.可省略被调用函数声明的三种情况,函数的返回值为整型或字符型时(按整型处理),max(int x,int y)int z;z=xy?x:y;return(z);main()int a,b,c;
14、scanf(“%d,%d”,建议都加以声明,共 71 页 第 26 页,被调用函数在主调函数之前定义,float add(float x,float y)float z;z=x+y;return(z);main()float a,b;scanf(“%f,%f,“,共 71 页 第 27 页,在所有函数定义之前说明,char letter(char,char);float f(float,float);int i(float,float);main().char letter(char c1,char c2)float f(float x,float y)int i(float,float),在
15、所有函数之前说明函数类型,定义函数letter、f和i,共 71 页 第 28 页,7.2 数组作函数参数,数组元素可以作函数的实参 数组元素作为表达式的组成部分做函数的实参可以单向传递给形参。例如:int a10;x=power(a6,5);数组名可以作函数的实参和形参多维数组可以作函数参数,共 71 页 第 29 页,一维数组作函数参数,形参的写法为:类型说明符 形参数组名数组长度 例如:float average(float array10)main()float b10;int i;for(i=0;i10;i+)scanf(“%f”,7.2.1 一维数组作函数参数,说明:形参和实参分别
16、定义数组数组做函数参数时,实参应用数组名,必须有确切值实参数组和形参数组类型应一致。,共 71 页 第 30 页,说明:实参数组和形参数组大小不一定一致,形参数组可以不指定大小。(指一维数组)。数组名除作为变量的标识外,还代表该数组在内存中存放区域的首地址。数组名做函数实参与形参之间是“地址传递”,实参数组将数组的起始地址传递给形参数组。编译系统不再为形参数组分配存储单元。在函数体中对形参数组的元素操作时就是对实参数组的元素进行操作。形参数组各元素的值发生变化会使实参数组各元素的值发生同样的变化。数组名作函数参数可实现大量数据的传递,无须返回数组值。,共 71 页 第 31 页,例7-7 阅读
17、如下程序,给出打印结果 void swap(int a)int t;t=a0;a0=a1;a1=t;main()int b2=1,2;swap(b);printf(“b0=%d,b1=%dn”,b0,b1);,结果:,程序运行演示,可不定义 长度,在调用函数过程中改变了原数组的值,实参数组与形参数组共享一组存储空间,,地址传递,共 71 页 第 32 页,例7-8 编写函数求n元数组的平均值。程序设计:double average(int a,int n)int i;double s=0;for(i=0;in;i+)s=s+ai;return s/n;主函数调用如何编写?,用另外一个参数表示数
18、组的长度,共 71 页 第 33 页,例7-9:用选择法对数组中10个整数按由小到大排序.,程序设计思想:,函数sort(array,n):实现数组元素由小到大排序。,主程序:输入array数组,调用 sort 函数比较,输 出排序后的array数组。,void sort(int array,int n)int i,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;if(k!=i)t=arrayk;arrayk=arrayi;arrayi=t;,共 71 页 第 34 页,main()int a10,i;printf(“
19、enter array:n”);for(i=0;i10;i+)scanf(“%d”,由于地址传递,实参数组 a 改变,数组名做参数的好处:,由于只需复制一个地址值,而无须复制全部需要处 理的数据,因此节约存储空间并提高效率。,由于主调函数和被调函数是在相同的内存区域上对 数据进行操作,因此可以实现数据的同步更新。,函数调用,共 71 页 第 35 页,7.2.2 二维数组作函数参数,二维数组作函数参数,形参的写法为:类型说明符 形参名 数组长度1 数组长度2说明:形参数组定义时可以指定或省略第一维的大小 例如:int array 310;或 int array 10;int array 3;和
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课件 第七

链接地址:https://www.31ppt.com/p-5385175.html