C++程序设计第5章函数教程ppt课件

上传人:壹****1 文档编号:567582120 上传时间:2024-07-21 格式:PPT 页数:65 大小:632.50KB
返回 下载 相关 举报
C++程序设计第5章函数教程ppt课件_第1页
第1页 / 共65页
C++程序设计第5章函数教程ppt课件_第2页
第2页 / 共65页
C++程序设计第5章函数教程ppt课件_第3页
第3页 / 共65页
C++程序设计第5章函数教程ppt课件_第4页
第4页 / 共65页
C++程序设计第5章函数教程ppt课件_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《C++程序设计第5章函数教程ppt课件》由会员分享,可在线阅读,更多相关《C++程序设计第5章函数教程ppt课件(65页珍藏版)》请在金锄头文库上搜索。

1、C/C+C/C+程序设计程序设计第5章 函数计算机学院计算机学院C 课组课组1C/C+C/C+程序设计程序设计函数函数:clrscr()功能功能:是清屏是清屏,将插入点置于将插入点置于0行行0列列.clrscr();2C/C+C/C+程序设计程序设计第 5 章 函数模块化程序设计是面向过程程序设计的很重要的模块化程序设计是面向过程程序设计的很重要的方法,方法,C语言中的语言中的函数函数体现了这种思想。体现了这种思想。本章主要介绍本章主要介绍:1、函数的、函数的定义定义2、模块化程序设计模块化程序设计的实现方法的实现方法3、函数的定义及函数的、函数的定义及函数的调用方式调用方式4、内部函数和外部

2、函数内部函数和外部函数的定义和调用方法等。的定义和调用方法等。3C/C+C/C+程序设计程序设计5.1 C 函数与C程序结构模块化程序特点模块化程序特点:模块化程序具备逻辑清晰、层次分明的特点结构;模块化程序具备逻辑清晰、层次分明的特点结构;具体应用具体应用:在在C源程序中,用户可将算法分解成一个个相对独源程序中,用户可将算法分解成一个个相对独立的立的函数模块函数模块,称为用户函数,称为用户函数,然后,通过函数调然后,通过函数调用来使用这些函数。用来使用这些函数。 4C/C+C/C+程序设计程序设计模块化程序设计C语言的语言的函数作为一个模块函数作为一个模块一般应依据下面一般应依据下面两个两个

3、原则:原则:(1)界面清晰。函数的处理界面清晰。函数的处理子任务明确子任务明确,函数之间,函数之间数数据传递越少越好。据传递越少越好。(2)大小适中。若函数太大,处理任务复杂,导致结大小适中。若函数太大,处理任务复杂,导致结构复杂,程序可读性较差;反之,若函数太小,则构复杂,程序可读性较差;反之,若函数太小,则程序调用关系复杂,这样会降低程序的效率。程序调用关系复杂,这样会降低程序的效率。5C/C+C/C+程序设计程序设计模块化软件结构的示意图模块化软件结构的示意图 一个一个C语言程序由主函数和若干个(语言程序由主函数和若干个(0个用户个用户函数)组成;函数)组成;C语言中的函数没有隶属关系,

4、即语言中的函数没有隶属关系,即所有的函数都是独立定义的,所有的函数都是独立定义的,不能嵌套定义不能嵌套定义。6C/C+C/C+程序设计程序设计 函数是通过调用来执行的,允许函数间互相函数是通过调用来执行的,允许函数间互相调用,也允许直接或间接的递归调用其自身;调用,也允许直接或间接的递归调用其自身; 【例例5.1】用户定义一个无参函数用来输出信息。用户定义一个无参函数用来输出信息。void printstar( ) printf( printf( *nn );); main函数函数可以调用任何一个函数,而其他函数不可以调用任何一个函数,而其他函数不能调用能调用main函数;函数;例如:例如:m

5、ain() printstar( ) 7C/C+C/C+程序设计程序设计【例例5.2】编写一个有参函数程序,求长方形的面积。编写一个有参函数程序,求长方形的面积。floatarea(floata,floatb)floats;s=a*b;returns;/*返回值返回值*/main()floataver,x,y;scanf(“%f%f”,&x,&y);area=area(x,y);/*调用函数,得到返回值调用函数,得到返回值*/printf(“%f”,area);8C/C+C/C+程序设计程序设计调用另一个函数的函数称为调用另一个函数的函数称为主调函数主调函数、被调用的函数称为、被调用的函数称为

