C语言程序设计教学课件.ppt

上传人(卖家):晟晟文业 文档编号:5191694 上传时间:2023-02-16 格式:PPT 页数:367 大小:3.61MB
下载 相关 举报
C语言程序设计教学课件.ppt_第1页
第1页 / 共367页
C语言程序设计教学课件.ppt_第2页
第2页 / 共367页
C语言程序设计教学课件.ppt_第3页
第3页 / 共367页
C语言程序设计教学课件.ppt_第4页
第4页 / 共367页
C语言程序设计教学课件.ppt_第5页
第5页 / 共367页
点击查看更多>>
资源描述

1、#include void main()()float average(float array10);/*函数声明函数声明*/float score10,aver;int;printf(input scores:););for(;(;scanf(,score););printf(););averaverage(score););printf(average score is.n,aver););float average(float array10)int;float aver,;,;for (;);return(aver););运行情况如下:运行情况如下:input scores:.5 .5

2、 average score is 83.40 例例 8.形参数组不定义长度形参数组不定义长度#include void main()()float average(float ,int)float score_15,.,;float score_210=67.5,89.5,99,6.5,77,89.5,76.5,54,60,99.5;printf(“the average of class A is%6.2fn”,average(score_1,5);printf(“the average of class B is%6.2fn”,average(score_2,10);float aver

3、age(float ,int)int;float aver,;,;for(;(;sumsumarray;aversum;return();();运行结果如下:运行结果如下:the average of class A is 80.40The average of class is 78.20例例 8.13 用选择法对数组中用选择法对数组中10个整数按由个整数按由小到大排序。所谓选择法就是先将小到大排序。所谓选择法就是先将10个个数中最小的数与数中最小的数与a0对换对换;再将再将a1到到a9中最小的数与中最小的数与a1对换对换每比较一轮每比较一轮,找出一个未经排序的数中最找出一个未经排序的数中最

4、小的一个。共比较小的一个。共比较9轮。轮。a0 a1 a2 a3 a4 3 6 1 9 4 未排序时的情况未排序时的情况 1 6 3 9 4 将将5个数中最小的数个数中最小的数1与与a0对换对换 1 3 6 9 4 将余下的将余下的4个数中最小的数个数中最小的数3与与a1对换对换 1 3 4 9 6 将余下的将余下的3个数中最小的数个数中最小的数4与与a2对换对换 1 3 4 6 9 将余下的将余下的2个数中最小的数个数中最小的数6与与a3对对 换,至此完成排序换,至此完成排序 程序实例程序实例#include void main()()void sort(int,int);int,;,;pr

5、intf(enter the array););for(;(;scanf(,);,);sort(,);(,);printf(the sorted array ););for(;(;printf(,);,);printf(););void sort(int,int)int,;,;for(;)(;);for(;)(;)if(array array=;=arrayk;arrayk=arrayi;arrayi=t 程序如下:程序如下:#include void main()()max_value(int 4);int 34=1,3,5,7,2,4,6,8,15,17,34,12;printf(max

6、value is,max_value(a)););max_value(int array 4)int,;,;=;(=;);)(;(;(array)=array;return();();运行结果如下:运行结果如下:Max value is 34在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为“局部变量”。float f1(int a)/*函数函数f1*/int b,c;a、b、c有效有效 char f2(int x,int y)/*函数函数f2*/int i,j;x、y、i、j有效有效 void main()

7、/*主函数主函数*/int m,n;m、n有效有效(1)主函数中定义的变量(m,n)也只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量。(2)不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。例如,上面在f1函数中定义了变量b和c,倘若在f2函数中也定义变量b和c,它们在内存中占不同的单元,互不混淆。(3)形式参数也是局部变量。例如上面f1函数中的形参a,也只在f1函数中有效。其他函数可以调用f1函数,但不能引用f1函数的形参a。(4)在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“

8、分程序”或“程序块”。说说明明void main()int a,b;int c;c=a+b;c在此范围内有效在此范围内有效 a,b在此范围内有效在此范围内有效 在函数内定义的变量是在函数内定义的变量是局部局部变量变量,而在函数之而在函数之外定义的变量称为外定义的变量称为外部变量外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。int p=1,q=5;/*外部变量外部变量*/float f1(int a)/*定义函数定义函数f1*/int b,c;char c1,c2;/*外部变量外部变量*/char f2(in

9、t x,int y)/*定义函数定义函数f2*/int i,j;全局变量全局变量p,q的作用范围的作用范围 全局变量全局变量c1,c2的作用范围的作用范围void main()/*主函数主函数*/int m,n;例例 8.15 有一个一维数组,内放个学生成绩,写有一个一维数组,内放个学生成绩,写一个函数,求出平均分、最高分和最低分。一个函数,求出平均分、最高分和最低分。#include float Max,Min;*全局变量全局变量*void main()()float average(float array,int n);float ave,score10;int;for(;)(;)scan

10、f(,);,);ave=average(,);(,);printf(“max=%6.2fnmin=%6.2fn average=%6.2fn“,Max,Min,ave);float average(float array,int n)*定义函数,形参为数组定义函数,形参为数组*/int;float aver,sum=array;Max=Min=array;for(=;);)if(arrayMax)Maxarray;else if(arrayMin)Min array;sum=sum+array;aver;return();();运行情况如下:运行情况如下:建议不在必要时不要使用全局变量,原因如

