版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、共 81页 第 1 1 页共 81页 第 2 2 页 本章要点本章要点 函数的定义函数的定义 函数的调用函数的调用 函数参数的传递方式函数参数的传递方式 变量的作用域和存储方法变量的作用域和存储方法 内部函数和外部函数内部函数和外部函数 有参宏定义与调用有参宏定义与调用共 81页 第 3 3 页函数函数F1 ( )main ( )F11 ( )F2 ( )F21 ( )F22 ( ) C C程序是函数的集合体,每程序是函数的集合体,每个函数是一个独立的程序模个函数是一个独立的程序模块;块; 由由一个主函数一个主函数和和若干个子函若干个子函数数组成组成,程序总是从主函数,程序总是从主函数开始执行
2、;开始执行; 所有子函数地位平等,可互所有子函数地位平等,可互相调用、自我调用。相调用、自我调用。 函数可集中或分散存放在一函数可集中或分散存放在一个或多个源程序文件中。个或多个源程序文件中。 引入函数的优点:引入函数的优点: 减少减少重复编写程序的工作量;使重复编写程序的工作量;使程序便于调试和阅读。程序便于调试和阅读。 共 81页 第 4 4 页main: 主函数主函数 e, d, h ,g 被多次调用被多次调用a, b, c,d, e, f,g, h, 相互调相互调用用mainabdeghhgedcgf函数函数是是C程序的程序的最小最小单元。单元。主主函数可以调用其它函数,其函数可以调用
3、其它函数,其它函数可以相互调用它函数可以相互调用.函数调用举例函数调用举例main() /* 主函数主函数 */ printstar(); /*调用调用printstar函数画函数画*/ print_message(); /*调用调用print _message函数写字函数写字*/ printstar(); /*调用调用printstar函数画函数画*/ printstar() /*printstar函数函数*/ printf(“n*”);print_message() /* print_message函数函数*/ printf(“n Hello! ”);运行结果:* Hello! * 一个一
4、个c c程序由一个或多个源文件组成程序由一个或多个源文件组成# include “lx2.c”# include “lx3.c”main() printstar(); print_message(); printstar(); printstar() printf(“n*”);print_message() printf(“n Hello! ”);Lx1.cLx2.cLx3.c共 81页 第 7 7 页数学函数数学函数 # #include include math.hmath.h 字符和字符串函数字符和字符串函数 ctype.h, string.hctype.h, string.hI/OI/
5、O函数函数 # #include include stdio.hstdio.h 动态存储分配函数动态存储分配函数 形式形式有有参参函数函数无无参参函数函数空函数空函数库函数库函数用户定义函数用户定义函数: :共 81页 第 8 8 页一、定义形式一、定义形式:类型标识符类型标识符 函数名函数名(形式参数表形式参数表)形式参数说明形式参数说明 说明与定义部分说明与定义部分 语句语句各形参之间用各形参之间用”,”隔开隔开形参可以缺省形参可以缺省,但括号但括号不可省不可省函数类型函数类型函数体(是一段程序,实函数体(是一段程序,实现函数的功能)现函数的功能)函数名字有值,它代表函函数名字有值,它代表
6、函数的入口地址。数的入口地址。有参函数定义形式有参函数定义形式这是有参函数定义形式这是有参函数定义形式共 81页 第 9 9 页无参函数的定义形式无参函数的定义形式: 类型标识符类型标识符 函数名(函数名( ) 说明部分说明部分 语句语句 例例:print_message( ) printf(“How are you !n”); 例例:dummy ( )( ) l 没有没有数据类型数据类型说明、说明、和和形参说明形参说明l函数体函数体为空。为空。无参函数定义无参函数定义空函数定义空函数定义 longlong factofacto ( ( n n ) ) intint n;n; long s=1
7、;int i; long s=1;int i; for (i=1; i=n; i+) for (i=1; i y ? x : y ; return ( z );形式参数列表形式参数列表:是是用用“,”分开的一分开的一组变量,用来接收组变量,用来接收调用时传入的数据调用时传入的数据形式参数说明:形式参数说明:在在 外面对形式参数外面对形式参数的类型进行说明的类型进行说明函数调用函数调用求两个变量的最大值求两个变量的最大值 函数声明函数声明也可写成:也可写成:int max(int x,int y)共 81页 第 1212 页二、二、 形式参数和实际参数形式参数和实际参数 形式参数形式参数:形参调
8、用前不占内存单元,调用时占用,调用后释放形参调用前不占内存单元,调用时占用,调用后释放形参是函数的内部变量,只在函数内部才有意义。形参是函数的内部变量,只在函数内部才有意义。对每个形参必须指明其名字和数据类型。对每个形参必须指明其名字和数据类型。 实际参数实际参数:实参必须有确定的值,可以是常量,变量或表达式。实参必须有确定的值,可以是常量,变量或表达式。实参与形参的类型、个数必须一致。实参与形参的类型、个数必须一致。共 81页 第 1313 页 1. 函数调用的一般形式为:函数调用的一般形式为: 函数名(实际参数列表);函数名(实际参数列表);(函数以语句的形式出现函数以语句的形式出现)或或
9、 函数名(实际参数列表)函数名(实际参数列表)(函数出现在表达式中函数出现在表达式中)实参的数量、类型和排列顺序必须与函数定义时形参实参的数量、类型和排列顺序必须与函数定义时形参表中形参的数量、类型和排列顺序一致。表中形参的数量、类型和排列顺序一致。 2. 执行过程:执行过程: 在一个函数中调用另一个函数时,程序将在一个函数中调用另一个函数时,程序将控制控制从调从调用函数处用函数处转移转移到被调用函数,并且执行被调用函数。到被调用函数,并且执行被调用函数。在执行完在执行完被调用函数被调用函数的所有语句或者遇到的所有语句或者遇到returnreturn语语句时,程序的控制要句时,程序的控制要返回
10、返回到调用函数中到调用函数中原来调用函原来调用函数的地方继续执行。数的地方继续执行。共 81页 第 1414 页例:调用例:调用maxmax函数的程序函数的程序int main()int main()int a,b,c;int a,b,c; int int max();max(); scanf(%d,%d,&a,&b); scanf(%d,%d,&a,&b); c c= =maxmax(a,b);(a,b); printf(max=%dn, printf(max=%dn,c c);); return 0; return 0; 函数调用函数调用int int ma
11、xmax(x,y)(x,y)int x,y;int x,y;int z;int z; if(xy)z=x; if(xy)z=x; else z=y; else z=y; return(z); return(z); 实际参数实际参数形式参数形式参数返回函数值返回函数值接收接收返回值返回值程序执行顺序程序执行顺序? ?共 81页 第 1515 页/ /* *1 1* */ / /* *2 2* */ / /* *3 3* */ / /* *4 4* */ / /* *5 5* */ / /* *1111* */ / /* *1212* */ / /* *1313* */ / /* *1414* *
12、/ / /* *1515* */ / /* *1616* */ /int main()int main() int a,b,c; int int a,b,c; int maxmax();(); scanf(%d,%d,&a,&b); scanf(%d,%d,&a,&b); c= c=max(a,b);max(a,b); printf(max=%dn,c); printf(max=%dn,c); return 0; return 0; int int max(x,y)max(x,y) int x,y; int x,y; int z; int z; if (xy)
13、z=x; if (xy) z=x; else z=y; else z=y; return(z); return(z); 断点断点保护断点和保护断点和现场,转向现场,转向1111入口入口返回断点返回断点恢复现场恢复现场带回函数值带回函数值虚实结合虚实结合a x,b ya x,b y共 81页 第 1616 页(1) 函数语句函数语句 (把(把函数调用作为一个语句)函数调用作为一个语句) 一般形式:一般形式:函数名(实际参数表);函数名(实际参数表); 此时不要求函数带回值,只要求函数完成一定的操作。此时不要求函数带回值,只要求函数完成一定的操作。 例如:例如: printstar( );3. 函
14、数调用的几种方式函数调用的几种方式(2) 函数表达式函数表达式(函数调用出现在表达式中)(函数调用出现在表达式中) 一般形式:一般形式:变量名变量名= =函数表达式函数表达式 这时要求函数带回一个确定的值以参加表达式的运算。这时要求函数带回一个确定的值以参加表达式的运算。 例如:例如:c=3+max(a, b);注意:注意:无返回值函数的调用,不能出现在表达式中。无返回值函数的调用,不能出现在表达式中。 函数调用作为一个函数的实参。函数调用作为一个函数的实参。例如:例如:m = max( a, max(b, c) );(3) 函数参数函数参数 (函数调用出现在函数参数中)(函数调用出现在函数参
15、数中)值传递值传递: 在调用函数时,实参将值传递给形参。在调用函数时,实参将值传递给形参。C语言规定,实参对形参的数据传递是语言规定,实参对形参的数据传递是“值传递值传递”,即单向传递,即单向传递。 在调用函数时,给形参分配存储单元,并将实在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。被释放,实参单元仍保留并维持原值。 因此,在执行一个被调用函数时,形参的值如因此,在执行一个被调用函数时,形参的值如果发生变化,并不会改变主调函数中实参的值。果发生变化,并不会改变主调函数中实参的值。8
16、.1.4 函数参数的传递方式函数参数的传递方式共 81页 第 1818 页例例 编写函数交换两个变量的值。编写函数交换两个变量的值。 #include void swap ( int x, int y) int temp; temp=x; x=y; y=temp; printf ( x=%d,y=%dn, x, y); int 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共
17、 81页 第 1919 页 值传递的优点值传递的优点:被调用的函数不可能改变调用函数被调用的函数不可能改变调用函数 中变量的值,而只能改变它的局部的临时副本。中变量的值,而只能改变它的局部的临时副本。 值传递的缺点值传递的缺点:每个形式参数仅能传递一个数据,每个形式参数仅能传递一个数据, 不适用需要在函数之间传递大量数据。不适用需要在函数之间传递大量数据。 地址传递:地址传递:将实参的地址传递给形参,实参和将实参的地址传递给形参,实参和形参指向同一内存空间,对形参的修改,可以直形参指向同一内存空间,对形参的修改,可以直接影响实参。接影响实参。8.1.4 函数参数的传递方式(续)函数参数的传递方
18、式(续)共 81页 第 2020 页2. 函数的返回值语句函数的返回值语句: return语句语句 一般形式:一般形式: return (表达式表达式); 或或 return 表达式表达式; 1. 定义定义:通过函数调用使主调函数得到一个确定:通过函数调用使主调函数得到一个确定 的值,称为的值,称为函数的返回值函数的返回值。注意不要丢掉注意不要丢掉;括号可以省略括号可以省略功能:功能:退出函数,将退出函数,将表达式的值表达式的值带回主调函数,回到程带回主调函数,回到程序原来的位置继续执行。序原来的位置继续执行。 共 81页 第 2121 页说明说明:一个函数中可以有多个一个函数中可以有多个re
19、turn语句,但是一次语句,但是一次 函数执行只能执行其中的一个。当执行到某个函数执行只能执行其中的一个。当执行到某个 return语句时,则终止函数执行,并带回函数值。语句时,则终止函数执行,并带回函数值。fun(int x) if(x1) return 2*x+1; else if(xy? x:y; return(z); return (xy? x:y); 等效等效共 81页 第 2222 页说明说明(续续): 当函数类型被定义为当函数类型被定义为void类型时,表示函数没有类型时,表示函数没有返回值。这是函数可没有返回值。这是函数可没有 return语句,或者在语句,或者在 return
20、后面只写分号,即后面只写分号,即 return ; 如果函数体内没有如果函数体内没有return语句,就一直运行到函语句,就一直运行到函数的最后一条语句后,再返回调用函数,数的最后一条语句后,再返回调用函数,共 81页 第 2323 页3. 函数值的类型函数值的类型 函数定义时应该指定函数的类型函数定义时应该指定函数的类型(即函数值即函数值的类型),应该与的类型),应该与return语句的类型一致。语句的类型一致。说明说明:(1)如果函数类型和如果函数类型和return语句的类型不一致,语句的类型不一致,以函以函数类型为准数类型为准。对数值型数据,可以自动进行类型。对数值型数据,可以自动进行类
21、型 转换。既函数类型决定返回值的类型。转换。既函数类型决定返回值的类型。(2)如果函数无返回值,可以将函数定义为如果函数无返回值,可以将函数定义为“无类无类 型型”void (或称(或称“空类型空类型”)。)。例如例如: void print_star()用用void定义函数类型定义函数类型,明确表示没返回值,明确表示没返回值共 81页 第 2424 页例:编写计算例:编写计算 的程序。的程序。 201ii1程序程序2:float sum(n) int n;int i; float s =0; for( i=1;i=n;i+) s+=1.0/i; return(s);int main( )in
22、t n ; float x ; n=20; x=sum(n); printf(x=%f,x);return 0; void sum(n) int n; int i;float s=0; for( i=1;i=n;i+) s+=1/(float)i; printf(s=%f,s); int main( ) int n; n=20; sum(n); return 0;程序程序1:程序运行结果:程序运行结果:s=3.597740调用函数时,变量做函数实参,它和对应的形参各自占用调用函数时,变量做函数实参,它和对应的形参各自占用独立的存储单元。独立的存储单元。共 81页 第 2525 页例:阅读程序例
23、:阅读程序 float add (x, y) float x, y; float z; z=x+y; return (z); int main( ) float a, b; scanf(%f, %f, &a, &b); printf( sum is %f n, add(a, b) ); return 0; add函数函数程序运行:程序运行: 3.6, 5.5 sum is 9.100000以上程序另一写法以上程序另一写法: int main( ) float add( ); float a, b; scanf(%f, %f, &a, &b); printf( s
24、um is %f , add(a, b) ); return 0; float add (x, y) float x, y; float z; z=x+y; return (z); /*定义定义add函数函数*/程序运行结果:程序运行结果: 3.6, 5.5 sum is 9.100000 主函数在前面主函数在前面子函数在后面子函数在后面对被调用函数的说明对被调用函数的说明共 81页 第 2727 页8.1.6 函数的说明函数的说明 对被调用函数说明的对被调用函数说明的前提条件前提条件 被调用函数必须是已存在的函数,例如用户被调用函数必须是已存在的函数,例如用户自定义函数或库函数。自定义函数或
25、库函数。2. 被调用函数是被调用函数是用户自定义函数的函数说明用户自定义函数的函数说明 同变量一样,函数的调用也应该遵循同变量一样,函数的调用也应该遵循“先声先声明,后使用明,后使用”的原则。的原则。 如使用用户自定义函数,而且主调函数和被如使用用户自定义函数,而且主调函数和被调用函数在同一个文件中,应该在主调函数中说调用函数在同一个文件中,应该在主调函数中说明被调函数的类型。其说明形式如下:明被调函数的类型。其说明形式如下:共 81页 第 2828 页函数说明的一般形式:函数说明的一般形式: 类型标识符类型标识符 函数名函数名( (类型类型1 1,类型,类型2 2,); 或类型标识符或类型标
26、识符 函数名函数名( (类型类型1 1 形参形参1 1,类型,类型2 2 形参形参2,);2,);功能:功能:通知编译程序函数值是什么类型,有多少参数及它们各自通知编译程序函数值是什么类型,有多少参数及它们各自的类型,为编译程序进行类型检查提供依据。的类型,为编译程序进行类型检查提供依据。main() float add(float x,float y); float a, b, c; scanf(“ %f, %f”, &a, &b); c=add(a,b) ; printf(“ sum is %f ”, c );/*定义定义add函数函数*/float add (float
27、x,float y) float z; z=x+y; return (z); 对被调用函数的说明对被调用函数的说明作为表达式被调用作为表达式被调用运行结果:运行结果: 3.6, 5.5sum is 9.100000 或:类型标识符或:类型标识符 函数名();函数名();共 81页 第 2929 页3. 函数说明和函数定义的区别函数说明和函数定义的区别 函数说明函数说明的作用是把函数的名字、函数类型的作用是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。便在调用该函数时系统按此进行对照检查。 函数定义
28、函数定义是指对函数功能的确立,包括指定是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等,函数名、函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。它是一个完整的、独立的函数单位。 函数说明与函数定义的首部唯一区别:函数说明语函数说明与函数定义的首部唯一区别:函数说明语句的(句的( )之后必须)之后必须有分号有分号,而函数定义首部的(,而函数定义首部的( )之后之后没有分号没有分号。函数定义只能一次函数定义只能一次函数说明可以多次函数说明可以多次共 81页 第 3030 页 (1)被调用函数的定义在主调函数之前,可以省略被调用函数的定义在主调函数之前,可
29、以省略声明。声明。 float add (float x, float y) float z; z=x+y; return (z); main() float a, b; scanf(“ %f, %f, “&a, &b); printf(“ sum is %f ”, add(a, b) ); 被调函数在主被调函数在主调函数之前调函数之前主调函主调函数在被数在被调函数调函数之后之后4. 以下两种情况可以省略被调用函数的说明以下两种情况可以省略被调用函数的说明共 81页 第 3131 页(2)如果已在所有函数定义之前,在文件的开头,如果已在所有函数定义之前,在文件的开头, 在函数的
30、外部已说明了函数类型,则在各个主在函数的外部已说明了函数类型,则在各个主 调函数中不必对所调用的函数再作声明。调函数中不必对所调用的函数再作声明。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)此处不必说明此处不必说明在所有函数之前在所有函数之前说明函数类型说明函数类型定义函数定义函数letter、f和和i共 81页 第 3232 页# include “
31、stdio.h” /*调用输入输出函数调用输入输出函数*/# include “math.h” /*调用数学函数调用数学函数*/# include “string.h” /*调用字符,字符串函数调用字符,字符串函数*/# include “graphics.h” /*调用图形函数调用图形函数*/用户也可建立自己的库函数,这是高级应用的内容。用户也可建立自己的库函数,这是高级应用的内容。5. 库函数及调用库函数及调用 库函数库函数:由人们根据需要编制并提供给用户使用的一些基:由人们根据需要编制并提供给用户使用的一些基 本函数,在用户定义的函数中常常调用这些函数。本函数,在用户定义的函数中常常调用
32、这些函数。 方法方法:在文件的开头用:在文件的开头用#include 命令将需要的库函数命令将需要的库函数包含到包含到 文件中。文件中。共 81页 第 3333 页8.2 8.2 数组作函数参数数组作函数参数 数组元素可以作函数的实参数组元素可以作函数的实参 数组名可以作函数的实参和形参数组名可以作函数的实参和形参 多维数组可以作函数参数多维数组可以作函数参数 8.2.1. 数组元素作函数实参数组元素作函数实参 由于表达式可以做实参,数组元素可以作为表达式由于表达式可以做实参,数组元素可以作为表达式的组成部分,因此,数组元素可以做函数的实参,的组成部分,因此,数组元素可以做函数的实参,与变量一
33、样与变量一样,是,是单向传递,即单向传递,即“值传送值传送”方式方式。 例如:例如: int a10; x=power(a9,5);数组元素数组元素作实参作实参共 81页 第 3434 页8.2.2数组名作函数的参数数组名作函数的参数 可以用数组名作函数参数,此时实参和形可以用数组名作函数参数,此时实参和形参都用数组名。参都用数组名。 由于由于数组名代表数组名代表的就是数组在内存中存放的就是数组在内存中存放区域的区域的首地址首地址。把数组名作为函数参数来实现。把数组名作为函数参数来实现大量数据的传递是一个非常好的数据传递方法。大量数据的传递是一个非常好的数据传递方法。这种传递方式是这种传递方式
34、是“地址传递地址传递”共 81页 第 3535 页一维数组作函数参数,一维数组作函数参数,形参的写法形参的写法为:为: 类型说明符类型说明符 形参数组名形参数组名数组长度数组长度例如:例如: float average(float array10) main() float b10;int i; for(i=0;i10;i+) scanf(“%f”,&bi); average(b); 1. 一维数组作函数参数一维数组作函数参数2. 数组作函数形参的数组作函数形参的函数调用函数调用方式方式 函数名函数名(数组名,数组名,)这是一维数组这是一维数组形参的定义形参的定义这是一维数组这是一维数
35、组的调用的调用共 81页 第 3636 页说明:说明: 在主调函数和被调用函数中在主调函数和被调用函数中分别分别定义数组定义数组,实参数组实参数组和形参数组类型要一致。和形参数组类型要一致。 实参数组和形参数组大小可以不一致,实参数组和形参数组大小可以不一致,形参数组可形参数组可以不指定大小以不指定大小。 (这里指一维数组)。(这里指一维数组)。 数组名除作为变量的标识外数组名除作为变量的标识外,还代表该还代表该数组在内存中数组在内存中存放区域的首地址存放区域的首地址。 数组名做函数实参与形参之间是数组名做函数实参与形参之间是“地址传递地址传递”,实参实参数组将数组的起始地址传递给形参数组。编
36、译系统数组将数组的起始地址传递给形参数组。编译系统不再为形参数组分配存储单元。不再为形参数组分配存储单元。 在函数体中对形参数组的元素操作时就是对实参数在函数体中对形参数组的元素操作时就是对实参数组的元素进行操作。组的元素进行操作。形参数组各元素的值发生变化形参数组各元素的值发生变化会使实参数组各元素的值发生同样的变化会使实参数组各元素的值发生同样的变化。 数组名作函数参数可实现大量数据的传递数组名作函数参数可实现大量数据的传递,无须返回无须返回数组值。数组值。共 81页 第 3737 页例:例: 编写函数,求编写函数,求n个数组元素的算术平均值。个数组元素的算术平均值。double aver
37、age(int a , int n) int i; double s=0; for(i=0; in; i+) s=s+ai; return s/n; 主函数调用如何编写?主函数调用如何编写? main()int b3=1,2,3;double s;s=average(b,3);printf(“%fn”,s);形参数组不指定形参数组不指定大小,数组名后大小,数组名后跟一个空方括号跟一个空方括号这是数组作形参时常这是数组作形参时常使用的技巧使用的技巧实参实参a获得获得b的起始地址的起始地址数组名做函数是数组名做函数是“地址传递地址传递”。也就是把实参数组的。也就是把实参数组的起起始地址始地址传递给
38、形参数组,这样二者传递给形参数组,这样二者共占一段内存单元共占一段内存单元。因此,因此,形参数组各元素的值如果发生变化会使实参数组形参数组各元素的值如果发生变化会使实参数组各元素的值发生同样的变化各元素的值发生同样的变化。例:阅读下列程序,指出输出结果。例:阅读下列程序,指出输出结果。main( ) void swap( ); /*函数声明函数声明*/ int b2=10,2; swap(b); printf(“b0=%d, b1=%dn”, b0, b1); void swap( int a ) int t; t=a0; a0=a1; a1=t;共 81页 第 3939 页数组数组bbb1b
39、0102数组数组a数组数组bb, ab1b0102a1a0函数开始调用之前函数开始调用之前函数开始调用,实参数组函数开始调用,实参数组b将起始地址传将起始地址传递给形参数组递给形参数组a,二者共占一段内存单元,二者共占一段内存单元数组数组a数组数组bb, ab1b0210a1a0swap函数执行过程中,函数执行过程中,a0与与a1的值交换的值交换数组数组bbb1b0210函数调用结束后函数调用结束后共 81页 第 4040 页例:编写一个函数例:编写一个函数. 功能功能:在在n个整数中,找出数值最大的数。个整数中,找出数值最大的数。 给定给定10个整型数个整型数,找出其中数值最大的数。找出其中
40、数值最大的数。int max(int a,int n)int m,i; m=a0; for(i=1;im) m=ai; return(m);子函数:子函数:main( )int x10,amax; int i; for(i=0;i10;i+) scanf(%d,&xi); amax=max(x,10); printf(“amax= %d,amax);主函数:主函数:前面所学内容前面所学内容int max(a,n) int a ,n;共 81页 第 4141 页例:用选择法对数组中例:用选择法对数组中10个整数按由小到大排序个整数按由小到大排序.方法:方法:写一个函数写一个函数sort(
41、int array, int n) :对数组元素按由小到大排序。:对数组元素按由小到大排序。写主函数写主函数 :输入输入array数组,调用数组,调用 sort 函数,输出排序后的函数,输出排序后的array数组。数组。void sort (int array , int n) int i, j, t; for (i=0; in-1; i+) for (j=i+1; jn; j+) if (arrayjarrayi) t=arrayj; arrayj=arrayi; arrayi=t; 前面所学内容前面所学内容共 81页 第 4242 页main ( ) int a10, i; printf(
42、“enter array: n”); for (i=0; i10; i+) scanf (“%d”,&ai); sort(a, 10); printf(“the sorted array: n”); for (i=0; i10; i+) printf (“ %d ”, ai); printf(“n”);由于地址传递,由于地址传递,实参数组实参数组 a 改变改变数组名做参数的好处:数组名做参数的好处:由于只需复制一个地址值,而无须复制全部需要处由于只需复制一个地址值,而无须复制全部需要处 理的数据,因此节约存储空间并提高效率。理的数据,因此节约存储空间并提高效率。 由于主调函数和被调函数
43、是在相同的内存区域上对由于主调函数和被调函数是在相同的内存区域上对 数据进行操作,因此可以实现数据的同步更新。数据进行操作,因此可以实现数据的同步更新。 函数的调用函数的调用共 81页 第 4343 页#include stdio.hmain()int i=0; char s180,s280; scanf(%s,s2); for(i=0;s2i!=0;i+) s1i=s2i; s1i=0; printf(%sn,s1); 我们以前留的数组作业我们以前留的数组作业3:#include stdio.hmain()int i=0; char s180,s280; gets(s2); for(i=0;
44、i=strlen(s2);i+) s1i=s2i; printf(%sn,s1); 或或 :i=0开始,后没开始,后没有追加有追加0如输入:如输入:abc123 efty 结果:结果:abc123编写一个程序,将字符数组编写一个程序,将字符数组s2中的全部字符复制到字符数组中的全部字符复制到字符数组s1中,中,不许用不许用strcpy函数。复制时,函数。复制时,0后面的字符不复制。后面的字符不复制。(自己假设给定自己假设给定s2数组数组)改用改用gets(s2)可以可以输入任意字符输入任意字符注意表达式注意表达式2共 81页 第 4444 页 写成函数:将给定字符串写成函数:将给定字符串s2复
45、制到另一字符串复制到另一字符串s1。#include “stdio.h”void strcopy(char str1 ,char str2 ) int i=0; for(i=0;str2i!=0;i+) str1i=str2i; str1i=0;main() char s150,s250; gets(s2); strcopy(s1,s2); printf(“%s”,s1);共 81页 第 4545 页有两种形式有两种形式 (形式基本同一维形式基本同一维) 函数值类型说明符函数值类型说明符 函数名函数名(类型说明符类型说明符 数组名数组名 正整型常量表达式正整型常量表达式 , ) 函数体函数体
46、函数值类型说明符函数值类型说明符 函数名函数名(数组名数组名,) 类型说明符类型说明符 数组名数组名 正整型常量表达式正整型常量表达式; 函数体函数体 “行行”可以可以不确定不确定“列列”必须必须确定确定!共 81页 第 4646 页说明:说明: 形参数组定义时可以指定每一维的大小,也可以省略第形参数组定义时可以指定每一维的大小,也可以省略第一维的大小,不允许省略第二维以及其他高维的大小一维的大小,不允许省略第二维以及其他高维的大小. 例如例如 : int array 310; 或或 int array 10; 是一样的!是一样的! 但但 int array 3 ; 和和int array ;
47、是错误的是错误的! 实参数组可以大于形参数组。实参数组可以大于形参数组。(行行可以不同,可以不同,列列必须相同)必须相同)例如:实参数组定义为:例如:实参数组定义为:int array 510; 形参数组定义为:形参数组定义为:int array 310; 这时形参数组只取实参数组的一部分,其余部分不起作这时形参数组只取实参数组的一部分,其余部分不起作用。用。共 81页 第 4747 页例:阅读程序,指出运行结果。例:阅读程序,指出运行结果。 void add1(int a 3 ,int n) int i; for(i=0;in;i+) +aii; main() int x33=0,1,2,3
48、,4,5,6,7,8,i; add1(x,3); for(i=0;i3;i+) printf(%d ,xii); printf(n); 程序运行结果为:程序运行结果为:1 5 9 注意:二维注意:二维数组的调用数组的调用注意:二维注意:二维数组的定义数组的定义共 81页 第 4848 页例:写函数打印例:写函数打印n行行10列二维数组,其中列二维数组,其中n是任意整数。是任意整数。 void print_array(int a 10, int n) int i, j; for(i=0;in; i+) for(j=0;j10;j+) printf(“%3d”, aij); printf(“n”)
49、; 例:写函数交换任意一个例:写函数交换任意一个n*10的二维数组的的二维数组的i,j两行两行 void exchange(int a 10, int i,int j) int k, t; for(k=0;k10;k+) t=aik; aik=ajk; ajk=t; 例:编写函数,例:编写函数,计算两个计算两个3行行4列的矩阵之和。并求:列的矩阵之和。并求:C3X4=A3X4+B3X4void qiuh(float x4,float y4,float z4,int n)int i,j; for(i=0;in;i+) for(j=0;j4;j+) zij=xij+yij;main()float
50、a34,b34,c34;int i,j; for(i=0;i3;i+) for(j=0;j4;j+) scanf(“%f%f”,&aij, &bij); qiuh(a,b,c,3); for(i=0;i3;i+) for(j=0;j4;j+) printf(“%10.2f”,cij);printf(“n”);注意函数的定义注意函数的定义和函数的调用和函数的调用共 81页 第 5050 页8.3 函数的嵌套调用和递归调用函数的嵌套调用和递归调用8.3.1 函数的嵌套调用函数的嵌套调用 嵌套定义:嵌套定义:在定义一个函数时,该函数体内包含在定义一个函数时,该函数体内包含另一个函数的
51、定义。另一个函数的定义。 嵌套调用:嵌套调用:在调用一个函数的过程中,又调用另在调用一个函数的过程中,又调用另一个函数。一个函数。 C语言不允许嵌套定义,但可以嵌套调用。语言不允许嵌套定义,但可以嵌套调用。在调在调用一个函数的过程中,又调用另一个函数。用一个函数的过程中,又调用另一个函数。共 81页 第 5151 页mainmain函数函数 调用函调用函数数 A;A; 函数函数 A A 调用函数调用函数 B; 函数函数 B B 调用调用调用调用返回返回返回返回共 81页 第 5252 页例:阅读程序,指出运行结果。例:阅读程序,指出运行结果。(嵌套调用嵌套调用)main( ) int a=0,
52、b=0,b1(int,int),f1(); printf(b1=%d f1=%dn,b1(a,b),f1( ); int b1(int d,int e) int f1( ),f; d=5; e=10; f=f1( )+d+e; return f; int f1( ) int c,i=1; c=15; while(i1long int fact(int n) long int f; if(n=0|n=1) f=1; else f=n*fact(n-1); return f; main( ) long int red;int n; scanf(%d,&n); red=fact(n); pr
53、intf(red=%ld,red); 假如求假如求 5! , 则程序执则程序执行结果为:行结果为:red =1201 当当 n=0,n=1 n!=共 81页 第 5858 页f=3*fact(2)f=1*2*3=6fact函数函数 n=3f=2*fact(1)f=1*2=2fact函数函数 n=2 调用调用fact 函数时函数时 , 总是从总是从 fact 的第一条语句开始执行的第一条语句开始执行 ;执执行到行到 return 语句语句,总是返回到该次调用的调用位置继续执行调总是返回到该次调用的调用位置继续执行调用函数用函数。fact 函数的调用过程:函数的调用过程:main( )fact(5
54、)输出输出fact(5)f=5*fact(4)f=1*2*3*4*5=120fact函数函数 n=5f=4*fact(3)f=1*2*3*4=24fact函数函数 n=4第一次调用第一次调用第二次调用第二次调用第三次调用第三次调用第四次调用第四次调用第五次调用第五次调用返回返回返回返回返回返回返回返回返回返回共 81页 第 5959 页变量的数据类型变量的数据类型 char 型型 int 型型 float 型型 double 型型总结总结:数据类型数据类型决定为变量分配的内存单元的决定为变量分配的内存单元的长度长度,数据的,数据的存放存放 形式。形式。(从程序设计角度,决定了(从程序设计角度,
55、决定了可以表示的数的范围可以表示的数的范围)问题问题:1. 何时何时为变量分配内存单元?为变量分配内存单元? 2. 变量位于内存的什么变量位于内存的什么位置位置? 3. 变量的有效变量的有效作用范围作用范围?(VC+6.0环境)共 81页 第 6060 页 变量的作用域和生存期变量的作用域和生存期u 变量的作用域变量的作用域 指一个变量在程序中的有效范围。指一个变量在程序中的有效范围。 C C语言规定语言规定:凡是在函数内定义的变量,它的作用域仅仅是凡是在函数内定义的变量,它的作用域仅仅是包含这个变量定义的复合语句;包含这个变量定义的复合语句;而在函数体外定义的变量,而在函数体外定义的变量,它
56、的作用域是从它的作用域是从定义点到文件尾。定义点到文件尾。u 变量的生存期变量的生存期 指程序在执行期间,变量存在的时间间隔,即从给变量分指程序在执行期间,变量存在的时间间隔,即从给变量分配内存,至所分配内存被系统收回的那段时间。配内存,至所分配内存被系统收回的那段时间。 C C语言规定语言规定:凡是出现在静态数据区的变量,生存期都是从凡是出现在静态数据区的变量,生存期都是从程序开始执行到程序结束;程序开始执行到程序结束;而出现在静态区之外的变量,生而出现在静态区之外的变量,生存期仅仅是从存期仅仅是从函数开始执行到函数执行结束这段时间。函数开始执行到函数执行结束这段时间。共 81页 第 616
57、1 页1. 1. 局部变量(内部变量)局部变量(内部变量)定义:定义:在函数内部定义的变量,只能在本函数内部使用,称为局在函数内部定义的变量,只能在本函数内部使用,称为局部量。部量。8.4.18.4.1局部变量和全局变量(从变量的作用域分)局部变量和全局变量(从变量的作用域分)如:如:float f1(int a) int b,c; . char f2(int x,int y) int a,b; main ( ) int m,n; . a,b,c在函数在函数f1中有效中有效x,y,a,b在函数在函数f2中有效中有效m,n在主函数中有效在主函数中有效共 81页 第 6262 页 主函数主函数 m
58、ain 定义的变量只在主函数中有效,主函数不定义的变量只在主函数中有效,主函数不能使用其它函数定义的变量。能使用其它函数定义的变量。 不同函数可以使用相同名字的变量,它们在内存中占不同函数可以使用相同名字的变量,它们在内存中占不同的单元,互不影响。不同的单元,互不影响。(如,前例如,前例f1和和f2中的中的a,b变量变量) 形式参数也是局部变量。形式参数也是局部变量。 在一个函数内部,可以在复合语句中定义变量,这些在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效。变量只在本复合语句中有效。 关于局部变量几点说明:关于局部变量几点说明:如:如:main() int a,b;
59、 /*a,b在整个在整个main函数内有效函数内有效*/ int c; /*c仅在本复合语句内有效仅在本复合语句内有效*/ c=a+b; . 阅读以下程序,写出程序的运行结果。阅读以下程序,写出程序的运行结果。main() int i=3, j=2, k; k=i+j; int k=8; if(i=3) printf(%d, , k); else printf(%d, , j); printf(%d, %dn,i,k); 运行结果:运行结果:8,3,5共 81页 第 6464 页2. 全局变量全局变量 程序中,在函数之外定义的变量称为外部变量,即全局变程序中,在函数之外定义的变量称为外部变量,
60、即全局变量。全局变量可以为本文件中的其他函数所共用,但是,量。全局变量可以为本文件中的其他函数所共用,但是,它的它的有效范围是从定义变量的位置开始到源文件的结束。有效范围是从定义变量的位置开始到源文件的结束。如:如:int p=1,q=5; float f1(int a) int b,c; . char c1,c2; char f2(int x,int y) int a,b; main ( ) int m,n; . 全局变量全局变量c1,c2的作用范围的作用范围全局变量全局变量p,q的作用范围的作用范围共 81页 第 6565 页 从定义变量的位置开始到本文件结束,这段程序中的函数可直接从定义变量的位置开始到本文件结束,这段程序中的函数可直接使用全局变量。(注意全局变量的有效范围)使用全局变量。(注意全局变量的有效范围) 如果在同一源文件中,全局变量
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六年级品德与社会下册 在自然灾害面前2教学设计 鄂教版
- 江苏省沭阳县马厂中学七年级生物下册 第五单元 第12章 空中的生物 第2节 昆虫教学设计 (新版)苏科版
- 2026年广东省企业环境保护制度课件
- 2026生物多能业市场供需现态分析及投资评估规划规划研究
- 2026旅游酒店行业市场动态分析及投资收益规划发展研究报告
- 2026年苏教版小学语文二年级上册第5单元看图写话训练课件
- 2026贸易流通行业市场现状分析及企业投资布局发展规划研究报告
- 2026中国台湾地区农业科技服务行业市场供需变化投资评估近期规划研究计划
- 2025年甘肃省临夏市辅警招聘考试试题题库【考点精练】附答案
- 2026年湖南省苏教版初中化学八年级上册第4章物质的变化课件
- 误伤私了协议书范本
- 护理风险防范管理制度
- 架空线路拆除施工组织设计方案
- 高考物理一轮复习课件开学第一课
- 《无损检测(第2版)》 课件第六章 声发射检测
- (高清版)DZT 0205-1999 地面γ能谱测量技术规程
- 工程冻土研究课件
- 母女三人闹元宵三人混战猜灯谜
- 胰腺癌的教学查房
- 地质数据处理基础课件
- 15D502 等电位联结安装
评论
0/150
提交评论