- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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(塔名,塔名) ? ? ? ? ? ? ? ? ? ?用来打印一次具体的移动操作。
具体代码:
#includestdio.h
void move(char from,char to)
{
?printf(%c -- %c\n,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,n);
?
?d=getchar();//C语言中连续使用输入语句时,会出现垃圾字符的问题,
? ?//故此处使用一个额外的变量存放垃圾变量,避免影响程序运行。该内容已超纲,可不理解,感兴趣的话可以自行百度。
?
?printf(请用一个字母分别代表初始塔、辅助塔、目标塔,用逗号进行分隔:);?scanf(%c,%c,%c,a,b,c);?printf(%c%c%c,a,b,c);?printf(该问题的解决策略为:\n);?hanoi(n,a,b,c);}上文中提到的垃圾字符问题,在连续使用输入语句,输入字符,如scanf(),getchar()时会出现。
因前一次输入需要敲回车来结束,该回车被记录在输入流中,被第二次的输入语句作为输入的内容所接收。避免这种情况的方法有两种:一、第一种方法是多定义一个字符变量,如char c;这样。把变量c分别放到输入后面。二、第二种方法是使用getche()函数,而不
您可能关注的文档
- 4领略美利坚之四:夏威夷欧胡岛的海岸.ppt
- 5.1航迹绘算3.ppt
- 5.刘鸿文版材料力学-几何性质.ppt
- 5.实例五:移动动画3-文字沿路径移动.ppt
- 5.方 程.doc
- 5401青年摄影图片社——2011届毕业生司晓松.doc
- 50张优秀的黑白照片(50P).doc
- 57张百年经典UFO目击照片.doc
- 5正午太阳高度角.ppt
- 5影像相关原理.ppt
- 2024年湖南省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年江西省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年安徽省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年福建省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年广东省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年河北省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年河南省高考英语试卷(含答案解析)+听力音频.docx
- 2024年湖北省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年湖南省高考英语试卷(含答案解析)+听力音频+听力原文.docx
- 2024年江苏省高考英语试卷(含答案解析)+听力音频+听力原文.docx
文档评论(0)