C语言-第八章函数Word版_第1页
C语言-第八章函数Word版_第2页
C语言-第八章函数Word版_第3页
C语言-第八章函数Word版_第4页
C语言-第八章函数Word版_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、定义无参函数:类型标识符 函数名()声明+语句定义有参数的函数:类型标识符 函数名(形式参数列表)声明+语句不带返回值的函数类型为空类型,即void类型。该函数中不应出现return语句。若需要返回值,则在语句部分加入    return(表达式);    语句。return的数据类型必须与函数类型标识符相同。return后面的括号可以不要,直接使用return 表达式 的方式。return语句代表着函数结束,return后的语句不再执行。如果在定义函数时,未指明函数类型,则默认为int型,故函数标识符可省略,但一般建议写出。定义函数时所用的参数叫做形参

2、,在未调用函数时,不为其分配内存单元,当函数被调用时,为形参分配内存单元,在调用结束时释放。在函数调用时,所输入的参数叫做实参。实参形参的类型必须相同或者赋值相容。函数调用中,实参的值不会发生变化。即函数调用处理的是与实参值相同的形参。不同系统在接受实参时,对实参的处理顺序不一样,有的自右向左,有的自左向右。如:i=2;f(i,+i);    自右向左为f(3,3);    自左向右为f(2,3);        应尽量避免这种容易产生混乱的引用方法。1 / 10程序所要调用的函数必须是已经存在的库函数或者已经定义

3、的用户函数。若用户函数的定义的位置在调用它的函数的定义位置前,则无需声明,若用户函数的定义的位置在调用它的函数的后面,则需要进行声明。声明方式和定义变量相类似,如:int a();声明函数时,形参的参数名可以省略。编译系统只检查参数个数及参数类型。另外,若被调用函数为整型或已在文件的开头进行了申明,则可以在main函数内不进行声明。C语言中的函数定义不能进行嵌套定义,即一个函数内部定义另一个函数,但可以进行嵌套调用。注意:是函数的定义内部不能有其他函数的定义,但可以在函数的定义内部调用另一个函数的定义。在调用一个函数过程中又出现间接或直接调用该函数本身,称为函数递归调用。直接调用即:f1调用f

4、1;间接调用即f1调用f2,f2再调用f1;递归问题经典问题:汉尼塔问题:定义一个函数hanoi,运用递归思路来解决问题。需要将n个盘子从A塔(初始塔)经B塔(辅助塔)移动到C塔(目标塔),其过程为,(1)将n-1个盘子从A塔(初始塔)经过C塔(辅助塔)移动到B(目标塔);(2)将第n个盘子从A(初始塔)移动到C(目标塔);(3)将n-1个盘子从B塔(初始塔)经A塔(辅助塔)移回C塔(目标塔);由上可见,每次移动时的初始塔、辅助塔、目标塔都是不同的。而第(1)、(3)两步又可以当作两个全新的hanoi 问题进行处理,从而形成递归。定义函数    void hanoi(盘子数

5、,初始塔名,辅助塔名,目标塔名)    用来打印将n个盘子从初始塔移动到目标塔的策略                  void move(塔名,塔名)                    用来打印一次具体的移动操作。具体代码:#include<stdio.h>void move(char from,char to) printf("%c -> %

6、cn",from,to);void hanoi(int n,char one,char two,char three) if(n=1)  move(one,three); else  hanoi(n-1,one,three,two);  move(one,three);  hanoi(n-1,two,one,three); void main() int n; char a,b,c,d; printf("请输入盘子数:"); scanf("%d&

