[计算机软件及应用]C语言程序设计第5章ppt课件_第1页
[计算机软件及应用]C语言程序设计第5章ppt课件_第2页
[计算机软件及应用]C语言程序设计第5章ppt课件_第3页
[计算机软件及应用]C语言程序设计第5章ppt课件_第4页
[计算机软件及应用]C语言程序设计第5章ppt课件_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章第五章 模块化程序设计函数模块化程序设计函数集美大学计算机根底教研室2l教学目的与要求掌握函数的定义和调用掌握函数参数的传递方式领会变量存储类型的概念及各种存储型变量的生存期和有效范围领会函数的嵌套调用与递归调用理解带参数的main函数l重点与难点函数定义、调用、声明等根本概念函数的嵌套调用与递归调用数组作为函数的参数变量的存储类别与作用域有参宏与无参宏的定义与应用文件包含的根本概念23一、模块化设计与函数一、模块化设计与函数l把大型软件按照规定的原那么划分成一个个较小的、相对独立但又互相关联的模块,叫做模块化设计。l1965年,G.A.Miller在他的著名文章“奇妙的数字72人类信息

2、处理才能的限度中指出,普通人分辨或记忆同一类信息的不同品种或等级的数量一般不超过59项。这说明,要使人的智力能足以管理好程序,应该坚持模块化设计。正如不分段的长篇文章可能使读者感到头痛一样,大型的单模块软件不仅可读性差,可靠性也常常难以保证。lC语言中,模块化设计的重要工具是“自定义函数。34一、模块化设计与函数一、模块化设计与函数【例一】输出任一两数中较大者#include #include /*根本输入输出函数clrscr getch等*/main /*主调函数*/ int a,b,c; int maxint,int; /*函数原型*/ clrscr ; printfInput a,b=;

3、 scanf%d,%d,&a,&b; c=maxa,b; printfmax=%dn,c;int maxint x,int y /*被调函数*/ int z; if xy z=x; else z=y; return z;45一、模块化设计与函数一、模块化设计与函数本章的学习首先要讨论什么是函数?为什么要使用函数?函数有哪些类型?如何自己定义一个函数?如何调用一个函数?函数学习的难点是什么?56一、模块化设计与函数一、模块化设计与函数什么是函数?为什么要使用函数?函数有哪些类型?如何自己定义一个函数?如何调用一个函数?函数学习的难点是什么? 什么是函数?一个独立的程序模块,可以定

4、义自己的变量仅在本函数内有效,拥有自己的存储空间。可以被其他函数或自身调用主函数除外。 67一、模块化设计与函数一、模块化设计与函数什么是函数?为什么要使用函数?函数有哪些类型?如何自己定义一个函数?如何调用一个函数?函数学习的难点是什么? 为什么要使用函数?u 便于实现模块化设计u 便于团队开发u 便于使用现有的或别人的程序模块进步编程效能在C程序设计中,通常: 将一个大程序分成几个子程序模块自定义函数 将常用功能做成标准模块标准函数放在函数库中供其他程序调用 假如把编程比做制造一台机器,函数就好比其零部件。l可将这些“零部件单独设计、调试、测试好,用时拿出来装配,再总体调试。l这些“零部件

5、可以是自己设计制造/别人设计制造/如今的标准产品78一、模块化设计与函数一、模块化设计与函数【例二】编写一个儿童算术才能测试软件main char ans = y; clrscr ; cover ; /*调用软件封面显示函数*/ password ; /*调用密码检查函数*/ while ans =y| ans =Y question ; /*调用产生题目函数*/ answers ; /*调用承受答复函数*/ marks ; /*调用评分函数*/ results ; /*调用结果显示函数*/ printf“是否继续练习?Y/Nn; ans=getch ; printf“谢谢使用,再见!; 自定

6、义函数89一、模块化设计与函数一、模块化设计与函数【例二】编写一个儿童算术才能测试软件main char ans = y; clrscr ; cover ; /*调用软件封面显示函数*/ password ; /*调用密码检查函数*/ while ans =y| ans =Y question ; /*调用产生题目函数*/ answers ; /*调用承受答复函数*/ marks ; /*调用评分函数*/ results ; /*调用结果显示函数*/ printf是否继续练习?Y/Nn; ans=getch ; printf谢谢使用,再见!;/*定义所用函数*/cover /*软件封面显示函数

7、*/password /*密码检查函数*/question /*产生题目函数*/answers /*承受答复函数*/marks /*评分函数*/results /*结果显示函数*/ n 这些函数如今不编程或还不会编程,可先放空。n 可以多人合作,每人完成假设干个函数模块化。n 可在另一个源程序文件中定义。Lets try910一、模块化设计与函数一、模块化设计与函数什么是函数?为什么要使用函数?函数有哪些类型?如何自己定义一个函数?如何调用一个函数?函数学习的难点是什么? 函数有哪些类型?根据函数的来源,可分为:u库函数标准函数 由系统提供,编程时可直接使用之u自定义函数 由编程者自己编写,使

