




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章函数与宏替换,本章内容,6.1 模块化设计 6.2 函数的定义与调用 6.3 函数的递归调用 6.4 变量的存储类型、作用域 6.5 宏替换 6.6 综合应用,6.1模块化设计,模块化设计思想 把一个大问题分解成若干个比较容易求解的小问题,然后分别求解 模块设计原则 模块独立 功能单一。 模块间的联系力求简单。 数据局部化。 模块的规模要适当 分解模块要注意层次,6.2函数的定义与调用,6.2.1标准库函数 math.h头文件中函数:abs()、sin()、cos()、exp()、fabs()、floor()、rand()等 stdio.h头文件中函数:fgets()、fopen()、f
2、printf()、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; else t=n2; return t;,函数的声明部分,类型说明符 定义了函数中return语句返回值的类型 省略类型说明符,函数返回一个整型值 函数没有返回值,可以定义为void 函数名称 遵循C语言标识符的命名规则 形式参数类型及说明列表 用逗号分隔的形式参数列表 每个列表项均由“类型说明符”和“形式参数名称”两部分组成 没有参数,括号仍然是必须要有的,函数体,和main函数一样,必须将变量声明语句和其它语句序列用括起来
4、如果有返回值,需要通过return语句返回 return语句的一般形式为: return(表达式); 或者 return 表达式; return语句有两个重要作用 返回一个值; 退出当前函数,6.2.3函数的调用,调用函数定义在主调函数之前,主调函数可以直接调用 被调用函数定义在主调函数之后,则需要在主调函数中声明被调用函数。 函数的声明格式 类型名 函数名称(形式参数类型列表); 注意: 函数声明语句后面需加分号。 在声明函数时,函数的参数名称可以省略,但参数类型不能省略,且参数类型的个数、类型、次序必须保持一致,main() int max(int,int); /*声明max函数,也可改为
5、 int max(int n1,int n2);*/ c=max(a,b); int max(int n1,int n2),函数的调用,无参函数调用的一般形式为: 函数名(); 有参函数调用的一般形式为: 函数名(实参表达式1,实参表达式2,) c=max(a,b); printf(“%d”,c,函数的嵌套调用,在C语言中,允许在定义一个函数时调用另外一个函数,则在该函数被调用的过程中将发生另一次函数调用,图6.2 函数的嵌套调用,例6.1】验证哥德巴赫猜想。猜想内容:任何一个大于4的偶数,都可以表示为两个素数的和,6.2.4参数的传递,形参和实参的概念 函数定义时使用的参数称之为形式参数,简
6、称形参 函数调用时使用的参数,称之为实际参数,简称实参 在函数调用时,实参的个数要和形参相等,而且类型必须一致,另外实参与形参出现的次序也要一一对应,程序举例,例6.2】输入两个数,输出两个数中的最大值 #include stdio.h main() int a,b,m; int max(int,int);/*声明max函数*/ printf(nPlease input two numbers(a,b):); scanf(%d,%d,形参和实参的特点,形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使
7、用该形参变量。 实参可以是常量、变量、表达式、函数等,在进行函数调用时,它们必须具有确定的值,以便把这些值传送给形参。因此,应预先用赋值、输入等方法使实参获得确定值。 实参和形参在数量上,类型上,顺序上应严格一致,否则会产生类型不匹配的错误。同时,实参和形参具有一一对应的关系。 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值无论怎么改变,实参中的值都不会变化,6.3函数的递归调用,函数在执行过程中对自己的调用称为函数的递归调用 在使用递归方法解决问题时,需要分成两个步骤 (1)递归的边界条件。也就是描述问题的最简单
8、情况,它本身不需要递归的定义,只需给出符合什么样的条件程序中止递归及中止递归时的返回值。 (2)寻找问题的规律。将问题转换为更简单的相同问题,然后向着递归边界条件的方向递归,程序举例,例6.3】利用递归的方法计算n,例6.4】有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁;问第4个人多少岁,他说比第3个人大2岁;问第3个人多少岁,他说比第2个人大2岁;问第2个人多少岁,他说比第1个人大2岁;最后问第一个人多少岁,他说是30岁,请问第5个人多少岁,例6.5】利用递归方法计算猴子吃桃的问题。有一天小猴子摘若干个桃子,当即吃了一半还觉得不过瘾,又多吃了一个。第二天接着吃剩下桃子中的一半,仍
9、觉得不过瘾又多吃了一个,以后小猴子都是吃尚存桃子一半多一个。到第10天早上小猴子再去吃桃子的时候,看到只剩下一个桃子。问小猴子第一天共摘下了多少个桃子,6.4变量的存储类型、作用域,6.4.1变量的作用域 局部变量 函数内作定义说明的,其作用域仅限于函数内部 注意问题: 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆,全局变量,在函数外部定义的变量,也就是在程序的开头声明 全局变量定义形式为: extern 类型说明
10、符 变量名,变量名 extern可以省去不写 例如: int a,b; 等效于: extern int a,b; 注意问题: 全局变量在定义时就已分配了内存单元,全局变量定义可作初始赋值,全局变量说明不能再赋初始值,只是表明在函数内要使用某全局变量 全局变量可加强函数模块之间的数据联系,但同时也降低了函数的独立性。 在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用,程序举例,include stdio.h int a=8,b=4;/*定义全局变量a,b*/ void fun() int a,b;/*定义局部变量a,b*/ a=10; b=5; printf(f
11、un:a+b=%dn,a+b); main() fun(); printf(“main:a+b=%dn”,a+b); 上例的输出结果为: fun:a+b=15 main:a+b=12,6.4.2变量的存储类型,静态存储 在变量定义时就分配存储单元并一直保持不变,直至整个程序结束 分类 静态(static) 外部(extern) 动态存储 在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放,自动变量,定义的一般形式为: auto 类型标识符 变量列表 其中,auto可以省略 自动变量的特点 作用域仅限于定义该变量的结构内 自动变量属于动态存储方式,只有在使用它,即定义该变量的函数被调用时
12、才给它分配存储单元,开始它的生存期 不同的结构中允许使用同名的变量而不会混淆,静态变量,定义的一般形式为: static 类型标识符 变量列表 例如:static int a; 特点:程序结束前不释放内存,程序举例,include int add() static int a=10;/*定义静态局部变量,并赋初值*/ a+=10; return a; main() int i; for(i=1;i=5;i+) printf(%d.add=%dn,i,add(); 运行上面的程序,输出的结果为: 1.add=20 2.add=30 3.add=40 4.add=50 5.add=60,外部变量,
13、声明外部变量的一般形式为: extern 类型标识符 变量列表 例如: /*f1.c*/ #include main() extern int num;/*声明外部变量num,表明在函数中将用到外部变量num*/ init(); printf(num=%dn,num); /*f2.c*/ int num;/*定义全局变量num*/ void init() num=100;,6.5 宏替换,6.5.1 宏替换 6.5.2 文件包含,6.5.1 宏替换,宏定义的功能是用一个标识符来表示一个字符串,标识符称为宏名 无参宏 无参宏定义的一般形式为: #define 例如: # define EX (x
14、*y+z) 注意事项: 在宏代换时,只是简单的将宏名代换为相应的表达式 ,注意括号的使用 宏定义是用宏名来表示一个字符串,在宏代换时又以该字符串简单的替换宏名,字符串中可以包含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查 宏定义不是说明或语句,在行尾不能加分号 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束 源程序中双引号引起来的字符串常量中,若出现宏名,则预处理程序不对其作宏代换 宏定义允许嵌套 习惯上宏名用大写字母表示,以便于与变量区别,有参宏,有参宏定义的一般形式为: #define 宏名(形参表) 字符串 有参宏调用的一般形式为: 宏名(实参表); 注意
15、事项: 有参宏定义中,宏名和形参表之间不能有空格出现 在有参宏定义中,形参不分配内存单元,因此不必作类型定义 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式 在宏定义中,字符串内的形参通常要用括号括起来以避免出错,程序举例,define PI 3.1415926 #define S(a) PI*a*a main() float r,s; printf(nPlease input r: ); scanf(%f,define PI 3.1415926 #define S(a) PI*(a)*(a) main() float r,s; printf(nPlease input r: ); scanf(%f,define PI 3.1415926 #define S(a) (PI*(a)*(a) main() float r,s; printf(nPlease input r: ); scanf(%f,6.5.2 文件包含,文件包含命令行的一般形式为: #include 文件名 或 #include 例如: #include stdio.h #include math.h #include 注意事项: 包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来 一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个inclu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年济宁地理一模试题及答案
- 干货︱铝型材阳极氧化工艺操作规程
- 2025年农村水质测试试题及答案
- 2025年中外园林史考试题及答案
- 2025年内蒙古公基试题及答案
- 2025年南平一模语文试题及答案
- 2025年低压电工试题及答案
- 2025年美甲考试试题及答案
- 2025年眼镜验光考试题及答案
- 2025年静物素描教师面试题及答案
- 科学研究方法与学术论文写作
- 最新人音版音乐二年级下册全册教案
- 航空航天概论(课堂PPT)
- 新改版教科版六年级下册科学全册知识点归纳 (超全)
- 英语的起源与发展(课堂PPT)
- 药物化学结构式大全(高清版)
- 二房东租房合同范文
- 影视旅游作品对游客出游动机及行为意向的影响研究
- 物业工程人员入户维修流程
- 【图文】煤矿井下常见的失爆现象
- 我的寒假生活模板
评论
0/150
提交评论