C++程序设计语言 第1-8章 教学课件 ppt 作者 揣锦华_ 第2章 函数

上传人:E**** 文档编号:89372302 上传时间:2019-05-24 格式:PPT 页数:97 大小:497.50KB
返回 下载 相关 举报
C++程序设计语言 第1-8章 教学课件 ppt 作者 揣锦华_ 第2章   函数_第1页
第1页 / 共97页
C++程序设计语言 第1-8章 教学课件 ppt 作者 揣锦华_ 第2章   函数_第2页
第2页 / 共97页
C++程序设计语言 第1-8章 教学课件 ppt 作者 揣锦华_ 第2章   函数_第3页
第3页 / 共97页
C++程序设计语言 第1-8章 教学课件 ppt 作者 揣锦华_ 第2章   函数_第4页
第4页 / 共97页
C++程序设计语言 第1-8章 教学课件 ppt 作者 揣锦华_ 第2章   函数_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《C++程序设计语言 第1-8章 教学课件 ppt 作者 揣锦华_ 第2章 函数》由会员分享,可在线阅读,更多相关《C++程序设计语言 第1-8章 教学课件 ppt 作者 揣锦华_ 第2章 函数(97页珍藏版)》请在金锄头文库上搜索。

1、第2章 函 数,2.1 函数的定义与使用 2.2 函数调用机制 2.3 递归函数 2.4 默认参数的函数 2.5 内联函数 2.6 函数重载 2.7 函数模板 2.8 使用C+系统函数,2.1 函数的定义与使用,在编辑一个大型程序时,即使各个函数的前后顺序不同,程序执行的开始点永远是主函数。主函数按照调用与被调用关系调用子函数。子函数如果与其它子函数又存在调用与被调用关系,当然还可以再调用其它子函数。,在一对调用与被调用关系中,我们把调用其它函数的函数称为主调函数,被其它函数调用的函数称为被调函数。在一个较为复杂的大型程序中,一个函数很可能同时扮演两种不同的角色主调函数与被调函数,即既调用别的

2、函数(被调函数)又被另外的函数(主调函数)调用。函数一般应遵守先定义后调用的原则,否则应在调用函数中先进行原形说明。,2.1.1 函数的定义 一个完整的函数定义由两部分组成,即函数头与函数体。 1. 函数定义的一般语法形式 (形式参数表) 说明性语句序列; 实现函数功能的语句系列; ,函数头是指上述格式中的 (形式参数表)。其中函数名可由函数设计者命名,可以是任何一个不重复的合法的标识符(唯一的例外是,主函数必须命名为main)。 函数体是指上述格式中被一对大括号括起的复合语句部分。该函数所应实现的功能由相应的复合语句完成。,2. 函数的类型和返回值 函数头部分的类型标识符规定了函数的返回值类

3、型。函数的返回值是返回给主调函数的处理结果,由函数体部分的return语句带回。例如,return value1。 无返回值的函数其类型标识符为void,不必有return语句。,3. 形式参数 函数头部分的形式参数(简称形参)表的内容如下:类型l 形参名1,类型2 形参名2,.,类型n 形参名n其中类型1、类型2、.、类型n是类型标识符,表示形参的数据类型(int、double、float、char、bool等);形参名1、形参名2、.、形参名n是形参名(合法的自定义标识符)。形参是用来实现主调函数与被调函数之间的数据联系,通常将函数所处理的数据、影响函数功能的因素或者函数处理的结果作为形参

4、。对于无形参的函数,其形参表的内容应该为空,但代表函数的小括号对不能省略。,函数在没有被调用的时候其形参只是一个符号,它标志着在形参出现的位置应该有一个什么类型的数据。函数在被调用时才由主调函数将实际参数(简称实参)赋予形参。从这一点上说,C+中的函数与数学中的函数概念极其相似。例如,我们都熟悉的如下数学中的函数形式: f(x)=3x2+5x-2 这个函数只有当自变量x被赋以确定的值以后,才能计算出函数的值。,2.1.2 函数的调用 如果没有遵守先定义后调用的原则,调用函数之前先要在主调函数中声明函数原型。在主调函数中,或所有函数之前,按如下形式进行函数原型声明: (含类型说明的形参表);,如

