《第10章函数编程基础精.ppt》由会员分享,可在线阅读,更多相关《第10章函数编程基础精.ppt(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第10章函数章函数编程基程基础第1页,本讲稿共20页 教 学 目 的内内 容容1 教 学 要 求2 重 点 难 点3 教 学 内 容4第2页,本讲稿共20页教教 学学 目目 的的 本章致力于使读者了解关于函数的概念,掌握函数的定义和函数中各组成部分。能使用函数应用于程序中,将程序分成模块。第3页,本讲稿共20页教教 学学 要要 求求u了解函数的概念u掌握函数的定义方式u熟悉函数返回和参数的作用u掌握函数的调用u能够应用函数解决实际问题u掌握如何安装Visual Studio 2010帮助系统。第4页,本讲稿共20页重重 点点 难难 点点重点:u函数的定义与声明;u函数的返回值;u函数的参数传
2、递;u函数的调用;难点:u形参与实参的传递;u函数递归调用。第5页,本讲稿共20页教教 学学 内内 容容u传递函数参数;u函数概述;u函数的定义;u了解返回语句;u调用函数;u灵活应用函数。第6页,本讲稿共20页函数概述函数概述一个完整的C程序是通过函数之间互相调用实现的。因此读者要仔细阅读学习本章内容。通过对函数模块的调用,可以实现相应的功能。在进行程序设计的时候,会将一些常用的功能模块编写成函数,放在函数库中供公共使用。有些函数是按照ANSIC的要求随C语言编译器提供的,这种函数称之为库函数。像printf函数、scanf函数等等,都是属于库函数。每个C程序的入口和出口都是位于main函数
3、之中。编写程序时,并不是将所有的内容都放在主函数main中。为了方便规划、组织、编写和调试,一般的做法是将一个程序划分成若干个程序模块,每一个程序模块都完成一部分功能。这样不同的程序模块可以由不同的人来完成,从而可以提高软件开发的效率。也就是说主函数可以调用其他的函数,其他函数也可以相互调用。在main函数中调用其他的函数,这些函数执行完毕之后又返回到main函数中。通常把这些被调用的函数称做下层函数。函数调用发生时,立即执行被调用的函数,而调用者则进入等待的状态,直到被调用函数执行完毕。函数可以有参数和返回值。实例 在主函数中调用其他函数 第7页,本讲稿共20页函数的定义函数的定义1.函数定
4、义的形式对于C语言的库函数来说,在编写程序时是可以直接调用的,例如printf输出函数。而自定义函数,则必须由用户对其进行定义,在其函数的定义中完成函数特定的功能,这样才能被其他函数所调用。一个函数的定义分为两个部分,函数头和函数体。函数的定义的语法格式如图所示:第8页,本讲稿共20页函数的定义函数的定义 2 2 定义与声明定义与声明 在程序中编写函数时,一般会先对函数进行声明,然后再对函数进行定义。当然这个并不是绝对的,有时可以不需要声明,对函数直接进行定义。函数的声明是让编译器知道函数的名称、参数、返回值类型等信息。函数的定义是让编译器知道函数的功能。函数的声明的格式由函数返回值类型、函数
5、名、参数列表和分号4部分组成。返回值类型返回值类型 函数名函数名 (参数列表)参数列表);此处要注意的是在声明的最后要有分号“;”作为语句的结尾。例如,声明一个函数的代码如下:int ShowNumber(int iNumber);int ShowNumber(int iNumber);例如在前面的实例中会看到这样的代码格式,在使用一个函数之前先进行声明。实例 函数的定义与声明 第9页,本讲稿共20页了解返回语句了解返回语句返回语句有两个主要用途:返回语句能立即从所在的函数中退出,即返回到调用的程序中去。返回语句能返回值。将函数值赋给调用的表达式中,当然有些函数也可以没有返回值,例如返回值类型
6、为void的函数就没有返回值。1.1.从函数返回从函数返回 从函数返回就是返回语句的第一个主要用途。在程序中,有两种方法可以终止函数的执行,并返回到调用函数的位置。第一种方法是在函数体中,从第一句一直执行到最后一句,当所有的语句都执行完了,程序遇到结束符号“”后返回。实例实例 函数遇到结束符号函数遇到结束符号“”返回返回 第二种方式是采用函数返回语句return。return语句的一般形式如下:return(return(表达式表达式););实例实例 分数计算器程序分数计算器程序 第10页,本讲稿共20页了解返回语句了解返回语句2 返回值通常调用者希望能调用其他函数得到一个确定的值,这就是函数
7、的返回值。例如下面代码:实例 计算函数值,该函数为 下面对函数返回值进行一下说明:函数的返回值都是通过函数中的return语句获得的,return语句将被调用函数中的一个确定值返回到调用函数中,例如上面代码中Minus自定义函数的最后就是使用return语句将计算的结果返回到主函数main调用者处。return(表达式)中的括号是可以省略的,例如 return 0和return(0)是相同的,在本书的实例中都将括号进行了省略,所以在此对return进行说明。函数返回值的类型。既然函数有返回值,这个值当然应该是属于某一种确定的类型,所以应当在定义函数时明确的进行指出函数返回值的类型。例如:int
8、 Max(int iNum1,int iNum2);double Min(double dNum1,double dNum2);char Show(char cChar);如果函数值的类型和return语句中表达式的值不一致,则以函数的返回值类型为准。数值型数据,可以自动进行类型转化。即函数定义的返回值类型决定最终返回值的类型。实例 返回值类型与return值类型 第11页,本讲稿共20页传递函数参数传递函数参数在调用函数时,大多数情况下,主调函数和被调用函数之间有数据传递关系,这就是前面提到的有参数的函数形式。函数参数的作用是传递数据给函数使用,函数利用接收的数据进行具体的操作处理。函数参数
9、的位置在定义函数时,放在函数名称的后面,如下图 第12页,本讲稿共20页传递函数参数传递函数参数1 1 形式参数与实际参数形式参数与实际参数在使用函数时,会经常的听到形式参数和实际参数。两者都叫做参数,那么他们有什么关系,二者之间区别是什么?两种参数各自又起到什么作用?接下来通过两者的名称和作用来进行理解,再通过一个比喻和实例讲解深入理解形式参数与实际参数。通过名称理解 形式参数,按照名称进行理解就是形式上存在的参数。实际参数,按照名称进行理解就是实际存在的参数。通过作用理解 形式参数:在定义函数时,函数名后面括号中的变量名称为“形式参数”。在函数调用之前,传递给函数的值将被复制到这些形式参数
10、中。实际参数:而在调用一个函数时,也就是真正使用一个函数时,函数名后面括号中的参数为“实际参数”。函数的调用者提供给函数的参数叫实际参数。实际参数是表达式计算的结果,并且被复制给函数的形式参数。通过下图,更好的进行理解:实例实例 形式参数与实际参数的比喻实现形式参数与实际参数的比喻实现第13页,本讲稿共20页传递函数参数传递函数参数2.数组做函数参数 当数组作为函数的实参时,只传递数组的地址,而不是将整个数组赋值到函数中去。当用数组名作为实参调用函数时,指向该数组的第一个元素的指针就被传递到函数中。使用数组元素作为函数参数由于实参可以是表达式形式,数组原属可以是表达式的组成部分,因此数组元素当
11、然可以作为函数的实参,与用变量作为函数实参一样,是单向传递。实例 求学生的平均身高 数组名作为函数参数可以用数组名作为函数参数,此时实参与形参都使用数组名。实例 数组名作为函数参数 使用指针作为函数参数最后一种方式,是将函数参数声明为一个指针。前面的讲解中也曾提到,当数组作为函数的实参时,只传递数组的地址,而不是将整个数组赋值到函数中去。当用数组名作为实参调用函数时,指向该数组的第一个元素的指针就被传递到函数中。例如声明一个函数参数为指针时,传递数组方法如下:void Function(int*pPoint);/*声明函数*/int iArray10;/*定义整型数组*/Function(iA
12、rray);/*将数组名作为实参进行传递*/在上面的代码中可以看到在声明Function时,指针作为函数参数。在调用函数时,可以将数组名作为函数的实参进行传递。实例 指针作为函数参数 第14页,本讲稿共20页传递函数参数传递函数参数3.了解main的参数在前面的函数的定义小节中,曾在讲解函数体时提到过有关主函数main的有关内容,在此基础上对main函数的参数再进行介绍。在运行程序时,有时需要将必要的参数传递给主函数,主函数main的形式参数如下:main(int argc,char*argv)两个特殊的内部形参argc和argv是用来接受命令行实参的,这是只有主函数main才能具有的参数。a
13、rgc参数argc参数保存命令行的参数个数,是个整型变量。这个参数的值至少是1,因为至少程序名就是第一个实参。argv参数argv参数是一个指向字符指针数组的指针,在这个数组里的每一个元素都指向命令行实参。所有命令行实参都是字符串,任何数字都必须要由程序转变成为适当的格式。实例 main的参数使用 第15页,本讲稿共20页调用函数调用函数1.函数调用方式 函数语句调用把函数的调用作为一个语句就叫函数语句调用。函数语句调用是最常使用的调用函数的方式,如下所示:Display();/*进行显示一条消息*/这个函数的功能就是函数的内部显示一条消息。这时不要求函数带返回值,只要求完成一定的操作。实例
14、函数语句调用 函数表达式调用函数出现在一个表达式中,这时要求函数带回一个确定的值,这个值作为参加表达式的运算。如下代码所示:iResult=iNum3*AddTwoNum(3,5);/*函数在表达式中*/可以看到在这条语句中,函数AddTwoNum的功能是进行两个数相加。在表达式中,AddTwoNum将相加的结果与iNum3变量进行乘法运算,将得到的结果赋值给iResult变量。实例 函数表达式调用 函数参数调用函数调用作为一个函数的实参,这样将函数返回值作为实参传递到函数中进行使用。函数出现在一个表达式中,这时要求函数带回一个确定的值,这个值作为参加表达式的运算。如下代码所示:iResult
15、=AddTwoNum(10,AddTwoNum(3,5);/*函数在参数中*/在这条语句中,函数AddTwoNum的功能还是进行两个数相加。AddTwoNum将相加的结果作为函数的参数,继续进行计算。实例 函数参数调用 第16页,本讲稿共20页调用函数调用函数2.嵌套调用前文函数定义的时候就已经强调过:在C语言中,函数的定义都是互相平行、独立的,也就是说在定义函数时,一个函数体内不能包含定义的另一个函数,这一点和PASCAL语言是不同的(PASCAL允许在定义一个函数时,在其函数体内包含另一个函数的定义,而这种形式称之为:嵌套定义)。实例 函数的嵌套调用 第17页,本讲稿共20页调用函数调用函
16、数3 递归调用递归函数又被称为自调用函数,C语言的函数都支持递归,也就是说,每个函数都可以直接或者间接的调用自己。所谓的直接调用,是指函数直接调用自身函数,也就是说函数Function直接调用函数Function自身。所谓的间接调用,是指在递归函数调用的下层函数中再调用自己,举例说明就是函数Function调用函数Function1,函数Function1又调用函数Function。如图所示递归关系:递归之所以能实现,是因为函数的每个执行过程在栈中都有自己的形参和局部变量的副本,这些副本和该函数的其他执行过程不发生关系。这种机制是当代大多数程序设计语言实现子程序结构的基础,也使得递归称为可能。
17、假定某个调用函数调用了一个被调用函数,再假定被调用函数又反过来调用了调用函数,那么第二个调用就称为调用函数的递归,因为它发生在调用函数的当前执行过程运行完毕之前。而且,因为这个原先的调用函数、现在的被调用函数在栈中较低的位置有它独立的一组参数和自变量,原先的参数和变量将不受任何的影响,所以递归能正常工作。实例 函数的递归调用 第18页,本讲稿共20页灵活应用函数灵活应用函数为了可以快速的进行编写程序,编译系统都会提供一些库函数,不同的编译系统所提供的库函数可能不完全相同。其中函数名字可能相同但是实现的功能不同,也有可能实现统一功能但是函数的名称却不同。ANSIC标准建议提供的标准库函数包括了目前多数C编译系统所提供的库函数,下面就介绍些部分常用的库函数。首先进行介绍有关数学的常用函数 abs函数labs函数fabs函数实例 数学库函数使用 sin函数cos函数tan函数实例 使用三角函数 isalpha函数isdigit函数isalnum函数实例 使用字符函数判断输入字符 实例 使用字符函数判断输入字符 第19页,本讲稿共20页Thank 第20页,本讲稿共20页
限制150内