锟节撅拷锟斤拷 群锟斤拷锟斤拷锟饺猴拷锟斤拷锟斤拷莸锟斤拷锟街PPT课件_第1页
锟节撅拷锟斤拷 群锟斤拷锟斤拷锟饺猴拷锟斤拷锟斤拷莸锟斤拷锟街PPT课件_第2页
锟节撅拷锟斤拷 群锟斤拷锟斤拷锟饺猴拷锟斤拷锟斤拷莸锟斤拷锟街PPT课件_第3页
锟节撅拷锟斤拷 群锟斤拷锟斤拷锟饺猴拷锟斤拷锟斤拷莸锟斤拷锟街PPT课件_第4页
锟节撅拷锟斤拷 群锟斤拷锟斤拷锟饺猴拷锟斤拷锟斤拷莸锟斤拷锟街PPT课件_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、引言 在C+中,有基本数据类型和自定义数据类型 基本类型是C+编译系统预定义的 自定义类型是由多个基本类型或自定义类型的元素组成的,称为群体数据 对于群体数据,仅有系统预定义的操作是不够的,在很多情况下,需要设计与某些具体问题相关的特殊操作,并按面向对象的方法将数据与操作封装起来,这就是群体类第1页/共88页引言 群体分类两类: 线性群体:线性群体中的元素按位置排列有序,数组是典型例子 非线性群体:非线性群体不用位置顺序来标识元素,如企业中职员的上下级关系,家族谱信息 关于群体数据的组织是属于数据结构的范畴。在此只介绍两类常用算法:排序和查找方法 排序:称为分类或整理,是将一个无序序调整为有序

2、的过程。在排序过程中需要完成两种基本操作: 1、比较两个数的大小; 2、调整元素在序列中的位置。 查找:是在一个序列中按照某种方式找出需要的特定数据元素的过程。查字典就是一个典型例子第2页/共88页本章主要内容 模板 群体类 群体数据的组织第3页/共88页第一部分模板 C+最重要的特性之一就是代码重用,为实现代码重用,代码必须具有通用性。 通用代码需要不受数据类型的影响,并且可以自动适应数据类型的变化。这种程序设计类型称为参数化程序设计。 模板是C+支持参数化程序设计的工具,通过它可以实现参数的多态性 参数的多态性:是指将程序所处理的对象的类型参数化,使得一段程序可以用于处理多种不同类型的对象

3、 函数模板 类模板第4页/共88页函数模板 函数重载通常是对于不同的数据类型完成类似的操作。很多情况下,一个算法是可以处理多种数据类型的。但是用函数实现算法时,即使设计为重载函数也只是使用相同的函数名,函数体仍然要分别定义int abs(int x) return x0?-x:x;double abs(double x) return x0? -x:x;上述函数只是参数类型不同,功能完全一样。类似的情况,如能写一段上述函数只是参数类型不同,功能完全一样。类似的情况,如能写一段通用的代码,则可进一步提高代码复用质量,提高软件开发效率,这也通用的代码,则可进一步提高代码复用质量,提高软件开发效率,

4、这也是使用函数模板的原因。是使用函数模板的原因。第5页/共88页函数模板 函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。 声明方法:template /表示类型参数表类型名 函数名(参数表)函数体的定义/函数模板中函数体的定义与定义其它函数类似 函 数 模 板第6页/共88页求绝对值函数的模板#includeusing namespace std;templateT abs(T x) return x0?-x:x; int main() int n=-5; double d=-5.5; coutabs(n)endl; coutabs(d)endl;

5、 函 数 模 板运行结果:运行结果:55.5第7页/共88页求绝对值函数的模板分析 编译器从调用abs()时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。 当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:int abs(int x) return x0?-x:x; 函 数 模 板第8页/共88页函数模板的实例 #include using namespace std; template void outputArray(const T *P_array,const int count) for(

6、int i=0;icount;i+)coutP_arrayi;coutendl;int main()const int aCount=8,bCout=8,cCount=20;int aArrayaCount=1,2,3,4,5,6,7,8;double bArraybCount=1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8;char cArraycCount=welcome to see you;cout a Array contains :endl;outputArray(aArray,aCount);cout b Array contains :endl;outputAr

