计算机二级C语言-第7章函数全解课件_第1页
计算机二级C语言-第7章函数全解课件_第2页
计算机二级C语言-第7章函数全解课件_第3页
计算机二级C语言-第7章函数全解课件_第4页
计算机二级C语言-第7章函数全解课件_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

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

文档简介

第七章函数第七章函数1该章的学习内容学点什么哪?掌握函数原型(prototype)及其,函数定义和函数原型说明的方法及二者的区别。掌握函数的参数传递方式与函数调用方法。理解掌握变量的作用域和存储类的概念。该章的学习内容学点什么哪?掌握函数原型(prototype)21.通过C语言的学习,牢固树立起函数的概念,及其使用规则。2.理解函数的作用域及其存储类及其自动变量与静态局部变量在应用中的区别。*3.在实际应用中,学习和体会采用结构化设计方法(模块化)解决问题的思想。本章的学习难点1.通过C语言的学习,牢固树立起函数的概念,及其使用规则。3本章目录函数1.1.函数有关概念及其分类1.2.函数的定义1.3.函数的返回值1.4.函数的调用与参数传递1.5.函数原型的说明*宏定义变量的作用域和存储类*模块化程序设计方法*应用设计实例多文件方式组织的程序本章目录函数4概述

一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一定的功能。所有的高级语言中都有子程序这个概念,用子程序来实现模块功能。在C语言中,子程序的作用是由函数来完成的。一个C程序可由一个主函数和若干个函数构成。由主函数调用其它函数,其它函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。

概述一个较大的程序一般应分为若干个程序模块,5程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用。要善于用函数,以减少重复编程的工作量。C语言提倡把一个大问题划分成许多个小块,每一小块编制一个函数。这样C程序是由许多小函数而不是由少量大函数构成。这样作的好处:各部分充分独立,任务单一,便于书写和调试。有些小函数还可以作为构件,被别的程序利用。概述程序设计中,常将一些常用的功能模块编写成函数,6C程序工程源程序文件1源程序文件2源程序文件3编译预处理命令全局变量声明函数1函数n…函数首部函数体局部变量声明执行语句C程序的基本结构C程序工程源程序文件1源程序文件2源程序文件3编译预处理命令7mainabcdeifghegh程序中函数调用示意图mainabcdeifghegh程序中函数调用示意图8基本思想:将一个大的程序按功能分割成一些小模块.特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法:

自上向下,逐步分解,分而治之模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块.模块化程序设9C是模块化程序设计语言规则必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束。函数不能嵌套定义,可以嵌套调用C是模块化程序设计语言规则必须有且只能有一个名为main的主10函数的基本概念(1)

project——工程:是由一个或多个C程序源文件组成。一个源程序是由一个或多个函数组成。一个源程序是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。其扩展名为.h或.c。(3)C程序的执行从main()函数开始。没有main()函数的程序,不能执行。调用其他函数后流程回到main函数,在main函数结束整个程序运行。main函数是系统定义的。(4)主函数可以调用任意子函数,而子函数不能调用主函数。

子函数的地位是平等的,相互独立,相互无从属关系,可以相互调用。子函数可以直接或间接地自己调用自己,即递归调用。(2)C语言程序源文件由函数组成函数的概念是C语言结构程序设计思想的体现。主函数:包括一个且仅有一个——main()。其他函数:可以有,也可以没有,可以有一个,也可以有多个。函数的基本概念(1)project——工程:是由一个11使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件标准函数(库函数):由系统提供:printf、scanf、getchar、putchar等用户自定义函数:由用户按需要写的函数。从用户角度看:函数的分类(1)使用库函数应注意:从用户角度看:函数的分类(1)12无参函数:在调用无参函数时,主调函数并不将数据送给被调函数,一般用来执行指定的一组操作。无参函数可以带回或不带回函数值,但一般以不带回函数值居多。有参函数:在调用函数时,在主调函数和被调函数之间有参数传递,也就是说主调函数可以将数据传给被调函数使用,被调用函数中的数据也可以带回来供主调函数使用。从函数的形式看:max(intx,inty){…..}max(){…..}无参函数:在调用无参函数时,主调函数并不将数据送给被调函数13有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。必须在函数定义和函数说明中明确返回值的类型。无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。空类型的说明符为“void”从函数的返回值形式看:intmax(){return表达式;}voidmax(){……..}有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结14函数的定义(1)传统风格函数定义:

