C语言预处理程序有什么作用

C语言预处理程序有什么作用,第1张

所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是c语言的一个重要功能,

它由预处理程序负责完成。当对一个源文件进行编译时,

系统把自动引用预处理程序对源程序中的预处理部分作处理,

处理完毕自动进入对源程序的编译。

c语言提供了多种预处理功能,如宏定义、文件包含、

条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、

移植和调试,也有利于模块化程序设计。

1、预处理

在这一阶段,源码中的所有预处理语句得到处理,例如:#include语句所包含的文件内容替换掉语句本身,所有已定义的宏被展开。

根据#ifdef,#if等语句的条件是否成立取舍相应的部分,预处理之后源码中不再包含任何预处理语句。

GCC预处理阶段可以生成i的文件,通过选项-E可以使编译器在预处理结束时就停止编译。例如:gcc -E -o helloi helloc

2、编译

这一阶段,编译器对源码进行词法分析、语法分析、优化等 *** 作,最后生成汇编代码。这是整个过程中最重要的一步,因此也常把整个过程称为编译。

可以通过选项-S使GCC在进行完编译后停止,生成s的汇编程序。例如:gcc -S -o hellos helloc

3、汇编

这一阶段使用汇编器对汇编代码进行处理,生成机器语言代码,保存在后缀为o的目标文件中。

当程序由多个代码文件构成时,每个文件都要先完成汇编工作,生成o目标文件后,才能进入下一步的链接工作。

目标文件已经是最终程序的某一部分了,只是在链接之前还不能执行。可以通过-c选项生成目标文件:gcc -c -o helloo helloc

4、链接

经过汇编以后的机器代码还不能直接运行。为了使 *** 作系统能够正确加载可执行文件,文件中必须包含固定格式的信息头,还必须与系统提供的启动代码链接起来才能正常运行,这些工作都是由链接器来完成的。gcc -o hello helloc

5、运行:执行EXE文件,得到运行结果。

减小误差。程序还原升温中要预处理是因为要减小误差,通过查询程序还原升温中信息,要预处理是因为要减小误差,程序升温还原(temperature-programmedreduction),是一种表征固体材料的技术,通常用于非均相催化领域以找到最有效的还原条件。

实验室预处理和实验 *** 作员区别是。

1、实验室预处理指的是在实验室中根据实验要求准备实验所需的一些基本设备,试剂和样本。它包括实验材料的准备,仪器的校准,仪器的 *** 作,精密仪器的维护等工作。

2、实验 *** 作员指的是根据实验要求,进行实验 *** 作, *** 作实验过程中所使用的仪器,设备和试剂,对实验结果进行记录和分析,并将实验结果反馈给实验室管理者。

大数据处理之道(预处理方法)

一:为什么要预处理数据?

(1)现实世界的数据是肮脏的(不完整,含噪声,不一致)

(2)没有高质量的数据,就没有高质量的挖掘结果(高质量的决策必须依赖于高质量的数据;数据仓库需要对高质量的数据进行一致地集成)

(3)原始数据中存在的问题:

不一致 —— 数据内含出现不一致情况

重复

不完整 —— 感兴趣的属性没有

含噪声 —— 数据中存在着错误、或异常(偏离期望值)的数据

高维度

二:数据预处理的方法

(1)数据清洗 —— 去噪声和无关数据

(2)数据集成 —— 将多个数据源中的数据结合起来存放在一个一致的数据存储中

(3)数据变换 —— 把原始数据转换成为适合数据挖掘的形式

(4)数据规约 —— 主要方法包括:数据立方体聚集,维度归约,数据压缩,数值归约,离散化和概念分层等。

(5)图说事实

三:数据选取参考原则

(1)尽可能富余属性名和属性值明确的含义

(2)统一多数据源的属性编码

(3)去除唯一属性

(4)去除重复属性

(5)去除可忽略字段

(6)合理选择关联字段

(7)进一步处理:

通过填补遗漏数据、消除异常数据、平滑噪声数据,以及纠正不一致数据,去掉数据中的噪音、填充空值、丢失值和处理不一致数据

四:用图说话,(我还是习惯用统计图说话)

结尾:计算机领域存在一条鄙视链的 ---- 学java的鄙视学C++的,有vim的鄙视用IDE的等等。

数据清洗的路子:刚拿到的数据 ----> 和数据提供者讨论咨询 -----> 数据分析(借助可视化工具)发现脏数据 ---->清洗脏数据(借助MATLAB或者Java/C++语言) ----->再次统计分析(Excel的data analysis不错的,最大小值,中位数,众数,平均值,方差等等,以及散点图) -----> 再次发现脏数据或者与实验无关的数据(去除) ----->最后实验分析 ----> 社会实例验证 ---->结束。

