C高级语言程序设计第五章.ppt

上传人:wuy****n92 文档编号:70099441 上传时间:2023-01-16 格式:PPT 页数:161 大小:862KB
返回 下载 相关 举报
C高级语言程序设计第五章.ppt_第1页
第1页 / 共161页
C高级语言程序设计第五章.ppt_第2页
第2页 / 共161页
点击查看更多>>
资源描述

《C高级语言程序设计第五章.ppt》由会员分享,可在线阅读,更多相关《C高级语言程序设计第五章.ppt(161页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C+高级语言程序设计高级语言程序设计第第5 5章章 函数函数北京邮电大学信息与通信工程学院北京邮电大学信息与通信工程学院程序设计中,把具有一定功能的程序模块用函数或类来实现。2023/1/16北京邮电大学信息与通信工程学院-2-第第5 5章章 函数函数内容内容函数定义、声明、函数的调用、函数参数传递函数定义、声明、函数的调用、函数参数传递机制机制函数的特殊形式,包括递归函数、内联函数、函数的特殊形式,包括递归函数、内联函数、带默认参数值的函数带默认参数值的函数标识符的作用域和可见性标识符的作用域和可见性变量的存储类型和生存期变量的存储类型和生存期2023/1/16北京邮电大学信息与通信工程学院

2、-3-5.1 函数概述 结构化程序设计,将整个程序自顶向下分为若结构化程序设计,将整个程序自顶向下分为若干个程序模块,每个模块用来实现一个特定的干个程序模块,每个模块用来实现一个特定的功能。功能。C+C+中的模块以函数和类的形式实现。中的模块以函数和类的形式实现。函数是具有一定功能又经常使用的相对独立代函数是具有一定功能又经常使用的相对独立代码段。码段。无论是面向过程的程序设计还是面向对象的程无论是面向过程的程序设计还是面向对象的程序设计,函数都是一种实现算法的重要形式。序设计,函数都是一种实现算法的重要形式。2023/1/16北京邮电大学信息与通信工程学院-4-5.1 函数概述 函数函数n接

3、口(规定接口形式)接口(规定接口形式)w函数名(命名规则与变量相同,见名知意)函数名(命名规则与变量相同,见名知意)w函数类型(返回值类型)函数类型(返回值类型)w形式参数表形式参数表n函数体(实现算法函数体(实现算法 三种基本结构组合而成)三种基本结构组合而成)常用的函数常用的函数nC+C+的库函数的库函数n自定义的函数自定义的函数2023/1/16北京邮电大学信息与通信工程学院-5-5.1.1 自定义函数概述编程者在处理具体问题时,将程序中多处使用编程者在处理具体问题时,将程序中多处使用的、实现一定功能的特定代码段定义成函数。的、实现一定功能的特定代码段定义成函数。这样的函数称为这样的函数

4、称为自定义函数自定义函数。在同一个程序中,一个函数只能定义一次。在同一个程序中,一个函数只能定义一次。一般是通过函数调用来使用函数。一般是通过函数调用来使用函数。函数调用需要指定函数名并且提供被调用函数函数调用需要指定函数名并且提供被调用函数所需的信息(即函数参数)。所需的信息(即函数参数)。2023/1/16北京邮电大学信息与通信工程学院-6-5.1.1 自定义函数概述例如要打印某一年某一月的月历例如要打印某一年某一月的月历2023/1/16北京邮电大学信息与通信工程学院-7-5.1.2 库函数概述C+C+标准库提供了丰富的函数集合,可以进行标准库提供了丰富的函数集合,可以进行常用的常用的数

5、学计算、字符串操作、字符操作、输数学计算、字符串操作、字符操作、输入入/输出、错误检查输出、错误检查和许多其他操作。和许多其他操作。要熟悉要熟悉C+C+标准库提供的类和函数集合,不要标准库提供的类和函数集合,不要事事从头做起,要尽可能利用事事从头做起,要尽可能利用C+C+标准库提供标准库提供的函数,以便减少程序开发的时间。这是程序的函数,以便减少程序开发的时间。这是程序设计的技巧之一。设计的技巧之一。2023/1/16北京邮电大学信息与通信工程学院-8-5.1.2 库函数概述数学库函数数学库函数n实现常见的数学计算实现常见的数学计算n使用时,在程序中嵌入使用时,在程序中嵌入cmathcmath

6、头文件,按对应库头文件,按对应库函数的接口形式写调用语句。函数的接口形式写调用语句。n调用数学函数调用数学函数:函数名函数名(参数参数1,1,参数参数n)n)例如例如:double x;double x;x=sqrt(900.0);x=sqrt(900.0);coutx;coutx;n数学函数库中的多数函数都返回数学函数库中的多数函数都返回doubledouble类型结果。类型结果。2023/1/16北京邮电大学信息与通信工程学院-9-2023/1/16北京邮电大学信息与通信工程学院-10-常用数学库函数常用数学库函数函函数数说说明明举举例例ceil(x)将将x取取整整为为不不小小于于x的的最

