算法与数据结构:lecture 2 函数_第1页
算法与数据结构:lecture 2 函数_第2页
算法与数据结构:lecture 2 函数_第3页
算法与数据结构:lecture 2 函数_第4页
算法与数据结构:lecture 2 函数_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、函 数#include using namespace std;void printstar(void) for(int i=0; i30; i+) cout*;coutendl;void print_message(void) cout Welcome to C+!endl;int main( )printstar( );print_message( );printstar( );return 0;P89 例4.1定义函数的一般形式无参函数类型标识符 函数名(void) 声明部分 语句 有参函数类型标识符 函数名(形式参数表) 声明部分 语句 形式参数和实际参数形式参数:在定义函数时函数名后

2、面括号中的变量名称只有在发生函数调用时,形参才被分配内存单元,以便接收从实参传来的数据。调用结束后,形参所占的内存单元将被释放。实际参数:在主调函数中调用一个函数时,函数名后面括号中的参数(可以是一个表达式)实参与形参的类型应相同或赋值兼容。实参对形参的数据传递是“值传递”#include using namespace std;int max(int x,int y) int z;z=xy?x:y;return(z);int main( )int a,b,c;coutab;c = max(a,b);coutmax=cendl;return 0;P91 例4.2(1)如果在max函数中改变x和

3、y的值,main中的a和b会不会相应改变?(2)如何输出较小的数?函数的调用函数调用的一般格式:函数名(实参表列)对实参的求值顺序并不是确定的,通常是按自右至左的顺序求值的。函数调用的方式函数语句函数表达式函数参数函数的调用(2)一个函数中调用另一个函数需要具备的条件被调函数必须已经存在(库函数或自定义的函数)使用库函数时,应该在本文件开头用#include命令将有关头文件“包含”进来。使用自定义函数时,如果该函数与主调函数在同一个程序单位中,且位置在主调函数之后,则必须在调用此函数前对其作声明函数声明:在函数尚未定义的情况下,事先将该函数的有关信息通知编译系统,使编译能正常进行。函数的定义和

4、声明不是同一回事。#include using namespace std;int main( )float add(float x, float y);float a,b,c;coutplease enter a,b:ab;c=add(a,b);coutsum=cendl;return 0;float add(float x, float y)return x+y;P95 例4.3(1)add的声明语句还可以放在哪里?(2)怎么做就可以去掉add的声明语句?(3)如果求两数的差,怎么改?内置函数在编译时,将函数的代码直接嵌入到主调函数中在内置函数首行的左端加上inline可以在声明函数和定义

5、函数时,同时写上inline;也可以只在其中一处声明inline,只要在调用前将inline的信息告知编译系统即可使用内置函数可以节省运行时间,但却增加了目标程序的长度inline声明只是建议性的,而不是指令性的规模较小而又被频繁调用的简单函数,才适合于声明为inline函数#include using namespace std;inline int max(int, int, int);int main( )int i=10, j=20, k=30;coutmax=max(i,j,k)a) a=b;if(ca) a=c;return a;P103 例4.7函数的重载C+允许用同一函数名定义

6、多个函数,这些函数的参数个数或类型应该有所不同。C语言要求每个函数有唯一的名字,但有时,这会令人生厌: int abs(int); long labs(long); double fabs(double).调用时,系统根据实参的类型和个数找到与之匹配的函数,然后调用该函数。匹配时,不考虑返回值的类型匹配重载函数的顺序:寻找一个严格的匹配通过内部转换寻求一个匹配通过用户定义的转换寻求一个匹配#include using namespace std;int main( ) int max(int, int , int);int max(int, int);int a=8, b= -12, c=27

7、;coutmax(a,b,c)=max(a,b,c)endl;coutmax(a,b)=max(a,b)b)return a; elsereturn b;int max(int a, int b, int c)return max(a, max(b,c);P106 例4.9max(19.5,17.3,26.4) max(a,A)#include using namespace std;void print(double x)couta double, value=xendl;void print(int x) coutan integer, value=xendl;void print(cha

8、r x) couta char, value=xendl;int main( )print(37.0);print(95);print(a);return 0;(1)如果删去了print(int)函数定义,会出现什么情况?(2)如果删去了print(char)函数定义,会出现什么情况?函数模板一种通用函数,不具体指定函数类型和形参类型,而用一个虚拟的类型来代表。函数体相同的函数均可用一个模板来定义。在函数调用时,系统将根据实参的类型来取代模板中的虚拟类型,从而实现不同的函数功能。定义函数模板的一般形式: template 通用函数定义 template 通用函数定义#include #incl

