第十一章 预处理

第十一章 预处理
第十一章 预处理

第十一章预处理

1、 宏定义

预处理命令可以改变程序设计环境,提高编程效率,它们并不是 C 语言本身的组成部分,不能直接对 它们进行编译,必须在对程序进行编译之前,先对程序中这些特殊的命令进行“预处理” 。经过预处理后,程序就不再包括预处理命令了,最后再由编译程序对预处理之后的源程序进行编译处理,得到可供执行的 目标代码。C 语言提供的预处理功能有三种,分别为宏定义、文件包含和条件编译,下面将对它们进行简 单介绍。

宏定义 在 C 语言源程序中允许用一个标识符来表示一个字符串,称为“宏” ,被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。 宏定义是由源程序中的宏定义命令完成的,宏代换是由预处理程序自动完成的。在 C 语言中,宏分为 有参数和无参数两种。无参宏的宏名后不带参数,其定义的一般形式为:

#define 标识符 字符串;

其中“#”表示这是一条预处理命令(在 C 语言中凡是以“#”开头的均为预处理命令)“define”为宏定义命令,“标识符”为所定义的宏名, “字符串”可以是常数、表达式、格式串等。符号常量的定义就是一种无参宏定义。 此外,常常对程序中反复使用的表达式进行宏定义。例如:

1 #define M (y*y+3*y);

它的作用是指定标识符 M 来代替表达式(y*y+3*y)。

在编写源程序时, 所有的(y*y+3*y)都可由 M 代替, 而对源程序进行编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)表达式去置换所有的宏名 M,然后 再进行编译。

C 语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对于带 参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

带参宏定义的一般形式为:

#define 宏名(形参表) 字符串;

在字符串中含有各个形参。

带参宏调用的一般形式为:

宏名(实参表);

例如:

1 2 3 4 5 #define M(y) y*y+3*y

/*宏定义*/

......

k=M(5);

/*宏调用*/

......

在上面的宏调用时,用实参 5 去代替形参 y,经预处理宏展开后的语句为: k=5*5+3*5;

程序 2.26 给出了一个宏定义和调用的完整实例。

定义一个名为 MAX 的带参数的宏,可以通过它来选出参数 a 、b 中的较大值:test26.c 。

1 2 3 4 5 6 7 8 9 10 11 12 #include

#define MAX(a,b) (a>b)?a:b

/*带参数的宏定义*/

main()

{

intx,y,max;

printf("input two numbers: ");

scanf("%d %d",&x,&y);

max=MAX(x,y);

printf("max=%d\n",max);

/*宏调用*/

}

程序运行结果如下(□表示空格,↙表示回车)

:

1 2 input two numbers: 2009□2010↙

max=2010

可以看到,宏替换相当于实现了一个函数调用的功能,而事实上,与函数调用相比,宏调用更能提高

C 程序的执行效率。

2、文件包含

文件包含

文件包含是 C 预处理程序的另一个重要功能,文件包含命令行的一般形式为: #include "文件名"

或者

#include <文件名>

文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源

程序文件连成一个源文件。

在程序设计中,文件包含是很有用的。一个大的程序可以分为多个模块,由多个程序员分别编程,有

些公用的符号常量或宏定义等可单独组成一个文件,在其他文件的开头用包含命令包含该文件即可使用。

这样,可避免在每个文件开头都去书写那些公用量,从而节省时间,并减少出错。 这里对 C 语言的文件包含命令进行以下几点说明:

(1)包含命令中的文件名可以用双引号引起来,也可以用尖括号引起来。例如以下写法都是允许的:

1 2 #include "stdio.h"

#include

但是这两种形式是有区别的:使用尖括号表示在包含文件目录中去查找(包含目录是由系统的环境变 量进行设置的,一般为系统头文件的默认存放目录,比如 Linux 系统在/usr/include 目录下),而不在源文件的存放目录中查找; 使用双引号则表示首先在当前的源文件目录中查找, 若未找到才到包含目录中去查找。 用户编程时可根据自己文件所在的目录来选择某一种命令形式。

(2)一个 include 命令只能指定一个被包含文件,若有多个文件要包含,则需用多个 include 命令。

(3)文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。

3、条件编译

条件编译

预处理程序提供了条件编译的功能,可以按不同的条件去编译不同的程序部分,因而产生不同 的目标代码文件,这对于程序的移植和调试是很有用的。条件编译可分为三种形式。

第一种形式如下:

#ifdef 标识符

程序段 1

#else

程序段 2

#endif

它的功能是如果标识符已被 #define 命令定义过则对程序段 1 进行编译;否则对程序段 2 进行编译。

如果没有程序段 2(为空),本格式中的#else 可以没有,即可以写为:

#ifdef 标识符

程序段

#endif

第二种形式如下:

#ifndef 标识符

程序段 1 #else

程序段 2 #endif

与第一种形式的区别是将“ifdef”改为“ifndef”。它的功能是如果标识符未被#define 命令定义过则对程序段 1 进行编译,否则对程序段 2 进行编译。这与第一种形式的功能正好相反。

第三种形式如下:

#if 常量表达式

程序段 1 #else

程序段 2 #endif

它的功能是如果常量表达式的值为真(非 0),则对程序段 1 进行编译,否则对程序段 2 进行编译。

因此可以使程序在不同的条件下完成不同的功能。

4、其他与处理命令

#error 等其他常用预处理命令

除了上面介绍的之外,C 语言还有#erroe、#line、#pragma 等其他常用的预处理命令,在很多 C 语言的

程序中也是经常可见的。下面向读者简单介绍一下它们。

1. #error

#error 指令强制编译程序停止编译,它主要用于程序调试。#error 指令的一般形式是:

#error error-message

注意,宏串 error-message 不用双引号引起来。遇到#error 指令时,错误信息被显示,可能同时还显示

编译程序作者预先定义的其他内容。

2. #line

