C语言程序设计教程课件:5_b_Function_a_第1页
C语言程序设计教程课件:5_b_Function_a_第2页
C语言程序设计教程课件:5_b_Function_a_第3页
C语言程序设计教程课件:5_b_Function_a_第4页
C语言程序设计教程课件:5_b_Function_a_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序设计基础(C语言)Function,共 84 页 第 2 页,Chapter 8 Function (函数),概述、定义、声明和调用 函数之间参数传递规则 变量的存储类型与特性 函数和数组 函数递归的概念与执行过程 递归程序的编程方法 库函数 一些典型应用,Contents,8.1 Overview of Function,Function is the basic sub-unit of C program. C语言程序设计,就是编写函数。 至少要编写一个 main( )函数,其次是若干辅函数。,main( ) f1( ); f2( ); ,f1( ) f11( ); ,f2( ) f2

2、1( ); f22( ); ,f21( ) ,f11( ) ,f22( ) ,Main函数:C 程序从 main函数开始执行, 调用其它函数后 流程回到main 函数,main函数 结束,整个程序结束。 main函数是C语言要求的。,示意图:函数如何构成程序,8.1 Overview of Function,一个C程序可由一个主模块(main)和若干个辅模块(其他函数)构成。模块之间也可互相调用。,C语言以函数为程序单元,这体现了模块化的程序设计思想。Modularization(模块化),指一个程序由若干个模块组成,而每个模块用来实现一个特定的功能。这些模块的功能都是由函数(也称子程序)完成

3、。,主模块,模块a,模块b,模块c,d,b,e,d,m,f,a,f2,f1,同一个函数可被一个 或多个函数调用多次。,共 84 页 第 5 页,8.1 Overview of Function,模块化 需要自顶向下的任务分解 也就能够实现结构化程序设计 模块化的优点: 控制程序设计的复杂性, 提高软件的可靠性, 提高软件开发的效率, 提高软件的可维护性, 提高程序的可重用性。,模块化程序设计的意义,共 84 页 第 6 页,8.1 Overview of Function,C函数和调用的简单示例 main( ) printf(”This is C programn”); 函数main调用了函数

4、printf。printf是一个库函数。,如何定义自己的函数? 怎样使用自己定义的函数?,从用户使用的角度看,函数有两种: 标准函数,即库函数。由系统提供,可直接使用。 自定义函数:用户根据需要自己定义的函数。,Example,自定义C函数和调用的简单示例,main () printstar ( ); /*调用printstar函数*/ print_message( );/*调用print_message函数*/ printstar ( );/*调用printstar函数*/ ,printstar ( ) /* printstar函数 */ printf(“*n”); ,print_messa