9、udeusing namespace std;template void print(T a)couttypeid(a).name( ) aendl;int main( )print(97.5);print(36);print(a);return 0;#include using namespace std;template T max(T a, T b, T c) if(ba) a=b;if(ca) a=c;return a;int main( ) int i1=185, i2=-76, i3=567, i;double d1=56.87, d2=90.23, d3=-3214.78, d;

10、long g1=67854, g2=-912456, g3=673456, g;i = max(i1,i2,i3);d = max(d1,d2, d3);g = max(g1,g2, g3);coutitdtgendl;return 0;P107 例4.10template T max(T a, T b, T c)if(ba) a=b;if(ca) a=c;return a;template T max(T a, T b)return ab?a:b;template T max(T a, T b, T c) return max(a, max(b,c);有默认参数的函数可以给形参一个默认值,这

11、样形参就不一定要从实参取值了。由于实参与形参的结合是从左至右进行的,因此指定默认值的参数必须放在形参列表中的右端。在函数调用前,应当将默认值信息提供给编译系统如果函数定义在调用之前,则应在定义中给出默认值。如果定义在调用之后,则在函数声明中给出默认值,此时函数定义时可不给出默认值(即使给出,也会被忽略)慎重给重载函数的参数设置默认值。当出现二义性时,编译会出错。#include using namespace std;int sum(int a)return a; int sum(int a, int b, int c=19)return a+b+c; int main()int a=17,

12、b=10, c=22;int m, n, d;m=sum(a);n=sum(a,b);d=sum(a,b,c);coutm=mt n=nt d=dendl;return 0;能不能再定义一个函数sum(int, int)?P109 例4.11函数的嵌套调用C+不允许对函数作嵌套定义一个函数中不能完整地包含另一个函数每一个函数的定义都是互相平行和独立的C+允许嵌套调用函数在调用一个函数的过程中,又调用另一个函数逆归调用:一个函数直接或间接地调用本身包括逆归调用的函数称为逆归函数P102 例4.6#include using namespace std;long fac(int);int main

13、( ) int n;long y;coutn;y = fac(n);coutn!=yendl;return 0;long fac(int n) if(n0) coutn0, data error!n; return -1; if(n=0)return 1; else return n*fac(n-1);P127 练习9#include using namespace std;void hanoi(int *a, int count, char TA, char TB, char TC);int main( )const int N=64;int aN;for(int i=0; iN; i+)

14、ai = i+1;hanoi(a, N, A, B, C);return 0;void hanoi(int *a, int count, char TA, char TB, char TC) if(count =0) return;hanoi(a, count-1, TA, TC, TB);coutMove acount-1 from TA to TCendl;hanoi(a, count-1, TB, TA, TC);变量的存储类别静态存储方式:在程序运行期间,系统对变量分配固定的存储空间全局变量存放在静态存储区中动态存储方式:在程序运行期间,系统对变量动态地分配空间函数形式参数函数中的自动

15、变量函数调用时的现场保护和返回地址变量的存储类别(2)自动变量:用关键字auto声明的存储类别,动态地分配存储空间。默认存储类别,auto可省略。静态局部变量:用关键字static声明的存储类别,静态地分配存储空间。当函数调用结束时,不释放存储单元,因此在下次函数调用时,保留上次调用结束时的值。寄存器变量:用关键字register声明的存储类别。外部变量:用关键字extern声明的存储类别,用来扩展全局变量的作用域。P115 例4.12#include using namespace std;int f(int);int main()int a=2, i;for(i=0; i3; i+)coutf(a) ;coutendl;return 0;int f(int a)int b=0;static int c=3;return a+(+b)+(+c);将int b=0;改为static int b=0;输出是什么?P118 例4.14#include using namespace std;int max(int, int);int main()extern int a,b;coutmax(a,b)y?x:y;预处理命令预处理命令不是C+语言本身的组成部分,不能直接对它们进行编译,应在编译前,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论