#line 指令改变__LINE__和__FILE__的内容。__LINE__和__FILE__都是编译程序中预定义的标识符。 __FILE__的内容是当前被编译源文件的文件名。

#line标识符__LINE__的内容是当前被编译代码行的行号,其一般形式是:

#line number “filename”

其中,number 是正整数并变成__LINE__的新值; 可选的“filename”是合法文件标识符并变成__FILE__的新值。#line 主要用于调试和特殊应用。

3. #pragma

#pragma 是编译程序实现时定义的指令,它允许由此向编译程序传入各种指令。

例如,一个编译程序可能具有支持跟踪程序执行的选项,此时可以用#pragma 语句选择该功能,编译程序忽略其不支持的#pragma 选项。使用#pragma 预处理命令可提高 C 源程序对编译程序的可移植性。

编译预处理

第九章编译预处理 9.1 选择题 【题9.1】以下叙述中不正确的是。 A)预处理命令行都必须以#号开始 B)在程序中凡是以#号开始的语句行都是预处理命令行 C)C程序在执行过程中对预处理命令行进行处理 D)以下是正确的宏定义 #define IBM_PC 【题9.2】以下叙述中正确的是。 A)在程序的一行上可以出现多个有效的预处理命令行 B)使用带参的宏时,参数的类型应与宏定义时的一致 C)宏替换不占用运行时间,只占编译时间 D)在以下定义中C R是称为“宏名”的标识符 #define C R 045 【题9.3】请读程序: #define ADD(x) x+x main() { int m=1,n=2,k=3; int sum=ADD(m+n)*k; printf(“sum=%d”,sum); } 上面程序的运行结果是。 A)sum=9 B)sum=10 C)sum=12 D)sum=18 【题9.4】以下程序的运行结果是。 #define MIN(x,y) (x)<(y)?(x):(y) main() { int i=10,j=15,k; k=10*MIN(i,j); printf(“%d\n”,k); } A)10 B)15 C)100 D)150 【题9.5】在宏定义#define PI 3.14159中,用宏名PI代替一个。 A)常量B)单精度数C)双精度数D)字符串

【题9.6】以下程序的运行结果是。 #include #define FUDGE(y) 2.84+y #define PR(a) printf(“%d”,(int)(a)) #define PRINT1(a) PR(a); putchar(‘\n’) main() { int x=2; PRINT1(FUDGE(5)*x); } A)11 B)12 C)13 D)15 【题9.7】以下有关宏替换的叙述不正确的是。 A)宏替换不占用运行时间B)宏名无类型 C)宏替换只是字符替换D)宏名必须用大写字母表示 【题9.8】C语言的编译系统对宏命令的处理是。 A)在程序运行时进行的 B)在程序连接时进行的 C)和C程序中的其它语句同时进行编译的 D)在对源程序中其它成份正式编译之前进行的 【题9.9】若有宏定义如下: #define X 5 #define Y X+1 #define Z Y*X/2 则执行以下printf语句后,输出结果是。 int a; a=Y; printf(“%d\n”,Z); printf(“%d\n”,--a); A)7 B)12 C)12 D)7 6 6 5 5 【题9.10】若有以下宏定义如下: #define N 2 #define Y(n) ((N+1)*n) 则执行语句z=2*(N+Y(5));后的结果是。 A)语句有错误B)z=34 C)z=70 D)z无定值 【题9.11】若有宏定义:#define MOD(x,y) x%y 则执行以下语句后的输出为。 int z,a=15,b=100; z=MOD(b,a); printf(“%d\n”,z++);

第三章 发酵液的预处理

第三章发酵液的预处理 教学基本要求: 1. 掌握预处理的概念。 2. 熟悉固液分离方法。 时间安排:3学时。 教学形式:本章以讲授为主,中间部分进行部分提问,采用PPT课件讲课。 教学内容: 通常发酵液和生物溶液是高粘度的和非牛顿流体,必须进行预处理。 一、预处理的目的: 1、改变发酵液的理化性质:(黏度、颗粒-、颗粒稳定性等),固液分离速度-,分离器分离效率-。 2、目标产物转移其中一相(多数为液相);。 3、去除发酵液中部分杂质,以利于后续各步操作。 二、预处理的方法 1、加热法:最简单和最廉价的处理方法。破坏凝胶结构、降低液体黏度、加速聚集。去蛋白。 2、调节悬浮液的PH值:方法简单有效、成本低廉。适当的PH值促进聚集。 3、凝聚和絮凝: 凝聚:破坏溶质胶体颗粒表面的双电层,破坏胶体系统的分散状态,使胶体粒子聚集的过程。大小:1mm大小。 絮凝:在絮凝剂高分子聚合电解质的作用下,胶体颗粒和聚合电解质交连成网,形成10 mm大小的絮凝团过程。絮凝剂主要起中和电荷、桥架和网络作用 凝聚剂种类: 无机盐类:Al2(SO4)3.18(H2O),AlCl3.6(H2O),FeCl3,ZnSO4,MgCO3 金属氧化物:Al(OH)3、Fe(OH)3、Ca(OH)2、石灰等。 聚合无机盐:聚合铝、聚合铁等。 絮凝剂种类: 阳离子型、阴离子型或非离子型 天然聚合物:多糖类物质、海藻酸钠、明胶等

