第6章 函数与编译预处理-xg.ppt

上传人:s****8 文档编号:67337328 上传时间:2022-12-24 格式:PPT 页数:103 大小:910.50KB
返回 下载 相关 举报
第6章 函数与编译预处理-xg.ppt_第1页
第1页 / 共103页
第6章 函数与编译预处理-xg.ppt_第2页
第2页 / 共103页
点击查看更多>>
资源描述

《第6章 函数与编译预处理-xg.ppt》由会员分享,可在线阅读,更多相关《第6章 函数与编译预处理-xg.ppt(103页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第六章第六章 函数与编译预处理函数与编译预处理6.1 6.1 模块化程序设计与函数模块化程序设计与函数6.2 6.2 函数的定义与调用函数的定义与调用6.3 6.3 函数的递归调用函数的递归调用6.4 6.4 变量作用域与存储方式变量作用域与存储方式6.5 6.5 编译预处理编译预处理6.6 6.6 函数设计举例函数设计举例C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页教学目的和基本要求:教学目的和基本要求:要求学生了解模块化程序设计的思想,掌握函数的定义及调用,理解变量的作用域与存储方式的概念,理解编译预处理的概念。教学重点:教学重点:函数的定义及调用、递归

2、调用、变量的作用域。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页6.1模块化程序设计与函数模块化程序设计与函数 在设计较复杂的程序时,我们一般采用的方法是:在设计较复杂的程序时,我们一般采用的方法是:把问题分成几个部分,每部分又可分成更细的若干小把问题分成几个部分,每部分又可分成更细的若干小部分,逐步细化,直至分解成很容易求解的小问题。部分,逐步细化,直至分解成很容易求解的小问题。这样的话,原来问题的解就可以用这些小问题来表示。这样的话,原来问题的解就可以用这些小问题来表示。把复杂任务细分成多个问题的过程,就叫程序的把复杂任务细分成多个问题的过程,就叫程序的

3、模块化。模块化。模块化程序设计是靠设计函数和调用函数实模块化程序设计是靠设计函数和调用函数实现的。现的。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页模块与函数C语语言言程程序序由由基基本本语语句句和和函函数数组组成成,每每个个函函数数可可完完成成相相对对独独立立的的任任务务,依依一一定定的的规规则则调调用用这这些些函函数数,就就组组成成了了解解决决某某个个特特定定问问题题的的程序。程序。任务、模块与函数的关系任务、模块与函数的关系:任务模块模块模块函数函数函数函数函数函数C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页看这样一

4、个问题:求200,1000的双胞胎数的对数。双胞胎数:两素数差为2称为双胞胎数。这是我们上一章结束的一道练习题,下面的左边是我们当时编的程序。main()inta,b,n=0,I;for(a=200;a=998;a+)for(I=2;Ia;I+)if(a%I=0)break;if(a=i)b=a+2;for(I=2;Ib;I+)if(b%I=0)break;if(b=i)n+;printf(“n%d”,n);我们注意到,程序中用筐住的部分是完成了相同的功能,即判断一个数(a或b)是否是素数。我们可以考虑用一个独立的函数来完成判断素数的功能,在主函数中调用此函数即可。如下:main()inta,

5、b,n=0;intf(intx);for(a=200;a=998;a+)if(f(a)=1)b=a+2;if(f(b)=1)n+;printf(“n%d”,n);intf(intx)intI;for(I=2;Ix;I+)if(x%I=0)break;if(x=I)return1;elsereturn0;下面我们详细介绍函数调用的格式和语法规定。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页6.2函数的定义与调用在C语言中,函数(Function)是一个处理过程,可以进行数值运算、信息处理、控制决策,即一段程序的工作放在函数中进行,函数结束时可以携带或不带处理结

6、果。库函数(标准函数):系统提供自定义函数:用户自己写C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页C语言程序处理过程全部都是以函数形式出现,最简单的程序至少也有一个main函数。函数必须先定义和声明后才能调用。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页标准库函数C语言有丰富的库函数,这些函数的说明在不同的头文件(*.h)中。想要调用标准的库函数,就必须include。#includemain()printf(“%d”,1024*768);调用printf函数时,必须includeC语言程序设计C语言程序设计C语言程序设计

7、C语言程序设计上一页上一页下一页下一页自定义函数可以把完成一个任务的过程写成函数。intA_to_a(intcapital)intsmall;if(capital=A&capital=Z)small=capital(A-a);returnsmall;返回值类型名函数名注意不要与已有库函数重名参数说明和参数列表调用函数时输入参数的格式要与之相同定义局部变量最好只使用局部变量,这样将方便调试。返回值如果不需返回则可return0;另外请注意这样的判断,如写成AcapitalZ是不行的C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页“函数”的主要知识点函数的定义函数的

8、参数和返回值函数的调用嵌套和递归变量的作用域C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页函数举例#includemain()inta,b,m;/*说明变量*/intmax(inta,intb);/*函数声明*/scanf(%d,%d,&a,&b);/*调用库函数scanf*/m=max(a,b);/*调用字定义函数max*/printf(max=%dn,m);/*调用库函数printf*/getch();/*调用库函数getch*/C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页函数举例intmax(inta,intb)/*定

9、义函数max*/inty;y=(ab)?a:b;/*条件表达式*/returny;if(ab)y=a;elsey=b;C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页自定义函数的声明自定义函数在调用前应先声明。使系统知道将要用到某个函数及它的类型,以便处理。函数声明应与该函数定义时给出的函数类型与名字、形参的个数、类型、次序相一致。#include“stdio.h”voidmain()floatx,y;intn;floatpower(floatx,intn);scanf(%f,%d,&x,&n);y=power(x,n);printf(“%8.2f”,y);fl

10、oatpower(floatx,intn)inti;floatt=1;for(i=1;i=n;i+)t=t*x;returnt;C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页求1!+2!+3!+10!算法i=1;s=0;当i=10s=s+i!定义求i!的函数C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页求1!+2!+3!+10!程序voidmain()longmm(int);/*自定义求阶乘函数应先声明*/inti;longs=0;for(i=1;i=10;i+)s+=mm(i);/*调用求阶乘函数,求I的阶乘*/printf

11、(“n%ld”,s);C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页定义求n!的函数longmm(intn)longt=1;inti;for(i=1;ib)?a:b;returny;调用时:m=max(3,6);m=max(a,b);括号里是形式参数返回值括号里是实参在这一句调用时,形参的值是3和6其返回值y将被赋给调用语句中的mC语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页形式参数与实际参数的关系1)形式参数在函数中是变量名,在函数调用时,形参被分配相应的内存2)实际参数是表达式负责向对应的形参标识的内存单元传递数据3)实参