11、下:全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。它使函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性。一般要求把程序中的函数做成一个封闭体,除了可以通过“实参形参”的渠道与外界发生联系外,没有其他渠道。例例 8.8.6 6 外部变量与局部变

12、量同名外部变量与局部变量同名#include int a=3,b=5;/*a,b为外部变量为外部变量*/a,b作用范围作用范围void main()int a=8;/*a为局部变量为局部变量*/局部变量局部变量a作用范围作用范围 printf(%d,max(a,b);全局变量全局变量b的作用范围的作用范围 max(int a,int b)/*a,b为局部变量为局部变量*/int c;c=ab?a b;形参形参a、b作用范围作用范围 return(c);运行结果为运行结果为8 前面已介绍了从变量的作用域(即从空间)角度来分,可以分为全局变量全局变量和局部变量局部变量。那么从变量值存在的时间(即生

13、存期)角度来分,又可以分为静静态存储方式态存储方式和动态存储方式动态存储方式。所谓静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式。而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。这个存储空间可以分为三部分:程序区程序区静态存储区静态存储区动态存储区动态存储区在语言中每一个变量和函数有两个属性:数数据类型据类型和数据的存储类别数据的存储类别。对数据类型,读者已熟悉(如整型、字符型等)。存储类别指的是数据在内存中存储的方式。存储方式分为两大类:静态存储类和动态存储类。具体包含四种:自动的自动的(),(),静态的静态的(),),寄存器的寄存器的(),(),外外部的

14、部的()()。根据变量的存储类别,可以知道变量的作用域和生存期。函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。因此这类局部变量称为自动变量。自动变量用关键字作存储类别的声明。例如:int(int)*定义f函数,为形参*auto int,;*定义、为自动变量*有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上

15、一次函数调用结束时的值。这时就应该指定该局部变量为“静态局部变量”,用关键字进行声明。通过下面简单的例子可以了解它的特点。例例87 考察静态局部变量的值。#include void main()int(int);,;(;(,();int(int)int;();对静态局部变量的说明:对静态局部变量的说明:(1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放。(2)对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时

16、不再重新赋初值而只是保留上次函数调用结束时的值。而对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。(3)如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。(4)虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。例例88 输出到的阶乘值。#include void main()int fac(i

