已阅读5页,还剩71页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高级语言程序设计,第五章 模块化程序设计(函数) 集美大学计算机基础教研室 刘益玲 T,2,教学目的与要求 掌握函数的定义和调用 掌握函数参数的传递方式 领会变量存储类型的概念及各种存储型变量的生存期和有效范围 领会函数的嵌套调用与递归调用 了解带参数的main函数 重点与难点 函数定义、调用、声明等基本概念 函数的嵌套调用与递归调用 数组作为函数的参数 变量的存储类别与作用域 有参宏与无参宏的定义与应用 文件包含的基本概念,3,一、模块化设计与函数,把大型软件按照规定的原则划分成一个个较小的、相对独立但又相互关联的模块,叫做模块化设计。 1965年,G.A.Miller在他的著名文章“奇妙的数字72人类信息处理能力的限度”中指出,普通人分辨或记忆同一类信息的不同品种或等级的数量一般不超过59项。这表明,要使人的智力能足以管理好程序,应该坚持模块化设计。正如不分段的长篇文章可能使读者感到头痛一样,大型的单模块软件不仅可读性差,可靠性也常常难以保证。 C语言中,模块化设计的重要工具是“自定义函数”。,4,一、模块化设计与函数,【例一】输出任一两数中较大者 #include #include /*基本输入输出函数(clrscr getch等)*/ main( ) /*主调函数*/ int a,b,c; int max(int,int); /*函数原型*/ clrscr( ); printf(“Input a,b=“); scanf(“%d,%d“, ,int max(int x,int y) /*被调函数*/ int z; if (xy) z=x; else z=y; return z; ,5,一、模块化设计与函数,本章的学习首先要讨论 什么是函数? 为什么要使用函数? 函数有哪些类型? 如何自己定义一个函数? 如何调用一个函数? 函数学习的难点是什么?,6,一、模块化设计与函数,什么是函数? 为什么要使用函数? 函数有哪些类型? 如何自己定义一个函数? 如何调用一个函数? 函数学习的难点是什么?,什么是函数? 一个独立的程序模块,可以定义自己的变量(仅在本函数内有效),拥有自己的存储空间。可以被其他函数或自身调用(主函数除外)。,7,一、模块化设计与函数,什么是函数? 为什么要使用函数? 函数有哪些类型? 如何自己定义一个函数? 如何调用一个函数? 函数学习的难点是什么?,为什么要使用函数? 便于实现模块化设计 便于团队开发 便于使用现有的或别人的程序模块提高编程效能 在C程序设计中,通常: 将一个大程序分成几个子程序模块(自定义函数) 将常用功能做成标准模块(标准函数)放在函数库中供其他程序调用,如果把编程比做制造一台机器,函数就好比其零部件。 可将这些“零部件”单独设计、调试、测试好,用时拿出来装配,再总体调试。 这些“零部件”可以是自己设计制造/别人设计制造/现在的标准产品,8,一、模块化设计与函数,【例二】编写一个儿童算术能力测试软件,main() char ans = y; clrscr( ); cover( ); /*调用软件封面显示函数*/ password( ); /*调用密码检查函数*/ while (ans =y| ans =Y) question( ); /*调用产生题目函数*/ answers( ); /*调用接受回答函数*/ marks( ); /*调用评分函数*/ results( ); /*调用结果显示函数*/ printf(“是否继续练习?(Y/N)n”); ans=getch ( ); printf(“谢谢使用,再见!”); ,自定义函数,9,一、模块化设计与函数,【例二】编写一个儿童算术能力测试软件,main() char ans = y; clrscr( ); cover( ); /*调用软件封面显示函数*/ password( ); /*调用密码检查函数*/ while (ans =y| ans =Y) question( ); /*调用产生题目函数*/ answers( ); /*调用接受回答函数*/ marks( ); /*调用评分函数*/ results( ); /*调用结果显示函数*/ printf(“是否继续练习?(Y/N)n“); ans=getch ( ); printf(“谢谢使用,再见!“); ,/*定义所用函数*/ cover() /*软件封面显示函数*/ password() /*密码检查函数*/ question() /*产生题目函数*/ answers() /*接受回答函数*/ marks() /*评分函数*/ results() /*结果显示函数*/,这些函数现在不编程或还不会编程,可先放空。 可以多人合作,每人完成若干个函数(模块化)。 可在另一个源程序文件中定义。,Lets try,10,一、模块化设计与函数,什么是函数? 为什么要使用函数? 函数有哪些类型? 如何自己定义一个函数? 如何调用一个函数? 函数学习的难点是什么?,函数有哪些类型? 根据函数的来源,可分为: 库函数(标准函数) 由系统提供,编程时可直接使用之 自定义函数 由编程者自己编写,使用时要“先定义后使用” 根据使用的方式,可分为: 无参函数 有参函数(函数内需要使用主调函数中的数据),11,一、模块化设计与函数,什么是函数? 为什么要使用函数? 函数有哪些类型? 如何自己定义一个函数? 如何调用一个函数? 函数学习的难点是什么?,如何自己定义一个函数? (见后) 如何调用一个函数? (见后) 函数部分学习的难点是什么? 函数的概念 形参/实参/返回值的概念 递归算法 变量的作用域和生存期,12,一、模块化设计与函数,函数使用常识: 一个源文件由一个或多个函数组成,可为多个C程序公用。 C语言是以源文件为单位而不以函数为单位进行编译的。 一个C程序由一个或多个源(程序)文件组成可分别编写、编译和调试。 C程序执行总是从main函数开始,一般情况下调用其它函数后总是回到main函数,最后在 main函数中结束整个程序的运行。 所有函数都是平行的、互相独立的,即在一个函数内只能调用其他函数,不能再定义一个函数(嵌套定义)。 一个函数可以调用其他函数或其本身,但任何函数均不可调用main函数。,13,二、函数的定义,函数定义“制造自己的函数”。 P104 1、函数定义的一般形式 (参见例二) 函数返回值的数据类型 函数名(类型名 变量名1,类型名 变量名2,) 声明部分 处理语句 【注意】无形参表的即无参函数。无函数体的为“空函数”。如果函数返回值的数据类型为int,可以省略之。,类型标识符,形参表,14,二、函数的定义,把程序控制权从函数返回函数调用点有三种方法: 执行到函数结束的右花括号时(如果函数没有返回值); 执行到如下语句(如果函数没有返回值): return; 把返回值返回调用处(见例一) return 表达式; 形式: return (x); return (x+y); return (xy?x:y); 语句中圆括号亦可省略。,15,二、函数的定义,【注意】 如果函数值类型与return语句表达式值的类型不一致,以函数类型为准(数值型会自动进行类型转换)。 如果明确表示不需返回值,应使用void作函数返回值的数据类型,否则即使没有return语句,仍将带回一个不确定的值(见P107说明)。,16,三、函数的调用,1、库函数的调用 必须在源程序中用include命令将定义该库函数的头文件“包含进来”。 调用方式: 独立语句 执行某项操作,如 clrscr( ), printf(“Input a,b=”) 等 表达式中 作运算对象,如 a=sqrt(x)+pow(r,3),c=exp(a) 等,17,三、函数的调用,2、自定义函数 自定义函数和变量一样,在其主调函数中也必须“先声明,后使用”。 如例一中的 int max(int,int); /*函数原型*/ 例一中的自定义函数声明也可以用以下两种形式: int max(int x,int y); (多余,因为编译系统并不检查参数名) 或 int max( );(编译系统将不检查参数类型和参数个数) 以下情况时,被调函数在主调函数中可以不先声明: 被调函数的返回值为整型时函数值是整型(int)或字符型(char)时系统自动按整型说明; 被调函数的定义出现在主调函数之前时 在所有函数定义之前,在函数的外部已做了函数声明时 调用方式同库函数。,18,三、函数的调用,3、调用外部函数(其他源文件中定义的函数)时 函数说明语句 extern 函数名();,【例二】 文件file1.c中 main() int x=80,y=90,c; extern max(); /*函数说明*/ c=max(x,y)+20; /*调用max函数*/ printf(“Max is %dn”,c); ,文件files2.c中(与file1.c同目录) extern max(int a,int b) /*extern可省*/ float c; c=ab?a:b; return c; ,注: 要做一个 .prj文件才能运行。,19,三、函数的调用,main() f1=f(x1); f2=f(x2); x=root(x1,x2); 例 嵌套调用关系(简化),float f(float x) float xpoint(float x1,float x2) y= 调用f(x1)、f(x2) float root(float x1,float x2); y1=f(x1) x=xpoint(x1,x2) y=f(x) ,4、函数的嵌套调用,20,三、函数的调用,4、函数的嵌套调用,例8.6嵌套调用关系(示意图),21,例 模块划划分情况,main( ) 根据输入的x1,x2判断是否有根 若有,调用求根函数root( ) 输出结果,f(x) 根据所给x值,求 y=x3-5x2+16x-80 返回y值,即与x对应的f(x)值,xpoint( ) 根据所给x1,x2值 计算弦与x轴的交点,root(x1,x2 ) 根据所给x1,x2值 求近似根,22,四、函数的递归调用,1、递归的概念 直接递归调用 调用函数的过程中又调用该函数本身 间接递归调用 调用f1函数的过程中调用f2函数,而f2中又需要调用f1。 以上均为无终止递归调用。 为此,一般要用if语句来控制使递归过程到某一条件满足时结束。,23,四、函数的递归调用,2、递归算法 类似于数学证明中的反推法,从后一结果与前一结果的关系中寻找其规律性。 归纳法可以分为: 递推法 从初值出发,归纳出新值与旧值间直到最后值为止存在的关系。 要求通过分析得到: 初值+递推公式 编程:通过循环控制结构实现(循环的终值是最后值) 递归法 从结果出发,归纳出后一结果与前一结果直到初值为止存在的关系。 要求通过分析得到: 初值+递归函数 编程:设计一个函数(递归函数),这个函数不断使用下一级值调用自身,直到结果已知处选择控制结构。,24,四、函数的递归调用,2、递归算法,其一般形式是: 在主函数中用终值n调用递归函数,而在递归函数中: 递归函数名f(参数x) if (n=初值) 结果=; else 结果=含f(x-1)的表达式; 返回结果(return); ,f(x) f(x-1) ,main() f(n) ,f(x-1) f(x-2) ,f(x-2) f(x-3) ,f(x0) f(x0= ) ,25,【例一】 用递归法求n! 分析比较:,实际上,递归程序分两个阶段执行 回推(调用):欲求n! 先求 (n-1)! (n-2)! 1! 若1!已知,回推结束。 递推(回代):知道1!2!可求出3! n!,26,程序如下:,main() int n; float s; float fac(); clrscr(); printf(“Input n=“); scanf(“%d“, ,float fac(int x) int f; if (x=0|x=1) f=1; else f=fac(x-1)*x; return f; ,27,【例二】有5个人,第5个人说他比第4个人大2岁,第4个人说他对第3个人大2岁,第3个人说他对第2个人大2岁,第2个人说他比第1个人大2岁,第1个人说他10岁。求第5个人多少岁。 (P158例8.7),通过分析,设计递归函数如下: 10 (n=1) age(n)= age(n-1)+2 (n1),28,age(int n) int c; if (n=1) c=10; else c=age(n-1)+2; return c; main() clrscr( ); printf(“%d“,age(5); ,程序如下:,请看看单步运行的情况,29,age(5) c=age(4)+2; return c;,age(int n) int c; if (n=1) c=10; else c=age(n-1)+2; return c; ,递归过程 跟踪分析:,age(4) c=age(3)+2; return c;,age(3) c=age(2)+2; return c;,age(2) c=age(1)+2; return c;,age(1) c=10 return c;,c=10,c=12,c=14,c=16,c=18,30,【例三】在屏幕上显示杨辉三角形,1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ,31,递归函数 : 1 (y=1 或 y=x) c(x,y)= c(x-1,y-1)+c(x-1,y),程序如下: main() int i,j,n; clrscr( ); printf(“Input n=“); scanf(“%d“, ,1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ,int c(int x,int y) int z; if (y=1|y=x) return 1; else z=c(x-1,y-1)+c(x-1,y); return z; ,32,【例四】Fibonacci数列问题。,1 (n=1) 递归函数:fib(n)= 1 (n=2) fib(n-1)+fib(n-2) (n1),程序如下: fib (int n) int f; if (n=1|n=2) f=1; else f=fib(n-1)+fib(n-2); return (f); ,main() int i,s=0; clrscr( ); for (i=1;i=12;i+) s=s+fib(i); printf(“n=12,s=%d“,s); ,结果: n=12,s=376,33,【例五】运行下列程序,当输入字符序列AB$CDE并回车时,程序的输出结果是什么?,#include rev() char c; c=getchar(); if (c=$) printf(“%c“,c); else rev(); printf(“%c“,c); main() rev(); ,结果:$BA,rev() c=A rev( ) 输出A,rev() c=B rev( ) 输出B,rev() c=$ 输出$,34,【例六】反向输出一个整数(非数值问题),非数值问题的分析无法象数值问题那样能得出一个初值和递归函数式,但思路是相同的。 分析方法: 简化问题:设要输出的正整数只有一位,则“反向输出”问题可简化为输出一位整数。 对大于10的正整数,逻辑上可分为两部分:个位上的数字和个位以前的全部数字。将个位以前的全部数字看成一个整体,则为了反向输出这个大于10的正整数,可按以下步骤: a、输出个位上的数字; b、将个位除外的其他数字作为一个新的整数,重复a步骤的操作。 其中b问题只是对原问题在规模上进行了缩小递归。 所以,可将反向输出一个正整数x的算法归纳为: if (x为一位整数) 输出x; else 输出x的个位数字; 对剩余数字组成的新整数重复“反向输出”操作; ,35,程序如下: #include void main() void printn(int x); int n; printf(“Input n=“); scanf(“%d“, ,【例六】反向输出一个整数(非数值问题),/*反向输出整数x*/ void printn(int x) /*若x为一位整数*/ if (x=0 ,36,【例七】汉诺塔(Tower 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,c,b,a),37,五、数组作为函数参数,1、用数组元素作函数实参 P164 此时可把数组元素看作普通变量(单向的值传送)。 特点: 主调函数中的实参数组元素 (带下标) 被调函数中的形参普通变量 调用结果:形参值的变化对实参值无影响 (二者分占不同内存)。,38,【例一】以下程序的功能是什么?,#include main() int i; float sum=0,x10; float mean(float,int); clrscr(); for(i=0;i10;i+) printf(“请输入x%d=“,i); scanf(“%f“, ,float mean(float a, int i) if (a0) printf(“%f的平方根是:%fn“,a,sqrt(a); return sqrt(a); else printf(“x%d=%fn“,i,a); return 0.0; ,在主函数中输入10个数值,并调用功能函数求其正数的算术平方根之和。,39,什么是单向“值传送”方式?,40,五、数组作为函数参数,2、用数组名作函数实参 P165 若 int a6; 则数组名a表示数组的起始地址。 所以用数组名,实际上是把实参数组的起始地址“传给”形参数组。 本质:对应的数组元素(不是形参与实参)共享同一段内存单元(所谓“双向的地址传送”)。 特点: 主调函数中的实参数组名(不带下标) 被调函数中的形参数组名或数组定义式 调用结果:两数组同下标者为同值。,41,【例二】以下程序的运行结果是什么?,f(int 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=f(a,a3); printf(“%dn“,x); ,注意 1、形参数组和实参数组应分别在各自函数中定义; 2、形参数组可不定义大小(用空方格); 3、二者大小可一致或不一致(C编译程序不检查形参), 但注意引用形参时不要超过实参界。,结果:15,42,什么是双向的“地址传送”方式?,f(int 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=f(a,a3); printf(“%dn“,x); ,实质是共享同一段内存单元,43,【例三】分析以下程序的运行结果。,main() int a5= 5,10,-7,3,7 ,i; sort(a,5); for (i=0;ixj+1 ) t=xj;xj=xj+1; xj+1=t; ,结果:5 7 3 7 10,【讨论】如何通过数组技术将一列数据中最大或最小的数移前或移后?,44,六、变量的存储类型,模块化设计要求研究不同模块(函数、源文件)间变量的关系。 变量两大属性: 数据类型 存储类别,1、数据类型(复习) 通过变量说明(定义)来规定其数据类型: 格式 数据类型关键字 变量名 如 char a; int b,c ; float x,y; 为什么使用变量前要先对其数据类型进行“说明”好比看电影前先买票订座 预留存储空间(如char型为1个字节,int型为2个字节) 确定存储方式(如char型存放ASCII值,int型存放补码值),45,复习,数据存储形式 字符型按ASCII码存储,其余以补码存储,一个变量的数据类型定义后,就规定了该变量只能存储相应类型的数据。如定义int x,则x只能存放整型数,如果x=3.14159,会被自动转为整型存放。,46,六、变量的存储类型,变量两大属性: 数据类型 存储类别,2、存储类别 P115 规定了变量在计算机内部的存放位置决定变量的“寿命”(何时“生”,何时“灭”) 一个完整的变量说明格式如下: 存储类别 数据类型 变量名 如 static int x , y ; C程序的存储类别有: register型(寄存器型) auto型(自动变量型) static型(静态变量型) extern型(外部变量型),47,C程序的变量存储位置,变量的生存期 静态存储区中的变量:与程序“共存亡” 动态存储区中的变量:与函数“共存亡” 寄存器中的变量:同动态存储区,48,C程序的变量存储类别,变量的生存期 静态存储区中的变量 与程序“共存亡” 动态存储区中的变量 与函数“共存亡” 寄存器中的变量 同动态存储区, register型(寄存器型) 变量值存放在运算器的寄存器中存取速度快,一般只允许23个,且限于char型和int型,通常用于循环变量(在微机的Turbo C中实际上自动转为auto型)。 auto型(自动变量型) 变量值存放在主存储器的动态存储区(堆栈方式); 优点同一内存区可被不同变量反复使用。 以上两种变量均属于“动态存储型”,即调用函数时才为这些变量分配单元,函数调用结束其值自动消失。,49,C程序的变量存储类别,变量的生存期 静态存储区中的变量 与程序“共存亡” 动态存储区中的变量 与函数“共存亡” 寄存器中的变量 同动态存储区, static型(静态变量型) 变量值存放在主存储器的静态存储区 程序执行开始至结束,始终占用该存储空间 extern型(外部变量型) 同上,其值可供其他源文件使用 以上两种均属于“静态存储”性质,即从变量定义处开始,在整个程序执行期间其值都存在(都可用!),未说明存储类别时, 函数内定义的变量默认为auto型 函数外定义的变量默认为extern型。,50,七、局部变量与全局变量 P121,1、局部变量函数内部或复合语句内定义的变量,auto(默认) 所在函数调用结束时,其值自动消失 局部变量 register 如不赋初值,取不确定值为初值 static 所有函数调用结束,其值仍保留 如不赋初值,取初值为0(数值型)或空格(字符型),所有形参都是局部变量; 局部变量只在本函数或本复合语句内才能使用,在此之外不能使用(视为不存在)main函数也不例外。,51,main() int a=2,i; clrscr( ); for (i=0;i3;i+) printf(“%4d“,f(a); f(int a) int b=0; static int c=3; b+;c+; return a+b+c; ,【例一】求程序运行结果,变量跟踪 main( ) f函数 a i b c f(a) 2 0 01 4 7 1 01 5 8 2 01 6 9 【结果】 7 8 9,如果去掉static呢?,【结果】 7 7 7,52,main() int k=4,m=1,p; clrscr(); p=func(k,m); printf(“%d,“,p); p=func(k,m); printf(“%d“,p); func(int a,int b) static int m=0,i=2; i+=m+1; m=i+a+b; return m; ,【例二】求程序运行结果,变量跟踪 main( ) func函数 k m a b m i 4 1 4 1 08 23 4 1 4 1 817 312 【结果】 8, 17,如果去掉static呢?,【结果】 8, 8,53,#include main() int a=3, b=2, c=1; int b=5, c=12; c-=b*2; printf(“a=%d,b=%d,c=%dn“, a, b, c); a+=c; printf(“a=%d,b=%d,c=%dn“, a, b, c); ,【例二】求程序运行结果,【结果】 a=3,b=5,c=2 a=5,b=2,c=1,54,七、局部变量与全局变量 P121,2、全局变量在函数之外定义的变量,extern(默认)允许本源文件中其他函数及其他源文件使用 全局变量 static 只限本源文件中使用,所有全局变量加不加static,都属于静态存储,如不赋初值,取初值为0(数值型)或空格(字符型)(注意与函数内部定义的static型局部变量的区别),55,2、全局变量在函数之外定义的变量,有效作用范围:从定义变量位置开始直到本源文件结束 如果需要将全局变量的作用范围扩展至整个源文件 法1 全部在源文件开头处定义 法2 在引用函数内,用extern说明 法3 在源文件开头处,用extern说明,【例三】求程序运行结果 extern int x,y; main( ) clrscr(); printf(“x=%d,y=%dn“,x,y); int x=100,y=200;,结果:x=100,y=200,去掉第一行试试,如果要将全局变量作用范围扩展到其他源文件,只需在使用这些变量的文件中对变量用extern加以说明。,56,int a=3,b=5; max(int a,int b) int c; c=ab?a:b; return c; main() int a=8; printf(“%dn“,max(a,b); ,【例四】求程序运行结果,如果主函数中没有int a=8,结果?,【结果】 5,如果让主函数中int a=4或a=-1,结果?,【结果】 均为 5,57,void 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,58,int a; fun(int i) a+=2*i; return a; main() int a=10; clrscr( ); printf(“%d,%dn“,fun(a),a); ,【例六】求程序运行结果,【结果】 20,10,59,七、编译预处理,编译预处理: P127 宏定义 文件包含 条件编译 【编译】C编译系统对源程序进行:词法和语法分析,代码生成,优化 .OBJ文件 【编译预处理】编译前对源程序进行一些预加工(改善程序设计环境/模块化设计) 编译预处理命令均以#开头,未尾不加分号 可出现在程序的任何位置,其作用范围:出现点至所在源程序未尾。,60,八、编译预处理,1、宏定义 格式 #define 宏名 宏体 宏名和宏体均为字符串,前者必须符合标识符命名规则。预处理时在程序中用宏体替换宏名。 注意:可以用 #undef 宏名 终止该宏名的作用范围。,61,八、编译预处理,定义符号常量,【例一】 #define M 3 #define N (M+1) #define NN N*N/2 main() clrscr(); printf(“NN=%d,“,NN); printf(“5*NN=%dn“,5*NN); ,结果:NN=8,5*NN=40,【讨论】 如果第二行改为: #define N M+1,结果: NN=6,5*NN=18,62,八、编译预处理,带参数的宏定义 格式 #define 宏名(参数表) 宏体,【例二】 #define PI 3.14159 #define s(r) PI*r*r main() float a=1,sum; sum=s(a); printf(“r=%.0f,s=%fn“,a,sum); ,结果: r=1,s=3.141590,63,八、编译预处理,带参数的宏定义,【例三】 #define PT 5.5 #define s(A) PT*A*A main() int a=1,b=2; printf(“%4.1fn“,s(a+b); ,结果:9.5,【讨论】注意s(a+b)不是函数,它不做任何计算(如果是函数,则s(a+b)为s(3),结果49.5),s(a+b)=5.51212=9.5,64,八、编译预处理,带参数的宏定义,【例四】选择正确答案 #include “stdio.h“ #define SUM(y) 1+y main( ) int x=2; printf(“%dn“,SUM(5)*x); A) 10 B) 11 C) 12 D) 15,结果:B,65,2、文件包含 P134,#include 标准方式 只按标准方式(系统存放C库函数头文件所在目录)查找所要包含的文件 对TC,默认只在tcinclude目录下查找 #include “ “ 先在源文件所在目录找指定头文件,若无再按标准方式找(更保险),66,3、条件编译,根据条件决定是否编译某一组语句。常用形式:, 如果标识符被定义过* 如果标识符未被定义过 #ifdef 标识符 #ifndef 标识符 程序段1 程序段1 /*编译此程序段*/ #else #else /*#else部分可省略*/ 程序段2 程序段2 /*反之,编译此程序段*/ #endif #endif *此处指标识符用#define等命令定义过。,67,3、条件编译, #if 表达式 /*如果表达式为真*/ 程序段1 /*编译程序段1*/ #else 程序段2 /否则*编译程序段2*/ #endif,如果用: if 表达式 程序段1 else 程序段2,亦可实现以上功能,但程序段1,2均要编译。如果它们比较大,生成的exe文件就很大。,68,3、条件编译,【例一】 #define DEBUG 0 main() int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电力设计工作总结
- 如何做任务介绍
- 2025版胃炎常见症状及护理规范培训
- 金版教程2025年高考物理复习第4讲 功能关系 能量守恒定律
- 2025版冠心病常见症状及护理培训
- 电气工程及其自动化实习总结(5篇)
- 《2025年劳动合同范本》
- 我的营养之路
- 2025写字间租赁合同模板参考
- xx医院检验科室内质控月总结报告
- 两委换届知识培训材料课件
- 安全生产相关工作主要业绩及研究成果
- 2025广州铁路局集团有限公司招聘笔试考点考试题库和答案
- 2026届广东省珠海市文园中学七年级数学第一学期期末经典试题含解析
- 2025年中国拍立得行业市场全景分析及前景机遇研判报告
- 【生物】2025-2026学年人教版八年级生物上册期中考试复习测评试卷
- JJF(苏) 149-2024 黑体辐射源校准规范
- 产房医护协作要点
- 2025年公务员公开遴选笔试试题及答案(综合类)
- 2025年上半年中国零售地产与消费市场年度研究报告 China Retail Property Market Research Report
- TCAEPI11-2017固定污染源自动监控(监测)系统现场端建设技术规范
评论
0/150
提交评论