1、课程设计任务书 —第1学期 电子和信息工程 系 计算机科学和技术 专业 班级 课程设计名称: 数据结构课程设计 设计题目: 库存管理系统 完成期限:自 年 1 月 2日至 年 1 月 6 日共 1 周 设计依据、要求及关键内容(可另加附页): 一、设计目标 熟悉多种数据结构和运算,会使用数据结构基础操作处理部分实际问题。 二、设计要求 (1)重视课程设计步骤,用严谨、科学和扎实工作态度对待课程设计每一项任务; (2)
2、根据课程设计题目要求,独立地完成各项任务,严禁剽窃;凡发觉剽窃,剽窃者和被剽窃者皆以零分计入本课程设计成绩。凡发觉试验汇报或源程序雷同,包含全部人员皆以零分计入本课程设计成绩; (3)学生在接收设计任务后,首先要按设计任务书要求编写设计进程表; (4)认真编写课程设计汇报。 三、设计内容 1)问题描述 试设计一库存管理系统,产品信息包含产品编号、名称、价格、数量等(产品编号不反复)。 2) 基础要求 该系统应含有以下功效: 1、产品信息录入功效(产品信息用文件保留)--输入v 2、产品信息浏览功效 --输出v 3、产品入库 4、产品出库 5、查询和排序功效: l
3、 1)按价格从大到小排序
l 2)按名称查询
6、产品信息删除、修改功效。
四、参考文件
[1]《数据结构》. 王红梅. 清华大学出版社
[2]《数据结构学习教导和试验指导》. 王红梅. 清华大学出版社
[3]《C++程序设计》. 钱能. 清华大学出版社
[4]《C++程序设计试验指导》. 钱能. 清华大学出版社
[5]《C++程序设计》.谭浩强. 清华大学出版社
#include
4、int count=0; class CData //定义数据基类 { public: CData(){}; virtual int Compare(CData &)=0; virtual void Show()=0; virtual ~CData(){}; }; class CNode //定义结点基类 { private: CData *pData; //用于指向数据类指针 CNode *pNext; //用于指向链表后向指针 public: void InputData(CData *pdata){pData=pdata;}
5、 //输入数据 void ShowNode(){pData->Show();} //打印一个节点数据 CData *GetData(){return pData;} friend class CList; //定义链表类为基类 }; class CList { CNode *pHead; //链表头结点指针 public: CList(){pHead=0;}; ~CList(){DeleteList();} void AddNode(CNode *pnode); //在首部添加结点 CNode *Dele
6、teNode(CNode *); //删除一个指定结点,返回该结点指针 CNode *Search(CData &); //查找一个指定数据,返回该数据所在结点在链表指针,未找到返回0 bool IsExist(CData &); void ShowList(); //打印整个链表 void DeleteList(); //删除整个链表 CNode *GetListHead(){return pHead;} //返回链表首结点 CNode *GetListNextNode(CNode *pnode); //返回链
7、表指定结点下一个结点 }; CNode *CList::GetListNextNode(CNode *pnode) //返回链表指定结点下一个结点 { CNode *p1=pnode; return p1->pNext; }; void CList::AddNode(CNode *pnode) //在首部添加结点 { if (pHead==0) //假如是空链表,插入结点是唯一结点 { pHead=pnode; pnode->pNext=0; return; } else //不然,插入到链表首部
8、{ pnode->pNext=pHead; pHead=pnode; } }; CNode *CList::DeleteNode(CNode *pnode) //删除一个指定结点,返回该结点指针 { CNode *p1,*p2; p1=pHead; //指向首结点 while(p1!=pnode&&p1->pNext!=0) //寻求要删除结点 { p2=p1; p1=p1->pNext; //结点p2一直在p1后面 } if (p1==pHead) //假如要删除是首结点
9、 { pHead=pHead->pNext; //将首结点后移 return pnode; } p2->pNext=p1->pNext; //p1指向被删除结点,将p2结点和p1后面结点连接起来 return pnode; } CNode *CList::Search(CData &data) //查找一个指定数据,返回指针,若未找到返回0 { CNode *p1=pHead; while(p1) //从头结点开始查找 { if (p1->pData->Compare(data)==0)
10、 return p1; //找到后返回结点指针 p1=p1->pNext; } return 0; //搜索完找不到,返回空指针0 } void CList::ShowList() //打印整个链表 { CNode *p1=pHead; while(p1) { p1->pData->Show(); p1=p1->pNext; } } void CList::DeleteList() //删除整个链表结点 { CNode *p1,*p2; p1=pHead; while(p1
11、) { delete p1->pData; p2=p1; p1=p1->pNext; delete p2; } } class Repository:public CData //库存为统计,为数据基类公有派生类 { private : char szName[20]; //库存中数据:商品名、商品数量和入库时间 unsigned int szNumber; char szTime[20]; char szN; CList ShList; public: Repository(); //结构函数 Reposito
12、ry(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(
13、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];
14、} 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; return strcmp(szName,temp.szName);
15、}
void Repository::Show() //打印一个结点数据
{
cout<
16、me; while(strcmp(szName,"0")) { cout<<"请输入新商品入库时间: "; cin>>szTime; cout<<"请输入新商品数量: "; cin>>szNumber; pSh=new Repository; //生成新数据累对象 pSh->SetRecord(szName,szNumber,szTime); //数据类对象赋值 pNode=new CNode; //生成新结点 pNode
17、>InputData(pSh); //结点插入链表
ShList.AddNode(pNode);
count++;
cout<<"请输入新商品名(输入0退出,并进入系统菜单) ";
cin>>szName;
}
cout< 18、
cout< 19、并进入系统菜单):";
cin>>szName;
while (strcmp(szName,"0"))
{
Repository sh(szName,0,"0"); //生成结点
pLook=ShList.Search(sh); //查找指定结点数据
if (pLook)
{
cout<<"在库存商品信息统计中找到商品:"< 20、ShowNode();
}
else
cout<<"在库存商品信息统计中找不到商品:"< 21、
while(strcmp(szName,"0"))
{
Repository sh(szName,0,"0");
pLook=ShList.Search(sh);
if (pLook) //删除时应先查找出结点
{
cout<<"在库存商品信息统计中找到商品:"< 22、/N)【确定删除请输入Y或y,取消删除请输入N或n】:";
char ok;
cin>>ok;
if (ok=='Y'||ok=='y')
{
ShList.DeleteNode(pLook);
cout< 23、到商品:"< 24、zName;
while(strcmp(szName,"0"))
{
Repository sh(szName,0,"0");
pLook=ShList.Search(sh);
if (pLook) //修改时应先查找出结点
{
cout<<"在库存商品信息统计中找到商品:"< 25、下面开始修改-----"< 26、szNumber,szTime);
pLook->InputData(pSh);
cout< 27、
}
void Repository::Output()
{
CNode *pLook;
Repository *pSh;
char szName[20];
unsigned int szNumber;
cout<<"请输入您需要出库商品名(输入0退出,并进入系统菜单):";
cin>>szName;
while(strcmp(szName,"0"))
{
Repository sh(szName,0,"0");
pLook=ShList.Search(sh);
if (pLook) //修改时应先查找出结点
28、
{
pSh=(Repository *)pLook->GetData();
cout<<"在库存商品信息统计中找到商品:"< 29、
cin>>szNumber;
cout<<"请确定是否取出该商品( Yes (Y) or No(N) ):";
char ok;
cin>>ok;
if(ok=='Y'||ok=='y')
{
if(pSh->szNumber<=szNumber)
{
cout< 30、
pSh->szNumber-=szNumber;
cout< 31、<" 请输入您需要出库商品名(输入0退出,并进入系统菜单):";
cin>>szName;
}
}
void Repository::SaveToFile() //将链表中数据保留在文件中
{
ofstream outfile("repository.dat",ios::binary);
if(! outfile)
{
cout<<"数据文件打开错误,没有将数据存入文件!\n";
return;
}
CNode *pnode;
Repository *pSh;
string strName,strNumber;
pnode=Sh 32、List.GetListHead(); //取出链表首结点指针
while(pnode)
{
pSh=(Repository *)pnode->GetData(); //返回结点指向数据域指针
outfile.write((char *)pSh,sizeof(Repository)); //将数据域写入文件
pnode=ShList.GetListNextNode(pnode); // 取下一结点指针
}
outfile.close();
}
void Repository::ReadFromFile() //在程序开始先查找有没有数据 33、文件,找到后读取文件数据
{
ifstream infile("repository.dat",ios::binary);
if(! infile)
{
cout<<"没有数据文件,请您先添加!\n\n";
return;
}
CNode *pNode;
Repository *pSh;
while(! infile.eof())
{
pSh=new Repository; //定义数据域对象
infile.read((char *)pSh,sizeof(Repository));
pNode=new CNode;
pN 34、ode->InputData(pSh); //数据域对象内容生成结点
ShList.AddNode(pNode); //将结点加入链表
}
ShList.DeleteNode(pNode); //因为文件多读一次,所以将首结点删除
infile.close();
}
void Repository::Operate(string &strChoice) //依据主菜单选项进行操作
{
if (strChoice=="1")
AddRecord();
else if (strChoice=="2")
Display();
els 35、e if (strChoice=="3")
LookUpRecord();
else if (strChoice=="4")
DeleteRecord();
else if(strChoice=="5")
ModifyRecord();
else if(strChoice=="6")
Output();
else if (strChoice=="0")
SaveToFile();
else cout<<"对不起,您输入有误,请重新输入您选择: ";
}
void main()
{
Repository repository;
c 36、out<<"*******************************************************************\n\n";
cout<<" 欢迎进入库存管理系统 \n\n";
cout<<"*******************************************************************\n\n";
repository.ReadFromFile(); //从文件中输入数据
string strChoice; //接收主菜单选项
do
{
cout<<"【欢迎进入系 37、统菜单】:\n\n\n";
cout<<" <1>.添加新商品信息统计\n\n";
cout<<" <2>.显示库存中商品信息统计内容\n\n";
cout<<" <3>.依据商品名查询库存中商品信息统计\n\n";
cout<<" <4>.依据商品名删除库存中商品信息统计\n\n";
cout<<" <5>.依据商品名修改库存中商品信息统计\n\n";
cout<<" <6>.商品出库\n\n";
cout<<" <0>.退出系统\n\n\n";
cout<<"【请输入您选择 38、";
cin>>strChoice;
system("cls");
repository.Operate(strChoice);
}while(strChoice!="0");
cout<<"***********************************************************************\n\n";
cout<<" ------------******欢迎再次使用库存管理系统******---------- \n\n";
cout<<"***********************************************************************\n\n";
system("pause");
}






