c语言程序设计与数据结构》课件第06章

上传人:san****019 文档编号:70798512 上传时间:2019-01-18 格式:PPT 页数:38 大小:1.61MB
返回 下载 相关 举报
c语言程序设计与数据结构》课件第06章_第1页
第1页 / 共38页
c语言程序设计与数据结构》课件第06章_第2页
第2页 / 共38页
c语言程序设计与数据结构》课件第06章_第3页
第3页 / 共38页
c语言程序设计与数据结构》课件第06章_第4页
第4页 / 共38页
c语言程序设计与数据结构》课件第06章_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《c语言程序设计与数据结构》课件第06章》由会员分享,可在线阅读,更多相关《c语言程序设计与数据结构》课件第06章(38页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计与数据结构,第六章 函数,C语言程序设计与数据结构,总体要求: 掌握自定义函数的一般结构及定义函数的方法; 掌握形参、实参、函数原型等重要概念; 掌握函数声明、函数调用的一般方法; 了解局部变量、全局变量的概念; 掌握auto型和static型局部变量的特点和用法。,C语言程序设计与数据结构,学习重点: 区分函数定义、函数说明的区别; 理解参数传递的意义。,C语言程序设计与数据结构,在高级语言程序设计中往往将一个较大的程序分解成若干较小的、功能单一的程序模块来完成特定的功能,称其为子程序。通过对这些子功能的组织和调用,来实现整个程序的功能要求。C语言中,这些功能比较独立的子程序成

2、为函数。函数是C语言程序的一种基本组成部分,C语言程序的功能是通过函数之间的调用来实现的,一个完整的C语言程序可由一个或多个函数组成,每个函数都有一个函数名。,C语言程序设计与数据结构,为什么使用函数? 第一,使用函数可以省去写重复代码。如果程序中要多次使用某种特定的功能,那么只需编写一个合适的函数即可。程序可以在任何需要的位置调用该函数,并且同一个函数可以在不同的程序中调用,就像在很多程序中使用printf()函数一样。 第二,即使某种功能在程序中只使用一次,将其以函数的形式来实现也是必要的,因为函数使得程序更加模块化,从而有利于程序的阅读、修改和完善。,C语言程序设计与数据结构,C语言函数

3、设计的一般原则为: (1)界面清晰。函数的处理任务明确,函数之间数据传递越少越好。 (2)大小适中。函数太大,处理任务复杂,导致结构复杂,程序可读性差;反之,若函数太小,则程序调用关系复杂,这样会降低程序的效率。,C语言程序设计与数据结构,6.1函数分类,在C语言中,从用户使用的角度看,函数可分为库函数和用户自定义函数两种。 C语言提供了极为丰富的库函数,如前几章例题中反复用到的scanf()、printf()、getchar()等函数均属于库函数。这类函数是由系统提供并定义好的,不必用户再去定义,用户只需掌握函数的功能,并学会正确调用这些函数即可,至于函数内部是如何实现这些功能的,用户不必知

4、道。但是,仅有C语言的库函数在实际编程中往往是不够用的,这就需要用户按需要定义和编写自己的函数来解决某些问题。,C语言程序设计与数据结构,事实上,一个具备一定规模C程序往往由多个函数组成。其中必有一个名为main的主函数,由main来调用其他函数。必要的话,其他函数还可以调用另外的函数。同一个函数可以被多个函数调用一次或者多次。 从总的框架来看,是将一个大的计算任务划分为一个一个小的任务,这些小的任务均由函数来完成。而函数既可以是C的标准库函数,也可以是用户自定义函数。 注意:函数必须先定义,后调用。,C语言程序设计与数据结构,6.1.1函数分类,从函数定义的角度看,函数可分为库函数和用户定义

5、函数两种 语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。 语言提供了极为丰富的库函数,C语言程序设计与数据结构,还应该指出的是,在语言中,所有的函数定义,包括主函数main在内,都是平行的。 也就是说,在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。 函数还可以自己调用自己,称为递归调用。main 函数是主函数,它可以调用其它函数,而不允许被其它函数调用。 因此,程序的执行总是从m

6、ain函数开始,完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。一个源程序必须有,也只能有一个主函数main。,C语言程序设计与数据结构,6.1.2 文件包含,文件包含是C预处理程序的一项重要功能。 文件包含命令行的一般形式为: #include “文件名“ 在前面我们已多次用此命令包含过库函数的头文件。例如: #include “stdio.h“ 文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。被读入的源文件必须用双引号或尖括号括起来。 在程序设计中,文件包含是很有用的。一个大的程序可以分为多个模块,

7、由多个程序员分别编程。有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用。这样,可避免在每个文件开头都去书写那些公用量,从而节省时间,并减少出错。,C语言程序设计与数据结构,对文件包含命令还要说明以下几点:,1.包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。例如以下写法都是允许的: #include “stdio.h“ #include 但是这两种形式是有区别的:使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找; 使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。

8、用户编程时可根据自己文件所在的目录来选择某一种命令形式。 2.一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。 3.文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件,C语言程序设计与数据结构,6.2函数的定义,6.2.1函数定义的一般形式 1任何函数(包括主函数main())都是由函数说明和函数体两部分组成。根据函数是否需要参数,可将函数分为无参函数和有参函数两种。 函数返回值类型 函数名(形式参数表) 函数体 定义说明: 函数名:是符合标识符命名规则的任何合法标识符。 形参表是用逗号分隔的一组变量说明,其格式如下: 数据类型1 形参

9、1,数据类型2 形参2,数据类型n 形参n 函数体是实现函数功能的全部语句。 函数类型有两种情况:当函数有具体的返回值时,函数类型为函数值的数据类型;当函数只是完成特定的操作,而没有具体的返回值时,函数类型为void型。函数的类型可以省略,当不指明函数类型时,系统默认为int型。,C语言程序设计与数据结构,例 6.1 定义一个函数,用于求两个数中的大数。 1 #include 2 int max(int n1, int n2) /*定义一个函数max()*/ 3 4 return (n1n2?n1:n2); 5 6 void main() 7 8 int max(int n1, int n2)

10、; /*函数说明*/ 9 int num1,num2; 10 printf(“input two numbers:n“); 11 scanf(“%d%d“, 13 ,C语言程序设计与数据结构,第8,9行为说明语句部分,用来说明(定义、申明)函数和变量。第10-12行为执行语句部分。 2说明 (1)函数不允许嵌套定义。 在语言中,所有函数(包括主函数main())都是平行的。一个函数的定义,可以放在程序中的任意位置,即放在主函数main()之前或之后都可以。但在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。 (2)空函数既无参数、函数体又为空的函数。其一般形式为: 函数类型 函数名(

11、void) ,C语言程序设计与数据结构,6.2.2形参和实参,函数的参数分为 形参 和 实参 两种,作用是实现数据传送。 形参出现在函数定义中,只能在该函数体内使用。发生函数调用时,调用函数把实参的值复制1份,传送给被调用函数的形参,从而实现调用函数向被调用函数的数据传送。,C语言程序设计与数据结构,例 6.2 实参对形参的数据传递(无返回值)。 1 #include 2 void main() 3 4 void s(int n); /*说明函数*/ 5 int n=100; /*定义实参n,并初始化*/ 6 s(n); /*调用函数*/ 7 printf(“n_s=%dn“,n); /*输出

12、调用后实参的值,便于进行比较*/ 8 9 void s(int m) 10 11 int i; 12 printf(“m=%dn“,m); /*输出改变前形参的值*/ 13 for(i=m-1;i=1;i-) 14 m=m+i; /*改变形参的值*/ 15 printf(“m=%dn“,m); /*输出改变后形参的值*/ 16 ,程序运行结果为: m=100 m=5050 n_s=100,C语言程序设计与数据结构,例6.3 实参对形参的数据传递(有返回值)。 1 #include 2 void main() 3 4 int max(int x,int y); 5 int a,b,c; 6 sc

13、anf(“%d,%d“, 15 ,运行情况如下: 输入:5,7 输出:max is 7,C语言程序设计与数据结构,说明: (1)实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此,应预先用赋值、输入等办法,使实参获得确定的值。 (2)形参变量只有在被调用时,才分配内存单元,调用结束后,即刻释放所分配的内存单元。因此,形参只有在该函数内有效。调用结束后,则不能再使用该形参变量。 (3)实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 (4)实参和形参占用不同的内存单元,即

14、使同名也互不影响。 (5)实参与形参的类型应当相同或赋值兼容。,C语言程序设计与数据结构,6.2.3函数的返回值,语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。 1函数返回值与return语句 函数的返回值,是通过函数中的return语句来获得的。 (1)return语句的一般格式: return ( 返回值表达式 ); (2)return语句的功能:返回调用函数,并将“返回值表达式”的值带给调用函数。 注意:被调用函数中无return语句,并不是不返回一个值,而是一个不确定的值。为了明确表示不返回值,可以将函数类型定义为“void”

15、,表示为“无(空)类型”。 2函数类型 在定义函数时,对函数类型的说明,应与return语句中返回值表达式的类型一致,也就是说函数的类型是函数返回值的类型,它可以是我们已经学习过的int、char、float、double中的任意类型,也可以是我们要在后面学习的构造数据类型和指针类型。如果不一致,则以函数类型为准。如果缺省函数类型,则系统一律按整型处理。,C语言程序设计与数据结构,例6.4 求参数n的平方 double sqare(double n) return n * n; 下面这个函数用来判断参数n是否为正数 int isPositive(int n) if(n0) return 1;

16、else return 0; 注意函数isPositive,虽然没有错,但显得很笨拙,更好的方法是: int isPositive(int n) return n0; 或 int isPositive(int n) return (n0)?1:0 ,C语言程序设计与数据结构,再举一个不带参数没有返回值的函数的例子 : void hello() printf(“Hi!n”); 良好的程序设计习惯: 为了使程序具有良好的可读性并减少出错,凡不要求返回值的函数都应定义为空类型,即使函数类型为整型,也不使用系统的缺省处理。,C语言程序设计与数据结构,6.3 函数的声明和调用,6.3 函数的声明和调用 编译系统在处理调用时,必须从程序中获得完成函数调用所必需的接口信息,用以确认函数

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号