类型

函数名(形参表列)形参说明{

说明部分 语句}形参表列是用逗号分隔的形参,形参又称为形式参数、哑元、虚参、虚拟参数。在形参说明中,说明形参表中每个形参的类型。类型:函数类型,用来说明本函数返回值的类型。当函数返回值是整型或不要求返回值时,可省略类型说明。无返回值可用“空类型”—void函数定义时的参数称为行参;函数调用时的参数称为实参。函数的定义(1)传统风格函数定义:形参表列是用逗号分15(2)函数的现代定义方式类型函数名(形参说明表列){说明部分语句}函数体 将形参说明包含到形参列表中,即在列出形参的同时,说明形参类型。形参列表:类型参数1,类型参数2,…,类型参数n传统定义举例现代定义举例intadd(x,y)intadd(intx,inty)intx,y;{……{……}}(2)函数的现代定义方式类型函数名(形参说明表列)函数体161.无参函数类型标识符函数名(){说明部分语句}类型标识符:表示返回值类型7.2.1函数的定义Hello(){printf("Hello,world\n");}例如:定义一个函数说明:这里,只把main改为Hello作为函数名,其余不变。Hello函数是一个无参函数,当被其它函数调用时,输出Helloworld字符串。1.无参函数类型标识符函数名()7.2.1函17类型标识符函数名(形参表列){说明部分语句}2.有参函数例:求二数之最大值

