c语言课件第七章.ppt

上传人:本田雅阁 文档编号:2143368 上传时间:2019-02-21 格式:PPT 页数:71 大小:723.51KB
返回 下载 相关 举报
c语言课件第七章.ppt_第1页
第1页 / 共71页
c语言课件第七章.ppt_第2页
第2页 / 共71页
c语言课件第七章.ppt_第3页
第3页 / 共71页
亲,该文档总共71页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《c语言课件第七章.ppt》由会员分享,可在线阅读,更多相关《c语言课件第七章.ppt(71页珍藏版)》请在三一文库上搜索。

1、共 71 页 第 1 页,第七章,大连理工大学,函 数,共 71 页 第 2 页,本章要点 函数的定义 函数的调用 函数间的数据传递 变量的存储类型 变量的作用范围 内部函数和外部函数,共 71 页 第 3 页,C程序是函数的集合体,每个函数是一个独立的程序模块。 有一个主函数,若干个子函数,程序总是从主函数开始执行; 函数可集中或分散存放在一个或多个源程序文件中。 所有子函数地位平等,可互相调用、自我调用。 引入函数的优点: 减少重复编写程序的工作量;使程序便于调试和阅读。,函数,C语言程序的结构,7.1 函数的概念和函数的定义,共 71 页 第 4 页,数学函数 math.h 字符和字符串

2、函数 ctype.h, string.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、型; (3)指定函数的参数的名字和类型(有参); (4)指定函数执行的操作,即函数完成的功能。,在程序中用到的所有函数,必须先定义,后使用。,共 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; ,类型标识符 函数名(形式参

4、数表列) 说明部分 语句 ,int max ( x, y) int x,y; int z; z=xy?x : y; return z; ,形参变量的说明(传统形式),形参变量的说明(现代形式),2. 有参函数的定义形式,共 71 页 第 10 页,3. 形式参数说明 形式参数: 在定义函数时函数名后面括弧中的变量名 在形参表中说明的形参,在函数体中不再说明,可以同一般变量一样直接使用。 形参调用前不占内存单元,调用时占用,调用后释放。 形参是函数的内部变量,只在函数内部才有意义。 对每个形参必须指明其名字和数据类型。 多个形参用逗号分隔。,共 71 页 第 11 页,7.1.3 函数的调用,1

5、. 函数调用的一般形式为: 函数名(实际参数列表); 或 函数名(实际参数列表) 说明: 实参必须有确定的值,可以是常量、变量、表达式及函数调用。 实参与形参的类型、个数、顺序必须一致。 多个实参用逗号分隔。,2. 执行过程: 计算各个表达式; 把得到值赋给对应的形参; 执行函数体; 遇到return语句或执行完最后一条语句,返回到函数调用处。,共 71 页 第 12 页,(1) 函数语句: (把函数调用作为一个语句) 一般形式:函数名(实际参数表); 使用情况:这种方式常用于调用一个可以忽略返回值 或没有返回值的函数,只要求函数完成一定的操作。 例如: print_message( );,3

6、. 函数调用的具体方式,(2) 函数表达式:(函数调用出现在一个表达式中) 一般形式:变量名=函数表达式 使用情况:这种表达式称为函数表达式。要求函数带回 一个确定的值参加表达式的运算。 例如:c=3+max(a, b); d=pow(c, i);,共 71 页 第 13 页,7.1.4 函数的返回值,2. 函数的返回值语句 一般形式: return 表达式; 或 return (表达式); 功能:退出函数,将表达式的值带回主调函数,回到程序原来的位置继续执行。,定义:通过函数调用使主调函数得到一个确定 的值,称为函数的返回值。,共 71 页 第 14 页,说明: return语句只能把一个返