7、最小小整数整数ceil(9.2)=10ceil(9.8)=9cos(x)x(弧度)的余弦(弧度)的余弦cos(0.0)=1.0exp(x)指数函数指数函数exexp(1.0)=2.71828exp(2.0)=7.38906fabs(x)x的绝对值的绝对值fabs(5)=5floor(x)将将x取取整整为为不不大大于于x的的最最大大整数整数floor(9.2)=9floor(9.8)=10fmod(x,y)x/y的浮点数余数的浮点数余数fmod(13.657,2.333)=1.992log(x)x的自然对数(底数为的自然对数(底数为e)log(2.718282)=1.0log(7.389056)

8、=2.0log10(x)x的对数(底数为的对数(底数为10)log(10.0)=1.0log(100.0)=2.0pow(x,y)x的的y次方(次方(xy)pow(2,7)=128pow(9,0.5)=3sin(x)x(弧度)的正弦(弧度)的正弦sin(0.0)=0sqrt(x)x的平方根的平方根sqrt(900.0)=30.0tan(x)x(弧度)的正切(弧度)的正切tan(0.0)=02023/1/16北京邮电大学信息与通信工程学院-11-#include#includeusingnamespacestd;intmain()coutabc;if(a!=0)&(b*b-4*a*c0)doub

9、leradical=sqrt(b*b-4*a*c);doubleroot1=(-b+radical)/(2*a);doubleroot2=(-b-radical)/(2*a);coutRoots:root1root2;elsecoutDoesnothavetworealroots;return0;调用函数调用函数 或主调函数或主调函数被调函数被调函数库函数库函数2023/1/16北京邮电大学信息与通信工程学院-12-#includeusingnamespacestd;floatCircleArea(floatr);intmain()/manage circle computationcoutM

10、yRadius;floatArea=CircleArea(MyRadius);coutCirclehasarea=y?x:y;returnmaxv;2023/1/16北京邮电大学信息与通信工程学院-15-float CircleArea(float r)const float Pi=3.1415;return Pi*r*r;5.2.1 5.2.1 函数的定义函数的定义 函数体函数体返回值语句返回值语句局部变局部变量定义量定义形式参数形式参数函数类型函数类型函数名函数名5.2.1 函数的定义 函数名是函数体代码段的函数名是函数体代码段的外部标识符外部标识符函数定义之后,即可通过函数名调用函数。函

11、数定义之后,即可通过函数名调用函数。例例:/Sum():compute sum of integers in a.bintSum(inta,intb)intTotal=0;for(inti=a;i=b;+i)Total+=i;returnTotal;2023/1/16北京邮电大学信息与通信工程学院-16-5.2.1 函数的定义 函数的形式参数表,简称形参表函数的形式参数表,简称形参表 形式:形式:(类型类型1 1 形式参数形式参数1 1,类型,类型n n 形式参数形式参数n)n)2023/1/16北京邮电大学信息与通信工程学院-17-/Sum():compute sum of integers

12、 in a.bintSum(inta,intb)intTotal=0;for(inti=a;i=b;+i)Total+=i;returnTotal;形式参数表示主调函数和被调函数之间需要交换的形式参数表示主调函数和被调函数之间需要交换的信息信息(1)(1)传给被调函数的待处理的数据;传给被调函数的待处理的数据;(2)(2)控制被调函数执行操作的信息;控制被调函数执行操作的信息;(3)(3)被调函数执行的结果。被调函数执行的结果。形式参数表从参数的形式参数表从参数的类型、个数、排列顺序类型、个数、排列顺序上规定上规定了主调函数和被调函数之间信息交换的形式。了主调函数和被调函数之间信息交换的形式。

13、floatfunc(intk,intb,floatx)returnk*x+b;2023/1/16北京邮电大学信息与通信工程学院-18-5.2.1 函数的定义 如果函数之间没有需要交换的信息,也可以没有形如果函数之间没有需要交换的信息,也可以没有形参,形参表内写参,形参表内写voidvoid或空着。或空着。intRead()coutResponse;returnResponse;2023/1/16北京邮电大学信息与通信工程学院-19-5.2.1 函数的定义 5.2.1 函数的定义 函数体函数体是实现函数功能的代码部分是实现函数功能的代码部分n变量声明变量声明n完成函数功能的语句两部分完成函数功能

14、的语句两部分从组成结构看,函数体是由程序的三种基本控从组成结构看,函数体是由程序的三种基本控制结构即顺序、选择、循环结构组合而成的。制结构即顺序、选择、循环结构组合而成的。2023/1/16北京邮电大学信息与通信工程学院-20-int Sum(int a,int b)int Total=0;for(int i=a;i=b;+i)Total+=i;return Total;2023/1/16北京邮电大学信息与通信工程学院-21-函数是由函数是由函数名、函数类型、形参表函数名、函数类型、形参表和函数体和函数体四部分组成的四部分组成的,使用时通过使用时通过函数名和参数表调用函数函数名和参数表调用函数

15、.例:例:编写一个函数编写一个函数cubecube,计算整数的立方。调用函数计算整数的立方。调用函数cubecube计算从计算从1 1到到1010相邻整数的立方差。相邻整数的立方差。2023/1/16北京邮电大学信息与通信工程学院-22-尽可能避免在循环体尽可能避免在循环体内调用函数内调用函数!/计算整数的立方计算整数的立方#includeusingnamespacestd;intcube(int);/函数原型声明函数原型声明voidmain()intlast,cb;last=1;coutthedifferenceofcube:endl;for(intx=2;x=10;x+)cb=cube(x

16、);coutcb-last;last=cb;coutendl;/函数定义函数定义intcube(inty)returny*y*y;2023/1/16北京邮电大学信息与通信工程学院-23-/在三个浮点中找出最大值在三个浮点中找出最大值#includeusingnamespacestd;floatmaximum(floatx,floaty,floatz);/函数原型声明函数原型声明voidmain()floata,b,c;coutabc;/调用调用maximum函数,函数,a,b,c为实际参数为实际参数coutMaximumis:maximum(a,b,c)=y?x:y;max=max=z?max

17、:z;returnmax;5.2.1 函数的定义 注意注意n如果没有函数原型声明,要先写函数定义,如果没有函数原型声明,要先写函数定义,后调用函数。后调用函数。nC+C+语言不允许函数嵌套定义语言不允许函数嵌套定义,所有函数的,所有函数的定义都是自成一体,即函数体中只包含实现定义都是自成一体,即函数体中只包含实现其自身功能的基本语句,不可包含其他函数其自身功能的基本语句,不可包含其他函数的定义体。的定义体。2023/1/16北京邮电大学信息与通信工程学院-25-5.2.2 函数原型引用函数之前,要先指定函数的接口形式引用函数之前,要先指定函数的接口形式n函数原型函数原型n函数定义函数定义函数原

18、型声明格式函数原型声明格式:函数类型函数类型 函数名函数名(形式参数表形式参数表););例例:intMax(inta,intb);函数原型声明函数原型声明使编译器获得关于函数名称、函数类使编译器获得关于函数名称、函数类型、函数形参个数、形参类型和形参顺序的信息。型、函数形参个数、形参类型和形参顺序的信息。函数调用时,编译器根据函数原型声明验证函数调函数调用时,编译器根据函数原型声明验证函数调用正确与否。用正确与否。2023/1/16北京邮电大学信息与通信工程学院-26-5.2.2 函数原型程序中,如果调用自定义的函数,且函数定义在后,程序中,如果调用自定义的函数,且函数定义在后,调用在先,则必

