函数与程序结构

上传人:go****ng 文档编号:244991820 上传时间:2024-10-06 格式:PPT 页数:45 大小:258.63KB
返回 下载 相关 举报
函数与程序结构_第1页
第1页 / 共45页
函数与程序结构_第2页
第2页 / 共45页
函数与程序结构_第3页
第3页 / 共45页
点击查看更多>>
资源描述
,VB.NET 程序设计技术,C语言程序设计,第5章 函数与程序结构,本章要点,1.C程序的一般结构,函数的定义方法及函数的类型和返回值。,2.函数实参与形参的对应关系,以及参数传递的方式。,3.函数的正确调用,嵌套与递归调用。,4.局部变量和全局变量的概念和使用方法。,5.变量的存储类别(自动、静态、寄存器、外部)、变量的作用域和生存期。,6.宏定义及文件包含处理的方法。,本章难点,1.函数参数的传递。,2.函数递归调用的执行过程。,3.变量的作用域和生存期。,5.1 C程序的一般结构,5.1.1 模块化程序设计,自顶向下,逐步细化,5.1.2 C程序的一般结构,函数是构成C语言程序的基本功能模块,是一段程序,它完成一项相对独立的任务。,一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能。在c语言中,用函数来实现模块的功能。一个c程序由,一个主函数,和若干个函数组成,由主函数调用其他函数,其他函数之间也可以相互调用。同一个函数可以被一个或多个函数调用任意多次。,特点:,一个源文件程序由一个或多个函数以及其他有关内容(如命令行、数据定义等)组成。,一个c程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。,C程序的执行总是从主函数开始,又从主函数结束,其他函数只有通过调用关系发生作用。,一个c程序有且仅有一个主函数main()。,所有的函数在定义时是相互独立的,一个函数并不从属于另一函数,即函数不能嵌套定义,不过函数之间可以相互调用,但不能调用main函数。,不同源文件的组装可以通过工程文件实现。,函数的分类,1.从用户使用的角度看,函数有两种:,(1)标准函数,即库函数,这是由系统提供的,用户不必自己定义这些函数,可以直接使用它们。应该说明,每个系统提供的库函数的数量和功能不同,当然有一些基本的函数是共同的。,(2)用户自己定义的函数,用以解决用户的专门需要。,2.从函数的形式看,函数分两类:,(1)无参函数,在调用无参函数时,主调函数并不将数据传送给被调用函数,一般用来执行指定的一组操作。无参函数可以带回或不带回函数值,但一般以不带回函数值的居多。,(2)有参函数,在调用函数时,在主调函数和被调用函数之间有参数传递,也就是说,主调函数可以将数据传给被调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。,【例5.1】一个函数简单应用的例子。,void main(),void p_star();/*说明p_star函数*/,void p_message();/*说明p_message函数*/,p_star();/*调用p_staar函数*/,p_message();/*调用p_message函数*/,p_star();/*调用p_star函数*/,void p_star()/*定义p_star函数*/,printf(*n);,void p_message()/*定义p_message函数*/,printf(Good morning!n);,5.2 函数的定义与调用,5.2.1 函数的定义,正如变量使用前应先定义一样,函数也应该先定义后使用。函数定义后,这个函数才存在,然后才能调用它。,1.函数定义的一般形式,(1)无参函数的定义,其定义形式如下:,类型标识符 函数名(),说明部分,语句部分,说明:其中的类型标识符用于指定函数值的类型;若函数无返回值,应用void说明。,函数名的命名方法与标识符相同,不能和关键字、库函数名等同名,函数名后的圆括号是函数的象征,不能省略。(,在函数定义时,圆括号后无分号),例:void p_star(),printf(*n);,说明:其中的void在TC中可以省掉。,p_message(),printf(Good morning!n);,(2)有参函数的定义,其定义形式为:,类型标识符 函数名(形式参数说明表),说明部分,语句部分,说明:,对于有参函数,函数的参数是主调函数和被调用函数的数据通道。参数可分为形式参数(,形参,)和实际参数(,实参,)两种。,例如:,int max(int x,int y)/*形式参数说明*/,int z;/*函数体中的说明部分*/,z=xy?x:y;,return(z);,main(),int a=3,b=4;,printf(“%d”,max(a,b);,return语句的作用是将z的值作为函数值带回到主调函数中。return后面的括弧中的值作为函数带回的值(或称函数返回值)。,在一个函数的函数体内,不能再定义另一个函数,即函数不能嵌套定义。,形参:定义函数时的参数,实参:调 用函数时的参数,例编写一个通用过程(函数或子程序),该过程可以实现判断一个整数是否为素数。编写主程序调用该过程,统计所有三位数中素数的个数。,int ss(int n),int flag,i;,flag=1;,for(i=2;i=n-1;i+),if(n%i=0),flag=0;,break;,return flag;,main(),int gs,i;,gs=0;,for(i=100;i=999;i+),if(ss(i),gs+;,printf(gs=%d,gs);,2.函数的返回值,函数的数据类型就是函数返回值的类型,称为函数类型。,(1)函数的返回值通过函数中的返回语句return将被调用函数中的一个确定的值带回到主调函数中去。,return语句的用法如下:,return(表达式);,return 表达式;,return;,return语句的作用:,使程序控制从被调用函数返回到主调函数中,同时把返回值带给主调函数;释放在函数的执行过程中分配的所有内存空间。,【例5.2】在屏幕上显示计算结果时,有时会因为显示的速度太快,还没有看清楚结果,屏幕上的内容就已经滚出屏幕。为了解决这个问题,可以让屏幕每显示一定的行数后就自动暂停一个,待用户看清屏幕后按键盘上的任意键后。屏幕会继续显示以后的计算结果。,#include,#include,/*显示数字1到100,每显示20行时暂停一次*/,void pause(void)/*函数定义,函数形式参数为空*/,getchar();,void main(),int i,j=0;,for(i=1;i=100;i+),printf(%dn,i);,if(+j=20),j=0;,pause();,5.2.2 函数的调用,一般形式为:,函数名(实参表列);,说明:,(1)调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致。,(2)实际参数表中的参数(简称实参),可以是常数、变量或表达式。如果实参不止1个,则相邻实参之间用逗号分隔。,(3)实参的个数、类型和顺序,应该与被调用函数所要求的参数个数、类型和顺序一致,才能正确地进行数据传递。,(4)对实参表求值的顺序并不是确定的,有的系统按自左至右顺序求实参的值,有的系统则按自右至左顺序。,Turbo C规定是自右至左顺序求值。,main(),int i=2;,printf(“%d%d%d”,,,+i,+i,+i,),;,输出为:,5 4 3,为了避免这种影响,可以用:,main(),int i=2,j,k,a;,j=+i;,k=+i;,a=+i;,printf(“%d%d%d”,,,j,k,a,),;,按照函数在程序中出现的位置划分,调用函数方式有以下3种:,(1)函数语句,C语言中的函数可以只进行某些操作而不返回函数值,这时的函数调用作为一条独立的语句。如例8.1中的,p_star();,(2)函数表达式,函数作为表达式的一项,出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如,m=5*max(a,b);,(3)函数实参,函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。,printf(%d,max(a,b);,函数调用的执行过程,main(),int,n;,scanf(“%d“,if(ss(i),printf(“yes);,else,printf(“no);,int ss(int n),int flag,i;,flag=1;,for(i=2;i=n-1;i+),if(n%i=0),flag=0;,break;,return flag;,1,2,3,4,5,其中的,2,称为,函数调用,;,4,称为,函数返回,。,2.对被调用函数的说明和函数原型,在调用自定义函数之前,应对该函数(称为被调用函数)进行说明,其般格式如下:,函数类型 函数名(数据类型1 参数名1,数据类型2 参数名2);,语言同时又规定,在以下两种情况下,可以省去对被调用函数的说明。,(1)函数的返回值是整型或字符型,可以不必进行说明,系统对它们自动按整型说明。但为清晰起见,建议都加以说明为好。,(2)被调用函数的函数定义出现在调用函数之前时。因为在调用之前,编译系统已经知道了被调用函数的函数类型、参数个数、类型和顺序。,所以,养成这样的习惯:,先定义子函数,最后写主函数。这样的话,可以省掉所有的函数说明。,注意:函数的“定义”和“说明”是两个不同的内容。,“定义”是指对函数功能的确立,包括指定函数名,函数返回值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。在一个程序中,一个函数只能被定义一次,而且是在其他任何函数之外进行。,而“说明”(有的书上也称为“声明”)则是把函数的名称、函数返回值的类型、参数的个数、类型和顺序通知编译系统,以便在调用该函数时系统对函数名称正确与否、参数的类型、数量及顺序是否一致等进行对照检查。在一个程序中,除上述可以缺省函数说明的情况外,所有调用函数都必须对被调用函数进行说明,而且是在调用函数的函数体内进行。,对库函数的调用不需要再作说明,但必须把该函数的头文件用#include命令包含在源文件前部。,5.2.3 函数的参数传递,在调用函数时,大多数情况下,主调函数和被调用函数之间有数据传递关系。,形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。,实参出现在主调函数中,进入被调函数后,实参变量也不能使用。,发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。,在c语言中,实参向形参传送数据的方式是“值传递”。,值传递的优点就在于:被调用的函数不可能改变调用函数中变量的值,而只能改变它的局部的临时副本。这样就可以避免被调用函数的操作对调用函数中的变量可能产生的副作用。,调用过程如下:,(1)给形参分配内存空间;,(2)将实参a的值传递给形参;,(3)执行函数体。给函数体内的变量分配存储空间,执行算法实现部分,函数返回的过程如下:,将返回值返回主函数,,释放函数调用过程中分配的所有内存空间,,结束函数调用,将流程控制权交给主调函数。,举例说明:本讲义17页的例子。,5.3 局部变量与全局变,变量的作用域:变量有效性的范围称变量的作用域。,语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。,5.3.1 局部变量,在一个函数或复合语句内定义的变量,称为局部变量,局部变量也称为内部变量。,局部变量仅在定义它的函数或复合语句内有效。,编译时,编译系统不为局部变量分配内存单元,而是在程序的运行中,当局部变量所在的函数被调用时,编译系统根据需要临时分配内存,函数调用结束,局部变量的空间被释放。,对局部变量的说明:,(1)主函数中定义的变量只能在主函数中使用,不能在其它函数中使用。,(2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。,(3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。例如,形参和实参的变量名都为n,是完全允许的。,(4)在复合语句中也可定义变量,其作用域只在复合语句范围内。,5.3.2 全局变量,全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序文
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!