7、ray(bArray,bCount);cout c Array contains :endl;outputArray(cArray,cCount);第9页/共88页函数模板的实例讲解 函数模板中声明了类型参数T,表示一种抽象的类型。当编译器检测到程序中调用函数模板outputArray时,便用outputArray的第一个实参的类型替换掉整个模板定义中的T,并建立用来输出指定类型数组的一个完整的函数,再编译此新建的函数 模板函数与重载是密切相关的。从函数模板产生的相关函数都是同名的,编译器用重载的解决方法调用相应的函数第10页/共88页类模板的作用使用类模板使用户可以为类声明一种模式,使得类中

8、的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。类是对一组对象的公共性质的抽象,而类模板则是对不同类的公共性质的抽象,因此,类模板属于更高层次的抽象。由于类模板需要一种或多种类型参数,所以类模板也常 常称为参数化类类 模 板第11页/共88页类模板的声明类模板:template class 类名类成员声明如果需要在类模板以外定义其成员函数,则要采用以下的形式:template 类型名 类名:函数名(参数表)类 模 板第12页/共88页类模板的声明 “模板参数表”由用逗号分隔的若干类型标识符或常量表达式构成,其内容包括: 1、class(

9、或typename)标识符,指明可以接受一个类型参数 2、类型说明符 标识符,指明可以接受一个由“类型说明符”所规定类型的常量作为参数 当“模板参数表”同时包括上述多项内容时,各项内容以逗号分隔。应注意的是:模板类的成员函数必须是函数模板。第13页/共88页类模板对象的声明 一个类模板声明自身不产生代码,它说明了类的一个家族。只有当被其它代码引用时,模板才根据引用的需要产生代码。 使用一个模板类来建立对象时,应按如下形式声明: 模板 对象名1,第14页/共88页例9-2 类模板应用举例#include #include using namespace std;/ 结构体Studentstruc

10、t Student int id; /学号 float gpa; /平均分; 类 模 板声明一个实现任意类型数据存取的类模板声明一个实现任意类型数据存取的类模板Store,然后通过具体然后通过具体数据类型参数对类模板进行实例化,生成类,然后灰再被实例数据类型参数对类模板进行实例化,生成类,然后灰再被实例化具体对象化具体对象第15页/共88页template /类模板:实现对任意类型数据进行存取class Store private: T item; / 用于存放任意类型的数据 int haveValue; / 用于标记item是否已被存入内容 public: Store(void); / 默认

11、形式(无形参)的构造函数 T GetElem(void); /提取数据函数 void PutElem(T x); /存入数据函数;/ 默认形式构造函数的实现template Store:Store(void): haveValue(0) 16第16页/共88页template / 提取数据函数的实现T Store:GetElem(void) / 如果试图提取未初始化的数据,则终止程序 if (haveValue = 0) cout No item present! endl; exit(1); return item; / 返回item中存放的数据 template / 存入数据函数的实现 v

12、oid Store:PutElem(T x) haveValue+; / 将haveValue 置为 TRUE,表示item中已存入数值 item = x; / 将x值存入item17第17页/共88页int main() Student g= 1000, 23; Store S1, S2; Store S3; Store D; S1.PutElem(3); S2.PutElem(-7); cout S1.GetElem() S2.GetElem() endl; S3.PutElem(g); cout The student id is S3.GetElem().id endl; cout R

13、etrieving object D ;cout D.GetElem() endl; /输出对象D的数据成员/ 由于D未经初始化,在执行函数D.GetElement()时出错18第18页/共88页第二部分群体数据 线性群体 线性群体的概念 直接访问群体-数组类 顺序访问群体-链表类 栈类 队列类第19页/共88页群体的概念群体是指由多个数据元素组成的集合体。群体可以分为两个大类:线性群体和非线性群体。 线性群体中的元素按位置排列有序,可以区分为第一个元素、第二个元素等非线性群体不用位置顺序来标识元素。第20页/共88页线性群体的概念线性群体中的元素次序与其位置关系是对应的。在线性群体中,又可按

