第7章c函数.ppt

上传人:本田雅阁 文档编号:3130760 上传时间:2019-07-14 格式:PPT 页数:46 大小:406.02KB
返回 下载 相关 举报
第7章c函数.ppt_第1页
第1页 / 共46页
第7章c函数.ppt_第2页
第2页 / 共46页
第7章c函数.ppt_第3页
第3页 / 共46页
第7章c函数.ppt_第4页
第4页 / 共46页
第7章c函数.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《第7章c函数.ppt》由会员分享,可在线阅读,更多相关《第7章c函数.ppt(46页珍藏版)》请在三一文库上搜索。

1、1,第7章 函 数,青岛理工大学琴岛学院 计算机系,C 语言程序设计,2,库函数 函数的定义和返回值 函数的调用 函数的说明 调用函数和被调用函数之间的数据传递 函数的递归调用,主要内容:,3,函数的概念和函数的定义,C语言函数的概念 将一个C程序分为若干模块,每个模块实现一 个特定的功能,在C语言中用函数来实现模块的 功能。函数是一段完成特定任务的程序。 程序中反复使用的程序段应写成函数的形式,某 些只用一次的程序段往往也写成函数形式。 一个好的方案是相同的程序段在整个程序中只出 现一次。 引入函数的优点: 减少重复编写程序的工作量; 使程序便于调试和阅读。,4,一个C程序由一个主函数和若干

2、个其他函数构成; 由主函数调用其他函数,其他函数可以互相调用; 一个源程序单位为一个编译单位; C的执行从main函数开始,在main函数结束。 函数的分类: 标准函数(库函数)如 printf、scanf 自定义函数。 函数的形式:有参函数 如:max(int a,int b) 无参函数 如:printstar(),5,例 从键盘输入两个整数,并将这两个整数之和显示出来。,int show(a,b) int a, b; int c; c=a+b; return(c ); ,#include void main( ) int x,y,z; printf(“Please input two in

3、tegers:n”) ; scanf(“%d%d” , ,主函数,子函数,6,C语言提供了丰富的库函数 如数学函数(pow()、sqrt())、输入输出函数、字符和字符串处理函数等。可直接调用这些函数,不必重新自己编写。 调用库函数时,要加相应的include命令行 如:#include “stdio.h” #include 对库函数的一般调用形式: 函数名(参数表) 例如:printf(“%d”,x),7.1 库函数(详见附录8),7,调用库函数的两种形式:,出现在表达式中: 作为独立的语句:,例:求y=x2.5+1.3,可以调用pow函数来实现y=pow(x,2.5)+1.3,printf

4、(”*n”);,库函数使用小结: 1、函数功能 2、函数参数的数目和顺序,及各参数意义和类型 3、函数返回值意义和类型 4、需要使用的包含文件,8,7.2.1函数定义一般形式:,合法标识符,函数体,例 有参函数 int max(int x,int y) int z; z=xy?x:y; return(z); ,例 有参函数 int max(int x, y) int z; z=xy?x:y; return(z); ,例 无参函数 printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); ,7.2 函数的定义与返回值,缺省int型 无

5、返回值void,类型名 形式参数1,类型名,形式参数2,例 求双精度数之和 double add(double a,double b) double s; s=a+b; return s; ,函数 首部,9,说明:,函数没有返回值时函数为void类型,不写返回类型时默认为int型。 在同一程序中函数名必须唯一,形式参数名只要在当前函数中唯一即可,可以与替他函数中的变量名相同。 定义的函数可以没有形参即无参函数,函数体也可以没有任何操作即空函数,但函数名后的( )不能省 函数中除形参外,用到的变量都要在说明部分定义说明 不能在函数的内部定义函数。,int xy(int a,int b) int

6、x,y,z; z=x+y; return(); int xz (int x,int y) int i,j,k; k=i*j; return(); ,int xy(int a,int b) int x,y,z; z=x+y; return(); int xz (int x,int y) int i,j,k; k=i*j; return(); ,10,函数的返回值是通过return语句返回的,功能: 终止当前函数的运行,返回调用该函数的地方,若有返回值,将返回值带回。,return 语句的三种格式:,return 表达式 ; return (表达式); return;,7.2.2函数的返回值,11