5、果是在所有函数之前声明了函数原型,那么该函数原型在本程序文件中任何地方都有效,也就是说,在本程序文件中任何地方都可以依照该原型调用相应的函数。如果是在某个主调函数内部声明了被调函数原型,那么该原型就只能在这个函数内部有效。 声明了函数原型之后,便可以按如下形式调用子函数: (实参1,实参2,实参n),实参列表中应给出与函数原型中形参个数相同、类型相符的实参,每个实参都可以是常量、变量或表达式三者之一。实参与实参之间用逗号作为分隔符。注意,这里的逗号不是顺序求值运算符。函数调用可以作为一条语句,这时函数可以没有返回值。函数调用也可以出现在表达式中,这时就必须有一个明确的返回值。函数调用示例如下。

6、,【例2-1】 编写一个函数,把华氏温度转换为摄氏温度,公式为C=(F-32)*5/9,公式中F代表华氏温度,C代表摄氏温度。在主函数中提示用户输入一个华氏温度,并完成输入及输出,由函数完成转化功能。 程序代码如下: #include float hstoss(float fHuashi);/原型说明 void main( ) ,float fHuashi; coutfHuashi; cout“华氏“fHuashi “度对应摄氏温度“hstoss(fHuashi)“度“endl; /函数调用作为一个表达式出现在输出语句中 float hstoss(float fHuashi) float fS

7、heshi; fSheshi = (fHuashi-32)*5/9; return(fSheshi);, 程序运行结果为 输入一个华氏温度值:68 华氏68度对应摄氏20度,【例2-2】 编写一个求x的n次方的函数。 分析:求x的n次方,实际是求x自乘n次的乘积。 程序代码如下: #include double power(double dDishu,int iMi); /原型说明 void main( ) cout“底数1.8 的 3 次幂是 “power(1.8,3)endl; /函数调用作为一个表达式出现在输出语句中, double power(double dDishu,int iMi

8、) int iCount; double dResult = 1.0; for(iCount=1;iCount=iMi;iCount+) dResult = dResult*dDishu; return(dResult); 程序运行结果为 底数1.8 的 3 次幂是 5.832,【例2-3】 输入一个8位的二进制数,将其转换为十进制数后再输出。对于非法输入(除0和1以外的任何字符)应给出提示信息。 分析:将二进制数转换为十进制数,只要将二进制数的每一位乘以该位的权,然后相加。例如,110100112=1(27)1(26)0(25)1(24)0(23)0(22)1(21)l(20)=21110,

9、所以,如果输入00001101,则应输出13。,可以直接引用例2-2中的函数power来求2的各次方。 程序代码如下: #include double power(double dDishu,int iMi); /函数原型说明 void main( ) int iCount=8; int iValue=0; char cChar; bool bFlag=true;,cout0) cincChar; if(cChar!=1,iCount-; if(bFlag) cout“十进制值为:“iValueendl; double power(double dDishu,int iMi) int iCou

10、nt; double dResult = 1.0; for(iCount=1;iCount=iMi;iCount+) dResult = dResult*dDishu; return(dResult); ,输入符合要求时(仅有字符0和1)的程序运行结果为 输入一个8位的二进制数:11010011 十进制值:211 输入不符合要求时(含有除0和1以外的任何字符)的程序运行结果为 输入一个8位的二进制数:110lao11 这不是一个二进制数! 不能正确转换,【例2-4】 编写一个函数可用来判断任给的一个正整数是否为素数(或质数)。再编写主程序完成输入、调用和输出。素数是指只能被1和它自身整除的数。