人工合成聚合物:聚丙烯酰胺类衍生物、聚苯乙烯类衍生物、聚丙烯酸类等。 三、固液分离法 类型:过滤、离心、重力沉降、气悬浮 (一)过滤 1概念: 在一定的压力差下,将固液悬浮液通过一多孔性介质而实现固液分离的过程。 原理——筛分。 2、过滤介质 无定形颗粒:颗粒活性炭、沙、无烟煤 成形颗粒:烧结金属、烧结塑料 非金属织物:尼龙、玻璃纤维 金属织物:不锈钢丝网 无纺品:纸、石棉 3、助滤剂 一种颗粒均匀、质地坚硬的粒状物质,用于扩大过滤表面的适应范围,减轻细小颗粒的快速挤压变形和过滤介质的堵塞。 使用方法:A、预涂层;B、按一定比率混合。 常用的助滤剂:硅藻土、膨胀珍珠岩、石棉、纤维素、未活化的炭、炉渣、重质碳酸钙,及它们的混合物等。 3、过滤类型 常规过滤(死过滤)和错流过滤 死过滤:当进料液的流动方向和膜的压力方向在相同时,我们称之为死过滤;水质比较好的情况下可以采用死过滤,此时能耗低,回收率极高。 错流过滤:当进料液的流动方向和膜的压力方向垂直时,我们称之为错流过滤;因为错流过滤平行于膜表面有一个回流,这个回流会有效地冲走膜表面的污染物,所以错流过滤允许进料液中可以有一定量的不溶解固体,颗粒粒径〈100微米,条件比死过滤宽松的多。 错流过滤的过滤收率高,滤液质量较好,还可以减少处理步骤。 4、过滤设备的分类 根据推动力的不同可分为四类

C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)

C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等) 预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。 预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令: 指令用途 #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifdef如果宏已经定义,则编译下面代码 #ifndef如果宏没有定义,则编译下面代码 #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #endif结束一个#if……#else条件编译块 #error停止编译并显示错误信息 一、文件包含 #include预处理指令的作用是在指令处展开被包含的文件。包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。标准C编译器至少支持八重嵌套包含。 预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。例如: #defineAAA #include"t.c" #undefAAA #include"t.c" 为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。例如: /*my.h*/ #ifndefMY_H

第九章 编译预处理

第九章编译预处理 一、单选题 1.以下对宏替换的叙述不正确的是 A)宏替换只是字符的替换B)宏替换不占运行时间 C)宏名无类型,其参数也无类型 D)带参的宏替换在替换时,先求出实参表达式的值,然后代入形参运算求值2.宏定义#define PI 3.14中的宏名PI代替 A)一个单精度实数)B)一个双精度实数 C)一个字符串 D)不确定类型的数 3.有以下宏定义 #define k 2 #define X(k) ((k+1)*k) 当C程序中的语句y = 2 * (K + X(5));被执行后, A)y中的值不确定 B)y中的值为65 C)语句报错 D)y中的值为34 4.以下程序的输出结果是 #define MIN(x, y) (x) < (y) ? (x) : (y) main() { int i , j, k; i = 10; j = 15; k = 10 * MIN(i, j); printf(“%d\n”, k); }

A)15 B)100 C)10 D)150 5.以下程序中的for循环执行的次数是 #define N 2 #define M N + 1 #define NUM (M + 1) * M / 2 main() { int i; for(i = 1; i <= NUM; i++); pritnf(“%d\n”, i ); } A)5 B)6 C)8 D)9 6.以下程序的输出结果是 #include “stdio.h” #define FUDGF(y) 2.84 + y #define PR(a) printf(“%d”, (int) ( a ) ) #define PRINT1(a) PR(a); putchar(‘\n’) main() { int x = 2; PRINTF1(FUDGF(5) * X); } A)11 B)12 C)13 D)15 7.以下程序的输出结果是 #define FMT “%d,” main()

发酵液的预处理和过滤

第十二章发酵液的预处理和过滤 一、下游加工过程:通过微生物发酵过程、酶反应过程或动植物细胞大量培养获得的发酵液、反应液或培养液中分离、精制有关产品的过程称为下游加工过程(Down stream processing) 用适当的方法将含量较小的初级产物从反应液或细胞中初步提取出来,再进一步精制加工,得到合格产品的过程。 下游加工的重要性 ①发酵混合物产品:如啤酒、葡萄酒、各种发酵饮料等。只需经固--液分离和无菌处理即可。成本一般为10%左右。 ②小分子产品、非活性的大分子产品和细胞产品:即传统发酵工业产品,如乙醇、有机酸、氨基酸、抗生素、维生素、单细胞蛋白等。这类产品分离的投资占整个工厂投资的60%左右,生产成本占30%左右。 ③生物活性物质产品:如重组DNA(基因工程)产品、精制蛋白质产品。这类产品的分离与精制相当复杂,其下游加工过程的费用可占整个生产费用的80%-90%。 二、下游加工过程的特点 ①发酵液是复杂的多相系统: 含有细胞、代谢产物和残余培养基等,使得发酵液的固-液分离很困难。 ②目的产物在发酵液中的含量低:传统发酵一般为1%-10%,活性物质产品则为0.01%-1%,而杂质含量很高,基因工程法生产的蛋白质,杂蛋白。 ③产物收率低:由于起始浓度低,杂质多,而成品要求纯度高,因此常需好几步分离操作,其结果使产品的收率下降。 酶制剂收率一般为70%左右,精制收率不到50%; 基因工程产品,收率达30%-40%. ④产物易于失活: 遇热、极端pH、有机溶剂、某些金属离子等都会引起失活或分解,对于大分子的蛋白质产品,其活性还受剪切力的影响。 ⑤发酵过程不稳定: 在发酵培养过程中,由于生物的变异性大,各批发酵液中有效物质浓度,残余培养基等杂质含量,以及杂菌感染程度等不尽相同。 ⑥生物安全问题: 对于某些基因工程产品,应注意生物安全问题,即要防止菌体的扩散,特别对前几步操作,要求在密封环境下进行。 下游加工过程的一般流程 1、一般说来,下游加工过程可分为4个阶段:培养液(发酵液)的预处理和固液分离;初步纯化(提取);高度纯化(精制);成品加工。 第一节发酵液预处理 微生物发酵液的特性可归纳如下: ①发酵产物浓度较低,悬浮液中大部分是水; ②悬浮物颗粒小,密度与液体相差不大; ③固体粒子可压缩性大; ④液体黏度大,大多为非牛顿型流体; ⑤产物性质不稳定,遇热、极端pH、空气氧化、微生物污染、酶分解等作用会引起分解或失活。 发酵液预处理的措施:

C语言程序设计教案 第九章 编译预处理

第九章编译预处理 课题:第九章编译预处理 教学目的:1、了解预处理的概念及特点 2、掌握有参宏与无参宏的定义及使用,领会文件包含的使用及效果 教学重点:教学难点:掌握宏的使用,文件包含有参宏与无参宏的使用 步骤一复习引导 ANSI C标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。 这些预处理命令是由ANSI C统一规定的,但它不是C语言本身的组成部分,不能直接对它们进行编译。必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”,即根据预处理命令对程序作相应的处理。经过预处理后程序不再包括预处理命令了,最后再由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。 步骤二讲授新课 C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。C 提供的预处理功能主要有以下三种:宏定义、文件包含、条件编译。 分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“ #” 开头。 §9.1宏定义 宏:代表一个字符串的标识符。 宏名:被定义为“宏”的标识符。 宏代换(展开):在编译预处理时,对程序中所有出现的“宏名”,用宏定义中的字符串去代换的过程。 一、不带参数的宏定义 一般形式:#define 标识符字符串 #define PI 3.1415926 main() { float l, s, r, v; printf( “input radius:” ); scanf( “%f”, &r ); l = 2.0*PI*r; s = PI*r*r; v = 3.0/4*PI*r*r*r; printf(“%10.4f,%10.4f,%10.4\n”, l, s, v); }

C中的预处理命令

C中的预处理命令是由ANSIC统一规定的,但它不是C语言的本身组成部分,不能直接对它们进行编译,因为编译程序无法识别它们。必须对程序进行通常的编译(包括词法和语法分析,代码生成,优化等)之前,先对程序中这些特殊的命令进行“预处理”,例如:如果程序中用#include命令包含一个文件“stdio.h”,则在预处理时,将stdio.h文件中的实际内容代替该命令。经过预处理后的程序就像没有使用预处理的程序一样干净了,然后再由编译程序对它进行编译处理,得到可供执行的目标代码。现在的编译系统都包括了预处理,编译和连接部分,在进行编译时一气呵成。我们要记住的是预处理命令不是C语言的一部分,它是在程序编译前由预处理程序完成的。 C提供的预处理功能主要有三种:宏定义,文件包含,条件编译。它们的命令都以“#”开头。 一,宏定义:用一个指定的标识符来代表一个字符串,它的一般形式为: #define 标识符字符串 #define PI 3.1415926 我们把标识符称为“宏名”,在预编译时将宏名替换成字符串的过程称为“宏展开”,而#define 是宏定义命令。 几个应该注意的问题: 1,是用宏名代替一个字符串,也就是做简单的置换,不做正确性检查,如把上面例子中的1写为小写字母l,预编译程序是不会报错的,只有在正式编译是才显示出来。 2,宏定义不是C语句,不必在行未加分号,如果加了分号则会连分号一起置换。 3,#define语句出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束,通常#define命令写在文件开头,函数之前,作为文件的一部分,在此文件范围内有效。4,可以用#undef命令终止宏定义的作用域。如: #define PI 3.1415926 main(){ } #undef PI mysub(){ } 则在mysub中PI 不代表3.1415926。 5,在进行宏定义时,可以引用已定义的宏名,可以层层置换。 6,对程序中用双撇号括起来的字符串内的字符,即使与宏名相同,也不进行置换。 7,宏定义是专门用于预处理命令的一个专有名词,它与定义变量的含义不同,只做字符替换不做内存分配。 带参数的宏定义,不只进行简单的字符串替换,还进行参数替换。定义的一般形式为:#define 宏名(参数表)字符串 如:#define S(a,b) a*b,具体使用的时候是int area; area=(2,3); 对带参数的宏定义是这样展开置换的:在程序中如果有带参数的宏(如area=(2,3)),则按#define命令行中指定的字符串从左到右进行置换。如果串中包含宏中的形参(如a,b),则将程序语句中的相关参数(可以是常量,变量,或表达式)代替形参。如果宏定义中的字符串中的字符不是参数字符(如上*),则保留,这样就形成了置换的字符串。 带参数的宏与函数有许多相似之处,在调用函数时也是在函数名后的括号内写实参,也要求实参与形参的数目相等,但它们之间还有很大的不同,主要有: 1,函数调用时,先求出实参表达式的值,然后代入形参,而使用带参的宏只是进行简单的字符替换。

第9章 预处理命令

第9章预处理命令 宏定义不是C语句,所以不能在行尾加分号。如果加了分号则会连分号一起进行臵换。 可以用#undef命令终止宏定义的作用域。 对程序中用“”括起来的内容(即字符串内的字符),即使与宏名相同,也不进行臵换。宏定义只做字符替换,不分配内存空间。 宏名不是变量,不分配存储空间,也不能对其进行赋值。 在宏展开时,预处理程序仅对宏名作简单的字符串替换,不作任何检查。 在进行宏定义时,可以引用已定义的宏名 无参宏定义的一般格式: #define 标识符字符串 将这个标识符(名字)称为“宏名”,在用预编译时将宏名替换成字符串的过程称为“宏展开”。#define是宏定义命令。 带参宏定义的一般格式: #define 宏名(形参表)字符串 带参宏的调用和宏展开: 调用格式:宏名(实参表); 宏展开(又称为宏替换)的方法:用宏调用提供的实参直接臵换宏定义中相应的形参,非形参字符保持不变。 定义有参宏时,宏名与左圆括号之间不能留有空格。否则,C编译系统会将空格以后的所有字符均作为替代字符串,而将该宏视为无参宏。 有参宏的展开,只是将实参作为字符串,简单地臵换形参字符串,而不做任何语法检查。 为了避免出错,可以在所有形参外,甚至整个字符串外,均加上一对圆括号。 如: #define S(r) 3.14*(r)*(r) 则:area=S(a+b); 展开后为: area=3.14*(a+b)*(a+b); 调用有参函数时,是先求出实参的值,然后再复制一份给形参。而展开有参宏时,只是将实参简单地臵换形参。函数调用是在程序运行时处理的,为形参分配临时的内存单元;而宏展开则是在编译前进行的,在展开时不分配内存单元,不进行值的传递,也没有“返回值”的概念。调用函数只可得到一个返回值,而用宏可以设法得到几个结果。 在有参函数中,形参都是有类型的,所以要求实参的类型与其一致;而在有参宏中,形参和宏名都没有类型,只是一个简单的符号代表,因此,宏定义时,字符串可以是任何类型的数据。 使用宏次数多时,宏展开后源程序变长,因为每展开一次都是程序增长,而函数调用不会使源程序变长。 宏替换不占用运行时间,只占编译时间。而函数调用则占用运行时间(分配单元、保留现场、值传递、返回)。 在程序中如果有带实参的宏,则按#define命令行中指定的字符串从左到右进行臵换。如果字符串中包含宏中的形参,则将程序语句中相应的实参(可以是常量、变量或表达式)代替形参。如果宏定义中的字符串中的字符不是参数字符,则保留。