7、,return语句中表达式值的类型一般应和函数的类型一致,如果不一致,系统自动将表达式类型转换成与函数类型一致。 一个函数内,根据需要可以在多处出现return语句,在函数体的不同部位退出函数,但无论有多少,return只能执行一次 return语句中不含表达式时,作用只是返回到调用函数,并没有确定的值。 函数体内可以没有return语句,程序一直进行到最后的“”然后返回到调用函数。也没有确定的值带回。,说明:,如果需要返回确定的值就一定加上return,如果不需要返回值,加不加函数执行完都会返回到调用函数。,12,main() float a,b; int c; scanf(“%f,%f“,

8、 ,【例1】return返回值类型的转换,运行情况如下: 输入: 1.8,2.9 输出结果: Max is 2,float c;,%f,运行情况如下: 输入: 1.8,2.9 输出结果: Max is 2.900000,float,13,printstar( ) printf(“*n”); main( ) int a; a=printstar( ); printf(“%d“,a); ,输出:* 11,void printstar( ) printf(“*“); main( ) int a; a=printstar( ); printf(“%d“,a); ,编译错误!,【例2】函数体无retur

9、n将带回不确定值 .,int a;a=1;,输出:-858993460,14,函数名(实在参数表),7.3 函数的调用,7.3.1函数调用的一般形式:,调用方式 函数语句: 例 printstar(); 函数表达式: 例 m=add(3.0,4.0); for(y=0,i=1;i0) 函数参数: 例 printf(“%d”,max(a,b); m=max(a,max(b,c);,15,7.3.2关于函数调用的要求:,调用函数时,函数名必须与所调用的函数名字完全一致。 函数必须先定义后调用(int型或char型除外)。 如 double add(double a,double b) double

10、 s; s=a+b; return s; main() double y,p,q; y=add(p,q); ,main() int a,b,c; scanf(“%d,%d“, ,16,函数调用时,实参的个数必须与形参相同,并且顺序相同。 实参与形参类型要一致(字符型与整型可以兼容)若形参与实参类型不一致,自动按赋值兼容的规则转换 实参可以是常量、变量或表达式,但要求它们有确定的值。 当函数被调用时系统才给形参分配内存单元。调用结束后,所占内存会被释放。所以这种变量只在函数体内部起作用。,17,形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式,main(

11、) int a,b,c; scanf(“%d,%d“, ,函数的形式参数与实际参数,【例】比较两个数并输 出大者,18,7.4函数的说明,当把被调函数(返回值是非int和char类型)的定义放在主调函数之后时,要在调用之前对函数进行说明(函数原型说明)。 7.4.1函数说明的一般形式,函数类型 函数名(参数类型1,参数类型2,) 函数类型 函数名(参数类型1 参数名1,),如:double add(double ,double ) double add(double p,double q),19,注意:,函数说明可以是一条独立的说明语句 如: double add(double ,double

12、 ); 也可以与普通变量一起说明 如: double x,y,add(double ,double ); 说明时的参数名是虚设的,可以是任何的用户标识 符,可以和程序中的任意用户标识符同名,也不必与 函数的形参名一致。 函数说明中的类型必须与函数返回值的类型相同 函数说明是告诉编译系统所用函数的类型、参数个数及类型,以便进行有效的类型检验。,20,下列情况下,可不作函数说明 当函数返值是char或int型,系统自动按int型处理 当被调函数定义出现在主调函数之前 7.4.2函数说明的位置 1.在函数内部:只能在本函数内调用函数 2.在函数外部:从说明开始直至函数定义,所有的位置都可调用函数,2

13、1,#include main() float a,b; int c; scanf(“%f,%f“, ,int型函数可不作函数说明,/*ch7_5.c*/ #include float add(float x, float y) float z; z=x+y; return(z); main( ) float a,b,c; scanf(“%f,%f“, ,被调函数出现在主调函数 之前,不必函数说明,#include main() float add(float,float); /*function declaration*/ float a,b,c; scanf(“%f,%f“, ,float

14、 add(float a,float b);?,【例】函数说明举例,#include float add(float,float); fdd(int x,int y) add(c,d); main() c=add(a,b); float add(float x, float y) ,函数说明在函数体外,一直到函数定义处都可用,22,7.5 调用函数和被调用函数之间的数据传递,三种方式: 1.实参 形参 2.return语句把函数值返回调用函数。 3.通过全局变量(不提倡使用),23,【例7.2】判断执行结果 #include void try(int,int,int); main() int

15、x=2,y=3,z=0; printf(“(1)x=%d y=%d z=%dn”,x,y,z); try(x,y,z); printf(“(4)x=%d y=%d z=%dn”,x,y,z); void try(int x,int y,int z) printf(“(2)x=%d y=%d z=%dn”,x,y,z); z=x+y; x=x*x; y=y*y; printf(“(3)x=%d y=%d z=%dn”,x,y,z); ,举例:,24,上例中数据传递的过程:,main x y z try x y z try x y z,2,3,0,程序的运行结果: (1)x=2 y=3 z=0 (

16、2)x=2 y=3 z=0 (3)x=4 y=9 z=5 (4)x=2 y=3 z=0,25,【例7.3】判断执行结果,#include void swap(int,int); main() int x=10,y=20; printf(“(1)x=%d y=%dn”,x,y); swap(x,y); printf(“(4)x=%d y=%dn”,x,y); void swap(int a,int b) int t; printf(“(2)a=%d b=%dn”,a,b); t=a; a=b; b=t; printf(“(3)a=%d b=%dn”,a,b); ,程序的运行结果: (1)x=10

17、 y=20 (2)a=10 b=20 (3)a=20 b=10 (4)x=10 y=3,26,举例:,求 1+2+3+100的和 main() int i,s; for(i=1;i=100;i+) s+=i; printf(“s=%d”,s); ,int s; s=sum(100); printf(“s=%d”s);,int sum(int a) int i,s; for(i=1;i=a;i+) s+=i; return(s);,27,7.6 程序举例,【例7.4】编写程序isprime(int a),用来判断a是否为素数,若是素数,函数返回整数1,否则返回0,#include int isp

18、rime(int); main() int x; printf(“Enter a integer number: ”); scanf(“%d”, ,28,【例7.5】验证任意偶数为两个素数之和,并输出这两个素数,思路:将验证的数放在x中,可依次从x中减去i,i从2变化到x/2 算法: 1.i2 2.判断i是否为素数,若是执行3,若不是,执行5 3.判断x-i是否为素数,如是执行4,若不是,执行5 4.输出结果,返回调用函数 5.使i增1 6.重复执行2,直到ix/2,29,#include int isprime(int); Void even(int); main() int a; prin

19、tf(“Enter a even number: ”); scanf(“%d”, ,int isprime(int a) ,30,例7.6 编写函数sum(int n),用以求 ,和数作为函数值返回f(x)=x2+1,#include int sum(int); int f(int); main() int a,b; printf(“Enter a integer number: ”); scanf(“%d”,31,【例7.9】编写函数统计输入字符的个数,用字符结束输入,在主函数中调用此函数,输出结果,#include long countch(); main() long n,b; n= c

20、ountch(); printf(“n=%ldn”,n); long countch() long cn; for(cn=0;getchar()!=;cn+); return cn; ,32,此页以后的内容,由教师决定是否讲解!,33,7.6函数的嵌套调用,C规定:函数定义不可嵌套,但可以嵌套调用函数,main函数 调用函数 A; ,函数 A 调用函数 B; ,函数 B ,34,【例】函数的嵌套调用,main( ) int n=3; printf (“%dn“,sub1(n); ,sub1(int n) int i,a=0; for (i=n; i0; i-) a+=sub2(i); retu

21、rn a ; ,sub2(int n) return n+1; ,程序输出结果: 9,35,7.7 函数的递归调用(第11.3章),递归调用:在函数的执行过程中直接或者间接的调用函数本身。,F函数,调用F函数,F1函数,调用F2函数,F2函数,调用F1函数,直接递归 间接递归,说明 C编译系统对递归函数的调用次数没有限制 注意防止出现无终止的递归调用,要有使程序趋向于结束的条件,36,【例11.3】编一递归函数求n!。,思路:以求4的阶乘为例: 4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。 递归结束条件:当n=0时,n!=1。 递归公式:,37,程序如下:,#inclu

22、de int fac(int n) int f; if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f); main() int m, y; printf(“Input a integer number:“); scanf(“%d“, ,运行情况如下: Input a integer number:4 4!=24,38,递归调用过程,递 推 main( ) fact(4) fact(3) fact(2) fact(1) y=fact(4); f=4*fact(3); f=3*fact(2); f=2*fact(1); f=1; return 24 retur

23、n 6 return 2 return 1 回 归,39,例:求年龄的问题,5个人坐在一起,问第五个人多大,他说比第四个人大2岁,第四个人说比第三个人大2岁,第三个人又说比第二个人大2岁,第二个又说比第一个人大2岁,最后第一人说他10岁。请问第五个人多大?,分析:age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=10,40,函数的执行过程,递 推,回 归,41,age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c) ; main() pr

24、intf(“%d”,age(5); ,42,结束 阅读书中例题7.47.10,43,例:汉诺塔的问题,一个古典的数学问题,在古代的梵塔中有三个座A、B、C,A座上有64个盘子,大小不等。大的在下,小的在上,有一个老和尚想将这64个盘子移到C座上, 要求:每次只允许一个盘子,并且要始终保持大的在下,小的在上。,44,分析:,将n个盘子从A座移动到C座的步骤: 将A上n-1个盘子借助C座移动到B座上 将A座上剩下的一个盘子移动C上 将n-1个盘子从B座借助A座移动到C上 上述的三个步骤可以分成两类操作: 将n-1个盘子从一个座移动到另外一个座上 hanoi()函数实现 将一个盘子从一个座移动到另一个座上 move()函数实现,45,void move(char x,char y) printf(“%c-%cn“,x,y); 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); ,46,main() int m; printf(“please input the number of the diskes:“); scanf(“%d“, ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1