C语言课件第六章函数2.0.ppt
《C语言课件第六章函数2.0.ppt》由会员分享,可在线阅读,更多相关《C语言课件第六章函数2.0.ppt(33页珍藏版)》请在三一文库上搜索。
1、第1页,第六章,模块化程序设计-函数,第二部分讲义,第2页,递归调用 变量的存储类别和作用域 预编译指令,本部分讲述:,第3页,三、函数的嵌套调用和递归调用,函数的嵌套调用是指,在执行被调用函数时,被调用函数又调用了其它函数。其关系可表示如下图。 void f2() void f1() f2(); main() f1(); ,1. 函数的嵌套调用,第4页,问题分析: 孪生素数是指间隔为2的两个素数,如:5和7 11和13 。 若求100-200间的孪生素数,可以先编写判断一个数是否素数的函数,然后再编写判断是否是孪生素数的函数。步骤如下: (1)定义一个判断素数的函数isPrime; (2)定
2、义一个判断是否是孪生素数的函数isTwinPrimes。 (3)在主函数中调用isTwinPrimes ,输出100到200之间的所有孪生素数。,例6.6,求100-200之间孪生素数,第5页,#include “stdio.h” #include “math.h” int isPrime(int m) int i,k; k=sqrt(m); for (i=2;i=k;i+) if(m%i=0) return 0; return 1; int isTwinPrimes(int n) if(isPrime(n) ,程序如下:,第6页,在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函
3、数的递归调用。,在实际问题求解的时候,有时会遇到这样一类问题: 问题本身一般比较复杂,但是可以把它分解为一些子问题,子问题从复杂度上或规模上要比原问题更简单。另外,子问题的求解方法与原问题有相似的结构,可以继续分解下去,直到某一个终止条件成立时,分解到最后的子问题是非常容易求解的。然后我们可以把分解的过程再一步步的回溯综合起来,从而得到原问题的解。,2. 函数的递归调用,第7页,解的相似子结构 递归的条件: 终止条件,递归应用实例: 求阶乘; 汉诺塔问题; 用辗转相除法求两个整数的最大公约数,第8页,用递归法求一个整数的阶乘。,根据这个递推公式,写出如下的求阶乘函数: long fact (i
4、nt n) if(n=1) return 1; else return n*fact (n-1); ,例6.7,第9页,fact(5)的递归调用过程,第10页,用递归法求两个整数的最大公约数。,例6.8,问题分析: 可以用求最大公约数的欧几里德算法(辗转相除法)。即: a 和 b 的最大公约数,等于 b 和 a%b 的最大公约数。 可见,要求两个整数a和b的最大公约数,只需求出b和a%b的最大公约数即可。所以新问题要比原问题更易于求解,同时,该问题也可以按照类似的方法继续分解,当分解到余数为0时,这时另一个整数就是所要求的最大公约数。,第11页,#include int gcd(int m,i
5、nt n) /递归函数定义 if(m%n=0) /如能整数,则n就是最大公约数 return n; else return gcd(n,m%n); /递归调用 int main() int m,n,result; printf(“请输入两个整数m、n:n”); scanf(“%d%d”, ,程序如下:,第12页,静态存储方式,在程序整个运行期间分配固定的存储空间的方式。 如:全局变量,由变量的作用域来分:分为全局变量和局部变量。 由变量内存分配方式来分:分为静态存储方式和动态存储方式。,动态存储方式,在程序运行期间根据需要进行动态的分配存储空间的方式。 如:局部变量,程序内存区域划分,四、变量
6、的存储类别,第13页,语言中,对变量的存储类型说明有以下四种: 自动变量(auto) 寄存器变量(register) 外部变量(extern) 静态变量(static),第14页,(1)定义格式: static 数据类型 变量名;,静态变量(static),(2)特点 程序开始执行时分配空间。 在程序执行期间始终存在。(生存期) 只在作用域内可用。 每次使用时,保留上次调用结束时的值。 定义但不初始化,则自动赋以“”,(3)何时使用静态内部变量 需要保留函数上一次调用结束时的值。 变量只被引用而不改变其值。,如: static int x;,第15页,#include int f(int a)
7、 auto int b=0; static int c=3; b=b+1; c=c+1; return(a+b+c); void main() int a=2,i; for (i=0;i3;i+) printf(“%4d”,f(a); ,思考:没有static和有static程序的输出分别是什么?,7 7 7,7 8 9,例,第16页,五、多文件程序和预编译指令,步骤: 1、新建一个VC工程; 2、在菜单栏中选择“工程|添加到工程”,在弹出的对话框中选择源文件或头文件,添加到工程中; 3、如有必要,在适当的位置合理的声明变量和函数; 4、编译、链接、执行即可。 注:VC中工程文件的后缀是.ds
8、w 。,模块的组织:函数的定义写到 .cpp 文件中;函数的声明、全局变量的定义一般写到 .h 文件中。,如何运行一个多文件的程序,第17页,预编译指令,所谓预编译,是指在对源程序进行编译之前,先对源程序中进行一些预处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码。,宏定义 文件包含 条件编译,预编译的分类:,第18页,1.不带参数的宏定义(简单替换),用标识符来代表一个字符串(给字符串取个名字)。C编译系统在编译前将这些标识符替换成所定义的字符串。,概念,格式,define 标识符 字符串,相关概念,宏名: 宏定义中的标识符称为“宏名”。 宏调用:在程序中用宏名替代字符串称为“
9、宏调用”。 宏展开:在预编译时将宏名替换成字符串的过程称 为“宏展开”。,#define PI 3.1415926,(一)宏定义(宏替换),第19页,1、宏名遵循标识符规定,习惯用大写字母表示,以便区别普通的变量。 2、宏定义字符串不要以分号结束,否则分号也作为字符串的一部分参加展开。,说明,#define PI 3.14; 在下面语句使用宏: area=PI*r*r;,area=3.14;*r*r;,3、宏定义是预处理指令,与定义变量不同,使用宏时只是进行简单的字符串替换。 4、宏定义用宏名代替一个字符串,也不管宏展开后的词法和语法的正确性,只是简单的替换。是否正确,编译时由编译器判断。 例
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课件 第六 函数 2.0
链接地址:https://www.31doc.com/p-2102503.html