第八章 预处理命令

第八章预处理命令 一、选择题 1.C语言中,宏定义有效范围从定义处开始,到源文件结束处结束,但可以用 来提前解除宏定义的作用。(0级) A)# ifdef B)endif C)# undefine D)# undef 2.以下不正确的叙述是。(0级) A)预处理命令都必须以“#”号开始 B)在程序中凡是以“#”号开始的语句行都是预处理命令行 C)C语言在执行过程中对预处理命令行进行处理 D)# define ABCD是正确的宏定义 3.以下正确的叙述是。(0级) A)在程序的一行中可以出现多个有效的预处理命令行 B)使用带参宏时,参数的类型应与宏定义时的一致 C)宏替换不占用运行时间,只占编译时间 D)宏定义不能出现在函数内部 4.以下不正确的叙述是。(0级) A)宏替换不占用运行时间 B)宏名无类型 C)宏替换只是字符替换 D)宏名必须用大写字母表示 5. 以下正确的叙述是。(0级) A)C语言的预处理功能是指完成宏替换和包含文件的调用 B)预处理命令只能位于C源程序文件的首部 C)凡是C源程序中行首以“#”标识的控制行都是预处理命令 D)C语言的编译预处理就是对源程序进行初步的语法检查 6.在文件包含预处理语句(# include)的使用形式中,当之后的文件名用“”(双引号) 括起时,寻找被包含文件的方式是。(0级) A)直接按系统设定的标准方式搜索目录 B)先在源程序所在目录搜索,再按系统设定的标准方式搜索 C)仅仅搜索源程序所在目录 D)仅仅搜索当前目录 7.在文件包含预处理语句(# include)的使用形式中,当之后的文件名用<>(尖引号) 括起时,寻找被包含文件的方式是。(0级) A)直接按系统设定的标准方式搜索目录 B)先在源程序所在目录搜索,再按系统设定的标准方式搜索 C)仅仅搜索源程序所在目录 D)仅仅搜索当前目录 8.C语言的编译系统对宏命令的处理。(0级) A)在程序运行时进行的 B)在程序连接时进行的 C)和C程序中的其它语句同时进行编译的

发酵液预处理

