




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章 结构和联合日常生活中要处理的数据往往不是由单一类型的数据构成。例如,一个学生的基本信息就是由姓名、学号、性别、出生日期、所在院系、专业、班级等基本“数据项”共同构成。每个基本数据项都具有自己的属性(名称、数据类型、长度等)。人们常常需要对由若干不同属性的数据项所组成的整体数据进行组织和处理。但由于各数据项的属性不尽相同,所以用数组亦不能有效地对其进行组织和处理。为此,语言提供了与数组类型不同的另一种构造类型 结构类型。9.1 结构类型和结构变量和数组相似,结构也是拥有若干分量的一种构造类型。但和数组不同的是,结构的各个分量可以分别具有不同的数据类型。结构的每一个分量都称为是该结构的一个“成员”。结构成员的数据类型可以是基本数据类型,也可以是指针、数组或其他结构类型。结构类型的定义形式是:struct 结构类型名类型1 成员1;类型2 成员2;类型n 成员n;例如:struct dateint year;unsigned short month;unsigned short day;在这个定义中,定义了一个新的数据类型date ,这是一个结构类型,共有三个成员,分别是year、month和day。每个成员都有自己的数据类型,比如month的数据类型是无符号短整型。定义了结构类型之后,我们便可以用其来定义相应的结构变量。可以采用以下三种方法来定义结构变量。1先定义结构类型再定义结构变量首先定义一个结构类型(如上面的date),然后再用其来定义结构变量。定义形式为:struct 结构类型名 变量1,变量2,变量n;例如:struct date d1,d2;便定义了两个date型的结构变量d1和d2。同前面介绍的变量一样,每个结构变量所需的存储空间大小也是由其类型决定的。如上面d1和d2所需的存储空间大小为sizeof(struct date)个字节。注意,在用这种方法定义结构变量时,“struct”和“结构类型名”部分均不能省略。通常我们将程序中所用到的所有结构类型都在程序的头部或某一个头文件中集中定义。然后再根据需要用上述方法定义相应的结构变量。注意,定义结构类型时并不产生存储分配,只有在定义结构变量时才涉及到存储分配。2在定义结构类型的同时定义结构变量我们可以在定义结构类型的同时再定义相应的结构变量。例如:struct studentlong num;char name21;char sex;unsigned short age;unsigned class_num;char come_from31;float average_score; student1,student2;它的作用是定义了一个结构类型student,然后紧接着又定义了两个该类型的结构变量student1和student2。3直接定义结构变量此种方法和上面第二种方法类似,只不过没有定义结构类型名。其形式为:struct 类型1 成员1;类型2 成员2;类型n 成员n; 变量1,变量2,变量n;例如:structchar name21;unsigned short age;char sex; p1,p2,p3;定义了三个结构变量p1,p2,p3。但由于没有定义相应的结构类型,所以如果以后想再定义一个同类型的结构变量p4的话,上述语句还要重写一遍。再者,当结构的类型发生变化时,结构变量的定义也需重写。因此我们不提倡用这种办法来定义结构变量,除非编程者清楚地知道以后不会再用到该结构类型。上面我们介绍了结构类型及结构变量的定义方法。此外,一个结构的成员也可以是另一个结构。例如:struct dateint year;unsigned short month;unsigned short day;struct personchar name21;char sex;struct date birthday; /* 结构person的成员birthday又是另一个结构date */char department81;9.2 访问结构成员在定义了一个结构变量之后,便可以访问这个变量的成员。引用方式为:结构变量名.成员名这里,“.”称为“成员运算符”。例如:struct date d1,d2;d1.year=2002;d1.month=12;d1.day=25;d2.year=d1.year;d2.month=d1.month;d2.day=d1.day;printf(d1.year=%d, d1.month=%d, d1.day=%dn, d1.year, d1.month,d1.day);printf(d2.year=%d, d2.month=%d, d2.day=%dn, d2.year, d2.month,d2.day);从附录可知,成员运算符“”在所有的运算符中优先级最高,因此可以把上面的d1.year和d1.month 等当作为一个整体来看待。如:d1.year+; 等价于 (d1.year)+;d1.mongth+=2; 等价于 (d1.mongth)+=2;d2.day=d1.day+; 等价于 d2.day=(d1.day)+;需要注意的是:l 旧的标准规定不能将一个结构变量作为一个整体直接赋给另一个具有相同结构类型的结构变量,而只能对各个成员分别赋值。如:d2.year=d1.year;d2.month=d1.month;d2.day=d1.day;l 新的标准允许将一个结构变量直接赋给另一个具有相同结构类型的结构变量。如:d2=d1;l 如果结构变量的成员本身是一个结构类型,则要用若干个成员运算符,一级一级地找到最低层的成员。且只能对最低层的成员进行赋值、存取或运算。例如:struct person myself;strcpy(,ZhaoYongZhe);myself.sex=M;myself.birthday.year=1961;myself.birthday.month=4;myself.birthday.day=17;strcpy(myself.department,Computer College of Jilin University);注意:成员运算符“”是自左向右结合的。所以myself.birthday.year=1961; 等价于 (myself.birthday).year=1961;l 和数组一样,标准规定,只有当结构变量为全局变量或静态变量时,才能在定义时对其初始化(但有些编译系统已取消了此限制)。例如:static struct person myself=ZhaoYongZhe,M,1961,4,17,Computer College of Jilin University;9.3 结构数组和结构指针9.3.1 结构数组当数组中的每个元素都是同一类型的结构变量时,该数组称为结构数组。例如:struct studentlong num;char name21;char sex;unsigned short age;unsigned class_num;char come_from31;float average_score;/* 下面定义了一个一维student型结构数组stu并对其初始化 */static struct student stu3=200101,LiuMing,M,19,1,Shanghai,78.45,200102,WangMei,F,18,2,Changchun,94.78,200101,Zhangkai,M,20,3,Beijing,54.45;9.3.2 结构指针结构对象的地址即为指向该结构对象的指针。我们可以定义一个结构指针变量来存放相应结构对象的地址。例如:struct student stu_1,stu_2,*p_stu;p_stu=&stu_1;9.3.3 通过指向结构的指针访问结构成员我们可用前面介绍的成员运算符“.”来访问结构的成员。例如:struct student stu_1,stu_2,*p_stu=&stu_1;则stu_1.age=21;等价于(*p_stu).age=21;注意(*p_stu).age不能写成 *p_stu.age,这是因为成员运算符“.”的优先级高于指针运算符“*”的优先级。所以*p_stu.age等同于*(p_stu.age)而不是(*p_stu).age。由于经常要通过指向结构的指针来访问结构的成员。所以语言专门提供了一个指针成员运算符“-”。它是由一个减号“-”和一个大于号“”共同组成。其用法为:结构指针-成员名且有:“结构指针-成员名”等价于“(*结构指针).成员名”。所以上面的(*p_stu).age=21;也可以写成p_stu-age=21;注意“.”和“-”的优先级相同,均是自左向右结合的。至于采用哪一个则要看是通过结构变量还是结构指针来访问结构的成员。对于结构变量,只能通过“.”来访问其成员。而对于结构指针,尽管可以通过“*”和“.”来访问其所指结构对象的成员。但我们通常采用“-”的形式。还有一点要注意的是,结构指针的增量操作也和其他指针的增量操作一样,是以其所指对象所需占用的字节数为“单位”进行的。看下面的例子:例9.1 读入10个学生的信息,然后将平均成绩最高和最低者的姓名、班级、成绩输出。#include stdio.h#define N 10struct student /* 定义结构类型student */long num;char name21;char sex;unsigned short age;unsigned class_num;char come_from31;float average_score;void main() struct student sN,*p,*p1,*p2;int i;for(i=0;iN;i+) /* 分别读入每个学生的信息 */printf(Input the information of Student_%d:n,i+1);printf(Num=);scanf(%d,&si.num);printf(Name=);scanf(%s,);printf(Sex=);scanf(%c,&si.sex);printf(Age=);scanf(%d,&si.age);printf(Class_num=);scanf(%d,&si.class_num);printf(Come_from=);scanf(%s,e_from);printf(Average_Score=);scanf(%f,&si.average_score); for(p=p1=p2=s;+paverage_score p1-average_score) p1=p;if(p-average_score average_score) p2=p; printf(Name Class Average_Scoren);printf(-n);printf(%-20s%5u %fn,p1-name,p1-class_num,p1-average_score);printf(%-20s%5u %fn,p2-name,p2-class_num,p2-average_score);9.4 sizeof运算符和的动态存储分配函数在语言中,sizeof是“求字节数”运算符,其优先级与+、-等运算符相同。sizeof的运算对象是数据类型,其返回值是这种类型数据在内存中占用的字节数。例如:sizeof(int),sizeof(double *),sizeof(struct student)等等。尽管同一种数据类型的对象(如int型)在不同的编译系统中可能被分配了不同字节数的存储空间,但sizeof总能返回正确的字节数。所以建议大家使用sizeof来取代相应的整常数。这样编出的程序可实现与编译系统的无关性。此外,语言也是一个与操作系统(OS - Operation System)无关型的程序设计语言。因为所有需与操作系统打交道的工作皆由相应的库函数来完成。所以用语言编程离开库函数将寸步难行。我们知道在程序中使用得最多的便是“自动变量”。而对自动变量的存储分配并不是在编译时完成,而是在程序运行时根据需要动态地进行。为了动态地分配存储空间,标准特提供了一个名为malloc的库函数,其定义形式如下:void *malloc(bytes)unsigned bytes;malloc函数向操作系统申请一块长度为bytes个字节的连续存储空间,如申请成功,则返回一个无类型指针(void型指针),其指向所分配空间的第一个字节。如果操作系统没有足够的可用空间,则malloc返回一个空指针NULL用以表明空间分配失败。注意,无类型指针相当于是一个“地址类型”或“指针类型”。由于其无类型或类型不定,所以必须对其进行强制类型转换后才能使用。从这个意义上说,void型指针又可看成是一个“万能指针”,可以根据需要将其转换为任意类型的指针,反之亦然。而NULL实际上是一个宏,它是在头文件stdio.h定义的。malloc函数的用法如下:char *p;p=(char*)malloc(10); /* 申请10个字节的空间,并将其首地址转换为字符指针 */if(p=NULL)puts(memory allocation failed.);elseputs(memory allocation successful.);相对于库函数malloc,语言还提供了另一个库函数free,函数free的定义形式如下:void free(p)void *p;与malloc正好相反,函数free将p所指向的存储空间归还(释放)给操作系统。作为一个良好的程序设计习惯,在动态申请的空间使用完毕之后,应立即将其释放。注意,在用free(p)将p所指的空间释放之后,p的值不变,即其仍指向原来的存储空间。显然,不访问这个已被释放的存储空间是程序员的职责。看下面例子:例9.2 从键盘读入一个正整数n,然后再依次读入n个整数,并按读入的反序将他们输出。#include void main() int *p,i,n;printf(Input the number of the integers: );scanf(%d,&n);while(n=0)printf(Invalid number! Input it again: );scanf(%d,&n);if( (p=(int*)malloc(n*sizeof(int) = NULL ) /* 申请一个动态一维数组p */puts(Memory allocation failed ! );getchar();exit(0);printf(Input %d integers:n,n);for(i=0;inum);printf(Name=%sn,s-name);printf(Sex=%cn,s-sex);printf(Age=%dn,s-age);printf(Class_num=%dn,s-class_num);printf(Come_from=%sn,s-come_from);printf(Average_Score=%fn,s-average_score);9.6 结构的自引用前面我们提到,在定义结构类型时,一个结构的成员也可以是另一个结构类型。例如:struct personchar name21;char sex;struct date birthday; /* person的成员birthday又是另一个结构date */char department81;但下面的定义却是非法的:struct personchar name21;char sex;char department81;struct person father; /* person的成员father 又是结构person */;因为上面在定义结构person时产生无穷递归,所以无法对其进行存储空间分配。换句话说,一个person类型的对象将需要无限的存储空间。所以上述的定义是非法的。但下面的定义却是合法的:struct personchar name21;char sex;char department81;struct person *father; /* person的成员father 是一个person结构指针 */;这就是结构的自引用。注意,上面的定义不会产生无穷递归,因为结构person的成员father 只是一个指向person结构的指针,而不是person结构。所以一个person类型的对象仅需要有限的存储空间。结构的自引用通常用于构造“链表”,它是数据结构课程中的重点内容。在本书中不作介绍。9.7 位域存储空间的充分利用对于前面介绍的所有结构,他们成员的最小存储单位均为“字节”。即结构的每个成员至少要占用一个字节的存储空间。如上面结构person的成员sex(性别),尽管只需1位的空间便足够了,但其却占用了一个字节。为了节省存储空间,语言允许用若干二进制位来存放结构的成员,这就是“位域”。所谓位域即是以二进制位为存储单位的结构成员。例如:struct personchar name21;unsigned sex:1;unsigned age:7;定义了一个结构类型person,其共有三个成员,其中成员sex和age都是位域。sex占1位存储空间,age占7位存储空间。但成员name不是位域。位域的引用与非位域一样,例如:例9.3#include #include struct person char name21; unsigned sex:1; unsigned age:7;main() struct person p,*pp=&p; strcpy(, Zhang Wei); p.sex=1; pp-age=27; printf(=%s,p.sex=%u,p.age=%un,,p.sex,p.age); printf(sizeof(struct person)=%dn,sizeof(struct person);结果为:= Zhang Wei,p.sex=1,p.age=27sizeof(struct person)=22关于位域的定义和引用,要注意以下几点:l 位域的长度不能超过一个存储单元的长度。存储单元的长度由具体的编译系统决定,通常是一个“字”的长度。如Turbo C 3.0 是16位。l 若某一位域要从另一个储存单元开始存放,可以用以下形式定义:unsigned a:1;unsigned b:2; /* a,b存于同一个储存单元 */:0;unsigned c:3; /* c存于另一个存储单元 */本来a,b,c应连续存放在一个存储单元中,由于使用了长度为0的位域,其作用是使紧跟其后的下一个位域从下一个存储单元开始存放。因此a,b存储在同一个存储单元中,而将c存放在另一个存储单元中。l 可以定义无名位域,来跳过相应的“位”。如:unsigned a:1;:2; /* 跳过两位不用 */unsigned b:3;unsigned c:4;l 位域的类型通常为无符号整型。9.8 联合9.8.1 联合类型和联合变量联合也是一种类似于结构的构造类型。与结构类似,联合类型的定义形式是:union 联合类型名类型1 成员1;类型2 成员2;类型n 成员n;例如:union dataint i;char ch;float f;定义了一个新的数据类型data ,这是一个联合类型,其共有三个成员,分别是i、ch和f。每个成员都有自己的数据类型,比如f的数据类型是float型。定义了联合类型之后,我们便可以用其来定义相应的联合变量。同结构变量的定义一样,我们也可以采用以下三种方法来定义联合变量。1先定义联合类型再定义联合变量首先定义一个联合类型(如上面的data),然后再用其来定义联合变量。定义形式为:union 联合类型名 变量1,变量2,变量n;例如:union data u1,u2;便定义了两个data型的联合变量u1和u2。2在定义联合类型的同时定义联合变量我们可以在定义联合类型的同时再定义相应的联合变量。例如:union dataint i;char ch;float f; u1,u2;它的作用是定义了一个联合类型data,然后紧接着又定义了两个该类型的联合变量u1和u2。3直接定义联合变量此种方法和上面第二种方法类似,只不过没有定义联合类型名。其形式为:union类型1 成员1;类型2 成员2;类型n 成员n; 变量1,变量2,变量n;例如:unionint i;char ch;float f; u1,u2;结构和联合的区别是,结构的各个成员分别具有各自的存储空间,而联合的各个成员则共享同一块存储空间。所以结构变量所占据存储空间的大小是其各个成员所需存储空间之和,而联合变量所占据存储空间的大小是其各个成员所需存储空间的最大者。利用联合,可以将几种不同类型的变量存放到同一块内存单元中。例如,上面的联合类型data便将一个int型变量i、一个char型变量ch、一个float型变量f放在从同一个地址开始的内存单元中:ichf9.8.2 联合变量的引用方式联合变量的引用方式与结构变量相同,我们也可以通过“.”和“-”来饮用其成员。例如:union data u,*p=&u;u.i=123;p-ch=A;但由于联合变量的各个成员都共享同一块存储空间,所以在任一时刻只能有一个成员在起作用。也就是说,尽管一个联合变量有多个成员,但只有一个成员的“值”是有意义的,而引用其他成员的“值”都是无意义的。这个成员便是最近一次赋值所引用的成员。例如:例9.4#include union dataint i;char ch;float f;main() union data u;u.i=123;u.ch=A;u.f=123.456;printf(u.i = %dn,u.i);printf(u.ch = %cn,u.ch);printf(u.f = %fn,u.f);结果为:u.i = -5767u.ch = yu.f = 123.456001可知对联合变量u的成员f的引用是有意义的,而对成员i和ch的引用则是无意义的。这是因为对联合变量u的最近一次赋值是对其成员f进行的,它使得以前对其成员i和ch的赋值变得无效。这也是联合与结构的区别所在。9.8.3 联合的特点联合提供了一种能在同一块存储区域内处理不同类型数据的方式。编译会为联合变量分配一块存储空间,该存储空间的大小刚好能容纳其最大的成员。这样其所有成员便能共享该块存储空间。引入联合的初衷是为了节省宝贵的内存,让多个变量“共享”同一块内存空间。这一点和FORTRAN语言中的EQUIVALENCE语句类似。但这样一来也产生了一个负面作用,那就是不便于对变量进行跟踪,损失了程序的易读性。这和现在所提倡的程序设计思想是相矛盾的。所以我们不提倡在程序中使用联合。但有时联合也是有其独特作用的。例如,我们想知道在中int型数据是如何存放的,即高字节和低字节是如何组织的。为此编写如下程序:例9.5#include union icint i;unsigned char ch2;main() union ic u;u.i=32767;printf(u.ch1=%X,u.ch0=%Xn,u.ch1,u.ch0);u.i=32768;printf(u.ch1=%X,u.ch0=%Xn,u.ch1,u.ch0);结果为:u.ch1=7F,u.ch0=FFu.ch1=80,u.ch0=0由此可知一个int型数据的低字节存放其低8位,而高字节存放其高8位。这正是利用了无符号字符数组ch与整形变量i共享同一块存储空间的特点。在使用联合类型数据时要注意以下一些特点:l 在任一时刻,联合变量只有一个成员有意义,其它成员则无意义。正确地存取联合变量的某个成员是程序设计者的职责。l 联合变量中有意义的成员即是其最后一次赋值的成员。l 联合变量的地址和其各成员的地址相同。l 不能在定义联合变量的同时对其进行初始化。9.9 枚举类型枚举类型是ANSI 新标准所增加的。如果一个变量只有几种可能的值,则可以定义其为枚举类型。所谓“枚举”是指将变量的可能取值一一列举出来,变量的值只限于列举出来的值的范围。定义枚举类型用保留字enum。其定义形式为:enum 枚举类型名 枚举常量名=整形值, . 变量列表;例如:enum weekday sun,mon,tue,wed,thu,fri,sat;定义了一个枚举类型weekday。该枚举类型有7个枚举常量,分别是sun、mon、tue、wed、thu、fri和sat。和结构或联合类型一样,我们可以用枚举类型来定义相应的枚举变量。如:enum weekday d1,d2; (enum不能省略)定义了两个weekday型的枚举变量d1和d2,它们的值可以是sun到sat之一。例如:d1=mon;d2=sun;我们也可以直接定义枚举变量,例如:enum red,yellow,blue color1,color2;同样,也可以同时定义枚举类型及枚举变量,例如:enum color red,yellow,blue color1,color2;枚举类型实际上是一个int型常量的“集合”。亦即每一个枚举常量实际上是一个int型常量,而枚举变量实际上是一个int型变量。使用枚举类型时要注意以下几点:1) 上述的枚举常量sun,mon,red,blue等是int型常量,所以不能对它们赋值。2) 枚举常量的值满足:第i个枚举常量的值 第i-1个枚举常量的值 + 1 。3) 按的缺省规定,第一个枚举常量的值为0。4) 在定义枚举类型时,可以指定每个枚举常量的值。如不指定,则按第2条的规定决定其值。5) 使不同的枚举常量具有不同的值是程序员的责任。6) 枚举变量同int型变量,同样,使其值落在合法的枚举常量的范围之内也是程序员的责任。7) 对枚举变量可进行同int型变量一样的运算和操作。例9.6#include enum color red=3,green,blue=4;enum workday mon,tue,wed=7,thu,fri;main() enum color c1,c2;enum workday d1,d2;c1=red;c2=+c1;d1=mon;d2=wed;printf(c1=%d,c2=%dn,c1,c2);printf(d1=%d,d2=%dn,d1,d2);printf(red=%d,green=%d,blue=%dn,red,green,blue);printf(mon=%d,tue=%d,wed=%d,thu=%d,fri=%dn,mon,tue,wed,thu,fri);结果为:c1=4,c2=4d1=0,d2=7red=3,green=4,blue=4mon=0,tue=1,wed=7,thu=8,fri=9使用枚举类型及枚举变量的目的是增加程序的直观性和易读性。9.10 用typedef定义类型在语言中,还可以用typedef来定义一个新的“类型名”。例如:typedef int INTEGER;就定义了一个新的类型名“INTEGER”,即使INTEGER与int成为同义词。此后 INTEGER 就能用在类型int能出现的任何地方,且作用完全相同。例如:INTEGER i1,i2; 等价于 int i1,i2;INTEGER a10,*p; 等价于 int a10,*p;同样,typedef char *STRING;则定义了一个新类型名“STRING”,且其和类型(char *)成为同义词,即STRING为字符指针类型。以后我们就可以用STRING来定义字符指针变量。例如:STRING p,linesMAX_LINES; 等价于 char *p,*linesMAX_LINES;注意,用typedef定义的新类型名并不是紧跟在保留字typedef之后,且具体的语法也不太容易用一个语法表达式来刻画。我们可以这样来描述typedef的用法:如果要定义一个新类型名,则首先定义一个与之同名的“同类型”的变量,然后再在该“变量的定义”前面加上保留字typedef,则该“变量”名便上升成为“类型”名。例如:struct int month;int day;int year; DATE;定义了一个“结构变量”DATE,而typedef struct int month;int day;int year; DATE;则定义了一个相应的“结构类型”DATE。且DATE date1,date2;等价于typedef struct int month;int day;int year; date1,date2;可见,通过用typedef定义新类型可以简化程序的书写并提高程序的易读性。而程序的“易读性”是现代程序设计最重要的特性之一。他对程序的维护、功能扩充、移植等都具有举足轻重的作用。从前面的的预处理程序到现在的类型名定义,可以看出在这方面比别的程序设计语言有独到的设计,这也是之所以风靡全球的原因之一。为了和的保留字以及变量名相区别,用typedef定义的类型名通常总是用大写英文字母来命名。但必须强调的是,typedef并不是“创建”了一个新的数据类型,它只是为现有的某些数据类型起了一个新的名字而已,并没有扩展的数据类型。typedef与#define有相似之处。但事实上,它们二者是不同的。主要区别在:l typedef是的“保留字”,即不能用其来命名变量等对象,但define并不是的“保留字”,我们可以用其来命名变量,只不过不提倡这样做而已。l #define是在预处理时处理的,它只能做简单的字符串替换,而typedef是在编译时处理的。实际上它并不是做简单的字符串替换,例如:typedef int INTEGER; 在某些情况下可代之以 #define INTEGER int但 typedef int NUM10;却无法以任何#define代之。使用typedef有两个主要的理由:其一是有利于程序移植。如果把typedef用于可能与机器有关的数据类型,则在程序移植时仅需改变typedef,从而减少大量的程序修改工作。第二个原因是使用typedef能为程序提供更多的可读信息,用一个适当的符号名表示一个复杂的结构类型会增强程序的可读性。习 题9.1 填空 语言提供了三种构造数据类型,它们是 、 和 。 使几个不同类型的量共享同一段内存的结构,称为“ ”。9.2 单项选择 说明语句struct studentint num;char name20;char sex;定义了( )。(1) 结构类型student (2) 联合类型student(3) 结构变量student (4) 数组类型student
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第一章声现象 单元试卷(含解析)2025-2026学年苏科版(2024)物理八年级上册
- 考研真题历年题库及答案
- 红磷燃烧的题目及答案
- 2025年汽车自动采样设备项目建议书
- 扶贫知识培训内容课件
- 羧酸衍生物2讲解
- 压力式温度计行业员工职业发展规划与管理
- 2025年播音主持证考试真题及答案
- 2025年会计考试题基础题及答案
- 2025年焊工车间考试题目及答案
- 2025年浙江省中考语文试题卷(含答案解析)
- 2025年副科级警察面试题及答案
- 单位保安执勤方案(3篇)
- 二三轮车安全知识培训课件
- 2025 呼吸内科查房肺康复评估工具课件
- 2025云南咖啡购销合同范本
- 2025年公安警察、辅警招聘知识考试题(附含答案)
- 收银奖惩管理办法
- 机械设计部绩效考核制度
- 电线电缆检验工职业技能模拟试卷含答案
- 糖尿病饮食指导健康宣教
评论
0/150
提交评论