C语言程序设计案例教程第5章 使用函数.ppt
《C语言程序设计案例教程第5章 使用函数.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计案例教程第5章 使用函数.ppt(15页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、C语言程序设计案例教程第5章 使用函数第5章使用函数C语言源程序是由函数构成的,一个C语言程序至少包含一个主函数main(),较大的程序除了包含一个主函数main()外,还会包含若干个其他函数,这些其他函数具有不同的功能,例如,前面介绍过的scanf()、printf()和sqrt()等C语言系统提供的库函数,也可以由用户根据实际的需求自行编写函数。5.1函数的定义与调用5.1.1什么是函数1 函数概述一个有用的程序往往需要编写数百行程序代码,甚至上万行的程序代码。在这样的程序中,如果发生错误,程序员不得不一行一行的去寻找错误,其任务是非常繁重的。两外,程序中的某些功能可能会反复多次使用,比如
2、数据的查找、排序等。如果为每一次应用都编写新的代码,会是程序过于庞大。而且,大部分情况下,程序的所有功能并不是都需要同时使用,如果都调入内存,就加大了资源的负担。考虑到以上的种种情况,在编写程序时,各种语言的程序均采用模块化和结构化,将一个程序分割为一个个具有独立功能的模块,每一个模块都用来实现一个特定的功能,模块之间可以互相调用。这样既可以增强程序的层次感,同时还便于阅读、开发和调试。一个较大的程序可以实现多个程序员同时分别开发程序的不同模块,实现程序的并行开发,提高程序设计的效率。图511所示是一种C语言程序的层次结构图。图511C语言程序的层次结构和其他语言一样,C语言程序也是模块化和结
3、构化的程序。在C语言中,函数就是这样的程序模块,函数是构成程序的最基本单位,用函数来实现一个特定的功能,通过函数之间的互相调用,来实现函数之间的数据访问。可以说C语言是函数式语言。一个C语言程序必须有且只有一个主函数main(),可以包含多个其他函数。在主函数内可以调用其他函数,各函数之间可以互相调用,但是函数不可以调用主函数。调用其它函数的函数叫主调函数,被其它函数调用的函数叫被调函数。下面通过一个简单的程序来进一步了解函数。程序如下。2 函数的分类从用户使用角度来说,函数可以分为标准函数和自定义函数两类。分别简介如下。(1)标准函数:也叫库函数,它是C语言系统自带的已经编写好的,可以实现一
4、个特111定功能的函数,例如前面介绍过的scanf()、printf()和sqrt()函数均是标准函数。C语言包含有丰富的标准函数,可参看附录3。.要使用某一个标准函数,需要使用include命令声明该函数所在的头文件。例如,“#includestdio.h”命令用来声明要使用的scanf()和printf()函数在“stdio.h”头文件内;#includemath.h”命令用来声明要使用的的数学函数在“stdio.h”头文件内。“include是命令,不是语句,其后边不可以添加分号“”头文件名称应该用双引号“”。或“”括起来。include命令最前面需加“#”符号。(2)自定义函数:这种函
5、数需要用户在程序内编写相应的程序。另外,从函数的形式来看,函数还可以分为无参函数和有参函数两种。后边将介绍。5.1.1函数的定义函数和变量一样,在调用函数以前必须对这个函数进行定义,用来说明函数的结构和特点。下面分别介绍无参函数和有参函数的定义方法。1 无参函数的定义无参函数的定义格式及其说明如下。【格式】类型标识符变量说明语句【说明】函数首部的类型标识符的作用是指函数返回值的数据类型,例如整型、字符型等。如果函数没有返回值(即函数的运算结果)则返回类型为void类型。如果一个函数是,void类型,该函数就没有返回值。数名为有效的标识符。数首部的末尾不要加分号”则函函“。例如:【实例51】“显
6、示提示文字”程序定义的out1()函数,如下所示。voidout1()/*用来显示一行“=”字符的函数out1()*/printf(=n)2 有参函数的定义有参函数定义通常由函数首部与函数体两部分组成。有参函数的一般定义格式如下。【格式】类型标识符变量说明语句【说明】函数首部的类型标识符的作用是指函数返回值的数据类型,函数名为有效的标识符,形参列表是指主调函数传入函数的参数格式。如果有多个不同的参数,则每个参数都需要说明其类型,各形参之间应用逗号“,”分隔。例如:intmax(inta,intb)112函数名()/*函数首部*/*函数体*/函数名(形参列表)/*函数首部*/*函数体*/intn
7、if(ab)n=aelsen=breturn(n)这里说明了函数max有两个形参a和b,这两个形参均为int型。如果调用函数时不需要传递参数,则形参列表可以省略,但是括号不能省略。大括号内是函数体,即函数的主体执行部分。3 定义函数的注意事项(1)在有参函数的定义时,需要指定形参的数据类型,可以有以下两种方法。方法1intmax(inta,intb)语句方法2intmax(a,b)inta,intb语句(2)函数定义不能嵌套,函数定义应该在所有函数之外。可以在主调函数之前,也可以在主调函数之后。下面是错误的定义方法。inta()intb()【格式1】类型标识符【格式2】类型标识符/*嵌套的函数
8、定义*/(3)如果函数的参数是数组或字符串时,应按如下方式进行定义。函数名(char*形参1,)函数名(char形参1,)【说明】上面的两种方法都可用于字符串参数或数组参数,例如:intstrl(char*s)char*str2(chars1,chars2)(4)空函数:这是一种特殊的函数形式。定义的格式如下。【格式】类型标识符函数名(形参列表)【说明】如同空语句一样,空函数也起到占位的作用。通常用在程序设计的第一阶段,为程序中预计的各个模块预留出空位,以后再进行补充编写。1134 函数声明在一个函数中调用另一个函数时,不仅要保证被调函数的存在,而且需要在函数被调用之前让C语言编译系统知道该函
9、数已经存在。在程序中,对函数实行“先定义,后使用”的原则。如果被调函数为C语言系统提供的标准函数,可以在程序的开头部分用#include命令进行文件包含,在前面见过的printf()sqrt()等函数,就属于这种形式。printf()函数包、含于stdio.h文件,sqrt()函数包含于math.h文件,则在使用这两个函数之前,应在程序开头部分用下面的语句进行包含。#include“stdio.h”#include“math.h”如果被调用的函数是自定义函数,函数与主调函数在同一程序文件中,则可以采用“不用声明函数”“在主函数外部声明函数”和“在主函数内部声明函数”的方法。声明函数采、用的格式
10、及其相应的说明介绍如下。【格式】标识符类型函数名(实参列表)【说明】函数声明有点象函数定义的首部,但函数定义时,函数类型、函数名、形参表及函数体是一个整体,而函数说明仅是对被调函数的说明,其作用是告知系统被调函数的类型及名称(参数名称在说明时可省略)。(1)不用声明函数的方法:如果函数定义在主函数main()之前,可以不用声明函数。例如,【实例51】“显示提示文字”程序就是采用这种方法。(2)在所有函数外部进行声明:在所有函数外部声明的函数,在函数声明语句之后的所有函数中都可调用。通常把函数声明语句放在程序文件的头部,以方便其后的程序对其进行调用,例如:intout1()intout2()ma
11、in()n=out1()m=out2()intout2()s=out1()intout1()/*声明函数out1()*/*声明函数out2()*/*调用函数out1()*/*调用函数out2()*/*定义函数out2()*/*调用函数out1()*/*定义函数out1()*/上面程序段中,函数a()和b()在程序头部进行了说明,所以下面的函数main()和b()中都可以调用函数a()。(3)在函数内部进行声明:在某一函数内部声明的函数,则仅可以在声明它的函数内部114被调用。例如:intmain()intout1()n=out1()intout2()intout1()/*声明函数()*/*调用
12、函数()*/*定义函数*/*定义函数*/在程序中,由于函数out1()仅在主函数main()中进行了说明,并且out1()函数的定义在out2()函数之后,因此,只允许在mout1in()函数中调用函数out1(),而不能够在函数out2()中调用函数out1()。5.1.2函数的调用1 函数的调用当调用函数运行到某处需要实现某个特定功能时,执行函数调用,执行完被调函数后,返回调用函数,继续执行调用函数中调用语句后边的其他语句。调用函数的方法有以下三种。(1)函数语句调用:把函数调用单独作为一行语句使用,例如:max(x,y)printf()这种方法调用函数没有返回值,这种函数通常是实现某一结
13、果可预期的功能。(2)函数表达式中调用:函数出现在一个表达式中,可以作为表达式的一部分使用,例如:k=sqrt(x)m=max(x,y)这种方式用于从被调用函数中获取返回值,并将返回值赋给变量k和m。在使用这种方式调用时,通常要求函数与变量具有相同的数据类型,或将函数返回值强制为与变量相同的数据类型。(3)函数参数:把函数调用的结果作为另一个函数的参数(实参)例如:。m=sun(min(a,b),max(c,d)其中min(a,b)和max(c,d)是一次函数的调用,它们的返回值再作为min()函数调用的参数(实参)。在进行函数调用时,一定要注意,函数调用语句中的参数(实参)数目一定要与相应函
14、数定义中的参数(形参)数目一样,在数据类向上应该一致或匹配(在赋值时可以按照规则进行转换)另外,函数调用语句中的函数名应与相应函数定义中的函数名一样。1152 函数的嵌套调用在函数调用中,允许在函数中调用另一个已声明的函数,例如【实例51】“显示提示文字”程序中的相应程序,在out2()函数中又调用了函数out1()。这种在一个函数中调用另一个函数的用法称为函数的嵌套。下面是另一个函数嵌套调用的实例。voidout1()voidout2()voidmain()n=out1()intout1()m=out2()returnintout2()return/*声明函数out1()*/*声明函数out
15、2()*/*调用函数out1()*/*嵌套调用函数out2()*/在上面的函数嵌套中,函数的执行过程如图514所示。注意,每一层函数返回时,将返回到调用它的函数,再依次执行调用语句后面的其它语句。图514函数嵌套的执行过程在程序执行时,先执行主函数main(),当执行到“n=out1()”语句后,将调用out1()函数。在out1()函数中执行到“m=out2()”语句后,将调用out2()函数。在函数out2()中执行到“rturn”语句时,返回到调用out1()的“m=out2()”语句,将返回值赋给变量m,再继续执行函数out1()中“m=a()”语句后面的语句。116在out1()函数
16、中执行到“rturn”语句时,返回到调用out2()函数的“n=out1()”语句,将返回值赋给变量n,再继续执行主函数main()中的“m=out1()”语句后面的语句,直到程序结束。5.2函数参数传递与递归函数定义时的参数称为形参,函数调用时的参数称为实参,函数之间的数据传输通常是由参数的传递来完成的。在C语言的函数调用中,函数可以间接或直接的调用函数自身,这种调用称为函数的递归调用。5.2.1函数参数传递函数之间的数据传输通常是由参数的传递来完成的,参数是主调函数和被调函数传递数据的载体。对于带参数的函数,主调函数要将参数的数据传递给被调函数的参数,被调函数根据调用函数传递过来的数据进行
17、计算和处理,最后间运行结果通过参数传递给主调函数的参数。被调函数通过参数传递给调用函数的数据叫返回值。1 函数的参数(1)参数的类型:在C语言中,函数有形式参数和实际参数两种类型。简介如下。形式参数也叫形参,在定义函数时,函数名后面的小括号内列出的就是形式参数,它们可以用类型标识符来定义参数的数据类型,它们用逗号“,”分隔,例如:intmax(inta,intb)其中,a和b就是形参。实际参数也叫实参,在函数调用中,函数名称后面的小括号内列出了实参,它们用逗号“,”分隔,例如:kmax=kmax(h,k)其中,h和k就是实参。(2)参数的传递:在C语言程序中,实参与形参总是一一对应的,其个数是
18、相同的,对应的数据类型也是相同或匹配的。在程序执行过程中,实参向形参传递数据。参看图521,在max(inta,intb)函数定义中的a和b就是形参,它们在定义时没有赋予具体的数据,所以是形式上的参数。在语句“kmax=max(h,k)中的h和k是实参,在执”行这行语句时,将h和k的具体数值传递给函数max()中的形参a和b,也就是说,在函数运行时,将会用实参的内容去代替形参进行运算。117图521函数参数传递根据参数传递形式的不同,函数调用又可分为赋值调用和传址调用。2 赋值调用赋值调用时,函数将实参的值复制一份,传递给形参,从而实现参数的传递,在程序运行过程中,形参的变化不会影响实参。赋值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计案例教程第5章 使用函数 语言程序设计 案例 教程 使用 函数
限制150内