17、nt);int;for(;)printf(%!=,fac();Int fac(int)static int;*;();8.9.4 register变量变量 一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中。经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。如果有一些变量使用频繁(例如在一个函数中执行次循环,每次循环中都要引用某局部变量),则为存取变量的值要花费不少时间。为提高执行效率,语言允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存

18、取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高执行效率。这种变量叫做寄存器变量寄存器变量,用关键字作声明。例如,例819中的程序是输出到n的阶乘的值。例例819使用寄存器变量使用寄存器变量#include void main()long fac(long);long i,n;scanf(%ld,&n);for(i=1;i=n;i+)printf(%ld!=%ldn,i,fac(i);long fac(long n)register long i,f=1;/*定义寄存器变量*/for(i=1;i=n;i+)f=f*i;return(f);8.5用用extern声明外部变量声

19、明外部变量外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。编译时将外部变量分配在静态存储区。有时需要用extern来声明外部变量,以扩展外部变量的作用城。1.在一个文件内声明外部变量在一个文件内声明外部变量例例820 用用extern声明外部变量,扩展它在程声明外部变量,扩展它在程序文件中的作用域。序文件中的作用域。#include void main()int max(int,int);*外部变量声明*extern A,B;printf(%dn,max(A,B);int A=13,B=-8;*定义外部

20、变量*int max(int x,int y)*定义函数*int z;z=xy?x:y;return(z);2.在多文件的程序中声明外部变量在多文件的程序中声明外部变量例例8 用extern将外部变量的作用域扩展到其他文件。本程序的作用是给定的值,输入和,求和am的值。文件file中的内容为:#include int A;/*定义外部变量*/void main()int(int);/*函数声明*/int,;printf(enter the number a and its power m:n);scanf(,A,);A*;printf(*,A,);();printf(*n,A,);文件file

21、中的内容为:extern A;/*声明A为一个已定义的外部变量*/int(int);int,;for(;)*A;();8.9.6用用static声明外部变量声明外部变量有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时可以在定义外部变量时加一个声明。例如:file1.c file2.cstatic int A;extern int A;void main()void fun(int n)A=A*n;8.9.7关于变量的声明和定义关于变量的声明和定义对变量而言,声明与定义的关系稍微复杂一些。在声明部分出现的变量有两种情况:一种是需要建立存储空间的(如:int a;),

22、另一种是不需要建立存储空间的(如:extern a;)。前者称为“定义性声定义性声明明”(defining declaration),或简称定义定义(definition)。后者称为“引用性声明引用性声明”(referencing declaration)。广义地说,声明包括定义,但并非所有的声明都是定义。对“int a;”而言,它既是声明,又是定义。而对“extern a;”而言,它是声明而不是定义。一般为了叙述方便,把建立存储空间的声明称定建立存储空间的声明称定义义,而把不需要建立存储空间的声明称为声明把不需要建立存储空间的声明称为声明。显然这里指的声明是狭义的,即非定义性声明。例如:vo

23、id main()extern A;/*是声明不是定义。声明A是一 个已定义的外部变量*/int A;(1)从作用域作用域角度分,有局部变量和全局变量。它们采用的存储类别如下:局部变量|自动变量,即动态局部变量 (离开函数,值就消失)|静态局部变量(离开函数,值仍保留)|寄存器变量(离开函数,值就消失)|(形式参数可以定义为自动变量或寄存 器变量)全局变量|静态外部变量(只限本文件引用)|外部变量 (即非静态的外部变量,允许其他文件引用)(2)从变量存在的时间(生存期)来区分,有动态存储和静态存储两种类型。静态存储是程序整个运行时间都存在,而动态存储则是在调用函数时临时分配单元。动态存储动态存

24、储|自动变量自动变量(本函数内有效本函数内有效)|寄存器变量寄存器变量(本函数内有效本函数内有效)|形式参数形式参数(本函数内有效本函数内有效)静态存储|静态局部变量(函数内有效)|静态外部变量(本文件内有效)|外部变量(其他文件可引用)(3)从变量值存放的位置变量值存放的位置来区分,可分为:内存中静态存储区|静态局部变量|静态外部变量(函数外部静态变量)|外部变量(可为其他文件引用)内存中动态存储区:自动变量和形式参数CPU中的寄存器:寄存器变量()关于作用域作用域和生存期生存期的概念。从前面叙述可以知道,对一个变量的性质可以从两个方面分析,一是变量的作用域,一是变量值存在时间的长短,即生存

25、期。前者是从空间的角度,后者是从时间的角度。二者有联系但不是同一回事。(5)static对局部变量和全局变量的作用不同。对局部变量来说,它使变量由动态存储方式改变为静态存储方式。而对全局变量来说,它使变量局部化(局部于本文件),但仍为静态存储方式。从作用域角度看,凡有static声明的,其作用域都是局限的,或者是局限于本函数内(静态局部变量),或者局限于本文件内(静态外部变量)。8.10 内部函数和外部函数内部函数和外部函数 函数本质上是全局的,因为一个函数要被另外的函数调用,但是,也可以指定函数不能被其他文件调用。根据函数能否被其他源文件调用,将函数区分为内部函内部函数数和外部函数外部函数。

26、如果一个函数只能被本文件中其他函数所调用只能被本文件中其他函数所调用,它称它称为内部函数为内部函数。在定义内部函数时,在函数名和函数类型的前面加static。即static 类型标识符类型标识符 函数名函数名(形参表形参表)如 static int fun(int a,int b)(1)在定义函数时在定义函数时,如果在函数首部的最左端加关键字如果在函数首部的最左端加关键字extern,则表示此函数是外部函数,可供其他文件调则表示此函数是外部函数,可供其他文件调用。如函数首部可以写为用。如函数首部可以写为extern int fun(int a,int b)这样,函数这样,函数fun就可以为其他

27、文件调用。就可以为其他文件调用。C语言规定,语言规定,如果在定义函数时省略如果在定义函数时省略extern,则隐含为外部函数。则隐含为外部函数。本书前面所用的函数都是外部函数。本书前面所用的函数都是外部函数。(2)在需要调用此函数的文件中在需要调用此函数的文件中,用用extern对函数作声对函数作声明,表示该函数是在其他文件中定义的外部函数明,表示该函数是在其他文件中定义的外部函数 例例 8.22 8.22 有一个字符串有一个字符串,内有若干个字符内有若干个字符,今输入一个字今输入一个字符符,要求程序将字符串中该字符删去。用外部函数实现要求程序将字符串中该字符删去。用外部函数实现 File.c

28、(文件)(文件)#include void main()extern void enter_string(char str);extern void detele_string(char str,char ch);extern void print_string(char str);*以上以上3行声明在本行声明在本函数中将要调用的在其他文件中定义的函数中将要调用的在其他文件中定义的3个函数个函数*char c;char str80;scanf(%c,&c);detele_string(str,c);print_string(str);file(文件)(文件)#include void ente

29、r_string(char str80)*定义外部函数定义外部函数 enter-string*gets(str);*向字符数组输入字符串向字符数组输入字符串*file(文件)(文件)void delete_string(char str,char ch)*定义外部函数定义外部函数 delete_string*int i,j;for(i=j=0;stri!=0;i+)if(stri!=ch)strj+=stri;stri=0;file(文件)(文件)#include void print_string(char str)printf(%sn,str);运行情况如下:运行情况如下:(输入)输入)(

30、输入要删去的字符)(输入要删去的字符)(输出已删去指定字符的字符串)(输出已删去指定字符的字符串)第九章第九章l 本章要点9.1 9.1 宏定义宏定义9.29.2“文件包含文件包含”处理处理9.3 9.3 条件编译条件编译 基本概念基本概念 ANSI C标准规定可以在源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。这些预处理命令是由ANSI C统一规定的,但是它不是C语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们)。必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”经过预处理后程序可由编译程序对预处理后的源程序进行通常的编译处理,得到

