C语言程序设计第四章函数和作用域

PPT
  • 阅读 82 次
  • 下载 0 次
  • 页数 49 页
  • 大小 155.012 KB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
C语言程序设计第四章函数和作用域
可在后台配置第一页与第二页中间广告代码
C语言程序设计第四章函数和作用域
可在后台配置第二页与第三页中间广告代码
C语言程序设计第四章函数和作用域
可在后台配置第三页与第四页中间广告代码
C语言程序设计第四章函数和作用域
C语言程序设计第四章函数和作用域
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 49
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】C语言程序设计第四章函数和作用域.ppt,共(49)页,155.012 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-2228.html

以下为本文档部分文字说明:

第四章函数和作用域第四章第一节函数的定义和说明第四章一、函数的定义格式在C++中一个函数的定义格式:<类型><函数名>(<参数表>){<若干条语句>}函数的定义格式的几点说明:1、<类型>、<函数名>、<参数表>构成了函数的函数头。2、用花括号括

起来的<若干条语名>组成了函数体。函数体内无论多少条语句,花括号是不可省的。第四章3、<类型>是该函数的类型,即为该函数返回值的类型,如果该函数没有返回值,只是一个过程调用,则该函数的类型为void,在C++程序中函数的类型不可省略。4、<参数表>是由0个、1个或多个

参数组成,参数个数为0,表示没有参数,但是圆括号不可省,多个参数之间应用逗号分隔;每个参数包括参数类型和参数名。<参数表>中的参数称为形式参数,简称形参。形参在该函数被调用时才被初始化的。形参的使用将使被调用函数可以从调用函数那里获

取数据。如果被调用函数不需要从调用函数那里获取数据,则该函数参数为空。第四章二、函数的说明方法:1、说明调用函数的方法:<类型><函数名>(<参数表>);函数说明又称为原型说明。其格式同于定义函数时的函数头,包括函数的类型、函数名和函数参数的个数及其对应

的类型。原型说明与C语言中的简单说明是不同的。2、在C++中函数的说明原则:如果一个函数定义在先,调用在后,调用前可以不必说明;如果一个函数定义在后,调用在先,调用前则必须说明。例1、使用原型说明的例子第四章#include<ios

tream.h>voidfun1(),fun2(),fun3();voidmain(){cout<<”Itisinmain."<<endl;fun2();cout<<"Itisbackinmain."<<endl;}voidfun1(){cout<<"It'sinfun1.”<<en

dl;fun3();cout<<”It'sbackinfun1.”<<endl;}第四章voidfun2(){cout<<"It'sinfun2."<<endl;funl();cout<<”It'sbackinfun2."<<end1;}voidfu

n3(){cout<<"It'sinfun3."<<endl;}第四章第二节函数的调用第四章一、函数的值和类型:一个函数被定义以后就是为了将来对它调用,函数的调用是用一个表达式来表示的。函数调用格式:<函数名>(<实参表>)⑴、<

实参表>可以是0个、1个或多个实在参数,如果是多个参数用逗号分隔。⑵、每个参数是一个表达式。⑶、实参的个数由形参决定,实参是用来在调用函数时给形参初始化的,因此实参的个数和类型要与形参的个数和类型一致,并且初始化时

是按其位置对应进行。第四章二、函数的调用:1、函数的传值调用:该调用同C语言,分如下两种:(1)、传值调用:传递变量本身值的函数调用。使用传值调用时,调用函数的实参用常量、变量值或表达式,被调用函数的形参用变量名,实参将复制

副本形参。传值调用的特点是在被调用函数中形参的改变将不影响调用函数的实参。例2、一个传值调用的例子。第四章#include<iostream.h>voidswap1(intx,inty){inttemp;temp=x;x=y;//将y值赋予了

xy=temp;//将x的值赋予ycout<<"x="<<x<<","<<"y="<<y<<endl;}voidmain(){inta(5),b(9);swap1(a,b);cout<<"a="<<a<<","<<"b="<<b<<endl;}第四章(2)、传址调用:传

递变量地址值的函数调用。使用传址调用方式时,调用函数的实参用地址值,被调用函数的形参用指针,调用时将实参地址值传送给形参指针,即让指针指向实参变量或对象。在被调用函数中可以通过改变形参指针所指向的实参变量值来间接改变实参值。传址调用的特点是可以通过改变形参所指向的变量值

