还剩5页未读,继续阅读
文本内容:
第章函数9第一单元学习指南本章教学目标:掌握函数的定义和调用方法,掌握在函数之间传递数据的三种方法,学会正确的函数调
1.用方式学会编写一般难度的函数应用程序,并能上机调试运行
2.学习方法建议:.仔细阅读本章示例程序,正确理解每条语句的功能,着重理解函数的调用和返回过程;1着手编写一般难度的函数应用程序在编写函数时,可以采用“分解法”一一将单个函数分解为多个函数,也可以采用“改
2.写法”一一将同功能的函数改写为被调函数main上机调试运行本章示例程序,并调试运行自己编写的程序,进一步体会函数应用程序的
3.功能对于语法错误,采取与前面相同的应对措施
4.避免嵌套定义函数,即在一个函数的函数体中定义另一个函数;避免以表达式的形式调用无返回值的函数;要为每个形参指定类型对于逻辑错误,着重检查是否试图将形参的值传递给实参以及是否存在局部变量与全局
5.变量重名实参与对应的形参的类型是否一致,返回值与表达式的类型是否一致return仍然可以采用在程序中添加临时性输出语句的方法,进行出错位置的定位记录总结在调试程序的过程中发现的错误以及改正的方法,不断积累编写函数应用程序
6.的直接经验第二单元重点与难点解析为什么在调用库函数时,要在程序中包含相应的头文件?
1.因为在头文件中,包含相应库函数原型的声明,以便于程序编译时检查库函数的调用形式是否正确如何划分函数?
2.通常将一个程序中功能相对独立的程序段定义为一个单独的函数但是也不宜划分得过于零散,比如,一般不需要将数组的输入或输出部分定义为单独的函数是不是说无参函数都没有返回值,而有参函数都有返回值呢?
3.不是的一个函数有没有返回值跟有没有参数没有必然联系故无参函数和有参函数都可以根据需要有返回值或者没有返回值.何时应该定义无参函数,何时应该定义有参函数呢?4若主调函数不需要向被调函数传递数据,则被调函数应定义为无参函数;反之,应定义为有参函数定义有参函数时,应该将哪些变量定义为形参呢?
5.在定义被调函数时,若需要从主调函数中接收数据,则应该将被调函数中用于接收数据的变量定义为形参定义被调函数时,应当将哪个变量或表达式定义为返回值呢?
6.在定义被调函数时,应当将需要将其值从被调函数中传递到主调函数中的变量或表达式定义为被调函数的返回值为什么语言的参数传递,要设计为单向传递而不是双向传递呢?
7.C因为按照软件工程的思想,函数之间的耦合度(即相互影响的程度)越低越好而参数传递设计为单向传递,就是排除了形参发生改变时对实参的影响如何确定一个被调函数有没有返回值,以及返回值的类型呢?
8.如果一个被调函数不需要向主调函数传递数据,具体表现为其返回语句为这种形式,return;或者省略语句,则该函数无返回值,其函数类型应定义为类型若被调函数需要return void将变量或表达式的值传递到主调函数中,则该函数应当有返回值函数的类型一般与之return后的变量或表达式的类型相一致哪种函数只能以语句方式调用,哪种函数的调用可以出现在表达式中呢?
9.若一个函数无返回值,即函数定义为类型,则该函数的调用只能以语句的形式出现,void即直接在函数调用之后加分号若一个函数有返回值,则该函数的调用可以出现在表达式中,即函数调用作表达式.何时需要声明函数原型,声明函数原型的作用是什么?10在一个程序文件中,只要是被调函数在主调函数之后定义,则必须声明函数原型其作用是便于编译系统对函数的调用形式进行正确性检查全局变量是不是可以在整个程序中都能引用呢?
11.不是的一个语言的程序可以包括多个源程序文件,在默认情况下,全局变量的定义域C仅限于定义它的程序文件,即从其定义点开始,直至这个程序文件的末尾不过,可以通过声明外部全局变量,将其作用域扩展到其他程序文件中看起来利用全局变量在函数之间传递数据很方便,既然如此,为什么还要利用函数的
12.参数和返回值传递数据呢?利用全局变量在函数之间传递数据的确很方便但是,使用全局变量增加了函数之间的耦合度,不符合软件工程的思想因此,函数之间数据的传递应当尽量采用参数或返回值,而不是全局变量第三单元典型错误解析定义有参函数时,未指定参数类型
1.定义有参函数时,必须为每个形式参数指定类型例如float arear是错误的正确的写法应该是float areafloatr又例如int maxint x,y也是错误的正确的写法应该是int maxint x,int y被调函数调用格式错误
2.调用被调函数时,只须给出被调函数名和相应的实参即可,而不需要给出实参的类型例如y=double logdoublex;c=maxint a,int b;都是错误的,其中的类型名均为多余正确的写法应该是;y=logx c=maxa,b;形式参数定义错误
3.在被调函数中,只有需要从主调函数中接收数据的变量才能定义为形参而其他变量应放在被调函数的函数体中定义例如int maxint x int y int z{ifxyz zz=x;elsez=y;return z;}是错误的,因为此处只有变量的值需要从主调函数中传递过来,而变量的值则是根据x,y Z变量的值求得的,故变量不需要定义为形参正确的写法应该是x,y zint maxintx,int y{int z;ifxyz=x;elsez=y;returnz;形式参数重复定义
4.在被调函数中,被定义为形参的变量在函数体中不能重复定义例如int maxintx,int y{intx,y,z;if xyz=x;elsez=y;return z;}是错误的因为此处变量已定义为形参,故在函数体中不能重复定义正确的写法应该是x,yint maxintx,int y{int z;ifxyz=x;elsez=y;returnz;主调函数中的变量与被调函数名同名
5.主调函数中的变量与被调函数名不能同名例如int maxintx,int y{int z;ifxyz=x;elsez=y;returnz;main/*变量与被调函数同名*/莒,{int a,b max;max maxscanf d%d a,b;zmax=maxa,b;printf,,max=%d\nH,max;是错误的因为变量与被调函数同名,将会导致语法错误正确的写法应该是max maxint maxintx,inty{int z;if xyz=x;elsez=y;returnz;main{int a,b,m;%scanf”d%d”,a,b;m=maxa,b;printfnmax=%d\nH,m;不过,被调函数名与本函数中的变量同名是允许的例如int maxintx inty{int max;Aif xymax=x;elsemax=y;returnmax;该函数编译时不会产生语法错误函数返回值与函数类型不一致
6.定义被调函数时,函数类型与函数返回值应保持一致例如void maxintx inty{intzz;ifxy z=x;elsez=y;return z;是错误的因为该函数的类型为表示该函数没有返回值,故不能用语句返回函数值void,return正确的写法应该是xint maxintrint y{int z;ifxy z=x;elsez=y;returnz;可见,函数的类型一般应与之后表达式的类型一致return缺少函数原型声明
7.当被调函数的定义位于主调函数之后时,必须为被调函数声明函数原型虽然型的被int调函数可以不声明函数原型,但最好还是为其声明函数原型例如main{float a,b m;z%,scanf”f—”a,b;m=maxa,b;printfnmax=%f\nH,m;float maxfloat x,float y{float z;if xyz=x;elsez=y;returnz;}该程序编译时将会产生语法错误解决的方法是为被调函数添加函数原型声明语句,例如:/*声明函数原型*/float maxfloatx,float y;main{float a,b,m;scanfa,b;m=maxa,b;printfmax=%f\n,m;}float maxfloatx,float y{float z;ifxy z=x;elsez=y;returnz;}不过,若将被调函数的定义置于主调函数之前,则不必声明函数原型试图用局部变量在函数之间传递数据
8.从主调函数向被调函数传递数据的方式有两种,一是将实参的值传递给形参,二是使用全局变量但不能使用局部变量从主调函数向被调函数传递数据例如int max{int z;ifab z=a;elsez=b;returnz;main{int a,b,m;scanf n%d%d,,a,b;m=max;zprintf,max=%d\n,,m;}是错误的因为变量是在函数中定义的局部变量,故只能在函数中引用它们,而a,b mainmain不能在被调函数中引用正确的写法应该是int a,b;intmax{int z;ifab z=a;else z=b;return z;main{intm;scanfn%d%dn a,b;zm=max;,printfmax=%d\n”m;}此时,变量是全局变量,既可以在函数中引用,又可以在被调函数中引用不过,〜b main最好还是利用函数参数实现从主调函数向被调函数的数据传递,例如int maxintx intyz{int z;ifxyz=x;else;z=y returnz;main{int a,b,m;scanfn%d%dH a,b;m=maxa,b;zprintfmax=%d\n”,m;试图用局部变量在函数之间传递数据
9.从被调函数向主调函数传递数据的方式有三种,一是使用语句作为函数返回值传回,return二是使用全局变量传回,三是通过指针变量间接引用但不能使用局部变量从被调函数向主调函数传递数据例如void maxintx intyA{int z;ifxyz=x;elsez=y;return;main{int a,b;a,scanf%d%d”,b;maxa,b;printfnmax=%d\nH,z;是错误的因为变量是在被调函数中定义的局部变量,故只能在被调函数中引用,而不能在Z函数中引用正确的写法应该是mainint z;xvoid maxintfint y{if xyz=x;elsez=y;return;main{int a,b;%a,scanf d%d”,b;maxa,b;printfnmax=%d\nn z;z此时,变量是全局变量,既可以在函数中引用,又可以在被调函数中引用最好还z main是使用语句实现从被调函数向主调函数的数据传递,不过使用语句只能传回一个return return数据例如int maxintx intyz{intz;ifxyz=x;elsez=y;returnz;main{int a,b,m;scanf n%d%d,\a,b;m=max a,b;printfnmax=%d\nn,m;若希望从被调函数向主调函数同时传递多个数据,除了使用全局变量之外,还可以通过指针变量来间接引用主调函数中的数据。
个人认证
优秀文档
获得点赞 0