C++程序设计第5章函数教程ppt课件.ppt_第1页
C++程序设计第5章函数教程ppt课件.ppt_第2页
C++程序设计第5章函数教程ppt课件.ppt_第3页
C++程序设计第5章函数教程ppt课件.ppt_第4页
C++程序设计第5章函数教程ppt课件.ppt_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

1,第5章函数,计算机学院C课组,2,函数:clrscr()功能:是清屏,将插入点置于0行0列.clrscr();,3,第5章函数,模块化程序设计是面向过程程序设计的很重要的方法,C语言中的函数体现了这种思想。本章主要介绍:1、函数的定义2、模块化程序设计的实现方法3、函数的定义及函数的调用方式4、内部函数和外部函数的定义和调用方法等。,4,5.1C函数与C程序结构,模块化程序特点:模块化程序具备逻辑清晰、层次分明的特点结构;具体应用:在C源程序中,用户可将算法分解成一个个相对独立的函数模块,称为用户函数,然后,通过函数调用来使用这些函数。,5,模块化程序设计,C语言的函数作为一个模块一般应依据下面两个原则:(1)界面清晰。函数的处理子任务明确,函数之间数据传递越少越好。(2)大小适中。若函数太大,处理任务复杂,导致结构复杂,程序可读性较差;反之,若函数太小,则程序调用关系复杂,这样会降低程序的效率。,6,模块化软件结构的示意图,一个C语言程序由主函数和若干个(0个用户函数)组成;C语言中的函数没有隶属关系,即所有的函数都是独立定义的,不能嵌套定义。,7,函数是通过调用来执行的,允许函数间互相调用,也允许直接或间接的递归调用其自身;,【例5.1】用户定义一个无参函数用来输出信息。voidprintstar()printf(*n);,main函数可以调用任何一个函数,而其他函数不能调用main函数;例如:,main()printstar(),8,9,调用另一个函数的函数称为主调函数、被调用的函数称为被调函数;函数的四种形式:a)从使用的角度来分为用户函数和系统函数b)从形式上分成有参函数和无参函数c)从作用的范围分为外部函数和内部函数d)从返回值的角度分成有返回值函数和无返回值函数,voidprintstar()/*无参、无返回值*/floatarea(floata,floatb)/*有参、有返回值*/printf(“*n”)/*系统函数,有参、有返回值*/getchar()/*系统函数,无参、有返回值*/,10,5.2函数的定义及构成,函数要先定义后使用,函数定义的一般格式为:存储类型数据类型函数名(形式参数表)说明部分语句部分通常把函数名和形参的说明部分称为“函数头”,用花括号括起来的部分称为“函数体”。,11,函数具有以下特征(1)存储类型定义函数时存储类型可以是extern或static两种关键字说明(2)数据类型定义函数时数据类型是用来说明该函数返回值的类型,可以是整型、字符型、实型、指针型和其它构造类型。如果省略,则系统默认为int型。(3)函数名函数名是一个标识符,它的命名规则同变量相同。(4)形式参数表形式参数(简称形参)的说明形式如下:数据类型形式参数1,数据类型形式参数2,,12,(5)函数体由括起来的部分称为函数体。由说明部分和语句部分组成(6)函数的返回值返回值可以是常数、变量或表达式,也可以是指针,但不能是数组名或函数名。return表达式;return(表达式);例如:returns;,13,关于return语句说明如下:如果不需要从被调函数带回返回值可以不要return语句。一种情况是将函数类型定义为void型,也叫空类型.例如:voidprintstar()2、还可以用不带表达式的return作为函数的逻辑结尾,这时,return的作用是将控制权交给调用函数,而不是返回一个值。也可以不用return。return;,14,return语句是函数的逻辑结尾,不一定是函数的最后一条语句,一个函数中允许出现多个return语句,但每次只能有一个return语句被执行。if(xy)?x:y;returnz;,main()floata,b;intc;scanf(“%f,%f”,19,函数调用时要注意以下问题:(1)如果实参表中包含多个实参,则各实参用逗号隔开,实参与形参的个数应相等,且类型应一致。(2)函数的调用也可以出现在表达式中。这时要求函数带回一个确定的值以参加表达式的运算。s=5*sum(i,j,k);(3)对实参表求值的顺序TurboC是按从右到左的顺序求值。,20,【例5.5】写出程序运行结果。#includeintf(inta,intb)if(ab)return1;elseif(a=b)return0;elsereturn-1;main()inti=2,p;p=f(i,+i);/*传递的都是3*/printf(“%d”,p);,21,(4)函数定义的类型就是返回值的类型;函数调用时,如果return中的表达式类型与函数类型不一致,则编译系统自动将表达式的类型转换成函数的类型后返回。intmax(floatx,floaty)floatz;z=(xy)?x:y;returnz;/*返回整型值*/输入:3.5,4.8,22,(4)调用函数与被调用函数的相对位置关系一个程序文件中可能包含若干个函数,函数在其中所处的位置代表函数定义的顺序,同时也决定了它的作用域。若:调用点位于被调用函数后则不需说明,而调用点位于被调用函数前,则必须进行函数声明后才能调用。声明时要说明被调用函数的返回值的类型、函数名、函数的形式参数表,其中形参都要在形参表中一一列举。函数声明的格式为:类型名被调用函数的函数名(),23,【例5.6】观察下面程序中声明函数与调用点的位置。#include#includelongfac(intx);/声明函数fac,形参为int类型,此时函数作用域开始voidmain()intn;printf(inputaninteger:);scanf(%d,longfac(intx)inti;longy=1;for(i=1;i=x;i+)y=y*i;returny;,24,若被调用函数的函数值是整型或字符型,则均可省略上述函数声明。例如,求两个数中的最大数在函数的外部已做了函数声明,则在各个主调函数中不必对所调用的函数再作声明。例如:floatf1(float,float);charf2(char);intf3(float);main()floatf1(floata,floatb)charf2(charc)intf3(floatd)在main中不用对函数f1,f2,f3进行声明。,25,(5)函数的调用可以是嵌套的,即在调用一个函数的过程中可以再调用另一个函数。C语言不允许嵌套定义,但可以嵌套调用。在主函数中调用其他函数。#include/调用系统函数voidprintstar(void)/用户函数,函数头cout*endl;voidprint_message(void)/用户函数,函数头coutWelcometoC+!i1i2i3;/输入3个整数i=max(i1,i2,i3);/求3个整数中的最大者couti_max=id1d2d3;/输入3个双精度数d=max(d1,d2,d3);/求3个双精度数中的最大者coutg1g2g3;/输入3个长整数g=max(g1,g2,g3);/求3个长整数中的最大者coutg_max=ga)a=c;returna;doublemax(doublea,doubleb,doublec)/定义求3个双精度数中的最大者的函数if(ba)a=b;if(ca)a=c;returna;longmax(longa,longb,longc)/定义求3个长整数中的最大者的函数if(ba)a=b;if(ca)a=c;returna;,32,5.5函数间的数据传递,函数间的数据传递是指主调函数向被调函数传送数据及被调函数向主调函数返回数据。函数间的数据传递可以通过参数(实参)、返回值、全局变量来实现。参数传递数据的方式主要有两种:值传递和地址传递传值传递的是具体数据;传址是传递的变量(数组元素)或数组的地址。实质上两种方式均为值传递,为数值与地址值(地址值),33,5.5.1值传递方式,值传递方式所传递的是参数值。调用函数时,将实参的值计算出来传递给对应的形参。实参对形参的值传递只是单向传递,不能由形参传结实参。这是由于在内存中实参和形参使用的是不同的存储单元;因此,在执行一个被调函数时,形参的值如果发生变化,并不会改变主调函数的实参值。,34,【例5.10】考察下面的程序,能否通过函数调用实现求变量的相反数。#includemain()intx;voidopposition(int);scanf(%d,35,【例5.11】设一维数组存放了10个学生的成绩,求不及格的人数intflag(floatscore)if(score60)return1;elsereturn0;main()floatscore10;inti,num=0;printf(“input10scores:n”);for(i=0;i10;i+)scanf(“%f”,36,5.5.2地址传递方式,地址传递方式不是传递数据本身,而是数据的内存单元的地址传递给形参(简称传址);实参和形参共同占用相同的存储单元,因此在函数中改变了形参存储单元的值,将会使实参随之变化。可见,在形参和实参为地址传送方式时,被调用程序中对形参的操作实际上就是对实参的操作,间接的实现了数据的双向传递。,37,【例5.12】数组a中存放了一个学生5门课程的成绩,求平均成绩。,floataverage(floatarray5)inti;floatav,sum=0;for(i=0;i5;i+)sum=sum+arrayi;av=sum/5;returnav;main()floatscore5,av;inti;printf(input5scores:n);for(i=0;i5;i+)scanf(%f,input5scores:8472908765averagescoreis79.60,38,说明:用数组名也可用数组元素地址作函数参数要求:在主调函数和被调函数分别定义数组且数组的类型应该一致执行机制:C编译系统只将实参数组的首地址传给形参数组关于形参数组:可以指定大小;floataverage(floatarray5)可以不指定大小,另设一个参数传递实参数组的大小;但在定义数组时在数组名空的方括号不可少;这时形参数组可以随实参数组而动态变化。例如,39,被调函数中形参数组没有定义大小,由n来接收长度值,floataverage(floatarray,intn)inti;floatav,sum=0;for(i=0;ib?a:b;returnc;main()inta=8;printf(%d,max(a,b);,形参a、b的作用范围,局部变量a的作用范围,全局变量a,b的作用范围,45,说明,好处:设全局变量的作用是增加了函数间数据联系的渠道。缺点:(1)利用全局变量实现函数间的数据传递,削弱了函数的内聚性,从而降低了程序的可靠性和通用性。(2)全局变量在程序的全部过程中都占用存储单元。,46,【例5.17】静态局部变量的使用#includef();voidmain()f();f();f();f()staticinta=1;/变量a是静态局部变量,在此函数中有效autointb=0;/变b是动态变量,在此函数中有效a=a+1;b=b+1;printf(a=%d,b=%dn,a,b);,47,5.5.5C+中访问全局变量【例5.18】作用域操作符的使用。doubleA;/全局变量Avoidmain()intA;/局部变量AA=5;/为局部变量A赋值:A=2.5;/为全局变量A赋值coutAend1;/输出局部变量的值5cout:A1)f=fac(n-1)*n;elseif(n=0|n=1)f=1;elsef=-1;returnf;voidmain()intn;floaty;printf(Inputaintegernumber:);scanf(%d,53,【例5.20】用递归函数求fibonacci数列的某一项的值。#includeintfib(inti)if(i=1,54,习题五(5)传值,main()inta,is_not=10;scanf(%d,#includeintrunnian(intb)intc;if(b%100!=0,55,5.7内部函数和外部函数,语言程序中函数分为两类:即内部函数和外部函数。它们以是否可以允许其它程序文件调用来区分的。允许其它程序文件调用的函数称为外部函数;不允许其它程序文件调用的函数称为内部函数;,56,5.6.1内部函数,一个源文件中定义的函数只能被本文件中的函数调用,而不能被其它文件中的函数调用,这种函数称为内部函数(静态函数)。使用关键字static定义内部函数,其格式为:static数据类型函数名(形参表);例如:staticintf(inta,intb);内部函数的作用域:内部函数的调用范围只局限于本文件,57,5.6.2外部函数,外部函数是指允许其他文件调用的函数,使用关键字extern定义外部函数,其格式为:extern数据类型函数名(形参表);例如:externintf(inta,intb);系统默认:如在函数定义中没有说明extern或static则默认为外部函数;在一个源文件的函数中调用其它源文件中定义的外部函数时,应用extern说明被调函数为外部函数。,58,5.7函数应用程序举例,【例5.21】编写一个函数,求一个整数的所有正因子。#includevoidgene(intn)intd;for(d=1;d=n;d+)if(n%d=0)printf(%dn,d);main()intn;printf(Inputintegern:);scanf(%d,59,【例5.22】编写一个函数,求一个字符串中英文单词的个数。单词之间用空格符、换行符、跳格符隔开。,main()charstring81;printf(Inputastring:n);gets(string);printf(Thereare%dwordsinthestring.n,wordnum(string);,#includeintwordnum(charstr)inti,num=1;charch;for(i=0;(ch=stri)!=0;i+)num+;returnnum;,60,【例5.23】编写一个函数,用选择法将一维数组排序(数组长度为10,元素由小到大排序)算法分析:每比较一轮,找出一个未经排序数中的最小值,因此共须9轮排序。下面以5个数为例说明选择法排序的步骤。a0a1a2a3a452964未排序时数据排序状态25964将5个数的最小值与a0交换后状态24965将余下的4个数的最小值与a1交换后状态24569将余下的3个数的最小值与a2交换后状态24569将余下的2个数的最小值与a4交换后,排序完成,61,voidsort(intarray,intn)inti,j,k,temp;for(i=0;in-1;i+)k=i;/*要放数据的下标,即位置*/for(j=i+1;jn;j+)if

温馨提示

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

评论

0/150

提交评论