7、quot;,&n);  d=getchar();/C语言中连续使用输入语句时,会出现垃圾字符的问题,   /故此处使用一个额外的变量存放垃圾变量,避免影响程序运行。该内容已超纲,可不理解,感兴趣的话可以自行百度。  printf("请用一个字母分别代表初始塔、辅助塔、目标塔,用逗号进行分隔:"); scanf("%c,%c,%c",&a,&b,&c); printf("%c%c%c",a,b,c); printf(

8、"该问题的解决策略为:n"); hanoi(n,a,b,c);上文中提到的垃圾字符问题,在连续使用输入语句,输入字符,如scanf(),getchar()时会出现。因前一次输入需要敲回车来结束,该回车被记录在输入流中,被第二次的输入语句作为输入的内容所接收。避免这种情况的方法有两种:一、第一种方法是多定义一个字符变量,如char c;这样。把变量c分别放到输入后面。二、第二种方法是使用getche()函数,而不使用scanf()和getchar()。这个函数也是接收字符的,但是它不等待回车的输入!而直接把字符送入流中,这样就可以避免垃圾字符的出现了。若函数的函数为

9、一个数组,则调用时只写数组名,如function(array);主程序中调用的函数中数组类型与函数定义中的数组类型应相同。函数定义中的形参数组可以不指定大小。(可以用一个整型参数来传递数组大小)用数组名做函数实参时,不是吧数组元素的值传递给形参,而是将数组初地址传递给形参。    利用函数进行选择法排序的算法:#include<stdio.h>void sort(int a,int n) int i,j,maxi,t; for(i=0;i<n-1;i+)  maxi=i;  for(j=i+1;j<n;j+)&

10、#160;  if(amaxi<aj)    maxi=j;  t=ai;  ai=amaxi;  amaxi=t; void main() int a10,i; for(i=0;i<10;i+)   printf("请输入数组中第 %d个元素的值:",i+1);  scanf("%d",&ai);  sort(a,10); printf("排序后的顺序为:");&#

11、160;for(i=0;i<10;i+)  printf("%5d",ai);多维数组名做函数参数:在定义函数式,对形参数组的定义可以指定每一维的大小,也可以省略第一维的大小说明,但不能省略第二维及其他高维大小说明。局部变量:在函数内部定义的变量是内部变量,只在函数范围内有效,在此函数外不能使用。注:若在函数内部的复合语句中定义变量,则只在复合语句中有效。全局变量:在函数之外所定义的变量称为外部变量,也成全局变量,全局变量可供文件中所有的函数使用,其作用域从定义开始到文件结束。注:若在同一文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量失效

12、。如果不是必要,应尽量减少外部变量的使用:(1)在程序全程都会占用储存单元;(2)使函数通用性降低。;(3)降低了程序的清晰性。变量可分为静态存储变量(整个文件中分配存储空间)和动态存储变量(按需分配存储空间)。auto变量:函数中局部变量或形参为动态变量,自动分配空间,自动释放空间,称为自动变量。static变量:利用static申明局部变量可以使局部变量以静态方式存储,变量使用完毕后不释放存储单元,在下一次调用该函数时,该变量有值(在文件运行周期内)。注意:静态局部变量若不赋初值,则编译系统自动赋初值为0(数值型变量)或者空字符'0'(字符变量),并且该变量只能在定义它的函

13、数内使用,其他函数不能使用。利用static申明外部(全局)变量,称为静态外部变量,保证只被定义其的文件使用,而不能被其他文件使用(即使使用了extern语句)。register变量(实际中应用较少):一般情况下变量存储与内存中,针对有些频繁使用的变量,可将其存储于CPU的寄存器中。(局部静态变量不能定义为寄存器类型)extern语句:用extren在函数内部申明外部变量,可以使用在该函数代码处尚未定义的外部变量,扩展外部变量作用域。用extran在多文件的程序中声明变量,可使该文件使用其他文件中的外部变量。变量声明与定义的关系,声明包括定义,但并非所有声明都是定义。定义性声明,如:int a;,称为定义,同时也是声明。引用性声明,如:extern A;,称为声明,但不是定义。内部函数:只能被本文件中其他函数调用的函数,在定义时需要在类型标识符前加上static。外部函数:可以供其他文件中函数调用的函数,在定义时在类型标识符前加上extren(可省略不写extern,默认为外部函数)。在需要调用该函数的文件中也需要使用extern进行声明。提供用函数删除字符串中的方法(较为方便):void delete_stri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论