《课件chapter12培训课件》由会员分享,可在线阅读,更多相关《课件chapter12培训课件(43页珍藏版)》请在金锄头文库上搜索。
1、函数,1,定义函数 2、函数原型和函数, 调用 3、函数参数和按值传递 4、函数和数组 5、函数和二维数组 6、函数和c-风格字符串 7、函数和结构,8、函数和string对象 9、递归 10、函数指针 11、使用引用参数 12、默认参数 13、c+内联函数 14、函数重载 15、函数模板,函数的定义,函数是构成程序的基本模块,每个函数完成一个计算或执行一个特定的动作, 具有相对独立的功能。 C+提供三种类型的函数: main主函数 标准库函数 用户自定义函数,格式,函数必须先定义,后使用。/与变量类似 函数定义的一般格式: () ,函数值类型说明,说明调用该函数后所得到的函数值类型,是通过函
2、数体内部的return语句提供。 return语句提供的表达式的值的类型应与函数说明中的函数值类型一致。 如果某一函数确实没有返回值,则使用说明符void。 例如:主函数 void main() 注意这时函数中不能出现有返回值的return语句。,形式参数声明,表示将从主调函数中接收哪些类型的信息 例:double grav(double m1, double m2, double distance) 形式参数可以在函数体中引用,可以输入、输出、赋值或参与运算 参数说明格式为: , 例: int array,int count,注意事项,函数类型说明可以省略,缺省是整型; 若没有返回值和参数,
3、可使用说明符void, 例如,void func(void) 形参说明方式: 现代方式: max(int x,int y) 调用函数前,必须给实参赋值,函数体,函数体本身是一个分程序,由语句和其他分程序组成。 语句分为说明语句和执行语句两类。 对某具体变量来说,应先说明,后使用。,函数间的信息交换,主函数和子函数之间的信息交换是通过参数的结合和return语句来实现的。 数据流程是: 在主程序中,先给实参赋值 通过函数调用,将数据从主函数带到子函数 形参带值后,即可进行相应的数据处理 如果有结果值,通过return语句带回到主函数,函数的调用,函数要先定义,后调用。 调用函数时要考虑到函数本身
4、的参数; 调用标准库函数时,要包含相应的头文件 输入/输出函数 iostream.h 字符串函数 string.h 常用数学函数 math.h 调用自定义函数时,要定义相应的实参,并给这些实参赋值。 实参与形参必须一一对应: “类型一致、位置一致、个数一致”,例: 求N的阶乘n!,算法分析: 计算公式为: n!= n(n-1)321,且0!=1 在子函数中只需一个数据x,故设一个参数n 计算结果要返回主函数,故设一个变量result n的阶乘可在一重循环中实现 因阶乘的结果值很大,故设结果变量为长整数,函数的调用,例:求N的阶乘n!(续),int fac(int n) int result=1
5、; if(n1) result*=n; n-; return result; ,函数的调用,例:求N的阶乘n!(续2),#include void main() int n; coutn; coutn!=fac(n)endl; ,函数的调用,函数调用和返回的过程,函数原型,函数和变量一样,在使用之前要先说明。 函数原型可省略的情况: “先定义,后引用” 函数原型的一般形式: ();,例:求两数中的大数。,#include int max(int x,int y); void main() coutab; couty?x:y; ,函数原型,函数间的参数传递,实参与形参有3种结合方式: 值调用、地
6、址调用和引用调用。 形参:在参数表中声明的参数(变量)叫做函数的形式参数。 实参:在调用函数时,一般须为每一个形参给出其实际数据,即实际参数。 值调用 实参与形参变量之间数据的传递是按照“值传递”的方式进行的,即在调用时仅将实参的值赋给形参,在函数中对形参值的任何修改都不会影响到实参的值。,值调用,好处:减少了调用函数与被调用函数之间的数据依赖,增强了函数自身的独立性。 缺点:被调用函数向调用函数传递的数据仅有一个返回值,有时显得不够用。,引用调用,由于被调用函数向调用函数传递的数据仅有一个返回值,有时显得不够用。 引用是一种特殊类型的变量,可以被认为是另一个变量的别名。 通过引用名与通过被引
7、用的变量名访问变量的效果是一样的。 引用运算符“,例:利用引用编写用于交换函数swap( )。,void swap(int ,引用调用,函数重载,在VC+的函数库中,有4个功能相似的函数: int abs(int); double fabs(double); long labs(1ong); 函数重载:若干参数和返回值不同的函数共用一个函数名。 oop技术:封装性、继承性、多态性。 多态性:一个名字,多个人口”,或称“同一接口,多种方法。,函数重载,例:重载绝对值函数 int abs(int x) return x0?x:-x; double abs(double x) return x0?x
8、:-x; 1ong abs(1ong x) return x0?x:-x; void main() int x1 = 1;double x2 = 2.5;1ong x3 = 3L; cout |x1| = abs(x1) endl; cout |x2| = abs(x2) endl; cout |x3| = abs(x3) endl;,局部变量和全局变量,根据作用域的不同,可将程序中的变量分为 局部变量和全局变量 根据生存期的不同,可将程序中的变量分为 静态变量和自动变量,局部变量是在函数或分程序中说明的变量,只能在本函数或分程序的范围内使用。 全局变量说明于所有函数之外,可以为本源程序文件中
9、位于该全局变量说明之后的所有函数共同使用。 全局变量可以在各个函数之间建立数据传输通道,但滥用会破坏程序的模块化结构。 如出现同名变量,遵循“地方保护主义”原则。,局部变量和全局变量,局部变量和全局变量,int x;/ 说明全局变量 int func1(int x)/ 函数func1()有一个名为x的参数 y = x; . . int func2(int y) / 函数func2()中说明了一个名为x的局部变量 int x; . . void main() / 在主函数中为全局变量x赋值 . . x = 0; . . ,内联函数,调用函数: 断点现场保护、数据进栈、执行函数体、保存返回值、恢复
10、现场和断点等,开销很大。 内联函数适用于: 函数体比较简单 被频繁调用,例:将例5-3中的函数max()改写成内联函数 #include inline int max(int x,int y) return xy?x:y; void main() cout a b; cout The maximum is max(a,b) endl; ,内联函数,内联函数,结果: void main() cout a b; cout b?a:b endl; ,带有缺省参数的函数,double func(double x,double y,int n=1000); 则其参数n带有缺省参数值 调用方式: a =
11、func(b,c); a = func(b,c,2000);,C+的库函数,#include #include #include #include #include #include #include ,函数模板,用来定义通用的函数,其作用类似函数重载,但其编码却要比函数重载简单得多。 利用函数模板定义的函数叫做模板函数。定义一个模板函数的形式为: template () 其中中的模板参数的形式为class ,函数模板,例:定义一个求两数最大值的模板函数 template T Max(T a, T b) return ab?a:b; void main() int i1 = 3, i2 = 5
12、; float f1 = 3.3, f2 = 5.2; cout Type int: Max(i1, i2) endl; cout Type float: Max(f1, f2) endl; ,变量的存储类别,在C+中,存储类别分为4种: 自动(auto) 静态(static) 寄存器(register) 外部(extern),自动变量和静态变量,静态变量的生存期就是整个程序的运行期。在程序开始运行前就为其分配相应的存储空间,在程序的整个运行期间一直占用,直到结束。 自动变量的生存期是说明了自动变量的函数或分程序。它对存储空间的利用是动态的。其初值在每次为自动变量分配存储后都要重新设置。,静态
13、变量的使用,例:静态变量的使用 /统计调用函数func()的次数 #include int func() static int count=0; return +count; void main() for(int i=0;i10;i+) coutfunc()endl; ,变量在存储区内分配示意图,对用户来说,在程序中定义的变量是按符号名去应用的。呈现 在用户面前的是符 号名空间。为管理 方便,不同存储类 别的变量存于不同 的区域。 静态变量区 存放全 局变量;程序开始时分配单元,结束时释放。 动态变量区 存放局部变量;只有在函数调用时才分配单元,函数结束后,自动释放。,变量的生存期与作用域,
14、Developer Studio的跟踪调试功能,Step Into(快捷键:F11):跟踪 Step Over(快捷键F10):单步执行 Step Out(快捷键:Shift+F11):从函数体内运行到外 Run To Cursor(快捷键:Ctrl+F10):从当前位置运行到编辑光标 观察窗口(Watch)用于观察指定变量或表达式的值 变量窗口(Variables)用于观察断点处或其附近的变量的当前值。 调用栈窗口(Call Stack)用于观察调用栈中还未返回的被调用函数列表。,调试技术:续,图: Developer Studio的Debug工具栏,程序举例,例1:打印100010000之
15、间的回文数。所谓回文数是指其各位数字左右对称的整数,例如12321、789987、1等都是十进制回文数。 例2:编写一个用于字符串比较的函数mystrcmp( )。,例1:,算 法: 判断一个数是否回文,可以用除以10取余的方法,从最低位开始,依次取出该数的各位数字,然后用最低位充从当最高位,按反序从新构造新的数,比较与原数是否相等,若相等,则原数是回文数。,例2,分析: 设计了一个循环,从两个字符串的第一个字符开始比较,直到出现不同的字符,或者有一个字符串已经结束为止。从程序中可以看出,这时如果两个字符串相等,则函数mystrcmp( )返回0;如果字符串s1大于字符串s2,则返回一个正数; 如果字符串s1小于字符串s2,则函数返回一个负数。,上机练习题,1.编写字符串查找mystrchr()。 2.编写字符串反转函数mystrrev()。 3.求数组中最大、最小元素的函数。 4.使用递归算法编写求斐波那契数列的第n项FEB(n)的函数。,