第十一章 预处理概述

在前面各章中,已多次使用过以“#”号开头的预处理命令。如包含命令# include,宏定义命令# define等。在源程序中这些命令都放在函数之外, 而且一般都放在源文件的前面,它们称为预处理部分。所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是C语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统将自动引用预处理程序对源程序中的预处理部分作处理, 处理完毕自动进入对源程序的编译。C语言提供了多种预处理功能,如宏定义、文件包含、 条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、 移植和调试,也有利于模块化程序设计。本章介绍常用的几种预处理功能。宏定义

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

无参宏的宏名后不带参数。其定义的一般形式为: #define 标识符 字符串 其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。 “标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。在前面介绍过的符号常量的定义就是一种无参宏定义。 此外,常对程序中反复使用的表达式进行宏定义。例如: # define M (yy+3y) 定义M表达式(yy+3y)。在编写源程序时,所有的(yy+3y)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(yy+3y)表达式去置换所有的宏名M,然后再进行编译。

#define M (yy+3y)

main(){

int s,y;

printf("input a number: ");

scanf("%d",&y);

s=3M+4M+5M;

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

}

上例程序中首先进行宏定义,定义M表达式(yy+3y),在s= 3M+4M+5 M中作了宏调用。在预处理时经宏展开后该语句变为:s=3(yy+3y)+4(yy+3y)+5(yy+3y);但要注意的是,在宏定义中表达式(yy+3y)两边的括号不能少。否则会发生错误。

当作以下定义后: #difine M yy+3y在宏展开时将得到下述语句: s=3yy+3y+4yy+3y+5yy+3y;这相当于; 3y�2+3y+4y�2+3y+5y�2+3y;显然与原题意要求不符。计算结果当然是错误的。 因此在作宏定义时必须十分注意。应保证在宏代换之后不发生错误。对于宏定义还要说明以下几点:1 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。2 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。3 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结 束。如要终止其作用域可使用# undef命令,例如: # define PI 314159

main()

{

……

}

# undef PIPI的作用域

f1()

表示PI只在main函数中有效,在f1中无效。

4 宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。

#define OK 100

main()

{

printf("OK");

printf("\n");

}

上例中定义宏名OK表示100,但在printf语句中OK被引号括起来,因此不作宏代换。程序的运行结果为:OK这表示把“OK”当字符串处理。5 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。例如: #define PI 31415926

#define S PIyy / PI是已定义的宏名/对语句: printf("%f",s);在宏代换后变为: printf("%f",31415926yy);6 习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。7 可用宏定义表示数据类型,使书写方便。例如: #define STU struct stu在程序中可用STU作变量说明: STU body[5],p;#define INTEGER int在程序中即可用INTEGER作整型变量说明: INTEGER a,b; 应注意用宏定义表示数据类型和用typedef定义数据说明符的区别。宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换, 而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。请看下面的例子: #define PIN1 inttypedef (int) PIN2;从形式上看这两者相似, 但在实际使用中却不相同。下面用PIN1,PIN2说明变量时就可以看出它们的区别: PIN1 a,b;在宏代换后变成 int a,b;表示a是指向整型的指针变量,而b是整型变量。然而:PIN2 a,b;表示a,b都是指向整型的指针变量。因为PIN2是一个类型说明符。由这个例子可见,宏定义虽然也可表示数据类型, 但毕竟是作字符

代换。在使用时要分外小心,以避出错。8 对“输出格式”作宏定义,可以减少书写麻烦。例93 中就采用了这种方法。

#define P printf

#define D "%d\n"

#define F "%f\n"

main(){

int a=5, c=8, e=11;

float b=38, d=97, f=2108;

P(D F,a,b);

P(D F,c,d);

P(D F,e,f);

}带参宏定义C语言允许宏带有参数。在宏定义中的参数称为形式参数, 在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开, 而且要用实参去代换形参。带参宏定义的一般形式为: #define 宏名(形参表) 字符串 在字符串中含有各个形参。带参宏调用的一般形式为: 宏名(实参表);

例如:

#define M(y) yy+3y /宏定义/

:

k=M(5); /宏调用/

: 在宏调用时,用实参5去代替形参y, 经预处理宏展开后的语句

为: k=55+35

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

main(){

int x,y,max;

printf("input two numbers: ");

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

max=MAX(x,y);

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

}