12、与形参必须个数相同4)对应的形参和实参的类型必须一致C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页实参与形参例:主调函数中有如下语句:scanf(%d,%d,&a,&b);m=max(a,b+3);如果输入6,2函数intmax(inta,intb)形参a得到第一个实际参数a的值6形参b得到第二个实际参数b+3的值5C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页函数返回值函数返回值通过return语句获得函数返回值的类型就是函数的类型returny;将变量y的值返回给调用者returny+3;将表达式的值返回给调用者C语言程序

13、设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页return的数据类型与函数的类型矛盾时,自动将数据转换成函数的类型intfunct1()charch;while(ch=getch()z);returnch;调用:i=funct1();/*返回的是int类型*/C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页函数没有返回值,函数定义成空类型voidputline()inti;for(i=0;i35;i+)printf(-);printf(n);函数的功能就是输出函数的功能就是输出35个个-调用调用:putline();应该的语句形式应该的语

14、句形式i=putline();是错的是错的C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页调用函数a=function(x,y);或者function(x,y);取返回值只是操作解决更复杂问题时可以嵌套调用。longfac(intk)longf=1;inti;for(i=1;i=n;i+)f=f*i;retrunf;longcombination(intn,intm)longc;inti;c=fac(m)/(fac(n)*fac(m-n);retrunc;主函数:main()intn,m;longc;scanf(“%d,%d”,&n,&m);c=combinat

15、ion(n,m);prnit(“%ld”,c);理论上可以a(b(d(e(x),c(f)般嵌套无数层。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页6.3函数的递归调用函数调用它本身,称为递归。直接在函数内调用自己为直接递归,通过别的函数调用自己为间接递归。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身。每调用一次就进入新的一层。voida().a();.voida().b();.voidb().a();.递归在解决某些问题中,是一个十分有用的方法。因为其一,有的问题它本身就是递归定义的;其二,它可以使某些看起来不易解决的问题变得容易解决,写

16、出的程序较简短。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页例1递归方法求n!由于n!=n*(n-1)!是递归定义所以求n!(n-1)!(n-1)!(n-2)!(n2)!(n-3)!0!的问题,根据公式有0!=1。再反过来依次求出1!,2!直到最后求出n!。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归方法求n!longfac(intn)longf;if(n=0)f=1;elsef=n*fac(n-1);returnf;main()longy;intn;scanf(“%d”,&n);y=fac(n);printf(“%d

17、!=%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(

18、n-1)语句赋给了f值,同时返回了f。而这个返回的f又被fac(2)乘上当前的n值以后继续返回f直到最后的fac(n)都做完了,f的值被返回到了它的调用点:主函数中,这样就是一个递归运算。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页例2递归举例问题:第1个月有1对兔子过2个月,兔子就可每个月生1对兔子问第n个月有多少对兔子?分析:设第n个月有f(n)对兔子根据题意有f(0)=0,f(1)=1f(n)=f(n-1)+f(n-2)f(n-1):前一个月的兔子数f(n-2):本月生的兔子数C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下

19、一页定义函数f(n)longf(intn)switch(n)case0:return0;break;case1:return1;break;default:returnf(n-1)+f(n-2);/*调用函数f(n)*/C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页兔子问题主函数voidmain()longf(intn);/*自定义函数声明*/intn;printf(“ninputn:”);scanf(“%d”,&n);printf(“nf(%d)=%ld”,n,f(n);/*调用函数f(n)*/C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上

20、一页下一页下一页例3辗转相除法求最大公约数求m和n的公约数算法if(m%n)=0n是公约数;else求n和m%n的公约数;C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页求最大公约数的递归算法intgcd(intm,intn)if(m%n)=0returnn;elsereturngcd(n,m%n);C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页求最大公约数的主函数voidmain()intm,n,t;intgcd(intm,intn);scanf(“%d%d”,&m,&n);if(m%d”,a,c);elsehanoi(n-1

21、,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()intn;printf(“inputn:”);scanf(“%d”,&n);hanoi(n,1,2,3);C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归汉诺塔步骤voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-

22、%d”,a,c);hanoi(n-1,b,a,c);main()intn;printf(“inputn:”);scanf(“%d”,&n);hanoi(n,1,2,3);输入3。则n=3C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归汉诺塔步骤voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()intn;printf(“inputn:”);scanf(“%d”,&n);h

23、anoi(n,1,2,3);主函数调用hanoi(n,1,2,3);第一 次 调 用。第 一 次 调 用hanoi(n,a,b,c)(第一层)即要把三个金片移到cn=3C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归汉诺塔步骤voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()intn;printf(“inputn:”);scanf(“%d”,&n);hanoi(n,1,

24、2,3);由于n1则执行hanoi(n-1,a,c,b)(第二次调用)n=3C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归汉诺塔步骤voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()intn;printf(“inputn:”);scanf(“%d”,&n);hanoi(n,1,2,3);由于仍然n1则执行hanoi(n-1,a,c,b)(第三次调用)n=2C语言程序设

25、计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归汉诺塔步骤voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()intn;printf(“inputn:”);scanf(“%d”,&n);hanoi(n,1,2,3);由于n=1则printf(“%d-%d”,a,c);即把金片从a移动到cn=1C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归汉诺塔步

26、骤voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()intn;printf(“inputn:”);scanf(“%d”,&n);hanoi(n,1,2,3);第三层执行完毕,返回到第二层,即下去执行printf(“%d-%d”,a,c);把第二个金片摆到第二根针上n=2C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归汉诺塔步骤voidhanoi(intn,inta,in

27、tb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()intn;printf(“inputn:”);scanf(“%d”,&n);hanoi(n,1,2,3);执行下一条语句,又调用第三层hanoi(1,3,1,2)n=2C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归汉诺塔步骤voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1

28、,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()intn;printf(“inputn:”);scanf(“%d”,&n);hanoi(n,1,2,3);n=1,执行结果为32n=1C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归汉诺塔步骤voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()intn;printf(“i

29、nputn:”);scanf(“%d”,&n);hanoi(n,1,2,3);第二层也执行完了,返回第一层,执行接下来的语句,结果为13。n=3C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归汉诺塔步骤voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()intn;printf(“inputn:”);scanf(“%d”,&n);hanoi(n,1,2,3);执行接下来的语

30、句,再次调用第二层hanoi(2,2,1,3)n=3C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页递归汉诺塔步骤voidhanoi(intn,inta,intb,intc)if(n=1)printf(“%d-%d”,a,c);elsehanoi(n-1,a,c,b);printf(“%d-%d”,a,c);hanoi(n-1,b,a,c);main()intn;printf(“inputn:”);scanf(“%d”,&n);hanoi(n,1,2,3);C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页6.4 变量作用域与存储方

31、式先看一个例子,错在那里?: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。为什么?C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页一.变量的作用域即变量的有效范围1.变量按作用域分为全局变量全局变量和局部变量局部变量2.比较:全局变量(外部变量)局部变量(内部变量)

32、定义位置:函数体外函数体内作用域:从定义处到本源从定义处到本函数结束文件结束举例:所有函数体外定义的变量(1)所有在函数体内定义(2)形式参数注意与局部变量同名的处理局部变量屏蔽全局变量不同函数中同名局部变量互不干扰C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页 3 3、局部变量 C C语言程序是由函数组成的,有且只能有一个语言程序是由函数组成的,有且只能有一个mainmain函数。函数。变量定义可以出现在函数内,亦可出现在函数外或者是函变量定义可以出现在函数内,亦可出现在函数外或者是函数的参数中。数的参数中。按照变量定义语句出现的位置,可以分为:按照变量定义

33、语句出现的位置,可以分为:局部变量:局部变量:在函数或复合语句内定义;在函数或复合语句内定义;只在该函数或复合语句中才能使用。只在该函数或复合语句中才能使用。全局变量:全局变量:在函数外定义;在函数外定义;从它被定义的位置起从它被定义的位置起,在在之后的之后的所有函数中有效。所有函数中有效。形式参数:形式参数:定义为函数的参数;定义为函数的参数;只在该函数中才能使用。只在该函数中才能使用。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页 在在函函数数内内部部说说明明的的变变量量或或者者在在复复合合语语句句中中定定义义的的变变量量称称为为局局部部变变量量。其其作作

34、用用范范围围是是其其所所在在的的函函数数或或复复合合语句。语句。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页 又又称称全全程程变变量量或或外外部部变变量量,在在函函数数外外部部说说明明。其其作作用用范范围围从从它它被被定定义义的的位位置置起起,在在之之后后的的程程序序段段中都是起作用的。中都是起作用的。4、全局变量C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页 如如果果在在全全局局变变量量定定义义之之前前的的函函数数想想引引用用该该外外部部变变量量,则则应应该该在在该该函函数数中中用用关关键键字字externextern作作

35、“外外部部变变量量说说明明”。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页intint a,b;a,b;void swap()void swap()intint t;t;t=a;a=b;b=t;t=a;a=b;b=t;printfprintf(“swap:a=%d,b=%dnswap:a=%d,b=%dn”,a,b);,a,b);main()main()printfprintf(“Enter a,b:Enter a,b:”););scanfscanf(“%d,%d%d,%d”,&a,&b);,&a,&b);swap();swap();printfprintf

36、(“main:main:a=%d,b=%da=%d,b=%d”,a,b);,a,b);Enter a,b:Enter a,b:5,35,3 swap:a=3,b=5swap:a=3,b=5main:a=3,b=5main:a=3,b=5运行结果运行结果C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页intint a,b;a,b;void swap()void swap()intint t;t;t=a;a=b;b=t;t=a;a=b;b=t;printfprintf(“swap:a=%d,b=%dnswap:a=%d,b=%dn”,a,b);,a,b);main(

37、)main()printfprintf(“Enter a,b:Enter a,b:”););scanfscanf(“%d,%d%d,%d”,&a,&b);,&a,&b);swap();swap();printfprintf(“main:main:a=%d,b=%da=%d,b=%d”,a,b);,a,b);运行结果运行结果intint a,b;a,b;程序在编译时,屏幕将程序在编译时,屏幕将提示有错误提示有错误:UndefineUndefine symbol symbol a a UndefineUndefine symbol symbol b bC语言程序设计C语言程序设计C语言程序设计C语

