数据结构家谱管理系统_第1页
数据结构家谱管理系统_第2页
数据结构家谱管理系统_第3页
数据结构家谱管理系统_第4页
数据结构家谱管理系统_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

精品文档精心整理PAGE精品文档可编辑的精品文档精品文档精心整理精品文档可编辑的精品文档《项目实训二》项目名称__家谱管理系统__ 姓名_____________ 班级_________________ 学号__________________ 指导教师______________2018.1问题描述:家谱用于记录某家族历代家族成员的情况与关系。现编制一个家谱资料管理系统,实现对一个家族所有的资料进行收集整理。实现对家庭成员信息的建立、查找、插入、修改、增加、删除、更新、统计等等功能。目的和要求:目的:能根据具体问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。提高程序设计和调试能力。通过上机学习,验证自己设计的算法的正确性。学会有效利用基本调试方法。初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。培养根据选题需要选择学习书籍,查阅文献资料的自学能力。要求:用于记录某家族历代家族成员的情况与关系。现编制一个家谱资料管理系统,实现对一个家族所有的资料进行收集整理。支持对家谱的增加,删除,更新,统计等。软件环境:MicrosoftVisualStudio2010流程设计:开始M开始Main函数Menu函数FamilyTree函数Getroot函数Case1Case2Case3Case4Case5Case6Case7Case8Case9Case10defeault结束Creat函数函数递归调用Menu函数PreOrder函数函数InOrder函数函数PostOrder函数函数Generation函数函数NumberOfPeople函数函数LifeNum函数函数Message函数函数AddNewPeople函数数DeletePeople函数SetNewName函数FindChild函数SaveToFile函数FileToFamilyTree函数递归调用递归调用递归调用PrintMessage函数函数SetNode函数函数函数PreFindFather函数函数PreFindBrother函数函数PreFindFather函数函数PreFindBrother函数函数PrintMessage函数函数模块划分:统计模块统计家族总人数、健在人数、几代人主要函数:intGeneration(Node*root);//这个家族共有几代人intNumberOfPeople();//家族的总人数intLifeNum();//健在人数实现方法:静态成员变量实现结果:更新模块创建家谱、增加成员、删除成员、成员改名主要函数:Node*Creat();//构造函数调用voidAddNewPeople(Node*root,stringFatherName,stringNAme);//增加新的家族成员intDeletePeople(Node*root,stringFatherName,stringDeletepeople);//删除家族成员intSetNewName(Node*root,stringNAme,stringNewName);//更改姓名实现方法:创建家谱和成员改名主要通过递归调用;增加成员和删除成员主要通过栈的非递归调用。实现结果:查询模块查询成员详细信息、查询成员的孩子以及孩子的详细信息主要函数:intMessage(Node*root,stringName);//显示该成员的基本信息intFindChild(Node*root,stringNAme);//显示孩子信息实现方法:通过递归调用,找到成员,输出相应的信息实现结果:显示模块前序、中序、后序遍历家谱主要函数:voidPreOrder(Node*root);//前序递归遍历输出家谱voidInOrder(Node*root);//中序递归遍历输出家谱voidPostOrder(Node*root);//后序递归遍历输出家谱实现方法:递归遍历实现结果:文件模块保存到文件、从文件读取主要函数:voidSaveToFile(Node*root);//保存到文件voidFileToFamilyTree(Node*root);//从文件中读取实现方法:文件流实现结果:数据结构实现:生日结构体structBirthDay{ intyear; intmonth; intday; friendistream&operator>>(istream&is,BirthDay&b); friendostream&operator<<(ostream&os,constBirthDay&b);};信息结构体(家族成员的基本信息)structInformation{ stringname;//姓名 stringbirthPlace;//出生地 BirthDaybirthDay;//生日 stringsex;//性别 stringeducation;//学历 stringjob;//工作 stringfather;//父亲 stringspouse;//配偶 charlife;//是否健在};二叉树结点结构体structNode{ Informationdata;//个人信息 Node*child;//第一个孩子 Node*brother;//兄弟};家谱类(二叉树结构、左孩子,右兄弟)classFamilyTree{private: Node*root; Node*Creat();//构造函数调用 voidRelease(Node*root);//析构函数调用 staticintNumberofpeople;//计算总人数,NumberOfPeople()调用 staticintLifePeopele;//计算健在人数,LifeNum()调用public: FamilyTree();//构造函数,初始化一棵树,其前序序列由键盘输入 ~FamilyTree();//析构函数,释放链表中各结点的存储空间 voidSetNode(Node*root);//设置结点信息 Node*Getroot();//获取根结点 voidPreOrder(Node*root);//前序递归遍历输出家谱 voidInOrder(Node*root);//中序递归遍历输出家谱 voidPostOrder(Node*root);//后序递归遍历输出家谱 intGeneration(Node*root);//这个家族共有几代人 intNumberOfPeople();//家族的总人数 intLifeNum();//健在人数 voidPrintMessage(Node*root);//输出基本信息 intMessage(Node*root,stringName);//显示该成员的基本信息 Node*PreFindFather(Node*root,stringFatherName);//给定元素值查找父亲结点指针位置并返回其指针,此方法采用的先序遍历 Node*PreFindBrother(Node*root,stringFatherName);//给定元素值查找兄弟结点指针位置并返回其指针,此方法采用的先序遍历 voidAddNewPeople(Node*root,stringFatherName,stringNAme);//增加新的家族成员 intDeletePeople(Node*root,stringFatherName,stringDeletepeople);//删除家族成员 intSetNewName(Node*root,stringNAme,stringNewName);//更改姓名 intFindChild(Node*root,stringNAme);//显示孩子信息 voidSaveToFile(Node*root);//保存到文件 voidFileToFamilyTree(Node*root);//从文件中读取};调试分析:问题:在创建家谱时,询问用户是否需要继续添加成员,只要用户不输入”#”就继续添加。解决方案:增加if语句判断条件,只要输入的不是”Y”,”y”,”#”,就请用户重新输入。问题:计算总人数和健在人数,因为存在增加和删除函数,多次调用计算函数。解决方案:在家谱类中使用静态成员变量问题:在输入和输出成员信息中的生日,生日使用的是生日结构体变量,输入输出包括年、月、日。解决方案:使用友元输入输出重载问题:在输入生日时,输入数字程序正常运行,输入其他字符,程序会出现死循环。解决方案:cin.fail()判断输入是否正确,cin.clear()为了使输入错误能重新输入,将错误标识符改为0,cin.sync()清空流。问题:在输入一些信息是,询问用户是否确认一些信息时,请用户输入‘y、‘n’,但是用户有时会输入大写。解决方案:使用toupper()函数,将用户输入的确认信息转换成大写字母。问题:在增加孩子时,只能添加长子,添加第二个孩子、第三个等等,会出现错误。解决方案:添加一个寻找兄弟指针的函数,如果要添加孩子的成员,已经有了孩子,则通过调用兄弟指针函数来增加孩子。问题:保存到文件和读取文件时,会出现输入路径错误的情况。解决方案:通过调用_access()函数,判断输入路径是否正确。问题:读取文件时,cin的>>重载会跳过空白字符,包括回车符。解决问题:使用cin.get()函数接收回车。问题:删除成员时,删除能够成功,但会出现空指针错误。解决方案:在delete该成员时,需要将指向该成员的指针置空。问题:在主函数中,通过请用户输入数字,来选择相应的操作,当用户误输入的为选择以外的字符时,会结束程序运行。解决方案:与解决方案4相同。实验结果及分析创建家谱保存到文件读取文件增加成员基本信息查询成员信息成员改名遍历家谱查询孩子信息删除成员收获:本次实训在我们为期两周的时间里进行,通过自己的不断学习、请教和老师的指导,完成了关于家谱资料管理的设计。前期主要是准备阶段,运用哪些技术,中期实践阶段,通过几天的上机编写代码,然后完成,后期完善阶段,对一些难点和重点再细化,和做一些数据输入时的异常处理。最后进行答辩阶段。通过这次实训的互相帮助学习的过程,自己看书学习的经验,以及从网上以及其他各种途径获得信息和知识的经验。理论与实际相结合的设计,锻炼了我综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平。而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,我的各方面经验都得到了极大的丰富。附录全部代码Familytree.h#ifndefFAMILYTREE_H#defineFAMILYTREE_H#include<iostream>#include<string>#include<cctype>#include<io.h>#include<iomanip>#include<fstream>usingnamespacestd;structBirthDay{ intyear; intmonth; intday; friendistream&operator>>(istream&is,BirthDay&b); friendostream&operator<<(ostream&os,constBirthDay&b);};structInformation{ stringname; stringbirthPlace; BirthDaybirthDay; stringsex; stringeducation; stringjob; stringfather; stringspouse; charlife;};structNode{ Informationdata; Node*child; Node*brother;};classFamilyTree{private: Node*root; Node*Creat(); voidRelease(Node*root); staticintNumberofpeople; staticintLifePeopele;public: FamilyTree(); ~FamilyTree(); voidSetNode(Node*root); Node*Getroot(); voidPreOrder(Node*root); voidInOrder(Node*root); voidPostOrder(Node*root); intGeneration(Node*root); intNumberOfPeople(); intLifeNum(); voidPrintMessage(Node*root); intMessage(Node*root,stringName); Node*PreFindFather(Node*root,stringFatherName); Node*PreFindBrother(Node*root,stringFatherName); voidAddNewPeople(Node*root,stringFatherName,stringNAme); intDeletePeople(Node*root,stringFatherName,stringDeletepeople); intSetNewName(Node*root,stringNAme,stringNewName); intFindChild(Node*root,stringNAme); voidSaveToFile(Node*root); voidFileToFamilyTree(Node*root);};#endifFamilytree.cpp#include"Familytree.h"intFamilyTree::Numberofpeople=0;intFamilyTree::LifePeopele=0;//生日结构体变量输入输出友元重载istream&operator>>(istream&is,BirthDay&b){ is>>b.year>>b.month>>b.day; returnis;}ostream&operator<<(ostream&os,constBirthDay&b){ os<<b.year<<"-"<<b.month<<"-"<<b.day; returnos;}FamilyTree::FamilyTree()//构造函数,初始化一棵树,其前序序列由键盘输入{ this->root=Creat();}FamilyTree::~FamilyTree()//析构函数,释放链表中各结点的存储空间{ Release(root);}Node*FamilyTree::Getroot()//获取根结点{ returnroot;}Node*FamilyTree::Creat()//构造函数调用{ Node*root; stringch; cout<<"请问是否创建(是:“y”,否:“#”):"; cin>>ch;//输入名字 if(ch!="y")//异常处理 { if(ch!="Y") if(ch!="#") { intt=1; do { cout<<"\n输入不明确,请重新输入!!"<<endl; cout<<"请问是否创建(是:“y”,否:“#”):"; cin>>ch; if((ch=="y")||(ch=="Y")||(ch=="#")) t=0; }while(t==1); } } if(ch=="#")root=NULL; else { root=newNode;//申请结点内存空间 SetNode(root);//设置结点内容 root->child=Creat();//该结点的孩子 root->brother=Creat();//该结点的兄弟 } returnroot;//返回结点}voidFamilyTree::Release(Node*root)//析构函数调用{ if(root!=NULL) { Release(root->child);//释放左孩子 Release(root->brother);//释放右兄弟 deleteroot; }}voidFamilyTree::SetNode(Node*root)//设置结点信息{ Numberofpeople++; cout<<"请输入家庭成员的基本信息"<<endl; cout<<"姓名:"; cin>>root->; cout<<"出生地:"; cin>>root->data.birthPlace; cout<<"生日(数字、年月日以空格或者回车间隔):"; while(1) { cin>>root->data.birthDay; if(cin.fail()) { cout<<"输入有错!!请重新输入生日(数字):"<<endl; cin.clear();//输入错误则能重新输入 cin.sync();//清空流 } else break; } //isdigit异常处理生日输入,若参数c为阿拉伯数字0~9,则返回非0值,否则返回NULL。 /*inti; for(i=0;root->data.birthDay[i]!=0;++i) { if(isdigit(root->data.birthDay[i])==0) { cout<<"\n输入不明确,请重新输入!!"<<endl; break; } }*/ cout<<"性别:"; cin>>root->data.sex; cout<<"学历:"; cin>>root->cation; cout<<"工作:"; cin>>root->data.job; cout<<"父亲:"; cin>>root->data.father; cout<<"配偶(有多任配偶则以“,”或者“、”间隔):"<<endl; cin>>root->data.spouse; cout<<"是否健在(y是,n否):"; cin>>root->data.life; if(toupper(root->data.life)!='Y')//异常处理 { if(toupper(root->data.life)!='N'){ intt=1; do { cout<<"\n输入不明确,请重新输入!!"<<endl; cout<<"是否健在(y是,n否):"; cin>>root->data.life; if((toupper(root->data.life)=='Y')||(toupper(root->data.life)=='N')) t=0; }while(t==1); } } if(toupper(root->data.life)=='Y') LifePeopele++;}voidFamilyTree::PreOrder(Node*root)//前序递归遍历输出家谱{ if(root==NULL) return; else { cout<<root-><<'\t'; PreOrder(root->child); PreOrder(root->brother); }}voidFamilyTree::InOrder(Node*root)//中序递归遍历输出家谱{ if(root==NULL) return; else { InOrder(root->child); cout<<root-><<'\t'; InOrder(root->brother); }}voidFamilyTree::PostOrder(Node*root)//后序递归遍历输出家谱{ if(root==NULL) return; else { PostOrder(root->child); PostOrder(root->brother); cout<<root-><<'\t'; }}intFamilyTree::Generation(Node*root)//这个家族共有几代人{ intl;//l左孩子 if(root==NULL)//这个家族为空,返回0 return0; else { l=Generation(root->child);//左孩子的 returnl+1; }}//intnumberofpeople=0;intFamilyTree::NumberOfPeople()//家族的总人数{ if(root==NULL)//家族人数为0 return0; /*else { if(root!=NULL) numberofpeople++; NumberOfPeople(root->child); NumberOfPeople(root->brother); } returnnumberofpeople;*/ else returnNumberofpeople;}//intcount=0;intFamilyTree::LifeNum()//健在人数{ if(root==NULL)//-1表示这个家族不存在 return-1; /*else { if(toupper(root->data.life)=='Y') count++; LifeNum(root->child); LifeNum(root->brother); } returncount;*/ returnLifePeopele;}voidFamilyTree::PrintMessage(Node*root)//输出基本信息{ if(root==NULL) return; else { cout<<"姓名:"<<root->; cout<<"\t\t性别:"<<root->data.sex; cout<<"\t\t配偶:"<<root->data.spouse<<endl; cout<<"出生地:"<<root->data.birthPlace; cout<<"\t\t生日:"<<root->data.birthDay;//;<<root->data.birthDay.year<<"-"<<root->data.birthDay.month<<"-"<<root->data.birthDay.day<<endl; cout<<"\t\t父亲:"<<root->data.father<<endl; cout<<"学历:"<<root->cation; cout<<"\t\t工作:"<<root->data.job; cout<<"\t\t是否健在:"; if(toupper(root->data.life)=='Y') cout<<"是"<<endl; else cout<<"否"<<endl; }}intmessage=0;//判断是否查找成功intFamilyTree::Message(Node*root,stringName)//显示该成员的基本信息{ if(root==NULL) returnmessage; else { if(root->==Name) { message=1; PrintMessage(root); } else { Message(root->child,Name); Message(root->brother,Name); } } returnmessage;}Node*FamilyTree::PreFindFather(Node*root,stringFatherName)//给定元素值查找父亲结点指针位置并返回其指针,此方法采用的先序遍历{ if(root==NULL) throw"错误"; Node*p; Node*tree[20]; inttop=0; while(root!=NULL||top!=0) { while(root!=NULL) { if(root->==FatherName) p=root; top++; tree[top]=root; root=root->child; } if(top!=0) { root=tree[top]->brother; top--; } } returnp;}Node*FamilyTree::PreFindBrother(Node*root,stringFatherName)//给定元素值查找兄弟结点指针位置并返回其指针,此方法采用的先序遍历{ if(root==NULL) throw"错误"; Node*p; Node*tree[20]; inttop=0; while(root!=NULL||top!=0) { while(root!=NULL) { if(root->data.father==FatherName) p=root; top++; tree[top]=root; root=root->child; } if(top!=0) { root=tree[top]->brother; top--; } } returnp;}voidFamilyTree::AddNewPeople(Node*root,stringFatherName,stringNAme)//增加新的家族成员{ if(root==NULL)//如果这个家族为空,直接把该结点置为根结点 { Creat(); } else{ Node*p=newNode; p->=NAme; p->child=NULL; p->brother=NULL; Node*Brother=PreFindBrother(root,FatherName);//兄弟结点 if(root->data.father==FatherName)//如果与祖先(根结点)同一个父亲,则置为根结点的右兄弟 { Node*q=root; while(q->brother!=NULL)//寻找根结点的右兄弟结点为空的结点 { q=q->brother; } if(q->brother==NULL) { q->brother=p; SetNode(p); } } Node*Father=PreFindFather(root,FatherName);//父亲结点 //Node*Brother=PreFindBrother(root,FatherName);//兄弟结点 if(Father->child==NULL)//如果父亲结点的孩子结点为空 { Father->child=p; SetNode(p); } else//如果父亲结点的孩子结点不为空 { if(Brother->brother==NULL)//最后一个兄弟结点 { Brother->brother=p; SetNode(p); } } }}intFamilyTree::DeletePeople(Node*root,stringFatherName,stringDeletepeople)//删除家族成员{ intt=0; Numberofpeople--; if(root==NULL) returnt; else { if(root->==Deletepeople)//如果要删除的为祖先,则调用Release()函数 { t=1; root->brother=NULL; root->child=NULL; Release(root); } else { Node*Father=PreFindFather(root,FatherName); Node*Brother=PreFindBrother(root,FatherName);//兄弟结点 Node*p; Node*tree[20]; inttop=0; while(root!=NULL||top!=0) { while(root!=NULL) { if(root->==Deletepeople) { p=root; //break; } top++; tree[top]=root; root=root->child; } if(top!=0) { root=tree[top]->brother; top--; } } if(toupper(p->data.life)=='Y')//健在人数减一 LifePeopele--; if(Father->child->==p->)//Deletepeople) Father->child=NULL; else Brother->brother=NULL; //p->brother=NULL; //p->child=NULL; t=1; deletep; } } returnt;}intflag=0;//标记intFamilyTree::SetNewName(Node*root,stringNAme,stringNewName)//更改姓名{ if(root==NULL) returnflag; else { if(root->==NAme) { flag=1; root->=NewName; } else { SetNewName(root->child,NAme,NewName); SetNewName(root->brother,NAme,NewName); } } returnflag;}intFamilyTree::FindChild(Node*root,stringNAme)//显示孩子信息{ intflag=0; if(root==NULL) returnflag; else { if(root->==NAme) { if(root->child==NULL) returnflag; else { flag=1; cout<<root->child-><<""; Node*p; Node*tree[20]; p=root->child; tree[0]=p; inttop=0; while(p->brother!=NULL) { p=p->brother; top++; tree[top]=p; cout<<p-><<""; } cout<<"\n是否查看孩子的详细信息(是:y,否:n):"; charch; cin>>ch; if(toupper(ch)=='Y') { Node*q=tree[top]; while(top>-1) { PrintMessage(q); cout<<"\n"<<endl; top--; q=tree[top]; } } } } } returnflag;}voidFamilyTree::SaveToFile(Node*root)//保存到文件{ if(root==NULL) { cout<<"家谱为空"<<endl; return; } ofstreamofile; cout<<"请输入要保存文件的路径:"<<endl; charc=cin.get();//接收回车 chardir[40]; cin.getline(dir,40); ofile.open(dir,ios::app); if(_access(dir,0)==-1)//系统自带功能判断路径是否有效 { cout<<"输入路径不存在!"<<endl; return; } else { //d:\test.txt" cout<<"已经保存全部信息。"<<endl; ofile<<"姓名"<<setw(10)<<"性别"<<setw(10)<<"配偶"<<setw(10)<<"出生地"<<setw(10)<<"生日"<<setw(10)<<"学历"<<setw(7)<<"工作"<<setw(7)<<"父亲"<<setw(7)<<"健在"<<endl; Node*tree[20]; inttop=0; while(root!=NULL||top!=0) { while(root!=NULL) { ofile<<root-><<setw(10)<<root->data.sex<<setw(10)<<root->data.spouse<<setw(10)<<root->data.birthPlace<<setw(10)<<root->data.birthDay<<setw(10)<<root->cation<<setw(9)<<root->data.job<<setw(9)<<root->data.father<<setw(9)<<root->data.life<<endl; top++; tree[top]; tree[top]=root; root=root->child; } if(top!=0) { root=tree[top]->brother; top--; } } ofile.close(); }}voidFamilyTree::FileToFamilyTree(Node*root)//从文件中读取{ cout<<"请输入要读取文件的路径:"<<endl; ifstreamifile; charc=cin.get();//读入任意一个字符,包括回车符 chardir[40];//因为cin的>>重载会跳过空白字符,包括回车字符,所以无法使用>>直接读入回车符cin.get(),该成员函数功能为,从cin读入一个字符,并返回 cin.getline(dir,40);//cin.get(),该成员函数功能为,从cin读入一个字符,并返回 ifile.open(dir);// if(_access(dir,0)==-1) { cout<<"输入路径不存在!"<<endl; return; } stringch; getline(ifile,ch); cout<<ch<<endl; Node*tree[20]; inti=0; while(!ifile.eof())//eof文件末尾 {//姓名性别配偶出生地生日学历工作父亲健在 ifile>>root->>>root->data.sex>>root->data.spouse>>root->data.birthPlace>>root->data.birthDay>>root->cation>>root->data.job>>root->data.father>>root->data.life; tree[i]=root; i++; } i--; for(intj=0;j<i;j++) cout<<tree[j]-><<""<<tree[j]->data.sex<<""<<tree[j]->data.spouse<<""<<tree[j]->data.birthPlace<<""<<tree[j]->data.birthDay<<""<<tree[j]->cation<<""<<tree[j]->data.job<<""<<tree[j]->data.father<<""<<tree[j]->data.life<<endl;}Family.cpp#include<iostream>#include<process.h>#include"Familytree.h"#include<string>usingnamespacestd;voidMenu();intmain(){ Menu(); cout<<"\n创建家谱,输入顺序为前序序列,左孩子,右兄弟"<<endl; FamilyTreeft; system("cls"); Menu(); Node*root=ft.Getroot(); while(1) { intselect; cout<<"\n请输入选择操作的序号:"; //cin>>select; while(1) { cin>>select; if(cin.fail()) { cout<<"输入有错!!请重新输入选择(数字):"; cin.clear();//输入错误则能重新输入将错误标识符改为0 cin.sync();//清空数据流 } else break; } switch(select) { case1:system("cls"),Menu();break; case2: { cout<<"\n前序遍历"<<endl; ft.PreOrder(root); cout<<"\n\n中序遍历"<<endl; ft.InOrder(root); cout<<"\n\n后序遍历"<<endl; ft.PostOrder(root); cout<<endl; }break; case3: { cout<<"\n\n这个家族共有"<<ft.Generation(root)<<"代人"<<endl; cout<<"\n\n这个家族共有"<<ft.NumberOfPeople()<<"人"<<endl; cout<<"\n\n这个家族健在人数为:"<<ft.LifeNum()<<endl; }break; case4: { cout<<"\n\n请输入要查询的人的姓名:"; stringName; cin>>Name; cout<<"查找结果:"<<endl; intmessage=ft.Message(root,Name); if(message==0) cout<<"查找失败!!"<<endl; }break; case5: { cout<<"\n\n请输入要增加人员的父亲姓名:"; stringFatherName; cin>>FatherName; cout<<"请输入要增加人员的姓名:"; stringNAme; cin>>NAme; ft.AddNewPeople(root,FatherName,NAme); }break; case6: { cout<<"\n\n请输入要删除人员的姓名:"; stringDeletepeople; cin>>Deletepeople; cout<<"请输入该成员的父亲:"; stringFname; cin>>Fname; intDelName=ft.DeletePeople

温馨提示

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

评论

0/150

提交评论