8、用时要“先定义后使用根据使用的方式,可分为:u无参函数 u有参函数函数内需要使用主调函数中的数据1011一、模块化设计与函数一、模块化设计与函数什么是函数?为什么要使用函数?函数有哪些类型?如何自己定义一个函数?如何调用一个函数?函数学习的难点是什么?u 如何自己定义一个函数? 见后u 如何调用一个函数? 见后u 函数部分学习的难点是什么? 函数的概念 形参/实参/返回值的概念 递归算法 变量的作用域和生存期 1112一、模块化设计与函数一、模块化设计与函数函数使用常识: 一个源文件由一个或多个函数组成,可为多个C程序公用。lC语言是以源文件为单位而不以函数为单位进展编译的。l一个C程序由一个

9、或多个源程序文件组成可分别编写、编译和调试。lC程序执行总是从main函数开场,一般情况下调用其它函数后总是回到main函数,最后在 main函数中完毕整个程序的运行。l所有函数都是平行的、互相独立的,即在一个函数内只能调用其他函数,不能再定义一个函数嵌套定义。l一个函数可以调用其他函数或其本身,但任何函数均不可调用main函数。 1213二、函数的定义二、函数的定义函数定义“制造自己的函数。 P1041、函数定义的一般形式 参见例二 函数返回值的数据类型 函数名类型名 变量名1,类型名 变量名2, 声明部分 处理语句 【注意】无形参表的即无参函数。无函数体的为“空函数。假如函数返回值的数据类

10、型为int,可以省略之。 类型标识符形参表1314二、函数的定义二、函数的定义把程序控制权从函数返回函数调用点有三种方法:l执行到函数完毕的右花括号时假如函数没有返回值;l执行到如下语句假如函数没有返回值: return;l把返回值返回调用处见例一 return 表达式; 形式: return x; return x+y; return xy?x:y; 语句中圆括号亦可省略。1415二、函数的定义二、函数的定义【注意】 假如函数值类型与return语句表达式值的类型不一致,以函数类型为准数值型会自动进展类型转换。 假如明确表示不需返回值,应使用void作函数返回值的数据类型,否那么即使没有re

11、turn语句,仍将带回一个不确定的值见P107说明。 1516三、函数的调用三、函数的调用1、库函数的调用 必须在源程序中用include命令将定义该库函数的头文件“包含进来。调用方式: 独立语句 执行某项操作,如clrscr , printf“Input a,b=等表达式中 作运算对象,如 a=sqrtx+powr,3,c=expa 等1617三、函数的调用三、函数的调用2、自定义函数 自定义函数和变量一样,在其主调函数中也必须“先声明,后使用。 如例一中的 int maxint,int; /*函数原型*/ 例一中的自定义函数声明也可以用以下两种形式: int maxint x,int y;

12、 多余,因为编译系统并不检查参数名 或 int max ;编译系统将不检查参数类型和参数个数 以下情况时,被调函数在主调函数中可以不先声明: l被调函数的返回值为整型时函数值是整型int或字符型char时系统自动按整型说明;l被调函数的定义出如今主调函数之前时l在所有函数定义之前,在函数的外部已做了函数声明时 调用方式同库函数。1718三、函数的调用三、函数的调用3、调用外部函数其他源文件中定义的函数时 函数说明语句 extern 函数名; 【例二】 文件file1.c中main int x=80,y=90,c; extern max; /*函数说明*/ c=maxx,y+20; /*调用ma

13、x函数*/ printf“Max is %dn,c; 文件files2.c中与file1.c同目录extern maxint a,int b /*extern可省*/ float c; c=ab?a:b; return c; 注:要做一个 .prj文件才能运行。1819三、函数的调用三、函数的调用main f1=fx1; f2=fx2; x=rootx1,x2; 例 嵌套调用关系简化 float ffloat x float xpointfloat x1,float x2 y= 调用fx1、fx2float rootfloat x1,float x2; y1=fx1 x=xpointx1,x2

