您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第八章课件C程序设计(第三版)谭浩强著.
第8章函数C语言程序设计第八章函数概述函数定义的一般形式函数参数和函数的值函数的调用函数的嵌套调用函数的递归调用数组作为函数参数局部变量和全局变量变量的存储类别内部函数和外部函数运行一个多文件的程序本章学习目标:C语言程序设计第八章函数认识到函数是一种简化程序结构的重要手段;理解函数调用和函数调用过程中的参数传递;理解函数原型(声明)和怎样写函数原型;能够用前几章的知识实现简单的函数;能够用return语句实现函数的返回值;能够理解函数调用过程中形式参数和实际参数的关系,理解数组名作为函数参数时代表的意义;能够理解函数的嵌套调用和递归调用机制。§8.1概述函数的概念C语言程序设计第八章函数一个大的程序一般应分为若干个程序模块,每个模块实现一个特定的功能,这些模块称为子程序,在C语言中子程序用函数实现。mainabca1a2b1b2不能被调用所有函数都是平行的,不能嵌套定义分为:库函数和自定义函数由C程序结构图示1、一个C程序可以分为若干个函数2、每个程序有且只能有一个主函数(main),其它函数可称为“子函数”3、子函数可以相互调用,但主函数不能被调用4、一个C程序由一个或多个文件构成,一个源程序时一个编译单位C语言程序设计第八章函数一、常规方法:各函数包含在一个文件中例T8-1.c#includestdio.hvoidmain(){voidprintstar();voidprint_message();printstar();print_message();printstar();}voidprintstar(){printf(“***********************\n”);}voidprint_message(){printf(“_____How_do_you_do!\n”);}运行结果:****************************Howdoyoudo!****************************C语言程序设计第八章函数二、工程的方法例:某程序由四个文件组成,其中,一个文件包含主函数,两个文件包含两个被调用函数。一个为工程文件,包含这个程序的三个文件名。操作:Alt+pProjectname:T8-1-4.prjAlt+R结果同上T8-1-1.cmain(){p1();p2();p1();}T8-1-2.cp1(){printf(“*********************\n”);}T8-1-3.cp2(){printf(“Howdoyoudo!\n”);}T8-1-4.prjT8-1-1T8-1-2T8-1-3C语言程序设计第八章函数三、文件包含的方法在主函数中使用文件包含预编译命令,将不在本文件而在其它文件中的函数进行预编译处理把各文件中的函数包含到本文件中来,然后一起进行编译、连接、运行。T8-1-5.c#include“T8-1-2.c”#include“T8-1-3.c”main(){p1();p2();p1();}运行结果同上几点说明:(1)一个源文件由一个或者多个函数组成。(2)一个C程序由一个或者多个源文件组成。(3)C程序的执行从main函数开始。调用其它函数后仍回到main函数,程序在main函数结束时结束。(4)所有的子函数都是平行的。任何函数不属于其它函数(5)从用户的角度看,函数分库函数和自定义函数。(6)函数形式:①无参函数:主调函数无数据传送给被调函数,可带或不带返回值。②有参函数:主调函数与被调函数间有参数传递,主调函数可将实参传送给被调函数的形参,被调函数的数据可返回主调函数。C语言程序设计第八章函数§根据(1)(2)(3)可知,逻辑上一个C语言程序是由函数构成的,C语言程序从主函数(main)开始执行,在主函数中调用其他函数,这些函数可能又调用别的函数,主函数执行完毕代表整个程序结束。主函数只能调用不能被调用。物理上一个程序由一个或者若干个文件(源文件)构成,函数分别放置在这些文件中。考虑编程简单,课程要求把所有函数放在同一个文件中。§8.2函数定义的一般形式无参函数的定义形式类型标识符:用于指定函数带回的值的类型,不写时为int型。不带回值时可以不写。C语言程序设计第八章函数类型标识符函数名(){说明部分语句}例无参函数printstar(){printf(“**********\n”);}或printstar(void){printf(“**********\n”);}合法标识符函数体有参函数定义的一般形式C语言程序设计第八章函数类型标识符函数名(形式参数表列){说明部分语句}现代风格:函数返回值类型隐含为int型函数体例有参函数(现代风格)intmax(intx,inty){intz;z=xy?x:y;return(z);}例有参函数(现代风格)intmax(intx,y){intz;z=xy?x:y;return(z);}空函数为扩充功能预留,在主调函数中先占一个位置。C语言程序设计第八章函数类型标识符函数名(){}例空函数dummy(){}函数体为空对形参的声明的传统方式即把对形参的声明放在函数定义的下一行类型标识符函数名(形参表)形参类型说明{说明部分语句}例有参函数(传统风格)intmax(x,y)intx,y;{intz;z=xy?x:y;return(z);}§8.3函数参数和函数(返回)的值形式参数和实际参数形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式C语言程序设计第八章函数例8.2比较两个数并输出大者#includestdio.hvoidmain(){intmax(intx,inty);inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Maxis%d,c);}intmax(intx,inty){intz;z=xy?x:y;return(z);}形参实参c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=xy?x:y;return(z);}运行:7,8Maxis8几点说明:实参可以是常量、变量或表达式。必须有确定的值。当函数调用时,将实参的值传递给形参,若是数组名,则传送的是数组首地址。形参必须指定类型,只能是简单变量或数组,不能是常量或表达式形参与实参类型一致,个数相同顺序相同。若形参与实参类型不一致,自动按形参类型转换———函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放实参对形参的数据传送是值传递,也是单向传递,当被调函数的形参发生变化时,并不改变主调函数实参的值。形、实参占据的是不同的存储单元C语言程序设计第八章函数例8.2比较两个数并输出大者#includestdio.hvoidmain(){intmax(intx,inty);inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Maxis%d,c);}intmax(intx,inty){intz;z=xy?x:y;return(z);}思考:将例8.2中max函数作如下变形会怎么样例8.2比较两个数并输出大者#includestdio.hvoidmain(){intmax(intx,inty);inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Maxis%d,c);}intmax(intb,inta){intc;c=ab?a:b;return(c);}总结:实参对形参的单向传递。仅由参数对应的位置确定,与名字无关。C语言程序设计第八章函数例:形、实参占据的是不同的存储单元#includestdio.hvoidmain(){add(intx,inty);inta=2,b=3;printf(“a=%d,b=%d\n”,a,b);printf(“&a=%x,&b=%x\n”,&a,&b);add(a,b);printf(“a=%d,b=%d\n”,a,b);printf(“&a=%x,&b=%x\n”,&a,&b);}add(intx,inty){x=x+8;y=y+12;printf(“x=%d,y=%d\n”,x,y);printf(“&x=%x,&y=%x\n”,&x,&y);}2+8=103+12=1523ffd2ffd4ffd6ffd8xayb运行结果:a=2,b=3&a=ffd6,&b=ffd8x=10,y=15&x=ffd2,&y=ffd4a=2,b=3&a=ffd6,&b=ffd8形式参数和实际参数函数的返回值(函数的值)返回语句形式:return(表达式);或return表达式;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数C语言程序设计第八章函数§8.3函数参数和函数的值例8.2比较两个数并输出大者#includestdio.hvoidmain(){intmax(intx,inty);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);}说明:函数的返回值,必须用return语句带回。return语句只能把一个返值传递给调用函数。函数中可有多个return语句,执行哪一个由程序执行情况来定。但不论执行到哪个return都将结束函数的调用返回主调函数。if(ab)return(a);elsereturn(b);return语句中的括号可以省略;return后面的值可以是一个表达式,如:return(xy?x:y);返回值的类型为定义的函数类型,不指定的按整型处理。如:intmax(intx,inty)floatmin(floata,floatb)doubleabc(floatd1,floatd2)若return语句中表达式类型与函数类型不一致,则转换为函数类型。若无return语句,遇}时,自动返回调用函数。可能返回一个不确定或无用的值。无返回值的函数,定义为void类型。参见例8-1C语言程序设计第八章函数printstar(){printf(**********);}main(){inta;a=printstar();printf(%d,a);}例:无return语句,函数带回不确定值输出:10voidprintstar(){printf(**********);}main(){inta;a=printstar();printf(%d,a);}编译错误!C语言程序设计第八章函数voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}例:无返回值函数例8.3:函数返回值类型转换#includestdio.hvoidmain(){intmax(floatx,floaty);floata,b;intc;scanf(%f,%f,&a,&b);c=max(a,b);printf(Maxis%d\n,c);}max(floatx,floaty){floatz;z=xy?x:y;return(z);}输入:1.5,2.5输出:Maxis2§8.4函数的调用主调函数:主动去调用其它函数被调函数:被其它函数所调用函数调用的一般形式函数名(实参表列)说明:调用无参函数时,实参表列为空,但()不能省实参表列:有确定值的数据或表达式实参与形参个数相等,类型一致,按顺序一一对应,当有多个实参时,实参间用“,”分隔实参表求值顺序,因系统而定(TurboC、VC++6.0自右向左)C语言程序设计第八章函数C语言程序设计第八章函数#includestdio.hvoidmain(){intf(inta,intb);
本文标题:第八章课件C程序设计(第三版)谭浩强著.
链接地址:https://www.777doc.com/doc-2086938 .html