第6章 函数与编译预处理-xg

上传人:野鹰 文档编号:2655797 上传时间:2017-07-26 格式:PPT 页数:103 大小:910.50KB
返回 下载 相关 举报
第6章 函数与编译预处理-xg_第1页
第1页 / 共103页
第6章 函数与编译预处理-xg_第2页
第2页 / 共103页
第6章 函数与编译预处理-xg_第3页
第3页 / 共103页
第6章 函数与编译预处理-xg_第4页
第4页 / 共103页
第6章 函数与编译预处理-xg_第5页
第5页 / 共103页
点击查看更多>>
资源描述

《第6章 函数与编译预处理-xg》由会员分享,可在线阅读,更多相关《第6章 函数与编译预处理-xg(103页珍藏版)》请在金锄头文库上搜索。

1、第六章 函数与编译预处理,6.1 模块化程序设计与函数6.2 函数的定义与调用6.3 函数的递归调用6.4 变量作用域与存储方式6.5 编译预处理6.6 函数设计举例,教学目的和基本要求:,要求学生了解模块化程序设计的思想,掌握函数的定义及调用,理解变量的作用域与存储方式的概念,理解编译预处理的概念。,教学重点:,函数的定义及调用、递归调用、变量的作用域。,6.1模块化程序设计与函数,在设计较复杂的程序时,我们一般采用的方法是:把问题分成几个部分,每部分又可分成更细的若干小部分,逐步细化,直至分解成很容易求解的小问题。这样的话,原来问题的解就可以用这些小问题来表示。 把复杂任务细分成多个问题的

2、过程,就叫程序的模块化。模块化程序设计是靠设计函数和调用函数实现的。,模块与函数,C语言程序由基本语句和函数组成,每个函数可完成相对独立的任务,依一定的规则调用这些函数,就组成了解决某个特定问题的程序。任务、模块与函数的关系:,看这样一个问题:求200,1000的双胞胎数的对数。双胞胎数:两素数差为2称为双胞胎数。 这是我们上一章结束的一道练习题,下面的左边是我们当时编的程序。,main( ) int a,b,n=0,I; for(a=200;a=998;a+) for(I=2;Ia;I+) if(a%I=0) break; if(a=i) b=a+2; for(I=2;Ib;I+) if(b

3、%I=0) break; if(b=i) n+; printf(“n%d”,n);,我们注意到,程序中用 筐住的部分是完成了相同的功能,即判断一个数(a或b)是否是素数。我们可以考虑用一个独立的函数来完成判断素数的功能,在主函数中调用此函数即可。如下:,main( ) int a,b,n=0; int f(int x); for(a=200;a=998;a+) if(f(a)=1) b=a+2; if(f(b)=1) n+; printf(“n%d”,n);,int f(int x) int I; for(I=2;Ix;I+) if(x%I=0) break; if(x=I) return 1

4、; else return 0;,下面我们详细介绍函数调用的格式和语法规定。,6.2 函数的定义与调用,在C语言中,函数(Function)是一个处理过程,可以进行数值运算、信息处理、控制决策,即一段程序的工作放在函数中进行,函数结束时可以携带或不带处理结果。 库函数(标准函数):系统提供自定义函数:用户自己写,C语言程序处理过程全部都是以函数形式出现,最简单的程序至少也有一个main函数。函数必须先定义和声明后才能调用。,标准库函数,C语言有丰富的库函数,这些函数的说明在不同的头文件(*.h)中。,想要调用标准的库函数,就必须include。,#includemain()printf(“%d

5、”,1024*768);,自定义函数,可以把完成一个任务的过程写成函数。,int A_to_a(int capital)int small; if (capital=A & capital=Z) small= capital (A-a); return small;,“函数”的主要知识点,函数的定义 函数的参数和返回值 函数的调用 嵌套和递归 变量的作用域,函数举例,#include main() int a,b,m; /*说明变量*/ int max(int a,int b); /*函数声明*/ scanf(%d,%d,&a,&b); /*调用库函数scanf*/ m=max(a,b); /

6、*调用字定义函数max*/ printf(max=%dn,m); /*调用库函数printf*/ getch(); /*调用库函数getch*/,函数举例,int max(int a,int b) /*定义函数max*/ int y; y=(ab)? a:b; /*条件表达式 */ return y;,自定义函数的声明,自定义函数在调用前应先声明。使系统知道将要用到某个函数及它的类型,以便处理。函数声明应与该函数定义时给出的函数类型与名字、形参的个数、类型、次序相一致。,求1!+2!+3!+10!,算法 i =1; s=0; 当 i = 10 s=s+ i! 定义求 i! 的函数,求1!+2!