14、 y=fx4、函数的嵌套调用 1920三、函数的调用三、函数的调用4、函数的嵌套调用 例8.6嵌套调用关系示意图2021例 模块划划分情况main n根据输入的x1,x2判断是否有根n假设有,调用求根函数root n输出结果fx根据所给x值,求y=x3-5x2+16x-80返回y值,即与x对应的fx值xpoint 根据所给x1,x2值计算弦与x轴的交点rootx1,x2 根据所给x1,x2值求近似根2122四、函数的递归调用四、函数的递归调用1、递归的概念 l直接递归调用直接递归调用 调用函数的过程中又调用该函数本身l间接递归调用间接递归调用 调用f1函数的过程中调用f2函数,而f2中又需要调

15、用f1。 以上均为无终止递归调用。 为此,一般要用if语句来控制使递归过程到某一条件满足时完毕。2223四、函数的递归调用四、函数的递归调用2、递归算法 类似于数学证明中的反推法,从后一结果与前一结果的关系中寻找其规律性。 归纳法可以分为:n递推法 从初值出发,归纳出新值与旧值间直到最后值为止存在的关系。 要求通过分析得到: 初值+递推公式 编程:通过循环控制构造实现循环的终值是最后值n递归法 从结果出发,归纳出后一结果与前一结果直到初值为止存在的关系。 要求通过分析得到: 初值+递归函数 编程:设计一个函数递归函数,这个函数不断使用下一级值调用自身,直到结果处选择控制构造。2324四、函数的

16、递归调用四、函数的递归调用2、递归算法其一般形式是:在主函数中用终值n调用递归函数,而在递归函数中:递归函数名f参数x if n=初值 结果=; else 结果=含fx-1的表达式; 返回结果return;fx fx-1 main fn fx-1 fx-2 fx-2 fx-3 fx0 fx0= 2425【例一】 用递归法求n!分析比较: 实际上,递归程序分两个阶段执行 回推调用:欲求n! 先求 n-1! n-2! 1! 假设1!,回推完毕。 递推回代:知道1!2!可求出3! n!2526程序如下:程序如下:main int n; float s; float fac; clrscr; prin

17、tfInput n=; scanf%d,&n; s=facn; printf%d!=%.0f,n,s;float facint x int f; if x=0|x=1 f=1; else f=facx-1*x; return f; 2627【例二】有5个人,第5个人说他比第4个人大2岁,第4个人说他对第3个人大2岁,第3个人说他对第2个人大2岁,第2个人说他比第1个人大2岁,第1个人说他10岁。求第5个人多少岁。 P158例8.7 通过分析,设计递归函数如下: 10 n=1 agen= agen-1+2 n12728 递归函数: 10 (n=1) age(n)= age(n-1)+2

18、(n1)ageint n int c; if n=1 c=10; else c=agen-1+2; return c; main clrscr ; printf%d,age5;程序如下:请看看单步运行的情况2829 age5 c=age4+2; return c;ageint n int c; if n=1 c=10; else c=agen-1+2; return c; 递归过程跟踪分析: age4 c=age3+2; return c; age3 c=age2+2; return c; age2 c=age1+2; return c; age1 c=10 return c;c=10c=12

19、c=14c=16c=182930 1 1 1 1 1 1 1 2 1 1 2 1 1 3 3 1 1 3 3 1 1 4 6 4 1 1 4 6 4 1 1 5 10 10 5 11 5 10 10 5 1 分析: 若起始行为第1行则: 第x行有x个值 对第x行第y列(不计左侧空格时) 其值可用以下递归函数表示: 1 (y=1 或 y=x) c(x,y)= c(x-1,y-1)+c(x-1,y)3031递归函数 : 1 y=1 或 y=x cx,y= cx-1,y-1+cx-1,y程序如下:main int i,j,n; clrscr ; printfInput n=; scanf%d,&am

20、p;n; for i=1;i=n;i+ for j=0;j=n-i;j+ printf ; for j=1;j1程序如下:fib int n int f; if n=1|n=2 f=1; else f=fibn-1+fibn-2; return f;main int i,s=0; clrscr ; for i=1;i=12;i+ s=s+fibi; printfn=12,s=%d,s;结果:n=12,s=3763233【例五例五】运行以下程序,当输入字符序列运行以下程序,当输入字符序列AB$CDEAB$CDE并回车时,程序的输出结果是什么?并回车时,程序的输出结果是什么?#include re