31、可供执行的目标代码。基本概念基本概念 C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。提供的预处理功能主要有以下三种:宏定义文件包含条件编译 这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般语句相区别,这些命令以符号“”开头。例如:#define#include 9.1.1 不带参数的宏定义不带参数的宏定义 宏定义一般形式为:definedefine 标识符标识符 字符串字符串例如:例如:define PI 3.1415926define PI 3.1415926 宏定义的作用是在本程序文件中用指定的标识符PI来代替“3.1415926”这个字符

32、串,在编译预处理时,将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。这种方法使用户能以一个简单的名字代替一个长的字符串.这个标识符(名字)称为“宏名”在预编译时将宏名替换成字符串的过程称为“宏展开”。define是宏定义命令。#include#define PI 3.1415926#define PI 3.1415926 void main()float l,s,r,v;printf(input radius:);scanf(%f,&r);l=2.0*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf(l=%10.4fns=%10.4fnv=%10.

33、4fn,l,s,v);例例9.1 9.1 使用不带参数的宏定义使用不带参数的宏定义input radius:4 运行情况如下:运行情况如下:1=25.1328s=50.2655v=150.7966(1)宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母。(2)使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。(3)宏定义是用宏名代替一个字符串,只作简单置换,不作正确性检查。只有在编译已被宏展开后的源程序时才会发现语法错误并报错。(4)宏定义不是语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。(5)definedefine命令出现在程序中函数

34、的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,definedefine命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。(6)可以用undefdef命令终止宏定义的作用域。例如:#define G 9.8 _ void main()G的有效范围 -#undef G f1()在在f1f1函数中,不再代表函数中,不再代表9.89.8。这样可以灵活控制宏。这样可以灵活控制宏定义的作用范围。定义的作用范围。(7)在进行宏定义时,可以引用已定义的宏名,可以层层置换。#include#define R 3.0#define PI 3.1415926#define L 2*PI*R