来影响实参。例3、一个传址调用的例子。第四章#include<iostream.h>voidswap2(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;cout<<"x="<

<*x<<","<<"y="<<*y<<endl;}voidmain(){inta(5),b(9);swap2(&a,&b);cout<<"a="<<a<<","<<"b="<<b<<endl;}第四章2、引用调用:引用调

用是C++中的一种函数调用方式,C语言中没有这种调用方式。引用调用时,调用函数的实参用变量名或对象名,被调用函数的形参用变量或对象的引用。而实际传送的是地址值。在被调用函数中改变形参值,则调用函数中实参值也被改变。引用调用具有传址调用的特点,而

在操作中又比传址调用方便、直观。因此,在C++程序中多用引用调用。例4、一个引用调用的例子第四章#include<iostream.h>voidswap3(int&x,int&y){inttemp;temp=x;x=y;y=temp;cou

t<<"x="<<x<<","<<"y="<<y<<endl;}voidmain(){inta(5),b(9);swap3(a,b);cout<<"a="<<a<<","<<"b="<<b<<endl;}第四章三、函数的嵌套调用:C++程序中允许函数的嵌套调用:函数调用是逐级调用,然后逐级返回

的过程。即在调用A函数的过程中,可以调用B函数,在调用B函数的过程中,还可以调用C函数……。当C函数调用结束后,返回到B函数,当B函数调用结束后,再返回到A函数。四、函数的递归调用:递归调用:是指在调用一个函数时,直接或间接地调用该函数自身的过程。直接递归调用:是指在调用一个函

数的过程中,又调用了该函数。第四章间接递归调用:是指在调用一个函数的过程中调用了另一个函数,而在另一个函数中又调用了该函数。1、递归调用的特点及方法:(1)、特点:使用递归调用方法编写的程序简洁清晰,可读性强,但是程序在执行时占用的时间和空间都比较大。(2)、方法:

将原有问题能够分解为一个新问题,而新问题又用到原有问题的解法,这就出现了递归。实际中,有限的递归调用是有意义的,而无限的递归调用是没有意义的。数学中求正整数阶乘的问题就是典型的有限的递归调用的例子。第四章2、递归调用的过程:具体可分为两个阶段:第一个阶段称为“递推”阶段。这一

阶段将原有问题不断地分解为新的子问题,逐渐从未知的向已知的方向推测,最终到达已知的条件,即递归结束条件,这时递推阶段结束。第二个阶段称为“回归”阶段。此阶段是从已知的阶段出发,按照“递推”的逆过程,逐一求值回归,最后到达递推的开始处,结束回归阶段,完成递归调用

。如求正整数阶乘的问题。第四章第三节函数参数及内联函数第四章一、函数参数的求值顺序:当一个函数带有多个参数时,C++语言没有规定在函数调用时实参的求值顺序,而编译器根据对代码进行优化的需要自行规定对实参的求值顺序。因此应注意不同编译

系统中,函数参数求值的顺序可能不同,当实参表达式中出现有副作用的运算符时,可能产生二义性。二、设置函数参数的默认值:在C++语言中,允许在函数的说明或定义时给一个或多个参数指定默认值。具体规则如下:第四章(1)、设置参数默认值时,要求从右向左设置,即要求在一个指定

了默认值的参数的右边不能出现没有指定默认值的参数。(2)、调用设置了默认参数的函数时,对应实参如果没有,则用默认值,如果存在,则用实参值。(3)、如果一个函数有说明出现时,设置参数默认值应放在函数说明中。例5、一个将参数默认值设置在函数的说明中的例子第四章#inclu

de<iostream.h>intm(8);intadd_int(intx,inty=7,intz=m);voidmain(){inta(5),b(15),c;ints=add_int(a,b,c);co

ut<<s<<endl;}intadd_int(intx,inty,intz){returnx+y+z;}运行结果:28第四章三、数组名可作为函数参数:数组作函数参数可以分为三种情况,这三种情况所采用的调用机制不同,

但是结果相同。1、形参和实参都用数组:调用函数的实参用数组名,被调用函数的形参用数组,这种调用的机制是形参和实参共用内存中的同一个数组。因此,在被调用函数中改变了数组中某个元素的值,对调用函数该数组的该元素值也被改变。例6:#include<iostream.h>inta[8]