21、v char c; c=getchar; if c=$ printf%c,c; else rev; printf%c,c; main rev;结果:$BArevc=Arev 输出Arevc=Brev 输出Brevc=$输出$3334【例六例六】反向输出一个整数非数值问题反向输出一个整数非数值问题非数值问题的分析无法象数值问题那样能得出一个初值和递归函数式,但思路是一样的。分析方法:简化问题:设要输出的正整数只有一位,那么“反向输出问题可简化为输出一位整数。对大于10的正整数,逻辑上可分为两部分:个位上的数字和个位以前的全部数字。将个位以前的全部数字看成一个整体,那么为了反向输出这个大于10的正

22、整数,可按以下步骤: a、输出个位上的数字; b、将个位除外的其他数字作为一个新的整数,重复a步骤的操作。其中b问题只是对原问题在规模上进展了缩小递归。所以,可将反向输出一个正整数x的算法归纳为: if x为一位整数 输出x; else 输出x的个位数字; 对剩余数字组成的新整数重复“反向输出操作; 3435程序如下:#include void main void printnint x; int n; printfInput n=; scanf%d,&n; if n=0&x=9 printf%d,x; /*假设x为多位整数*/ else /*输出其个位,并形成新的x*/ pr

23、intf%d,x%10; printnx/10; 3536【例七例七】汉诺塔汉诺塔Tower of HanoiTower of Hanoi问题。问题。 也是一个非数值问题。也是一个非数值问题。 P113例4.10 分析方法:简化问题:设盘子只有一个,那么本问题可简化为ab。对于大于一个盘子的情况,逻辑上可分为两部分:第n个盘子和除n以外的n-1个盘子。假如将除n以外的n-1个盘子看成一个整体,那么要解决本问题,可按以下步骤: a、将a杆上n-1个盘子借助于b先移到c杆; ac n-1,a,c,b b、将a杆上第n个盘子从a移到b杆; ab c、将c杆上n-2个盘子借助a移到b杆。 cb n-2

24、,c,b,a 3637五五、数组作为函数参数、数组作为函数参数1、用数组元素作函数实参 P164此时可把数组元素看作普通变量单向的值传送。p 特点: 主调函数中的实参数组元素 带下标 被调函数中的形参普通变量p 调用结果:形参值的变化对实参值无影响 二者分占不同内存。3738【例一例一】以下程序的功能是什么?以下程序的功能是什么? #include main int i; float sum=0,x10; float meanfloat,int; clrscr; fori=0;i0 printf%f的平方根是:%fn,a,sqrta; return sqrta; else printfx%d=

25、%fn,i,a; return 0.0; 在主函数中输入10个数值,并调用功能函数求其正数的算术平方根之和。3839什么是单向什么是单向“值传送方式?值传送方式?3940五五、数组作为函数参数、数组作为函数参数2、用数组名作函数实参 P165 假设 int a6; 那么数组名a表示数组的起始地址。 所以用数组名,实际上是把实参数组的起始地址“传给形参数组。p本质:对应的数组元素不是形参与实参共享同一段内存单元所谓“双向的地址传送。p特点: 主调函数中的实参数组名不带下标 被调函数中的形参数组名或数组定义式p调用结果:两数组同下标者为同值。4041【例二例二】以下程序的运行结果是什么?以下程序的

26、运行结果是什么?fint b ,int n int i,t; t=0; for i=1;i=n;i+ t=t+bi; return t;main int x,a =1,2,3,4,6; x=fa,a3; printf%dn,x; 注意1、形参数组和实参数组应分别在各自函数中定义;2、形参数组可不定义大小用空方格;3、二者大小可一致或不一致C编译程序不检查形参, 但注意引用形参时不要超过实参界。结果:154142什么是双向的什么是双向的“地址传送方式?地址传送方式?fint b ,int n int i,t; t=0; for i=1;i=n;i+ t=t+bi; return t;main i

27、nt x,a =1,2,3,4,6; x=fa,a3; printf%dn,x; 本质是共享同一段内存单元4243【例三例三】分析以下程序的运行结果。分析以下程序的运行结果。main int a5= 5,10,-7,3,7 ,i; sorta,5; for i=0;i5;i+ printf%d ,ai;sortint x ,int n int j,t; for j=0;jxj+1 t=xj;xj=xj+1; xj+1=t; 结果:5 7 3 7 10【讨论】如何通过数组技术将一列数据中最大或最小的数移前或移后?4344六六、变量的存储类型、变量的存储类型l模块化设计要求研究不同模块函数、源文件