7、+3!+10! 程序,void main() long mm( int ); /*自定义求阶乘函数应先声明 */ int i; long s=0; for (i =1; i =10; i +) s+= mm(i ); /*调用求阶乘函数,求I的阶乘 */ printf(“n%ld”,s);,定义求 n! 的函数,long mm( int n) long t=1; int i; for (i =1; i b)? a:b; return y; ,调用时:m=max(3,6); m=max(a,b);,形式参数与实际参数的关系,形式参数在函数中是变量名,在函数调用时,形参被分配相应的内存实际参数是表

8、达式负责向对应的形参标识的内存单元传递数据实参与形参必须个数相同对应的形参和实参的类型必须一致,实参与形参,例:主调函数中有如下语句: scanf(%d,%d,&a,&b); m=max(a,b+3);如果输入 6,2函数 int max(int a,int b)形参 a 得到第一个实际参数a的值 6形参 b 得到第二个实际参数b+3的值 5,函数返回值,函数返回值通过return语句获得函数返回值的类型就是函数的类型 return y; 将变量y的值返回给调用者 return y+3; 将表达式的值返回给调用者,return 的数据类型与函数的类型矛盾时,自动将数据转换成函数的类型,int

9、funct1() char ch; while (ch=getch( )z) ; return ch; 调用: i=funct1(); /* 返回的是int类型 */,函数没有返回值, 函数定义成空类型,void putline() int i; for (i=0;i35;i+) printf(-); printf(n); ,函数的功能就是输出35个-调用: putline( ); 应该的语句形式 i=putline( ); 是错的,调用函数,a=function(x,y);或者function(x,y);,取返回值只是操作,解决更复杂问题时可以嵌套调用。,long fac(int k)lon

10、g f=1; int i; for(i=1;i=n;i+) f=f*i; retrun f;long combination(int n ,int m)long c; int i; c=fac(m)/(fac(n)*fac(m-n) ); retrun c;主函数:main( ) int n,m; long c; scanf(“%d,%d”, &n,&m); c=combination (n,m); prnit(“%ld”, c);,理论上可以a(b(d(e(x),c(f)般嵌套无数层。,6.3 函数的递归调用,函数调用它本身,称为递归。直接在函数内调用自己为直接递归,通过别的函数调用自己为间

11、接递归。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身。每调用一次就进入新的一层。,void a( ). a( );.,void a( ). b( ); .void b( ). a( ); .,递归在解决某些问题中,是一个十分有用的方法。因为其一,有的问题它本身就是递归定义的;其二,它可以使某些看起来不易解决的问题变得容易解决,写出的程序较简短。,例1 递归方法求n!,由于 n!= n*(n-1)! 是递归定义所以求n! (n-1)! (n-1)! (n-2)!(n 2)! (n-3)! 0!的问题, 根据公式有0!=1。 再反过来依次求出1!,2!直到最后求出n!。,递归方

12、法求n!,long fac( int n)long f; if (n=0) f=1; else f=n* fac(n-1); return f;main( )long y; int n; scanf(“%d”,&n); y=fac(n); printf(“%d!=%ld”,n,y);,刚开始的时候,这个n是前面输入的需要阶乘的n,所以在这里带入的值是n,而这个函数里又调用了本身,不过参数已经变成了n-1,所以这里再次调用时参数已经变成了n-1注意:上次调用fac(n)还没有完,只是由于遇到了fac(n-1)而执行fac(n-1)去了.,而在调用fac(n-1)时同样遇到了要调用fac(n-2)

13、的问题,于是一层一层的包裹下去,每次调用的时候都会在内部调用一个结构相同但变量不同的函数,直到。,直到调用到fac(0)时,由于内部if判断,已经不需要再继续调用另一个fac(n-1),而直接有了f=1,fac(0)已经执行完毕,它的返回值被fac(1)中的f=n*fac(n-1)语句赋给了f值,同时返回了f。而这个返回的f又被fac(2)乘上当前的n值以后继续返回f,直到最后的fac(n)都做完了,f的值被返回到了它的调用点:主函数中,这样就是一个递归运算。,例2 递归举例,问题: 第1个月有1对兔子 过2个月,兔子就可每个月生1对兔子 问第n个月有多少对兔子? 分析: 设第n个月有f(n)对兔子 根据题意有 f(0)=0, f(1)=1 f(n)= f(n-1) + f(n-2) f(n-1): 前一个月的兔子数 f(n-2): 本月生的兔子数,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号