38、言程序设计上一页上一页下一页下一页intint a,b;a,b;void swap()void swap()intint t;t;t=a;a=b;b=t;t=a;a=b;b=t;printfprintf(“swap:a=%d,b=%dnswap:a=%d,b=%dn”,a,b);,a,b);main()main()printfprintf(“Enter a,b:Enter a,b:”););scanfscanf(“%d,%d%d,%d”,&a,&b);,&a,&b);swap();swap();printfprintf(“main:main:a=%d,b=%da=%d,b=%d”,a,b);,

39、a,b);运行结果运行结果intint a,b;a,b;intint a=5,b=3;a=5,b=3;Enter a,b:Enter a,b:5,35,3 swap:a=3,b=5swap:a=3,b=5main:a=5,b=3main:a=5,b=3C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页#include int a,b;/*a,b为全局变量*/void f1(int x)int t1,t2,a;a=t1=x*4;t2=b*3;b=10;printf(“f1:t1=%d,t2=%d,a=%d,b=%dn”,t1,t2,a,b);main()a=2;b=

40、4;/*此a,b是全局变量,赋值*/f1(a);/*调用函数f1()*/printf(“main:a=%d,b=%d”,a,b);程序输出结果为:f1:t1=8,t2=12,a=8,b=10main:a=2,b=10C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页若将程序改为:#include int a=2,b=4;/*a,b为全局变量*/void f1()int t1,t2;t1=a*2;t2=b*3;b=100;printf(“t1=%d,t2=%d,b=%dn”,t1,t2,b);main()int b=4;/*此b是局部变量,赋值*/f1();/*调用