intmax(intx,inty){intz;

z=x>y?x:y;return(z);}注意:出现return,语句,返回值一般与函数类型一致。类型标识符函数名(形参表列)18合法标识符函数返回值类型缺省int型无返回值void函数体函数类型函数名(形参类型说明表){ 说明部分 语句部分}例有参函数(现代风格)intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有参函数(现代风格)intmax(intx,y){intz;z=x>y?x:y;return(z);}例空函数dummy(){}函数体为空例无参函数printstar(){printf(“**********\n”);}或printstar(void){printf(“**********\n”);}合法标识符函数返回值类型函数体函数类型函数名(形参193.可以有“空函数”

类型说明符函数名(){}例如:dummy(){}调用此函数时,什么工作也不做,没有任何实际作用。在主调函数中写上“dummy();”表明“这里要调用一个函数”,而现在这个函数没有起作用,等以后扩充函数功能时补充上。3.可以有“空函数”20函数定义说明(1)一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。(2)一个C程序由一个或多个源程序文件组成。对较大的程序,一般不希望全放在一个文件中,而将函数和其他内容(如预定义)分别放在若干个源文件中,再由若干源文件组成一个C程序。这样可以分别编写、分别编译,提高调度效率。一个源文件可以为多个C程序公用。函数定义说明(1)一个源程序文件由一个或多个函数组成。一个21函数定义说明(3)C程序的执行从main函数开始,调用其他函数后流程回到main函数,在main函数中结束整个程序的运行。main函数是系统定义的。(4)所有函数都是平行的,即在定义函数时是互相独立的,一个函数并不从属于另一函数,即函数不能嵌套定义,函数间可以互相调用,但不能调用main函数。函数定义说明(3)C程序的执行从main函数开始,调用其他22程序举例1定义求两个整数和的函数。intadd(intx,inty){intz;z=x+y;return(z);}程序举例1定义求两个整数和的函数。intadd(int23intmax(intx1,intx2,intx3){intmax;if(x1>x2)max=x1;elsemax=x2;if(max<x3)max=x3;

return(max);

}

编写函数,求三个整型参数的最大值。

程序举例2/*定义函数的返回值类型,函数名,形参*//*通过比较得到三个数的最大值放到max中*//*返回运算结果*/intmax(intx1,intx2,intx3)编24函数的返回值功能将被调函数中的结果值返回给主调函数。语句return(返回值表达式)或return表达式;或return;举例intadd(intx,inty){intz;z=x+y;return(z);}函数的返回值功能将被调函数中的结果值返回给主调函数。语句re25

(1)函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个确定值带回主调函数中去。如果需要从被调用函数带回一个函数值(供主调函数使用),被调用函数中必须包含return语句。如果不需要从被调用函数带回函数值,可以不要return语句。一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句起作用。return语句后面的括弧也可以不要,如returnz;它与“return(z);”等价。说明:说明:26例如,max(intx,inty){intz;z=x>y?x∶y;return(z);}

函数max可以改写如下:max(intx,inty){return(x>y?x∶y);}(2)return后面的值可以是一个表达式这样的函数体更为简短,只用一个return语句就把求值和返回都解决了。例如,函数max可以改写如下:(2)return后面的值可27(3)函数值的类型。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。C语言规定,凡不加类型说明的函数,一律自动按整型处理。

在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致。例如,例2中用隐含方式指定max函数值为整型,而变量z也被指定为整型,通过return语句把z的值作为max的函数值,由max带回主调函数。z的类型与max函数的类型是一致的,是正确的。(4)若无return语句,遇到函数结束的“}”时,自动返回调用函数(3)函数值的类型。既然函数有返回值,这个值当然应属于某一28

(5)如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。main(){floata,b;intc;scanf(“%f,%f,”&a,&b); max(floatx,floaty);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;/*z为实型变量*/z=x>y?x∶y;return(z);}运行情况如下:1.5,2.5Maxis2(5)如果函数值的类型和return语句29printstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}(6)无返回值的函数返回后带回不确定值输出:10voidprintstar(){printf("**********");}main(){inta;

a=printstar();printf("%d",a);}编译错误!printstar()(6)无返回值的函数返回后带回不确定30程序举例2下面add函数的功能是求两个参数的和,并将和值返回调用函数。函数中的错误是:voidadd(floata,floatb) {floatc;c=a+b;returnc;}voidadd(floata,floatb)floatadd(floata,floatb)程序举例2下面add函数的功能是求两个参数的和,并将317.3函数的调用函数调用的一般形式为

函数名(实参表列);

如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略。如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一一传递数据。7.3函数的调用函数调用的一般形式为32函数调用方式调用方式函数调用语句函数表达式函数参数print_star(n);voidprint_star(intn){inti;for(i=1;i<=n;i++)printf("*");}x=max(a,b)+5;x=max(max(a,b),c);函数调用方式调用方式函数调用语句函数表达式函数参数prin33

1.函数语句把函数调用作为一个语句。如hello();这时不要求函数带回值,只要求函数完成一定的操作。2.函数表达式函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:c=2*max(a,b);函数max是表达式的一部分,它的值乘2再赋给c。3.函数参数函数调用作为一个函数的实参。例如:m=max(a,max(b,c));其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参。m的值是a、b、c三者最大的。又如:printf(“%d”,max(a,b));也是把max(a,b)作为printf函数的一个参数。1.函数语句34调用函数的过程是:①为函数的所有形参分配内存单元。②计算各个实参表达式的值,一一对应的赋值给相应形参(若是无参函数,上述过程不执行)。③进入函数体,执行函数中的语句,实现函数的功能。④执行到return语句时,计算return语句中表达式的值(若是无返回值函数,本项不做),返回到主调函数。⑤释放形参及本函数内的局部变量所占内存,继续执行主调函数中的后继语句。调用函数的过程是:35形式参数和实际参数在调用函数时,大多数情况下,主调函数和被调用函数之间有数据传递关系。这就是前面提到的有参函数。前面已提到:在定义函数时函数名后面括弧中的变量名称为“形式参数”(简称“形参”),在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数”(简称“实参”)。形式参数和实际参数在调用函数时,大多数情36参数传递主调函数向被调函数传值的方式:赋值调用