28、间变量的关系。l变量两大属性: 数据类型 存储类别1、数据类型复习 通过变量说明定义来规定其数据类型: 格式 数据类型关键字 变量名 如 char a; int b,c ; float x,y; 为什么使用变量前要先对其数据类型进展“说明好比看电影前先买票订座 预留存储空间如char型为1个字节,int型为2个字节 确定存储方式如char型存放ASCII值,int型存放补码值4445复习 数据存储形式 字符型按ASCII码存储,其余以补码存储 示意图 字符型 (字符a) 用一个字节存放该字符的ASCII值(ASCII值表见P374) 整 型 (十进制数25037) 用两个字节存放该数值的补码

29、实 型 尾数(补码) 指数(阶码) 注:第一位均为符号位0110000101100001 110011010110000110100010101010 11100110一个变量的数据类型定义后,就规定了该变量只能存储相应类型的数据。如定义int x,那么x只能存放整型数,假如x=3.14159,会被自动转为整型存放。4546六六、变量的存储类型、变量的存储类型l变量两大属性: 数据类型 存储类别2、存储类别 P115 规定了变量在计算机内部的存放位置决定变量的“寿命何时“生,何时“灭 一个完好的变量说明格式如下: 存储类别 数据类型 变量名 如 static int x , y ;C程序的存储

30、类别有: register型存放器型 auto型自动变量型 static型静态变量型 extern型外部变量型4647C C程序的变量存储位置程序的变量存储位置变量的生存期 静态存储区中的变量:与程序“共存亡 动态存储区中的变量:与函数“共存亡 存放器中的变量:同动态存储区4748C C程序的变量存储类别程序的变量存储类别变量的生存期 静态存储区中的变量 与程序“共存亡 动态存储区中的变量 与函数“共存亡 存放器中的变量 同动态存储区 register型存放器型型存放器型变量值存放在运算器的存放器中存取速度快,一般只允许23个,且限于char型和int型,通常用于循环变量在微机的Turbo C

31、中实际上自动转为auto型。 auto型自动变量型型自动变量型变量值存放在主存储器的动态存储区堆栈方式;优点同一内存区可被不同变量反复使用。以上两种变量均属于“动态存储型,即调用函数时才为这些变量分配单元,函数调用完毕其值自动消失。4849C C程序的变量存储类别程序的变量存储类别变量的生存期 静态存储区中的变量 与程序“共存亡 动态存储区中的变量 与函数“共存亡 存放器中的变量 同动态存储区 static型静态变量型型静态变量型变量值存放在主存储器的静态存储区程序执行开场至完毕,始终占用该存储空间 extern型外部变量型型外部变量型同上,其值可供其他源文件使用以上两种均属于“静态存储性质,

32、即从变量定义处开场,在整个程序执行期间其值都存在都可用!未说明存储类别时,函数内定义的变量默认为auto型函数外定义的变量默认为extern型。4950七、部分变量与全局变量七、部分变量与全局变量 P121 1、部分变量函数内部或复合语句内定义的变量 auto默认 所在函数调用完毕时,其值自动消失部分变量 register 如不赋初值,取不确定值为初值 static 所有函数调用完毕,其值仍保存 如不赋初值,取初值为0数值型或空格字符型 所有形参都是部分变量; 部分变量只在本函数或本复合语句内才能使用,在此之外不能使用视为不存在main函数也不例外。5051main int a=2,i; cl

33、rscr ; for i=0;i3;i+ printf%4d,fa;fint a int b=0; static int c=3; b+;c+; return a+b+c; 【例一】求程序运行结果变量跟踪 mainmain f f函数函数 a i a i b b f fa a 2 0 01 4 7 1 01 5 8 2 01 6 9 【结果】 7 8 9 假如去掉static呢?【结果】 7 7 75152main int k=4,m=1,p; clrscr; p=funck,m; printf%d,p; p=funck,m; printf%d,p;funcint a,int b static

34、 int m=0,i=2; i+=m+1; m=i+a+b; return m; 【例二】求程序运行结果变量跟踪 mainmain func func函数函数 k m a b m i 4 1 4 1 08 23 4 1 4 1 817 312 【结果】 8, 17 假如去掉static呢?【结果】 8, 85253#include main int a=3, b=2, c=1; int b=5, c=12; c-=b*2; printfa=%d,b=%d,c=%dn, a, b, c; a+=c; printfa=%d,b=%d,c=%dn, a, b, c;【例二】求程序运行结果【结果】 a