7、回值传递给调用函数。 返回值的类型为定义的函数类型,若return语句中表达式类型与函数类型不一致,以函数类型为准。 返回值可以是有确定值的常量、变量或表达式,也可以是地址。当返值是地址时,应该用指针接受。 无返回值的函数,定义为void类型(无类型函数)。 一个函数中可以有多个返回语句。,共 71 页 第 15 页,例7-3 用函数facto计算 m 阶乘。 main( ) int m; long mm; long facto( ); scanf(“%d“, ,函数执行过程,main ( ) mm = facto( m ); ,facto ( x ) return (y ); ,调用,返回,

8、函数调用,共 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); ,形参:通知系统 要预留内存位置.,实参:在运行时把值传给函数.,把函数的 结果赋给函数名,形参与实参、函数名与返回值之间的关系,共 71 页 第 17 页,/*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*11*/ /*12*/ /*13*/ /*14*/ /*15*/ /*16*/,main() int a,b,c; scanf(“%d,%d“, ,断点,保

9、护断点和 现场,转向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; return; ,返回不确定 的函数值,max(x,y) int x,y; int z; if (xy) z=x; else z=y; ,无返回语句 在此返回,缺省类型说明,数据返回值,共 71 页 第 19 页

10、,例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 页,值传递: 在函数调用时,实参将其值传递给形参。 实参对形参的数据传递是“值传递”,即单向传递,只由实参传递给形参,而不能由形参传回来给实参。 实参与形参占用不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,

11、实参单元仍保留并维持原值。在执行一个被调用函数时,形参的值如果发生变化,并不会改变主调函数中实参的值。,7.1.5 函数参数的传递方式,值传递的优点:被调用的函数不可能改变调用函数中变量的值, 而只能改变它的局部的临时副本。,值传递的缺点:每个形式参数仅能传递一个数据,不适用需 要在函数之间传递大量数据。,地址传递:将实参的地址传递给形参,实参和形参指向同一 内存空间,对形参的修改,可以直接影响实参。,共 71 页 第 21 页,例7-6 编写函数交换两个变量的值。 #include “stdio.h” swap ( int x, int y) int temp; temp=x; x=y; y

12、=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=5 a=5 ,b=10,共 71 页 第 22 页,7.1.6 函数的声明,问题的提出:C语言程序可由若干文件组成,每一个文件可以单独编译。若函数使用在定义之前,必须在调用函数前为编译程序提供所用函数的返回值类型和参数的类型、个数,以保证函数调用成功,就需要对函数声

13、明。,同变量一样,函数的调用也应该遵循“先说明,后使用”的原则。,函数声明的一般形式: 类型标识符 函数名(类型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 页 第 24 页,3.

14、 函数声明和函数定义的区别,函数声明的作用是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。,函数定义是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。,函数声明与函数定义的首部唯一区别:函数说明语句的( )之后必须有分号,而函数定义头部的( )之后没有分号。,共 71 页 第 25 页,4. 可省略被调用函数声明的三种情况,函数的返回值为整型或字符型时(按整型处理),max(int x,int y) int z; z=xy? x:y; return(z); main( ) int a

15、,b,c; 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(flo

16、at x,float y) int i(float,float) ,在所有函数之前 说明函数类型,定义函数 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

17、=0;i10;i+) scanf(“%f”, ,7.2.1 一维数组作函数参数,说明: 形参和实参分别定义数组 数组做函数参数时,实参应用数组名, 必须有确切值 实参数组和形参数组类型应一致。,共 71 页 第 30 页,说明: 实参数组和形参数组大小不一定一致,形参数组可以不指定大小。(指一维数组)。 数组名除作为变量的标识外,还代表该数组在内存中存放区域的首地址。 数组名做函数实参与形参之间是“地址传递”,实参数组将数组的起始地址传递给形参数组。编译系统不再为形参数组分配存储单元。 在函数体中对形参数组的元素操作时就是对实参数组的元素进行操作。形参数组各元素的值发生变化会使实参数组各元素的

18、值发生同样的变化。 数组名作函数参数可实现大量数据的传递,无须返回数组值。,共 71 页 第 31 页,例7-7 阅读如下程序,给出打印结果 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 ,i

19、nt n) int i; double s=0; for(i=0;in;i+) s=s+ai; return s/n; 主函数调用如何编写?,用另外一个参数表示数组的长度,共 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+

20、) if (arrayjarrayk) k=j; if (k!=i) t=arrayk; arrayk=arrayi; arrayi=t; ,共 71 页 第 34 页,main ( ) int a10, i; printf(“enter array: n”); for (i=0; i10; i+) scanf (“ %d ”, ,由于地址传递,实参数组 a 改变,数组名做参数的好处:,由于只需复制一个地址值,而无须复制全部需要处 理的数据,因此节约存储空间并提高效率。,由于主调函数和被调函数是在相同的内存区域上对 数据进行操作,因此可以实现数据的同步更新。,函数调用,共 71 页 第 35

21、页,7.2.2 二维数组作函数参数,二维数组作函数参数,形参的写法为: 类型说明符 形参名 数组长度1 数组长度2 说明: 形参数组定义时可以指定或省略第一维的大小 例如 : int array 310; 或 int array 10; int array 3 ; 和int array ;错误,实参数组可以大于形参数组 例如:实参数组定义为:int array 510; 形参数组定义为:int array 310; 这时形参数组只取实参数组的一部分,其余部分不起作用。,共 71 页 第 36 页,例7-10 写一函数,求3*4矩阵中的最大值。 int max_value(int array 4

22、) int i, j, max; max=array00; for(i=0 ; imax) max=arrayij; return (max); main() int a34=1,3,5,7,2,4,6,8,10,12,15,17; printf(“max=%dn”,max_value(a); ,共 71 页 第 37 页,7.3 函数的嵌套调用和递归调用,7.3.1 函数的嵌套调用 嵌套定义:在定义一个函数时,该函数体内包含另一个函数的定义。 嵌套调用:在调用一个函数的过程中,又调用另一个函数。 C语言不能嵌套定义,但可以嵌套调用!,共 71 页 第 38 页,两层嵌套的例子,共 71 页

23、第 39 页,7.3.2 函数的递归调用,f 函数,调用 f函数,1. 递归的概念: 在调用一个函数的过程中直接或间接地调用该函数本身。 直接调用: int f(x) int x; int y,z; z=f(y); return (2*z); ,共 71 页 第 40 页,int f1(x) int x; int y,z; z=f2( y); return (2*z); ,int f2(t) int t; int a,c; c=f1(a); return (3+c); ,间接调用:,共 71 页 第 41 页,递归函数的执行过程: -递归调用:记住本次现场,递归调用。 -终了调用:返回上次调用

24、现场。 特点: -是无终止的递归调用,因此,应该给定一 个限制递归次数的条件。 -结构简练。,共 71 页 第 42 页,float fac( int n) float f; if(n0) printf(“n0,data error!n”); else if(n=0)|(n=1) f=1; else f=fac(n-1)*n ; return f; ,main() int n; float f; scanf(“%d”, ,f(n)=,1 (n=1,0),f(n-1)*n (n1),例7-11 用递归法求n!,不能赋给函数名,共 71 页 第 43 页,递归函数fac的求解过程,以求9的阶乘为例

25、:,fac(9)=9*fac( 8),fac(8)=8*fac( 7),fac(2)=2*fac( 1),fac(1)=1,fac(9)=9*fac( 8),fac(8)=8*fac( 7),fac(2)=2*1,fac(3)=3*fac( 2),fac(3)=3*2*1,下 推,回 代,共 71 页 第 44 页,例7-12 用递归法将一个整数n转换成字符串。例如输入256,应输出“256”,n的位数不固定,可以是任意位数的整数。,void tranvers(int n) if(n/10!=0) tranvers(n/10); printf(“%c“,n%10+0); ,main( ) in

26、t n; printf(“please input an integral number”); scanf(“%d“, ,共 71 页 第 45 页,共 71 页 第 46 页,变量的数据类型,char 型 int 型 float 型 double 型,总结:数据类型决定为变量分配的内存单元的长度,数据的存放 形式。(从程序设计角度,决定了可以表示的数的范围),问题:1. 何时为变量分配内存单元? 2. 变量位于内存的什么位置? 3. 变量的有效作用范围?,7.4 变量的作用域和存储方法,(VC+环境),共 71 页 第 47 页,变量的作用域和生存期: 变量的作用域 指一个变量在程序中的有效

27、范围。(也称为可见性) C语言规定:凡是在函数内定义的变量,它的作用域仅仅是包含这个变量定义的复合语句;而在函数体外定义的变量,它的作用域是从定义点到文件尾。 变量的生存期 指程序在执行期间,变量存在的时间间隔,即从给变量分配内存,至所分配内存被系统收回的那段时间。 C语言规定:凡是出现在静态数据区的变量,生存期都是从程序开始执行到程序结束;而出现在静态区之外的变量,生存期仅仅是从函数开始执行到函数执行结束这段时间。,共 71 页 第 48 页,1.局部变量(内部变量) 定义:在函数内部定义的变量,只能在本函数内部使用。 说明: 主函数 main 定义的变量只在主函数中有效,主函数不能使用其它

28、函数定义的变量。 不同函数可以使用相同名字的变量。 形式参数也是局部变量。 可以在一个函数内部,也可以在复合语句中定义变量,这些变量只在本复合语句中有效。,7.4.1 局部变量和全局变量,char search(char s) char ch; int k; ,变量s、ch、k的作用域,编译系统不为局部变量分配内存单元,只是当被调用时,根据需要分配临时单元,调用结束,空间释放。,共 71 页 第 49 页,例: main() int m,n; int x,y; ,共 71 页 第 50 页,2. 全局变量 定义:在函数之外定义的变量是全局变量(外部变量)。 语法:类型说明 变量名 ; 使用范围

29、:可以为本文件中所有的函数公用。 从定义变量的位置开始到本文件结束,这段程序中的函数可直接使用全局变量,,int a,b=3; main( ) float k; char str(char s20) ,全局变量a、b的作用域,全局变量k的作用域,共 71 页 第 51 页,int p=1,q=5; /*外部变量*/ f1( int a) /*定义函数*/ int b,c; char c1,c2; /*外部变量*/ f2( int a, int b) /*定义函数*/ . main() int m,n ,全局变量c1、c2的作用范围,全局变量p、q的作用范围,共 71 页 第 52 页,例如:

30、#include “stdio.h” int a=7,b=10; main( ) int a=5,c; c=a+b; printf(“c=%dn”,c); ,在同一源文件中,全局变量和局部变量可以同名,在局部变量的作用范围内,全局变量不起作用。,C=15,全局变量,局布变量,局部变量,全局变量,共 71 页 第 53 页,优点: 函数间数据联系:同一文件中的一些函数引用全局 变量,当某个函数中改变了全局变量的值,其它函数中的全局变量值也随之改变。 函数可以得到多个返回值。(在所有函数之外说明的变量是全局变量,它在所有函数中都是可见的。利用全局变量的这个特性,可以在函数间传递数据。) 缺点: 全

31、局变量在程序的全部执行过程中都占用存储单元。 降低函数的通用性。 使用过多,降低程序的清晰性。 全局变量应尽可能少用。,共 71 页 第 54 页,变量的存储类别 静态存储方式:程序运行期间分配固定存储空间的方式。 动态存储方式:程序运行期间根据需要进行动态的分配存储空间的方式。,7.4.2 变量的存储方法,共 71 页 第 55 页,动态存储变量特点 函数开始调用时为变量分配存储空间,函数结束时释放这些空间。一个程序两次调用同一函数,其中同一个局部变量的内存地址可能不同。 静态存储变量特点 在 静态存储区分配存储单元,整个程序运行期间都不释放。,变量存贮类型有四种: 自动变量(auto) 静

32、态变量(static) 外部变量(extern) 寄存器变量(register) auto、static、extern和register为存贮类型说明符。,共 71 页 第 56 页,(1)自动变量 (auto) 函数中的局部变量,不做任何存储类别的说明都为自动变量。 定义形式:auto 类型说明符 变量名 ; 说明:“auto”可以省略。 以前所使用的全部变量都是自动变量。 自动变量必须在一个函数体的内部。 函数的形参也是自动变量。 例如:int b, c=3 等价于 auto int b, c=3; 作用域:包含变量定义的复合语句或所说明的函数内部 ; 在函数被调用时才存在,从函数中返回时

33、即消失, 值也仅限于说明它的函数,在其它的函数中不能存取, 在两个不同的函数中可以分别使用同名的变量。,1.局部变量的存储方法,共 71 页 第 57 页,(2)局部静态变量 定义形式:在变量名前面加 关键字static static 类型说明符 变量名; 局部静态变量编译时赋初值,每次调用时不赋初值,只保留调用结束时变量的值。如果不赋初值,编译时自动赋0值。局部静态变量只允许所在函数引用,其它函数不能引用。其值整个程序运行期间都不释放。 自动变量不赋初值,其值不确定。每调用一次,重新赋值一次。,共 71 页 第 58 页,例如: f(int a) int b=0; static int c=

34、3; b=b+1; c=c+1; return( a+b+c); main( ) int a=2 , i; for(i=0; i3; i+) printf(“%d,”,f(a); ,运行结果为: 7 ,8 ,9,第一次调用开始,第一次调用结束,第二次调用开始,0,b,3,4,4,1,0,c,共 71 页 第 59 页,(3)寄存器变量 (register) 直接放置在运算器的寄存器中的变量称为寄存器变量. 定义形式: register 类型说明符 变量名; 作用:对于使用频繁的变量,定义为寄存器变量,不必从内存而是直接从寄存器中取出参加运算,提高程序执行效率。 说明: 只有局部自动变量和形式参

35、数可作为寄存器变量,其它如局部静态变量和全局变量不可以。 属于动态存储方式,函数开始调用时为变量分配寄存器空间,函数结束时释放寄存器空间。 只有int、char和指针类型可定义为寄存器变量,而long、double和float型变量不能设定为寄存器型 。 可用于变量空间分配的寄存器个数依赖于具体的机器。通常为2到3个,若在一个函数中说明多于2到3个寄存器变量,编译程序会自动地将它们变为自动变量。,共 71 页 第 60 页,2. 全局变量的存储类型(两种:外部全局变量、静态全局变量) (1)外部全局变量 在多个源程序文件的情况下,如果在一个文件中要引用在其它文件中定义的全局变量,则应该在需要引

36、用此变量的文件中,用extern做说明。例如:,prog1.c的内容如下: int a; main( ) x=6; f1( ); void f1( ) a+=2; printf(“a=%dn“, a); f2( ); ,prog2.c的内容为: extern int a; void f2( ) a+; printf(“a=%dn“, a); ,共 71 页 第 61 页,(2)静态全局变量 在一个文件中定义的全局变量仅限于本文件引用,而不能被其它文件访问,则可以定义为静态全局变量。 例如: static int x; 说明: 外部全局变量与静态全局变量在同一文件内的作用域一样; 外部全局变量可

37、以被多个文件引用,而静态全局变量仅在定义它的文件内有效,在程序的其它文件中不可使用。 例如:file1.c file2.c static int a ; extern int a; static int a只能用于file1.c ,虽然file2.c中将 同名变量 int a说明为extern,但仍无法使用file1.c 中的 a变量。,共 71 页 第 62 页,7.5 内部函数和外部函数,1 . 内部函数(静态函数) 定义:如果一个函数只能被本文件中其它函数调用,称为内部函数。 定义格式: static 类型标识符 函数名(形参表)函数体 例如:static int fun(a, b) 作

38、用:函数的作用域限于所在文件,不同文件中同名函数互不干扰,便于程序的格式化。,共 71 页 第 63 页,2. 外部函数 定义:如果一个函数允许被其它文件调用,称为外部函数。 定义格式: extern 类型标识符 函数名(形参表)函数体 例如:extern int fun(int a, int b) 或 int fun(int a, int b) 通常不加 static 标识符的函数都是外部函数。,共 71 页 第 64 页,3.标号的生存期及作用域 生存期 在C语言中,由于函数的生存期是全程的,即从程序开始至程序结束,标号是函数的一部分,标号的生存期自然是全程的。 作用域 C语言规定,标号的

39、作用域仅为定义标号的函数,即不允许用goto语句从一个函数转向另一个函数。,共 71 页 第 65 页,有关函数的类型,1 函数的类型是函数返回值的类型 2 C要求函数定义的类型,说明的类型和函数定义类型一致 3 定义的类型与返回值类型不一致时,以定义为准 4 不定义函数类型,系统认为是int 5 当函数是int ,char型时,可以不作说明 6 无参函数可以不定义类型 7 不需返回任何返回值时,应定义无类型void,总 结,共 71 页 第 66 页,有关函数的参数,1 定义函数时,括号内为形参 2 调用函数时,括号内为实参 3 实参与形参需类型相同,个数相等 4 形参在函数被调用时才分配存

40、储空间,有值 5 实参在主调函数内有值,求值顺序是从右向左 6 实参与形参是单向的数值传递 7 如果实参与形参都是数组名,是地址传递 8 实参数组与形参数组类型相同,个数可以不同,函数间的数据传递(三种传递方式): 返回值、参数、全局变量。,共 71 页 第 67 页,1 函数可以作运算分量,作其他函数的参数,可构成语句 2 函数调用可以嵌套 3 函数中的return语句可以带回一个返回值,有关变量,从变量的作用域: 局部变量 全局变量 从变量值保留的期限: 静态存储变量 动态存储变量 从变量在硬件上的位置: CPU寄存器 内存中静态区 内存中动态区,有关函数的调用,共 71 页 第 68 页

41、,存储特性,共 71 页 第 69 页,按下列要求编写程序: (1)生成10个2位随机正整数并存在a数组中; (2)编写函数实现按从小到大顺序排序,并调用它; (3)任意输入一个数,并插入到数组中,使之仍然有序; (4)任意输入一个0到9之间的整数k,删除ak。 分析:在长度为n+1的有序数组中插入一个数,首先要确定插入位置。从第一个数开始比较,若 ajk,则k就应插在aj前面。先移动(从最后一个数开始移动),后插入。,函数编程举例,K=24,a0 a1 a2 a3 a4,a0 a1 a2 a3 a4,24,共 71 页 第 70 页,main() int i,j,k,t,n,aN; n=N;

42、 for(i=0;iN;i+) ai=rand()%90+10; printf(“%4d”,ai); printf(“n”); sort(a,n);,#include “stdlib.h” #define N 10 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 页 第 71 页,for(i=0;ii; j-) /* aj (j=n-1,n-2,i+1)后移一个位置 */ aj=aj-1; aj=k; /*将k插入到ai */ n=n+1; /* 数组增加一个元素 */ printf(“n 请输入要删除数组元素的下标 k:n”); scanf(“%d”,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1