19、须在调用函数之前有函数原型声明。调用在先,则必须在调用函数之前有函数原型声明。voidsubfun1(intx,floata,floatb);/原型声明原型声明main()()intx=20;floata=1.0f,b=0.5f;subfun1(););/函数调用函数调用 voidsubfun1(intx,floata,floatb)/函数定义函数定义2023/1/16北京邮电大学信息与通信工程学院-27-5.2.2 函数原型如果是函数定义在先,调用在后,则不必进行函如果是函数定义在先,调用在后,则不必进行函数原型声明。因为编译器已经从函数定义得到关于数原型声明。因为编译器已经从函数定义得到关

20、于函数的信息。函数的信息。voidsubfun1(intx,floata,floatb)/函数定义函数定义main()()subfun1(i,f1,f2););/函数调用函数调用 2023/1/16北京邮电大学信息与通信工程学院-28-5.2.2 函数原型源文件中,如果在所有函数定义体之外声明函数源文件中,如果在所有函数定义体之外声明函数原型,则该函数可被位于其原型声明之后的所有原型,则该函数可被位于其原型声明之后的所有函数调用。函数调用。2023/1/16北京邮电大学信息与通信工程学院-29-voidsubfun1(););/原型声明原型声明main()()subfun1(););/函数调用

21、函数调用 voidsubfun2()()subfun1(););/函数调用函数调用 voidsubfun1()/函数定义函数定义main()()voidsubfun1();/函函数数原原型型声明声明 subfun1(););/函数调用函数调用 voidsubfun2()()subfun1(););/函数调用,函数调用,voidsubfun1()2023/1/16北京邮电大学信息与通信工程学院-30-错误,编译错误,编译器不识别器不识别sunfun1标识标识符。符。5.2.2 函数原型库函数的声明在相应库的头文件中,使用库函数时库函数的声明在相应库的头文件中,使用库函数时要包含对应的头文件。要包