35、=3,b=5,c=2 a=5,b=2,c=1 5354七、部分变量与全局变量七、部分变量与全局变量 P121 2、全局变量在函数之外定义的变量 extern默认允许根源文件中其他函数及其他源文件使用 全局变量 static 只限根源文件中使用 所有全局变量加不加static,都属于静态存储,如不赋初值,取初值为0数值型或空格字符型注意与函数内部定义的static型部分变量的区别 54552 2、全局变量、全局变量在函数之外定义的变量在函数之外定义的变量l有效作用范围:从定义变量位置开场直到根源文件完毕l假如需要将全局变量的作用范围扩展至整个源文件 法1 全部在源文件开头处定义 法2 在引用函数

36、内,用extern说明 法3 在源文件开头处,用extern说明【例三】求程序运行结果extern int x,y; main clrscr; printfx=%d,y=%dn,x,y;int x=100,y=200;结果:x=100,y=200去掉第一行试试假如要将全局变量作用范围扩展到其他源文件,只需在使用这些变量的文件中对变量用extern加以说明。5556int a=3,b=5;maxint a,int b int c; c=ab?a:b; return c; main int a=8; printf%dn,maxa,b; 【例四】求程序运行结果假如主函数中没有int a=8,结果?

37、【结果】 5假如让主函数中int a=4或a=-1,结果? 【结果】 均为 55657void num extern int x,y; int a=15,b=10; x=a-b; y=a+b;int x,y;main int a=7,b=5; x=a+b; y=a-b; num; printf%d,%dn,x,y;【例五】求程序运行结果假如第二行不加上extern呢? 【结果】 5,25【结果】 12,2 5758int a;funint i a+=2*i; return a; main int a=10; clrscr ; printf%d,%dn,funa,a; 【例六】求程序运行结果【结

38、果】 20,10 5859七、编译预处理七、编译预处理l编译预处理: P127 宏定义 文件包含 条件编译 【编译】C编译系统对源程序进展:词法和语法分析,代码生成,优化 .OBJ文件【编译预处理】编译前对源程序进展一些预加工改善程序设计环境/模块化设计l编译预处理命令均以#开头,未尾不加分号l可出如今程序的任何位置,其作用范围:出现点至所在源程序未尾。5960八、编译预处理八、编译预处理1、宏定义 格式 #define 宏名 宏体 宏名和宏体均为字符串,前者必须符合标识符命名规那么。预处理时在程序中用宏体交换宏名。注意:可以用 #undef 宏名 终止该宏名的作用范围。 6061八、编译预处

39、理八、编译预处理定义符号常量【例一】#define M 3#define N M+1#define NN N*N/2main clrscr; printfNN=%d,NN; printf5*NN=%dn,5*NN;结果:NN=8,5*NN=40【讨论】 假如第二行改为: #define N M+1 结果: NN=6,5*NN=18 6162八、编译预处理八、编译预处理带参数的宏定义 格式 #define 宏名参数表 宏体【例二】#define PI 3.14159#define sr PI*r*rmain float a=1,sum; sum=sa; printfr=%.0f,s=%fn,a,

40、sum;结果:r=1,s=3.141590 6263八、编译预处理八、编译预处理带参数的宏定义 【例三】#define PT 5.5#define sA PT*A*Amain int a=1,b=2; printf%4.1fn,sa+b; 结果:9.5 【讨论】注意sa+b不是函数,它不做任何计算假如是函数,那么sa+b为s3,结果49.5 sa+b=5.51212=9.5 6364八、编译预处理八、编译预处理带参数的宏定义 【例四】选择正确答案#include stdio.h#define SUMy 1+ymain int x=2; printf%dn,SUM5*x; A 10 B 11 C 12 D 15结果:B 64652 2、文件包含、文件包含 P134l#include 标准方式 只按标准方式系统存放C库函数头文件所在目录查找所要包含的文件 对TC,默认只在tcinclude目录下查找l#include “ “ 先在源文件所在目录找指定头文件,假设无再按标准方式找更保险65663、条件编译、条件编译 l根据条件决定是否编译某一组语句。常用形式: 假如标识符被定义过* 假如标识符未被定义过 #ifdef 标识符 #ifndef 标识符 程序段1 程序段1 /*编译此程序段*/ #else #e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论