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

1 / 84
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功