6、被调函数被调函数;函数的四种形式:函数的四种形式:a)从使用的角度来分为从使用的角度来分为用户函数用户函数和和系统函数系统函数b)从形式上分成从形式上分成有参函数有参函数和和无参函数无参函数c)从作用的范围分为从作用的范围分为外部函数外部函数和和内部函数内部函数d)从返回值的角度分成从返回值的角度分成有返回值函数有返回值函数和和无返回值函数无返回值函数void printstar( ) /*无参、无返回值无参、无返回值*/float area(float a,float b) /*有参、有返回值有参、有返回值*/printf(printf(“*n*n”) )/*系统函数,有参、有返回值系统函数

7、,有参、有返回值*/getchar() /*系统函数,无参、有返回值系统函数,无参、有返回值*/9C/C+C/C+程序设计程序设计5.2函数的定义及构成函数的定义及构成函数要先定义后使用函数要先定义后使用, 函数定义的函数定义的一般格式一般格式为:为: 存储类型存储类型 数据类型数据类型 函数名函数名(形式参数表形式参数表) 说明部分说明部分 语句部分语句部分 通常把函数名和形参的说明部分称为通常把函数名和形参的说明部分称为“函数头函数头”,用花括号括起来的部分称为,用花括号括起来的部分称为“函数体函数体”。10C/C+C/C+程序设计程序设计函数具有以下特征函数具有以下特征 (1)(1)存储

8、类型存储类型 定义函数时定义函数时 存储类型存储类型 可以是可以是externextern或或staticstatic两种关键字说明两种关键字说明 (2)(2)数据类型数据类型 定义函数时定义函数时 数据类型数据类型 是用来说明该函数返回值的类型,可以是是用来说明该函数返回值的类型,可以是整型、整型、字符型、实型、指针型和其它构造类型字符型、实型、指针型和其它构造类型。如果省略,则系统默认为。如果省略,则系统默认为intint型。型。 (3) (3) 函数名函数名 函数名是一个标识符,它的命名规则同变量相同。函数名是一个标识符,它的命名规则同变量相同。 (4) (4) 形式参数表形式参数表 形

9、式参数(简称形参形式参数(简称形参 ) )的说明形式如下:的说明形式如下: 数据类型数据类型 形式参数形式参数1 1,数据类型,数据类型 形式参数形式参数2 2,11C/C+C/C+程序设计程序设计(5) (5) 函数体函数体 由由 括起来的部分称为函数体。由说明部分和语句部分括起来的部分称为函数体。由说明部分和语句部分组成组成(6) (6) 函数的返回值函数的返回值 返回值可以是常数、变量或表达式,也可以是指针,返回值可以是常数、变量或表达式,也可以是指针,但不但不能是数组名或函数名。能是数组名或函数名。 return return 表达式;表达式; return return (表达式);

10、(表达式);例如:例如:returns;12C/C+C/C+程序设计程序设计关于关于returnreturn语句说明如下:语句说明如下:1.1.如果不需要从被调函数带回返回值可以不要如果不需要从被调函数带回返回值可以不要returnreturn语句。语句。一种情况是将函数类型定义为一种情况是将函数类型定义为voidvoid型,也叫空类型型,也叫空类型. . 例如:例如:voidvoid printstar( ) printstar( )2 2、 还可以用不带表达式的还可以用不带表达式的returnreturn作为函数的逻辑结尾,这时,作为函数的逻辑结尾,这时,returnreturn的作用是将

11、控制权交给调用函数,而不是返回一个的作用是将控制权交给调用函数,而不是返回一个值。也可以不用值。也可以不用returnreturn。 returnreturn;13C/C+C/C+程序设计程序设计 return语句是函数的逻辑结尾,不一定是函数的最后一条语句,一个函数中允许出现多个return语句,但每次只能有一个return语句被执行。if(x0)return -1;else if(x=0) return 0; else return 1; -1x0Y=14C/C+C/C+程序设计程序设计5.3 函数的调用5.3.1 函数的调用函数调用格式函数调用格式: 函数名函数名(实参表实参表);函数的

12、调用过程是:函数的调用过程是: (1) 如果是有参函数如果是有参函数,为形式参数分配存储单元,将实参的值为形式参数分配存储单元,将实参的值计算出后依次赋予对应的形参,称为值传递(计算出后依次赋予对应的形参,称为值传递(传值传值),在),在C语言语言中这种数据传递是中这种数据传递是单向的单向的。 (2) 执行函数体执行函数体,为其中的变量分配存储单元并执行函数体中为其中的变量分配存储单元并执行函数体中的可执行语句。的可执行语句。当执行到当执行到“返回语句返回语句”时,时,计算返回值返回主调函数继续运行计算返回值返回主调函数继续运行程序,程序,如果是无返回值函数,则省略此操作。如果是无返回值函数,

