2011—2012学年第1学期
电子与信息工程 系 计算机科学与技术 专业 班级 课程设计名称: 数据结构课程设计
设计题目: 库存管理系统 完成期限:自 2012 年 1 月 2日至 2012 年 1 月 6 日共 1 周 设计依据、要求及主要内容(可另加附页): 一、设计目的
熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
二、设计要求
(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;
(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩;
(3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表; (4)认真编写课程设计报告。
三、设计内容
1)问题描述
试设计一库存管理系统,产品信息包括产品编号、名称、价格、数量等(产品编号不重复)。 2) 基本要求
该系统应具有以下功能:
1、产品信息录入功能(产品信息用文件保存)--输入 2、产品信息浏览功能 --输出 3、产品入库 4、产品出库 5、查询和排序功能: 1)按价格从大到小排序 2)按名称查询
6、产品信息删除、修改功能。
四、参考文献
[1]《数据结构》. 王红梅. 清华大学出版社
[2]《数据结构学习辅导与实验指导》. 王红梅. 清华大学出版社 [3]《C++程序设计》. 钱能. 清华大学出版社
[4]《C++程序设计试验指导》. 钱能. 清华大学出版社 [5]《C++程序设计》.谭浩强. 清华大学出版社
#include 1 #include class CData //定义数据基类 { public: }; class CNode //定义结点基类 { private: }; class CList { CNode *pHead; //链表头结点指针 CList(){pHead=0;}; ~CList(){DeleteList();} void AddNode(CNode *pnode); //在首部添加结点 CNode *DeleteNode(CNode *); //删除一个指定的结点,返回该结点的指针 CNode *Search(CData &); //查找一个指定的数据,返回该数据所在的结点在链表的指针,未找bool IsExist(CData &); void ShowList(); //打印整个链表 void DeleteList(); //删除整个链表 CNode *GetListHead(){return pHead;} //返回链表首结点 CNode *GetListNextNode(CNode *pnode); //返回链表指定结点的下一个结点 1 2 CData(){}; virtual int Compare(CData &)=0; virtual void Show()=0; virtual ~CData(){}; CData *pData; //用于指向数据类的指针 CNode *pNext; //用于指向链表的后向指针 public: void InputData(CData *pdata){pData=pdata;} //输入数据 void ShowNode(){pData->Show();} CData *GetData(){return pData;} //打印一个节点的数据 friend class CList; //定义链表类为基类 public: 到返回0 }; CNode *CList::GetListNextNode(CNode *pnode) //返回链表指定结点的下一个结点 { CNode *p1=pnode; return p1->pNext; }; void CList::AddNode(CNode *pnode) //在首部添加结点 { }; CNode *CList::DeleteNode(CNode *pnode) //删除一个指定的结点,返回该结点的指针 { } CNode *CList::Search(CData &data) //查找一个指定的数据,返回指针,若未找到返回0 { CNode *p1=pHead; 1 3 if (pHead==0) //如果是空链表,插入的结点是唯一的结点 { } else //否则,插入到链表首部 { } pnode->pNext=pHead; pHead=pnode; pHead=pnode; pnode->pNext=0; return; CNode *p1,*p2; p1=pHead; //指向首结点 while(p1!=pnode&&p1->pNext!=0) //寻找要删除的结点 { } if (p1==pHead) //如果要删除的是首结点 { } p2->pNext=p1->pNext; //p1指向被删除的结点,将p2结点与p1后面的结点连接起来 return pnode; pHead=pHead->pNext; //将首结点后移 return pnode; p2=p1; p1=p1->pNext; //结点p2始终在p1的后面 } while(p1) //从头结点开始查找 { } return 0; //搜索完找不到,返回空指针0 if (p1->pData->Compare(data)==0) return p1; //找到后返回结点指针 p1=p1->pNext; void CList::ShowList() //打印整个链表 { } void CList::DeleteList() //删除整个链表结点 { } class Repository:public CData //库存为记录,为数据基类的公有派生类 { private : char szName[20]; //库存中数据:商品名、商品数量和入库时间 unsigned int szNumber; char szTime[20]; char szN; CList ShList; 1 4 CNode *p1=pHead; while(p1) { } p1->pData->Show(); p1=p1->pNext; CNode *p1,*p2; p1=pHead; while(p1) { } delete p1->pData; p2=p1; p1=p1->pNext; delete p2; public: Repository(); //构造函数 Repository(char *name,int number,char *time); void SetRecord(char *name, int number,char *time); //输入数据函数 int Compare(CData &); //比较函数,比较商品名 void Show(); void AddRecord(); void Display(); void LookUpRecord(); void DeleteRecord(); void ModifyRecord(); void SaveToFile(); void Operate(string &strChoice); void ReadFromFile(); void Output(); }; Repository::Repository() { strcpy(szName,\"\\0\"); szNumber=0; strcpy(szTime,\"\\0\"); } Repository::Repository(char *name,int number,char *time) { strcpy(szName,name); szNumber=number; strcpy(szTime,time); szN=name[0]; } void Repository::SetRecord(char *name, int number,char *time) //{ strcpy(szName,name); szNumber=number; strcpy(szTime,time); szN=name[0]; } int Repository::Compare(CData &data) //比较商品名 { Repository &temp=(Repository &)data; 1 5 输入数据函数 } void Repository::Show() //打印一个结点的数据 { } void Repository::AddRecord() //将记录添加到链表中 { } void Repository::Display() //显示全部链表数据 { cout<<\"当前操作共有\"< return strcmp(szName,temp.szName); cout< char szName[20],szTime[20]; unsigned int szNumber; cout<<\"请输入新商品名(输入0退出,并进入系统菜单):\"; cin>>szName; while(strcmp(szName,\"0\")) { } cout< cout<<\"请输入新商品数量: \"; cin>>szNumber; pSh=new Repository; //生成新的数据累对象 pSh->SetRecord(szName,szNumber,szTime); //数据类对象赋值 pNode=new CNode; //生成新的结点 pNode->InputData(pSh); //结点插入链表 ShList.AddNode(pNode); count++; cout<<\"请输入新商品名(输入0退出,并进入系统菜单) \"; cin>>szName; } cout< void Repository::DeleteRecord() //在链表中删除指定的结点的数据 { CNode *pLook; char szName[20]; cout<<\"请输入您需要删除的商品名(输入0退出,并进入系统菜单):\"; cin>>szName; while(strcmp(szName,\"0\")) { Repository sh(szName,0,\"0\"); 1 7 CNode *pLook; char szName[20]; cout<<\"请输入您需要查找的商品名(输入0退出,并进入系统菜单):\"; cin>>szName; while (strcmp(szName,\"0\")) { } cout< pLook=ShList.Search(sh); //查找指定结点的数据 if (pLook) { } else cout<<\"在库存商品信息记录中找不到商品:\"< cout<<\"在库存商品信息记录中找到商品:\"< } } pLook=ShList.Search(sh); if (pLook) //删除时应先查找出结点 { } else cout<<\"在库存商品信息记录中找不到商品:\"< cout<<\"请确定是否删除此商品信息记录(Y/N)【确定删除请输入Y或y,取消删除请输入Nchar ok; cin>>ok; if (ok=='Y'||ok=='y') { } else if(ok=='N'||ok=='n') cout< cin>>szName; cout< CNode *pLook; Repository *pSh; char szName[20],szTime[20]; unsigned int szNumber; cout<<\"请输入您需要修改的商品名(输入0退出,并进入系统菜单):\"; cin>>szName; while(strcmp(szName,\"0\")) { pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 1 8 Repository sh(szName,0,\"0\"); } } { } else cout<<\" 在库存商品信息记录中找不到\"< cout<<\"-----下面开始修改-----\"< cout<<\"请输入修改后的商品数量:\"; cin>>szNumber; cout<<\"请输入修改后的商品入库时间: \"; cin>>szTime; cout<<\"请确定是否修改此记录(Yes (Y) or No(N)):\"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { } else if(ok=='N'||ok=='n') pSh=new Repository; pSh->SetRecord(szName,szNumber,szTime); pLook->InputData(pSh); cout< cin>>szName; void Repository::Output() { CNode *pLook; Repository *pSh; char szName[20]; unsigned int szNumber; cout<<\"请输入您需要出库的商品名(输入0退出,并进入系统菜单):\"; cin>>szName; while(strcmp(szName,\"0\")) { 1 9 Repository sh(szName,0,\"0\"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { } 1 10 pSh=(Repository *)pLook->GetData(); cout<<\"在库存商品信息记录中找到商品:\"< cout<<\"请输入您要取出的商品数量:\"; cin>>szNumber; cout<<\"请确定是否取出该商品( Yes (Y) or No(N) ):\"; char ok; cin>>ok; if(ok=='Y'||ok=='y') { } else if(ok=='N'||ok=='n') cout< cout< cout< cout<<\"该商品缺货,请及时补充!\"< } else cout<<\" 在库存商品信息记录中找不到\"< void Repository::SaveToFile() //将链表中的数据保存在文件中 { } void Repository::ReadFromFile() //在程序开始先查找有无数据文件,找到后读取文件数据 { ifstream infile(\"repository.dat\if(! infile) { } CNode *pNode; Repository *pSh; while(! infile.eof()) { pSh=new Repository; //定义数据域对象 infile.read((char *)pSh,sizeof(Repository)); 1 11 ofstream outfile(\"repository.dat\if(! outfile) { } CNode *pnode; Repository *pSh; string strName,strNumber; pnode=ShList.GetListHead(); //取出链表首结点指针 while(pnode) { } outfile.close(); pSh=(Repository *)pnode->GetData(); //返回结点指向的数据域指针 outfile.write((char *)pSh,sizeof(Repository)); //将数据域写入文件 pnode=ShList.GetListNextNode(pnode); // 取下一结点的指针 cout<<\"数据文件打开错误,没有将数据存入文件!\\n\"; return; cout<<\"没有数据文件,请您先添加!\\n\\n\"; return; } } pNode=new CNode; pNode->InputData(pSh); //数据域对象内容生成结点 ShList.AddNode(pNode); //将结点加入链表 ShList.DeleteNode(pNode); //由于文件多读一次,所以将首结点删除 infile.close(); void Repository::Operate(string &strChoice) //根据主菜单选项进行操作 { } void main() { Repository repository; cout<<\"*******************************************************************\\n\\n\"; cout<<\" 欢迎进入库存管理系统 \\n\\n\"; if (strChoice==\"1\") AddRecord(); Display(); LookUpRecord(); DeleteRecord(); ModifyRecord(); Output(); SaveToFile(); else if (strChoice==\"2\") else if (strChoice==\"3\") else if (strChoice==\"4\") else if(strChoice==\"5\") else if(strChoice==\"6\") else if (strChoice==\"0\") else cout<<\"对不起,您的输入有误,请重新输入您的选择: \"; cout<<\"*******************************************************************\\n\\n\"; repository.ReadFromFile(); //从文件中输入数据 string strChoice; //接受主菜单选项 do { cout<<\"【欢迎进入系统菜单】:\\n\\n\\n\"; cout<<\" <1>.添加新商品信息记录\\n\\n\"; cout<<\" <2>.显示库存中商品信息记录内容\\n\\n\"; cout<<\" <3>.根据商品名查询库存中商品信息记录\\n\\n\"; cout<<\" <4>.根据商品名删除库存中商品信息记录\\n\\n\"; 1 12 } cout<<\" <5>.根据商品名修改库存中商品信息记录\\n\\n\"; cout<<\" <6>.商品出库\\n\\n\"; cout<<\" <0>.退出系统\\n\\n\\n\"; cout<<\"【请输入您的选择】:\"; cin>>strChoice; system(\"cls\"); repository.Operate(strChoice); }while(strChoice!=\"0\"); cout<<\"***********************************************************************\\n\\n\"; cout<<\" ------------******欢迎再次使用库存管理系统******---------- \\n\\n\"; system(\"pause\"); cout<<\"***********************************************************************\\n\\n\"; 1 13 因篇幅问题不能全部显示,请点此查看更多更全内容