泪奔 求助啊 求各位高手 达人 帮花两张流程图
泪奔 求助 本人邮箱 ffffdddssa@
求做流程图 只需要做 删除和出库部分流程图 往各位达人看一看 用不了多久的 很简单。。 真的很着急,本人C语言一窍不通。。 只要简单的那种就行。。。2个部分2张
删除部分
void Repository::DeleteRecord() //在链表中删除指定的结点的数据
{
CNode *pLook;
char szName[20];
cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
while(strcmp(szName,"0"))
{
Repository sh(szName,0,"0");
pLook=ShList.Search(sh);
if (pLook) //删除时应先查找出结点
{
cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl;
cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库时间"<<endl;
pLook->ShowNode();
cout<<"请确定是否删除此商品信息记录(Y/N)【确定删除请输入Y或y,取消删除请输入N或n】:";
char ok;
cin>>ok;
cin.ignore();
if (ok=='Y'||ok=='y')
{
ShList.DeleteNode(pLook);
cout<<szName<<"的信息记录删除成功!"<<endl;
delete pLook;
count--;
}
else if(ok=='N'||ok=='n')
cout<<szName<<"的信息记录删除失败!"<<endl;
}
else
cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl;
cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
}
cout<<endl<<endl;
}
出库部分
void Repository::Output()
{
CNode *pLook;
Repository *pSh;
char szName[20];
unsigned int szNumber;
cout<<"请输入您需要出库的商品名(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
while(strcmp(szName,"0"))
{
Repository sh(szName,0,"0");
pLook=ShList.Search(sh);
if (pLook) //修改时应先查找出结点
{
pSh=(Repository *)pLook->GetData();
cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl;
cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库时间"<<endl;
pLook->ShowNode();
if (0==pSh->szNumber)
{
cout<<"该商品缺货,请及时补充!"<<endl;
}
else
{
cout<<"请输入您要取出的商品数量:";
cin>>szNumber;
cout<<"请确定是否取出该商品( Yes (Y) or No(N) ):";
char ok;
cin>>ok;
cin.ignore();
if(ok=='Y'||ok=='y')
{
if(pSh->szNumber<=szNumber)
{
cout<<szName<<"您要求的商品数量大于仓库中的数量,故全部输出"<<pSh->szNumber<<" 个商品"<<endl;
pSh->szNumber=0;
}
else
{
pSh->szNumber-=szNumber;
cout<<szName<<"您已取出 "<<szNumber<<" 个商品"<<endl;
}
cout<<szName<<"成功取出!"<<endl;
}
else
if(ok=='N'||ok=='n')
cout<<szName<<"您取消了该操作"<<endl;
}
}
else
cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl;
cout<<" 请输入您需要出库的商品名(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
}
}
下面是全部源程序
#include<iostream>
#include<string>
#include<iomanip>
#include<fstream>
using namespace std;
int count=0;
class CData //定义数据基类
{
public:
CData(){};
virtual int Compare(CData &,int)=0;
virtual void Show()=0;
virtual ~CData(){};
};
class CNode //定义结点基类
{
private:
CData *pData; //用于指向数据类的指针
CNode *pNext; //用于指向链表的后向指针
public:
CNode()
{
pData=0;pNext=0;
}; //结点构造函数
CNode(CNode &node) //用于拷贝的构造函数
{
pData=node.pData;
pNext=node.pNext;
}
void InputData(CData *pdata){pData=pdata;} //输入数据
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 *DeleteNode(CNode *); //删除一个指定的结点,返回该结点的指针
CNode *Search(CData &); //查找一个指定的数据,返回该数据所在的结点在链表的指针,未找到返回0
bool IsExist(CData &);
void ShowList(); //打印整个链表
void DeleteList(); //删除整个链表
CNode *GetListHead(){return pHead;} //返回链表首结点
CNode *GetListNextNode(CNode *pnode); //返回链表指定结点的下一个结点
};
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 //否则,插入到链表首部
{
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) //如果要删除的是首结点
{
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,1)==0)
return p1; //找到后返回结点指针
p1=p1->pNext;
}
return 0; //搜索完找不到,返回空指针0
}
bool CList::IsExist(CData &data)
{
bool f1=false;
CNode *p1=pHead;
while(p1)
{
if (p1->pData->Compare(data,0)==0)
{
p1->ShowNode();
return true;
}
p1=p1->pNext;
}
return false;
}
void CList::ShowList() //打印整个链表
{
CNode *p1=pHead;
while(p1)
{
p1->pData->Show();
p1=p1->pNext;
}
}
void CList::DeleteList() //删除整个链表结点
{
CNode *p1,*p2;
p1=pHead;
while(p1)
{
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(); //构造函数
Repository(char *name,int number,char *time);
void SetRecord(char *name, int number,char *time); //输入数据函数
int Compare(CData &,int); //比较函数,比较商品名
void Show();
void AddRecord();
void Display();
void LookUpRecord();
void LookUpRecordF();
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,int choice) //比较商品名
{
Repository &temp=(Repository &)data;
if(choice==1)
return strcmp(szName,temp.szName);
else
return (szN==temp.szN ? 0:1);
}
void Repository::Show() //打印一个结点的数据
{
cout<<setw(15)<<szName<<setw(15)<<szNumber<<setw(15)<<szTime<<endl;
}
void Repository::AddRecord() //将记录添加到链表中
{
CNode *pNode;
Repository *pSh;
char szName[20],szTime[20];
unsigned int szNumber;
cout<<"请输入新商品名(输入0退出,并进入系统菜单):";
cin>>szName;
while(strcmp(szName,"0"))
{
cout<<"请输入新商品入库时间: ";
cin>>szTime;
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<<endl<<endl;
}
void Repository::Display() //显示全部链表数据
{
cout<<"当前操作共有"<<count<<"条新商品的添加纪录。\n\n";
cout<<"目前库存共有商品信息记录是:\n\n";
cout<<setiosflags(ios_base::left)<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库时间"<<endl<<endl;
ShList.ShowList();
bool pLook;
char szName[20];
for(szName[0]='a';szName[0]<='z';szName[0]++)
{
Repository sh(szName,0,"0");
pLook=ShList.IsExist(sh);
szName[0]-=32;
sh.SetRecord(szName,0,"0");
pLook=ShList.IsExist(sh);
szName[0]+=32;
}
cout<<endl<<endl;
system("pause");
}
void Repository::LookUpRecord() // 按照商品名查找
{
CNode *pLook;
char szName[20];
cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
while (strcmp(szName,"0"))
{
Repository sh(szName,0,"0"); //生成结点
pLook=ShList.Search(sh); //查找指定结点的数据
if (pLook)
{
cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl;
cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库时间"<<endl;
pLook->ShowNode();
}
else
cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl;
cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
}
cout<<endl<<endl;
}
void Repository::LookUpRecordF()
{
bool pLook;
char szName[20];
cout<<"请输入您需要查找的商品名的首字(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
while (strcmp(szName,"0"))
{
Repository sh(szName,0,"0");
pLook=ShList.IsExist(sh);
if (pLook==false)
cout<<"在库存商品信息记录中不到首字为"<<szName<<"的信息记录"<<endl;
else
cout<<"首字是"<<szName<<"的商品信息记录找到!"<<endl;
cout<<"请输入您需要查找的商品名的首字(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
}
cout<<endl<<endl;
}
void Repository::DeleteRecord() //在链表中删除指定的结点的数据
{
CNode *pLook;
char szName[20];
cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
while(strcmp(szName,"0"))
{
Repository sh(szName,0,"0");
pLook=ShList.Search(sh);
if (pLook) //删除时应先查找出结点
{
cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl;
cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库时间"<<endl;
pLook->ShowNode();
cout<<"请确定是否删除此商品信息记录(Y/N)【确定删除请输入Y或y,取消删除请输入N或n】:";
char ok;
cin>>ok;
cin.ignore();
if (ok=='Y'||ok=='y')
{
ShList.DeleteNode(pLook);
cout<<szName<<"的信息记录删除成功!"<<endl;
delete pLook;
count--;
}
else if(ok=='N'||ok=='n')
cout<<szName<<"的信息记录删除失败!"<<endl;
}
else
cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl;
cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
}
cout<<endl<<endl;
}
void Repository::ModifyRecord() //修改商品记录
{
CNode *pLook;
Repository *pSh;
char szName[20],szTime[20];
unsigned int szNumber;
cout<<"请输入您需要修改的商品名(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
while(strcmp(szName,"0"))
{
Repository sh(szName,0,"0");
pLook=ShList.Search(sh);
if (pLook) //修改时应先查找出结点
{
cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl;
cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库时间"<<endl;
pLook->ShowNode();
cout<<"-----下面开始修改-----"<<endl<<"请输入修改后的商品名: ";
cin>>szName;
cout<<"请输入修改后的商品数量:";
cin>>szNumber;
cout<<"请输入修改后的商品入库时间: ";
cin>>szTime;
cout<<"请确定是否修改此记录(Yes (Y) or No(N)):";
char ok;
cin>>ok;
cin.ignore();
if (ok=='Y'||ok=='y')
{
pSh=new Repository;
*pSh=sh;
pSh->SetRecord(szName,szNumber,szTime);
pLook->InputData(pSh);
cout<<szName<<"的信息记录修改成功!"<<endl;
}
else if(ok=='N'||ok=='n')
cout<<szName<<"的信息记录修改失败!"<<endl;
}
else
cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl;
cout<<" 请输入您需要修改的商品名(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
}
}
void Repository::Output()
{
CNode *pLook;
Repository *pSh;
char szName[20];
unsigned int szNumber;
cout<<"请输入您需要出库的商品名(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
while(strcmp(szName,"0"))
{
Repository sh(szName,0,"0");
pLook=ShList.Search(sh);
if (pLook) //修改时应先查找出结点
{
pSh=(Repository *)pLook->GetData();
cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl;
cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库时间"<<endl;
pLook->ShowNode();
if (0==pSh->szNumber)
{
cout<<"该商品缺货,请及时补充!"<<endl;
}
else
{
cout<<"请输入您要取出的商品数量:";
cin>>szNumber;
cout<<"请确定是否取出该商品( Yes (Y) or No(N) ):";
char ok;
cin>>ok;
cin.ignore();
if(ok=='Y'||ok=='y')
{
if(pSh->szNumber<=szNumber)
{
cout<<szName<<"您要求的商品数量大于仓库中的数量,故全部输出"<<pSh->szNumber<<" 个商品"<<endl;
pSh->szNumber=0;
}
else
{
pSh->szNumber-=szNumber;
cout<<szName<<"您已取出 "<<szNumber<<" 个商品"<<endl;
}
cout<<szName<<"成功取出!"<<endl;
}
else
if(ok=='N'||ok=='n')
cout<<szName<<"您取消了该操作"<<endl;
}
}
else
cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl;
cout<<" 请输入您需要出库的商品名(输入0退出,并进入系统菜单):";
cin.getline(szName,20);
}
}
void Repository::SaveToFile() //将链表中的数据保存在文件中
{
ofstream outfile("repository.dat",ios::binary);
if(! outfile)
{
cout<<"数据文件打开错误,没有将数据存入文件!\n";
return;
}
CNode *pnode;
Repository *pSh;
string strName,strNumber;
pnode=ShList.GetListHead(); //取出链表首结点指针
while(pnode)
{
pSh=(Repository *)pnode->GetData(); //返回结点指向的数据域指针
outfile.write((char *)pSh,sizeof(Repository)); //将数据域写入文件
pnode=ShList.GetListNextNode(pnode); // 取下一结点的指针
}
outfile.close();
}
void Repository::ReadFromFile() //在程序开始先查找有无数据文件,找到后读取文件数据
{
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;
pNode->InputData(pSh); //数据域对象内容生成结点
ShList.AddNode(pNode); //将结点加入链表
}
ShList.DeleteNode(pNode); //由于文件多读一次,所以将首结点删除
infile.close();
}
void Repository::Operate(string &strChoice) //根据主菜单选项进行操作
{
if (strChoice=="1")
AddRecord();
else if (strChoice=="2")
Display();
else if (strChoice=="3")
LookUpRecord();
else if (strChoice=="4")
LookUpRecordF();
else if (strChoice=="5")
DeleteRecord();
else if(strChoice=="6")
ModifyRecord();
else if(strChoice=="7")
Output();
else if (strChoice=="0")
SaveToFile();
else cout<<"对不起,您的输入有误,请重新输入您的选择: ";
}
void main()
{
Repository repository;
cout<<"*******************************************************************\n\n";
cout<<" 欢迎进入库存管理系统 \n\n";
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";
cout<<" <5>.根据商品名删除库存中商品信息记录\n\n";
cout<<" <6>.根据商品名修改库存中商品信息记录\n\n";
cout<<" <7>.商品出库\n\n";
cout<<" <0>.退出系统\n\n\n";
cout<<"【请输入您的选择】:";
cin>>strChoice;
cin.ignore();
system("cls");
repository.Operate(strChoice);
}while(strChoice!="0");
cout<<"***********************************************************************\n\n";
cout<<" ------------******欢迎再次使用库存管理系统******---------- \n\n";
cout<<"***********************************************************************\n\n";
system("pause");
}