上例程序的第一行进行带参宏定义,用宏名MAX表示条件表达式(a>b)a:b,形参a,b均出现在条件表达式中。程序第七行max=MAX(x,

y)为宏调用,实参x,y,将代换形参a,b。宏展开后该语句为: max=(x>y)x:y;用于计算x,y中的大数。对于带参的宏定义有以下问题需要说明:1 带参宏定义中,宏名和形参表之间不能有空格出现。

例如把: #define MAX(a,b) (a>b)a:b写为: #define MAX (a,b) (a>b)a:b 将被认为是无参宏定义,宏名MAX代表字符串 (a,b)(a>b)a:b。

宏展开时,宏调用语句: max=MAX(x,y);将变为: max=(a,b)(a>b)a:b(x,y);这显然是错误的。2 在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值。要用它们去代换形参,因此必须作类型说明。这是与函数中的情况不同的。在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”。而在带参宏中,只是符号代换,不存在值传递的问题。3 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。

#define SQ(y) (y)(y)

main(){

int a,sq;

printf("input a number: ");

scanf("%d",&a);

sq=SQ(a+1);

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

}

上例中第一行为宏定义,形参为y。程序第七行宏调用中实参为a+1,是一个表达式,在宏展开时,用a+1代换y,再用(y)(y) 代换SQ,得到如下语句: sq=(a+1)(a+1); 这与函数的调用是不同的, 函数调用时要把实参表达式的值求出来再赋予形参。 而宏代换中对实参表达式不作计算直接地照原样代换。4 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。 在上例中的宏定义中(y)(y)表达式的y都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为以下形式:

#define SQ(y) yy

main(){

int a,sq;

printf("input a number: ");

scanf("%d",&a);

sq=SQ(a+1);

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

}

运行结果为:input a number:3

sq=7 同样输入3,但结果却是不一样的。问题在哪里呢 这是由于代换只作符号代换而不作其它处理而造成的。 宏代换后将得到以下语句: sq=a+1a+1; 由于a为3故sq的值为7。这显然与题意相违,因此参数两边的括号是不能少的。即使在参数两边加括号还是不够的,请看下面程序:

#define SQ(y) (y)(y)

main(){

int a,sq;

printf("input a number: ");

scanf("%d",&a);

sq=160/SQ(a+1);

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

}

本程序与前例相比,只把宏调用语句改为: sq=160/SQ(a+1); 运行本程序如输入值仍为3时,希望结果为10。但实际运行的结果如下:input a number:3sq=160为什么会得这样的结果呢分析宏调用语句,在宏代换之后变为: sq=160/(a+1)(a+1);a为3时,由于“/”和“”运算符优先级和结合性相同, 则先作160/(3+1)得40,再作40(3+1)最后得160。为了得到正确答案应在宏定义中的整个字符串外加括号, 程序修改如下

#define SQ(y) ((y)(y))

main(){

int a,sq;

printf("input a number: ");

scanf("%d",&a);

sq=160/SQ(a+1);

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

}

以上讨论说明,对于宏定义不仅应在参数两侧加括号, 也应在整个字符串外加括号。5 带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。main(){

int i=1;

while(i<=5)

printf("%d\n",SQ(i++));

}

SQ(int y)

{

return((y)(y));

}#define SQ(y) ((y)(y))

main(){

int i=1;

while(i<=5)

printf("%d\n",SQ(i++));

}

在上例中函数名为SQ,形参为Y,函数体表达式为((y)(y))。在例96中宏名为SQ,形参也为y,字符串表达式为(y)(y))。 两例是相同的。例96的函数调用为SQ(i++),例97的宏调用为SQ(i++),实参也是相同的。从输出结果来看,却大不相同。分析如下:在例96中,函数调用是把实参i值传给形参y后自增1。 然后输出函数值。因而要循环5次。输出1~5的平方值。而在例97中宏调用时,只作代换。SQ(i++)被代换为((i++)(i++))。在第一次循环时,由于i等于1,其计算过程为:表达式中前一个i初值为1,然后i自增1变为2,因此表达式中第2个i初值为2,两相乘的结果也为2,然后i值再自增1,得3。在第二次循环时,i值已有初值为3,因此表达式中前一个i为3,后一个i为4, 乘积为12,然后i再自增1变为5。进入第三次循环,由于i 值已为5,所以这将是最后一次循环。计算表达式的值为56等于30。i值再自增1变为6,不再满足循环条件,停止循环。从以上分析可以看出函数调用和宏调用二者在形式上相似, 在本质上是完全不同的。6 宏定义也可用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。看下面的例子。