22、含对应的头文件。例例:#:#include include 调用数学库函数调用数学库函数:sqrt(sqrt()sin(sin()abs(abs()2023/1/16北京邮电大学信息与通信工程学院-31-2023/1/16北京邮电大学信息与通信工程学院-32-常用常用C+标准库头文件标准库头文件cassert包含增加诊断以帮助程序调试的宏和信息包含增加诊断以帮助程序调试的宏和信息cctype 包含测试某些字符属性的函数原型和将小写字母变为包含测试某些字符属性的函数原型和将小写字母变为 大写字母、将大写字母变为小写字母的函数原型大写字母、将大写字母变为小写字母的函数原型cmath 包含数学库函数

23、的函数原型包含数学库函数的函数原型cstdio 包含标准输入包含标准输入/输出库函数的函数原型及其使用的信息输出库函数的函数原型及其使用的信息cstdlib 包含将数字变为文本、将文本变为数字、内存分配、包含将数字变为文本、将文本变为数字、内存分配、随机数和各种其他工具函数的函数原型随机数和各种其他工具函数的函数原型cstring 包含包含C语言方式的字符串处理函数原型语言方式的字符串处理函数原型ctime 包含操作时间和日期的函数原型和类型包含操作时间和日期的函数原型和类型iostream 包含标准输入包含标准输入/输出函数原型输出函数原型iomanip 包含能够格式化数据流的流操纵运算子的

24、函数原型包含能够格式化数据流的流操纵运算子的函数原型fstream 包含和磁盘文件读包含和磁盘文件读/写有关的函数原型写有关的函数原型5.2.2 函数原型例例5-2 5-2 计算计算3 3个整数绝对值的平均值。个整数绝对值的平均值。2023/1/16北京邮电大学信息与通信工程学院-33-2023/1/16北京邮电大学信息与通信工程学院-34-/例例5-2计算计算3个数绝对值的平均值个数绝对值的平均值#include#includeusingnamespacestd;intCalAbsMean(inta,intb,intc);/自定义函数的原型声明自定义函数的原型声明voidmain()inta