={1,3,5,7,9,11,13};voidfun(intb[],intn){for(inti=0;i<n-1;i++)第四章b[7]+=b[i];}voidmain(){intm=8;fun(a,m);cout<<a[7]<<endl;}运行后结果为:492、形参和实参都用对应数组的指针:在

C++中,数组名被规定为是一个指针,该指针便是指向该数组的首元素的指针。实际中,形参和实参一个用指针,另一个用数组也是可以的。在使用指针时可以用数组名,也可以用另外定义的指向数组的指针。第四章例7:#include<iostream.h>inta[8]={1,3,5,7,9,11,13};void

fun(int*pa,intn){for(inti=0;i<n-1;i++)*(pa+7)+=*(pa+i);}voidmain(){intm=8;fun(a,m);//a是数组的数组名,是一个地址值cout<<a[7]<<endl;}运行结果:49第四章3、实参用数

组名,形参用引用。采用这种情况时,应先用类型定义语句定义一个与实参数组类型相一致的数组类型。四、内联函数:1、内联函数引入的原因:引入内联函数的目的是为了提高程序中函数调用的效率问题。引入内联函数,在程序编译时,编译器将程序中出现

的内联函数的调用表达式用内联函数的函数体来进行替换,因此,引入内联函数是以目标代码的增加为代价来换取时间的节省。第四章2、内联函数的定义方法:在函数头前加上关键字inline,其格式:inline<类型

><函数名>(<参数表>)3、使用内联函数应注意的事项:(1)、内联函数通常情况下是将一些函数体不大,而且使用频繁的函数;(2)、内联函数体内不允许用循环语句和开关语句;(3)、内联函数的定义必须出现在第一次调用之前;(4)、类体内定义的所有成员函数都是内联函数。第四章例8、编程求1

~10中各个数的平方。#include<iostream.h>inlineintpower_int(intx){return(x)*(x);}voidmain(){for(inti=1;i<=10;i++){intp

=power_int(i);cout<<i<<"*"<<i<<"="<<p<<endl;}}运行结果:分别是1~10的平方。第四章第四节函数的重载第四章一、函数重载定义:函数重载:是指同一个函数名对应着多个不同的实现。二、定义重载函数时的注意事项:1、多个重载的同名函数在定义时要注意它

们的参数的不同,主要是参数的个数、类型和顺序的不同。2、在选择重载函数的不同实现时,主要根据参数不同进行选择。例9、求两个操作数之和。#include<iostream.h>intadd(int,int);doubleadd(double,

double);第四章voidmain(){cout<<add(5,10)<<endl;cout<<add(5.0,10.5)<<endl;}intadd(intx,inty){returnx+y;}dou

bleadd(doublea,doubleb){returna+b;}程序的输出结果:1515.5第四章例10、找出几个int型数中最小者。#include<iostream.h>intmin(inta,intb

);intmin(inta,intb,intc);intmin(inta,intb,intc,intd);voidmain(){cout<<min(13,5,4,9)<<endl;cout<<min(-2,8,0);}intmin(in

ta,intb){returna<b?a:b;}intmin(inta,intb,intc){第四章intt=min(a,b);returnmin(t,c);}intmin(inta,intb,intc,intd){intt1=min(a

,b);intt2=min(c,d);returnmin(t1,t2);}运行结果:4-2第四章第五节作用域第四章一、用作标识符的作用域规则:作用域又称作用范围。在程序中出现的各种标识符,它们的作用域是不同的。标识符只能在说明它或定义它的范

围内是“可见的”,即是可以进行存取或访问操作的;而在该范围之外是“不可见”的,也就是指不可以进行存取或访问操作的。二、作用域的种类:作用域的按大小可分为:1、程序级:作用域最大,属于程序级作用域的有外部函数和外部变量。2、文件级:仅在所定义的文件内,属于文件

级作用域第四章3、函数级:在它所定义的函数体内,属于函数级作用域的有函数的形参和在函数内定义的自动类变量和内部静态类变量以及语句标号。4、块级:在某一程序块内,属于块级作用域的有定义在分程序、if语句、switch语句以及循环语句

