第6章 过程封装--函数.ppt
《第6章 过程封装--函数.ppt》由会员分享,可在线阅读,更多相关《第6章 过程封装--函数.ppt(136页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、程序设计 cs.sjtu 2011.9程序设计-1第第6章章 过程封装函数过程封装函数v函数函数v自己自己编写函数写函数v函数的使用函数的使用v数数组作作为参数参数v带默默认值的函数的函数v内内联函数函数v重载函数重载函数v函数模版函数模版v变量的作用域变量的作用域v变量的存储类别变量的存储类别v递归函数递归函数v基于递归的算法基于递归的算法程序设计 cs.sjtu 2011.9程序设计-2函数的用途函数的用途v函数是程序函数是程序设计语言中最重要的部分,是模言中最重要的部分,是模块化化设计的主要工具。每一个的主要工具。每一个C+程序都要用到程序都要用到函数。函数。v即使你自己不定即使你自己不
2、定义新的函数新的函数,在每一个完整的在每一个完整的C+程序中都必程序中都必须有一个有一个main()函数。函数。v在在C+语言中,字符言中,字符处理、字符串理、字符串处理和数学理和数学计算都是用函数的方式提供的。算都是用函数的方式提供的。程序设计 cs.sjtu 2011.9程序设计-3第第6章章 过程封装函数过程封装函数v函数函数v自己自己编写函数写函数v函数的使用函数的使用v数数组作作为参数参数v带默默认值的函数的函数v内内联函数函数v重载函数重载函数v函数模版函数模版v变量的作用域变量的作用域v变量的存储类别变量的存储类别v递归函数递归函数v基于递归的算法基于递归的算法程序设计 cs.s
3、jtu 2011.9程序设计-4如何写一个函数如何写一个函数v函数定函数定义v函数的返回函数的返回值:返回:返回值类型型应与定与定义中的中的类型型标识符符一致。一致。C+的函数只能有一个返回的函数只能有一个返回值。v表示一个函数没有返回表示一个函数没有返回值,类型型标识符用符用void。没有。没有返回返回值的函数也称的函数也称为过程程类型标识符类型标识符函数名(形式参数表)函数名(形式参数表)变量定义部分变量定义部分语句部分语句部分return返回值;返回值;或或return(返回值);(返回值);eg.intmax(inta,intb)if(ab)return(a)elsereturn(b)
4、;函数体函数体程序设计 cs.sjtu 2011.9程序设计-5函数的命名函数的命名v函数名是一个函数名是一个标识符,符合符,符合标识符命名符命名规范范v函数名要有意函数名要有意义v函数名一般是一个函数名一般是一个动词短短语,表示函数,表示函数的行的行为程序设计 cs.sjtu 2011.9程序设计-6函数举例函数举例无参数、无返回值的函数无参数、无返回值的函数 v打印一个由五行打印一个由五行组成的三角形成的三角形*voidprintstar()cout“*n”;cout“*n”;cout“*n”;cout“*n”;cout“*n”;程序设计 cs.sjtu 2011.9程序设计-7函数举例函
5、数举例有参数、无返回值的函数有参数、无返回值的函数v打印一个由打印一个由n行行组成的三角形成的三角形void printstar(int numOfLine)int i,j;for(i=1;i=numOfLine;+i)cout endl;for(j=1;j=numOfLine-i;+j)cout ;for(j=1;j=2*i-1;+j)cout num;if(num=1&num=10)returnnum;程序设计 cs.sjtu 2011.9程序设计-9函数举例函数举例有参数、有返回值的函数有参数、有返回值的函数 v计算算n!intp(intn)ints=1,i;if(n0)return(0
6、);for(i=1;i=n;+i)s*=i;return(s);程序设计 cs.sjtu 2011.9程序设计-10函数举例函数举例返回布尔量的函数返回布尔量的函数v判断某一年是否判断某一年是否为润年的函数年的函数bool IsLeapYear(int year)bool leapyear;leapyear=(year%4=0)&(year%100!=0)|(year%400=0);return(leapyear);程序设计 cs.sjtu 2011.9程序设计-11第第6章章 过程封装函数过程封装函数v函数函数v自己自己编写函数写函数v函数的使用函数的使用v数数组作作为参数参数v带默默认值的
7、函数的函数v内内联函数函数v重载函数重载函数v函数模版函数模版v变量的作用域变量的作用域v变量的存储类别变量的存储类别v递归函数递归函数v基于递归的算法基于递归的算法程序设计 cs.sjtu 2011.9程序设计-12函数的声明函数的声明v所有函数在使用前必所有函数在使用前必须被声明,以便被声明,以便让编译器知道器知道用用户的用法是否正确。的用法是否正确。v函数声明包括下列内容:函数声明包括下列内容:函数名函数名函数的参数函数的参数类型型函数的返回函数的返回类型型v函数的声明被称函数的声明被称为函数的原型,它的形式函数的原型,它的形式为:返回返回类型型函数名(参数表);函数名(参数表);参数表
8、中的每个参数参数表中的每个参数说明可以是明可以是类型,也可以是型,也可以是类型后面再接一个参数名。如:型后面再接一个参数名。如:intmax(int,int);intmax(inta,intb);程序设计 cs.sjtu 2011.9程序设计-13函数说明规则函数说明规则v库函数在函数在调用前需要用前需要include相相应的的头文件。文件。v自定自定义的函数在的函数在调用用时需要需要进行函数原型行函数原型说明。明。v函数原型函数原型说明与函数首部写法上需要保持一致,明与函数首部写法上需要保持一致,即函数即函数类型、函数名、参数个数和参数型、函数名、参数个数和参数顺序必序必须相同。相同。v如果
9、被如果被调函数的定函数的定义在主在主调函数之前,可以不函数之前,可以不必加声明。必加声明。v如果在所有函数定如果在所有函数定义之前,在函数外部已之前,在函数外部已经做做了函数声明,了函数声明,则在主在主调函数中无函数中无须再作声明。再作声明。程序设计 cs.sjtu 2011.9程序设计-14函数调用函数调用#includeintmax(inta,intb);main()intx,y;cinxy;coutb)return(a);elsereturn(b);函数原型说明函数原型说明函数调用函数调用函数实现函数实现程序设计 cs.sjtu 2011.9程序设计-15函数调用函数调用#include
10、intmax(inta,intb)if(ab)return(a);elsereturn(b);main()intx,y;cinxy;cout x y;cout max(x,y);int p(int n)int s=1,i;if(n 0)return(0);for(i=1;in2?n1:n2);mainx(2)y(3)mainx(2)y(3)maxa(2)b(3)n1n2mainx(2)y(3)maxa(2)b(3)n1n2pn(2)simainx(2)y(3)maxa(2)b(3)n1(2)n2pn(3)simainx(2)y(3)maxa(2)b(3)n1(2)n2(6)mainx(2)y(
11、3)程序设计 cs.sjtu 2011.9程序设计-20第第6章章 过程封装函数过程封装函数v函数函数v自己自己编写函数写函数v函数的使用函数的使用v数数组作作为参数参数v带默默认值的函数的函数v内内联函数函数v重载函数重载函数v函数模板函数模板v变量的作用域变量的作用域v变量的存储类别变量的存储类别v递归函数递归函数v基于递归的算法基于递归的算法程序设计 cs.sjtu 2011.9程序设计-21数组作为函数的参数数组作为函数的参数v设计一函数,一函数,统计10位同学的平均成位同学的平均成绩v设计考考虑:如何:如何传递参数参数参数是参数是10位同学的考位同学的考试成成绩,可以用,可以用10个
12、整型数个整型数来表示。所以有来表示。所以有10个整型的形式参数个整型的形式参数一一组同同类数据可以用一个数数据可以用一个数组来描述,所以参数来描述,所以参数也可以是一个也可以是一个10个元素的整型数个元素的整型数组第二种方法更加第二种方法更加简练返回返回值是平均成是平均成绩程序设计 cs.sjtu 2011.9程序设计-22统计函数的实现统计函数的实现intaverage(intarray10)inti,sum=0;for(i=0;i10;+i)sum+=arrayi;returnsum/10;程序设计 cs.sjtu 2011.9程序设计-23average函数的使用函数的使用intmain
13、()inti,score10;cout请输入入10个成个成绩:endl;for(i=0;iscorei;cout平均成平均成绩是:是:average(score)endl;return0;注意:形式参数是注意:形式参数是数组,实际参数也数组,实际参数也是一个数组是一个数组程序设计 cs.sjtu 2011.9程序设计-24一个有趣的现象一个有趣的现象 v在函数在函数average的的return语句前增加一个句前增加一个对array3赋值的的语句,如句,如array3=90。v在在main函数的函数的average函数函数调用后,即用后,即return语句前增加一个句前增加一个输出出score
14、3的的语句句v结果是什么?果是什么?v你会你会发现输出的出的值90而不是而不是80。程序设计 cs.sjtu 2011.9程序设计-25数组参数的传递机制数组参数的传递机制vC+语言言规定,数定,数组名是数名是数组的起始地址的起始地址v参数参数传递时,实际参数是数参数是数组名,形式参数也是数名,形式参数也是数组名名v按照按照值传递,当用,当用实际参数参数score调用函数用函数average时,是用,是用score初始化形式参数数初始化形式参数数组array。如。如score的首地址的首地址为1000,在函数中形参数,在函数中形参数组array的的首地址也首地址也为1000。v形式参数和形式参
15、数和实际参数是同一数参数是同一数组!程序设计 cs.sjtu 2011.9程序设计-26数组作为函数的参数数组作为函数的参数v在函数中并没有定在函数中并没有定义新的数新的数组v对形式参数数形式参数数组指定指定规模是没有意模是没有意义的的v形式参数数形式参数数组不需要指定大小,所以方括号中不需要指定大小,所以方括号中为空空v函数如何知道数函数如何知道数组的的规模?用另一个整型参数模?用另一个整型参数表示表示v总结:数:数组传递需要两个参数,数需要两个参数,数组名和数名和数组规模模程序设计 cs.sjtu 2011.9程序设计-27第第6章章 过程封装函数过程封装函数v函数函数v自己自己编写函数写
16、函数v函数的使用函数的使用v数数组作作为参数参数v带默默认值的函数的函数v内内联函数函数v重载函数重载函数v函数模版函数模版v变量的作用域变量的作用域v变量的存储类别变量的存储类别v递归函数递归函数v基于递归的算法基于递归的算法程序设计 cs.sjtu 2011.9程序设计-28默认参数默认参数v对于某些函数,程序往往会用一些固定的于某些函数,程序往往会用一些固定的值去去调用它用它.例例如如对于以某种数制于以某种数制输出整型数的函数出整型数的函数print:voidprint(intvalue,intbase);在大多数情况下都是以十在大多数情况下都是以十进制制输出,因此出,因此base的的值
17、总是是为10。vC+在定在定义或声明函数或声明函数时可以可以为函数的某个参数指定默函数的某个参数指定默认值。当。当调用函数用函数时没有没有为它指定它指定实际参数参数时,系,系统自自动将默将默认值赋给形式参数。例如,可以将形式参数。例如,可以将print函数声明函数声明为voidprint(intvalue,intbase=10);调用用print(20)等价于等价于print(20,10)程序设计 cs.sjtu 2011.9程序设计-29带有默认参数的函数的使用带有默认参数的函数的使用 C+C+在在说明函数原型明函数原型时,可以,可以为一个或多个参一个或多个参数指定缺省数指定缺省值。调用此函
18、数用此函数时,若缺省某一参,若缺省某一参数,数,C+C+自自动以缺省以缺省值作作为此参数的此参数的值。如:。如:int special(int x=2,float y=1.5)int special(int x=2,float y=1.5)调用用时可用:可用:special(5,3.2)/x=5;y=3.2special(5,3.2)/x=5;y=3.2 special(6)/x=6;y=1.5 special(6)/x=6;y=1.5 special()/x=2;y=1.5 special()/x=2;y=1.5程序设计 cs.sjtu 2011.9程序设计-30带有默认参数的函数带有默认参
19、数的函数注意事项注意事项v缺省参数无缺省参数无论有几个,都必有几个,都必须放在参数序列放在参数序列的最后,的最后,例如:例如:Int SaveName(char*first,char Int SaveName(char*first,char second=second=“”,char*third=,char*third=“”,char,char*fouth=*fouth=“”););v在函数在函数调用用时,若某个参数省略,若某个参数省略,则其后的其后的参数皆参数皆应省略而取其缺省省略而取其缺省值程序设计 cs.sjtu 2011.9程序设计-31带有默认参数的函数带有默认参数的函数注意事项注意
20、事项v对参数默参数默认值的指定只有在函数声明的指定只有在函数声明处有意有意义。因因为函数的默函数的默认值是提供是提供给调用者使用的。用者使用的。v在不同的源文件中,可以在不同的源文件中,可以对函数的参数指定不同函数的参数指定不同的默的默认值。例如。例如对于上面的于上面的print函数,如果在某函数,如果在某一个功能模一个功能模块中中输出的大多是十出的大多是十进制数,那么在制数,那么在此功能此功能对应的源文件中可以指定的源文件中可以指定base的默的默认值为10。如果在另一个功能最模。如果在另一个功能最模块中中经常要以二常要以二进制制输出,那么在此功能模出,那么在此功能模块对应的源文件中可以指的
21、源文件中可以指定默定默认值是是2。程序设计 cs.sjtu 2011.9程序设计-32第第6章章 过程封装函数过程封装函数v函数函数v自己自己编写函数写函数v函数的使用函数的使用v数数组作作为参数参数v带默默认值的函数的函数v内内联函数函数v重载函数重载函数v函数模版函数模版v变量的作用域变量的作用域v变量的存储类别变量的存储类别v递归函数递归函数v基于递归的算法基于递归的算法程序设计 cs.sjtu 2011.9程序设计-33内联函数内联函数v目的是目的是为了提高了提高执行效率。行效率。v对于任何内于任何内联函数,函数,编译器在符号表里放入函器在符号表里放入函数的声明(包括名字、参数数的声明
22、(包括名字、参数类型、返回型、返回值类型)型)。如果。如果编译器没有器没有发现内内联函数存在函数存在错误,那,那么么该函数的代函数的代码也被放入符号表里。在也被放入符号表里。在调用内用内联函数函数时,编译器直接用内器直接用内联函数的代函数的代码替替换函数函数调用,于是省去了函数用,于是省去了函数调用的开用的开销。程序设计 cs.sjtu 2011.9程序设计-34内联函数内联函数v内内联函数的定函数的定义:在函数:在函数头部前加保留部前加保留词inline#includeinlinefloatcube(floats)returns*s*s;intmain()floatside;cinside;
23、coutcube(side)endls;return0;程序设计 cs.sjtu 2011.9程序设计-35慎用内联函数慎用内联函数v内内联以代以代码复制复制(膨膨胀)为代价,省去了函数代价,省去了函数调用的开用的开销,提高函数的,提高函数的执行效率。如果相比行效率。如果相比于于执行函数体内代行函数体内代码的的时间,函数,函数调用的开用的开销可以忽略不可以忽略不计,那么效率的收,那么效率的收获会很小。会很小。v以下情况不宜用内以下情况不宜用内联:如果函数体内的代如果函数体内的代码比比较长,使用内,使用内联将将导致致内存消耗代价内存消耗代价较高。高。如果函数体内出如果函数体内出现循循环,那么,那
24、么执行函数体内代行函数体内代码的的时间要比函数要比函数调用的开用的开销大。大。程序设计 cs.sjtu 2011.9程序设计-36第第6章章 过程封装函数过程封装函数v函数函数v自己自己编写函数写函数v函数的使用函数的使用v数数组作作为参数参数v带默默认值的函数的函数v内内联函数函数v重载函数重载函数v函数模版函数模版v变量的作用域变量的作用域v变量的存储类别变量的存储类别v递归函数递归函数v基于递归的算法基于递归的算法程序设计 cs.sjtu 2011.9程序设计-37重载函数重载函数v在在传统的的C语言中,不允言中,不允许出出现同名函数。当要同名函数。当要求写一求写一组功能功能类似、参数似
25、、参数类型或参数个数不同型或参数个数不同的函数的函数时,必,必须给它它们取不同的函数名取不同的函数名v例如某个程序要求找出一例如某个程序要求找出一组数据中的最大数据中的最大值,这组数据最多有数据最多有5个数据。我个数据。我们必必须写四个函数:写四个函数:求两个求两个值中的最大中的最大值、求三个、求三个值中的最大中的最大值、求四个求四个值中的最大中的最大值和求五个和求五个值中的最大中的最大值。我我们必必须为这四个函数取四个不同的函数名,四个函数取四个不同的函数名,例如:例如:max2,max3,max4和和max5。程序设计 cs.sjtu 2011.9程序设计-38函数重载函数重载v使参数个数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 过程封装-函数 过程 封装 函数
限制150内