一1.发酵液预处理 过程:对发酵液加热到所需温度使杂蛋白质变性凝固而沉淀分离.也可以用凝聚或絮凝的方法是小菌体,细胞,细胞的碎片以及杂蛋白质等胶体离子沉降去除. 2.发酵液的基本特性:产物浓度低.具有极性.粘度大.表面张力大.性质不稳定. 3.预处理的目的:①.改变发酵液的物理性质,促进从悬浮液中分离固形物的速度,提高固液分离器的效率②.尽可能使产物转入便于后处理的一相中(多数是液相) ③.去除发酵液中的部分杂质,以利于后续各步骤的操作. 4.发酵液预处理的方法:①加热②调节PH值③凝聚和絮凝④使用惰性助滤剂⑤使用反应剂 二固液分离 1.方法:①重力沉降②浮透(通气产生气泡,使固体附着在气泡表面除去,用于固液比重差小,直径5-30um颗粒的分离,污水处理.③旋液分离(霉菌和放线菌为丝状菌,体形较大,发酵液采用过滤的方法;细菌和酵母菌为单细胞,体形较小,其发酵液采用高速离心分离,如对发酵液采用预处理,也可用过滤进行固液分离.④介质过滤和离心,工业上比较常用. 2.过滤 ①澄清过滤:过滤介质为硅藻土,砂,塑料颗粒等,适合于固体含量少于0.1g/100ml,颗粒直径在5-100um的悬浮液的过滤分离如:河水,麦芽汁,酒类,饮料的澄清. ②滤饼过滤:过滤介质为滤布,包括天然或合成纤维织布,金属织布,玻璃纤维纸,合成纤维等无纺布,适合于固体含量大于0.1g/100ml的悬浮液的过滤分离 3常用过滤设备 ①转鼓真空过滤工艺 转鼓真空过滤机的转鼓过滤外壁覆盖有金属丝网,网上覆盖有滤布等过滤介质.转鼓内部区域分了若干独立的扇形区,各有不同的操作功能. 该设备主要适用范围:颗粒不太细,粘性不太大的液体.对于青霉素发酵老说,发酵液相对粘稠,因此发酵液质量的优劣,对转鼓处理速度有着明确的影响.转鼓过滤存在使用范围窄,处理能力低的问题.

c语言习题集合预处理命令

第六章预处理命令 6.1 选择题 1.下面叙述中正确的是()。 A. 带参数的宏定义中参数是没有类型的 B. 宏展开将占用程序的运行时间 C. 宏定义命令是C语言中的一种特殊语句 D. 使用#include命令包含的头文件必须以“.h”为后缀 2.下面叙述中正确的是()。 A. 宏定义是C语句,所以要在行末加分号 B. 可以使用#undef命令来终止宏定义的作用域 C. 在进行宏定义时,宏定义不能层层嵌套 D. 对程序中用双引号括起来的字符串内的字符,与宏名相同的要进行置换 3.在“文件包含”预处理语句中,当#include后面的文件名用双引号括起时,寻找被包含文件的方式为()。 A. 直接按系统设定的标准方式搜索目录 B.先在源程序所在目录搜索,若找不到,再按系统设定的标准方式搜索 C. 仅仅搜索源程序所在目录 D. 仅仅搜索当前目录 4.下面叙述中不正确的是()。 A. 函数调用时,先求出实参表达式,然后带入形参。而使用带参的宏只是进行简单的字符替 换 B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的, 在展开时也要分配内存单元,进行值传递 C. 对于函数中的实参和形参都要定义类型,二者的类型要求一致,而宏不存在类型问题,宏 没有类型 D. 调用函数只可得到一个返回值,而用宏可以设法得到几个结果 5.下面叙述中不正确的是()。 A. 使用宏的次数较多时,宏展开后源程序长度增长。而函数调用不会使源程序变长 B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的, 在展开时不分配内存单元,不进行值传递 C. 宏替换占用编译时间 D.函数调用占用编译时间 6.下面叙述中正确的是( )。 A. 可以把define和if定义为用户标识符 B.可以把define定义为用户标识符,但不能把if定义为用户标识符 C. 可以把if定义为用户标识符,但不能把define定义为用户标识符 D. define和if都不能定义为用户标识符 7.下面叙述中正确的是()。 A.#define和printf都是C语句 B.#define是C语句,而printf不是

C二级 第9章 编译预处理和动态存储分配

1.以下叙述中正确的是()。 A) 在C语言中,预处理命令行都以"#"开头 B) 预处理命令行必须位于C源程序的起始位置 C) #include 必须放在C程序的开头 D) C语言的预处理不能实现宏定义和条件编译的功能 参考答案:A 【解析】预处理命令是以"#"号开头的命令,它们不是C语言的可执行命令,这些命令应该在函数之外书写,一般在源文件的最前面书写,但不是必须在起始位置书写,所以B),C)错误。C)语言的预处理能够实现宏定义和条件编译等功能,所以D)错误。 2.以下关于宏的叙述中正确的是()。 A) 宏替换没有数据类型限制B) 宏定义必须位于源程序中所有语句之前 C) 宏名必须用大写字母表示D) 宏调用比函数调用耗费时间 参考答案:A 【解析】宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头,所以B)选项中宏定义必须位于源程序中所有语句之前是错误的。宏名一般用大写,但不是必须用大写,所以C)选项错误。宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值),所以D)选项错误。 3.有以下程序: #include #define PT 3.5 ; #define S(x) PT*x*x ; main() {int a=1,b=2;printf("%4.1f\n" ,S(a+b));} 程序运行后的输出结果是()。 A) 7.5 B) 31.5 C) 程序有错无输出结果D) 14.0 参考答案:C 【解析】宏定义不是C语句,末尾不需要有分号。所以语句printf("%4.1f\n" ,S(a+b));展开后为 printf("%4.1f\n" ,3.5;*a+b*a+b;);所以程序会出现语法错误。 4.若程序中有宏定义行: #define N 100 则以下叙述中正确的是 A) 宏定义行中定义了标识符N的值为整数100 B) 在编译程序对C源程序进行预处理时用100替换标识符N C) 上述宏定义行实现将100赋给标示符N D) 在运行时用100替换标识符N 参考答案:B 【解析】本题考查预编译相关知识,宏定义在编译程序时做了一个简单的替换,所以选项B正确。 5.有以下程序 #include #define N 3 void fun( int a[][N], int b[] ) { int i, j; for( i=0; i

预处理命令行

预处理命令行都必须以【1】号开始. 答案: ======(答案1)====== # 设有以下宏定义 # define WIDTH 80 # define LENGTH (WIDTH +40) 则执行赋值语句:v= LENGTH*20;(v为int型变量)后,v的值是【1】. 答案: ======(答案1)====== 2400 设有以下宏定义 # define WIDTH 80 # define LENGTH WIDTH +40 则执行赋值语句:v= LENGTH*20;(v为int型变量)后,v的值是【1】.80+40*20 答案: ======(答案1)====== 880 以下程序的运行结果是【1】. #include #define MIN(x,y) (x)

main() { inti=10,j=15,k ; k=10*MIN(i,j); printf("%d\n",k); } 答案: ======(答案1)====== 100 下列程序运行结果为: #define P 3 #define S(a) P*a*a main() {intar; ar=S(3+5);//3*3+5*3+5 printf("\n%d",ar); } #define宏都是直接替换的,不会计算后再替换。s(3+5) = p*3+5*3+5 = 9+15+5 =29 若想计算后在替换,需要加上括号: #define S(a) P*(a)*(a)

若有宏定义如下: #define X 5 #define Y X+1 #define Z Y*X/2 则执行以下printf语句后,输出结果是(). inta;a=Y; printf("%d ",Z); printf("%d\n",--a); A) 7 6 B) 12 6 C) 12 5 D) 7 5 答案:D 请读程序: #include

第九章编译预处理与带参数的主函数

