版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第 十十 一一 章章结结 构构 体体位位 段段2例:例:描述一个学生的姓名、学号、性别、年龄。描述一个学生的姓名、学号、性别、年龄。每个学生都有这样的属性,它们构成一个描述学生具体情况的一个每个学生都有这样的属性,它们构成一个描述学生具体情况的一个整体。而每个属性又是一个基本的类型,本例中可分别用字符数组整体。而每个属性又是一个基本的类型,本例中可分别用字符数组、长整型、字符型、和整型来描述。、长整型、字符型、和整型来描述。一、结构体类型的定义一、结构体类型的定义结构体概念的引入结构体概念的引入数据的描述:数据的描述:基本类型基本类型:整型、实型、字符型。:整型、实型、字符型。数组数组:属
2、于同一种类型的元素的集合。:属于同一种类型的元素的集合。有时,需要用不同的数据类型来描述一个事物的各方面属性,有时,需要用不同的数据类型来描述一个事物的各方面属性,故此,故此,C语言引入了语言引入了结构体结构体的概念。的概念。3structstruct 结构体类型名结构体类型名 类型标识符类型标识符 成员名成员名1 1; 类型标识符类型标识符 成员名成员名2 2; 类型标识符类型标识符 成员名成员名n n;;结构体类型的定义结构体类型的定义如:如:structstruct student student char name10; char name10; long id; long id; c
3、har gender; char gender; int int age; age;注意:注意: structstruct student student 应作为一个类型整体,应作为一个类型整体, name10name10、idid、gendergender、ageage都是其成员。都是其成员。 structstruct及花括号后的及花括号后的“;”不能省。不能省。4定义结构体类型,定义结构体类型, 描述下列数据描述下列数据 structstruct student student int int no no; / /* *学号学号* */ / char namechar name1010;
4、/ /* *姓名姓名* */ / char sexchar sex; / /* *性别性别* */ / intint age age; / /* *年龄年龄* */ / float score10float score10; / /* *成绩成绩* */ / ;结构体类型的举例结构体类型的举例(1) (1) 学生情况学生情况: : 包含学生的学号、包含学生的学号、 姓名、姓名、 性别、性别、 年龄、年龄、1010门课程成绩:门课程成绩:5 (2) (2) 个人数据个人数据: : 包含姓名、性别、年龄、身高、体重、住址包含姓名、性别、年龄、身高、体重、住址: : structstruct per
5、son person char name char name2020; / /* *姓名姓名* */ / char sexchar sex; / /* *性别性别* */ / intint age age; / /* *年龄年龄* */ / float heightfloat height; / /* *身高身高* */ / float weightfloat weight; / /* *体重体重* */ / char addrchar addr5050; / /* *住址住址* */ / ; 6(3) (3) 平面上的点平面上的点: : structstruct point2 point2
6、float x float x; / /* *横坐标横坐标* */ / float yfloat y; / /* *纵坐标纵坐标* */ / ;如考虑空间中的点,如考虑空间中的点, 可作如下定义:可作如下定义:structstruct point3 point3 float x float x; / /* *X X坐标坐标* */ / float yfloat y; / /* *Y Y坐标坐标* */ / float zfloat z; / /* *Z Z坐标坐标* */ / ; 7(4) (4) 日期,包括年、月、日日期,包括年、月、日:如职工信息结构体类型为:如职工信息结构体类型为:str
7、uctstruct person person char name20; /char name20; /* *姓名姓名* */ /char address40; /char address40; /* *地址地址* */ /float salary; /float salary; /* *工资工资* */ /float cost; /float cost; /* *扣款扣款* */ /struct date hiredatestruct date hiredate; /; /* *聘任日期聘任日期* */ /; ; 结构体类型可以嵌套定义结构体类型可以嵌套定义 即即一个结构体类型中的某些成员一
8、个结构体类型中的某些成员又是其他结构体类型又是其他结构体类型structstruct date date int int year year; / /* *年年* */ / intint month month;/ /* *月月* */ / intint day day; / /* *日日* */ / ;注意注意8例如,对已定义的结构体类型例如,对已定义的结构体类型structstruct student student ,可以定义结构体,可以定义结构体变量:变量: struct student zhangstruct student zhang ,stu1 ,stu1; structstru
9、ct person p50 person p50; / /* *5050个职工人的数据个职工人的数据* */ /二、结构体变量二、结构体变量结构体变量的定义结构体变量的定义1.1.先定义结构体类型,先定义结构体类型, 再定义结构体变量再定义结构体变量格式:格式: structstruct 结构体名结构体名 结构体变量名表;结构体变量名表;三种方法:三种方法:92.2.在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量例如:例如:structstruct student student char name10; char name10; char sex; char sex; int
10、int age; age; float score; float score; stu1,stu2; stu1,stu2;格式:格式: structstruct 结构体类型名结构体类型名 类型标识符类型标识符 成员名成员名1 1; 类型标识符类型标识符 成员名成员名2 2; 类型标识符类型标识符 成员名成员名n n; 变量名表变量名表; ;103. 3. 用匿名形式直接定义结构体类型变量(不出现结构体名)用匿名形式直接定义结构体类型变量(不出现结构体名)例如:例如:structstruct char name10; char name10; char sex; char sex; int in
11、t age; age; float score; float score; stu1,stu2; stu1,stu2;格式:格式:structstruct 类型标示符类型标示符 成员名成员名1 1; 类型标示符类型标示符 成员名成员名2 2; 类型标示符类型标示符 成员名成员名n n; 变量名表变量名表; ;(1 1)类型与变量是不同的概念,不要混同。对结构体变量来说,在定)类型与变量是不同的概念,不要混同。对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存
12、取或运算。在编译时,赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配存储空间的,只对变量分配存储空间。对类型是不分配存储空间的,只对变量分配存储空间。(2 2)对结构体中的成员,可以单独使用,它的作用相当于普通变量。)对结构体中的成员,可以单独使用,它的作用相当于普通变量。(3 3)成员也可以是一个结构体变量。)成员也可以是一个结构体变量。(4 4)成员名可与程序中的变量同名,两者不代表同一对象。)成员名可与程序中的变量同名,两者不代表同一对象。 结构体的说明结构体的说明11例。定义结构体变量例。定义结构体变量stu1: stu1: struct struct st
13、udent stu1; student stu1; stu1.age=20; stu1.age=20; scanf(%f,&stu1.score); scanf(%f,&stu1.score);stu1.age stu1.age 表示引用结构体变量表示引用结构体变量stu1stu1中的中的ageage成员,因该成员的类型成员,因该成员的类型为为intint型,所以可以对它执行任何型,所以可以对它执行任何intint型变量可以执行的运算。型变量可以执行的运算。结构体变量的使用结构体变量的使用结构体变量一般不整体引用,而是引用其成员变量。结构体变量一般不整体引用,而是引用其成员变量
14、。成员变量引用格式成员变量引用格式结构体变量名结构体变量名. .成员名成员名其中的圆点运算符称为成员运算符,它的运算级别是最高的。其中的圆点运算符称为成员运算符,它的运算级别是最高的。12(1) (1) 结构体类型变量的各成员(分量)必须结构体类型变量的各成员(分量)必须单独引用单独引用, ,成员成员运算符运算符“”具有最高优先级。具有最高优先级。(2) (2) 不允许对结构体变量进行整体的输入输出不允许对结构体变量进行整体的输入输出 如:如:scanf(“%s%c%d%f”,&stu1); scanf(“%s%c%d%f”,&stu1); (3) (3) 如果结构体变量类型相
15、同,可以互相赋值。如果结构体变量类型相同,可以互相赋值。 stu1=stu2stu1=stu2; ; (4) (4) 严格区分类型与变量的概念。严格区分类型与变量的概念。 (5) (5) 如果结构体成员本身又是结构体类型的,则可继续使如果结构体成员本身又是结构体类型的,则可继续使用成员运算符取结构体成员的结构体成员,逐级向下,引用成员运算符取结构体成员的结构体成员,逐级向下,引用最低一级的成员。用最低一级的成员。程序只能对最低一级的成员进行运算程序只能对最低一级的成员进行运算。例如,对。例如,对stu1stu1某些成员的访问:某些成员的访问: stu1.birthday.day=23stu1.
16、birthday.day=23; stu1.birthday.month=8stu1.birthday.month=8; stu1.birthday.year=1985stu1.birthday.year=1985; 13结构体变量的初始化结构体变量的初始化结构体变量可以在定义时初始化。结构体变量可以在定义时初始化。格式格式structstruct 结构体名结构体名 成员表;成员表; 结构体变量结构体变量=初始化数据表初始化数据表 ;例例 structstruct student student char name10; char name10; char sex; char sex; int
17、 int age; age; float score; float score; stu1,stu2=“Wangwu”,m,20,88. stu1,stu2=“Wangwu”,m,20,88.5;5;14stru110001010101110131017name10sexagescore结构体变量存储分配结构体变量存储分配15例例 11.1 11.1 求某同学上学期求某同学上学期6 6门课程的总成绩与平门课程的总成绩与平均成绩。均成绩。 思路分析:思路分析:可以先构建一个结构体,包含学生的姓可以先构建一个结构体,包含学生的姓名、六门课的成绩、以及总成绩及平均名、六门课的成绩、以及总成绩及平均成
18、绩。成绩。 structstruct student student char name char name1010; float scorefloat score6 6; float totalfloat total, averageaverage; ;然后在程序中输入姓名及各科成绩后即然后在程序中输入姓名及各科成绩后即可进行运算,运算结果存放到可进行运算,运算结果存放到totaltotal和和averageaverage两个成员变量中。两个成员变量中。16mainmain( ) int int i i; structstruct student student char name char
19、 name1010; float scorefloat score6 6; float totalfloat total, averageaverage; stu stu; scanfscanf(%s%s,);); forfor(i=0i=0;i6;i+)i6;i+) scanscan(%f%f,&stu.score&stu.scorei i);); stu.totalstu.total=0=0; forfor(i=0i=0;i6;i+)i6;i+) stu.total+=stu.scorestu.total+=stu.scorei i; stu
20、.averagestu.average=stu.total/6=stu.total/6; printfprintf(”%s%s的总成绩的总成绩=%.2fn=%.2fn平均成绩平均成绩=%.2f”,=%.2f”, stu.total,stu.average stu.total,stu.average);); 输入数据:输入数据: CHEN 80 86 79 98 88 72 CHEN 80 86 79 98 88 72 运行结果:运行结果:CHENCHEN的总成绩的总成绩=477.00=477.00平均成绩平均成绩= 72.13 = 72.13 程序如下:程序如下:17与结构体变量定义类似,只是
21、结构体变量名为结与结构体变量定义类似,只是结构体变量名为结构体数组变量名,如:构体数组变量名,如: structstruct student stu3; student stu3;数组各元素在内存中数组各元素在内存中连续存放连续存放三、结构体数组三、结构体数组结构体数组的定义结构体数组的定义结构体数组的初始化结构体数组的初始化一般形式是在定义的数组一般形式是在定义的数组后面加上后面加上 =初值表列初值表列;例。例。structstruct student student int int num; num; char name20; char name20; char sex; char sex
22、; int int age; age; float score; float score; char addr30; char addr30; stu3=101,”WGJ”,M,28,88.5,” stu3=101,”WGJ”,M,28,88.5,”CS”,CS”, 102,”DYH”,F,26,88.0,”CS”,102,”DYH”,F,26,88.0,”CS”, 103,”DYC”,M,24,78.5,”CZ”;103,”DYC”,M,24,78.5,”CZ”;18101”WGJ”M2888.5”CS”102”DYH”F2688.0”CS”103”DYC”M2478.5”CS”stu0st
23、u1stu2 num name sex age score addrstu0 101 WGJ M 28 88.5 CSstu1 102 DYH F 26 88.0 CSstu2 103 DYC M 24 78.5 CS结构体数组的存储分配结构体数组的存储分配19通过下面的示例说明结构体数组的使用方法通过下面的示例说明结构体数组的使用方法 例例11.2 11.2 候选人得票的统计。设有三个候选人,每次输入一个得票候选人得票的统计。设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。的候选人的名字,要求最后输出各人得票结果。结构体数组的使用结构体数组的使用struct per
24、son char name20; int count; leader3=Zhang,0,Li,0,Wang,0;程序如下:程序如下:20main() int i,j; char leader_name20; for (i=1;i=10;i+) scanf(%s,leader_name); for (j=0;j3;j+) if (strcmp(leader_name, )=0) leaderj.count+; printf(n); for (i=0;i-成员名成员名“-”-”为指向运算符为指向运算符上面示例(上面示例(* *pstu).name,(pstu).name,(
25、* *pstu).agepstu).age。可以等价表示为:。可以等价表示为: pstu-name, pstupstu-name, pstu-age-age23main() struct student long int num; char sex; float score; stu_1 ,*p; p=&stu_1; stu_1.num=200301; stu_1.sex=M; stu_1.score=89.5; printf(No.:%ldnsex:%cnscore:%fn, stu_1.num,stu_1.sex,stu_1.score); printf(nNo.:%ldnsex:
26、%cnscore:%fn, (*p).num,(*p).name,(*p).sex,(*p).score); printf(nNo.:%ldnsex:%cnscore:%fn, p-num,p-name,p-sex,p-.score);例例11.3 11.3 比较结构体成员的几种引用方式比较结构体成员的几种引用方式24请分析下列几种运算:请分析下列几种运算:p-np-np-n+p-n+p-n+p-n总结:结构体成员变量引用方式总结:结构体成员变量引用方式结构体变量结构体变量. .成员名成员名( (* *p).p).成员名成员名p-p-成员名成员名其中,其中,-称为指向运算符称为指向运算符可转换
27、为:可转换为:p-np-n(p-n)+(p-n)+(p-n)+(p-n)25用结构体变量和指向结构体的指针作函数参数用结构体变量和指向结构体的指针作函数参数 将一个结构体变量的值传递给另一个函数,有3个方法:(1) 用结构体变量的成员作参数。(2) 用结构体变量作实参。(3) 用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参26例例11.5 有一个结构体变量有一个结构体变量stu,内含学生学号、姓名和,内含学生学号、姓名和3门课程的门课程的成绩。要求在成绩。要求在main函数中赋予值,在另一函数函数中赋予值,在另一函数print中将它们输中将它们输出。今用结构体变量
28、作函数参数。出。今用结构体变量作函数参数。#include struct student int num; char name20; float score3;用结构体变量和指向结构体的指针作函数参数用结构体变量和指向结构体的指针作函数参数27void main() void print(struct student); struct student stu; stu.num=12345; strcpy(, “LiLin”); stu.score0=67.5;stu.score1=89;stu.score2 =78.6; print(stu);void print(struct
29、 student stu) printf(FORMAT,stu.num,, stu.score0, stu.score1,stu.score2);运行结果: 67.50000089.00000078.599998用结构体变量和指向结构体的指针作函数参数用结构体变量和指向结构体的指针作函数参数2811.7 用指针处理链表用指针处理链表用结构体建立链表:struct student int num; float score; struct student *next ;; 其中成员num和score用来存放结点中的有用数据(用户需要用到的数据),next是指针类型的成员,它指向st
30、ruct student类型数据(这就是next所在的结构体类型)29简单链表简单链表struct student long num; float score; struct student *next; ; main() struct student a,b,c,*head,*p; a. num=99101; a.score=89.5; b. num=99103; b.score=90; c. num=99107; c.score=85; head=&a; a.next=&b; b.next=&c; c.next=NULL; p=head; doprintf(%ld
31、%5.1fn,p-num,p-score); p=p-next; while(p!=NULL); 运行结果:运行结果:1010189.51010390.01010785.030库函数提供动态地开辟和释放存储单元的有关函数:malloc函数: 其函数原型为void *malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的值(即“返回值”)是一个指向分配域起始地址的指针(类型为void)。如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)。11.7.3 处理动态链表所需的函数处理动态链表所需的函数31callo
32、c函数: 其函数原型为void *calloc(unsigned ,unsigned size);其作用是在内存的动态存储区中分配个长度为size的连续空间。函数返回一个指向分配域起始地址的指针;如果分配不成功,返回NULL。用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为Size。free函数: 其函数原型为void free(void *p);其作用是释放由指向的内存区,使这部分内存区能被其他变量使用。是最近一次调用calloc或malloc函数时返回的值。free函数无返回值。以前的版本提供的malloc和calloc函数得到的是指向字符型数据的指针。
33、ANSI 提供的malloc和calloc函数规定为void类型。32建立动态链表建立动态链表 所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系. 例11.5 写一函数建立一个有3名学生数据的单向动态链表。算法如图:图11-1233图11-14图11-15 图11-1634对链表的一般操作对链表的一般操作 建立链表建立链表 申请一个节点空间申请一个节点空间 将该节点连接到链表尾端将该节点连接到链表尾端 删除链表中的节点删除链表中的节点 找到删除的节点找到删除的节点 删除该节点删除该节点 向链表中插入一个节点向链表中插入一
34、个节点 怎样找到插入的位置;怎样找到插入的位置; 怎样实现插入。怎样实现插入。3511.8 共用体共用体11.8.1共用体的概念共用体的概念 使几个不同的变量共占同一段内存的结构称为 “共用体”类型的结构。定义共用体类型变量的一般形式为:unionunion共用体名 成员表列 变量表列;36 11.8 共用体共用体 例如:例如:union data union data int i; int i; char ch; 或或 char ch; float f; float f;a,b,c; ;union data a,b,c;共用体在内存中的存放方法共用体在内存中的存放方法:37共用体和结构体的比
35、较:共用体和结构体的比较: 结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。 共用体变量所占的内存长度等于最长的成员的长度。 例如:上面定义的“共用体”变量、各占个字节(因为一个实型变量占个字节),而不是各占个字节。38 只有先定义了共用体变量才能引用它,而且不能引用共用体变量,而只能引用共用体变量中的成员 (与结构体类似) 。例如:前面定义了a、b、c为共用体变量 a.i (引用共用体变量中的整型变量) a.ch(引用共用体变量中的字符变量) a.f (引用共用体变量中的实型变量)11.8.2 共用体变量的引用方式共用体变量的引用方式39(1)同一个内存段可
36、以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。(2)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。 (3)共用体变量的地址和它的各成员的地址都是同一地址。 11.8.3 共用体类型数据的特点40(4)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量时对它初始化。(5)不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针 (6)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员
37、。11.8.3 共用体类型数据的特点41 设有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职。可以看出,学生和教师所包含的数据是不同的。现要求把它们放在同一表格中。例:图11-2542算法:算法:4311.9 枚举类型枚举:将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。申明枚举类型用enumenum weekdaysun,mon,tue,wed,thu,fri,sat; 定义变量:enum weekday workday,week-day;enumsun,mon,tue,wed,thu,fri,sat
38、workday;变量值只能是sun到sat之一 。枚举元素枚举常量4411.9 枚举类型说明:(1) 在编译中,对枚举元素按常量处理,故称枚举常量。它们不是变量,不能对它们赋值。 (2) 枚举元素作为常量,它们是有值的,语言编译按定义时的顺序使它们的值为, 。如果要改变则只能在定义时改变。(3) 枚举值可以用来作判断比较。 (4) 一个整数不能直接赋给一个枚举变量。 要赋值就需要进行强制类型转换。4511.10 用typedef定义类型用typedef声明新的类型名来代替已有的类型名。声明INTEGER为整型typedef int INTEGER声明结构类型Typedef struct int
39、 month; int day; int year;DATE;4611.10 用typedef定义类型声明为整型数组类型 :typedefintNUM100; 声明STRING为字符指针类型: typedef char *STRING; 声明POINTER为指向函数的指针类型,该函数返回整型值 :typedef int (*POINTER)( ) NUM100 n;STRING p,s9;POINTER p1,p2;4711.10 用typedef定义类型用typedef定义类型的方法: 先按定义变量的方法写出定义体(如:int i)。 将变量名换成新类型名(例如:将i换成 COUNT)。 在
40、最前面加(例如:typedef int COUNT)。 然后可以用新类型名去定义变量。4811.10 用typedef定义类型说明:说明:(1)用typedef可以声明各种类型名,但不能用来定义变量。(2) 用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。 (3) 当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型,把它们单独放在一个文件中,然后在需要用到它们的文件中用#include命令把它们包含进来。(4) 使用typedef有利于程序的通用与移植。4911.10 用typedef定义类型说明:(5) typedef与#define有相似之处,例如:typedef int COUNT;#define COUNT int的作用都是用COUNT代表int。但事实上,它们二者是不同的。#define是在预编译时处理的,它只能作简单的字符串替换,而typedef是在编译时处理的。实际上它并不是作简单的字符串替换,而是采用如同定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《弟子规》与2024年教育趋势融合教学
- 2024年贝的故事:教学资源的整合与创新
- 2024年XX企业客户服务文化建设方案
- 小学语文教学设计《棉花姑娘》
- 护理学基础(护理专科(含答案))
- 2024-2025学年新教材高中英语课时分层作业一Unit1Laughoutloud含解析外研版选择性必修第一册
- 《操作系统教程》(5版)课堂或课后研讨题
- 2024-2025学年高中数学第二章圆锥曲线与方程2.1抛物线及其标准方程课时作业含解析北师大版选修1-1
- 2024-2025学年高中政治第3单元中华文化与民族精神第7课第2框弘扬中华民族精神作业含解析新人教版必修3
- 初中语文茶可道茶亦悠然阅读练习及答案
- 公司电梯安全总监、电梯安全员岗位职责
- 02J331地沟及盖板图集
- 2019年西藏开发投资集团有限公司招聘试题及答案解析
- HAY岗位管理体系构建
- 2023年中级经济师考试真题及答案
- SB/T 10895-2012鲜蛋包装与标识
- GB/T 9115-2010对焊钢制管法兰
- GB/T 2423.3-2006电工电子产品环境试验第2部分:试验方法试验Cab:恒定湿热试验
- GB/T 23221-2008烤烟栽培技术规程
- GB/T 16900-2008图形符号表示规则总则
- 城市绿地系统规划 第9章 工业绿地规划
评论
0/150
提交评论