《函数与宏替换》PPT课件.ppt

上传人:re****.1 文档编号:571320119 上传时间:2024-08-10 格式:PPT 页数:29 大小:262.46KB
返回 下载 相关 举报
《函数与宏替换》PPT课件.ppt_第1页
第1页 / 共29页
《函数与宏替换》PPT课件.ppt_第2页
第2页 / 共29页
《函数与宏替换》PPT课件.ppt_第3页
第3页 / 共29页
《函数与宏替换》PPT课件.ppt_第4页
第4页 / 共29页
《函数与宏替换》PPT课件.ppt_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《《函数与宏替换》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《函数与宏替换》PPT课件.ppt(29页珍藏版)》请在金锄头文库上搜索。

1、第6章函数与宏替换 本章内容n6.1 模块化设计n6.2 函数的定义与调用n6.3 函数的递归调用n6.4 变量的存储类型、作用域n6.5 宏替换n6.6 综合应用6.1模块化设计 n模块化设计思想 把一个大问题分解成若干个比较容易求解的小问题,然后分别求解 n模块设计原则 模块独立n功能单一。n模块间的联系力求简单。n数据局部化。模块的规模要适当分解模块要注意层次6.2函数的定义与调用 n6.2.1标准库函数 math.h头文件中函数:abs()、sin()、cos()、exp()、fabs()、floor()、rand()等 stdio.h头文件中函数:fgets()、fopen()、fp

2、rintf()、fputc()、gets()、puts()、fread()、getchar() 、putchar()、open()、close()、printf()、scanf()等 ctype.h头文件中函数: isalnum()、isalpha()、ispunch()、isspace()、isupper()、isxdigit()等string.h头文件中函数:strcat()、strchr()、strcmp()、strcpy()、strlen()、strlwr()、strncat()、strncpy()、strstr()、strupr()等 6.2.2函数的定义 类型说明符 函数名称 (形

3、式参数类型及说明列表) /*以下为函数体*/ 局部变量声明部分 语句序列int max(int n1,int n2)int t;if(n1n2)t=n1;elset=n2;return t;函数的声明部分 n类型说明符定义了函数中return语句返回值的类型 省略类型说明符,函数返回一个整型值 函数没有返回值,可以定义为void n函数名称遵循C语言标识符的命名规则 n形式参数类型及说明列表用逗号分隔的形式参数列表 每个列表项均由“类型说明符”和“形式参数名称”两部分组成 没有参数,括号仍然是必须要有的 函数体 n和main函数一样,必须将变量声明语句和其它语句序列用括起来 n如果有返回值,需

4、要通过return语句返回 nreturn语句的一般形式为: return(表达式表达式);或者return 表达式表达式;nreturn语句有两个重要作用返回一个值;退出当前函数。 6.2.3函数的调用 n调用函数定义在主调函数之前,主调函数可以直接调用 n被调用函数定义在主调函数之后,则需要在主调函数中声明被调用函数。n函数的声明格式类型名 函数名称(形式参数类型列表);注意:n函数声明语句后面需加分号。n在声明函数时,函数的参数名称可以省略,但参数类型不能省略,且参数类型的个数、类型、次序必须保持一致。 main()int max(int,int);/*声明max函数,也可改为int m

5、ax(int n1,int n2);*/c=max(a,b);int max(int n1,int n2)函数的调用 n无参函数调用的一般形式为:函数名();n有参函数调用的一般形式为:函数名(实参表达式1,实参表达式2,)c=max(a,b);printf(“%d”,c);函数的嵌套调用 n在C语言中,允许在定义一个函数时调用另外一个函数,则在该函数被调用的过程中将发生另一次函数调用 图6.2 函数的嵌套调用【例6.1】验证哥德巴赫猜想。猜想内容:任何一个大于4的偶数,都可以表示为两个素数的和。6.2.4参数的传递 n形参和实参的概念 函数定义时使用的参数称之为形式参数,简称形参 函数调用时

6、使用的参数,称之为实际参数,简称实参 在函数调用时,实参的个数要和形参相等,而且类型必须一致,另外实参与形参出现的次序也要一一对应。 程序举例n【例6.2】输入两个数,输出两个数中的最大值 #include stdio.hmain()int a,b,m;int max(int,int);/*声明max函数*/printf(nPlease input two numbers(a,b):);scanf(%d,%d,&a,&b);m=max(a,b);/*调用max函数*/printf(max=%dn,m); int max(int x,int y)int t;t=xy?x:y;return t;形

7、参和实参的特点 n形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。n实参可以是常量、变量、表达式、函数实参可以是常量、变量、表达式、函数等,在进行函数调用时,它们必须具有确定的值,以便把这些值传送给形参。因此,应预先用赋值、输入等方法使实参获得确定值。n实参和形参在数量上,类型上,顺序上应严格一致,否则会产生类型不匹配的错误。同时,实参和形参具有一一对应的关系实参和形参具有一一对应的关系。n函数调用中发生的数据传送是单向的数据传送是单向的。即只能把实参的值传送给形

8、参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值无论怎么改变,实参中的值都不会变化。6.3函数的递归调用函数的递归调用n函数在执行过程中对自己的调用称为函数的递归调用 n在使用递归方法解决问题时,需要分成两个步骤(1)递归的边界条件。也就是描述问题的最简单情况,它本身不需要递归的定义,只需给出符合什么样的条件程序中止递归及中止递归时的返回值。(2)寻找问题的规律。将问题转换为更简单的相同问题,然后向着递归边界条件的方向递归。程序举例【例6.3】利用递归的方法计算n!。【例6.4】有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁;问第4个人多少岁,他说比第3个人大2岁