35、#define S PI*R*Rvoid main()printf(L=%fnS=%fn,L,S);运行情况如下:运行情况如下:L=18.849556S=28.274333例例9.2 9.2 在宏定义中引用已定义的宏名在宏定义中引用已定义的宏名经过宏展开后,printf函数中的输出项被展开为:2*3.1415926*3.0展开为 3.1415926*3.0*3.0printf函数调用语句展开为:printf(“L=%FNS=%fn”,2*3.1415926*3.0,3.1415926*3.0*3.0);(8)对程序中用双撇号括起来的字符串内的字符,即使与宏名相同,也不进行置换。(9)宏定义是专

36、门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。9.1.2 带参数的宏定义 作用:不是进行简单的字符串替换,还要进行参数替换。带参数的宏定义一般形式为:definedefine 宏名(参数表)宏名(参数表)字符串字符串 字符串中包含在括弧中所指定的参数#define S(a,b)a*b area=S(3,2);程序中用和分别代替宏定义中的形式参数和b,用*代替S(3,2)。因此赋值语句展开为:area=3area=3*2 2例:对带实参的宏(如S(3,2),则按define命令行中指定的字符串从左到右进行置换。若串中包含宏中的形参(如a、b),则将程序中相

37、应的实参(可以是常量、变量或表达式)代替形参。如果宏定义中的字符串中的字符不是参数字符(如*中的*号),则保留。这样就形成了置换的字符串。#include#define PI 3.1415926#define S(r)PI*r*r void main()float a,area;a=3.6;area=S(a);printf(r=%fnarea=%fn,a,area);运行情况如下:运行情况如下:=3.600000 area=40.715038例例9.3 9.3 使用带参的宏使用带参的宏赋值语句“area=S(a);”经宏展开后为:area=3.1415926area=3.1415926*;(1

38、)对带参数的宏展开只是将语句中的宏名后面括号内的实参字符串代替definedefine 命令行中的形参。(2)在宏定义时,在宏名与带参数的括弧之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。(1)函数调用时,先求出实参表达式的值,然后代入形参。而使用带参的宏只是进行简单的字符替换。(2)函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。(3)对函数中的实参和形参类型要求一致。而宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。宏定义时,字符串可以是任何

39、类型的数据。(4)调用函数只可得到一个返回值,而用宏可以设法得到几个结果。#include#include#define PI 3.1415926#define PI 3.1415926#define CIRCLE(R,L,S,V)#define CIRCLE(R,L,S,V)L=2L=2*PIPI*R;S=PIR;S=PI*R R*R;V=4.0/3.0R;V=4.0/3.0*PIPI*R R*R R*R R void main()void main()float r,l,s,v;float r,l,s,v;scanf(%f,&r);scanf(%f,&r);CIRCLE(r,l,s,v);

40、CIRCLE(r,l,s,v);printf(r=%6.2f,l=%6.2f,s=%6.2f,v=%6.2fnprintf(r=%6.2f,l=%6.2f,s=%6.2f,v=%6.2fn,r,l,s,v);,r,l,s,v);例例9.4 9.4 通过宏展开得到若干个结果通过宏展开得到若干个结果void mainvoid main()()float r,l,s,v;float r,l,s,v;scanf(%f,&r);scanf(%f,&r);l=2l=2*3.14159263.1415926*r;r;s=3.1515926 s=3.1515926*r r*r;r;v=4.0/3/0 v=4.

41、0/3/0*3.14159263.1415926*r r*r r*r;r;printf(printf(”r=%6.2f,l=%6.2f,s=%6.2f,v=%6.2fnr=%6.2f,l=%6.2f,s=%6.2f,v=%6.2fn”,r,l,s,v);,r,l,s,v);对宏进行预编译,展开后的对宏进行预编译,展开后的mainmain函数如下:函数如下:运行情况如下:运行情况如下:3.5r=3.50,l=21.99,s=38.48,v=179.59(5)使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不会使源程序变长。(6)宏替换不占运行时间,只占编译时间。而函数调用

42、则占运行时间(分配单元、保留现场、值传递、返回)。如果善于利用宏定义,可以实现程序的简化,如事先将程序中的“输出格式”定义好,以减少在输出语句中每次都要写出具体的输出格式的麻烦。例例9.5 9.5 通过宏展开得到若干个结果通过宏展开得到若干个结果#include#include#define PR printf#define PR printf#define NL n#define NL n#define D%d#define D%d#define D1 D NL#define D1 D NL#define D2 D D NL#define D2 D D NL#define D3 D D D