14、照访问元素的不同方法分为直接访问、顺序访问和索引访问。在本章我们只介绍直接访问和顺序访问。第一个元素第二个元素第三个元素最后一个元素第21页/共88页线性群体的概念还有两种特殊的线性群体-栈和队列。栈:只能从一端访问的线性群体,可以访问的这一端称为栈顶,另一端称栈底。对栈顶位置的标记称为栈顶指针,对栈底位置的标记称为栈底指针。具有“后进先出”LIFO的特性(如函数调用)队列:是只能向一端添加元素,从另一端删除元素的线性群体,可以添加元素的一端称为队尾,可以删除元素的一头称为队头。具有“先进先出”FIFO特性第22页/共88页数组 静态数组是具有固定元素个数的群体,其中的元素可以通过下标直接访问

15、。 缺点:大小在编译时就已经确定,在运行时无法修改。 动态数组由一系列位置连续的,任意数量相同类型的元素组成。 优点:其元素个数可在程序运行时改变。 动态数组类模板:例9-3(9_3.h)直接访问的线性群体第23页/共88页#ifndef ARRAY_CLASS#define ARRAY_CLASSusing namespace std;#include #include #ifndef NULLconst int NULL = 0;#endif / NULLenum ErrorType invalidArraySize, memoryAllocationError, indexOutOfRa

16、nge ;char *errorMsg = Invalid array size, Memory allocation error, Invalid index: ;动态数组类模板程序24第24页/共88页template class Array private: T* alist; int size; void Error(ErrorType error,int badIndex=0) const; public: Array(int sz = 50); Array(const Array& A); Array(void); Array& operator= (const Array& rh

17、s); T& operator(int i); operator T* (void) const; int ListSize(void) const; void Resize(int sz); ;25第25页/共88页数组类模板的构造函数/ 构造函数template Array:Array(int sz) if (sz = 0) /sz为数组大小(元素个数),若小于0,则输出错误信息 Error(invalidArraySize); size = sz; / 将元素个数赋值给变量size alist = new Tsize; /动态分配size个T类型的元素空间 if (alist = NUL

18、L) /如果分配内存不成功,输出错误信息 Error(memoryAllocationError);直接访问的线性群体第26页/共88页数组类的拷贝构造函数template Array:Array(const Array& X) int n = X.size; size = n; alist = new Tn; if (alist = NULL) Error(memoryAllocationError); T* srcptr = X.alist; / X.alist是对象X的数组首地址 T* destptr = alist; / alist是本对象中的数组首地址 while (n-) / 逐个

19、复制数组元素 *destptr+ = *srcptr+;直接访问的线性群体第27页/共88页浅拷贝 alist sizeAA的数组元素占用的内存拷贝前 alist sizeAA的数组元素占用的内存拷贝后 alist sizeBint main() Array A(10); . Array B(A); .template Array:Array( const Array& X) size = X.size; alist= X.alist;第28页/共88页深拷贝 alist sizeAA的数组元素占用的内存拷贝前 alist sizeAA的数组元素占用的内存拷贝后 alist sizeBB的数组

20、元素占用的内存第29页/共88页数组类的重载=运算符函数template Array& Array:operator= (const Array& rhs) int n = rhs.size; if (size != n) delete alist; alist = new Tn; if (alist = NULL) Error(memoryAllocationError); size = n; T* destptr = alist; T* srcptr = rhs.alist; while (n-) *destptr+ = *srcptr+; return *this;直接访问的线性群体第3

21、0页/共88页数组类的重载下标操作符函数template T& Array:operator (int n) / 检查下标是否越界 if (n size-1) Error(indexOutOfRange,n); / 返回下标为n的数组元素 return alistn;直接访问的线性群体第31页/共88页为什么有的函数返回引用 如果一个函数的返回值是一个对象的值,它就被认为是一个常量,不能成为左值。 如果返回值为引用。由于引用是对象的别名,所以通过引用当然可以改变对象的值。直接访问的线性群体第32页/共88页重载指针转换操作符template Array:operator T* (void) c

