函数与编译预处理公开课一等奖优质课大赛微课获奖课件.pptx
《函数与编译预处理公开课一等奖优质课大赛微课获奖课件.pptx》由会员分享,可在线阅读,更多相关《函数与编译预处理公开课一等奖优质课大赛微课获奖课件.pptx(91页珍藏版)》请在咨信网上搜索。
第第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页第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模块独立:模块完毕独立功效,与其它模块间模块独立:模块完毕独立功效,与其它模块间关系简朴,各模块能够单独调试。需注意下列关系简朴,各模块能够单独调试。需注意下列几点:几点:每个模块完毕一个相对独立特定子功效每个模块完毕一个相对独立特定子功效模块之间关系力争简朴模块之间关系力争简朴数据局部化数据局部化u模块规模适当模块规模适当u分解模块要注意层次分解模块要注意层次第5页第5页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.1.3 6.1.3 算法描述简介算法描述简介u算法描述任务是将解题环节和办法用一定形式算法描述任务是将解题环节和办法用一定形式表示出来,算法描述要清楚准确,严谨且没有表示出来,算法描述要清楚准确,严谨且没有二义性,还要可读性好,以便实现二义性,还要可读性好,以便实现u仅用自然语言是不够,普通要借助算法工具来仅用自然语言是不够,普通要借助算法工具来描述算法描述算法 u算法含有两大要素,一是操作,二是控制结构算法含有两大要素,一是操作,二是控制结构u描述算法普通能够用流程图描述控制结构,用描述算法普通能够用流程图描述控制结构,用类计算机语句或自然语言描述详细操作类计算机语句或自然语言描述详细操作第6页第6页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例6.2设计算法找出设计算法找出a、b两数中较大者,并输出。两数中较大者,并输出。分析:这个问题分三个环节。分析:这个问题分三个环节。(1)输入两个数;输入两个数;(2)找出其中大数;找出其中大数;(3)输出大数。输出大数。算法流程图如右图所表示。算法流程图如右图所表示。第7页第7页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.2 6.2 函数定义与调用函数定义与调用 在在C语言中语言中,函数(函数(Function)是一个处理过程,是一个处理过程,能够进行数值运算、信息处理、控制决议,即一段能够进行数值运算、信息处理、控制决议,即一段程序工作放在函数中进行,函数结束时能够携带或程序工作放在函数中进行,函数结束时能够携带或不带处理结果。不带处理结果。C语言程序处理过程所有都是以函数形式出现,语言程序处理过程所有都是以函数形式出现,最简朴程序至少也有一个最简朴程序至少也有一个main函数。函数必须先定函数。函数必须先定义和申明后才干调用。义和申明后才干调用。函数有两种:函数有两种:原则库函数:系统提供原则库函数:系统提供用户自定义函数:用户自己写用户自定义函数:用户自己写第8页第8页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.2.1 6.2.1 原则库函数原则库函数 C语言有丰富库函数,这些函数说明在不同头文件(*.h)中。umath.h头文献中对头文献中对sin(x)、cos(x)、exp(x)(求求ex)、fabs(x)(求求x绝对值绝对值)、log(x)(求求log)等数学等数学函数做了申明函数做了申明ustdio.h头文献中对头文献中对scanf()、printf()、gets()、puts()、getchar()、putchar()等原则输入等原则输入/输出函数输出函数做了申明做了申明第9页第9页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.2.2 6.2.2 函数定义函数定义普通形式为:普通形式为:类型名函数名类型名函数名(参数类型阐明及列表参数类型阐明及列表)局部变量阐明局部变量阐明 语句序列语句序列 1.函数阐明部分函数阐明部分 函数阐明部分包括函数类型、函数名、参数表及参数函数阐明部分包括函数类型、函数名、参数表及参数类型阐明。类型阐明。第10页第10页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页u函数类型:即函数返回值类型。阐明函数将给调用者函数类型:即函数返回值类型。阐明函数将给调用者提供什么类型返回值。提供什么类型返回值。u函数名:又称函数标识符。对自定义函数,其命名遵函数名:又称函数标识符。对自定义函数,其命名遵循循C语言标识符要求语言标识符要求u参数表:写在函数名后括号参数表:写在函数名后括号“()”内,参数表由一个内,参数表由一个或多个变量标识符及类型标识符构成。参数表中变量或多个变量标识符及类型标识符构成。参数表中变量也称为形式参数,简称为形参也称为形式参数,简称为形参2.函数体函数体u函数定义花括号函数定义花括号“”里部分是函数体,包括变量定里部分是函数体,包括变量定义,执行语句序列。义,执行语句序列。ureturn语句普通形式为:语句普通形式为:return(表示式表示式);第11页第11页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页1.1.函数申明函数申明 自定义函数在调用前应先申明。使系统知道将要用到自定义函数在调用前应先申明。使系统知道将要用到某个函数及它类型,以便处理。函数申明应与该函数定义某个函数及它类型,以便处理。函数申明应与该函数定义时给出函数类型与名字、形参个数、类型、顺序相一致。时给出函数类型与名字、形参个数、类型、顺序相一致。6.2.3 6.2.3 函数调用函数调用函数申明语句形式为:函数申明语句形式为:类型名函数名类型名函数名(参数类型阐明列表参数类型阐明列表);第12页第12页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计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函数进行乘幂运算;函数进行乘幂运算;(3)打印运算结果。打印运算结果。第13页第13页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页2.2.函数调用函数调用函数调用分为有参和无参两种。有参函数调用普通形式为:函数名(实参表示式1,实参表示式2,)无参函数调用普通形式为:函数名()依据调用方式不同,函数调用又分为函数语句调用和表示式调用3.3.函数嵌套调用函数嵌套调用u在某函数体中调用了另一个函数,则在该函数被调用过在某函数体中调用了另一个函数,则在该函数被调用过程中将发生另一次函数调用程中将发生另一次函数调用第14页第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页第17页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页关于形式参数和实际参数阐明关于形式参数和实际参数阐明:u形式参数是变量,但是函数被调用时才被分派内形式参数是变量,但是函数被调用时才被分派内存。当函数执行完毕,返回时,形式参数占用内存。当函数执行完毕,返回时,形式参数占用内存空间又被释放。存空间又被释放。u实参能够是变量、常量和表示式,但实参必须有实参能够是变量、常量和表示式,但实参必须有拟定值。拟定值。u形参和实参类型必须一致。形参和实参类型必须一致。u相应实参和形参是两个独立实体,它们之间只有相应实参和形参是两个独立实体,它们之间只有单向值传递,即将实参值传递给形式参数。形参单向值传递,即将实参值传递给形式参数。形参值在函数中无论怎么改变,都不会影响实参。值在函数中无论怎么改变,都不会影响实参。第18页第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,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页第19页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.3 6.3 函数递归调用函数递归调用 函数调用它本身,称为递归。直接在函数内调用自函数调用它本身,称为递归。直接在函数内调用自己为直接递归,通过别函数调用自己为间接递归。己为直接递归,通过别函数调用自己为间接递归。void a().a();.void a().b();.void b().a();.递归在处理一些问题中,递归在处理一些问题中,是一个十分有用办法。由于其是一个十分有用办法。由于其一一,有问题它本身就是递归定有问题它本身就是递归定义义;其二其二,它能够使一些看起来它能够使一些看起来不易处理问题变得容易处理,不易处理问题变得容易处理,写出程序较简短。写出程序较简短。第20页第20页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例6.8 用递归计算用递归计算n!。由于由于 n!=n*(n-1)!是递归定义是递归定义因此求因此求n!(n-1)!)!(n-1)!(n-2)!)!(n 2)!(n-3)!)!0!问题,!问题,依据公式有依据公式有0!=1。再反过来依次求出再反过来依次求出1!,!,2!直到最后求出直到最后求出n!。!。第21页第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(“%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)语句赋给了f值,同时返回了f。而这个返回f又被fac(2)乘上当前n值以后继续返回f直到最后fac(n)都做完了,f值被返回到了它调用点:主函数中,这样就是一个递归运算。第22页第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页第23页C C语言程序设计语言程序设计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页第24页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页例例6.10 汉诺塔游戏。汉诺塔游戏。说到递归,就不能不提汉诺塔,汉诺塔是一个很繁杂游戏,但能够用递归办法异常简朴完毕。规则:(1)一次只能移动一个 (2)大不能放在小上面 (3)只能在三个位置中移动第25页第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个金片问题变成了移动个金片问题变成了移动n-1个金个金片问题。这样做下去话最后就会变成移动一个金片片问题。这样做下去话最后就会变成移动一个金片问题。问题。第26页第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-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页第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,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);输入3。则n=3第28页第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(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);主函数调用hanoi(n,1,2,3);第一 次 调 用。第 一 次 调 用hanoi(n,a,b,c)(第一层)即要把三个金片移到cn=3第29页第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);hanoi(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页第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);hanoi(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页第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);hanoi(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页第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);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页第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,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页第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);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);n=1,执行结果为32n=1第35页第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);hanoi(n-1,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);第二层也执行完了,返回第一层,执行接下来语句,结果为13。n=3第36页第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(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页第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-1,b,a,c);main()int n;printf(“input n:”);scanf(“%d”,&n);hanoi(n,1,2,3);第38页第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,b=%d”,a,b);编译程序会提醒犯错:Undefined symbol a 和 Undefined symbol b。为何?第39页第39页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 6.4.1 6.4.1 变量作用域变量作用域 即变量有效范围u变量按作用域分为全局变量全局变量和局部变量局部变量u比较:全局变量(外部变量)局部变量(内部变量)定义位置:函数体外 函数体内作用域 :从定义处到本源 从定义处到本函数结束 文献结束举例:所有函数体外定义变量 (1)所有在函数体内定义 (2)形式参数注意与局部变量同名处理 局部变量屏蔽全局变量不同函数中同名局部变量互不干扰 第40页第40页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 1.1.局部变量局部变量 C C语言程序是由函数构成,有且只能有一个语言程序是由函数构成,有且只能有一个mainmain函数。函数。变量定义能够出现在函数内,亦可出现在函数外或者是函变量定义能够出现在函数内,亦可出现在函数外或者是函数参数中。数参数中。按照变量定义语句出现位置,能够分为:按照变量定义语句出现位置,能够分为:局部变量:局部变量:在函数或复合语句内定义;在函数或复合语句内定义;只在该函数或复合语句中才干使用。只在该函数或复合语句中才干使用。形式参数:形式参数:定义为函数参数;定义为函数参数;只在该函数中才干使用。只在该函数中才干使用。第41页第41页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 在在函函数数内内部部阐阐明明变变量量或或者者在在复复合合语语句句中中定定义义变变量量称为局部变量。其作用范围是其所在函数或复合语句。称为局部变量。其作用范围是其所在函数或复合语句。第42页第42页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 定定义义在在函函数数之之外外变变量量。其其作作用用范范围围从从它它被被定定义义位位置置起起,到所在文献结束。到所在文献结束。2 2、全局变量、全局变量第43页第43页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 假假如如在在全全局局变变量量定定义义之之前前函函数数想想引引用用该该外外部部变变量量,则则应应当当在在该该函函数数中中用用关关键键字字externextern作作“外外部部变变量阐明量阐明”。3 3、外部变量使用、外部变量使用 C C语语言言中中,用用extern extern 阐阐明明一一个个外外部部变变量量,语语句句格格式下列:式下列:extern extern 类型阐明符外部变量名;类型阐明符外部变量名;对于全局变量尚有下列几点阐明:对于全局变量尚有下列几点阐明:(1)全局变量就是外部变量全局变量就是外部变量(2)同一源文献中,允许全局变量和局部变量同名同一源文献中,允许全局变量和局部变量同名(3)全局变量可加强函数模块之间数据联系,但是又使函全局变量可加强函数模块之间数据联系,但是又使函数要依赖这些变量,因而使得函数独立性减少数要依赖这些变量,因而使得函数独立性减少 第44页第44页C C语言程序设计语言程序设计C C语言程序设计语言程序设计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页第45页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 6.4.2 6.4.2 变量存储方式变量存储方式u变量按存在时间分变量按存在时间分 静态变量 动态变量静态存储类型变量生存期为程序执行整个过程,在该过程中占有固定存储空间,通常称它们为永久存储。动态存储类型变量只生存在某一段时间内。比如,函数形参和函数体或分程序中定义变量,只是在程序进入该函数或分程序时才分派存储空间,当该函数或分程序执行完后,变量相应存储空间又被撤消了。第46页第46页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页1.自动变量自动变量 自动变量类型阐明符为自动变量类型阐明符为auto。自动变量是动态存储方。自动变量是动态存储方式。自动变量可省去阐明符式。自动变量可省去阐明符auto。自动变量含有以下特点:(1)自动变量作用域仅限于定义该变量结构内。(2)自动变量属于动态存放方式,只有定义该变量函数被调用时才给它分派存放单元,开始它生存期。函数调用结束,释放存放单元,结束生存期。(3)不同个体中允许使用同名变量而不会混同。第47页第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页第48页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页2.静态变量静态变量静态变量类型阐明符是静态变量类型阐明符是static。普通形式为:。普通形式为:static 类型名类型名 变量名变量名(1)静态局部变量:在局部变量阐明前再加上)静态局部变量:在局部变量阐明前再加上static阐明阐明符。符。(2)静态全局变量:在全局变量阐明之前加上)静态全局变量:在全局变量阐明之前加上static。3.存储器变量存储器变量存储器变量用关键字存储器变量用关键字register定义。普通形式为:定义。普通形式为:register 类型名类型名 变量名变量名u存储器变量只限于整型、字符型、指针型局部变量。存储器变量只限于整型、字符型、指针型局部变量。u存储器变量是动态变量,并且数目有限存储器变量是动态变量,并且数目有限,普通仅允许阐明普通仅允许阐明两个存储器变量。两个存储器变量。第49页第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%d,s);第50页第50页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页6.5 6.5 编译预处理编译预处理“编译预处理”是C语言编译系统 一个构成部分。是在编译前由编译系统中预处理程序对源程序预处理命令进行加工。源程序中预处理命令均以“#”开头,结束不加分号,以区别源程序中语句,它们能够写在程序中任何位置,作用域是自出现点到源程序末尾。n 预处理命令包括执执行行宏宏定定义义(宏宏替替换换)、文文献献包包括括和条件编译和条件编译。第51页第51页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计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页第52页C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页(3)宏定义必须写在函数之外,其作用域- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 编译 预处理 公开 一等奖 优质课 大赛 获奖 课件
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文