41、函数f1()*/printf(“a=%d,b=%d”,a,b);结论:全局变量与局部变量同名时,局部变量起作用,全局变量被屏蔽(不影响),应小心使用程序输出结果为:t1=4,t2=12,b=100a=2,b=4C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页二.变量的存储特性1.变量按存在时间分变量按存在时间分静态变量 动态变量静态存储类型的变量的生存期为程序执行的整个过程,在该过程中占有固定的存储空间,通常称它们为永久存储。动态存储类型变量只生存在某一段时间内。例如,函数的形参和函数体或分程序中定义的变量,只是在程序进入该函数或分程序时才分配存储空间,当该函数

42、或分程序执行完后,变量对应的存储空间又被撤销了。2.c语言中每一个变量有两个属性语言中每一个变量有两个属性:数据类型数据类型,存储特性存储特性完整的变量定义:存储特性数据类型变量名;C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页3.变量的存储特性变量的存储特性自动型auto静态型static寄存器型register外部型extern(1)auto型每次进入程序是自动分配内存,不长期占用内存例如:形式参数,自动型局部变量(2)static型局部静态变量全局静态变量长期占用内存C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页例例1

43、1:分析执行结果f(inta)intb=0;staticintc=3;b+;c+;printf(“%5d%5d%5d”,a,b,c);return(a+b+c);main()inta=2,k;for(k=0;k3;k+)printf(“%5dn”,f(a);静态变量只初始化一次结果:214(a,b,c)7(f(a)21582169C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页(3)register型将使用频率高的变量定义为register型,可以提高运行速度.数据内存运算器运算器结果控制器数据寄存器寄存器变量只限于整型、字符型、指针型的局部变量。寄存器变量是动

44、态变量,而且数目有限,一般仅允许说明两个寄存器变量。例如:registerintd;registercharc;C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页(4)extern型型引用:extern类型变量名;如果某个模块文件中要用到另一个模块文件中的全局变量,就要用extern说明例如:程序模块file1.c中定义了全局变量 int s;而在另一个程序模块file2.c中的函数fun1()中需要使用这个变量s。为此,可以在file2.c的函数fun1()中加上外部变量说明语句:fun1()extern int s;/*表明变量s是在其他文件定义的*/.定义时

45、分配内存,其他文件引用时不再分配内存.C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页6.5编译预处理“编译预处理”是C语言编译系统的一个组成部分。是在编译前由编译系统中的预处理程序对源程序的预处理命令进行加工。源程序中的预处理命令均以“#”开头,结束不加分号,以区别源程序中的语句,它们可以写在程序中的任何位置,作用域是自出现点到源程序的末尾。n预处理命令包括执执行行宏宏定定义义(宏宏替替换换)、包包含含文文件件和条件编译和条件编译。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页一.宏定义简单宏定义1.一般形式为一般形式为:#d

46、efine宏名串(宏体)如:#definePI3.14159/*定义后,可以用PI来代替串3.14159*/2.宏定义的作用宏定义的作用在宏定义之后,该程序中宏名就代表了该字符串。3.说明说明可以用#undef命令终止宏定义的作用域。例如:#undefPI宏定义的嵌套使用#defineR3.0#definePI3.1415926#defineL2*PI*R/*宏体是表达式*/#defineSPI*R*RC语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页main()printf(L=%fnS=%fn,L,S);/*2*PI*R替换L,PI*R*R替换S*/程序运行结

47、果如下:L=18.849556双引号内与宏同名的字母不作宏展开.(见上例)n带参数的宏定义1.带参数的宏定义的一般形式为带参数的宏定义的一般形式为#define宏名(参数表)字符串如:#defineS(a,b)a*b#definePR(x)printf(s=%fn”,x)C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页2.带实参的宏名被展开带实参的宏名被展开宏名被所定义的宏体替换,宏体中的形参按从左到右的顺序被实参替换。例如:area=S(3,2);PR(area);展开为:area=3*2;PR(area)展开的结果是:printf(s=%fn”,area);

48、宏定义与函数的区别(1)引用宏只占编译时间,不占运行时间。(2)引用宏没有返回值。如:#definesqu(n)n*nvoidmain(void)printf(%fn,27.0/squ(3.0);程序输出结果为:27.000000注意,展开为27.0/3.0*3.0不是27.0/(3.0*3.0)C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页(3)宏替换的形参无类型(4)实参为表达式的情况函数调用是先计算出实参的值函数调用是先计算出实参的值,再将值传递给形参;再将值传递给形参;宏的引用是用表达式替换形参宏的引用是用表达式替换形参.例如:#defineS(a,b

49、)a*b引用:S(a+c,b+c)展开后的表达式为:a+c*b+cC语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页二.文件包含#include1.文件包含是指一个源文件可以将是指一个源文件可以将 另一个源文件的全部内容包含进来。另一个源文件的全部内容包含进来。2.#include命令有两种格式。(1)#include(2)#include“文件名”3.两种格式区别(P81)C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页三.条件编译1.控制条件为常量表达式的条件编译,有以下几种形式:()if常量表达式程序段#endif功能:常量表

50、达式为非时,程序段被编译。否则,程序段不被编译。()if常量表达式程序段else程序段#endif功能:常量表达式为非,程序段被编译。否则,编译程序段。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页()if常量表达式程序段#elif常量表达式程序段.#elif常量表达式程序段n#else程序段n+1#endif.控制条件为定义标识符的条件编译)ifdef标识符程序段#endif功能:当标识符在该条件编译结构前已定义过时,程序段被编译。否则,程序段不被编译。C语言程序设计C语言程序设计C语言程序设计C语言程序设计上一页上一页下一页下一页()ifdef标识符程序段

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