13、则省略此操作。系统将释放本函数体中定义的变量(静态型变量不释放),系统将释放本函数体中定义的变量(静态型变量不释放),同同时收回分配给形参的存储单元。时收回分配给形参的存储单元。如果是如果是“无参函数无参函数”,则无需进,则无需进行参数传递。行参数传递。15C/C+C/C+程序设计程序设计【例5.3】调用函数实现求长方形的面积。#includefloatarea(floata,floatb)/定义函数定义函数area,形参为,形参为a,bfloats;s=a*b;returns;/变量变量s带回函数值,返回主调函数带回函数值,返回主调函数voidmain()floatlength,width,

14、s;scanf(%f,%f,&length,&width);s=area(length,width);/调用函数调用函数area求长方形面积,实参为求长方形面积,实参为/length,widthprintf(%5.2fn,s);16C/C+C/C+程序设计程序设计inputthreeintegers:102030 sum=60int sum(int x,int y,int z) int m; m=x+y+z; return m; #include main() int i,j,k,s; printf(“input three integers:”); scanf(“%d %d %d”,&i,&

15、j,&k); while(!(i=0&j=0&k=0) s=sum(i,j,k); printf(sum=%dn,s); 【例例5.4】编写程序,计算编写程序,计算3个不为个不为0的整数之和的整数之和17C/C+C/C+程序设计程序设计例如,求两个数中的最大数#includemax(floatx,floaty)floatz;z=(xy)?x:y;returnz;main( )float a,b; int c; scanf(“%f,%f”,&a,&b); c=max(a,b); printf(“Max is %dn”, c); 18C/C+C/C+程序设计程序设计 函数调用时要注意以下问题:函数

16、调用时要注意以下问题: (1) 如果实参表中包含如果实参表中包含多个实参多个实参,则各实参用,则各实参用逗号逗号隔开,隔开,实参与形参的个数应相等,且实参与形参的个数应相等,且类型类型应一致应一致。 (2) 函数的调用也可以出现在表达式中。这时要求函数函数的调用也可以出现在表达式中。这时要求函数带回一个确定的值以带回一个确定的值以参加表达式的运算参加表达式的运算。 s=5*sum(i,j,k); (3) 对实参表求值的顺序对实参表求值的顺序Turbo C是按从右到左的顺序是按从右到左的顺序求值求值。19C/C+C/C+程序设计程序设计【例5.5】写出程序运行结果。 #include int f

17、(int a,int b) if(ab) return 1; else if(a=b) return 0; else return -1; main( ) int i=2,p; p=f(i,+i); /*传递的都是3*/ printf(“%d”,p); 结果为:结果为:020C/C+C/C+程序设计程序设计(4)函数定义函数定义的类型就是返回值的类型;的类型就是返回值的类型;函数调用时,如果函数调用时,如果return中的表达式类型与函数类型不一致,中的表达式类型与函数类型不一致,则则编译系统自动将表达式的类型转换成编译系统自动将表达式的类型转换成函数的类型函数的类型后返回。后返回。intma

18、x(floatx,floaty)floatz;z=(xy)?x:y;returnz;/*返回整型值返回整型值*/输入:输入:3.5,4.821C/C+C/C+程序设计程序设计(4)调用函数与被调用函数的调用函数与被调用函数的相对位置关系相对位置关系一个程序文件中可能包含若干个函数,函数在一个程序文件中可能包含若干个函数,函数在其中所处的位置代表函数其中所处的位置代表函数定义的顺序定义的顺序,同时也决,同时也决定了它的作用域。定了它的作用域。若若:调用点位于被调用调用点位于被调用函数后函数后则不需说明,而调则不需说明,而调用点位于被调用用点位于被调用函数前函数前,则必须进行函数声明后,则必须进行

19、函数声明后才能调用。才能调用。声明时声明时要说明被调用函数的返回值的类型、函数要说明被调用函数的返回值的类型、函数名、函数的形式参数表,其中形参都要在形参表名、函数的形式参数表,其中形参都要在形参表中一一列举。函数声明的中一一列举。函数声明的格式为:格式为:类型名类型名被调用函数的函数名被调用函数的函数名()22C/C+C/C+程序设计程序设计【例例5.6】观察下面程序中声明函数与调用点的位置。观察下面程序中声明函数与调用点的位置。#include#includelongfac(intx);/声明函数声明函数fac,形参为形参为int类型,此时函数作用域开始类型,此时函数作用域开始voidma

20、in()intn;printf(inputaninteger:);scanf(%d,&n);if(x0)printf(dataerrorn);elseprintf(%d!=%ld,n,fac(n);inputaninteger:5 5!=120longfac(intx)inti;longy=1;for(i=1;i=x;i+)y=y*i;returny;23C/C+C/C+程序设计程序设计若被调用函数的函数值是整型或字符型,则均可省略上述函若被调用函数的函数值是整型或字符型,则均可省略上述函数声明。数声明。例如,求两个数中的最大数例如,求两个数中的最大数 在函数的外部已做了函数声明,在函数的外部

21、已做了函数声明,则在各个主在各个主调函数中不必函数中不必对所所调用的函数再作声明。用的函数再作声明。例如:例如:float f1(float,float);float f1(float,float);char f2(char);char f2(char);int f3(float);int f3(float);main()main() float f1(float a,float b) float f1(float a,float b) char f2(char c) char f2(char c) int f3(float d) int f3(float d) 在在mainmain中不用中不

22、用对函数函数f1,f2,f3f1,f2,f3进行声明。行声明。 24C/C+C/C+程序设计程序设计(5)函数的调用可以是嵌套的,即在调用一个函数的过程中可以再调用另一函数的调用可以是嵌套的,即在调用一个函数的过程中可以再调用另一个函数。个函数。C语言不允许嵌套定义,但可以嵌套调用。语言不允许嵌套定义,但可以嵌套调用。在主函数中调用其他函数。在主函数中调用其他函数。#include/调用系统函数调用系统函数voidprintstar(void)/用户函数,函数头用户函数,函数头cout*endl;voidprint_message(void)/用户函数,函数头用户函数,函数头coutWelco

23、metoC+!endl;printstar();/调用用户函数调用用户函数intmain(void)printstar();/调用用户函数调用用户函数print_message();/调用用户函数调用用户函数return0;25C/C+C/C+程序设计程序设计【例5.7】 通过函数嵌套调用输出信息。#includevoidstar();/函数声明函数声明voidmessage()/函数声明函数声明voidmain()voidstar();/调用用户函数调用用户函数starmessage();/调用用户函数调用用户函数messagevoidstar()/用户函数,函数头用户函数,函数头print

24、f(*n);voidmessage()/用户函数,函数头用户函数,函数头printf(WelcometoC+!n);star();/在函数执行数过程中调用在函数执行数过程中调用star函数函数26C/C+C/C+程序设计程序设计5.3.2 C+中函数形参默认值 C+中函数在定义时可以预先定义一个默认的形参值。中函数在定义时可以预先定义一个默认的形参值。在函数调用时,如果给出实参,则用实参初始化形参;如在函数调用时,如果给出实参,则用实参初始化形参;如果没有给出实参,就用预先给定的默认值。果没有给出实参,就用预先给定的默认值。【例5.8】 带默认形参值的函数的声明与定义。int add(int

25、a=5,int b=9) /形参a与b的默认值分别为5和9 return a+b; /两数相加void main() add(15,20); /用实参初始化形参,实现15+20 add(15); /形参a用15,b用默认值9,返回值为24 add(); /a、b都用默认值,返回值为14 27C/C+C/C+程序设计程序设计5.4 C+中的函数重载重载重载就是在程序中相同的函数名对应不同的就是在程序中相同的函数名对应不同的函数实现。函数实现。函数重载允许程序内出现多个函数重载允许程序内出现多个名称相同名称相同的函的函数,这些函数可以完成不同的功能,并且带有数,这些函数可以完成不同的功能,并且带有

26、不同不同的类型、不同的形参个数及不同的返回值的类型、不同的形参个数及不同的返回值。使用函数重载,就可以把功能相似的函数名命使用函数重载,就可以把功能相似的函数名命名为一个相同的标识符,使程序结构简单、易懂。名为一个相同的标识符,使程序结构简单、易懂。28C/C+C/C+程序设计程序设计【例5.9】求3个数当中最大数(共考虑3种数据类型,分别是整型、双精度型和长整型)。#includeusingnamespacestd;intmax(inta,intb,intc);/函数声明函数声明doublemax(doublea,doubleb,doublec);/函数声明函数声明longmax(longa

27、,longb,longc);/函数声明函数声明intmain()inti1,i2,i3,i;cini1i2i3;/输入输入3个整数个整数i=max(i1,i2,i3);/求求3个整数中的最大者个整数中的最大者couti_max=id1d2d3;/输入输入3个双精度数个双精度数d=max(d1,d2,d3);/求求3个双精度数中的最大者个双精度数中的最大者coutd_max=dg1g2g3;/输入输入3个长整数个长整数g=max(g1,g2,g3);/求求3个长整数中的最大者个长整数中的最大者coutg_max=ga)a=b;if(ca)a=c;returna;doublemax(doublea

28、,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;31C/C+C/C+程序设计程序设计5.5 函数间的数据传递函数间的函数间的数据传递数据传递是指主调函数向被调函数是指主调函数向被调函数传送数据传送数据及及被调函数向主调函数被调函数向主调函数返回数据返回数据。函数间的数据传递可以通过函数间的数据传递可以通过参数参数(实

29、参实参)、返回值、全局、返回值、全局变量变量来实现。来实现。参数传递数据的参数传递数据的方式方式主要有两种:主要有两种:值传递值传递和和地址传递地址传递传值传值传递的是具体数据;传递的是具体数据;传址是传递的传址是传递的变量(数组元素)或数组变量(数组元素)或数组的地址。的地址。实质上两种方式均为值传递,为实质上两种方式均为值传递,为数值与数值与地址值地址值(地址值地址值)32C/C+C/C+程序设计程序设计5.5.1 值传递方式 值传递方式所传递的是参数值。调用函数时,值传递方式所传递的是参数值。调用函数时,将将实参的值计算出来传递给对应的形参。实参的值计算出来传递给对应的形参。实参对形参的

30、值传递只是实参对形参的值传递只是单向传递,单向传递,不能由形参不能由形参传结实参。传结实参。这是由于这是由于在内存中实参和形参使用的是不同的存在内存中实参和形参使用的是不同的存储单元;储单元;因此,在执行一个被调函数时,形参的值如果发因此,在执行一个被调函数时,形参的值如果发生变化,生变化,并不会改变主调函数的实参值并不会改变主调函数的实参值。33C/C+C/C+程序设计程序设计【例5.10】考察下面的程序,能否通过函数调用实现求变量的相反数。#include main()int x; void opposition(int); scanf(%d,&x); printf(Output befo

31、re calling opposition:x=%dn,x); opposition(x); printf(Output after calling opposition:x=%dn,x);void opposition(int a)a=-a;printf(Output in opposition:a=%d n,a);-2 outputbeforecallingopposition:x=2outputinopposition:a=-2outputaftercallingopposition:x=234C/C+C/C+程序设计程序设计【例5.11】设一维数组存放了10个学生的成绩, 求不及格的人