第九章编译预处理与带参数的主函数 一、单项选择题 1.C程序中,以#号带头的行是预编译(A)。 A.命令 B.语句 C.函数 D.字符串 2.下列正确的预编译命令是(B)。 A.define PI 3.14159 B.#define p(a,b) strcpy(a,b) C. #include stdio.h D. # define PI3.14159 3.下列命令或语句中,正确的是(C)。 A.#define MYNAME= “ABC” B.#include stdio.h C. for(i=0;i<10;i++); D.struct int stu{int name}; 4.下列命令或语句中,正确的是(A)。 A.#define PI 3.14159 B. include “stdio.h” C.for(i=0,i<10,i++)a++ D.static struct {int i;}b={2}; 5.下列命令或语句中,错误的是(B)。 A. #define PI 3.14159 B.#include C.if(2); D.for(; ;) if(1) break; 6.定义带参数的宏计算两式乘积(如x2+3x-5与x-6),下列定义中哪个是正确的(C)。 A.#define muit(u,v)u*v B.#define muit(u,v)u*v; C.#define muit(u,v)(u)*(v) D.#define muit(u,v)=(u)*(v) 7.宏定义#define div(a,b) a/b的引用div(x+5,y-5)替换展开后是(A)。 A.x+5/y-5 B.x+5/y-5; C.(x+5)/(y-5) D.(x+5)/(y-5); 8.定义带参数的宏“#define jh(a,b,t)t=a;a=b;b=t”,使两个参数a、b的值交换,下列表述中哪个是正确的(D)。 A.不定义参数a和b将导致编译错误 B.不定义参数a、b、t将导致编译错误 C.不定义参数t将导致运行错误 D.不必定义参数a、b、t类型 9.设有宏定义#define AREA(a,b) a*b,则正确的“宏调用”是(D)。 A.s=AREA(r*r) B.s=AREA(x*y) C.s=AREA D.s=c*AREA((x+3.5),(y+4.1)) 10.设有以下宏定义,则执行语句z=2*(N+Y(5+1));后,z的值为(C)。 #define N 3 #define Y(n) ((N+1)*n) A.出错 B.42 C.48 D.54 11.设有以下宏定义,int x,m=5, n=1时,执行语句IFABC(m+n,m,x);后,x的值为(B)。 #define IFABC(a,b,c) c=a>b?a:b A.5 B.6 C.11 D.出错 12.以下程序中的for循环执行的次数是(C)。 #include “stdio.h” #define N 2 #define M N+1 # define NUM (M+1)*M/2 void main( ) { int i,n=0;

第九章 预处理

第九章预处理 A部分(本、专科必做) 一、选择题 以下不正确的叙述是(D) A、宏替换不占用运行时间。 B、宏名无类型。 C、宏替换只是字符替换。 D、宏名必须用大写字母表示。 C语言的编译系统对宏命令的处理(D) A、在程序运行时进行的。 B、在程序连接时进行。 C、和C程序中的其它语句同时进行编译的。 D、在对源程序中其它语句正式编译之前进行的。 3、以下程序的输出结果是(C)。 A、15 B、100 C、10 D、150 #define MIN(x,y) (x)<(y)?(x):(y) void main() { int I,j,k; i=10;j=15;k=10*MIN(i,j); printf(“%d\n”,k); } 4、以下叙述中正确的是(D) 用#include包含的文件的后缀必须是“.h”。 若一些源程序中包含某个头文件;当该文件有错时,只需对该头文件进行修改,包含此头文件的所有源程序不必重新进行编译。 宏命令行可以看作是一行C语句。 预处理是在编译之前进行的。 5、以下叙述中正确的是(C) A、源程序中所有的行都参加编译。 B、宏定义常量与const定义常量是一样的。 C、宏定义可以嵌套定义,即在宏定义中的字符串可以引用另一个宏定义的标识符。 D、以上都不正确。 二、填空题 以下程序中for 循环执行的次数是 6 。 #define N 2 #define M N+1 #define NUM (M+1)*M/2 void main() { int i; for(i=1;i<=NUM;i++); printf(“%d\n”,i); } 2、以下程序的输出结果是x=93 。 #define A 3 #define B(a) ((A+1)*a)

第九章改 预处理命令习题答案

第九章习题答案 一、单项选择题 1.A 2.B 3.C 4.D 5.B 6.C 7.A 8.D 9.D 10.C 11.B 12.C 13.D 14.C 二、填充题 1.编译处理编译预处理 2.非静态存储类型变量和外部函数 3.7 4.printf(“%d\n”,m); 5.fopen(“a.txt”,”rw”); 6.x[i]>=’A’&&x[i]<=’Z’ 7.“ i=%d\n” 8.(1) #define MAX(a,b,c) (2) #define MIN(a,b) (a=’0’&& c<=’9’) (4) #define isupper( c) (c>=’A’&& c<=’Z’) (5) #define islower( c) (c>=’a’ && c<=’z’) 三、程序分析题 1.运行结果: -3 2.运行结果: 7,47 3.运行结果:50 25 4.运行结果:x=9, y=5 5.运行结果:9 9 11 6.输出结果: x|y&z=3 x^y&~z=1 x&y&z=0 !x|x=1 ~x|x=-1

四、程序设计题 1.解: #include #include #define S(a, b, c) 0.5* (a+b+c) #define AREA(a, b, c) sqrt (S(a, b, c)*(S(a, b, c)-a)* (S(a, b, c )-b)* (S(a, b, c)-c)) void main ( ) { float a, b, c; printf (“输入三角形的三条边长:a, b, c\n”); scanf (“%f, %f, %f”, &a, &b, &c) ; if (( a+b>c)&& (b+c>a) && (c+a>b)) { printf (“周长=%f\n”, 2*S(a, b, c )); printf (“面积=%f\n”, AREA(a, b, c )); } else printf (“a, b, c 的长度不能构成三角形\n”) ; } 2.解: #include #include void main (int argc, char *argv[ ]) { int a, b; if (argc<3) { printf (“Parameter missing!\n”) ; exit(0); } a=atoi (argv[1]) ; b=atoi (argv[2]) ; //在stdlib.h中有库函数atoi, 把字符串转换成整数 printf (“%5d + %5d = %5d\n”, a, b, a+b) ; printf (“%5d - %5d = %5d\n”, a, b, a-b) ; printf (“%5d * %5d = %5d\n”, a, b, a*b) ; printf (“%5d / %5d = %5d\n”, a, b, a/b) ; printf (“%5d %% %5d = %5d\n”, a, b, a%b) ; } 3.解: #include #include void main (int argc, char *argv[]) { int i, sum=0; for (i=1; i #include #include