22、onst / 返回当前对象中私有数组的首地址 return alist;直接访问的线性群体第33页/共88页指针转换运算符的作用#include using namespace std;int main() int a10; void read(int *p, int n); read(a, 10);void read(int *p, int n) for (int i=0; ipi;int main() Array a(10); void read(int *p, n); read(a, 10);void read(int *p, int n) for (int i=0; ipi;直接访问的

23、线性群体第34页/共88页Array类的应用 例9-4求范围2N中的质数,N在程序运行时由键盘输入。直接访问的线性群体第35页/共88页#include #include #include 9_3.husing namespace std;int main() Array A(10); int n; int primecount = 0, i, j; cout = 2 as upper limit for prime numbers: ; cin n; Aprimecount+ = 2; / 2是一个质数 for(i = 3; i n; i+) if (primecount = A.ListS

24、ize() A.Resize(primecount + 10); if (i % 2 = 0) continue; j = 3; while (j i/2) Aprimecount+ = i; for (i = 0; i primecount; i+) cout setw(5) Ai; if (i+1) % 10 = 0) cout endl; cout endl;36第36页/共88页链表 链表是一种动态数据结构,可以用来表示顺序访问的线性群体。 链表是由系列结点组成的,结点可以在运行时动态生成。 每一个结点包括数据域和指向链表中下一个结点的指针(即下一个结点的地址)。如果链表每个结点中只有

25、一个指向后继结点的指针,则该链表称为单链表。顺序访问的线性群体第37页/共88页单链表 data1 data2 data3 datan NULLheadrear顺序访问的线性群体第38页/共88页单链表的结点类模板template class Node private: Node *next; public: T data; Node(const T& item,Node* ptrnext = NULL); void InsertAfter(Node *p); Node *DeleteAfter(void); Node *NextNode(void) const; 顺序访问的线性群体第39页/

26、共88页在结点之后插入一个结点 data1 data2 p datatemplate void Node:InsertAfter(Node *p) /p节点指针域指向当前节点的后继节点节点指针域指向当前节点的后继节点 p-next = next; next = p; /当前节点的指针域指向当前节点的指针域指向p 顺序访问的线性群体第40页/共88页 删除结点之后的结点顺序访问的线性群体 data1 data2 data3Node *Node:DeleteAfter(void) Node *tempPtr = next; if (next = NULL) return NULL; next =

27、tempPtr-next; return tempPtr; tempPtr第41页/共88页链表的基本操作 生成结点 插入结点 查找结点 删除结点 遍历链表 清空链表顺序访问的线性群体第42页/共88页链表类模板(例9-6)/9_6.h#ifndef LINKEDLIST_CLASS#define LINKEDLIST_CLASS#include #include using namespace std;#ifndef NULLconst int NULL = 0;#endif / NULL#include 9_5.h顺序访问的线性群体第43页/共88页template class Linke

28、dList private: Node *front, *rear; Node *prevPtr, *currPtr; int size; int position; Node *GetNode(const T& item, Node *ptrNext=NULL); void FreeNode(Node *p); void CopyList(const LinkedList& L);44第44页/共88页 public: LinkedList(void); LinkedList(const LinkedList& L); LinkedList(void); LinkedList& operat

29、or= (const LinkedList& L); int ListSize(void) const; int ListEmpty(void) const; void Reset(int pos = 0); void Next(void); int EndOfList(void) const; int CurrentPosition(void) const; 45第45页/共88页 void InsertFront(const T& item); void InsertRear(const T& item); void InsertAt(const T& item); void Insert

30、After(const T& item); T DeleteFront(void); void DeleteAt(void); T& Data(void); void ClearList(void);#endif / LINKEDLIST_CLASS46第46页/共88页链表类应用举例(例9-7)#include using namespace std;#include 9_6.h#include 9_6.cppint main() LinkedList Link; int i, key, item; for (i=0;i item; Link.InsertFront(item);顺序访问的线