32、数 int flag(float score) if(score60) return 1; else return 0; main() float score10; int i,num=0; printf(“input 10 scores:n”); for(i=0;i10;i+) scanf(“%f”,&scorei); num+=flag(scorei); /*传递元素*/ printf(“the number of not passed is %d”,num); input10scores:90855045707692698389 thenumberofnotpassedis235C/C+

33、C/C+程序设计程序设计5.5.2 地址传递方式地址传递方式不是传递数据本身,而是数据的地址传递方式不是传递数据本身,而是数据的内内存单元的地址存单元的地址传递给形参(传递给形参(简称传址简称传址););实参和形参共同占用相同的存储单元,因此在实参和形参共同占用相同的存储单元,因此在函数中改变了形参存储单元的值,将会使函数中改变了形参存储单元的值,将会使实参随之实参随之变化变化。可见,可见,在形参和实参为地址传送方式在形参和实参为地址传送方式时,被调时,被调用程序中对形参的操作实际上就是对实参的操作,用程序中对形参的操作实际上就是对实参的操作,间接的实现了数据的双向传递。间接的实现了数据的双向

34、传递。36C/C+C/C+程序设计程序设计【例5.12】数组a中存放了一个学生5门课程的成绩,求平均成绩。float average(float array5) int i; float av,sum=0; for(i=0;i5;i+) sum=sum+arrayi; av=sum/5; return av; main() float score5,av; int i; printf(input 5 scores:n); for(i=0;i5;i+) scanf(%f,&scorei); av=average(score);/*数组首地址数组首地址*/ printf(average score

35、 is %5.2f,av); input 5 scores:84 72 90 87 65 average score is 79.6037C/C+C/C+程序设计程序设计说明:用数组名也可用数组元素地址作函数参数 要求:在主调函数和被调函数分别定义数组 且数组的类型应该一致执行机制:C编译系统只将实参数组的首地址传给形参数组关于形参数组:可以指定大小; float average(float array5)可以不指定大小,另设一个参数传递实参数组的大小;但在定义数组时在数组名空的方括号不可少;这时形参数组可以随实参数组而动态变化。例如38C/C+C/C+程序设计程序设计被调函数中形参数组没有定