25、,b,c;coutabc;cout绝对值的均值为绝对值的均值为:CalAbsMean(a,b,c)endl;intCalAbsMean(inta,intb,intc)intsum=abs(a)+abs(b)+abs(c);sum/=3;returnsum;运行结果:运行结果:输入输入a,b,c:-1020-30绝对值的均值为绝对值的均值为:205.2.3 return语句returnreturn语语句句使使程程序序执执行行流流程程从从被被调调函函数数返返回回主主调调函数,有两种形式:函数,有两种形式:(1 1)不返回值的形式不返回值的形式 returnreturn;(2 2)返回值的形式返回值

26、的形式 return return 表达式;表达式;2023/1/16北京邮电大学信息与通信工程学院-35-intSum(inta,intb)intTotal=0;for(inti=a;i=b;+i)Total+=i;returnTotal;voidDisplayMessage()cout只显示确定信息的简单函数不带参数只显示确定信息的简单函数不带参数endl;return;函数返回值类型函数返回值类型规定了函数返回给主调函数的值的规定了函数返回给主调函数的值的类型,也称为类型,也称为函数类型函数类型。当被调函数只需要把一个数值结果返回给主调函当被调函数只需要把一个数值结果返回给主调函数时,使

27、用数时,使用returnreturn语句返回比较合适。语句返回比较合适。由由returnreturn语句返回的值的类型必须与函数返回值类语句返回的值的类型必须与函数返回值类型一致。型一致。若表达式的结果与函数类型不一致,不能通过编译,若表达式的结果与函数类型不一致,不能通过编译,需要作强制类型转换,将表达式的类型强制成与函需要作强制类型转换,将表达式的类型强制成与函数类型。数类型。例如,如果例如,如果meanmean是是floatfloat型,而函数是型,而函数是intint型,则型,则returnreturn语句应为:语句应为:return(int)mean;2023/1/16北京邮电大学信

28、息与通信工程学院-36-int Sum(int a,int b)int Total=0;for(int i=a;i=b;+i)Total+=i;return Total;5.2.3 return语句5.2.3 return语句注意注意如果不需要向主调函数返回值,函数可以定义如果不需要向主调函数返回值,函数可以定义成无类型的,函数类型写成成无类型的,函数类型写成voidvoid,函数结束时也函数结束时也不必用不必用returnreturn语句。语句。例例:voiddisplay()cout“noreturn”endl;2023/1/16北京邮电大学信息与通信工程学院-37-5.2.3 retur

29、n语句例例5-3 5-3 根据输入的颜色符号,显示不根据输入的颜色符号,显示不同的字符串表示的不同颜色。同的字符串表示的不同颜色。2023/1/16北京邮电大学信息与通信工程学院-38-2023/1/16北京邮电大学信息与通信工程学院-39-/例例5-3根据输入的颜色符号,显示不同的字符串表示的不同颜根据输入的颜色符号,显示不同的字符串表示的不同颜色色#includeusingnamespacestd;voidDispColor(charcolor);voidmain()charcolor;coutcolor;DispColor(color);2023/1/16北京邮电大学信息与通信工程学院-

30、40-/根据输入,显示颜色字符串根据输入,显示颜色字符串voidDispColor(charcolor)switch(color)caser:coutred.;break;caseg:coutgreen.;break;caseb:coutblue;break;default:break;return;5.2.3 return语句例例5-4 5-4 从输入文件中读入学生人数和从输入文件中读入学生人数和每人考试成绩,统计成绩的平均值。每人考试成绩,统计成绩的平均值。2023/1/16北京邮电大学信息与通信工程学院-41-2023/1/16北京邮电大学信息与通信工程学院-42-/例例5-4.从输入文

31、件中读入学生人数和每人考试成绩,统计成绩从输入文件中读入学生人数和每人考试成绩,统计成绩均值。均值。#include#includeusingnamespacestd;intCalMean(charchFileName);/函数原型声明函数原型声明voidmain()charchFileName80=;coutchFileName;/输入文件名输入文件名intmean=ChlMean(chFileName);/得到平均值得到平均值cout平均值平均值=meanendl;2023/1/16北京邮电大学信息与通信工程学院-43-/计算均值,函数定义如下计算均值,函数定义如下intCalMean(c

