您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > C语言程序设计 第七章函数
第7章函数模块化程序设计•基本思想:将大的程序按功能分割成一些小模块,•特点:–各模块相对独立、功能单一、结构清晰简单–控制了程序设计的复杂性–每个模块简单,所以可靠性高–避免程序开发的重复劳动,缩短开发周期–易于维护和功能扩充•开发方法:自上向下,逐步分解,分而治之,是面向过程程序设计语言的核心第7章函数7.1.1C程序的结构C程序基本结构C程序源程序文件1源程序文件2源程序文件n…预编译命令函数1函数2…说明部分执行部分可由一个或多个源程序文件组成;每个源程序文件又由若干函数构成;但整个程序有且仅有一个主函数;程序运行时从main函数开始执行,main函数可调用其它函数,最终一律返回到main函数结束运行。除main函数外,其它函数可相互调用;函数不可嵌套定义,具有全局性、平行性;函数分为有参与无参函数,有返回值和无返回值函数,主调和被调函数C程序特点:函数的分类按照函数定义的角度分为:1.标准库函数:是由系统定义地,也不必在程序中进行类型说明,要调用某个库函数,则要用预处理命令#include将该函数所在的头文件包含到程序中。使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件当标准库函数中没有用户要用的函数时,就必须自己设计了,设计函数的原则是:1,函数不应处理太多的功能,要保持函数的小型化,功能单一化.2,一个函数要保持自己的独立性,如同一个黑匣子一样,有进有出.3,在函数中多使用复合语句,使函数也具有结构化,并且可以提高执行效率和节省存储空间.4,在主函数前,要罗列出所有使用自定义函数的原型说明,这有利于在大型程序设计中追踪要调用的函数设置是否正确.5,在程序适当的地方加入注释(用/*...*/包含的语句)这便于程序的阅读和调试.6,采用层次的书写程序格式,按程序的不同功能分层次.2.用户自定义的函数按照函数的参数传递形式分为:无参函数有参函数按照函数的返回值类型分为:有返回值无返回值按照函数的使用范围分为:内部函数外部函数按函数的定义形式和使用范围的分类:8.2函数的定义------无参函数的定义类型名函数名(){声明部分执行部分}说明:•类型名为函数返回值类型,如果定义时未指定,系统默认为int型;无返回值的函数的类型名应为void。•函数名须是合法标识符,不能与其他函数或变量重名#includestdio.hvoidprintstar(){printf(*************\n);}voidprint_message(){printf(Howareyou!\n);}main(){printstar();print_message();printstar();}类型标识符函数名(形参表列){声明部分执行部分}形参表列必须声明形参的类型函数的定义------有参函数的定义形参类型说明表,一般格式为:数据类型1形参1,…,数据类型n形参n#includestdio.hfloataverage(floatx,floaty,floatz){floataver;aver=(x+y+z)/3;return(aver);}main(){floata,b,c,ave;a=6.5;b=4.2;c=25.3;ave=average(a,b,c);printf(“average=%f”,ave);}void函数名(){}函数体可以没有,表示占个位置,实现功能以后补写。函数的定义------空函数的定义/*求最大值*/voidmax(intx[]){/*求最大值*/}空函数的应用main(){inta[10]={….};/*求最大值*/intm_max=max(a);printf(“m_max=%d”,m_max);}函数的调用:1、主调函数与被调函数main函数是整个程序的执行入口程序的执行是从main函数开始的一般函数必须由main函数(或其它函数)调用才能执行。函数调用关系示意图2、函数参数和函数的值函数参数分为:实际参数和形式参数在函数定义的函数首部,函数名后的括号中说明的变量,简称形参。形参的个数可以有多个,多个形参之间用逗号隔开。形式参数:实际参数:函数被调用时,在调用处给出对应的参数,简称实参,实参往往是具有明确值的常量、变量或表达式等。#includestdio.hfloataverage(floatx,floaty,floatz){floataver;aver=(x+y+z)/3;return(aver);}main(){floata,b,c,ave;a=6.5;b=4.2;c=25.3;ave=average(a,b,c);printf(“average=%f”,ave);}形式参数(形参)实际参数(实参)注意:1.形参在未出现函数调用时,他们并不占内存,只有发生函数调用时才会被分配空间,而且在该函数结束后,它所占的所有内存也被释放;2.实参必须是具有确定值的常量,变量或表达式;3.形参必须在定义时就声明其类型;6.实参与形参的类型应相同或赋值兼容;7.C语言规定,实参与形参之间必须是单向的值传递。4.实参的个数和形参的个数应该相等;5.实参与形参在顺序上应该一一对应;参数的结合问题:在函数调用时,将实参值传给对应的形参例如:编一程序,将主函数中的两个变量的值传递给swap函数中的两个形参,交换两个形参的值。#includestdio.hvoidswap(intx,inty){intz;z=x;x=y;y=z;printf(\nx=%d,y=%d,x,y);}main(){inta=10,b=20;swap(a,b);printf(\na=%d,b=%d\n,a,b);}形式参数(形参)实际参数(实参)单向值传递例如:编一程序,将主函数中的两个变量的值传递给swap函数中的两个形参,交换两个形参的值。#includestdio.hvoidswap(intx,inty){intz;z=x;x=y;y=z;printf(\nx=%d,y=%d,x,y);}main(){inta=10,b=20;swap(a,b);printf(\na=%d,b=%d\n,a,b);}程序输出结果:x=20,y=10a=10,b=20mainswap20b10az10y20x101020交换失败例计算x的立方#includestdio.hfloatcube(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函数的值即函数的返回值,是通过函数中的return语句获得的.return语句的一般形式:return(表达式);return表达式;执行过程:执行return语句后,如果该表达式的类型与函数首部中定义的函数类型一致,则直接将结果返回主调函数;否则,系统自动将结果的类型转换成定义的函数类型。无返回值的函数如果被调用函数中没有return语句,函数带回的是一个不确定的值。为了明确表示“不带回值”,可以用“void”定义“无类型”(或称“空类型”)。这样,系统就保证不使函数带回任何值,即禁止在调用函数中使用被调用函数的返回值。为使程序减少出错,凡不要求带回函数值的函数,一般应定义为void类型。printstar(){printf(************\n);}voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}通过return语句只能返回一个数值。函数内可有多条返回语句,但每条返回语句的返回值只有一个。当函数不需指明返回值时,可以写成:return;当函数中无返回语句时,表示最后一条语句执行完后遇}自动返回。说明:函数的调用函数调用是使函数进行一次实际的执行。格式:函数名(实际参数表)•说明实参在调用时必须有确定的值,可以是常量、变量和表达式。函数的实参和形参应在个数、类型和顺序上一一对应,否则会发生类型不匹配的错误。对于无参函数,调用时实参表列为空,但()不能省。按函数在程序中出现的位置有以下3种函数调用方式:•函数调用的方式1.函数语句调用把函数调用作为一个语句不要求函数带回明确的返回值只完成一定的操作#includestdio.hvoidprintstar(){printf(*************\n);}voidprint_message(){printf(Howareyou!\n);}main(){printstar();print_message();printstar();}2.函数表达式调用以表达式形式出现在程序中要求函数必须带回确定的返回值c=2*max(a,b);3.函数参数调用作为参数出现在程序中要求函数必须带回确定的返回值m=max(a,max(b,c));函数的调用过程1.根据函数名找到被调函数,若没找到,系统将报告出错信息;若找到,为形参开辟存储空间;2.计算实参的值。将实参的值传递给形参;3.保护主调函数的现场,中断主调函数,转到被调函数的函数体中开始执行;4.遇到return语句或函数结束的花括号时,返回主调函数;5.释放形参和调用函数中临时变量的内存空间;6.恢复现场从主调函数的中断处继续执行。函数开始调用函数结束调用#includestdio.hfloataverage(floatx,floaty,floatz){floataver;aver=(x+y+z)/3;return(aver);}main(){floata,b,c,ave;a=6.5;b=4.2;c=25.3;ave=average(a,b,c);printf(“average=%f”,ave);}mainaverage12.0ave25.3c4.2b6.5aaver12.0z25.3y4.2x6.5函数之间的位置关系在一个程序中有多个函数,那么,各函数之间的前后位置关系规定如下:1、被调函数在前面,主调函数在后面.即先定义后调用。2、主调函数在前面,被调函数在后面。这时,必须在调用的语句之前,对被调用的函数进行原型声明(说明),可在主调函数的说明部分,也可在程序的开始处的说明部分进行。3、被调函数是库函数或另一文件中的自定义函数,则在本程序文件的起始部分用#include命令将对应的文件包含到本文件中来。intadd(intx,inty){return(x+y);}main(){inta=10,b=24,sum;printf(inputa,b:);sum=add(a,b);printf(”sum=%d\n,sum);}main(){inta=10,b=24,sum;printf(inputa,b:);sum=add(a,b);printf(”sum=%d\n,sum);}intadd(intx,inty){return(x+y);}intadd(intx,inty);intadd(intx,inty);函数原型声明方法常用的是:用函数定义中的函数首部,再加上一个分号;也可以省略函数首部中的形参名,但必须保留形参的类型。longfac(intx);…/*对除main之外的所有自定义函数进行原型说明*/intcmn(intm,intn);main()/*main函数*/{intm,n,c;…}longfac(intx)/*fac函数*/{…}intcmn(intm,intn);/*cmn函数*/{…}/*也可以写成longfac(int);*//*也可以写成intcmn(int,int);*/例:longfac(intx);/*函数原型说明*/main(){intm,n,c;printf(inputm,n:);scanf(%d%d,&m,&n);if
本文标题:C语言程序设计 第七章函数
链接地址:https://www.777doc.com/doc-3814313 .html