发酵液的预处理

发酵液的预处理 1 加水稀释法和加热法 加水稀释法能降低液体粘度,但会增加悬浮液的体积,加大后继过程的处理任务。而且,单从过滤操作看,稀释后过滤速率提高的百分比必须大于加水比才能认为有效,即若加水一倍,则稀释后液体的粘度必须下 降50%以上才能有效提高过滤速率。 加热是发酵液预处理最简单最常用的方法。加热可有效降低液体粘度,提高过滤速率。同时,在适当温度和受热时间下可使蛋白质凝聚,形成较大颗粒的凝聚物,进一步改善了发酵液的过滤特性。 对于粘度较高的发酵液,稀释或者加热可以降低发酵液黏度,有利于输送和过滤等后续操作。 2 离心法 国内在这方面的报道,主要反映了高速离心能耗大、设备昂贵,因而得不到推广应用。国内有些厂家仿效国外的做法, 采用高速蝶片式喷嘴离心机分离菌体, 虽对谷氨酸菌体的除去有一定效果, 但对菌丝较轻细的 肌苷菌体至今未取得满意的结果且设备价格昂贵。 3 絮凝和凝聚及混凝方法 絮凝预处理能显著加快发酵液中固体颗粒的沉降,提高过滤速度。李凡锋等处理1,3-丙二醇发酵液后,其中絮凝样的滤饼湿基、干基重量分别比对照样增加了41.13%、51.88%。 江龙法等采用壳聚糖作为絮凝剂对L - 乳酸发酵液进行预处理,取得了较好的结果。 江龙法等用壳聚糖作絮凝剂处理谷氨酸发酵液,经处理后的发酵液菌体减少95 %以上,谷氨酸浓度没有

降低。 周荣清等的研究证明:透明质酸发酵液经絮凝预处理后,不仅可以大大改善发酵液的固液分离效果,同时其滤清液的纯度亦有一定幅度的提高,在超滤过程中污染程度明显减少,渗透通量增加。 4 调节PH值 调节pH值可以改善发酵液吸附性质和使蛋白变性。对于加入离子型絮凝剂的发酵液,调节pH可改变絮凝剂的电离度,从而改变分子链的伸展状态。郝健等[7]的研究表明,pH越低,相同操作电压下工作电流越大,脱盐操作时间也越短,发酵液初始pH 调至6 左右为宜。 李向平等以壳聚糖为絮凝剂进行了单因素絮凝实验,结果表明pH值和絮凝剂用量对絮凝效果影响很大。 5 加入助滤剂 助滤剂是一种不可压缩的多孔微粒,它能使滤饼疏松,吸附胶体,扩大过滤面积,滤速增大。助滤剂的添加可以改善发酵液过滤性质。助滤剂作为胶体粒子的载体,均匀地分布于滤饼层中,相应地改变了滤饼结 构,降低了滤饼的可压缩性,也就减小了过滤阻力。 王晓静等针对絮凝预处理后过滤速率慢的问题,采用添加助滤剂的方法。以粗、细2种粒度的硅藻土进行掺浆法实验,即把助滤剂直接投到悬浮液中,目的是增大滤饼的孔隙,使液相能够快速流出。 6 加入反应剂 改善过滤性能较好的方法是加入一些反应剂,它们能相互作用,或和某些溶解性盐类发生反应生成不溶解的沉淀。生成的沉淀能防止菌丝体粘结,使菌丝具有块状结构,沉淀本身即可作为助滤剂,并且还能使胶

发酵液预处理解析

第三章发酵液预处理

从微生物发液中提取发酵产品的第一步骤就是预处理,其目的的不仅在于分离菌体和其他悬浮液的性质,以利 用于提取和精制后断各工序的顺利进行。各种发酵产品,由于菌种不同和发酵液特性不同,其预处理方法的选择 也有所不同。大多数发酵产物存在于发酵液中,也有少 数产物存在于菌体中,或发酵液和菌体中都有含有。 –对于胞外产物,经预处理应尽可能使目的产物转移到液相,然后经固液分离除去固相; –对于胞内产物,则首先收集菌体或细胞,经细胞破碎后,目的产物进入液相,随后再将细胞碎片分离。

第一节发酵液过滤特性改变 微生物发酵液的特性可归纳为: ?发酵产物浓度较低,大多为1%~10%,悬浮液中大部分是水; ?悬浮物颗粒小,相对密度与液相相差不大: ?固体粒子可压缩性大; ?液相粘度大,大多为非牛顿型流体; ?性质不稳定,随时间变化,如易受空气氧化、微生物污染、蛋白酶水解等作用的影响。

一、降低液体粘度 降低液体粘度的常用方法有加水稀释法和加热法等。 采用加水稀释虽然降低液体粘度,但会增加悬浮液的体积,加大后继过程的处理任务。若加水一倍,则稀释后液体的粘度必须下降50%以上才能有效提高过滤速率。 升高温度可有效降低液体粘度,提高过滤速率,如 12oBe 麦芽汁40℃时粘度为1.2×10-3Pa·s,升高到75℃其粘度可下降一半,过滤速率可加倍。同时,在适当温度和受热时间可使蛋白质凝聚,形成较大颗粒的凝聚物,进一步改善了发酵液的过滤特性。如链霉素发酵液,调酸至pH3.0后。加热至70℃,维持半小时,液相粘度下降至1/6,过滤速率可增大10~100倍。使用加热时必须严格控制加热温度与时间。

相关文档
最新文档