31、性群体第47页/共88页 cout List: ; Link.Reset(); while(!Link.EndOfList() cout Link.Data() ; Link.Next(); cout endl; cout key; Link.Reset();48第48页/共88页 while (!Link.EndOfList() if(Link.Data() = key) Link.DeleteAt(); Link.Next(); cout List: ; Link.Reset(); while(!Link.EndOfList() cout Link.Data() ; Link.Next()

32、; cout endl;49第49页/共88页特殊的线性群体栈栈是只能从一端访问的线性群体,可以访问的这一端称栈顶,另一端称栈底。ana2a1入栈出栈栈顶栈底特殊的线性群体栈第50页/共88页栈的应用举例函数调用特殊的线性群体栈main调fun(参数)结束fun(参数)返回参数当前现场返回地址入栈当前现场返回地址出栈参数出栈当前现场 返回地址第51页/共88页栈的应用举例表达式处理ba/a/b+c*d(a)t1+a/b+c*dt1=a/b(b)dct1*+a/b+c*d(c)t3a/b+c*dt3=t1+t2(e)t2t1+a/b+c*dt2=c*d(d)特殊的线性群体栈第52页/共88页栈的

33、基本状态 栈空 栈中没有元素 栈满 栈中元素个数达到上限 一般状态 栈中有元素,但未达到栈满状态特殊的线性群体栈第53页/共88页栈顶ana1a0入栈出栈数组下标maxn10一般状态栈顶入栈出栈数组下标初始状态(栈空)maxn10栈顶amaxana1a0入栈出栈数组下标maxn10栈满状态54第54页/共88页栈的基本操作 初始化 入栈 出栈 清空栈 访问栈顶元素 检测栈的状态(满、空)特殊的线性群体栈第55页/共88页栈类模板(例9-8)特殊的线性群体栈/9-8.h#ifndef STACK_CLASS#define STACK_CLASS#include #include using na

34、mespace std;const int MaxStackSize = 50; template class Stack private: T stacklistMaxStackSize; int top; public: Stack (void); void Push (const T& item); T Pop (void); void ClearStack(void); T Peek (void) const; int StackEmpty(void) const; int StackFull(void) const;/类的实现略第56页/共88页栈的应用 例9.9 一个简单的整数计算

35、器实现一个简单的整数计算器,能够进行加、减、乘、除和乘方运算。使用时算式采用后缀输入法,每个操作数、操作符之间都以空白符分隔。例如,若要计算3+5则输入3 5 +。乘方运算符用表示。每次运算在前次结果基础上进行,若要将前次运算结果清除,可键入c。当键入q时程序结束。 9-9.h 9-9.cpp特殊的线性群体栈第57页/共88页/9_9.h#include #include #include #include using namespace std;enum Boolean False, True;#include 9_8.h class Calculator private: Stack S;

36、 void Enter(int num); Boolean GetTwoOperands(int& opnd1, int& opnd2); void Compute(char op); public: void Run(void); void Clear(void); ;58第58页/共88页void Calculator:Enter(int num) S.Push(num); Boolean Calculator:GetTwoOperands(int& opnd1, int& opnd2) if (S.StackEmpty() cerr Missing operand! endl; retu

37、rn False; opnd1 = S.Pop(); if (S.StackEmpty() cerr Missing operand! endl; return False; opnd2 = S.Pop(); return True;59第59页/共88页void Calculator:Compute(char op) Boolean result; int operand1, operand2;result = GetTwoOperands(operand1, operand2); if (result) switch(op) case +: S.Push(operand2+operand1

38、); break; case -: S.Push(operand2-operand1); break; case *: S.Push(operand2*operand1); break; case /: if (operand1 = 0) cerr Divide by 0! endl; S.ClearStack(); else S.Push(operand2/operand1); break; case : S.Push(pow(operand2,operand1); break; cout=S.Peek() c, *c != q) switch(*c) case c: S.ClearStac

39、k(); break; case -: if (strlen(c)1) Enter(atoi(c); else Compute(*c); break; case +: case *: case /: case : Compute(*c); break; default: Enter(atoi(c); break; 61第61页/共88页void Calculator:Clear(void) S.ClearStack(); /9_9.cpp#include 9-9.hint main() Calculator CALC; CALC.Run();62第62页/共88页特殊的线性群体队列队列是只能向

40、一端添加元素,从另一端删除元素的线性群体a1 a2an-1 an队头队尾入队出队a0第63页/共88页队列的基本状态 队空 队列中没有元素 队满 队列中元素个数达到上限 一般状态 队列中有元素,但未达到队满状态特殊的线性群体队列第64页/共88页a0 a1an-1 an队头队尾入队出队数组下标 0 1 n-1 n max(一般状态)队头队尾入队出队数组下标 0 1 n-1 n max(队空状态) a0 a1 an-1 an amax队头队尾入队出队数组下标 0 1 n-1 n max(队满状态)元素移动方向元素移动方向65第65页/共88页循环队列在想象中将数组弯曲成环形,元素出队时,后继元素

41、不移动,每当队尾达到数组最后一个元素时,便再回到数组开头。特殊的线性群体队列第66页/共88页1234m-1m-2m-30amam+1am+2a3队头队尾a4am-2am-3am-1队满状态 元素个数=m1234m-1m-2m-30队尾队头队空状态 元素个数=0队尾1234m-1m-2m-30a0a1a2a3队头一般状态67第67页/共88页例9-10 队列类模板特殊的线性群体队列#ifndef QUEUE_CLASS#define QUEUE_CLASS#include #include using namespace std;const int MaxQSize = 50; templat

42、e class Queue private: int front, rear, count; T qlistMaxQSize; public: Queue (void); void QInsert(const T& item); T QDelete(void); void ClearQueue(void); T QFront(void) const; int QLength(void) const; int QEmpty(void) const; int QFull(void) const; ;/成员函数的实现略第68页/共88页第三部分群体数据的组织插入排序选择排序交换排序顺序查找折半查找第

43、69页/共88页排序(sorting) 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。 数据元素:数据的基本单位。在计算机中通常作为一个整体进行考虑。一个数据元素可由若干数据项组成。 关键字:数据元素中某个数据项的值,用它可以标识(识别)一个数据元素。 在排序过程中需要完成两种基本操作: 比较两个数的大小 调整元素在序列中的位置群体数据的组织第70页/共88页内部排序与外部排序 内部排序:待排序的数据元素存放在计算机内存中进行的排序过程。 外部排序:待排序的数据元素数量很大,以致内存存中一次不能容纳全部数据,在排序过程中尚需对外存进

44、行访问的排序过程。群体数据的组织第71页/共88页内部排序方法 插入排序 选择排序 交换排序群体数据的组织第72页/共88页插入排序的基本思想 每一步将一个待排序元素按其关键字值的大小插入到已排序序列的适当位置上,直到待排序元素插入完为止。初始状态: 5 4 10 20 12 3插入操作:1 4 4 5 10 20 12 32 10 4 5 10 20 12 33 20 4 5 10 20 12 34 12 4 5 10 12 20 35 3 3 4 5 10 12 20第73页/共88页直接插入排序 在插入排序过程中,由于寻找插入位置的方法不同又可以分为不同的插入排序算法,这里我们只介绍最简

45、单的直接插入排序算法。 例9-11 直接插入排序函数模板(9_11.h)群体数据的组织第74页/共88页template void InsertionSort(T A, int n) int i, j; T temp; for (i = 1; i 0 & temp Aj-1) Aj = Aj-1; j-; Aj = temp; 直接插入排序函数模板(9_11.h)75第75页/共88页选择排序的基本思想每次从待排序序列中选择一个关键字最小的元素,(当需要按关键字升序排列时),顺序排在已排序序列的最后,直至全部排完。5 4 10 20 12 3初始状态:3 4 10 20 12 53 4 10

46、20 12 5第 i 次选择后,将选出的那个记录与第 i 个记录做交换。3 4 5 20 12 10. .第76页/共88页直接选择排序 在选择类排序方法中,从待排序序列中选择元素的方法不同,又分为不同的选择排序方法,其中最简单的是通过顺序比较找出待排序序列中的最小元素,称为直接选择排序。 例9-12 直接选择排序函数模板(9-12.h)群体数据的组织第77页/共88页template void Swap (T &x, T &y) T temp; temp = x; x = y; y = temp;template void SelectionSort(T A, int n) int smallIndex; int i, j; for (i = 0; i n-1; i+) smallIndex = i; for (j = i+1; j n; j+) if (Aj AsmallIndex) smallIndex = j; Swap(Ai, Asmall

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论