把实参的值赋给形参。赋地址调用

把实参的地址付给形参。在被调函数中,用该地址访问主调函数中的实参。实参形参调用返回单向值传递参数传递主调函数向被调函数传值的方式:赋值调用实参形参调用返37C语言中,函数调用是值传递方式,即函数的实际参数和形式参数之间的数据传递方向是单向的,只能由实际参数传递给形式参数,而不能由形式参数传递给实际参数,是实际参数向形式参数单向赋值的关系。在内存中,形式参数与实际参数占用不同的内存单元。当调用函数时,给形式参数分配内存单元,将实际参数的值赋值给形式参数,调用后,形式参数单元释放,实际参数仍保留调用前的值,形式参数值的变化不影响实际参数。函数参数及其传递方式C语言中,函数调用是值传递方式,即函数的实际参数和形式参数之38调用结束:35a:b:例5.6交换两个数#include<stdio.h>main(){inta=3,b=5;printf(“a=%d,\tb=%d\n",a,b);printf("swapped:\n");

swap(a,b);printf(“a=%d,\tb=%d\n",a,b);}swap(intx,inty){inttemp;temp=x;x=y;y=temp;}35a:b:调用前:调用35x:y:35a:b:swap:temp35a:b:x:35y:353temp=xx=yy=temp调用结束:35a:b:例5.6交换两个数35a:b:39程序举例分析一下程序,写出运行结果。#include<stdio.h>main(){inta=5,b=10;printf("a=%d,b=%d\n",a,b);fun(a,b); /*函数调用*/printf("a=%d,b=%d\n",a,b);}intfun(intx,inty)/*现代风格函数定义*/{x=3;y=3;return;}a=5,b=10a=5,b=10程序举例分析一下程序,写出运行结果。#include<s40

main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf(“Maxis%d",c);}max(intx,inty)/*定义有参函数max*/{intz;z=x>y?x∶y;return(z);}运行情况如下:7,8Maxis8形参实参c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=x>y?x:y;return(z);}程序举例形参实参c=max(a,b);(main函数)(max函41说明:实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换———函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放说明:42例计算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.728程序举例例计算x的立方#include<stdio.h>xap43在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢?(1)首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。(2)如果使用库函数,一般还应该在本文件开头用#include命令将调用有关库函数时所需用到的信息“包含”到本文件中来。例如,#include<stdio.h>其中“stdio.h”是一个“头文件”。在stdio.h文件中放了输入输出库函数所用到的一些宏定义信息。如果不包含“stdio.h”文件中的信息,就无法使用输入输出库中的函数。在一个函数中调用另一函数(即被调用函数)44(3)如果使用用户自己定义的函数,而且该函数与调用它的函数(即主调函数)在同一个文件中,一般还应该在主调函数中对被调用的函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。例:对被调用的函数作声明。floatadd(floatx,floaty);/*对被调用函数的声明*/main(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty)/*函数首部*/{floatz;/*函数体*/z=x+y;return(z);}

(3)如果使用用户自己定义的函数,而且该45注意:对函数的“定义”和“声明”不是一回事。“定义”是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。

“声明”的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)。从程序中可以看到对函数的声明与函数定义中的第1行(函数首部)基本上是相同的。因此可以简单地照写已定义的函数的首部,再加一个分号,就成为了对函数的“声明”。其实,在函数声明中也可以不写形参名,而只写形参的类型。如:floatadd(float,float);

注意:对函数的“定义”和“声明”不是一回事。46

函数声明又称为函数原型(functionprototype)。作用:主要是利用它在程序的编译阶段对调用函数的合法性进行全面检查。函数原型的一般形式为(1)函数类型函数名(参数类型1,参数类型2……);(2)函数类型函数名(参数类型1参数名1,参数类型2参数名2……);例如:(1)floatadd(float,float);(2)floatadd(floatx,floaty);函数声明函数声明又称为函数原型(functionprotot47说明:(1)实际上,如果在函数调用之前,没有对函数作声明,则编译系统会把笫一次遇到的该函数形式(函数定义或函数调用)作为函数的声明,并将函数类型默认为int型。使用这种方法时,系统无法对参数的类型做检查。若调用函数时参数使用不当,在编译时也不会报错。因此,为了程序清晰和安全,建议都加以声明为好。(2)如果被调用函数的定义出现在主调函数之前,可以不必加以声明。因为编译系统已经先知道了已定义的函数类型,会根据函数首部提供的信息对函数的调用作正确性检查。(3)如果被调用函数的定义出现在主调函数之后,必须加以声明。因为编译系统不知道此函数的存在。说明:48例函数说明举例main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函数可不作函数说明/*ch7_5.c*/floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}被调函数出现在主调函数之前,不必函数说明/**/main(){floatadd(float,float);/*functiondeclaration*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}floatadd();例函数说明举例main()int型函数可不作函数说明/*49对于函数的位置:对于非int函数,调用单位的位置要在被调用单位在下面,否则编译产生错误。解决方法是:在调用单位加上被调用函数的声(说)明。voidf(){…}main(){…f();…}voidf(){…}main(){…f();…}voidf(){…}main(){voidf();…f();…}对于函数的位置:voidf()main()void50程序举例4输入两个整数,求其中最大者并打印。#include<stdio.h>main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b); /*函数调用*/printf("max=%d",c);}intmax(intx,inty)/*现代风格函数定义*/{return();}x>y?x:y程序举例4输入两个整数,求其中最大者并打印。#include51第七章函数第七章函数52该章的学习内容学点什么哪?掌握函数原型(prototype)及其,函数定义和函数原型说明的方法及二者的区别。掌握函数的参数传递方式与函数调用方法。理解掌握变量的作用域和存储类的概念。该章的学习内容学点什么哪?掌握函数原型(prototype)531.通过C语言的学习,牢固树立起函数的概念,及其使用规则。2.理解函数的作用域及其存储类及其自动变量与静态局部变量在应用中的区别。*3.在实际应用中,学习和体会采用结构化设计方法(模块化)解决问题的思想。本章的学习难点1.通过C语言的学习,牢固树立起函数的概念,及其使用规则。54本章目录函数1.1.函数有关概念及其分类1.2.函数的定义1.3.函数的返回值1.4.函数的调用与参数传递1.5.函数原型的说明*宏定义变量的作用域和存储类*模块化程序设计方法*应用设计实例多文件方式组织的程序本章目录函数55概述

一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一定的功能。所有的高级语言中都有子程序这个概念,用子程序来实现模块功能。在C语言中,子程序的作用是由函数来完成的。一个C程序可由一个主函数和若干个函数构成。由主函数调用其它函数,其它函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。

概述一个较大的程序一般应分为若干个程序模块,56程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用。要善于用函数,以减少重复编程的工作量。C语言提倡把一个大问题划分成许多个小块,每一小块编制一个函数。这样C程序是由许多小函数而不是由少量大函数构成。这样作的好处:各部分充分独立,任务单一,便于书写和调试。有些小函数还可以作为构件,被别的程序利用。概述程序设计中,常将一些常用的功能模块编写成函数,57C程序工程源程序文件1源程序文件2源程序文件3编译预处理命令全局变量声明函数1函数n…函数首部函数体局部变量声明执行语句C程序的基本结构C程序工程源程序文件1源程序文件2源程序文件3编译预处理命令58mainabcdeifghegh程序中函数调用示意图mainabcdeifghegh程序中函数调用示意图59基本思想:将一个大的程序按功能分割成一些小模块.特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法:

自上向下,逐步分解,分而治之模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块.模块化程序设60C是模块化程序设计语言规则必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束。函数不能嵌套定义,可以嵌套调用C是模块化程序设计语言规则必须有且只能有一个名为main的主61函数的基本概念(1)

project——工程:是由一个或多个C程序源文件组成。一个源程序是由一个或多个函数组成。一个源程序是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。其扩展名为.h或.c。(3)C程序的执行从main()函数开始。没有main()函数的程序,不能执行。调用其他函数后流程回到main函数,在main函数结束整个程序运行。main函数是系统定义的。(4)主函数可以调用任意子函数,而子函数不能调用主函数。

子函数的地位是平等的,相互独立,相互无从属关系,可以相互调用。子函数可以直接或间接地自己调用自己,即递归调用。(2)C语言程序源文件由函数组成函数的概念是C语言结构程序设计思想的体现。主函数:包括一个且仅有一个——main()。其他函数:可以有,也可以没有,可以有一个,也可以有多个。函数的基本概念(1)project——工程:是由一个62使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件标准函数(库函数):由系统提供:printf、scanf、getchar、putchar等用户自定义函数:由用户按需要写的函数。从用户角度看:函数的分类(1)使用库函数应注意:从用户角度看:函数的分类(1)63无参函数:在调用无参函数时,主调函数并不将数据送给被调函数,一般用来执行指定的一组操作。无参函数可以带回或不带回函数值,但一般以不带回函数值居多。有参函数:在调用函数时,在主调函数和被调函数之间有参数传递,也就是说主调函数可以将数据传给被调函数使用,被调用函数中的数据也可以带回来供主调函数使用。从函数的形式看:max(intx,inty){…..}max(){…..}无参函数:在调用无参函数时,主调函数并不将数据送给被调函数64有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。必须在函数定义和函数说明中明确返回值的类型。无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。空类型的说明符为“void”从函数的返回值形式看:intmax(){return表达式;}voidmax(){……..}有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结65函数的定义(1)传统风格函数定义:

类型

函数名(形参表列)形参说明{

说明部分 语句}形参表列是用逗号分隔的形参,形参又称为形式参数、哑元、虚参、虚拟参数。在形参说明中,说明形参表中每个形参的类型。类型:函数类型,用来说明本函数返回值的类型。当函数返回值是整型或不要求返回值时,可省略类型说明。无返回值可用“空类型”—void函数定义时的参数称为行参;函数调用时的参数称为实参。函数的定义(1)传统风格函数定义:形参表列是用逗号分66(2)函数的现代定义方式类型函数名(形参说明表列){说明部分语句}函数体 将形参说明包含到形参列表中,即在列出形参的同时,说明形参类型。形参列表:类型参数1,类型参数2,…,类型参数n传统定义举例现代定义举例intadd(x,y)intadd(intx,inty)intx,y;{……{……}}(2)函数的现代定义方式类型函数名(形参说明表列)函数体671.无参函数类型标识符函数名(){说明部分语句}类型标识符:表示返回值类型7.2.1函数的定义Hello(){printf("Hello,world\n");}例如:定义一个函数说明:这里,只把main改为Hello作为函数名,其余不变。Hello函数是一个无参函数,当被其它函数调用时,输出Helloworld字符串。1.无参函数类型标识符函数名()7.2.1函68类型标识符函数名(形参表列){说明部分语句}2.有参函数例:求二数之最大值

intmax(intx,inty){intz;

z=x>y?x:y;return(z);}注意:出现return,语句,返回值一般与函数类型一致。类型标识符函数名(形参表列)69合法标识符函数返回值类型缺省int型无返回值void函数体函数类型函数名(形参类型说明表){ 说明部分 语句部分}例有参函数(现代风格)intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有参函数(现代风格)intmax(intx,y){intz;z=x>y?x:y;return(z);}例空函数dummy(){}函数体为空例无参函数printstar(){printf(“**********\n”);}或printstar(void){printf(“**********\n”);}合法标识符函数返回值类型函数体函数类型函数名(形参703.可以有“空函数”

类型说明符函数名(){}例如:dummy(){}调用此函数时,什么工作也不做,没有任何实际作用。在主调函数中写上“dummy();”表明“这里要调用一个函数”,而现在这个函数没有起作用,等以后扩充函数功能时补充上。3.可以有“空函数”71函数定义说明(1)一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。(2)一个C程序由一个或多个源程序文件组成。对较大的程序,一般不希望全放在一个文件中,而将函数和其他内容(如预定义)分别放在若干个源文件中,再由若干源文件组成一个C程序。这样可以分别编写、分别编译,提高调度效率。一个源文件可以为多个C程序公用。函数定义说明(1)一个源程序文件由一个或多个函数组成。一个72函数定义说明(3)C程序的执行从main函数开始,调用其他函数后流程回到main函数,在main函数中结束整个程序的运行。main函数是系统定义的。(4)所有函数都是平行的,即在定义函数时是互相独立的,一个函数并不从属于另一函数,即函数不能嵌套定义,函数间可以互相调用,但不能调用main函数。函数定义说明(3)C程序的执行从main函数开始,调用其他73程序举例1定义求两个整数和的函数。intadd(intx,inty){intz;z=x+y;return(z);}程序举例1定义求两个整数和的函数。intadd(int74intmax(intx1,intx2,intx3){intmax;if(x1>x2)max=x1;elsemax=x2;if(max<x3)max=x3;

return(max);

}

编写函数,求三个整型参数的最大值。

程序举例2/*定义函数的返回值类型,函数名,形参*//*通过比较得到三个数的最大值放到max中*//*返回运算结果*/intmax(intx1,intx2,intx3)编75函数的返回值功能将被调函数中的结果值返回给主调函数。语句return(返回值表达式)或return表达式;或return;举例intadd(intx,inty){intz;z=x+y;return(z);}函数的返回值功能将被调函数中的结果值返回给主调函数。语句re76

(1)函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个确定值带回主调函数中去。如果需要从被调用函数带回一个函数值(供主调函数使用),被调用函数中必须包含return语句。如果不需要从被调用函数带回函数值,可以不要return语句。一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句起作用。return语句后面的括弧也可以不要,如returnz;它与“return(z);”等价。说明:说明:77例如,max(intx,inty){intz;z=x>y?x∶y;return(z);}

函数max可以改写如下:max(intx,inty){return(x>y?x∶y);}(2)return后面的值可以是一个表达式这样的函数体更为简短,只用一个return语句就把求值和返回都解决了。例如,函数max可以改写如下:(2)return后面的值可78(3)函数值的类型。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。C语言规定,凡不加类型说明的函数,一律自动按整型处理。

在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致。例如,例2中用隐含方式指定max函数值为整型,而变量z也被指定为整型,通过return语句把z的值作为max的函数值,由max带回主调函数。z的类型与max函数的类型是一致的,是正确的。(4)若无return语句,遇到函数结束的“}”时,自动返回调用函数(3)函数值的类型。既然函数有返回值,这个值当然应属于某一79

(5)如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。main(){floata,b;intc;scanf(“%f,%f,”&a,&b); max(floatx,floaty);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;/*z为实型变量*/z=x>y?x∶y;return(z);}运行情况如下:1.5,2.5Maxis2(5)如果函数值的类型和return语句80printstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}(6)无返回值的函数返回后带回不确定值输出:10voidprintstar(){printf("**********");}main(){inta;

a=printstar();printf("%d",a);}编译错误!printstar()(6)无返回值的函数返回后带回不确定81程序举例2下面add函数的功能是求两个参数的和,并将和值返回调用函数。函数中的错误是:voidadd(floata,floatb) {floatc;c=a+b;returnc;}voidadd(floata,floatb)floatadd(floata,floatb)程序举例2下面add函数的功能是求两个参数的和,并将827.3函数的调用函数调用的一般形式为

函数名(实参表列);

如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略。如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一一传递数据。7.3函数的调用函数调用的一般形式为83函数调用方式调用方式函数调用语句函数表达式函数参数print_star(n);voidprint_star(intn){inti;for(i=1;i<=n;i++)printf("*");}x=max(a,b)+5;x=max(max(a,b),c);函数调用方式调用方式函数调用语句函数表达式函数参数prin84

1.函数语句把函数调用作为一个语句。如hello();这时不要求函数带回值,只要求函数完成一定的操作。2.函数表达式函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:c=2*max(a,b);函数max是表达式的一部分,它的值乘2再赋给c。3.函数参数函数调用作为一个函数的实参。例如:m=max(a,max(b,c));其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参。m的值是a、b、c三者最大的。又如:printf(“%d”,max(a,b));也是把max(a,b)作为printf函数的一个参数。1.函数语句85调用函数的过程是:①为函数的所有形参分配内存单元。②计算各个实参表达式的值,一一对应的赋值给相应形参(若是无参函数,上述过程不执行)。③进入函数体,执行函数中的语句,实现函数的功能。④执行到return语句时,计算return语句中表达式的值(若是无返回值函数,本项不做),返回到主调函数。⑤释放形参及本函数内的局部变量所占内存,继续执行主调函数中的后继语句。调用函数的过程是:86形式参数和实际参数在调用函数时,大多数情况下,主调函数和被调用函数之间有数据传递关系。这就是前面提到的有参函数。前面已提到:在定义函数时函数名后面括弧中的变量名称为“形式参数”(简称“形参”),在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数”(简称“实参”)。形式参数和实际参数在调用函数时,大多数情87参数传递主调函数向被调函数传值的方式:赋值调用

把实参的值赋给形参。赋地址调用

把实参的地址付给形参。在被调函数中,用该地址访问主调函数中的实参。实参形参调用返回单向值传递参数传递主调函数向被调函数传值的方式:赋值调用实参形参调用返88C语言中,函数调用是值传递方式,即函数的实际参数和形式参数之间的数据传递方向是单向的,只能由实际参数传递给形式参数,而不能由形式参数传递给实际参数,是实际参数向形式参数单向赋值的关系。在内存中,形式参数与实际参数占用不同的内存单元。当调用函数时,给形式参数分配内存单元,将实际参数的值赋值给形式参数,调用后,形式参数单元释放,实际参数仍保留调用前的值,形式参数值的变化不影响实际参数。函数参数及其传递方式C语言中,函数调用是值传递方式,即函数的实际参数和形式参数之89调用结束:35a:b:例5.6交换两个数#include<stdio.h>main(){inta=3,b=5;printf(“a=%d,\tb=%d\n",a,b);printf("swapped:\n");

swap(a,b);printf(“a=%d,\tb=%d\n",a,b);}swap(intx,inty){inttemp;temp=x;x=y;y=temp;}35a:b:调用前:调用35x:y:35a:b:swap:temp35a:b:x:35y:353temp=xx=yy=temp调用结束:35a:b:例5.6交换两个数35a:b:90程序举例分析一下程序,写出运行结果。#include<stdio.h>main(){inta=5,b=10;printf("a=%d,b=%d\n",a,b);fun(a,b); /*函数调用*/printf("a=%d,b=%d\n",a,b);}intfun(intx,inty)/*现代风格函数定义*/{x=3;y=3;return;}a=5,b=10a=5,b=10程序举例分析一下程序,写出运行结果。#include<s91

main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf(“Maxis%d",c);}max(intx,inty)/*定义有参函数max*/{intz;z=x>y?x∶y;return(z);}运行情况如下:7,8Maxis8形参实参c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=x>y?x:y;return(z);}程序举例形参实参c=max(a,b);(main函数)(max函92说明:实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换———函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放说明:93例计算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.728程序举例例计算x的立方#include<stdio.h>xap94在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢?(1)首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。(2)如果使用库函数,一般还应该在本文件开头用#include命令将调用有关库函数时所需用到的信息“包含”到本文件中来。例如,#include<stdio.h>其中“stdio.h”是一个“头文件”。在stdio.h文件中放了输入输出库函数所用到的一些宏定义信息。如果不包含“stdio.h”文件中的信息,就无法使用输入输出库中的函数。在一个函数中调用另一函数(即被调用函数)95(3)如果使用用户自己定义的函数,而且该函数与调用它的函数(即主调函数)在同

温馨提示

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

最新文档

评论

0/150

提交评论