32、harchFileName)intcount;/数据个数数据个数intscore;/分数分数intsum(0),mean;ifstreaminfile(chFileName);if(!infile)cout!infileendl;infilecount;cout成绩个数:成绩个数:;coutcountendl;cout成绩成绩:score)/从文件读取成绩,并累计总成绩;从文件读取成绩,并累计总成绩;coutscore;sum+=score;/累积分数累积分数cout0)mean=sum/count;/计算平均值计算平均值elsemean=0;returnmean;/将平均值返回主调函数将平均

33、值返回主调函数运行结果:运行结果:成绩个数:成绩个数:10 成绩:成绩:59 39 24 36 87 98 52 67 52 60 平均值平均值=575.2.4 函数调用方式函数语句函数语句函数语句形式:函数语句形式:函数名(实参数表);函数名(实参数表);TriAreabySide(a,b,c);函数表达式函数表达式函数调用出现在表达式中,形式:函数调用出现在表达式中,形式:函数名(实际参数表)函数名(实际参数表)x=max(a,b);y=sqrt(x);x=max(a,b);y=sqrt(x);此时函数要使用此时函数要使用returnreturn语句向主调函数返回一个确定的值,参语句向主调

34、函数返回一个确定的值,参与它所在的表达式的运算。与它所在的表达式的运算。floatmax(floata,floatb)returna=b?a:b;函数参数函数参数函数参数调用方式是将函数调用写在另一次函数调用的实际函数参数调用方式是将函数调用写在另一次函数调用的实际参数位置参数位置。例如:例如:m=max(a m=max(a,max(b,c)max(b,c);2023/1/16北京邮电大学信息与通信工程学院-44-5.2.4 函数调用方式实际参数表实际参数表可简称为实参表,是按与被调函数形式可简称为实参表,是按与被调函数形式参数表一一对应的格式组织的参数表,即参数的类参数表一一对应的格式组织的

35、参数表,即参数的类型、个数和排列顺序必须与被调函数声明的形式参型、个数和排列顺序必须与被调函数声明的形式参数表严格一致。数表严格一致。实际参数表的各实际参数以逗号间隔,实际参数可实际参数表的各实际参数以逗号间隔,实际参数可以是常量、变量或表达式,变量和表达式必须具有以是常量、变量或表达式,变量和表达式必须具有确定值。确定值。如果被调函数无形式参数,则实参表也是空的。如果被调函数无形式参数,则实参表也是空的。实际编程中,从可读性考虑,一般使用变量作为实实际编程中,从可读性考虑,一般使用变量作为实际参数。际参数。2023/1/16北京邮电大学信息与通信工程学院-45-例例:计算计算y=kx+b的函

36、数的函数floatfunc(intk,intb,floatx)returnk*x+b;voidmain()intk,b;floatx,y;cinkbx;y=func(k,b,x);例:例:找最高分数找最高分数intFindMaxValue(intarray,intn)intmaxValue=array0;for(intk=1;kmaxValue)maxValue=arrayk;returnmaxValue;voidmain()intscore30,num=30;for(intk=0;kscorek;intmaxScore=FindMaxScore(score,num);coutmaxScore

37、endl;2023/1/16北京邮电大学信息与通信工程学院-46-实际参数以数据值(实际参数以数据值(值值传递传递)或实际存储空间)或实际存储空间(地址传递地址传递)提供了形式)提供了形式参数所需的内容。参数所需的内容。#includeusingnamespacestd;voidDisplayMessage();voidmain()DisplayMessage();/函数调用语句函数调用语句voidDisplayMessage()cout只显示确定信息的简单函数不带参数只显示确定信息的简单函数不带参数endl;2023/1/16北京邮电大学信息与通信工程学院-47-如果被调函数无形参,则实参表

38、也是空的。如果被调函数无形参,则实参表也是空的。5.2.4 函数调用方式5.2.4 函数调用方式例例5-5 5-5 编写程序,实现坐标旋转公式:编写程序,实现坐标旋转公式:2023/1/16北京邮电大学信息与通信工程学院-48-2023/1/16北京邮电大学信息与通信工程学院-49-/实现坐标旋转公式实现坐标旋转公式#include#includeusingnamespacestd;voidmain()constdoublePI=3.14;intx,y;/旋转后坐标旋转后坐标intx0,y0;/原始坐标原始坐标intangle;/旋转角度旋转角度/输入数据输入数据coutx0y0;coutan

39、gle;/计算旋转后的坐标计算旋转后的坐标doubletheta=angle*PI/180;x=x0*cos(theta)-y0*sin(theta);y=x0*sin(theta)+y0*cos(theta);/输出结果输出结果coutx=xendl;couty=yendl;5.3 函数调用的执行机制和参数传递方式函数调用过程是如何实现的?函数调用过程是如何实现的?n程程序序执执行行流流程程能能够够从从主主调调函函数数到到被被调调函函数数,再再由由被被调调函函数数正正确确返返回回主主调调函函数数的的断断点点继继续续执执行行,是是基于函数调用工作栈来实现的。基于函数调用工作栈来实现的。函数的参

40、数传递方式函数的参数传递方式n值传递值传递n地址传递地址传递2023/1/16北京邮电大学信息与通信工程学院-50-5.3.1 函数调用的执行机制函数调用的执行机制栈栈是函数调用正确执行的物理基础是函数调用正确执行的物理基础.栈是一种数据结构栈是一种数据结构,它的工作原理就像在子弹匣压,它的工作原理就像在子弹匣压子弹一样,最先压入的子弹要等到最后才飞射出去,子弹一样,最先压入的子弹要等到最后才飞射出去,而最后压入的子弹则首先飞射出去。而最后压入的子弹则首先飞射出去。2023/1/16北京邮电大学信息与通信工程学院-51-0040105600401057004010580040105900401

41、05A0040106BABCD栈的管理原则:栈的管理原则:先进后出先进后出或或 后进先出后进先出5.3.1 函数调用的执行机制函数调用的执行机制函数调用能够正确执行的物理基础是操作系统在内函数调用能够正确执行的物理基础是操作系统在内存中开辟了一块叫做栈的内存空间。存中开辟了一块叫做栈的内存空间。断点断点工作记录工作记录n断点地址断点地址n被调函数的形式参数被调函数的形式参数n自动局部变量自动局部变量2023/1/16北京邮电大学信息与通信工程学院-52-5.3.1 函数调用的执行机制函数调用的执行机制例例5-6 5-6 从键盘输入屏幕上两点的坐标从键盘输入屏幕上两点的坐标(x x,y y),计

42、算两点之间的距离。,计算两点之间的距离。(分析函数调用时活动记录(分析函数调用时活动记录 )2023/1/16北京邮电大学信息与通信工程学院-53-2023/1/16北京邮电大学信息与通信工程学院-54-voidmain()intx1,y1,x2,y2;/两点坐标两点坐标floatdist;/两点间距离两点间距离coutx1y1;coutx2y2;dist=CalDistance(x1,y1,x2,y2);coutdistancebetweenpoint(x1,y1)andpoint(x2,y2):distendl;栈栈mainmain函数中的函数中的自动局部变量自动局部变量 断点地址断点地址

43、仅一个工作记录仅一个工作记录活动工作记录2023/1/16北京邮电大学信息与通信工程学院-55-/计算距离计算距离floatCalDistance(intxx1,intyy1,intxx2,intyy2)intdx,dy;dx=xx2-xx1;dy=yy2-yy1;floatdist=sqrt(dx*dx+dy*dy);returndist;栈栈mainmain函数中的自函数中的自动局部变量动局部变量断点地址断点地址工作记录示意工作记录示意工作记录工作记录CalDistanceCalDistance函数函数中的自动局部变中的自动局部变量量断点地址断点地址活动工作记录活动工作记录5.3.2 函数

44、的参数传递方式函函数数之之间间的的信信息息交交换换的的一一种种重重要要形形式式是是函函数数的的参参数数传递,由函数的形式参数和实际参数实现。传递,由函数的形式参数和实际参数实现。函函数数在在没没有有被被调调用用时时,函函数数的的形形式式参参数数并并不不占占有有实实际际的的内内存存空空间间,也也没没有有实实际际的的值值。C+C+语语言言中中函函数数的的参数传递方式分为两种:参数传递方式分为两种:值传递值传递地址传递地址传递2023/1/16北京邮电大学信息与通信工程学院-56-2023/1/16北京邮电大学信息与通信工程学院-57-值传递值传递如如果果函函数数的的形形式式参参数数为为普普通通变变

45、量量,当当函函数数被被调调用用时时,系系统统为为这这些些形形式式参参数数分分配配内内存存空空间间,并并用用实实际际参参数数值值初初始始化化对对应应的的形形式式参参数数,形形式式上上实实际际参参数数的的值值传传递递给给了了形形式式参参数数。这这就就是是函函数数调调用用时时参参数的数的值传递值传递。值值传传递递方方式式,实实际际参参数数和和形形式式参参数数各各自自占占有有自自己己的的内内存存空空间间;参参数数传传递递方方向向只只能能由由实实际际参参数数到到形形式式参参数数;不不论论函函数数对对形形式式参参数数作作任任何何修修改改,对对相相应的实际参数都没有影响应的实际参数都没有影响。5.3.2 函

46、数的参数传递方式5.3.2 函数的参数传递方式例例5-7 5-7 从键盘输入两整数,交换次序从键盘输入两整数,交换次序后输出。后输出。2023/1/16北京邮电大学信息与通信工程学院-58-2023/1/16北京邮电大学信息与通信工程学院-59-/演示函数参数值传递单向性的例程演示函数参数值传递单向性的例程#includevoidswap(inta,intb);intmain()intx(5),y(10);coutx=xy=yendl;swap(x,y);coutx=xy=yendl;return0;510 xy10241028运行结果:运行结果:x=5 y=10 x=5 y=10 x=5 y

47、=10 x=5 y=102023/1/16北京邮电大学信息与通信工程学院-60-voidswap(inta,intb)intt;t=a;a=b;b=t;5a204810b2052t20565105编程技巧编程技巧:交换两个变量的值,需要引入第三交换两个变量的值,需要引入第三个变量缓存数据。个变量缓存数据。例例 如如果果一一个个数数的的所所有有真真因因子子(包包括括1 1,但但不不包包括括这这个个数数本本身身)之之和和正正好好等等于于这这个个数数本本身身,则则称称此此数数为为完完美数。例如:美数。例如:6=123 6=123,而,而 1+2+3=6 1+2+3=6;28=147=1214 28=

48、147=1214,而而 1+2+4+7+14=28 1+2+4+7+14=28。如何确定完美数,欧几里得发现,只要如何确定完美数,欧几里得发现,只要是一个素数,则是一个素数,则 一定是一个完美数。编写程序找出最小的一定是一个完美数。编写程序找出最小的5 5个完美数。个完美数。2023/1/16北京邮电大学信息与通信工程学院-61-体会函数参数的值传递体会函数参数的值传递2023/1/16北京邮电大学信息与通信工程学院-62-/寻找最小的五个完美数寻找最小的五个完美数#include#includeusingnamespacestd;boolDecidePrime(unsignedintnumb

49、er);unsignedintpower(unsignedintx,unsignedinty);voidmain()unsignedintperfect_number;unsignedintnum,temp;shortn(2);shortcounter(0);/计数器计数器2023/1/16北京邮电大学信息与通信工程学院-63-while(counter5)temp=power(2,n);num=temp-1;if(DecidePrime(num)perfect_number=temp/2*num;coutn=n,perfectnumber=perfect_numberendl;counter

50、+;n+;2023/1/16北京邮电大学信息与通信工程学院-64-/计算指数计算指数unsignedintpower(unsignedintx,unsignedinty)unsignedintmul(1);for(inti=1;i=y;i+)mul*=x;returnmul;2023/1/16北京邮电大学信息与通信工程学院-65-/判别素数判别素数boolDecidePrime(unsignedintnumber)unsignedinti,k;k=sqrt(number);for(i=2;i=k+1)/判断判断number是否被小于是否被小于number的数整除的数整除returntrue;e

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