资源预览内容
第1页 / 共60页
第2页 / 共60页
第3页 / 共60页
第4页 / 共60页
第5页 / 共60页
第6页 / 共60页
第7页 / 共60页
第8页 / 共60页
第9页 / 共60页
第10页 / 共60页
亲,该文档总共60页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第8章 函 数 8.1 概述一个较大的程序一般要划分成多个程序模块,或 把多次重复执行的一段程序独立编写一个模块, 这些模块称为函数,一个C程序就是由一个主函 数和若干函数构成的。main()abcdehgfij主函数函数1函数2函数21第8章 函 数 例 8.1main() printstar();print_message();printstar(); printstar()printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * n“);print_message()printf(“* How do you do ! *n“); 主函数调用打印星号函数 调用打印信息函数再调用打印星号函数 打印星号函数打印信息函数2关于函数说明: 1. 一个源程序由若干函数组成,源文件为编译单 位, 即一次全部编译完。 2.一个C程序可由一个或若干个源文件组成,可别编辑、编译。经连接生成可执行文件。 3.一个C 程序从main函数开始,在main函数中结 束。main() ;。 4.所有函数都是平行的,即相互独立,互不从属。 5.从用户角度,函数分为:(1)标准函数(如:数学计算, 字符处理) (2)用户定义的函数:解决专门问题。36、从函数形式上,分为:(1)有参函数:主调用函数和被调函数之间 有参数传递。主调用函数(实参) 被调函数(形参)(2)无参函数:主调函数和被调函数之间无参数传递,一般被调函数也不带回返回值。传送48.2 函数定义的一般形式 1、无参函数的定义形式:类型标识符 函数名( )说明部分语句无参函数无返回值,可省略类型标识符符。 如:printstar()printf(“* * * * * * * * * * n”);52、有参函数定义的一般形式:类型标识符 函数名(形式参数列表)声明部分语句 例: int max(x,y)int x,y;int z;z=xy?x:y;return(z);声明部分声明部分定义整型函 数max()函数max 的返回值63、允许有空函数的存在,形式为:类型表示符 函数名( ) 如: int max(a,b) int a,b; int max()函数max 的返回值一般是待 编函数78.3 函数参数和函数的值 8.3.1 形式参数和实际参数形式参数:在定义函数时函数名后面括号中的变量名称形式参数,简称形参。实际参数:在调用函数时函数名后面括弧中的表达式称实际参数,简称实参。举例说明:main()主函数调用前面定义的max函数:8main () int a, b,c; scanf(“%d,%d“, c=max(a,b); printf(“Max is %d“,c); max(int x, int y) int z; z=xy?x:y; return (z); 实参形参形参声明给返回参数赋值 返回max的值9关于形参和实参的说明: 1、形参在函数没被调用时,不分配内存单元;只有被调用时才分配,调用结束后释放。 2、实参可以是常量、变量或表达式,但要有确定值。形参如果是数组名,则将数组的首地址传递给对应的形参。 3、在被定义的函数中,必须指定形参类型。如:max (int x, int y); 4、形参与实参对应的类型和个数必须一致。如: max(a,b) max (int x, int y);10关于形参和实参的说明: 5、实参对形参变量的数据传递是“值传递”,形参值的改变并不会改变主调函数实参值。 6、ANSIC允许在列出形参列表时同时定义类型 。int max(int x, int y)等价于:int max( x, y) int x, int y118.3.2 函数的返回值主函数调用函数得到返回值。对返回值说明:1、函数返回值通过 return语句获得:一个函数中可以包含多个return 语句,但只 能有一个起作用。以下retutrn形式都可以:return z;或return(z);或return(xy?x:y); 2、定义函数类型必须与返回值类型一致。 int max(float x,float y)int z;return z char letter(char c1,char c2)char creturn c double min(int x,int y)double z;return z128.3.2 函数的返回值主函数调用函数得到返回值。对返回值说明:3、函数返回值类型不同于函数类型时,自动转 换为函数类型。max (float x,float y);float z;return (z) 4、如果函数中不使用return语句,函数将带回 一不确定的值。 5、为了明确表示“不带回值”可用void定义函数 为无类型(空类型)。因max是整型所 以z 转换为整型13main ( ) float a, b; int c; scanf(“%f,%f“, c=max(a,b); printf(“Max is %d“,c); max(x,y) float x,y; float z; z=xy?x:y; return (z); 定义为实型默认为整型输出整型数14main ( ) float a, b; int c; scanf(“%f,%f“, c=max(a,b); printf(“Max is %d“,c); max(x,y) float x,y; xy?x:y;无返回语句值不定15void printstar() printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * n“); void print_message() printf(“* How do you do ! *n“); main() printstar(); print_message(); printstar(); 定义空类型函数定义空类型函数调用函数语句不变168.4 函数的调用 8.4.1 函数调用的一般形式:函数名(实参列表); Turbo C传递实参自右向左。 8.4.2 函数调用的方式:按函数出现的位置分三种调用方式: 1、函数语句: 把函数作为一个语句。printstar(); 2、函数表达式:把函数作为一个表达式c=a+max(a,b); 3、函数参数:函数调用作为另一个函数的实参 。d=max(c,max(a,b);17main() int i=2,p; p=f(i,+i); printf(“%d“,p); int f(int a,int b) int c; if(ab)c=1; else if(a=b)c=0; else c=-1; return(c);先计算+i结果 ?修改为后 计算+i188.4.3 对被调函数的说明一个函数调用另一个函数须具备条件: 1、被调用函数必须存在。 2、如果被调函数是库函数,则需在文件开头用#inlcude形式包含所在库文件。比如用到:sqrt 则需包含 math.h strcpy() 则需包含 string.hgetchar() 则需包含 stdio.h 3、调用自定义的函数,一般应在主调函数内对调用函数的返回值类型作说明。一般形式:类型说明符 被调用函数的函数名( )19main() float a, b, c; float add(); scanf(“%f,%f“, c=add(a,b); printf(“sum is %f“,c); float add(x,y) float x,y; float z; z=x+y; return (z);对被调用的函 数进行说明否则出错 被调用的函数20C规定,以下情况调用函数前不用说明: 1、函数返回整型或字符型。 2、被调函数在主调函数之前定义(举上例)。 3、在函数开头或函数外部已说明了函数类型。 如: float add();main().folat add(float x,float y)再函数外部说明218.5 函数的嵌套调用C规定: 函数不能嵌套定义,但能嵌套调用。嵌套调用的示意:main 函数 a 函数 b 函数 调用a函数 调用b函数 结束调用返回22main() int n; scanf(“%d“, printf(“%d“,sum(n); sum(int m) int i,s; s=0; for(i=1;i1)递归结束递归调用调用递归函数age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+227递归函数调用执行过程mainage(5)=18age(4)=16age(3)=14age(2)=12age(1)=10age(3)+2age(2)+2age(1)+2age(4)+210输出age(5)age(5)age函数n=5n=4n=3n=2n=1288.8 用递归方法求 n!一般方法: main() int i, sum=1, n; scanf(“%d“, for(i=1;i1 main() int n; scanf(“%d“, printf(“%d“,fac(n); float fac(n) int c;if(n=1|n=0)c=1;else c=n*fac(n-1);return(c);递归结束递归调用31计算实型数(大数的阶乘),修改如下: main() int n; float fac(); scanf(“%d“, printf(“%f“,fac(n);float fac(int n) float c;if(n=1|n=0)c=1;else c=n*fac(n-1);return(c);32Hanoi(汉诺)塔问题相传古代印度“布拉玛庙”的僧侣们玩的一 种游戏,游戏的装置是一块铜板上有三根针, 最左针上由大到小串有64个金盘,游戏的规 则是将64个金盘移到最右针上,每次移动一 个金盘且始终保持小盘在大盘上面。计算移动的次数:264-1=18,446,744,073,709,511,615次计算机计算每微秒移动1次需100万年如果人每秒移动1次需5800亿年33Hanoi(汉诺)塔问题这是一个只有用递归方法才能解决的问题。AC,AB,CB,AC,BA,BC,AC 将 n-1个盘子从一根针上移到另一根针上 将1个盘子从一根针上移到另一根针上ABC 小中小大小中小(23 1=7次)34Hanoi(汉诺)塔问题老和尚的做法:如果有一个和尚能将63个盘 子从一个针移到另一个针就可以了, 老和尚只需做: (1)命令第2个和尚将63个盘子从A针移到B针; (2)自己最后的一个盘子从A针移到C针; (3)再命令第2个和尚将63个盘子从B针移到C针; 实际问题并没解决,第2个和尚又找第3个和尚第1人 =第2人=第3人 =第64人 63 个 盘62 个 盘1 个 盘35问题分析归纳: 将N个盘子从A针移到针可分为3步: (1)将A针上n-1个盘子借助C针移到B针; (2) 把A针上剩下的一个盘子移到C针; (3)将B针上n-1个盘子借助
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号