使用函数封装代码

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

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

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

资源描述

聊城大学LiaochengUniversity函数是什么5.1函数的工作原理5.2函数和结构化编程5.3编写函数5.4调用函数5.6将参数传递给函数5.5函数的位置5.7内联函数5.8上课用的物品—--完成某功能所需的语句等。函数把物品封装在特定手提袋中---函数函数各手提带名字不同以区分---函数名唯一标识函数。各手提带中物品不同---函数体中不同语句使函数完成特定功能。什么时候用哪一个手提袋由主人决定---主函数调用特定功能的函数。主人可以有哪些手提袋可用?列目录说明---一个程序都有哪些函数可以调用?被调用函数原型说明语句。程序中被调用函数主人+手提袋+目录=任务---函数原型语句+主函数+其他自定义函数=程序。6SubTitle5.1.1函数的定义定义:是一个命名的、独立的代码段,执行特定任务,并可能给调用它的程序返回一个值。说明:(1)函数是命名的。函数名是唯一的,程序其他部分使用该名称,可执行函数中的语句,称为“函数调用”。(2)函数是独立的。(3)函数执行特定的任务。(4)函数可以将一个值返回给调用它的程序(return语句)。5.1.2函数的用法程序清单5.1cube.c7SubTitle仅当函数被程序其他部分调用后,函数中的语句才会被执行;调用时程序可以给函数传递参数,函数用这些参数进行运算完成任务;函数中语句执行完后,将一个返回值返回给程序中调用函数的地方。main(){callfunc1……callfunc2……callfunc3}func1(){}func2(){}func3(){}函数原型格式return_typefunction_name(arg_typename_1,…,arg_typename_n);函数定义格式return_typefunction_name(arg_typename_1,…,arg_typename_n){/*statements;*/}eg.函数原型语句doublesquared(doublenumber);voidprint_report(intreport_number);intget_menu_choice(void);eg.函数定义doublesquared(doublenumber){return(number*number);}voidprint_report(intreport_number){if(report_number==1)puts(“PrintingReport1”);elseputs(“NotprintingReport1”);}10SubTitle通过在程序中使用函数,可进行结构化编程。5.3.1结构化编程的优点(1)结构化程序更易编写;(2)结构化程序更易调试;(3)结构化编程可以节省时间。5.3.2规划结构化程序eg.编写联系地址的程序(姓名和地址列表)(1)输入新的姓名和地址(2)修改已有的条目(3)按姓对条目进行排序(4)打印邮寄地址标签从磁盘中读取已有的地址列表;提示用户输入一个或多个条目;将新数据添加到列表中;将更新后的列表存盘。从磁盘中读取已有的地址列表;修改一个或多个条目;将更新后的列表存盘。main()EnterEditSortPrintReadModifySave图5.2以层次方式组织的结构化程序5.3.3从顶向下的方法C程序员可选用从顶向下的方法,如图5.2.多数情况下,程序的大多数实际工作是由位于树枝末梢的函数完成的,位于“主干”附近的函数主要用于引导程序执行这些函数。main()EnterEditSortPrintReadModifySave图5.2以层次方式组织的结构化程序函数头每个函数的第一行都是函数头,函数头由三部分组成,每部分完成特定的功能。(参考教材5.4.1,5.4.2,5.4.3)可以是任何数据类型,用void表示函数不返回任何值。遵循变量名规则要传递给函数的每个参数都要在参数列表中包含对应条目,指定数据类型和名称。定义时,函数头最后不加分号参数列表:可以给函数传递任何数据类型。eg.longcube(longx)voidfunc1(intx,floaty,charz)intfunc2(void)注意:形参VS实参:(1)形参位于函数头()中,是实参的占位符。(2)实参是调用程序传递给函数的实际值。(3)C语言中,每次调用函数传递的实参个数和类型必须与对应形参相同,但值可以不同。(参考教材5.4.4)程序清单5.2list0502.c函数体位置:位于函数头后,{}括起的部分功能:函数被调用按照流程执行其中语句,完成实际的工作后返回到被调用之处并带回1或0个值。结束:执行到return语句或最外面的花括号后结束。1、局部变量在函数体中声明的变量,成为“局部变量”,是特定函数私有的。eg.intfunc1(inty){inta,b=10;floatrate;doublecost=12.55;……}(参考教材5.4.5)a,b,rate,cost,y都是专属func1的局部变量。程序清单5.3var.c注意:变量的“作用域”说明:(1)变量必须“先定义,后使用”;(2)不同位置定义变量的“作用域”不同;全局变量,局部变量(3)函数中的局部变量独立于程序,使函数更加独立。2、函数的语句函数几乎可以包含任何语句,在函数中唯一不能做的事就是定义另一个函数。建议函数中语句尽量少。3、返回值要从函数返回一个值,可以使用关键字return,并在后面加上一个表达式。eg.intfunc1(intvar){intx;returnx;}一个函数中有多条return语句时,只能有一条被执行。程序清单5.4return.c函数原型形式:函数原型和函数头相同,只是后面加“;”。位置:放在程序中第一个函数之前。功能:将有关函数的信息告知编译器。编译器知道有关函数的返回值类型、名称和参数后,每次调用函数时检查这些信息,确保传递的参数正确,并确保正确使用返回值。注意:严格地讲,函数原型可以与函数头不完全相同,只要确保参数类型、数目和顺序相同即可,而参数名不必一定相同。举例说明(参考教材5.4.6)19SubTitle给函数传递参数时,参数的数目与类型必须同函数头和函数原型中的形参匹配,并且有一定顺序。每个参数可以是任何合法的表达式:常量、变量、数学或逻辑表达式,甚至是另一个具有返回值的参数。eg.假设函数half()、square()、third()都有返回值,则可有:x=half(third(square(half(y))));栈是RAM中的特殊区域动作:压栈、出栈规则:“后进先出”调用方式:函数名(实参列表)位置:(1)单独成句(2)用在表达式中说明:(1)任何函数调用可单独成句,但有返回值的函数返回值将被丢弃;(2)用在表达式中的函数调用应为有返回值的函数(非void)。eg.wait(12);printf(“Halfof%dis%d.”,x,half_of(x));y=half_of(x)+half_of(z);if(half_of(x)10){……}if(do_a_process()!=OKAY){……}5.6.1递归调用一般情况是一个函数调用另一个函数,特殊的,函数直接或间接调用自身,称为“递归调用”。注意:递归将使用大量资源(相当于复制了多份函数),慎用!2019/8/16程序清单5.5recurse.c22factorial(4)回归递推2factorial(1)4factorial(3)3factorial(2)return1n!=n*(n-1)!24例:递归的执行情况分析voidprint(intw){inti;if(w!=0){print(w-1);for(i=1;i=w;++i)printf(%d,w);printf(\n);}}w=3时的运行结果:1,2,2,3,3,3,25递归调用执行情况如下:main函数(1)print(w)w=3;3print(2);(1)w=3topw2print(1);(2)w=2(1)w=3topw1print(0);(3)w=1(2)w=2(1)w=3topw0(4)w=0(3)w=1(2)w=2(1)w=3topw(3)输出:2,2(2)2(1)3top(4)输出:1(3)1(2)2(1)3top(2)输出:3,3,3(1)3top返回(3)1(2)2(1)3top(4)0结束(1)voidprint(intw){inti;if(w!=0){print(w-1);for(i=1;i=w;++i)printf(%d,w);printf(\n);}}w==0时直接返回汉诺塔问题:262019/8/162019/8/1629SubTitle关键字:inline格式:inline函数定义编译器对内联函数的处理:复制代码到调用函数。eg.inlineinttoInches(intFeet){return(Feet/12);}优点:提高了运行效率。注意:编译器不一定都把用inline声明的函数复制到调用函数中。一般是结构较简单的函数才声明为内联函数。聊城大学LiaochengUniversity

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

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

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

×
保存成功