43、NL#define D3 D D D NL#define D4 D D D D NL#define D4 D D D D NL#define S%s#define S%svoid main()void main()int a,b,c,d;int a,b,c,d;char string=CHINA;char string=CHINA;a=1;b=2;c=3;d=4;a=1;b=2;c=3;d=4;PR(D1,a);PR(D1,a);PR(D2,a,b);PR(D2,a,b);PR(D3,a,b,c);PR(D3,a,b,c);PR(D4,a,b,c,d);PR(D4,a,b,c,d);PR(S,

44、string);PR(S,string);运行时输出结果:所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来。语言提供了#include命令用来实现“文件包含”的操作。其一般形式为:#include#include 文件名文件名 或#include#include 例例9.6 9.6 将例将例9 95 5时格式宏做成头文件,把它时格式宏做成头文件,把它包含在用户程序中。包含在用户程序中。(1)(1)将格式宏做成头文件将格式宏做成头文件format.hformat.h#include#include#define PR printf#define PR printf#def

45、ine NL n#define NL n#define D%d#define D%d#define D1 D NL#define D1 D NL#define D2 D D NL#define D2 D D NL#define D3 D D D NL#define D3 D D D NL#define D4 D D D D NL#define D4 D D D D NL#define S%s#define S%s(2)(2)主文件主文件file1.cfile1.c#include#include include format.hinclude format.hvoid main()void m

46、ain()int a,b,c,d;int a,b,c,d;char string=CHINA;char string=CHINA;a=1;b=2;c=3;d=4;a=1;b=2;c=3;d=4;PR(D1,a);PR(D1,a);PR(D2,a,b);PR(D2,a,b);PR(D3,a,b,c);PR(D3,a,b,c);PR(D4,a,b,c,d);PR(D4,a,b,c,d);PR(S,string);PR(S,string);注意:注意:在编译时并不是分别对两个文件分别进行编译,然后再将它们的目标程序连接的,而是在经过编译预处理后将头文件format.h包含到主文件中,得到一个新的源程

47、序,然后对这个文件进行编译,得到一个目标(.obj)文件。被包含的文件成为新的源文件的一部分,而单独生成目标文件。(1)一个#include命令只能指定一个被包含文件,如果要包含个文件,要用个#include命令。(2)如果文件包含文件,而在文件中要用到文件的内容,则可在文件中用两个include命令分别包含文件和文件,而且文件应出现在文件之前,即在file1.c中定义。(3)在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。(4)在#include命令中,文件名可以用双撇号或尖括号括起来。(5)被包含文件(file2.h)与其所在的文件(即用#include命令的源文件f

48、ile2.c),在预编译后已成为同一个文件(而不是两个文件)。因此,如果file2.h中有全局静态变量,它也在file1.h文件中有效,不必用extern声明。概念:所谓“条件编译”,是对部分内容指定编译的条件,使其只在满足一定条件才进行编译。条件编译命令的几种形式:(1)ifdef 标识符 程序段else 程序段endif(2)ifndef 标识符 程序段else 程序段endif(3)if 表达式 程序段else 程序段endif例例9 97 7 输入一行字母字符,根据需要设置条件输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出,或全改为编译,使之能将字母全改为大写输出,

49、或全改为小写字母输出。小写字母输出。#include#include#define LETTER 1#define LETTER 1 void main()void main()char str20=C Language,c;char str20=C Language,c;int i;int i;i=0;i=0;while(c=stri)!=0)while(c=stri)!=0)i+;i+;#if LETTER#if LETTER if(c=a&c=a&c=A&c=A&c=Z)c=c+32;c=c+32;#endif#endif printf(%c,c);printf(%c,c);运行结果为:

50、LANGUAGE第十章第十章为了说清楚什么是指针,必须弄清楚数据在内存中是如何存储的,又是如何读取的。内存区的每一个字节有一个编号,这就是“地址地址”。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。、按变量地址存取变量值的方式称为“直接访问直接访问”方式(,);(,);例如:例如:另一种存取变量值的方式称为“间接访问间接访问”的方式。即,将变量的地址存放在另一个变量中。在语言中,指针是一种特殊的变量,它是存放地址的。在语言中,指针是一种特殊的变量,它是存放地址的。假设我们定义了一个指针变量i_pointer用来存放整型变量的地址,它被分配地址为(3010)、(

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(C语言程序设计教学课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|