#define SSSV(s1,s2,s3,v) s1=lw;s2=lh;s3=wh;v=wlh;

main(){

int l=3,w=4,h=5,sa,sb,sc,vv;

SSSV(sa,sb,sc,vv);

printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv);

}

程序第一行为宏定义,用宏名SSSV表示4个赋值语句,4 个形参分别为4个赋值符左部的变量。在宏调用时,把4 个语句展开并用实参代替形参。使计算结果送入实参之中。文件包含文件包含是C预处理程序的另一个重要功能。文件包含命令行的一般形式为: #include"文件名" 在前面我们已多次用此命令包含过库函数的头文件。例如:

#include"stdioh"

#include"mathh"

文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行, 从而把指定的文件和当前的源程序文件连成一个源文件。在程序设计中,文件包含是很有用的。 一个大的程序可以分为多个模块,由多个程序员分别编程。 有些公用的符号常量或宏定义等可单独组成一个文件, 在其它文件的开头用包含命令包含该文件即可使用。这样,可避免在每个文件开头都去书写那些公用量, 从而节省时间,并减少出错。对文件包含命令还要说明以下几点:

1 包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。例如以下写法都是允许的: #include"stdioh"#include<mathh> 但是这两种形式是有区别的:使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的), 而不在源文件目录去查找; 使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。 用户编程时可根据自己文件所在的目录来选择某一种命令形式。2 一个include命令只能指定一个被包含文件, 若有多个文件要包含,则需用多个include命令。3 文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。条件编译预处理程序提供了条件编译的功能。 可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。 这对于程序的移植和调试是很有用的。 条件编译有三种形式,下面分别介绍:

1 第一种形式:

#ifdef 标识符

程序段1

#else

程序段2

#endif

它的功能是,如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else可以没有, 即可以写为:

#ifdef 标识符

程序段 #endif

#define NUM ok

main(){

struct stu

{

int num;

char name;

char sex;

float score;

} ps;

ps=(struct stu)malloc(sizeof(struct stu));

ps->num=102;

ps->name="Zhang ping";

ps->sex='M';

ps->score=625;

#ifdef NUM

printf("Number=%d\nScore=%f\n",ps->num,ps->score);

#else

printf("Name=%s\nSex=%c\n",ps->name,ps->sex);

#endif

free(ps);

}

由于在程序的第16行插入了条件编译预处理命令, 因此要根据NUM是否被定义过来决定编译那一个printf语句。而在程序的第一行已对NUM作过宏定义,因此应对第一个printf语句作编译故运行结果是输出了学号和成绩。在程序的第一行宏定义中,定义NUM表示字符串OK,其实也可以为任何字符串,甚至不给出任何字符串,写为: #define NUM 也具有同样的意义。 只有取消程序的第一行才会去编译第二个printf语句。读者可上机试作。2 第二种形式:

#ifndef 标识符

程序段1

#else

程序段2

#endif

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

#if 常量表达式

程序段1

#else

程序段2

#endif

它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能

#define R 1

main(){

float c,r,s;

printf ("input a number: ");

scanf("%f",&c);

#if R

r=314159cc;

printf("area of round is: %f\n",r);

#else

s=cc;

printf("area of square is: %f\n",s);

#endif

}

本例中采用了第三种形式的条件编译。在程序第一行宏定义中,定义R为1,因此在条件编译时,常量表达式的值为真, 故计算并输出圆面积。上面介绍的条件编译当然也可以用条件语句来实现。 但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2, 生成的目标程序较短。如果条件选择的程序段很长, 采用条件编译的方法是十分必要的。

一、分离的基本方法

微生物分离的方法很多,主要有连续稀释分离法,平板划线分离法和单细胞分离法等方法。其中,单细胞分离法需要贵重精密仪器,中学无法开展,而连续稀释分离法和平板划线分离法却简便易行,中学完全具备开展条件。现将这两种方法说明如下。

1连续稀释分离法

①取1克土样,在火焰旁放入装有99毫克无菌水的锥形瓶内,充分摇匀,将菌分散。

②用移液管吸取上述菌悬液1毫升,放入盛有9毫升无菌水的试管中,并进一步稀释成1000倍,即10-3的菌悬液。按10倍稀释法连续稀释到10-8(每1次稀释,都须更换移液管)。

