大学单片机接口技术(C51版)-张道德-课件PPT
收藏
资源目录
压缩包内文档预览:
编号:21836282
类型:共享资源
大小:16.08MB
格式:ZIP
上传时间:2019-09-06
上传人:QQ24****1780
认证信息
个人认证
王**(实名认证)
浙江
IP属地:浙江
25
积分
- 关 键 词:
-
大学
单片机
接口
技术
c51
张道德
课件
ppt
- 资源描述:
-
大学单片机接口技术(C51版)-张道德-课件PPT,大学,单片机,接口,技术,c51,张道德,课件,ppt
- 内容简介:
-
单片机接口技术(C51版)第五章指针、结构、联合和枚举内容概述 指针是C51语言的精华也是难点。本章主要介绍指针的概念、定义指针的方法,介绍指向一维数组、二维数组、字符数组的指针使用方法,指针数组的概念以及指针作为函数参数的使用方法。结构、联合和枚举是另外的构造型数据,本章介绍了这三种类型数据的定义、初始化以及使用方法。教学目标1理解指针的概念,掌握指针与地址的关系,能区别指针变量与变量的指针,根据需要定义并使用指针变量,理解地址运算的方法。2理解指针与数组的关系,熟练使用指针指向一维数组、二维数组,理解并掌握利用指针表达数组元素的几种表现形式。3. 能利用指针指向字符数组,处理字符串。4理解指针数组的概念,该数组的元素是指针。5掌握指针作为函数形参的使用方法,理解指针作为函数形参传递整个数组的作用。6了解结构体的作用及应用场合,能定义并使用结构体变量,掌握结构变量成员的引用方法。能定义并使用结构数组,会引用结构数组元素成员, 7掌握结构指针的定义方法,利用结构指针访问结构变量的成员。8. 了解结构变量的作为结构成员的结构嵌套定义方法以及位结构的概念。9. 理解联合的概念,能定义并使用联合体变量,掌握联合与结构的区别。10. 能定义并使用枚举变量。 5.1指针5.11 指针和地址 指针变量的定义C51语言中, 对于变量的访问形式之一, 就是先求出变量的地址, 然后再通过地址对它进行访问, 这就是这里所要论述的指针及其指针变量。所谓变量的指针, 实际上指变量的地址 变量的地址虽然在形式上好象类似于整数, 但在概念上不同于以前介绍过的整数, 它属于一种新的数据类型, 即指针类型。C51中, 一般用“指针”来指明这样一个表达式&x的类型, 而用“地址”作为它的值, 也就是说, 若x为一整型变量, 则表达式&x的类型是指向整数的指针, 而它的值是变量x的地址。 同样, 若 double d;则&d的类型是指向双精度数d的指针, 而&d的值是双精度变量d的地址。所以, 指针和地址是用来叙述一个对象的两个方面。&x、&d的类型是不同的, 一个是指向整型变量x的指针,而另一个则是指向双精度变量d的指针。指针变量的一般定义为:类型标识符 *标识符; 其中标识符是指针变量的名字, 标识符前加了“*”号, 表示该变量是指针变量“类型标识符”表示该指针变量所指向的变量的类型。一个指针变量只能指向同一种类型的变量定义一个指针类型的变量。int *ip;首先说明了它是一指针类型的变量, 注意在定义中不要漏写符号“*”, 否则它为一般的整型变量了。另外, 在定义中的int 表示该指针变量为指向整型数的指针类型的变量, 有时也可称ip为指向整数的指针。ip是一个变量, 它专门存放整型变量的地址。指针变量在定义中允许带初始化项。如: int i, *ip=&i;。C51中规定, 当指针值为零时, 指针不指向任何有效数据, 有时也称指针为空指 指针变量的引用 既然在指针变量中只能存放地址, 因此, 在使用中不要将一个整数赋给一指针变量. 下面的赋值是不合法的: int *ip; ip=100;假设:int i=200, x;int *ip;可以把i的地址赋给ip: ip=&i; 此时指针变量ip指向整型变量i, 假设变量i的地址为1800, 这个赋值可形象理解为下图所示的联系。 ip i 1800 200 图5-1-1 给指针变量赋值以后我们便可以通过指针变量ip间接访问变量i, 例如: x=*ip; 运算符*访问以ip为地址的存贮区域, 而ip中存放的是变量i的地址, 因此, *ip访问的是地址为1800的存贮区域(因为是整数, 实际上是从1800开始的两个字节),它就是i所占用的存贮区域, 所以上面的赋值表达式等价于x=i;另外, 指针变量和一般变量一样, 存放在它们之中的值是可以改变的, 也就是说可以改变它们的指向, 假设 int i, j, *p1, *p2; i=a; j=b; p1=&i; p2=&j; 则建立如图5-1-2所示的联系: p1 i a p2 i b 图5-1-2 赋值运算结果 这时赋值表达式:p2=p1;就使p2与p1指向同一对象i, 此时*p2就等价于i, 而不是j, 图5-1-2就变成图5-1-3所示: p1 i a p2 j b 图5-1-3 p2=p1时的情形 如果执行如下表达式: *p2=*p1; 则表示把p1指向的内容赋给p2所指的区域, 此时图5-1-2就变成图5-1-4所示: p1 i a p2 j a 图5-1-4 *p2=*p1时的情形 由于指针是变量, 我们可以通过改变它们的指向, 以间接访问不同的变量, 这给程序员带来灵活性, 也使程序代码编写得更为简洁和有效。 指针变量可出现在表达式中, 设:int x, y *px=&x; 指针变量px指向整数x, 则*px可出现在x能出现的任何地方。例如:y=*px+5; /* 表示把x的内容加5并赋给y */ y=+*px; /* px的内容加上1之后赋给y ,+*px相当于+(px) */ y=*px+; /* 相当于y=*px; px+ */ 地址运算 指针允许的运算方式有:1) 指针在一定条件下, 可进行比较, 这里所说的一定条件, 是指两个指针指向同一个对象才有意义, 例如两个指针变量p, q指向同一数组, 则, =,=, =等关系运算符都能正常进行。若p=q为真, 则表示p, q指向数组的同一元素; 若pq为真, 则表示p所指向的数组元素在q所指向的数组元素之前(对于指向数组元素的指针在下面将作详细讨论)。2) 指针和整数可进行加、减运算。设p是指向某一数组元素的指针, 开始时指向数组的第0号元素, 设n为一整数, 则: p+n 就表示指向数组的第n号元素(下标为n的元素)。 不论指针变量指向何种数据类型, 指针和整数进行加、减运算时, 编译程序总根据所指对象的数据长度对n放大 在一般微机上, char放大因子为1, int、short放大因子为2, long和float放大因子为4, double放大因子为8。3) 两个指针变量在一定条件下, 可进行减法运算。设p, q指向同一数组, 则p-q的绝对值表示p所指对象与q所指对象之间的元素个数。 其相减的结果遵守对象类型的字节长度进行缩小的规则。 5.1.2 指针和数组 指针和数组有着密切的关系, 任何能由数组下标完成的操作也都可用指针来实现, 但程序中使用指针可使代码更紧凑、更灵活。. 指向数组元素的指针 定义一个整型数组和一个指向整型的指针变量: int a10, *p; 和前面介绍过的方法相同, 可以使整型指针p指向数组中任何一个元素, 假定给出赋值运算 p=&a0; 此时, p指向数组中的第0号元素, 即a0, 指针变量p中包含了数组元素a0 的地址, 由于数组元素在内存中是连续存放的, 因此, 我们就可以通过指针变量p及其有关运算间接访问数组中的任何一个元素。 C51中, 数组名是数组的第0号元素的地址, 因此下面两个语句是等价的: p=&a0; p=a; 根据地址运算规则, a+1为a1的地址, a+i就为ai的地址。 下面我们用指针给出数组元素的地址和内容的几种表示形式。1) p+i和a+i均表示ai的地址, 或者讲, 它们均指向数组第i号元素, 即指向ai。2) *(p+i)和*(a+i)都表示p+i和a+i所指对象的内容, 即为ai。3) 指向数组元素的指针, 也可以表示成数组的形式, 也就是说, 它允许指针变量带下标, 如pi与*(p+i)等价。假若:p=a+5;则p2就相当于*(p+2), 由于p指向a5, 所以p2就相当于a7。而p-3就相当于*(p-3), 它表示a2。 . 指向二维数组的指针1 二维数组元素的地址 为了说明问题, 我们定义以下二维数组: int a34=0,1,2,3, 4,5,6,7, 8,9,10,11; a为二维数组名, 此数组有3行4列, 共12个元素。但也可这样来理解, 数组a由三个元素组成: a0, a1, a2,每个元素又是一个一维数组, 且都含有4个元素 (相当于4列), 例如, a0所代表的一维数组所包含的 4 个元素为a00, a01, a02, a03。如图5-1-5所示。 但从二维数组的角度来看, a代表二维数组的首地址, 当然也可看成是二维数组第0行的首地址。a+1就代表第1行的首地址, a+2就代表第2行的首地址。如果此二维数组的首地址为1000, 由于第0行有4个整型元素, 所以a+1为1008, a+2也就为1016,如图5-1-6所示 。既然我们把a0, a1, a2看成是一维数组名, 可以认为它们分别代表它们所对应的数组的首地址.a0代表第 0 行中第 0 列元素的地址,即&a00, a1是第1行中第0列元素的地址, 即&a10, 根据地址运算规则, a0+1即代表第0行第1列元素的地址, 即&a01, 一般而言, ai+j即代表第i行第j列元素的地址, 即&aij。 另外, 在二维数组中, 我们还可用指针的形式来表示各元素的地址。如前所述, a0与*(a+0)等价, a1与*(a+1)等价, 因此ai+j就与*(a+i)+j等价, 它表示数组元素aij的地址。 因此, 二维数组元素aij可表示成*(ai+j)或*(*(a+i)+j), 它们都与aij等价, 或者还可写成(*(a+i)j。 另外, 要补充说明一下, 如果你编写一个程序输出打印a和*a, 你可发现它们的值是相同的, 这是为什么呢? 我们可这样来理解: 首先, 为了说明问题, 我们把二维数组人为地看成由三个数组元素a0, a1, a2组成, 将a0, a1, a2看成是数组名它们又分别是由4个元素组成的一维数组。因此, a表示数组第 0行的地址, 而*a即为a0, 它是数组名, 当然还是地址, 它就是数组第0 行第0列元素的地址。 2 指向一个由n个元素所组成的数组指针在C51中, 可定义如下的指针变量:int (*p)3;指针p为指向一个由3个元素所组成的整型数组指针。在定义中, 圆括号是不能少的, 否则它是指针数组。这种数组的指针不同于前面介绍的整型指针, 当整型指针指向一个整型数组的元素时, 进行指针(地址)加1运算,表示指向数组的下一个元素, 此时地址值增加了2(因为放大因子为2), 而如上所定义的指向一个由3个元素组成的数组指针, 进行地址加1运算时, 其地址值增加了6(放大因子为23=6), 这种数组指针在C51中用得较少, 但在处理二维数组时, 还是很方便的。例如: int a34, (*p)4;p=a;开始时p指向二维数组第0行, 当进行p+1运算时, 根据地址运算规则, 此时放大因子为42=8, 所以此时正好指向二维数组的第1行。和二维数组元素地址计算的规则一样, *p+1指向a01, *(p+i)+j则指向数组元素aij。例5-1-1 利用指针输出二维数组中的元素。#includeint a3 4= 1,3,5,7,9,11,13,15, 17,19,21,23 ; main() int i,(*b)4; b=a+1; /* b指向二维数组的第1行, 此时*b0或 *b是a10 */ for(i=1;i=4;b=b0+2,i+)/* 修改b的指向, 每次增加2 */ printf(%d t,*b0); printf( n); for (i=0; i2; i+) b=a+i; /* 修改b的指向, 每次跳过二维数组的一行 */ printf(%d t,*(bi+1); printf ( n); 程序运行结果如下: 5.1.3 字符指针 在程序中如出现字符串常量,C51编译程序就给字符串常量按排一存贮区域, 这个区域是静态的, 在整个程序运行的过程中始终占用。 字符串常量的长度是指该字符串的字符个数, 但在按排存贮区域时, C 编译程序还自动给该字符串序列的末尾加上一个空字符0, 用来标志字符串的结束。 因此一个字符串常量所占的存贮区域的字节数总比它的字符个数多一个字节。C51中操作一个字符串常量的方法1) 把字符串常量存放在一个字符数组之中, 例如: char s=a string; 数组s共有9个元素所组成, 其中s8中的内容是0。实际上, 在字符数组定义的过程中, 编译程序直接把字符串复写到数组中, 即对数组s初始化。2) 用字符指针指向字符串, 然后通过字符指针来访问字符串存贮区域。当字符串常量在表达式中出现时, 根据数组的类型转换规则, 它被转换成字符指针。因此, 若我们定义了一字符指针cp:char *cp;于是可用:cp=a string; 使cp指向字符串常量中的第0号字符a, 如图5-1-8所示。 cp a s t r i n g 0 图5-1-8 指针指向字符串以后我们可通过cp来访问这一存贮区域, 如*cp或cp0就是字符a, 而cpi或 *(cp+i)就相当于字符串的第i号字符, 但企图通过指针来修改字符串常量的行为是没有意义的。 5.1.4 指针数组指针数组的定义格式为: 类型标识 *数组名整型常量表达式;例如: int *a10;指针数组和一般数组一样, 允许指针数组在定义时初始化。指针数组 的每个元素是指针变量, 它只能存放地址。所以对指向字符串的指针数组在说明赋初值时, 是把存放字符串的首地址赋给指针数组的对应元素 。例5-1-2 打印1月至12月的月名。#include#includeint a3 4= 1,3,5,7, 9,11,13,15, 17,19,21,23 ; char *month_name(int n) static char *name= Illegal month, January, February, March, April, May, June, July, August, September, October, November, December ; return(n12)?name0:namen); main() int i; for(i=0; i13; i+) printf(%sn, month_name(i); getchar(); 程序运行后输出结果如图所示。5.1.5 指针作为函数的形参指针变量,既可以作为函数的形参,也可以作函数的实参。指针变量作实参时,与普通变量一样,也是“值传递”,即将指针变量的值(一个地址)传递给被调用函数的形参(必须是一个指针变量)。被调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。例5-1-3 输入2个整数,按升序(从小到大排序)输出。要求实参为指针变量。#include#includevoid exchange(int *pointer1, int *pointer2) int temp; temp=*pointer1, *pointer1=*pointer2, *pointer2=temp; void main(void) int num1,num2; int *num1_p=&num1, *num2_p=&num2; /*定义并初始化指针变量num1_p和 num2_p */ printf(n Input the first number: ); scanf(%d,num1_p); printf(n Input the second number: ); scanf(%d,num2_p); printf(n num1=%d, num2=%d , num1, num2);/*输出num1和num2的初始值*/ if( *num1_p *num2_p ) /* *num1_p *num2_p (即num1num2)*/ exchange(num1_p, num2_p); /*指针变量作实参,调用exchange()函数*/ printf(n min=%d, max=%d , num1, num2); /*输出排序后的num1和num2的值*/ while(1); 程序运行输出结果如图 5.2 结构体结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。结构中可以使用不同的数据类型。 5.2.1结构变量的定义 在C51中, 结构也是一种数据类型, 可以使用结构变量, 因此,象其它类型的变量一样, 在使用结构变量时要先对其定义。 定义一个结构的一般形式为:struct 结构名 成员表列; ; 成员表由若干个成员组成, 每个成员都是该结构的一个组成部分 对每个成员也必须作类型说明,其形式为:类型说明符 成员名;成员名的命名应符合标识符的书写规定。例如:struct stu int num; char name20; char sex; float score;在这个结构定义中,结构名为stu,该结构由4个成员组成。 第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应注意在括号后的分号是不可少的。 结构定义之后,即可进行变量说明。 凡说明为结构stu的变量都由上述4个成员组成。 定义结构变量的一般格式为: struct 结构名 类型 变量名; 类型 变量名; . 结构变量;结构名是结构的标识符,不是变量名。构成结构的每一个类型变量称为结构成员, 它象数组的元素一样, 但数组中元素是以下标来访问的, 而结构是按变量名字来访问成员的。结构的成员类型为五种基本数据类型(整型、浮点型、字符型、指针型和无值型),也可以是结构类型。 struct string char name8; int age; char sex2; char depart20; float wage1, wage2, wage3, wage4, wage5; person;这个例子定义了一个结构名为string的结构变量person,如果省略变量名person, 则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义时上例变成:struct string char name8; int age; char sex2; char depart20; float wage1, wage2, wage3, wage4, wage5; ; struct string person; 如果需要定义多个具有相同形式的结构变量时用这种方法比较方便, 它先作结构说明, 再用结构名来定义变量。例如: struct string Tianyr, Liuqi, .;如果省略结构名, 则称之为无名结构, 这种情况常常出现在函数内部, 用这种结构时前面的例子变成: struct char name8; int age; char sex2; char depart20; float wage1, wage2, wage3, wage4, wage5; Tianyr, Liuqi; 5.2.2 结构变量的引用结构是一个新的数据类型, 因此结构变量也可以象其它类型的变量一样赋值、运算, 不同的是结构变量以成员作为基本变量。结构成员的表示方式为: 结构变量.成员名 如果将结构变量.成员名看成一个整体, 则这个整体的数据类型与结构中该成员的数据类型相同, 这样就可象前面所讲的变量那样使用。例5-2-1定义一个结构体变量,用来存储和显示学生信息。#include struct date /*日期结构类型:由年、月、日三项组成*/ int year; int month; int day; ;struct std_info/*学生信息结构类型:由学号、姓名、性别和生日共4项组成*/ char no7; char name9; char sex3; struct date birthday; ;/*定义并初始化一个外部结构变量student */struct std_info student= 000102,张华,男,1980,9,20;void main(void) /*打印表头*/ printf(No. Name Sex Birthdayn); /*输出三个学生的基本情况*/ printf(%-7s,student.no); printf(%-9s,); printf(%-4s,student.sex); printf(%d-%d-%dn,student.birthday.year, student.birthday.month,student.birthday.day); while(1); 5.2.3 结构数组和结构指针结构是一种新的数据类型, 同样可以有结构数组和结构指针。结构数组结构数组就是具有相同结构类型的变量集合 假如要定义一个班级40个同学的姓名、性别、年龄和住址, 可以定义成一个结构数组。如下所示: struct char name8; char sex2; int age; char addr40; student40;也可定义为: struct string char name8; char sex2; int age; char addr40; ; struct string student40; 需要指出的是结构数组成员的访问是以数组元素为结构变量的, 其形式为: 结构数组元素.成员名例如: student30.age实际上结构数组相当于一个二维构造, 第一维是结构数组元素, 每个元素是一个结构变量, 第二维是结构成员。结构数组的成员也可以是数组变量。例如: struct a int m35; float f; char s20; y4; 为了访问结构a中结构变量y2的这个变量, 可写成:y2.m14 例 5-2-2定义一个结构数组student,用于存储和显示三个学生的基本情况。#include struct date /*日期结构类型:由年、月、日三项组成*/ int year; int month; int day; ;struct std_info/*学生信息结构类型:由学号、姓名、性别和生日共4项组成*/ char no7; char name9; char sex3; struct date birthday; ;/*定义并初始化一个外部结构数组student3 */struct std_info student3= 000102,张华,男,1980,9,20, 000105,李四,男,1980,8,15, 000112,王五,女,1980,3,10 ;void main(void) int i; /*打印表头*/ printf(No. Name Sex Birthdayn); /*输出三个学生的基本情况*/ for(i=0; i结构成员 其中“-”是两个符号“-”和“”的组合, 好象一个箭头指向结构成员。 例如要给上面定义的结构中name和age赋值, 可以用下面语句: strcpy(student-name, Lu G.C); student-age=18; student-name就是(*student).name的缩写形式。需要指出的是结构指针是指向结构的一个指针, 即结构中第一个成员的首地址, 因此在使用之前应该对结构指针初始化, 即分配整个结构长度的字节空间, 这可用下面函数完成, 仍以上例来说明如下: student=(struct string*)malloc(size of (struct string); size of (struct string)自动求取string结构的字节长度, malloc() 函数定义了一个大小为结构长度的内存区域, 然后将其诈地址作为结构指针返回。 注意:1) 结构作为一种数据类型, 因此定义的结构变量或结构指针变量同样有局部变量和全程变量, 视定义的位置而定。2) 结构变量名不是指向该结构的地址, 这与数组名的含义不同, 因此若需要求结构中第一个成员的首地址应该是&结构变量名。 例5-2-3 利用结构指针改写5-2-1程序,输出学生信息。/*功能:利用结构指针,存储和显示三个学生的基本情况*/#include #include struct date /*日期结构类型:由年、月、日三项组成*/ int year; int month; int day; ;struct std_info/*学生信息结构类型:由学号、姓名、性别和生日共4项组成*/ char no7; char name9; char sex3; struct date birthday; ;/*定义并初始化一个外部结构数组student3 */struct std_info student= 000102,张华,男,1980,9,20;void main(void) struct std_info *p_std=&student;/*定义指针变量p_std,并使其指向结构变量student */ #ifndef MONITOR51 SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 221; /* TH1: reload value for 1200 baud 16MHz */ TR1 = 1; /* TR1: timer 1 run */ TI = 1; /* TI: set TI to send first char of UART */ #endif printf(No: %sn, p_std-no); printf(Name: %sn, p_std-name); printf(Sex: %sn, p_std-sex); printf(Birthday: %d-%d-%dn, p_std-birthday.year, p_std-birthday.month, p_std-birthday.day); while(1); 程序运行结果如图5-2-3所示。 结构的复杂形式1嵌套结构嵌套结构是指在一个结构成员中可以包括其它一个结构, C51 允许这种嵌套。 例如: 下面是一个有嵌套的结构 :struct string char name8; int age; struct addr address; student; 其中: addr为另一个结构的结构名, 必须在要先进行说明, 即:struct addr char city20; unsigned lon zipcode; char tel14; 如果要给student结构中成员address结构中的zipcode赋值, 则可写成:student.address.zipcode=200001;每个结构成员名从最外层直到最内层逐个被列出, 即嵌套式结构成员的表达方式是: 结构变量名.嵌套结构变量名.结构成员名 其中: 嵌套结构可以有很多, 结构成员名为最内层结构中不是结构的成员名。2 位结构位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构比按位运算符更加方便。位结构定义的一般形式为: struct位结构名 数据类型 变量名: 整型常数; 数据类型 变量名: 整型常数; 位结构变量; 其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整数, 范围是015, 表示二进制位的个数, 即表示有多少位。变量名是选择项, 可以不命名, 这样规定是为了排列需要。例如: 下面定义了一个位结构。 struct unsigned incon: 8; /*incon占用低字节的07共8位*/ unsigned txcolor: 4;/*txcolor占用高字节的03位共4位*/ unsigned bgcolor: 3;/*bgcolor占用高字节的46位共3位*/ unsigned blink: 1; /*blink占用高字节的第7位*/ ch; 位结构成员的访问与结构成员的访问相同。例如: 访问上例位结构中的bgcolor成员可写成: ch.bgcolor 1) 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。2) 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,如果是指针, 其成员访问方式同结构指针。3)位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字节。4)位结构成员可以与其它结构成员一起使用。例如: struct info char name8; int age; struct addr address; float pay; unsigned state: 1; unsigned pay: 1; workers;5.3 联合体5.3.1联合变量的定义联合也是一种新的数据类型,
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。