36、义大小,由n来接收长度值float average(float array ,int n) int i; float av,sum=0; for(i=0;in;i+) sum=sum+arrayi;av=sum/n;return av;main( ) float score15=84,72,90,87,65; float score210=72,68,93,55,89,75,62,88,95,70; printf(average score1 is %5.2fn,average(score1,5); printf(average score2 is %5.2fn,average(score2,

37、10);例例5.17, 5.1839C/C+C/C+程序设计程序设计5.5.3 返回值方式在调用函数后直接在调用函数后直接返回一个数据返回一个数据到主调函数中到主调函数中.注意下列几点:注意下列几点:1定义函数时,在函数头应给出定义函数时,在函数头应给出“数据类型数据类型”,指,指出该函数返回值的数据类型。出该函数返回值的数据类型。2定义函数时,函数体中应有定义函数时,函数体中应有“return(表达式表达式);”。3传递的数据可以是整型、实型、字符型及结构型传递的数据可以是整型、实型、字符型及结构型等,但不能传整个数组。等,但不能传整个数组。4只能传递只能传递1个数据个数据,而且只能是从被调

38、函数将数,而且只能是从被调函数将数据传给主调函数。据传给主调函数。5当被调用函数的数据类型与函数中当被调用函数的数据类型与函数中return后面表后面表达式的类型不一致时达式的类型不一致时,表达式的值将被自动转换表达式的值将被自动转换成函数的类型后传递给调用函数。成函数的类型后传递给调用函数。40C/C+C/C+程序设计程序设计【例例5.14】调用函数,求两整数之差。调用函数,求两整数之差。#includeintsub(intx,floaty);voidmain()inta,n;floatb;scanf(“%d,%f”,&a,&b);n=sub(a,b);printf(“n=%d”,n);in

39、tsub(intx,floaty)floatz;z=x-y;returnz; 9087.3 运行结果为运行结果为n=241C/C+C/C+程序设计程序设计5.5.4 全局变量传递方式在程序执行的在程序执行的全程有效的变量全程有效的变量称为全局变量(又称称为全局变量(又称外部变量)。外部变量)。作用域:作用域:是从定义处开始到整个程序结束。是从定义处开始到整个程序结束。同时,还可以被任何一个函数使用同时,还可以被任何一个函数使用内存的使用:内存的使用:在整个程序的运行中一直占用着存储在整个程序的运行中一直占用着存储单元。单元。作用:作用:可以利用全局变量在函数间传递数据,使得可以利用全局变量在函

40、数间传递数据,使得通过函数调用得到通过函数调用得到多个返回值多个返回值。42C/C+C/C+程序设计程序设计#include int s1,s2,s3;int vs( int a,int b,int c) int v; v=a*b*c; s1=a*b; s2=b*c; s3=a*c; return v; main() int v,l,w,h; printf(input length,width and height:n); scanf(%d%d%d,&l,&w,&h); v=vs(l,w,h); printf(v=%d s1=%d s2=%d s3=%dn,v,s1,s2,s3); input

41、length,widthandheight:234 v=24s1=6s2=12s3=8【例5.15】输入长方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。 43C/C+C/C+程序设计程序设计【例5.16】外部变量与内部变量同名int a=3,b=5; max(int a,int b) int c; c=ab?a:b; return c; main() int a=8; printf(%d ,max(a,b);运行结果为:运行结果为:8形参形参a、b的作用范围的作用范围局部变量局部变量a的作用范围的作用范围全局变量全局变量a,b的作用范围的作用范围44C/C+C/C+程序设

42、计程序设计说明好处好处: :设全局变量的作用是增加了函数间数据联系的渠道。设全局变量的作用是增加了函数间数据联系的渠道。 缺点缺点: : ( (1)1)利用全局变量实现函数间的数据传递,削弱了函利用全局变量实现函数间的数据传递,削弱了函数的内聚性,从而降低了程序的可靠性和通用性。数的内聚性,从而降低了程序的可靠性和通用性。(2(2)全局变量在程序的全部过程中都占用存储单元。)全局变量在程序的全部过程中都占用存储单元。45C/C+C/C+程序设计程序设计【例例5.17】静态局部变量的使用静态局部变量的使用#includef();voidmain()f();f();f();f()staticint

43、a=1;/变量变量a是静态局部变量,在此函数中有效是静态局部变量,在此函数中有效autointb=0;/变变b是动态变量,在此函数中有效是动态变量,在此函数中有效a=a+1;b=b+1;printf(a=%d,b=%dn,a,b);第几次第几次调用用调用用时初初值调用用结束束时的的值a ab ba ab b第一次第一次第二次第二次第三次第三次1 12 23 30 00 00 02 23 34 41 11 11 146C/C+C/C+程序设计程序设计5.5.5C+中访问全局变量中访问全局变量【例例5.18】作用域操作符的使用。作用域操作符的使用。doubleA;/全局变量全局变量Avoidmai

44、n()()intA;/局部变量局部变量AA=5;/为局部变量为局部变量A赋值赋值:A=2.5;/为全局变量为全局变量A赋值赋值coutAend1;/输出局部变量的值输出局部变量的值5cout:Aend1;/输出局部变量的值输出局部变量的值2.547C/C+C/C+程序设计程序设计5.6 递归调用与递归函数 C语言允许函数进行递归调用。即在语言允许函数进行递归调用。即在调用一个函调用一个函数的过程数的过程中,又出现直接或间接地中,又出现直接或间接地调用该函数本身调用该函数本身。前者称为直接递归,后者称为间接递归。前者称为直接递归,后者称为间接递归。递归调用递归调用的函数称为递归函数。的函数称为递

45、归函数。由于递归非常符合人们的思维习惯,而且许多由于递归非常符合人们的思维习惯,而且许多数学函数、算法或数据结构都是递归定义的,因此数学函数、算法或数据结构都是递归定义的,因此递归调用颇具实用价值。递归调用颇具实用价值。48C/C+C/C+程序设计程序设计 、递归函数的特点递归函数常用于解决那些需要分多次求解,并且每次求解过程基本类似的问题; 递归函数内部对自身的每一次调用都会导致一个与原问题相似而范围要小的新问题; 构造递归函数的关键在于寻找递归算法和终结条件; 终结条件是为了终结函数的递归调用而设置的一个标记; 注意: 递归调用不应也不能无限制的执行下去,所以必须设置一个条件来检验是否需要

46、停止递归函数的调用。终止条件的设置可以通过分析问题的最后一步求解而得到。49C/C+C/C+程序设计程序设计、 递归函数的设计递归问题的一般描述:递归问题的一般描述:用递归函数求用递归函数求n!递归结束的条件:递归结束的条件:f(k)=常量常量递归计算公式:递归计算公式:f(n)=含有含有f(n-1)的表达式的表达式函数递归的函数递归的一般结构一般结构:数据类型数据类型f(n)if(n=k)return(常量常量);elsereturn(f(n-1)的表达式的表达式);50C/C+C/C+程序设计程序设计【例5.19】用递归函数求n!。分析:首先将求n! 的函数拿来用1、如果求n!可以通过求(

47、n-1)!完成、而求(n-1)!必须要求出 (n-2)!,以次类推,直到最后求出1!。这就是递归调用公式;2、那么当n为1时可得出结果就是1,1就是结束条件;有这种规律的计算问题就可以设计递归函数调结构程序51C/C+C/C+程序设计程序设计#include float fac ( int n ) float f ;if ( n 1 ) f = fac ( n - 1) * n ;else if ( n = 0 | n = 1 ) f = 1; else f = -1;return f ;void main ( ) int n ;float y ;printf (Input a integer

48、 number :);scanf ( %d,&n ) ;y = fac ( n );if ( y 0 ) printf ( Error : %d 0, n );else printf ( %d ! = %.ld , n , y ); 52C/C+C/C+程序设计程序设计【例5.20】用递归函数求fibonacci数列的某一项的值。#include int fib(int i) if(i=1&i=2) return 1; else return fib(i-1)+fib(i-2); main() int i; printf(“Input the item of fibonacci:”); sca

49、nf(%d,&i); printf(fib(%d)=%dn,i,fib(i); inputtheitemoffibonacci:10 fib(10)=5553C/C+C/C+程序设计程序设计习题五(5)传值main()main() int a,is_not=10; scanf(%d, int a,is_not=10; scanf(%d,&a&a);); is_not=runnian( is_not=runnian(a a); printf(%d,is_not);); printf(%d,is_not); #include int runnian(int b) int c; if(b%100!=

50、0&b%4=0|b%100=0&b%400!=0) c=1; else c=0; return(c); 54C/C+C/C+程序设计程序设计5.7 内部函数和外部函数语言程序中函数分为两类:语言程序中函数分为两类:即即内部函数内部函数和和外部函数外部函数。它们以是否可以允许其它程序文件调用来区分的。它们以是否可以允许其它程序文件调用来区分的。允许其它程序文件调用的函数称为外部函数;允许其它程序文件调用的函数称为外部函数;不允许其它程序文件调用的函数称为内部函数;不允许其它程序文件调用的函数称为内部函数;55C/C+C/C+程序设计程序设计5.6.1 内部函数一个源文件中定义的函数只能被本文件中

51、的函数调一个源文件中定义的函数只能被本文件中的函数调用,而不能被其它文件中的函数调用,这种函数称用,而不能被其它文件中的函数调用,这种函数称为为内部函数(内部函数(静态函数)静态函数)。使用关键字。使用关键字static定义内定义内部函数,其部函数,其格式为格式为:static数据类型数据类型函数名函数名(形参表形参表);例如:例如:staticintf(inta,intb);内部函数的作用域:内部函数的作用域:内部函数的调用范围只局限于本文件内部函数的调用范围只局限于本文件56C/C+C/C+程序设计程序设计5.6.2 外部函数外部函数是指允许其他文件调用的函数,使用关外部函数是指允许其他文

52、件调用的函数,使用关键字键字extern定义外部函数,其定义外部函数,其格式格式为:为:extern数据类型数据类型函数名函数名(形参表形参表);例如例如:externintf(inta,intb);系统默认:系统默认:如在函数定义中没有说明如在函数定义中没有说明extern或或static则默认为外部函数;则默认为外部函数;在一个源文件的函数中在一个源文件的函数中调用其它源文件中定义的调用其它源文件中定义的外部函数时,外部函数时,应用应用extern说明被调函数为外部函说明被调函数为外部函数。数。57C/C+C/C+程序设计程序设计5.7 函数应用程序举例【例例5.21】编写一个函数,求一个

53、整数的所有正因子。编写一个函数,求一个整数的所有正因子。#includevoidgene(intn)intd;for(d=1;d=n;d+)if(n%d=0)printf(%dn,d);main()intn;printf(Inputintegern:);scanf(%d,&n);if(n=0)printf(mustbepositive!n);elsegene(n);51 13175158C/C+C/C+程序设计程序设计【例5.22】编写一个函数,求一个字符串中英文单词的个数。单词之间用空格符、换行符、跳格符隔开。IamateacherThereare4wordsinthestring.main

54、( )char string81; printf(Input a string:n); gets(string); printf(There are %d words in the string.n,wordnum(string); #include int wordnum(char str )int i,num=1;char ch;for(i=0;(ch=stri)!=0;i+) num+; return num; 59C/C+C/C+程序设计程序设计【例5.23】编写一个函数,用选择法将一维数组排序(数组长度为10,元素由小到大排序)算法分析:每比较一轮,找出一个未经排序数中的最小值,因此

55、共须9轮排序。下面以5个数为例说明选择法排序的步骤。a0 a1 a2 a3 a45 2 9 6 4 未排序时数据排序状态2 5 9 6 4 将5个数的最小值与a0交换后状态2 4 9 6 5 将余下的4个数的最小值与a1交换后状态2 4 5 6 9 将余下的3个数的最小值与a2交换后状态2 4 5 6 9 将余下的2个数的最小值与a4交换后,排序完成60C/C+C/C+程序设计程序设计void sort(int array,int n)int i,j,k,temp;for(i=0;in-1;i+) k=i; /*要放数据的下标,即位置*/ for(j=i+1;jn;j+) if(arrayja

56、rrayk) k=j; temp=arrayk; arrayk=arrayi; arrayi=temp; inputthearray:52964110837thesortedarray:12345678910 main() int a10,i; printf(input the array:n); for(i=0;i10;i+) scanf(%d,&ai); sort(a,10); printf(the sorted array:n); for(i=0;i10;i+) printf(%d , ai);返回返回61C/C+C/C+程序设计程序设计【例5.24】将一个整数(例如:输入54321)倒

57、序输出(打印*是为了开隔两个数字,使得观察清晰)。#includevoidreverse(intn);voidmain()intk;printf(Inputaintegernumber(0):);scanf(%d,&k);reverse(k);voidreverse(intn)printf(%d*,n%10);/输出最右一位输出最右一位if(n/10!=0)reverse(n/10);/求余下数据并递归调用求余下数据并递归调用运行时输入:运行时输入:54321 运行结果:运行结果:1*2*3*4*5*62C/C+C/C+程序设计程序设计【例5.25】编写一个程序,从键盘分别读入一个学生的五科考

58、试成绩,要求输出该学生的总成绩、平均成绩、最高成绩和最低成绩。算法分析:分别设计4个函数用来求totle、average、highest和lowest。在main函数中输入学生的5科成绩,然后依次调用对应的函数,输出结果。63C/C+C/C+程序设计程序设计main()floatscore5;inti;floattotle(floata,intn);floataverage(floata,intn);floathighest(floata,intn);floatlowest(floata,intn);printf(inputscoresofthesubject_1tosubject_5:n);

59、for(i=0;i5;i+)scanf(%f,&scorei);printf(totle=%5.2fn,totle(score,5);printf(average=%5.2fn,average(score,5);printf(highest=%5.2fn,highest(score,5);printf(lowest=%5.2fn,lowest(score,5);64C/C+C/C+程序设计程序设计float totle(float s,int n) int i;float sum=0;for(i=0;in;i+)sum+=si;return sum;float average(float s,

60、int n) return(totle(s,5)/n);float highest(float s,int n) int i; float max=s0; for(i=1;imax) max=si; return max; inputscoresofthesubject_1tosubject_5:7580859095totle=425.00average=85.00highest=95.00lowest=75.00float lowest(float s,int n) int i; float min=s0; for(i=1;in;i+) if(simin) min=si; return min; 65

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

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