(整理)C语言——第八章函数. 下载本文

精品文档

定义无参函数:

类型标识符 函数名() {声明+语句}

定义有参数的函数:

类型标识符 函数名(形式参数列表) {声明+语句}

不带返回值的函数类型为空类型,即void类型。该函数中不应出现return语句。 若需要返回值,则在语句部分加入 return(表达式); 语句。return的数据类型必须与函数类型标识符相同。

return后面的括号可以不要,直接使用return 表达式 的方式。 return语句代表着函数结束,return后的语句不再执行。

如果在定义函数时,未指明函数类型,则默认为int型,故函数标识符可省略,但一般建议写出。

定义函数时所用的参数叫做形参,在未调用函数时,不为其分配内存单元,当函数被调用时,为形参分配内存单元,在调用结束时释放。在函数调用时,所输入的参数叫做实参。实参形参的类型必须相同或者赋值相容。函数调用中,实参的值不会发生变化。即函数调用处理的是与实参值相同的形参。

不同系统在接受实参时,对实参的处理顺序不一样,有的自右向左,有的自左向右。如:i=2;f(i,++i); 自右向左为f(3,3); 自左向右为f(2,3); 应尽量避免这种容易产生混乱的引用方法。

精品文档

精品文档

程序所要调用的函数必须是已经存在的库函数或者已经定义的用户函数。若用户函数的定义的位置在调用它的函数的定义位置前,则无需声明,若用户函数的定义的位置在调用它的函数的后面,则需要进行声明。声明方式和定义变量相类似,如:int a(); 声明函数时,形参的参数名可以省略。编译系统只检查参数个数及参数类型。

另外,若被调用函数为整型或已在文件的开头进行了申明,则可以在main函数内不进行声明。

C语言中的函数定义不能进行嵌套定义,即一个函数内部定义另一个函数,但可以进行嵌套调用。注意:是函数的定义内部不能有其他函数的定义,但可以在函数的定义内部调用另一个函数的定义。

在调用一个函数过程中又出现间接或直接调用该函数本身,称为函数递归调用。 直接调用即:f1调用f1;间接调用即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(盘子数,初始塔名,辅助塔名,目标塔名) 用来打印将n个盘子从初始塔移动到目标塔的策略

void move(塔名,塔名) 用来打印一次具体的移动操作。 具体代码: #include

void move(char from,char to) {

printf(\}

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); } }

精品文档