③取3支1毫升移液管分别从10-8、10-7、10-6菌悬液中吸取1毫升菌悬液,分别注入编号10-8、10-7和10-6的培养皿内,同一稀释液重复做3个培养皿。

④将温度为45~50℃的营养琼脂培养基(其成分和配制方法见本章第三节)倒入上述各培养皿内,轻轻旋转使菌悬液充分混合均匀,凝固后,将培养皿倒扣放置在温暖处(28℃左右),每天观察培养基表面有无微生物菌落。

⑤经过一定时间培养后,培养基上长出菌落,根据菌落特征,初步判断属于何种类型的微生物,并在显微镜下检查,若菌体形态一致,则可认为是初步分离到纯菌种。

⑥将分离培养所得的纯菌种,从平板培养基转移到试管斜面培养基上培养。

2平板划线分离法

①取1克土样,在火焰旁加进装有99毫升无菌水的锥形瓶中,堵塞棉塞,制成菌悬液待用。

②取一培养皿置于实验台上,左手将培养皿打开稍许,向培养皿内注入熔化的营养固体培养基10~12毫升,轻轻转动培养皿,使其中的培养基分布均匀,平放桌上,使其凝成平板。然后在皿底用蜡笔划分A、B、C、D几个区。应连续制作几份平板培养基。

③将培养皿底部用姆指和无名指固定成倾斜状态,在火焰旁将培养皿稍微打开。在此同时,用环状接种针在火焰旁取少许菌悬液,迅速送入培养皿内,在平板培养基的一边,作第1次平行划线 6~7条,转动培养皿约70°角,用烧过冷却的接种针,通过第1次划线部分作第2次平行划线,然后再用同样方法,作第3次平行划线。划线时,应使平板培养基表面向下,以免空气中杂菌落入。接种针应与平板表面成30°角左右。不要使接种针碰到培养皿边缘,也不要将培养基划破。

④将划线后的培养皿倒放在28℃左右的温暖处进行培养,待长出菌落后,鉴定微生物类群,并根据镜检结果,判断是否已分离到了纯菌种。如果菌种很纯,则可转移到斜面培养基上进一步培养。

连续稀释分离法和平板划线法,均须在无菌室或接种箱内进行。

二、各类微生物的分离

1从土壤中分离好气性及兼性厌气细菌

其分离方法见本节“分离的基本方法”

2从土壤中分离放线菌

①制作高氏一号培养基,趁热注入培养皿中,凝成平板,待用。

②称取土壤10克,放入装有100毫升无菌水的锥形瓶中,并加入10%酚10滴,以抑制细菌生长。振荡10分钟,制成10-1菌悬液。按照连续稀释分离法,进一步制成10-3菌悬液。

③用移液管吸取01毫升10-3菌悬液,注入平板培养基上,用无菌玻璃刮刀将菌悬液均匀涂抹在整个培养基上。然后将培养皿倒置于25~30℃温箱中,培养7~10天,培养基上会出现微生物菌落。如果菌落的硬度较大,干燥致密,且与基质紧密结合,不易被针挑起,这就是放线菌菌落。

④挑取放线菌菌落,接种于斜面培养基上。

3从土壤中分离霉菌

①制作豆芽汗葡萄糖培养基,并添加80%乳酸数滴,以抑制细菌生长。将培养皿中,凝成平板,待用。

②称取10克土壤,按上述分离放线菌的方法制成10-4或10-5的菌悬液。

③取01毫升菌悬液注入培养皿内培养基上,用玻璃刮刀涂抹均匀。然后将培养皿倒置于25~30℃温箱内培养3~4天。培养基上会出现微生物菌落。霉菌菌落常长成绒状、棉絮状或蜘蛛网状,可根据这一特征寻找霉菌菌落。

④挑取培养皿内的霉菌菌落接种于斜面培养基上。

4从饮水中分离大肠杆菌

①制作伊红美蓝培养基,趁热注入培养皿中,凝成平板,待用。

②用灭过菌的锥形瓶盛取河水或沟水,按1:10稀释。

③取01毫升稀释液接种于伊红美蓝培养基上。用平板划线分离法进行分离。

④将划线后的培养皿倒置37℃温箱中培养18~24小时。培养基中会出现大肠杆菌菌落,菌落中心呈暗蓝黑色,发金属光泽。

⑤将菌落接种于斜面培养基上(由营养琼脂培养基制成)。

以上就是关于C语言预处理程序有什么作用全部的内容,包括:C语言预处理程序有什么作用、C语言源程序到运行程序经过哪几个步骤、程序还原升温中为什么要预处理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10104806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存