1、第四章第四章 函数函数第1页本章内容本章内容 函数概述函数概述 函数定义和调用函数定义和调用 函数原型函数原型 参数传递机制参数传递机制 嵌套调用和递归调用嵌套调用和递归调用 函数与指针函数与指针 函数参数缺省函数参数缺省 函数重载函数重载 函数模板函数模板 内联函数内联函数 系统函数系统函数 作用域、生存期与可见性作用域、生存期与可见性 编译预处理编译预处理 第2页4.1 函数概述函数概述例例计算计算Xm+Xn程序实现程序实现1:#include void main()long int x,xm=1,xn=1;int m,n;cinx;cinmn;int i=1;while(i=m)xm*=
2、x;i+;i=1;while(i=n)xn*=x;i+;cout“xm+xn=”xm+xnendl;第3页4.1 函数概述函数概述程序实现程序实现2:#include void main()long int x;int m,n;cinx;cinmn;cout“xm+xn=”;coutpower(x,m)+power(x,n)endl;long int power(long x,int n)long int y=1;int i=1;while(in)y*=x;i+;return y;函数作用:函数作用:1.将复杂问题分解成简单问题给予完成;将复杂问题分解成简单问题给予完成;2.多人协同工作;多人
3、协同工作;3.最大程度地利用已经有工作,防止重复劳动。最大程度地利用已经有工作,防止重复劳动。第4页1.C+1.C+函数函数函数是能完成特定功效程序段。函数是能完成特定功效程序段。2.C+2.C+源程序组成源程序组成一个一个C+C+程序是由若干个含有调用关系函数组成。每个程序是由若干个含有调用关系函数组成。每个+程程序有且只有一个函数序有且只有一个函数 main(),它是程序执行起点。其它函,它是程序执行起点。其它函数必须经过调用来执行。数必须经过调用来执行。4.1 函数概述函数概述第5页4.1 函数概述函数概述3.函数函数分类分类系统函数(库函数)系统函数(库函数)在头文件中由系统预先定义,
4、在程序中直接调用,但需在头文件中由系统预先定义,在程序中直接调用,但需包含对应头文件。包含对应头文件。自定义函数自定义函数编程人员在程序中定义和调用编程人员在程序中定义和调用第6页4.2 函数定义和调用函数定义和调用1.函数定义普通形式函数定义普通形式 类型名类型名 函数名函数名(形式参数表形式参数表)语句序列语句序列 函数头函数头函数体函数体类型名:类型名:说明函数被调用后返回值类型。假如一个函数没说明函数被调用后返回值类型。假如一个函数没 有返回值,类型名为有返回值,类型名为void,缺省为,缺省为int。函数名:函数名:函数标识名,按标示符规则命名。函数标识名,按标示符规则命名。形式参数
5、表:形式参数表:用来接收调用时传递给函数数据,形式为:用来接收调用时传递给函数数据,形式为:类型名类型名1 参数参数1,类型名,类型名2 参数参数2,.语句序列:语句序列:完成函数特定功效一组语句。完成函数特定功效一组语句。第7页nretuen语句语句功效:功效:1.结束函数执行。结束函数执行。2.将返回值带回到调用处。将返回值带回到调用处。普通形式普通形式 格式一:格式一:return 表示式;表示式;表示式值作为函数返回值表示式值作为函数返回值,当表示式类型与函数类型不一当表示式类型与函数类型不一样时样时,把表示式类型强制转换为函数类型。把表示式类型强制转换为函数类型。格式二:格式二:re
6、turn;函数没有返回值时使用,此时函数类型必须为函数没有返回值时使用,此时函数类型必须为void,假假如如return;为函数体中最终一条语句,则可省略。;为函数体中最终一条语句,则可省略。第8页long power(int x,int n)long p=1;for(int i=1;ia2)if(a1a2)return a1;return a1;elseelsereturn a2;return a2;例例2:有多个有多个return语句函数语句函数定义定义举例举例第10页/交换两个变量值交换两个变量值void swap(int x,int y)void swap(int x,int y)in
7、t temp;int temp;temp=x;temp=x;x=y;x=y;y=temp;y=temp;cout“x=“x“;cout“x=“x“;cout“y=“yendl;cout“y=“yendl;return;/return;/能够省略能够省略 例例3:无返回值函数定义举例无返回值函数定义举例第11页例例4:没有形式参数函数定义举例没有形式参数函数定义举例void print()/void print()/括号不可少括号不可少/等价形式:等价形式:void print(void)void print(void)cout“Good luck!n”;cout“Good luck!n”;第1
8、2页2.函数调用函数调用1)函数调用过程)函数调用过程在一个函数(在一个函数(主调函数主调函数)执行期间,转去执行其它函数)执行期间,转去执行其它函数(被调函数被调函数),被调函数执行完成再返回主调函数过程。),被调函数执行完成再返回主调函数过程。2)函数调用形式:函数调用形式:函数名(函数名(实参表实参表)函数名:已定义函数名函数名:已定义函数名实参表:实参表:由若干个实际参数组成,其作用是对形式参数进行由若干个实际参数组成,其作用是对形式参数进行初始化。初始化。形式为形式为:实参实参1,实参,实参2,3)函数调用使用方式:函数调用使用方式:(1)参加表示式运算)参加表示式运算(2)作为实参
9、)作为实参(3)作为单独语句)作为单独语句第13页(1 1)参加表示式运算)参加表示式运算函数调用能够作为操作数出现在表示式中。函数调用能够作为操作数出现在表示式中。此时被调用函数此时被调用函数必须有返回值,必须有返回值,函数返回值将参加表示式计算。函数返回值将参加表示式计算。例例编写计算编写计算Xm+Xn程序程序自定义函数:自定义函数:long power(int x,int n)long p=1;for(int i=1;i=n;i+)p=p*x;return p;主函数:主函数:#include void main()int x;int m,n;cinx;cinmn;cout“xm+xn=
10、”power(x,m)+power(x,n)endl;第14页(2 2)作为实参)作为实参 函函数数返返回回值值将将作作为为实实参参传传递递给给形形参参进进行行下下一一次次调调用用,此此时时被调用函数必须有返回值。被调用函数必须有返回值。例:利用例:利用power函数计算函数计算(x2)3void main()void main()int x,i;int x,i;cout coutx;cinx;long m=power(long m=power(power(x,2)power(x,2),3);,3);coutmendl;coutmendl;第15页(3 3)作为单独语句:用于不需要返回值函数调
11、用)作为单独语句:用于不需要返回值函数调用例:交换两个变量值函数例:交换两个变量值函数/主函数主函数void main()void main()intx,y;intx,y;cout cout“xy;cinxy;swap(x,y);swap(x,y);void swap(int x,int y)void swap(int x,int y)int temp;int temp;temp=x;temp=x;x=y;x=y;y=temp;y=temp;cout“x=“x“cout“x=“x“;“;cout“y=“yendl;cout“y=“yendl;第16页4.3 函数原型函数原型l函数原型函数原型只
12、给出函数头函数申明只给出函数头函数申明。何时需要函数原型说明何时需要函数原型说明 函函数数调调用用在在前前、定定义义在在后后时时需需要要;反反之之则则不需要。不需要。函数原型说明普通形式:函数原型说明普通形式:形式一:形式一:类型名类型名 函数名(函数名(形参表形参表);形式二:形式二:类型名类型名 函数名(函数名(各形参类型各形参类型);第17页#include int power(int x,int n);/或或 int power(int,int);void main()int x;int m,n;cinx;cinmn;cout“xm+xn=”power(x,m)+power(x,n)e
13、ndl;long power(int x,int n)long p=1;for(int i=1;i=n;i+)p=p*x;return p;例例编写计算编写计算Xm+Xn程序程序(需要函数原型)(需要函数原型)第18页#include long power(int x,int n)long p=1;for(int i=1;ix;cinmn;cout“xm+xn=”power(x,m)+power(x,n)endl;例例编写计算编写计算Xm+Xn程序程序(不需要函数原型)(不需要函数原型)第19页4.4 参数传递机制参数传递机制n作用作用实现函数间数据共享。实现函数间数据共享。n基本规则基本规则
14、在调用一个函数时,必须提供与形式参数在调用一个函数时,必须提供与形式参数个数相个数相同、类型一致同、类型一致实际参数,实参和形参实际参数,实参和形参按位置对应按位置对应以实现函数间数据传递。以实现函数间数据传递。n两种实现方式两种实现方式值传递(值调用)值传递(值调用)传数值调用传数值调用 传地址调用传地址调用 引用传递(引用调用)引用传递(引用调用)第20页1.传值调用特点传值调用特点函数定义时:函数定义时:形参定义为变量;实参提供数值,能够是常数、变量或表示式形参定义为变量;实参提供数值,能够是常数、变量或表示式函数被调用时函数被调用时系统为形参分配存放空间系统为形参分配存放空间实参值拷贝
15、(传递)给与之对应形参。实参值拷贝(传递)给与之对应形参。被调函数执行结束,分配给形参存放空间被释放。被调函数执行结束,分配给形参存放空间被释放。注意:注意:形参和实参都是变量时,改变形参值不影响实参原有值。形参和实参都是变量时,改变形参值不影响实参原有值。这种方式是一个单向传递,即实参将数值传给形参这种方式是一个单向传递,即实参将数值传给形参第21页#include#include void swap(int x,int y);void swap(int x,int y);void main()void main()int a(15),b(18);int a(15),b(18);cout c
16、out main()输出输出1:a=ab=bendl;a=ab=bendl;swap(swap(a,ba,b););cout cout main()输出输出2:a=ab=bendl;:a=ab=bendl;void swap(int x,int y)void swap(int x,int y)int temp;int temp;temp=x;x=y;y=temp;temp=x;x=y;y=temp;cout cout swap()输出输出:x=xy=yendl;:x=xy=yendl;例:传值调用举例例:传值调用举例输出结果:输出结果:main()输出输出1:a=15 b=18a=15 b=1
17、8swap()swap()输出:输出:x=18 y=15x=18 y=15main()输出输出2:a=15 b=18a=15 b=18第22页2.传地址调用机制传地址调用机制函函数数定定义义时时,形形参参申申明明为为指指针针或或数数组组,实实参参提提供供地地址址函函数数被被调调用用时时,为为形形参参分分配配空空间间以以存存放放实实参参提提供供地地址址注意:注意:在在被被调调用用函函数数中中改改变变形形参参值值,对对实实参参提提供供地地址址值值无无影响影响在在被被调调用用函函数数中中改改变变形形参参指指针针指指向向存存放放单单元元内内容容,实参地址对应存放单元内容同时也被改变实参地址对应存放单元
18、内容同时也被改变这种方式能够实现双向传递数据这种方式能够实现双向传递数据第23页例例1:传地址调用机制举例:传地址调用机制举例程序执行结果:程序执行结果:main()输出输出1:a=15 b=18a=15 b=18swap()swap()输出:输出:*px=18*py=15*px=18*py=15main()输出输出2:a=18 b=15a=18 b=15第24页例例2:传地址调用机制举例:传地址调用机制举例程序执行结果:程序执行结果:main()输出输出1:a=15 b=18a=15 b=18swap()swap()输出:输出:*px=18*py=15*px=18*py=15main()输出
19、输出2:a=15 b=18a=15 b=18第25页经过传地址调用向被调用函数经过传地址调用向被调用函数传递一维数组传递一维数组。数组作函数参数数组作函数参数例例1(例例4.10):编写函数将数组编写函数将数组a中数按由小到大次序重新排列中数按由小到大次序重新排列第26页#include void sort(int *a,int n);/函数原型函数原型void main()int s10=2,3,5,1,7,9,0,4,8,6;sort(s,10);/调调sort函数函数 for(int i=0;i10;i+)/输出排序后结果输出排序后结果 coutsi ;coutendl;void sor
20、t(int*a,int n)int temp;for(int i=0;in-1;i+)for(int j=i+1;jaj)temp=ai;ai=aj;aj=temp;思索:编写函数将任意大小数组思索:编写函数将任意大小数组a中数按由小到大次序重中数按由小到大次序重新排列新排列注意:注意:函数函数sort()形参形参 int*a也能够写成也能够写成int a,但不但不能写成能写成 int an。第27页 例例1 1:求二维数组中每行元素最大值及其所在列。求二维数组中每行元素最大值及其所在列。经过传地址调用向被调用函数经过传地址调用向被调用函数传递二维数组传递二维数组。程序说明:程序说明:函数函数
21、fmax()形参形参 int pNN 也能够写成也能够写成int(*p)N或或int pN(不能写成不能写成int p)。)。第29页3.函数引用调用机制函数引用调用机制形形参参定定义义为为引引用用;实实参参应应为为变变量量,而而不不能能是是常常量量或表示式或表示式函函数数被被调调用用时时,不不为为形形参参分分配配存存放放空空间间,使使用用实实参存放空间。参存放空间。注意:注意:在在被被调调用用函函数数中中改改变变形形参参值值,实实参参内内容容同同时时也也被被改变。改变。这种方式能够实现双向传递数据这种方式能够实现双向传递数据第31页例:引用调用举例例:引用调用举例#include#inclu
22、de void swap(int&x,int&y);void swap(int&x,int&y);/函数原型函数原型/等价形式:等价形式:void swap(int&,int&);void swap(int&,int&);void main()void main()int a=15,b=18;int a=15,b=18;cout“main()cout“main()输出输出1 1:a=ab=bendl;a=ab=bendl;swap(a,b);swap(a,b);cout main()cout main()输出输出2 2:a=ab=bendl;a=ab=bendl;void swap(int&x
23、,int&y)void swap(int&x,int&y)int temp;int temp;temp=x;x=y;y=temp;temp=x;x=y;y=temp;输出结果:输出结果:main()输出输出1:a=15 b=18a=15 b=18main()输出输出2:a=18 b=15a=18 b=15第32页函数参数传递机制总结函数参数传递机制总结传递机制传递机制形参形参实参实参特点特点传值调用传值调用定义为变量定义为变量同类型常量、变量、表示式数据单向传递数据单向传递传地址调用传地址调用定义为指针定义为指针与形参相匹配地址数据双向传递数据双向传递引用调用引用调用定义为引用定义为引用与形参
24、同类型变量数据双向传递数据双向传递第33页利用函数编程基本步骤利用函数编程基本步骤1.功效划分功效划分 合理确定各个函数功效合理确定各个函数功效2.函数设计函数设计函数接口设计(函数头):参数和返回值函数接口设计(函数头):参数和返回值函数体设计(函数功效实现方法)函数体设计(函数功效实现方法)3.编程实现编程实现 选择适当语句实现各个函数选择适当语句实现各个函数第34页函数应用举例函数应用举例例题:有例题:有5名学生参加一门课程考试,编写程序实名学生参加一门课程考试,编写程序实现以下功效:现以下功效:1。输入。输入5名学生学号和考试成绩。名学生学号和考试成绩。2。输出最高分学生学号和成绩。输
25、出最高分学生学号和成绩。3。将成绩按由高到低次序排列,输出排列后学号。将成绩按由高到低次序排列,输出排列后学号和成绩。和成绩。第35页问题分析:问题分析:1。功效划分。功效划分 1)主函数)主函数 数据输入数据输入 输出成绩最高学生学号及成绩输出成绩最高学生学号及成绩 输出排序结果输出排序结果 2)子函数)子函数 (1)求最高分及学号,将结果返回主函数求最高分及学号,将结果返回主函数 (2)对成绩进行排序)对成绩进行排序第36页问题分析:问题分析:2。函数设计。函数设计1)求最高分函数:)求最高分函数:接收参数:接收参数:两个一维数组:处理学号和成绩两个一维数组:处理学号和成绩 一个整型变量:
26、学生人数一个整型变量:学生人数 返回值返回值 最高分及其学号最高分及其学号 函数原型:函数原型:int MaxScore(int No,int Score,int Num,int&MaxNo);算法:算法:利用求一维数组最大值算法利用求一维数组最大值算法第37页函数应用综合举例(续):最高分函数函数应用综合举例(续):最高分函数1.int MaxScore(int No,int Score,int Num,int&MaxNo)2.3.int i,Max;4.Max=Score0;5.MaxNo=No0;6.for(i=1;iMax)8.9.Max=Scorei;10.MaxNo=Noi;11.
27、12.return Max;13.第38页问题分析:问题分析:2。函数设计。函数设计2)排序函数:)排序函数:接收参数:接收参数:两个一维数组:处理学号和成绩两个一维数组:处理学号和成绩 一个整型变量:学生人数一个整型变量:学生人数 返回值返回值 无无 函数原型:函数原型:void Sort(int No,int Score,int Num);算法:算法:利用冒泡排序算法利用冒泡排序算法第39页函数应用综合举例(续):排序函数函数应用综合举例(续):排序函数1.void Sort(int No,int Score,int Num)2.int i,j,temp;3.for(i=0;iNum;i+
28、)4.for(j=0;jNum-i-1;j+)5.if(ScorejScorej+1)6.7.temp=Scorej;8.Scorej=Scorej+1;9.Scorej+1=temp;10.temp=Noj;11.Noj=Noj+1;12.Noj+1=temp;13.14.第40页问题分析:问题分析:2。函数设计。函数设计3)主函数主函数 数据:数据:两个一维数组:存放学号和成绩两个一维数组:存放学号和成绩两个整型变量:接收最高分函数返回最高分及两个整型变量:接收最高分函数返回最高分及学号学号 算法:算法:输入输入数据数据 调用最高分函数调用最高分函数 输出最高分和学号输出最高分和学号 调用
29、排序函数调用排序函数 输出排序结果输出排序结果第41页函数应用综合举例(续):主函数函数应用综合举例(续):主函数1.#include 2.const int N=5;3.void main()4.5.int NoN,ScoreN;6.for(int i=0;iNoi Scorei;8.int ms,mn;9.ms=MaxScore(No,Score,N,mn);10.cout“最高分:最高分:”ms“学号:学号:mnendl;11.Sort(No,Score,N);12.cout“排序后成绩单:排序后成绩单:”endl;13.for(i=0;iN;i+)14.coutNoi“Scoreien
30、dl;15.第42页4.5 4.5 嵌套调用和递归调用嵌套调用和递归调用1.1.嵌套调用嵌套调用 在调用一个函数过程中又调用另一个函数。在调用一个函数过程中又调用另一个函数。C+C+不允许对函数作嵌套定义,即不能在一个函数定义中不允许对函数作嵌套定义,即不能在一个函数定义中出现另一个函数定义。出现另一个函数定义。例:例:void fa()void fb():第43页嵌套调用举例嵌套调用举例例例12:编写计算以下函数程序:编写计算以下函数程序程序中一共有四个函数:程序中一共有四个函数:Main()函数函数计算计算f(x,y)函数函数计算计算s(n)函数函数计算阶乘函数计算阶乘函数p(i)调用关系
31、:调用关系:Main()f(x,y)s(n)p(i)第44页#include long p(int i)/计算阶乘函数定义计算阶乘函数定义long k=1;for(int n=1;n=i;n+)k=k*n;return k;long s(int n)/计算阶乘和函数计算阶乘和函数 long sum=0;for(int j=1;j=n;j+)sum=sum+p(j);return sum;double f(int x1,int y1)/计算计算f(x,y)函数函数 return(double)s(x1)/(double)s(y1);void main()int x,y;coutxy;coutf(
32、x,y)=f(x,y)endl;注意:注意:1。各个函数定义先后次序。各个函数定义先后次序被调用函数在前,调用者在后。被调用函数在前,调用者在后。2。执行次序。执行次序主函数首先被执行,其它函数按主函数首先被执行,其它函数按调用次序执行。调用次序执行。第45页long p(int i)/计算阶乘函数定义计算阶乘函数定义long k=1;for(int n=1;n=i;n+)k=k*n;return k;long s(int n)/计算阶乘和函数计算阶乘和函数 long sum=0;for(int j=1;j=n;j+)sum=sum+p(j);return sum;double f(int x
33、1,int y1)/计算计算f(x,y)函数函数 return(double)s(x1)/(double)s(y1);#include long p(int i);long s(int n);double f(int x1,int y1);void main()int x,y;coutxy;coutf(x,y)=f(x,y)0 递推关系递推关系第47页递归调用举例:递归调用举例:用递归函数实现求!用递归函数实现求!#include long fact(int n)/递递归归函函数数 long h;if(n0)h=n*fact(n-1);else h=1;return h;void main()
34、int n;coutn;cout“n!=fact(n)endl;假设假设n=3,程序执行过程为:程序执行过程为:第48页递归调用练习:递归调用练习:用递归函数计算菲波纳契数列前用递归函数计算菲波纳契数列前20项项1 1 2 3 5 8 13 void main()for(int i=1;i=20;i+)coutf(i)“”;cout2 递推关系递推关系#include long f(int n)/递归函数递归函数 long h;if(n2)h=f(n-1)+f(n-2);else h=1;return h;第49页输出结果:输出结果:1 1 2 1 3 1 1 2 5 12 1 2 1 3 8
35、 1 1 2 13 3 1 1 2 5 13 思索:上例程序以下编写,输出结果对吗?思索:上例程序以下编写,输出结果对吗?#include long f(int n)/递归函数递归函数 long h;if(n2)h=f(n-1)+f(n-2);else h=1;couth;return h;void main()coutf(20)endl;第50页1.指针型函数指针型函数:函数返回值是一个地址函数。函数返回值是一个地址函数。定义形式:定义形式:类型名类型名 *函数名函数名(参数参数)例例4.15:输入:输入06数字,输出对应英文星期表示数字,输出对应英文星期表示#include/定义指针函数定
36、义指针函数char*fun(int n)static char pstr 7=sun,mon,tue,wed,thu,fri,sat;return pstrn;4.6 函数与指针函数与指针 第51页例例4.15:输入:输入06数字,输出对应英文星期表示数字,输出对应英文星期表示/主函数主函数int main()int n;coutn;if(n6)cout输入错输入错!n;else coutfun(n)endl;return 0;第52页编写指针型函数时要注意:编写指针型函数时要注意:从函数返回地址必须是有效,不能从函数返回函数中从函数返回地址必须是有效,不能从函数返回函数中定义非静态变量地址。
37、比如:定义非静态变量地址。比如:#include char*fun(int n)char pstr 7=sun,mon,tue,wed,thu,fri,sat;return pstrn;/错误错误第53页2.返回引用:返回值是一个变量引用返回引用:返回值是一个变量引用#include int&large(int&a,int&b);void main()int v1=15,v2=6;large(v1,v2)=50;coutv1=v1 v2=v2b?a:b);输出结果:输出结果:v1=50 v2=6第54页函数返回引用时要注意:函数返回引用时要注意:不要从函数返回函数执行结束时存放空间会被释放变不
38、要从函数返回函数执行结束时存放空间会被释放变量。量。例:例:int&large(int a,int b)if(ab)return a;/错误错误 else return b;/错误错误 第55页4.7 4.7 函数参数缺省函数参数缺省 在函数原型或函数定义中,可为形参指定一个值(称为在函数原型或函数定义中,可为形参指定一个值(称为 缺省值或默认值)。调用函数时若对应实参省略,则用缺省值或默认值)。调用函数时若对应实参省略,则用 缺省值对形参初始化。缺省值对形参初始化。函数参数缺省几点要求:函数参数缺省几点要求:函数参数缺省几点要求:函数参数缺省几点要求:l必须从参数表最右边开始连续为形参指定缺
39、省值,中间不必须从参数表最右边开始连续为形参指定缺省值,中间不能间断。能间断。例:例:void func(int y,int x=2,int z=10);/正确正确 void func(int x=2,int y,int z=10);/错误错误l若函数有原型申明,缺省值只需在原型申明中给出,函若函数有原型申明,缺省值只需在原型申明中给出,函数定义时参数表中不能再给出。数定义时参数表中不能再给出。第56页#include long power(int x=10,int n=2);/原型说明原型说明 void main()int k=5;coutpower(k)endl;coutpower(k,3
40、)endl;coutpower()0)p=p*x;n-;return p;例:例:函数参数缺省举例。函数参数缺省举例。第57页例:编写实现两个整数、单浮点数和双浮点数相例:编写实现两个整数、单浮点数和双浮点数相加函数。加函数。需要定义个不一样函数名函数:需要定义个不一样函数名函数:int addi(int x,int y)return x+y;float addf(float x,float y)return x+y;double addd(double x,double y)return x+y;4.8 函数重载函数重载u函数重载函数重载:两个或两个以上函数使用相同函数:两个或两个以上函数使
41、用相同函数名。但这些函数形参必须在名。但这些函数形参必须在个数或者类型个数或者类型上有所上有所不一样。不一样。第58页例例1:参数类型不一样参数类型不一样函数重载函数重载 第59页例例2:参数个数不一样参数个数不一样重载函数重载函数 第60页q将上面将上面int、float、double用一个参数来代替。用一个参数来代替。T add(T x,T y)return x+y;函函数数模模板板:用用一一个个函函数数处处理理不不一一样样类类型型参参数数和和返返回值函数。回值函数。4.9函数模板函数模板例:编写实现两个整数、单浮点数和双浮点数相加函数。例:编写实现两个整数、单浮点数和双浮点数相加函数。采
42、采取函数重载取函数重载需要定义个同名函数:需要定义个同名函数:int int addadd(int x,int y)return x+y;(int x,int y)return x+y;float float addadd(float x,float y)return x+y;(float x,float y)return x+y;double double addadd(double x,double y)return x+y;(double x,double y)return x+y;第61页定义函数模板普通形式为:定义函数模板普通形式为:template 类型类型 函数名函数名(形参表形
43、参表)函数体函数体其中:template为保留字,用于说明模板参数;为保留字,用于说明模板参数;class 也能够写成:也能够写成:typename;T 为模板参数,能够是任何正当标示符;为模板参数,能够是任何正当标示符;用到用到T行末无分号行末无分号第62页#includetemplate T add(T x,T y);void main()int i=100,j=200;float a=15.55,b=27.89;double x=6.3e10,y=8.05e12;coutInteger:add(i,j)n;coutFloat:add(a,b)n;coutDouble:add(x,y)n;
44、template T add(T x,T y)return x+y;例:例:函数模板举例函数模板举例。第63页1.1.内联函数:内联函数:函数定义或申明时函数定义或申明时在函数头前加在函数头前加 inline。4.10 内联函数内联函数2.2.使用内联函数需注意:使用内联函数需注意:l内联函数定义应先于对它调用。内联函数定义应先于对它调用。l内联函数中不应有内联函数中不应有switch语句语句、if嵌套嵌套、循环语句循环语句,它也不,它也不能是递归函数。能是递归函数。第64页4.11 系统函数系统函数1.系统函数概述系统函数概述 系统函数又称标准函数或库函数。使用时系统函数又称标准函数或库函数
45、。使用时需在程序中用需在程序中用#include命令嵌入对应头文件。命令嵌入对应头文件。几类主要系统函数头文件:几类主要系统函数头文件:string.h:字符串处理函数字符串处理函数ctype.h:字符处理函数放在头文件字符处理函数放在头文件 math.h:数学函数数学函数第65页2.2.字符字符串处理函数串处理函数惯用字符串处理函数。惯用字符串处理函数。1)求字符串长度函数)求字符串长度函数strlen()2)字符串拷贝函数)字符串拷贝函数strcpy()3 3)字符串连接函数)字符串连接函数strcat()()4)字符串比较函数)字符串比较函数strcmp()第66页1)求字符串长度函数)
46、求字符串长度函数strlen()函数原型:函数原型:int strlen(char*str);功效:功效:返回返回str所指字符串中第一个所指字符串中第一个0之前字符之前字符个数,不包个数,不包 括括0。#include#includevoid main()char s115=”Hello C+”;cout”s1:”strlen(s1)endl;char s2=”Hello0string”;cout”s2:”strlen(s2)endl;思索:思索:sizeof(s1)=?sizeof(s2)=?第67页#include#include const int N=80 void rever(ch
47、ar*s);/将字符串反序函数将字符串反序函数void main()char string N;cout输入一个字符串输入一个字符串:;cin.getline(string,N);rever(string);/调用调用rever函数函数 cout 倒序后字符串倒序后字符串:;coutstringendl;void rever(char*s)char*t;int c;for(t=s+(strlen(s)-1);st;s+,t-)c=*s;*s=*t;*t=c;例例4.39 将输入字将输入字 符串倒序并符串倒序并输输 出。出。第68页2)字符串拷贝函数)字符串拷贝函数strcpy()l函数原型:函
48、数原型:char*strcpy(char*str1,const char*str2);char*strcpy(char*str1,const char*str2);l函数功效:函数功效:将字符串将字符串str2str2复制到复制到str1str1中,函数返回中,函数返回str1str1值。值。l使用示例:使用示例:char s1=C+programming;char s220,*s3=Hello!;strcpy(s2,s1);couts2:s2endl;coutstrcpy(s1+4,s3)endl;cout s1:s1endl;char*s4=new charstrlen(s3)+1;cou
49、t“s4:strcpy(s4,s3)endl;s2:C+programmingHello!s1:C+Hello!s4:Hello!结果:结果:第69页3 3)字符串连接函数)字符串连接函数strcat()()l函数原型:函数原型:char*strcat(char*str1,char*str2);l函数功效:函数功效:将字符串将字符串str2str2连接到字符串连接到字符串str1str1后面,后面,去掉去掉str1str1后边后边00,使两个字符串成为一个字符串。,使两个字符串成为一个字符串。函数返回函数返回str1str1值。值。l示例示例 char s120=Hello;char s2=e
50、verybody;strcat(s1,s2);couts1:s1endl;输出结果:输出结果:s1:Hello everybody第70页4)字符串比较函数)字符串比较函数strcmp()函数原型:函数原型:int strcmp(const char*str1,const char*str2);int strcmp(const char*str1,const char*str2);函数功效:函数功效:比较两个字符串(按位置比较对应字符比较两个字符串(按位置比较对应字符ASCIIASCII码值),函数返回值:码值),函数返回值:若若str1str1和和str2str2相等,函数返回值为相等,函数