• 1. 第5章 函 数 杨章伟 e-mail:yang505412@163.com
  • 2. 课程内容安排定义函数 函数参数及原型 调用函数 变量的作用域 函数的作用域 函数重载 小结 习题
  • 3. 函数概述 结构化程序设计中,通常把一个大的程序分成若干个模块,每一个模块完成一个或多个特定功能。每一个模块是相对独立的,却又具有通用性,可供本程序或其他程序调用。这种模块化的设计思想有利于多人协作共同开发程序,函数就是这种设计思想的产物。
  • 4. 定义函数 在C++程序中调用函数之前,首先要对函数进行定义。如果调用此函数在前,函数定义在后,就会产生编译错误。为了使函数的调用不受函数定义位置的影响,可以在调用函数前进行函数的定义。这样,不管函数是在哪里定义的,只要在调用前进行了函数的定义,就可以保证函数调用的合法性。 函数定义的一般形式如下: 返回类型 函数名(参数列表) {… 函数体 }
  • 5. 【范例5-1】函数的定义 该范例定义一个函数func,该函数判断指定的参数与0的比较结果,大于0则返回值1,等于0则返回0,小于0则返回-1。并在主函数main()中调用该函数,使读者可以看到该函数的执行结果。
  • 6. 函数参数及原型 函数一般都带有参数列表,这个参数列表称为形式参数,而在调用函数时,实际的参数和形式参数将会有数据传递。 函数原型也称函数声明或函数模型。在主调函数中,如果要调用另一个函数,则须在本函数或本文件中的开头将要被调用的函数事先作一声明。声明函数就是告诉编译器函数的返回类型、名称和形参表构成,以便编译系统对函数的调用进行检查。
  • 7. main()函数 每个C++程序都必须要有一个main()函数,main()函数也称为主函数,是C++程序中最重要的函数,所有完整可运行的C++程序都必须有一个唯一的main()函数。 main()函数是一个特殊的函数。其中“main”是函数名,与其他函数一样,该函数也可以有返回值和参数表。 在main()函数中允许带两个参数,一个为argc,整型数据类型,另一个是指向字符型的指针数组argv[]。这两个参数在main()函数头部声明的格式为: int main(int argc, char *argv[ ]) 其中,整型参数argc表示命令行中字符串的个数,指针数组argv[ ]指向命令行中的各个字符串。这两个参数可以用任何合法的标识符命名,但习惯上采用argc和argv表示。
  • 8. 调用函数 函数声明后,在其他程序中即可对其进行调用了。一般来说,C++程序都是从主函数main()开始执行,当执行到函数调用语句时,就会转去执行调用函数,执行后仍然返回到主函数,直至程序结束。当调用一个函数时,整个调用过程分为三步进行:第一步是参数传递,第二步是函数体执行,第三步是返回,即返回到函数调用表达式的位置。 一般来说,函数调用的形式为: <函数名>(<实参表>)
  • 9. 传值调用 函数参数传递机制问题,本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。前面内容提到了,函数调用的第一步就是传递参数。参数传递称为“实虚结合”,即实参向形参传递信息,使形参具有确切的含义(即具有对应的存储空间和初值)。根据参数传递的方式,函数调用可分为两种不同的方式,一种是按值传递,另一种是地址传递或引用传递。 【范例5-4】函数的传值调用。该范例定义了一个交换两个数的函数swap,在主函数main()中采用传值调用该函数,读者可查看其输出
  • 10. 引用调用 引用传递方式是在函数定义时在形参前面加上引用运算符“&”。在函数被调用时,参数传递的内容不是实参的值,而是实参的地址,即将实参的地址放到C++为形参分配的内存空间中,因此形参的任何操作都会改变相应实参的值。 【范例5-5】函数的引用调用。要实现上述示例的在主函数main()中调用交换函数swap,使得两个数之间完成交换,就可以使用引用调用来实现
  • 11. 递归调用 在函数的调用中,还有一个较为特殊的情况。比如一个函数直接或间接地调用自身,这种现象就是函数的递归调用。递归调用有两种方式:直接递归调用和间接递归调用。直接递归调用即在一个函数中调用自身,间接递归调用即在一个函数中调用了其他函数,而在该其他函数中又调用了本函数。 递归调用的执行包括两个步骤:递推和回归。利用函数的递归调用,可将一个复杂问题分解为一个相对简单且可直接求解的子问题(“递推”阶段);然后将这个子问题的结果逐层进行回代求值,最终求得原来复杂问题的解(“回归”阶段)。
  • 12. 【范例5-6】函数的递归调用 该范例求出了整数n的阶乘,其采用的就是函数的递归调用 14 void main() 15 { 16 int Fac(int n); //声明函数 17 int n; //定义整型变量n 18 cout<<"input n:"<>n; //接收键盘输入 20 cout<<"n!="<
  • 13. 变量的作用域 变量的作用域是指该变量的作用范围。 正因为变量要实现的存储功能不一样,因此其在内存块的区域也不同。在C++中,根据变量的作用域可将变量划分为局部变量和全局变量。 在一个函数内部说明的变量是内部变量,其只在该函数范围内有效。 与局部变量相对应,C++中也有全局变量的概念。全局变量又称为外部变量,其是在函数外部定义的变量。
  • 14. 函数的作用域 每个函数都构成了一个函数作用域,函数作用域的概念跟变量的存储位置和生命期有关。函数的参数和在函数中声明并定义的变量即局部变量,其被分配在堆栈上,随着函数的执行而生成,随着函数的退出而消亡。 标号是唯一具有函数作用域的标识符,goto语句使用标号。标号声明使得该标识符在一个函数内的任何位置均可以被使用。
  • 15. 函数重载 函数重载是指同一个函数名可以对应着多个函数的实现。每一类实现对应着一个函数体,这些函数的名字相同,但是函数的参数的类型不同,这就是函数重载。 例如,给同一个名为sum()的函数定义两个不同的函数体,该函数的功能是求两个操作数的和。其中,一个函数实现求两个整数之和,另一个则求两个浮点型数之和。而这两种功能都可以通过调用同一个名为的sum()函数来实现。 参数类型不同的函数重载 参数个数上不同的重载函数
  • 16. 本章主要介绍了C++中函数的相关内容,函数是程序的组成部分,鉴于其重要性,甚至可以说程序就是由一个个的函数组成的。本章详细讲解的内容主要包括函数的定义、声明和调用,这是在实际程序中使用较多的。此外,为了方便读者更好地理解函数的定义和调用原理,本章还就变量和函数的作用域做了简单的介绍。同时,由于C++是一种面向对象的程序设计语言,因此本章还详细讲解了函数的重载概念及其两种方式的函数重载。 小结
  • 17. 1.编写函数,重复打印给定字符n次。例如,在主函数中调用该函数后,给出打印字符和次数,该函数将在屏幕上输出指定字符。 2.已知三角形的三边,求三角形面积,将其编写成一个函数,在main函数中调用该函数。 3.输入的整数按字符串形式逆序输出,要求分别用递归算法和非递归算法实现。如:输入12345,输出:5 4 3 2 1。 习题
  • 18. 习题4.下列程序的输出结果是多少? #include int fun(int x,int y) { return x*y;} void main() { int k=5; cout<