5、ge( ) /* print_message函数*/ printf(“ How do you do!n”); ,程序运行结果如下: * How do you do! *,8.1 Overview of Function,Example,- 进行参数传递的简单示例,(a, b),main () float a,b; int c; scanf(“%f,%f”, ,共 84 页 第 12 页,现代格式: 更简洁、更常用,更清晰、更明确,共 84 页 第 13 页,8-2 Definition of Functions,语言中一个最简单的函数: dummy ( ) /* 函数名:dummy */ 省略

6、了函数的数据类型(系统默认为整形); 没有形式参数和形式参数说明; 函数体为空,没有任何语句。,Example 1,共 84 页 第 14 页,定义求阶乘函数facto。 long facto (int x ) long y; for ( y=1; x0; -x ) y *= x; return (y); ,8-2 Definition of Functions,函数名,形式参数列表,函数类型,形式参数说明,函数体,函数返回,Example 2,共 84 页 第 15 页,8-2 Definition of Functions,编写一个函数,求两个变量的最大值。 main( ) int a,b

7、,c; printf(”Enter a,bn”); scanf(”%d,%d”, ,形式参数列表,形式参数说明,函数调用,Example 3,fun1( ) fun2( ) ,fun1( ) ,错了!,fun2( ) ,正确!,8-2 Definition of Functions,定义函数是相互独立的,不能嵌套定义。 可以互相调用,但不能调用main函数。,NOTES,共 84 页 第 17 页,8-3 Return of Functions,Grammar of Return statements (1)格式1: return; 功能:将控制从被调函数返回到主调函数。 (2)格式2: re

8、turn (表达式); 或:return 表达式 ; 功能:在被调函数中计算表达式的值,将计算结果按照函数说明的函数类型返回到主调函数,并将控制返回主调函数。 例如,通过函数 max 求变量 a 和 b 的最大值。 c = max(a, b);,共 84 页 第 18 页,8-3 Return of Functions,Usage of return statements: (1)控制程序从当前函数(被调函数)中退出,返回到调用函数(主调函数)的调用点继续执行; (2)从被调用函数向主调函数带回一个值,称为返回值。,函数的返回值的类型,即为函数的数据类型,相应的,return语句有两种用法,共

9、 84 页 第 19 页,8-3 Return of Functions,控制流程如何从被调用函数返回: 使用 return 语句从被调函数中退出,使控制返回到调用它的函数中。调用函数也称为主调函数。 被调函数如果没有 return 语句,被调函数执行结束遇到最外面的 ,控制自动返回到主调函数。,共 84 页 第 20 页,8-3 Return of Functions - void type functions,void类型的用途 表示一个函数没有返回值; 用来指明一个通用型的指针。 void类型概念 又称为无值类型(或空类型)。 void类型的函数在调用之后没有返回值。(void类型的函数

10、不是调用函数之后不返回),Void 一类特殊的函数返回值类型,共 84 页 第 21 页,8-3 Return of Functions - void type functions,输出边长为N的空心正六边型,边由*组成。 例 N=5时: * * * * * * * * * * * * * * * *,Modeling: 第 和 行,先输出 个空格,再输出 个 *。 其它第 行:输出左侧空格( );输出 个 *; 输出中间空格( );输出 个 *。,-4 -3 -2 -1 0 1 2 3 4,-(n-1) n-1 n-1 n i |i| 1 3*n-2*|i|-4 1,void pt ( in

11、t n,char ch ) while ( n- 0 ) printf(%c,ch); ,建立一个 void 型的函数:重复输出 n 个字符 ch,Example,8-3 Return of Functions - void type functions,void pt( int n,char ch); /* 函数说明 */ int main( ) int m,n,i; scanf(%d, /* 结束 for 循环 */ ,共 84 页 第 23 页,8-4 Declaration and Calling of Functions,在调用函数之前,要先进行函数声明 “声明”与“定义” 的区别:

12、 “声明”就是说明函数返回值的类型 即:告诉主调函数,被调用函数的返回值是什么数据类型。 “定义”是给出函数的程序体 即:定义函数的内部组成和各种操作,实现函数的功能。,Declaration of Functions (函数声明),共 84 页 第 24 页,8-4 Declaration and Calling of Functions,函数声明的一般形式 数据类型 函数名( ); 数据类型必须与函数定义时的函数类型一致。这里的数据类型是定义的函数的返回值类型,( )中为空。 函数声明与函数定义的首部唯一区别:函数声明语句的( )之后必须有分号,而函数定义头部的( )之后没有分号。,Dec

13、laration of Functions (函数声明),main( ) float a, b; scanf(“%f,%f”,float plus ( float x, float y ) ;,8-4 Declaration and Calling of Functions,共 51 页 第 26 页,在下列情况下可以省略函数声明: 当函数返回值为整型或者字符型时 文件中定义出现在调用之前 在下列情况下必须对函数进行声明: 返回值不是整型和字符型并且函数定义在调用之后; 函数的定义和调用在两个不同的文件中;,8-4 Declaration and Calling of Functions,8-

14、4 Declaration and Calling of Functions,共 84 页 第 28 页,用函数facto计算 m 阶乘。 main( ) int m; long mm; long facto( ); scanf(%d, ,/* 函数定义 */ /* 内为函数体 */ /* 返回并带回返回值 */,函数声明,8-4 Declaration and Calling of Functions,Example,共 84 页 第 29 页,8-4 Declaration and Calling of Functions,函数的调用形式 函数名( 实际参数表 ); 函数调用时实际参数表中

15、给出的变量简称为实参。 实参的数量、类型和排列顺序必须与函数定义时形式参数表中形参的数量、类型和排列顺序一致,不允许任意改变。,Calling of Functions (函数调用),共 84 页 第 30 页,8-4 Declaration and Calling of Functions,用函数facto计算 m 阶乘。 main( ) int m; long mm; long facto( ); scanf(%d, ,/* 函数定义 */ /* 内为函数体 */ /* 返回并带回返回值 */,函数说明,Example,共 51 页 第 31 页,函数语句 函数表达式 函数参数,void

16、printa( )printf(“=n”); main( ) printa ( ); ,(1)函数语句形式,适合无返回值的函数调用 例如:打印表格,函数的调用方式,8-4 Declaration and Calling of Functions,共 51 页 第 32 页,int plus(int a, int b) return a+b; main( ) int c; c=2+plus(2 , 7)+ plus(5 , 12); printf(“%dn”,c); ,(2) 函数表达式形式,适合返回值参与运算的函数调用 例如:找一个数,8-4 Declaration and Calling o

17、f Functions,共 51 页 第 33 页,int plus(int a, int b) return a+b; main( ) int c; c=2+plus(2 , plus(5 , 12)); printf(“%dn”,c); ,(3) 函数参数形式,适合返回值作为其他函数的参数的函数调用,8-4 Declaration and Calling of Functions,共 84 页 第 34 页,8-4 Declaration and Calling of Functions,函数调用的执行过程 在一个函数中调用另一个函数时,程序将控制从主调函数转移到被调函数,并开始执行被调用

18、函数。 在执行完被调函数的所有语句,或者遇到return语句时,程序的控制要返回到主调函数中原来调用被调函数的地方继续执行。,共 84 页 第 35 页,8-4 Declaration and Calling of Functions,计算 m 的阶乘。 main( ) int m; long mm; long facto( ); scanf(%d, ,函数执行过程,main ( ) mm = facto( m ); ,facto ( x ) return (y ); ,调用,返回,Example,共 84 页 第 36 页,8-4 Declaration and Calling of Fun

19、ctions,函数的嵌套调用,main函数 调用函数 A; ,函数 A 调用函数 B; ,函数 B ,调用,调用,返回,返回,8-4 Declaration and Calling of Functions,共 84 页 第 38 页,8-5 Data transfer between functions - Arguments,在不同的函数之间传递数据,有三种方式: 返 回 值:用return语句返回计算结果 参 数:通过形式参数和实际参数 全局变量:外部变量,函数间数据传递方式,共 84 页 第 39 页,.?,8-5 Data transfer between functions - A

20、rguments,Passing Arguments by Value (值传递) 值传递方式也称“数据复制”方式。 函数间形参变量与实参变量的值的传递过程类似于日常生活中的“复印”操作。,.?,共 84 页 第 40 页,8-5 Data transfer between functions - Arguments,Passing Arguments by Value (值传递) 在被调函数内部产生一个新的变量,使用从实参中复制来的值进行被调函数内部的后续处理。 值传递:在调用函数时,将主调函数中实参变量的值取出来,复制给被调函数的形参变量,使形参变量在数值上与实参相等。 中的实参可以是一个

21、表达式,调用被调函数时先计算表达式的值,再将结果(值)复制到形参变量中。,共 84 页 第 41 页,8-5 Data transfer between functions - Parameters,用函数交换主调函数中两个变量的值。 int swap ( int x, int y ) int temp; /* 借助临时变量交换两个形参变量的值 */ temp = x; x = y; y = temp; printf (in swap x=%d, y=%dn, x, y); int main() int a, b; a = 5; b = 10; /* 说明两个变量并赋初值 */ printf(

22、before swap a=%d, b=%dn, a, b); swap( a, b ); /* 用变量a和b作为实际参数调用函数 */ printf(after swap a=%d, b=%dn, a, b); system(PAUSE); return 0; ,Example,共 84 页 第 42 页,8-5 Data transfer between functions - Parameters,main 函数 a = 5; b = 10; swap(a, b); ,swap ( x, y ) 函数 temp = x; 语句 x = y; 语句 y = temp; 语句 ,5,10,实

23、参变量 a,实参变量 b,5,10,形参变量 x,形参变量 y,变量 temp,复制,复制, temp = x, x = y, y = temp,10,5,5,swap函数的执行过程和各个变量的变化过程,调用swap函数,调用swap函数,调用swap函数,执行swap函数,执行swap函数,执行swap函数,共 84 页 第 43 页,8-5 Data transfer between functions - Parameters,Features of Passing by Value,Advantages of Passing by Value 被调用的函数不可能改变主调函数中变量的值,

24、而只能改变它的局部的临时副本。这样就可以避免被调用函数的操作,对主调函数中的变量的影响,避免了函数调用可能产生的副作用。,Disadvantages of Passing by Value 调用函数时,每个形式参数仅能传递一个数据,当需要在函数之间传递大量数据时,简单的值传递方式显然不适用。,共 84 页 第 44 页,8-6 Storage Classes(存储类型) auto float pi; 说明符“auto”可以省略。按照这种默认的规定,以前所使用的全部变量都是自动变量。 Notes: 1.说明自动变量必须在一个函数体的内部。 2.函数的形参也是自动变量。,(1)Auto varia

25、bles (自动变量),共 84 页 第 47 页,8-6 Storage Classes(存储类型) /* 函数main中的自动变量x */ void f1( ), f2( ); f1( ); f2(x); /* 分别调用函数f1和f2 */ printf (x=%dn, x); void f1 ( void ) int x = 3; /* 函数f1中的自动变量x */ printf (x=%dt, x); void f2 (int x ) /* 函数f2中的形参x也是自动变量 */ printf (x=%dt, +x); /* x加1 */ ,共 84 页 第 49 页,8-6 Stora

26、ge Classes(存储类型) /* 说明外部变量x */ main ( ) . ,(3) External variables (外部变量),共 84 页 第 52 页,8-6 Storage Classes(存储类型) /* 说明外部变量x */ main ( ) void addone( ), subone( ); x = 1; /* 为外部变量x赋值 */ printf (x begins is %dn, x); addone( ); subone( ); subone( );addone( );addone( ); printf (x winds up as %dn, x); vo

27、id addone ( void ) x+; /* 使用外部变量x */ printf (add 1 to make %dn, x); void subone ( void ) x-; /* 使用外部变量x */ printf (substract 1 to make %dn, x); ,共 84 页 第 53 页,1.外部变量在编译时由编译系统在数据段分配永久性的存储空间; 2.外部变量如果没有赋初值,则为0。,8-6 Storage Classes(存储类型) /* 自动变量-输出不定*/ printf (”x=%d”, x): 程序2: #include int x; /* 外部变量-输

28、出为 0 */ main ( ) printf (”x=%d”, x): ,8-6 Storage Classes(存储类型) /* 定义外部变量x和y */ int y = 10; void add ( void ) y = 10+x; x *= 2; main ( ) extern void sub( ); /* 说明sub是void型的外部函数 */ x += 5; add( );sub( ); /* 分别调用函数 */ printf (x=%d; y=%dn, x, y); /* 文件二 */ void sub ( void ) /* 函数sub定义在另一个文件中 */ extern int x; /* 说明在另一个文件中的外部变量x */ x -= 5; ,8-6 Storage Classes(存储类型) /* 定义外部静态变量x */ int y = 3; /* 定义外部变量y */ extern void add2( ); /* 声明外部函数add2 */ void add1( ); main ( ) add1( ); add2( ); add1( ); add2( ); printf (x=%d; y=%dn, x, y); void add1( void ) /* 定义函数add1 */ x += 2; y += 3; printf (in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论