您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > C语言教程第5章函数.
第5章函数与程序结构5.1程序设计的艺术性5.2函数的定义与使用5.3函数的作用域和存储类型5.5预处理命令结构化程序设计有两大最高级的艺术算法设计艺术结构设计艺术C语言为程序的结构提供了两样武器函数和模块一、模块化设计与函数本章的学习首先要讨论——①什么是函数?②为什么要使用函数?③函数有哪些类型?④如何自己定义一个函数?⑤如何调用一个函数?⑥函数学习的难点是什么?一、模块化设计与函数①什么是函数?②为什么要使用函数?③函数有哪些类型?④如何自己定义一个函数?⑤如何调用一个函数?⑥函数学习的难点是什么?什么是函数?一个独立的程序模块,可以定义自己的变量(仅在本函数内有效),拥有自己的存储空间。可以被其他函数或自身调用(主函数除外)。一、模块化设计与函数①什么是函数?②为什么要使用函数?③函数有哪些类型?④如何自己定义一个函数?⑤如何调用一个函数?⑥函数学习的难点是什么?为什么要使用函数?便于实现模块化设计便于团队开发便于使用现有的或别人的程序模块提高编程效能在C程序设计中,通常:将一个大程序分成几个子程序模块(自定义函数)将常用功能做成标准模块(标准函数)放在函数库中供其他程序调用如果把编程比做制造一台机器,函数就好比其零部件。可将这些“零部件”单独设计、调试、测试好,用时拿出来装配,再总体调试。这些“零部件”可以是自己设计制造/别人设计制造/现在的标准产品一、模块化设计与函数【例】编写一个儿童算术能力测试软件main(){charans='y';clrscr();cover();/*调用软件封面显示函数*/password();/*调用密码检查函数*/while(ans=='y'||ans=='Y'){question();/*调用产生题目函数*/answers();/*调用接受回答函数*/marks();/*调用评分函数*/results();/*调用结果显示函数*/printf(“是否继续练习?(Y/N)\n”);ans=getch();}printf(“谢谢使用,再见!”);}自定义函数一、模块化设计与函数【例二】编写一个儿童算术能力测试软件main(){charans='y';clrscr();cover();/*调用软件封面显示函数*/password();/*调用密码检查函数*/while(ans=='y'||ans=='Y'){question();/*调用产生题目函数*/answers();/*调用接受回答函数*/marks();/*调用评分函数*/results();/*调用结果显示函数*/printf(是否继续练习?(Y/N)\n);ans=getch();}printf(谢谢使用,再见!);}/*定义所用函数*/cover(){}/*软件封面显示函数*/password(){}/*密码检查函数*/question(){}/*产生题目函数*/answers(){}/*接受回答函数*/marks(){}/*评分函数*/results(){}/*结果显示函数*/这些函数现在不编程或还不会编程,可先放空。可以多人合作,每人完成若干个函数(模块化)。可在另一个源程序文件中定义。Let’stry…一、模块化设计与函数①什么是函数?②为什么要使用函数?③函数有哪些类型?④如何自己定义一个函数?⑤如何调用一个函数?⑥函数学习的难点是什么?函数有哪些类型?根据函数的来源,可分为:库函数(标准函数)由系统提供,编程时可直接使用之自定义函数由编程者自己编写,使用时要“先定义后使用”根据使用的方式,可分为:无参函数有参函数(函数内需要使用主调函数中的数据)一、模块化设计与函数①什么是函数?②为什么要使用函数?③函数有哪些类型?④如何自己定义一个函数?⑤如何调用一个函数?⑥函数学习的难点是什么?如何自己定义一个函数?(见后)如何调用一个函数?(见后)函数部分学习的难点是什么?■函数的概念■形参/实参/返回值的概念■递归算法■变量的作用域和生存期基本思想:把大问题分成几个部分,每部分又分解成更细的若干小部分,直至分解成功能单一的小问题。特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法:自上向下,逐步分解,分而治之C语言中,函数就是组成C语言程序的部件,是实现模块化程序设计的工具。函数(function)是结构设计的最基本单位一个C程序由一个主函数和若干个函数组成,由主函数调用其他函数,其他函数之间也可以相互调用。同一个函数可以被一个或多个函数调用任意多次。5.1程序设计的艺术性源程序文件1预编译命令说明部分执行部分函数1函数n源程序文件i源程序文件nC程序C程序结构C是模块化程序设计语言特点:(1)一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。(2)一个C程序由一个或多个源程序文件组成。一个源文件可以为多个C程序公用。(3)C程序的执行从main函数开始,调用其他函数后流程回到main函数,在main函数中结束整个程序的运行。main函数是系统定义的。(4)所有函数都是平行的,即在定义函数时是互相独立的,一个函数并不从属于另一函数,即函数不能嵌套定义,函数间可以互相调用,但不能调用main函数。main函数是系统调用的.5.1程序设计的艺术性5.2.1函数的分类函数生来都是平等的,没有高低贵贱之分,只有main()稍微特殊一点点1、按定义分:标准函数、自定义函数2、按调用分:无参调用、有参调用3、按功能分:无值返回、有值返回一、函数的分类库函数(标准函数)ANSIC定义的标准库函数符合标准的C语言编译器必须提供这些函数函数的行为也要符合ANSIC的定义第三方库函数由其它厂商自行开发的C语言函数库不在标准范围内,能扩充C语言的功能自定义函数自己编写的函数包装后,也可成为函数库,供别人使用5.2.2函数的定义函数应该先定义后使用。任何函数(包括主函数main())都是由函数头和函数体两部分组成。函数头给出函数相关信息(类似“黑匣子”中的入口和出口),而函数体具体实现函数的功能。函数定义的一般形式(1).无参函数的定义类型标识符函数名(){声明部分语句}用“类型标识符”指定函数值的类型,即函数带回来的值的类型。无参函数一般不需要带回函数值,因此可以不写类型标识符。合法标识符函数返回值类型缺省int型无返回值void函数体类型标识符函数名(形式参数说明形式参数表){说明部分语句部分}例无参函数p_star(){printf(“**********\n”);}或p_star(void){printf(“**********\n”);}(2)有参函数定义的一般形式5.2.2函数的定义例如:intmax(intx,inty){intz;/*z=x>y?x:y;return(z);}在函数体的语句中求出z的值(为x与y中大者),return(z)的作用是将z的值作为函数值带回到主调函数中。return后面的括弧中的值(z)作为函数带回的值(或称函数返回值)。在函数定义时已指定max函数为整型,在函数体中定义z为整型,二者是一致的,将z作为函数max的值带回调用函数。如果在定义函数时不指定函数类型,系统会隐含指定函数类型为int型。因此上面定义的max函数左端的int可以省写。5.2.2函数的定义(3)可以有“空函数”它的形式为类型说明符函数名(){}例如:dummy(){}调用此函数时,什么工作也不做,没有任何实际作用。在主调函数中写上“dummy();”表明“这里要调用一个函数”,而现在这个函数没有起作用,等以后扩充函数功能时补充上。5.2.2函数的定义总结——关于函数函数是这样的一种运算:函数名说明运算规则参数是运算的操作数返回值是运算的结果当函数执行到return语句或}时,函数的运算停止。返回到调用它的地方继续向下执行函数可以有多个return,但最好只有一个且是最后一行用void定义返回值类型函数没有运算结果,没有返回值return语句之后不需要任何表达式函数内部可以定义只能自己使用的变量,称内部变量。参数表里的参数(形式参数)也是函数的语句块内的变量总结——关于函数形式参数和实际参数形式参数:在定义函数时函数名后面括弧中的变量名,简称形参。实际参数:在调用函数时函数名后面括弧中的表达式,简称实参。函数参数例main()max(intx,inty){{intz;inta,b,c;z=xy?x:y;scanf(“%d,%d”,&a,&b);return(z);c=max(a,b);}printf(“Maxis%d”,c);}运行结果:7,8Maxis8参数传递——单向值传递1.值传递——函数参数为基本数据类型时2.地址传递——函数参数为数组名、指针类型时在函数调用前,形参不占内存单元,调用时占用,调用后释放。形参变量和实参变量占用不同的内存单元(传值)定义函数时,必须指定形参类型。实参必须有确定的值,可以是常量,变量或表达式。在调用时将实参的值赋给形参变量。关于参数的几点说明:形参和实参的区别——实参与形参应匹配(顺序、类型、个数)实参对形参的数据传递是值传递,只由实参传递给形参,调用结束后,只有形参单元被释放,实参单元中的值不变。若是地址传递,可理解为实参与形参共用同一存储单元。(这一点在学习数组、指针时请注意听)。形参和实参的区别——c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=xy?x:y;return(z);}main(){inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Maxis%d,c);}max(intx,inty){intz;z=xy?x:y;return(z);}形参实参形参与实参、函数名与返回值之间的关系函数调用的一般形式1.函数调用的一般形式为:有参函数:函数名(实参表列);无参函数:函数名();2.有关规定:多个实参间用逗号隔开实参与形参间个数相等,类型应一致实参与形参按顺序对应,一一传递数据函数调用(CALL)1.函数语句:把函数调用作为一个语句。此时不要求函数带回值,只要求函数完成一定的操作。例如:printstar();max(a,b)2.函数表达式:函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:c=3+max(a,b);3.函数参数:(函数的嵌套调用)函数调用作为一个函数的实参。例如:m=max(a,max(b,c));函数调用的方式函数的嵌套调用嵌套调用:在调用一个函数的过程中,又调用另一个函数。函数是相互平行的,C语言规定函数不能嵌套定义,但可以嵌套调用。main函数调用A函数结束A函数调用B函数B函数192873456两层嵌套示意图函数的每次执行都会建立一个全新的独立的环境为函数的每个变量(包括形式参数)分配内存把实际参数的值复制给形式参数开始执行函数内的第一条语句函数内的代码在这个独立的环境内工作函数退出时求出返回值收回分配给所有变量(包括形式参数)的内存程序控制权交给调用者,调用者拿到返回值,将其作为函数调用表达式的结果函数调用的过程调用自定义函数之前,应该在主调函数中说明被调函数的类型。函数说明(函数原型说明)•在主函数中对被调函数作类型说明,意在告诉编译系统,本函数中将要用到的某函数是什么类型,以便让编译系统作出相应的处理。•函数说明的一般形式为:类型函数名();•注意:函数的类型说明是函数调用中一个非常重要的环节,忽略它将导致程序编译时出错。例:调用函数求n!。main(){intnum;longt;longf();/*函数类型说明*/scanf(%d,&num);t=f(num);
本文标题:C语言教程第5章函数.
链接地址:https://www.777doc.com/doc-3563473 .html