中的自动类变量和内部静态类变量。三、关于重新定义标识符的作用域规定:在某个作用范围内定义的标识符在该范围内的子范围内中可以重新定义,这时原定义的标识符在子范围内是不可见的,但是它还是存在的,只是在子范围内由于出现了同名的标识符而被暂时地隐藏起来。出了子

范围后,它又是可见的。第四章第七节存储类及系统函数第四章一、存储类:1、变量的存储类:(1)、变量存储类的种类:①、自动类:是在函数体或分程序内定义的变量,定义时可加auto说明符,也可以省略。②、寄存器类:也是定义在函数体内或分程序内的变量,定义时前

边加说明符rigester。寄存器类变量有可能被存放到CPU的通用寄存器中,此时可提高存取速度,但是由于CPU的通用寄存器数量有限,如果没被存放到通用寄存器中便按自动类变量处理。③、外部类:是一种定义

在函数体外,定义时不加任何存储类说明的一种变量。外部变量在引用之前需第四章要说明,说明外部变量时应在其前面加说明符extern。外部变量的定义和说明是两回事:在一个程序中,一个外部变量只能定义一次,但是可以说明多次。外部变量不管是在同一文件中,还是在另外一个文件中被引用,都要在

引用前必须对它进行说明。④、静态类(内部静态和外部静态):内部静态类变量也是在函数体内或分程序内定义的变量,用说明符static说明。它的作用域与自动变量相同,但是它的生存期(即寿命)是长的,是一种可见性与存在性不一致的变量:在定义它的作用第四章域外,它虽然不可见,但是它仍然存在,且没有被释

放掉,一旦它回到作用域后,仍然保留其原来的值。外部静态类变量被定义在函数体外,也用说明符static说明,其作用域是文件级的,可见性与存在性也是不一致的(它的作用域不是整个程序,但其生存期却在整个程序)。(2)、不同存储类变量的作用域和

寿命:①、作用域分为程序级、文件级、函数级和分程序级②、寿命分为长和短两种。存放在内存的静态区的寿命长,存放在寄存器和内存的动态区的寿命短。2、函数的存储类:(1)、函数存储类的种类:函数存储类分两种

:内部函数和外部函数。第四章a、内部函数:用关键字static说明的函数,也称为静态函数。在定义它的文件中可以被调用,而在同一程序的其他文件中不可被调用。定义格式:static<类型说明><函数名>(<参数表>){<函数体>}b、外部函数:用关键字extern说明的函数,其作用

域在整个程序中,包含组成该程序的若干个文件。定义格式:第四章[extern]<类型说明><函数名>(<参数表>){<函数体>}一般情况下,关键字extern可以省略。二、系统函数:1、使用系统函数的注意事项:C++系统将所提供的系统函数的说明分类放在不同的.h文件中。

因此,编程者在使用系统函数时,应该注意:(1)、了解你所使用的C++系统提供了哪些系统函数。第四章(2)、知道某个系统函数的说明在哪个头文件中。(3)、调用一个函数时,一定要将该函数的功能、参数和返回值搞清楚。否则难以正确地

使用该函数。2、字符串处理函数:(1)、字符串长度函数strlen():功能是返回一个字符串的长度。其原型说明为:intstrlen(constchar*s);(2)、字符串拷贝函数strcpy():功能是用一个字符串去更新另一

个字符串,从而实现字符串的复制。该函数原型说明:①char*strcopy(char*s1,constchar*s2);②char*strncpy(char*s1,constchar*s2,intn);第四章(3)、字符串

连接函数strcat():功能是将一个字符串添加到另一个字符串的后面,形成一个包含了两个字符串的新字符串。该函数的原型说明:①char*strcat(char*s1,char*s2);②char*strncat(chars1,chars2,intn);(4)、字符串比较

函数strcmp():功能是用来比较两个字符串是否相等。如果该函数返回值为0,说明比较的两字符串相等;如果返回值为大于O的值,说明比较的两个字符串不相等,第一个大于第二个,如果返回值为小于O的值,说明第一个小于第二个。该函数的原型说明:第四章①.in

tstrcmp(constchar*s1,constchar*s2)②.intstrncmp(constchar*s1,constchar*s2,intn);第四章:第四章:第四章:第四章:

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?