11、 分析:素数的逆定义就是,一但某数n能被2、3、.、n-1中的任何一个数除尽(只要除法中有一次余数为零),则n肯定不是一个素数;某数n若依次除以2、3、.、n-1,结果都除不尽(有余数),则n肯定是一个素数。,程序代码如下: #include int iIsprime(int iNum); void main( ) int iNum; coutiNum; if(iIsprime(iNum)=1) coutiNum“ 是一个素数.“endl;,else coutiNum“ 不是一个素数.“endl; int iIsprime(int iNum) int iChushu; bool bFlag=f

12、alse; for(iChushu=2;iChushu=iNum-1;iChushu+) if(iNum%iChushu=0) bFlag=true;,break; if(bFlag=false) return 1; else return 0; ,第一次程序运行结果为 请输入一个正整数:31 31是一个素数 第二次程序运行结果为 请输入一个正整数:119 119不是一个素数,2.1.3 函数的参数传递 函数的参数用于在调用函数与被调用函数之间进行数据传递。在函数定义时,函数名后面括号内的参数称为形式参数(简称形参)。在函数被调用时,函数名后面括号内的参数称为实际参数(简称实参)。,当函数未被

13、调用时,C+编译系统并没有给函数的形参分配相应的内存空间,函数的形参更不会有实际的值。只有在函数被调用时,C+编译系统这时才为形参分配实际的存储单元,并将实参与形参结合。实参可以是常量、变量或表达式,其类型必须与形参相符。函数的参数传递,指的就是形参与实参结合(简称形实结合)的过程。形实结合的方式有值调用和引用调用两种。,1. 值调用 值调用是指当发生函数调用时,编译系统为形参分配相应的存储空间并且直接将实参的值复制给形参,这样形参和实参就各自拥有不同的存储单元,且形参是实参的副本。因此,值调用过程是参数值的单向传递过程,一旦形参获得了与实参相同的值就与实参脱离关系,以后不论形参发生多大的改变

14、,都决不会反过来影响到实参。前面2.1.2节中的四道例题均属于值调用方式。,【例2-5】 从键盘输入两个整数,交换位置后输出(交换未成功)。 #include void swap(int a,int b); void main( ) int x,y; x=5; y=10; cout“x=“x“ y=“yendl; swap(x,y); /交换x,y的值,cout“after swap“endl; cout“x=“x“ y=“yendl; void swap(int a,int b) int t; t=a; a=b; b=t; ,程序运行结果为 x=5 y=10 after swap x=5 y

15、=10 分析:从上面的程序运行结果可以看出,并没有达到交换的目的。这是因为采用的传递方式不合乎问题的要求。在单向值传递方式中,形参值虽确实进行了交换,但这些改变对实参不起任何作用。,执行主调函数中的函数调用语句swap(x、y)后,编译系统将实参x中的值5传递给虚参a,将实参y中的值10传递给虚参b;在swap函数中,a、b中的值完成互换;返回主函数时,实参x、y中的值不受虚参a、b的影响,并未进行交换。,2. 引用调用 显而易见,值调用时参数的传递方式是实参单向复制其值给虚参,如果我们想使子函数中对形参所做的任何更改也能及时反映给主函数中的实参(即希望形参与实参的影响是互相的或称是双向的),

16、又该怎么办呢?这就需要改变调用方式,即采用第二种参数传递方式引用调用。 引用是一种特殊类型的变量,可以被认为是某一个变量的别名。通过引用名与通过被引用的变量名访问变量的效果是一样的。这就是说,对形参的任何操作也就直接作用于实参。,例如: int a,b; int 注意: 声明一个引用时,必须同时对它进行初始化,使它与一个已存在的对象关联。, 一旦一个引用被初始化后,就不能改变关联对象。换言之,一个引用从它被声明之后,就必须确定是哪个变量的别名,而且自始至终只能作为这一个变量的别名,不能另作他用。 形参也可以引用的方式出现在形参表中。引用作为形参的情况与变量的引用稍有不同。这是因为,形参的初始化不在类型说明时进行,而是在执行主调函数中的调用语句时,才为形参分配内存空间,同时用实参来初始化形参。,【例2-6】 使用引用调用改写例2-5的程序,使两实参中的数真正进行互换。 #include void swap(int

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号