C语言程序设计教程第6章 北京邮电大学出版社

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第六章函数与编译预处理6.1模块化程序设计与函数6.2函数的定义与调用6.3函数的嵌套和递归调用6.4变量的作用域与存取方式6.5编译预处理C语言程序设计教程C语言程序设计教程2020/1/2326.1模块化程序设计与函数在设计较复杂的程序时,我们一般采用的方法是:把问题分成几个部分,每部分又可分成更细的若干小部分,逐步细化,直至分解成很容易求解的小问题。这样的话,原来问题的解就可以用这些小问题来表示。(1)自顶向下;(2)逐步细化;(3)模块化设计;(4)结构化编码;C语言程序设计教程2020/1/233一个较大的程序一般划分成若干个模块,每个模块用来实现一个特定的功能。C语言中用函数来实现模块功能。函数是C语言程序的基本单位,一个C语言程序可由一个主和函数若干个函数构成。由主函数调用其它函数,其他函数之间也可相互调用。如:主函数函数1函数2函数3函数11函数12函数31函数32函数33图6-1模块化程序设计示意图C语言程序设计教程2020/1/234例如:一个“工资计算程序”的自顶向下开发如下图所示。工资计算输入信息计算工资额打印工资表计算应发额基本工资计算奖金额计算扣除房租、水电费公积金…C语言程序设计教程2020/1/235ANSI标准提倡把一个大的问题划分成许多小模块,每个模块编写一个函数,一个函数完成一个功能单一而独立的任务。使用模块是一个很好的程序设计方法,可以由几个人同时开始设计,从而缩短开发周期。更主要的是,由于每一个模块规模较小、任务单一,更容易设计和调试,从而提高程序的可靠性。模块设计的原则•模块独立•规模适当•层次分明•功能专一案例6-1.调用自定义函数,输出如下字符串。******************Welcome!WestudyCprogramlanguage.******************C语言程序设计教程2020/1/236#includestdio.hvoidprintstar();voidsub1();voidsub2();voidmain(){printstar();sub1();sub2();printstar();}voidprintstar(){printf(******************\n);}voidsub1(){printf(Welcome!);}voidsub2(){printf(\nWestudyCprogramlanguage.\n);}C语言程序设计教程2020/1/237算法简介算法:通俗地说,算法是解决一类特定问题的方法和步骤。案例6-2设计算法:找出a,b两数中的较大者放入a中,并输出分析:这个问题分三个步骤:输入两个数;找出其中的大数放入a中;输出大数a开始输入a,bab交换a,b输出a结束非00C语言程序设计教程2020/1/2386.2函数的定义与调用C语言中函数分两类,一类是标准函数,又称为库函数,使用时必须用#include头文件另一类是用户自定义函数:由用户根据自己的任务要求,自己编写的函数。一、定义的形式[存储类型]数据类型函数名(形式参数表列){函数体部分/*由声明部分及语句构成*/}形式参数表列由类型与变量名组成函数头既说明了函数的返回值类型,也说明了每个参数的数据类型。C语言程序设计教程2020/1/2391.存储类型指出函数的作用范围,只有static、extern两种。缺省为externstatic:函数只能作用于所在的源文件,又称为内部函数。extern:函数可被其它源文件中的函数调用,又称为外部函数。2.函数数据类型指出函数返回值的类型,有int,float,char等,即可为各种基本数据类型,也可为各种复杂数据类型。如无返回值,可定义为空类型void。缺省为int3.形参表可有可无,无形参表的函数称为无参函数。无参函数为一特例,但()不能省。有形参表的函数称为有参函数,形参表由一个或多个形参组成,多个参数间用逗号隔开。C语言程序设计教程2020/1/23104.函数名符合标识符的定义:由字母、数字、下划线组成。一般函数名与函数内容有一定关系,以增强程序的可读性。5.函数体部分一般包括数据描述部分和功能实现部分。描述部分由类型定义语句实现;功能实现部分由各种语句构成,是函数的主体部分。intA_to_a(intcapital){intsmall;if(capital=‘A’&&capital=‘Z’)small=capital–(‘A’-’a’);returnsmall;}C语言程序设计教程2020/1/2311[案例6-3]定义一个函数,用于求两个数中的大数。/*功能:定义一个求较大数的函数并在主函数中调用*/intmax(intn1,intn2)/*定义一个函数max()*/{return(n1n2?n1:n2);}main(){intmax(intn1,intn2);/*函数说明*/intnum1,num2;printf(inputtwonumbers:\n);scanf(%d%d,&num1,&num2);printf(max=%d\n,max(num1,num2));}C语言程序设计教程2020/1/2312说明(1)函数定义不允许嵌套。在C语言中,所有函数(包括主函数main())都是平行的。一个函数的定义,可以放在程序中的任意位置,主函数main()之前或之后。但在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。(2)空函数──既无参数、函数体又为空的函数。其一般形式为:[函数类型]函数名(void){}C语言程序设计教程2020/1/2313二、函数的形参与实参函数在调用时,一般主调函数和被调用函数之间有数据传送,即参数传递。在定义函数时函数名后面括弧中的变量名称为形参。而在主调函数中调用一个函数时,函数名后面括弧中的参数为实参。发生函数调用时,调用函数把实参的值复制1份,传送给被调用函数的形参,从而实现调用函数向被调用函数的数据传送。C语言程序设计教程2020/1/2314intmax(inta,intb){inty;y=(ab)?a:b;returny;}调用时:m=max(3,6);m=max(a,b);C语言程序设计教程2020/1/2315说明:(1)实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。例:主调函数中有如下语句:scanf(%d,%d,&a,&b);m=max(a,b+3);如果输入6,2函数intmax(inta,intb)形参a得到第一个实际参数a的值6形参b得到第二个实际参数b+3的值5因此,应预先用赋值、输入等办法,使实参获得确定的值。C语言程序设计教程2020/1/2316(2)形参变量只有在被调用时,才分配内存单元;调用结束时,即刻释放所分配的内存单元。实参和形参占用不同的内存单元,即使同名也互不影响。因此,形参只有在该函数内有效。调用结束,返回调用函数后,则不能再使用该形参变量。(3)实参与形参必须个数相同,对应的形参和实参的类型必须一致或赋值兼容。若类型不匹配,则按规则进行转换。char整型可互相通用(4)实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。C语言程序设计教程2020/1/2317三、函数的返回值与函数类型C语言的函数可分为有返回值函数和无返回值函数两种。1.函数返回值与return语句函数的返回值是通过函数中的return语句获得的。return语句将被调函数中的一个确定值带回主调函数中去,不需要返回值可不用return语句。(1)return语句的一般格式:return(变量或表达式);returny;/*将变量y的值返回给调用者*/returny+3;/*将表达式的值返回给调用者*/(2)return语句的功能:返回调用函数,并将“表达式”的值带给调用函数。C语言程序设计教程2020/1/2318注意:调用函数中无return语句,并不是不返回一个值,而是一个不确定的值。为了明确表示不返回值,可以用“void”定义成“无(空)类型”。这样就禁止在调用函数中使用被调函数的返回值。所以函数没有返回值,函数定义成空类型voidprintstar(){printf(******************\n);}函数的功能就是输出18个‘*’调用时应该的语句形式为printstar();而形如i=printstar();的是错的C语言程序设计教程2020/1/2319有关void类型,说明如下:(1)void类型的函数并不是调用函数之后不再返回,而是在返回时无返回值。void类型在C语言中有两种用途:其一为表示一个函数没有返回值;其二用来指明有关通用型的指针。(2)void类型的函数和有返回值类型的函数在定义时没有区别,只是在调用时不同。有返回值的函数可以将函数调用放在表达式中间,将返回值用于计算。而void类型的函数不能将函数调用放在表达式当中,只能在语句中单独使用。(3)void类型的函数多用于完成一些规定的操作,而主调函数本身不再对被调函数的执行结果进行引用这样就禁止在调用函数中使用被调函数的返回值。C语言程序设计教程2020/1/23202.函数类型在定义函数时由类型标识符确定对函数类型的说明,应与return语句中返回值表达式的类型一致。如果不一致,则以函数类型为准,自动将数据转换成函数的类型。如果缺省函数类型,则系统一律按整型处理。案例6-4返回值类型与函数类型不同#includestdio.hvoidmain(){intmax(float,float);floata,b;scanf(%f%f,&a,&b);printf(Maxis%d\n,max(a,b));}intmax(floatx,floaty){returnxy?x:y;}输入:4.32.6↙结果:Maxis4C语言程序设计教程2020/1/2321四、对被调用函数的说明和函数原型在C语言中,所有的函数在定义时都是互相独立的,一个函数并不从属于另一个函数,但函数之间可以互相调用,其他函数不能调用main(),即函数的定义是平行的。函数的使用同变量使用类似,在主调函数中使用了被调函数名。在使用前,应对其进行函数声明,即先声明后调用。•若调用标准函数,应该在文件开头用include命令将标准函数包含在文件中来.•若调用自定义函数,则要在主调函数中对被调函数作声明.自定义函数在调用前的声明是使系统知道将要用到某个函数及它的类型,以便处理。函数声明应与该函数定义时给出的函数类型与名字、形参的个数、类型、次序相一致。在C中采用函数原型方式,对被调用函数进行说明。C语言程序设计教程2020/1/23221.一般格式如下:函数类型函数名(数据类型[参数名][,数据类型[参数名2]…]);即在定义时的函数头后加;即成为函数原型。由于编译系统不检查参数名,有无参数名无所谓。如:floatmax(int,int);2.函数定义和声明的区别1)定义:指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型,函数体,是一个完整的、独立的函数单位。2)声明:将函数名、函数类型、形参类型、个数和顺序通知编译系统,以便在调用时系统按此进行对照检查。(函数名正确与否、实参、形参的类型、个数是否一致等)C语言程序设计教程2020/1/2323#include“stdio.h”voidmain(){floatx,y;intn;floatpower(floatx,intn);/*函数声明*/scanf(“%f,%d”,&x,&n);y=power(x,n);/*函数调用*/printf(“%8.2f”,y);}floatpower(floatx,intn)/*函数定义*/{inti;floatt=1;for(i=1;i=n;i++)t=t*x;returnt;}案例6-5编写计算x的n次乘方的程序。C语言程序设计教程2020/1/23243.C

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

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

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

×
保存成功