9、;问第3个人多少岁,他说比第2个人大2岁;问第2个人多少岁,他说比第1个人大2岁;最后问第一个人多少岁,他说是30岁,请问第5个人多少岁?。【例6.5】利用递归方法计算猴子吃桃的问题。有一天小猴子摘若干个桃子,当即吃了一半还觉得不过瘾,又多吃了一个。第二天接着吃剩下桃子中的一半,仍觉得不过瘾又多吃了一个,以后小猴子都是吃尚存桃子一半多一个。到第10天早上小猴子再去吃桃子的时候,看到只剩下一个桃子。问小猴子第一天共摘下了多少个桃子?6.4变量的存储类型、作用域变量的存储类型、作用域n6.4.1变量的作用域 局部变量 n函数内作定义说明的,其作用域仅限于函数内部 n注意问题:主函数中定义的变量也只

10、能在主函数中使用,不能在其它函数中使用形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆全局变量 n在函数外部定义的变量,也就是在程序的开头声明 n全局变量定义形式为:extern 类型说明符 变量名,变量名 extern可以省去不写 例如: int a,b;等效于:extern int a,b;n注意问题:全局变量在定义时就已分配了内存单元,全局变量定义可作初始赋值,全局变量说明不能再赋初始值,只是表明在函数内要使用某全局变量全局变量可加强函数模块之间的数据联系,但同时也降低了函数

11、的独立性。在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用。程序举例#include stdio.hint a=8,b=4;/*定义全局变量a,b*/void fun()int a,b;/*定义局部变量a,b*/a=10;b=5;printf(fun:a+b=%dn,a+b);main()fun();printf(“main:a+b=%dn”,a+b);上例的输出结果为:fun:a+b=15main:a+b=12;6.4.2变量的存储类型变量的存储类型n静态存储在变量定义时就分配存储单元并一直保持不变,直至整个程序结束 分类n静态(static)n外部(ext

12、ern) n动态存储 在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放 自动变量 n定义的一般形式为:auto 类型标识符 变量列表其中,auto可以省略 n自动变量的特点作用域仅限于定义该变量的结构内 自动变量属于动态存储方式,只有在使用它,即定义该变量的函数被调用时才给它分配存储单元,开始它的生存期 不同的结构中允许使用同名的变量而不会混淆 静态变量 n定义的一般形式为:static 类型标识符类型标识符 变量列表变量列表例如:static int a;特点:程序结束前不释放内存。程序举例#include int add()static int a=10;/*定义静态局部变量,并

13、赋初值*/a+=10;return a;main()int i;for(i=1;i=5;i+)printf(%d.add=%dn,i,add();运行上面的程序,输出的结果为:1.add=202.add=303.add=404.add=505.add=60外部变量 n声明外部变量的一般形式为:extern 类型标识符 变量列表例如:/*f1.c*/#include main()extern int num;/*声明外部变量num,表明在函数中将用到外部变量num*/init();printf(num=%dn,num);/*f2.c*/int num;/*定义全局变量num*/void init

14、()num=100;6.5 宏替换 n6.5.1 宏替换n6.5.2 文件包含6.5.1 宏替换n宏定义的功能是用一个标识符来表示一个字符串,标识符称为宏名 n无参宏 无参宏定义的一般形式为:#define 例如: # define EX (x*y+z) 注意事项:n在宏代换时,只是简单的将宏名代换为相应的表达式 ,注意括号的使用n宏定义是用宏名来表示一个字符串,在宏代换时又以该字符串简单的替换宏名,字符串中可以包含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查 n宏定义不是说明或语句,在行尾不能加分号n宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束 n源程序中双

15、引号引起来的字符串常量中,若出现宏名,则预处理程序不对其作宏代换 n宏定义允许嵌套n习惯上宏名用大写字母表示,以便于与变量区别 有参宏 n有参宏定义的一般形式为: #define 宏名(形参表) 字符串n有参宏调用的一般形式为:宏名(实参表);n注意事项:有参宏定义中,宏名和形参表之间不能有空格出现 在有参宏定义中,形参不分配内存单元,因此不必作类型定义 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式 在宏定义中,字符串内的形参通常要用括号括起来以避免出错 程序举例#define PI 3.1415926#define S(a) PI*a*amain()float r,s;printf

16、(nPlease input r: );scanf(%f,&r);s=S(r+1);printf(s=%fn,s); #define PI 3.1415926#define S(a) PI*(a)*(a)main()float r,s;printf(nPlease input r: );scanf(%f,&r);s=1/S(r+1);printf(s=%fn,s); #define PI 3.1415926#define S(a) (PI*(a)*(a)main()float r,s;printf(nPlease input r: );scanf(%f,&r);s=1/S(r+1);print

17、f(s=%fn,s); 6.5.2 文件包含文件包含n文件包含命令行的一般形式为:#include 文件名文件名或#include n例如: #include stdio.h#include math.h#include n注意事项:包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来 一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令 文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件 6.6 综合应用 【例6.8】如果一个5位数的个位与万位相同,十位与千位相同,则称这个数为回文数,如12321。编写一个函数判断一个5位数是否为回文数。【例6.9】一个数如果恰好等于它的因子之和,这个数就称为“完数”,例如6=123 编程找出31000的所有完数。【例6.10】如果每对兔子每月繁殖一对子兔,而子兔在出生后第二个月就有生殖能力,试问第一月有一对小兔子第十二月时有多少对兔子?即:1、1、2、3、5由数列的规律建立数学模型。

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

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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