《函数与编译预处理省公共课一等奖全国赛课获奖课件.pptx》由会员分享,可在线阅读,更多相关《函数与编译预处理省公共课一等奖全国赛课获奖课件.pptx(91页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第6 6章章 函数与编译预处理函数与编译预处理6.1 6.1 模块化程序设计与函数模块化程序设计与函数6.2 6.2 函数定义与调用函数定义与调用6.3 6.3 函数递归调用函数递归调用6.4 6.4 变量作用域与存放方式变量作用域与存放方式6.5 6.5 编译预处理编译预处理6.6 6.6 函数设计举例函数设计举例第1页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页教学目和基本要求:要求学生了解模块化程序设计思想,掌握函数定义及调用,了解变量作用域与存放方式概念,了解编译预处理概念。教学重点:
2、教学重点:函数定义及调用、递归调用、变量作用域。第2页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.1 6.1 模块化程序设计与函数模块化程序设计与函数 在设计较复杂程序时,我们普通采取方法在设计较复杂程序时,我们普通采取方法是:把问题分成几个部分,每部分又可分成更是:把问题分成几个部分,每部分又可分成更细若干小部分,逐步细化,直至分解成很轻易细若干小部分,逐步细化,直至分解成很轻易求解小问题。这么话,原来问题解就能够用这求解小问题。这么话,原来问题解就能够用这些小问题来表示。些小问题来表示。
3、把复杂任务细分成多个问题过程,就叫程把复杂任务细分成多个问题过程,就叫程序模块化。序模块化。模块化程序设计是靠设计函数和调模块化程序设计是靠设计函数和调用函数实现。用函数实现。第3页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.1.1 6.1.1 模块与函数模块与函数 C C语言程序由基本语句和函数组成,每个函数可完成语言程序由基本语句和函数组成,每个函数可完成相对独立任务,依一定规则调用这些函数,就组成了处相对独立任务,依一定规则调用这些函数,就组成了处理某个特定问题程序。理某个特定问题程序
4、。任务、模块与函数关系任务、模块与函数关系:任务模块模块模块函数函数函数函数函数函数第4页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.1.2 6.1.2 模块设计标准模块设计标准模块设计应该遵照以下几条主要标准模块设计应该遵照以下几条主要标准:u模块独立:模块完成独立功效,与其它模块间模块独立:模块完成独立功效,与其它模块间关系简单,各模块能够单独调试。需注意以下关系简单,各模块能够单独调试。需注意以下几点:几点:每个模块完成一个相对独立特定子功效每个模块完成一个相对独立特定子功效模块之间关
5、系力争简单模块之间关系力争简单数据局部化数据局部化u模块规模适当模块规模适当u分解模块要注意层次分解模块要注意层次第5页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.1.3 6.1.3 算法描述介绍算法描述介绍u算法描述任务是将解题步骤和方法用一定形式算法描述任务是将解题步骤和方法用一定形式表示出来,算法描述要清楚准确,严谨且没有表示出来,算法描述要清楚准确,严谨且没有二义性,还要可读性好,方便实现二义性,还要可读性好,方便实现u仅用自然语言是不够,普通要借助算法工具来仅用自然语言是不够,普通
6、要借助算法工具来描述算法描述算法 u算法含有两大要素,一是操作,二是控制结构算法含有两大要素,一是操作,二是控制结构u描述算法普通能够用流程图描述控制结构,用描述算法普通能够用流程图描述控制结构,用类计算机语句或自然语言描述详细操作类计算机语句或自然语言描述详细操作第6页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例6.2设计算法找出设计算法找出a、b两数中较大者,并输出。两数中较大者,并输出。分析:这个问题分三个步骤。分析:这个问题分三个步骤。(1)输入两个数;输入两个数;(2)找出其中大数
7、;找出其中大数;(3)输出大数。输出大数。算法流程图如右图所表示。算法流程图如右图所表示。第7页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.2 6.2 函数定义与调用函数定义与调用 在在C语言中语言中,函数(函数(Function)是一个处理过程,是一个处理过程,能够进行数值运算、信息处理、控制决议,即一段能够进行数值运算、信息处理、控制决议,即一段程序工作放在函数中进行,函数结束时能够携带或程序工作放在函数中进行,函数结束时能够携带或不带处理结果。不带处理结果。C语言程序处理过程全部都是以
8、函数形式出现,语言程序处理过程全部都是以函数形式出现,最简单程序最少也有一个最简单程序最少也有一个main函数。函数必须先定函数。函数必须先定义和申明后才能调用。义和申明后才能调用。函数有两种:函数有两种:标准库函数:系统提供标准库函数:系统提供用户自定义函数:用户自己写用户自定义函数:用户自己写第8页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.2.1 6.2.1 标准库函数标准库函数 C语言有丰富库函数,这些函数说明在不一语言有丰富库函数,这些函数说明在不一样头文件样头文件(*.h)中。中
9、。umath.h头文件中对头文件中对sin(x)、cos(x)、exp(x)(求求ex)、fabs(x)(求求x绝对值绝对值)、log(x)(求求log)等数学等数学函数做了申明函数做了申明ustdio.h头文件中对头文件中对scanf()、printf()、gets()、puts()、getchar()、putchar()等标准输入等标准输入/输出函数输出函数做了申明做了申明第9页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.2.2 6.2.2 函数定义函数定义普通形式为:普通形式为:类型名
10、函数名类型名函数名(参数类型说明及列表参数类型说明及列表)局部变量说明局部变量说明 语句序列语句序列 1.函数说明部分函数说明部分 函数说明部分包含函数类型、函数名、参数表及参数函数说明部分包含函数类型、函数名、参数表及参数类型说明。类型说明。第10页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页u函数类型:即函数返回值类型。说明函数将给调用者函数类型:即函数返回值类型。说明函数将给调用者提供什么类型返回值。提供什么类型返回值。u函数名:又称函数标识符。对自定义函数,其命名遵函数名:又称函数标识符
11、。对自定义函数,其命名遵照照C语言标识符要求语言标识符要求u参数表:写在函数名后括号参数表:写在函数名后括号“()”内,参数表由一个内,参数表由一个或多个变量标识符及类型标识符组成。参数表中变量或多个变量标识符及类型标识符组成。参数表中变量也称为形式参数,简称为形参也称为形式参数,简称为形参2.函数体函数体u函数定义花括号函数定义花括号“”里部分是函数体,包含变量定里部分是函数体,包含变量定义,执行语句序列。义,执行语句序列。ureturn语句普通形式为:语句普通形式为:return(表示式表示式);第11页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序
12、设计C C语言程序设计语言程序设计上一页上一页下一页下一页1.1.函数申明函数申明 自定义函数在调用前应先申明。使系统知道将要用到自定义函数在调用前应先申明。使系统知道将要用到某个函数及它类型,方便处理。函数申明应与该函数定义某个函数及它类型,方便处理。函数申明应与该函数定义时给出函数类型与名字、形参个数、类型、次序相一致。时给出函数类型与名字、形参个数、类型、次序相一致。6.2.3 6.2.3 函数调用函数调用函数申明语句形式为:函数申明语句形式为:类型名函数名类型名函数名(参数类型说明列表参数类型说明列表);第12页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序
13、设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页#include“stdio.h”void main()float x,y;int n;float power(float x,int n);scanf(%f,%d,&x,&n);y=power(x,n);printf(“%8.2f”,y);float power(float x,int n)int i;float t=1;for(i=1;i=n;i+)t=t*x;return t;例例6.4编写计算编写计算xn次乘方程序。次乘方程序。分析:分析:(1)输入输入x和和n;(2)调用调用power函数进行乘幂运算;函数进行乘幂
14、运算;(3)打印运算结果。打印运算结果。第13页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页2.2.函数调用函数调用u函数调用分为有参和无参两种。函数调用分为有参和无参两种。有参函数调用普通形式为:有参函数调用普通形式为:函数名函数名(实参表示式实参表示式1,实参表示式,实参表示式2,)无参函数调用普通形式为:无参函数调用普通形式为:函数名函数名()u依据调用方式不一样,函数调用又分为函数语句调用和依据调用方式不一样,函数调用又分为函数语句调用和表示式调用表示式调用3.3.函数嵌套调用函数嵌套调
15、用u在某函数体中调用了另一个函数,则在该函数被调用过在某函数体中调用了另一个函数,则在该函数被调用过程中将发生另一次函数调用程中将发生另一次函数调用第14页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页long fac(int k)long f1;int i;for(i1;iy)t x;else t y;return t;当调用当调用max函数时,实参函数时,实参a把值传给形参把值传给形参x,实参,实参b把值传给形参把值传给形参y。按次序。按次序传递,与形参名无关。传递,与形参名无关。第17页C
16、C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页关于形式参数和实际参数说明关于形式参数和实际参数说明:u形式参数是变量,不过函数被调用时才被分配内形式参数是变量,不过函数被调用时才被分配内存。当函数执行完成,返回时,形式参数占用内存。当函数执行完成,返回时,形式参数占用内存空间又被释放。存空间又被释放。u实参能够是变量、常量和表示式,但实参必须有实参能够是变量、常量和表示式,但实参必须有确定值。确定值。u形参和实参类型必须一致。形参和实参类型必须一致。u对应实参和形参是两个独立实体,它们之间只有对应实参
17、和形参是两个独立实体,它们之间只有单向值传递,即将实参值传递给形式参数。形参单向值传递,即将实参值传递给形式参数。形参值在函数中不论怎么改变,都不会影响实参。值在函数中不论怎么改变,都不会影响实参。第18页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例6.7设求最大条约数程序。设求最大条约数程序。#include stdio.hint divisor(int a,int b)int r;do r a%b;a b;b r;while(r!0);return a;void main()int a,
18、b,d;scanf(%d,%d,&a,&b);if(ab)d divisor(a,b);else d divisor(b,a);printf(a%d,b%dn,a,b);printf(d%d,d);第19页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.3 6.3 函数递归调用函数递归调用 函数调用它本身,称为递归。直接在函数内调用自函数调用它本身,称为递归。直接在函数内调用自己为直接递归,经过别函数调用自己为间接递归。己为直接递归,经过别函数调用自己为间接递归。void a().a();.vo
19、id a().b();.void b().a();.递归在处理一些问题中,递归在处理一些问题中,是一个十分有用方法。因为其是一个十分有用方法。因为其一一,有问题它本身就是递归定有问题它本身就是递归定义义;其二其二,它能够使一些看起来它能够使一些看起来不易处理问题变得轻易处理,不易处理问题变得轻易处理,写出程序较简短。写出程序较简短。第20页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例6.8 用递归计算用递归计算n!。因为因为 n!=n*(n-1)!是递归定义是递归定义所以求所以求n!(n-1
20、)!)!(n-1)!(n-2)!)!(n 2)!(n-3)!)!0!问题,!问题,依据公式有依据公式有0!=1。再反过来依次求出再反过来依次求出1!,!,2!直到最终求出直到最终求出n!。!。第21页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归方法求递归方法求n!long fac(int n)long f;if (n=0)f=1;else f=n*fac(n-1);return f;void main()long y;int n;scanf(“%d”,&n);y=fac(n);printf(
21、“%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)问题,于是一层一层包裹下去,每次调用时候都会在内部调用一个结构相同但变量不一样函数,直到。直到调用到fac(0)时,因为内部if判断,已经不需要再继续调用另一个fac(n-1),而直接有了f=1fac(0)已经执行完成,它返回值被fac(1)中f=n*fac(n-1)语句
22、赋给了f值,同时返回了f。而这个返回f又被fac(2)乘上当前n值以后继续返回f直到最终fac(n)都做完了,f值被返回到了它调用点:主函数中,这么就是一个递归运算。第22页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例6.9 用递归算法求用递归算法求m与与n最大条约数。最大条约数。if(m%n)=0 n 是条约数;else 求 n 和 m%n 条约数;int gcd(int m,int n)int g;if (n0)gm;else ggcd(n,m%n)return(g);第23页C C语言
23、程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页求最大条约数主函数求最大条约数主函数void main()int m,n;scanf(%d,%d,&m,&n);printf(gcd%d,gcd(m,n);假如运行时输入:21,15第24页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例6.10 汉诺塔游戏。汉诺塔游戏。说到递归,就不能不提汉诺塔,汉诺塔是一个很繁杂游戏,但能够用递归方法异常简单完成。规则:(1)
24、一次只能移动一个 (2)大不能放在小上面 (3)只能在三个位置中移动第25页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页问题可分为三个步骤问题可分为三个步骤对对于于把把n个个金金片片从从第第一一根根针针a上上移移到到第第三三根根针针c问问题题能能够够分分解解成成以下步骤以下步骤:(1)将将n-1个金片从个金片从a经过经过c 移动到移动到b。(2)将第将第n个金片移动到个金片移动到c。(3)再将再将n-1个盘子从个盘子从b经过经过a移动到移动到c。这么我们就将移动这么我们就将移动n个金片问题变成了
25、移动个金片问题变成了移动n-1个金个金片问题。这么做下去话最终就会变成移动一个金片片问题。这么做下去话最终就会变成移动一个金片问题。问题。第26页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归方法解汉诺塔递归方法解汉诺塔void hanoi(int n,int a,int b,int c)if(n=1)printf(“%d-%d”,a,c);else hanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);n=1时,直接将金片从a移动到cn-
26、1个金片从a经过c 移动到b将第n个金片从a移动到c再将n-1个盘子从b经过a移动到cmain()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);第27页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归汉诺塔步骤void hanoi(int n,int a,int b,int c)if(n=1)printf(“%d-%d”,a,c);else hanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1
27、,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);输入3。则n=3第28页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归汉诺塔步骤void hanoi(int n,int a,int b,int c)if(n=1)printf(“%d-%d”,a,c);else hanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()int n;printf(
28、“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);主函数调用hanoi(n,1,2,3);第一 次 调 用。第 一 次 调 用hanoi(n,a,b,c)(第一层)即要把三个金片移到cn=3第29页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归汉诺塔步骤void hanoi(int n,int a,int b,int c)if(n=1)printf(“%d-%d”,a,c);else hanoi(n-1,a,c,b);printf(“%d-%d”,a,c);h
29、anoi(n-1,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);因为n1则执行hanoi(n-1,a,c,b)(第二次调用)n=3第30页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归汉诺塔步骤void hanoi(int n,int a,int b,int c)if(n=1)printf(“%d-%d”,a,c);else hanoi(n-1,a,c,b);printf(“%d-%d”,a,c);han
30、oi(n-1,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);因为依然n1则执行hanoi(n-1,a,c,b)(第三次调用)n=2第31页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归汉诺塔步骤void hanoi(int n,int a,int b,int c)if(n=1)printf(“%d-%d”,a,c);else hanoi(n-1,a,c,b);printf(“%d-%d”,a,c);han
31、oi(n-1,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);因为n=1则printf(“%d-%d”,a,c);即把金片从a移动到c n=1第32页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归汉诺塔步骤void hanoi(int n,int a,int b,int c)if(n=1)printf(“%d-%d”,a,c);else hanoi(n-1,a,c,b);printf(“%d-%d”,a,c
32、);hanoi(n-1,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);第三层执行完成,返回到第二层,即下去执行printf(“%d-%d”,a,c);把第二个金片摆到第二根针上n=2第33页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归汉诺塔步骤void hanoi(int n,int a,int b,int c)if(n=1)printf(“%d-%d”,a,c);else hanoi(n-1,a,c,
33、b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);执行下一条语句,又调用第三层hanoi(1,3,1,2)n=2第34页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归汉诺塔步骤void hanoi(int n,int a,int b,int c)if(n=1)printf(“%d-%d”,a,c);else hanoi(n-1,a,c,b);p
34、rintf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);n=1,执行结果为32n=1第35页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归汉诺塔步骤void hanoi(int n,int a,int b,int c)if(n=1)printf(“%d-%d”,a,c);else hanoi(n-1,a,c,b);printf(“%d-%d”,a,c);ha
35、noi(n-1,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);第二层也执行完了,返回第一层,执行接下来语句,结果为13。n=3第36页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归汉诺塔步骤void hanoi(int n,int a,int b,int c)if(n=1)printf(“%d-%d”,a,c);else hanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi
36、(n-1,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);执行接下来语句,再次调用第二层hanoi(2,2,1,3)n=3第37页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页递归汉诺塔步骤void hanoi(int n,int a,int b,int c)if(n=1)printf(“%d-%d”,a,c);else hanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-
37、1,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);第38页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.4 6.4 变量作用域与存放方式变量作用域与存放方式先看一个例子,错在那里?:void f1()int t=2;a*=t;b/=t;main()int a,b;printf(“Enter a,b:”);scanf(“%d,%d”,&a,&b);f1();/*调用函数f1()*/printf(“a=%d,
38、b=%d”,a,b);编译程序会提醒犯错:Undefined symbol a 和 Undefined symbol b。为何?第39页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 6.4.1 6.4.1 变量作用域变量作用域 即变量有效范围u变量按作用域分为全局变量全局变量和局部变量局部变量u比较:全局变量(外部变量)局部变量(内部变量)定义位置:函数体外 函数体内作用域 :从定义处到根源 从定义处到本函数结束 文件结束举例:全部函数体外定义变量 (1)全部在函数体内定义 (2)形式参数注意与
39、局部变量同名处理 局部变量屏蔽全局变量不一样函数中同名局部变量互不干扰 第40页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 1.1.局部变量局部变量 C C语言程序是由函数组成,有且只能有一个语言程序是由函数组成,有且只能有一个mainmain函数。函数。变量定义能够出现在函数内,亦可出现在函数外或者是函变量定义能够出现在函数内,亦可出现在函数外或者是函数参数中。数参数中。按照变量定义语句出现位置,能够分为:按照变量定义语句出现位置,能够分为:局部变量:局部变量:在函数或复合语句内定义;在函数
40、或复合语句内定义;只在该函数或复合语句中才能使用。只在该函数或复合语句中才能使用。形式参数:形式参数:定义为函数参数;定义为函数参数;只在该函数中才能使用。只在该函数中才能使用。第41页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 在在函函数数内内部部说说明明变变量量或或者者在在复复合合语语句句中中定定义义变变量量称为局部变量。其作用范围是其所在函数或复合语句。称为局部变量。其作用范围是其所在函数或复合语句。第42页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语
41、言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 定定义义在在函函数数之之外外变变量量。其其作作用用范范围围从从它它被被定定义义位位置置起起,到所在文件结束。到所在文件结束。2 2、全局变量、全局变量第43页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 假假如如在在全全局局变变量量定定义义之之前前函函数数想想引引用用该该外外部部变变量量,则则应应该该在在该该函函数数中中用用关关键键字字externextern作作“外外部部变变量说明量说明”。3 3、外部变量使用、外部变量使用 C
42、 C语语言言中中,用用extern extern 说说明明一一个个外外部部变变量量,语语句句格格式以下:式以下:extern extern 类型说明符外部变量名;类型说明符外部变量名;对于全局变量还有以下几点说明:对于全局变量还有以下几点说明:(1)全局变量就是外部变量全局变量就是外部变量(2)同一源文件中,允许全局变量和局部变量同名同一源文件中,允许全局变量和局部变量同名(3)全局变量可加强函数模块之间数据联络,不过又使函全局变量可加强函数模块之间数据联络,不过又使函数要依赖这些变量,因而使得函数独立性降低数要依赖这些变量,因而使得函数独立性降低 第44页C C语言程序设计语言程序设计C C
43、语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例6.11全局变量定义和申明。全局变量定义和申明。int vs(int l,int w)/*w是形参,局部变量是形参,局部变量*/extern int h;/*外部变量申明外部变量申明*/int v;vl*w*h;return v;void main()extern int w,h;/*外部变量申明外部变量申明*/int l5;printf(v%d,vs(l,w);int l3,w4,h5;/*定义全局变量定义全局变量*/第45页C C语言程序设计语言程序设计C C语言程序设计语言程序
44、设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 6.4.2 6.4.2 变量存放方式变量存放方式u变量按存在时间分变量按存在时间分 静态变量 动态变量静态存放类型变量生存期为程序执行整个过程,在该过程中占有固定存放空间,通常称它们为永久存放。动态存放类型变量只生存在某一段时间内。比如,函数形参和函数体或分程序中定义变量,只是在程序进入该函数或分程序时才分配存放空间,当该函数或分程序执行完后,变量对应存放空间又被撤消了。第46页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上
45、一页下一页下一页1.自动变量自动变量 自动变量类型说明符为自动变量类型说明符为auto。自动变量是动态存放方。自动变量是动态存放方式。自动变量可省去说明符式。自动变量可省去说明符auto。自动变量含有以下自动变量含有以下特点特点:(1)自动变量作用域仅限于定义该变量结构内。自动变量作用域仅限于定义该变量结构内。(2)自动变量属于动态存放方式,只有定义该变量函数被自动变量属于动态存放方式,只有定义该变量函数被调用时才给它分配存放单元,开始它生存期。函数调用调用时才给它分配存放单元,开始它生存期。函数调用结束,释放存放单元,结束生存期。结束,释放存放单元,结束生存期。(3)不一样个体中允许使用同名
46、变量而不会混同。不一样个体中允许使用同名变量而不会混同。第47页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例6.12同名变量使用。同名变量使用。void main()auto int a,s100,p100;printf(n input a number:n);scanf(%d,&a);if(a0)auto int s,p;saa;pa*a;printf(s%d p%dn,s,p);printf(s%d p%dn,s,p);第48页C C语言程序设计语言程序设计C C语言程序设计语言程序设计
47、C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页2.静态变量静态变量静态变量类型说明符是静态变量类型说明符是static。普通形式为:。普通形式为:static 类型名类型名 变量名变量名(1)静态局部变量:在局部变量说明前再加上)静态局部变量:在局部变量说明前再加上static说明说明符。符。(2)静态全局变量:在全局变量说明之前加上)静态全局变量:在全局变量说明之前加上static。3.存放器变量存放器变量存放器变量用关键字存放器变量用关键字register定义。普通形式为:定义。普通形式为:register 类型名类型名 变量名变量名u存放器变量只限于
48、整型、字符型、指针型局部变量。存放器变量只限于整型、字符型、指针型局部变量。u存放器变量是动态变量,而且数目有限存放器变量是动态变量,而且数目有限,普通仅允许说明普通仅允许说明两个存放器变量。两个存放器变量。第49页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例6.14编写程序计算编写程序计算s 1 4 9 16 100。程序编写以下:程序编写以下:#include stdio.hvoid main()register int i,s0;for(i1;i10;i)s i*i;printf(s%
49、d,s);第50页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.5 6.5 编译预处理编译预处理“编译预处理”是C语言编译系统 一个组成部分。是在编译前由编译系统中预处理程序对源程序预处理命令进行加工。源程序中预处理命令均以“#”开头,结束不加分号,以区分源程序中语句,它们能够写在程序中任何位置,作用域是自出现点到源程序末尾。n 预处理命令包含执执行行宏宏定定义义(宏宏替替换换)、文文件件包包含含和条件编译和条件编译。第51页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语
50、言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 6.5.1 6.5.1 宏定义宏定义 1.无参宏定义无参宏定义#define 标识符标识符 字符串字符串如:#define L(x*x2*x+x)/*定义后,能够用L来代替串(x*x2*x+x)u宏定义作用宏定义作用 在宏定义之后,该程序中宏名就代表了该字符串。u说明说明(1)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,只是一个简单代换。(2)宏定义不是说明或语句,在行末不加分号。第52页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语