您的位置:首页 > 编程语言 > C语言/C++

C---仓储管理系统实现(嵌套链表or二维链表)

2015-11-13 20:26 751 查看

实现要求和环境

语言和环境

C语言实现

windows系统

VS201x

实现目标

商品管理:包括商品的添加,删除,更改,查看

入库管理:仓库管理员录入入库商品

出库管理:仓库管理员录入出库信息

统计库存信息:要求能够查询库存信息,入库和出库信息,每件商品要保证入库加库存等于出库

部分实现DOC界面

仓储管理系统首页




商品管理界面




商品添加




商品列表




库存列表




代码实现

main.cpp


//-----------------------------------------------------------------
//文 件 名:main.cpp//创建日期:2015-11-13
//创 建 人:yicm
//系统环境:VS2012,Win7 64
//修改日期:
// 2015-11-13:
//修 改 人:yicm
//功 能:库储管理系统,对商品和库存进行管理;
//备 注:入口程序,嵌套单链表(二维链表)实现;
//-----------------------------------------------------------------
#include "stdafx.h"

//全局变量
StorageHead sHead;
GoodsHead gHead;
//函数声明
int sysIndex();
void switchMainCmd(char cmd);
int goodsManagerIndex();
void goodsManagerCmdRun(char cmd);

int _tmain(int argc, _TCHAR* argv[])
{
if(!InitSys(&gHead,&sHead)){
printf("初始化数据失败!\n");
return -1;
}

char cmd = -1;

while(cmd != 0){
cmd = sysIndex();
if(cmd < 0 || cmd > 4){
printf("不支持此功能!\n");
continue ;
}
else if(cmd == 0){
printf("退出系统!\n");
continue ;
}

switchMainCmd(cmd);
printf("请按任意键退回系统主页: ");
getchar();
getchar();
}

ExitSys(&gHead,&sHead);
return 0;
}

//库存管理系统首页
int sysIndex()
{
int cmd = -1;
system("cls");
printf("\t>>>>>>新 一 佳 仓 储 管 理 系 统<<<<<<\n");
printf("\t\t0 退出系统\n");
printf("\t\t1 商品管理\n");
printf("\t\t2 入库管理\n");
printf("\t\t3 出库管理\n");
printf("\t\t4 查询统计\n");

printf("\t请输入您的选择(0~4): ");
scanf("%d",&cmd);
return cmd;
}

//库存管理主功能选择
void switchMainCmd(char cmd)
{
system("cls");
switch(cmd){
case 1: {
while(true){
int cmd = goodsManagerIndex();
if(cmd <1 || cmd >4)break;
goodsManagerCmdRun(cmd);
}
break;
}
case 2: printf("\t入\t库\t管\t理\n");inStorage(&gHead,&sHead);break;
case 3: printf("\t出\t库\t管\t理\n");outStorage(&gHead,&sHead);break;
case 4: printf("\t查\t询\t统\t计\n");showStorage(&sHead);break;
default: ;
}
}

//商品管理首页
int goodsManagerIndex()
{
system("cls");
int cmd = -1;
printf("\t>>>>>>商\t品\t管\t理<<<<<<\n");
printf("\t\t0 退出管理\n");
printf("\t\t1 商品添加\n");
printf("\t\t2 商品删除\n");
printf("\t\t3 商品更新\n");
printf("\t\t4 商品列表\n");

printf("\t请输入商品管理编码(1~4): ");
scanf("%d",&cmd);
return cmd;
}
//商品管理主功能命令执行
void goodsManagerCmdRun(char cmd)
{
switch(cmd){
case 1: system("cls");printf("\t>>>>>>商\t品\t添\t加<<<<<<\n");insertGoods(&gHead);break;
case 2: system("cls");printf("\t>>>>>>商\t品\t删\t除<<<<<<\n");deleteGoods(&gHead);break;
case 3: system("cls");printf("\t>>>>>>商\t品\t更\t新<<<<<<\n");updateGoods(&gHead);break;
case 4: system("cls");printf("\t>>>>>>商\t品\t列\t表<<<<<<\n");showGoods(&gHead);break;
default: ;break;
}
}


StorageManagerSys.h


//-----------------------------------------------------------------
//文 件 名:StorageManagerSys.h//创建日期:2015-11-13
//创 建 人:yicm
//修改日期:
// 2015-11-13:
//修 改 人:yicm
//功 能:库储管理系统,对商品和库存进行管理;
//备 注:商品,库存操作头文件,嵌套单链表实现
//-----------------------------------------------------------------
#ifndef __STORAGEMANAGERSYS__H__
#define __STORAGEMANAGERSYS__H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/***********************************************
//数据结构体
***********************************************/
typedef struct _Storage
{
int code; //商品编码
char name[128]; //商品名称
int quantity; //库存
int inStorage; //入库数量
int outStorage; //出库数量
_Storage * next;
}Storage,*PStorage;

typedef struct _StorageMonHead{
int count; //每个月的库存信息数量
int mon; //月份
Storage *sMonHead; //每个月月库存头节点
_StorageMonHead *next;
}StorageMonHead,*PStorageMonHead;

typedef struct _StorageHead{
int allCount; //整个库存信息数量
int mcount; //月份有库存出入的月份个数
StorageMonHead *sHead; //库存头节点
}StorageHead,*PStorageHead;

typedef struct _Goods
{
int code; //商品编码
char name[128]; //商品名称
_Goods * next;
}Goods,*PGoods;

typedef struct _GoodsHead{
int count; //商品信息数量
Goods *goodsHead; //商品头节点
}GoodsHead,*PGoodsHead;

/***********************************************
//系统数据初始化和数据保存
***********************************************/
//读取文件数据到内存中
bool InitSys(PGoodsHead pGHead,PStorageHead pSHead);
bool InitGoodsManager(PGoodsHead pGHead);
bool InitStorageManager(PStorageHead pSHead);
//写入数据到内存中
void ExitSys(PGoodsHead pGHead,PStorageHead pSHead);
/***********************************************
//商品管理
***********************************************/
//商品添加int insertGoods(PGoodsHead pGHead);
//商品删除
int deleteGoods(PGoodsHead pGHead);
//商品更改
int updateGoods(PGoodsHead pGHead);
//商品查看
int showGoods(const PGoodsHead pGHead);
//商品检测:是否存在该商品
bool checkGoods(PGoodsHead pGHead,const Goods goods);
/***********************************************
//出/入库管理
***********************************************/
//入库检测:是否存在该商品
bool checkInStorage(PStorageMonHead pSMHead,const Storage storage);
//入库
int inStorage(PGoodsHead pGHead,PStorageHead pSHead);
//入库检测:是否存在该商品
bool checkOutStorage(PStorageMonHead pSMHead,const Storage storage);
//出库
int outStorage(PGoodsHead pGHead,PStorageHead pSHead);
/***********************************************
//统计库存信息
//按时间顺序;按商品编码顺序;入库出库;
***********************************************/
//按月份对库储排序
int sortStorageByMon(PStorageMonHead pSHead);
//显示库存信息
int showStorage(StorageHead *pSHead);

#endif


StorageManagerSys.cpp


//-----------------------------------------------------------------
//文 件 名:StorageManagerSys.cpp//创建日期:2015-11-13
//创 建 人:yicm
//修改日期:
// 2015-11-13:
//修 改 人:yicm
//功 能:库储管理系统,对商品和库存进行管理;
//备 注:商品,库存操作源文件
//-----------------------------------------------------------------
#include "stdafx.h"

/***********************************************
//系统数据初始化和数据保存
***********************************************/
bool InitSys(PGoodsHead pGHead,PStorageHead pSHead)
{
if(!InitGoodsManager(pGHead))return false;
if(!InitStorageManager(pSHead))return false;
return true;
}
//读取商品列表文件数据到内存中
bool InitGoodsManager(PGoodsHead pGHead)
{
FILE *fp = fopen("goods.dat","r");
if(!fp){
printf("读取商品文件失败!\n");
return false;
}
//获取商品数量
fseek(fp,0,SEEK_END);
int goodsCount = ftell(fp)/(sizeof(Goods));

//空数据文件
if(goodsCount <= 0){
pGHead->count = goodsCount;
pGHead->goodsHead = NULL;
return true;
}
//非空数据文件
PGoods newGoods = NULL,head = NULL;
fseek(fp,0,SEEK_SET);
for(int i = 0;i < goodsCount; ++i){
//获取一个商品数据
Goods tempGoods;
memset(&tempGoods,0,sizeof(Goods));
tempGoods.next = NULL;
fread(&tempGoods,sizeof(Goods),1,fp);
//新建一个节点
newGoods = (PGoods)malloc(sizeof(Goods));
newGoods->code = tempGoods.code;
strcpy(newGoods->name,tempGoods.name);
newGoods->next = NULL;
//保存头节点
if(head == NULL){
head = newGoods;
newGoods = NULL;
}
else {
//前插法
newGoods->next = head;
head = newGoods;
}
}
pGHead->count = goodsCount;
pGHead->goodsHead = head;

fclose(fp);
return true;
}
//读取库存出入列表文件数据到内存中
bool InitStorageManager(PStorageHead pSHead)
{
FILE *fp = fopen("storage.dat","r");
if(!fp){
printf("读取库存文件失败!\n");
return false;
}
//通过写入的库存头获取商品数量
//获取文件大小
fseek(fp,0,SEEK_END);
int fileSize = ftell(fp);
fseek(fp,0,SEEK_SET);

if(fileSize > 0){
fread(pSHead,sizeof(StorageHead),1,fp);
pSHead->sHead = NULL;
}
else {
pSHead->allCount = 0;
pSHead->mcount = 0;
pSHead->sHead = NULL;
return true;
}

for(int i = 0; i < pSHead->mcount; ++i){
//新建一个月份头节点
StorageMonHead * storageMonHead = (PStorageMonHead)malloc(sizeof(StorageMonHead));
memset(storageMonHead,0,sizeof(StorageMonHead));
fread(storageMonHead,sizeof(StorageMonHead),1,fp);
storageMonHead->sMonHead = NULL;

for(int j = 0;j < storageMonHead->count;++j){
//获取一个商品数据
PStorage newStorage = NULL;
Storage tempStorage;
memset(&tempStorage,0,sizeof(Storage));
tempStorage.next = NULL;
fread(&tempStorage,sizeof(Storage),1,fp);
//新建一个具体商品出入库节点
newStorage = (PStorage)malloc(sizeof(Storage));
newStorage->code = tempStorage.code;
strcpy(newStorage->name,tempStorage.name);
newStorage->quantity = tempStorage.quantity;
newStorage->inStorage = tempStorage.inStorage;
newStorage->outStorage = tempStorage.outStorage;
newStorage->next = NULL;
//保存头节点
if(storageMonHead->sMonHead == NULL){
storageMonHead->sMonHead = newStorage;
}
else {
//前插法
newStorage->next = storageMonHead->sMonHead;
storageMonHead->sMonHead = newStorage;
}
}
if(pSHead->sHead == NULL){
pSHead->sHead = storageMonHead;
}
else{
//前插法
storageMonHead->next = pSHead->sHead;
pSHead->sHead = storageMonHead;
}
}

fclose(fp);
return true;
}

//写入数据到内存中
void ExitSys(PGoodsHead pGHead,PStorageHead pSHead)
{
//将商品列表数据写入到文件中
FILE *fpg = fopen("goods.dat","w");
if(!fpg){
printf("打开文件%s失败!(保存数据失败)","goods.dat");
return ;
}
PGoods iteratorg = pGHead->goodsHead;
for(int i = 0;i < pGHead->count; ++i){
fwrite(iteratorg,sizeof(Goods),1,fpg);
iteratorg = iteratorg->next;
}
//将出入库数据写入到文件中
FILE *fps = fopen("storage.dat","w");
if(!fps){
printf("打开文件%s失败!(保存数据失败)","storage.dat");
return ;
}
//写入仓库头
fwrite(pSHead,sizeof(StorageHead),1,fps);
PStorageMonHead it = pSHead->sHead;
for(int i =0;i < pSHead->mcount; ++i){
//写入每个月的仓储头
fwrite(it,sizeof(StorageMonHead),1,fps);
//写入it月的所有出入库数据
PStorage iterator = it->sMonHead;
for(int j = 0;j < it->count;++j){
fwrite(iterator,sizeof(Storage),1,fps);
iterator = iterator->next;
}
it = it->next;
}

fclose(fpg);
fclose(fps);
}
/***********************************************
//商品管理
***********************************************/
//商品添加int insertGoods(PGoodsHead pGHead)
{
//获取一个商品数据
PGoods newGoods;
newGoods = (PGoods)malloc(sizeof(Goods));
memset(newGoods,0,sizeof(Goods));
newGoods->next = NULL;
printf("请输入待添加的商品数据[商品编码 商品名]: ");
scanf("%d %s",&newGoods->code,newGoods->name);
if(checkGoods(pGHead,*newGoods)){
printf("\t该商品已存在,回车返回!\n");
getchar();
getchar();
return 0;
}
//前插法
newGoods->next = pGHead->goodsHead;
pGHead->goodsHead = newGoods;
pGHead->count++;

printf("\n\t添加成功,按回车键返回上一级菜单:");
getchar();
getchar();
return 0;
}
//商品删除
int deleteGoods(PGoodsHead pGHead)
{
if(pGHead->goodsHead == NULL){
printf("\t商品表数据为空,回车返回!\n");
getchar();
getchar();
return -1;
}
//获取商品编码
int code = 0;
printf("\t请输入待删除商品的商品编码:");
scanf("%d",&code);

PGoods iteratorP,iteratorQ = NULL;
iteratorP = pGHead->goodsHead;
while(code != iteratorP->code && iteratorP->next != NULL){
iteratorQ = iteratorP;
iteratorP = iteratorP->next;
}
if(code == iteratorP->code){
if(iteratorP == pGHead->goodsHead)pGHead->goodsHead = iteratorP->next;
else iteratorQ->next = iteratorP->next;
pGHead->count--;
free(iteratorP);
}
else {
printf("\t没有找到该商品编码,回车返回!\n");
getchar();
getchar();
return 0;
}

printf("\n\t删除成功,按回车键返回上一级菜单:");
getchar();
getchar();
return 0;
}
//商品更改
int updateGoods(PGoodsHead pGHead)
{
if(pGHead->goodsHead == NULL){
printf("\t商品表数据为空,回车返回!\n");
getchar();
getchar();
return -1;
}
//获取一个商品数据
PGoods newGoods;
newGoods = (PGoods)malloc(sizeof(Goods));
memset(newGoods,0,sizeof(Goods));
newGoods->next = NULL;
printf("请输入待更新的商品数据[商品编码 商品名]: ");
scanf("%d %s",&newGoods->code,newGoods->name);
//更新商品
PGoods iteratorP,iteratorQ = NULL;
iteratorP = pGHead->goodsHead;
while(newGoods->code != iteratorP->code && iteratorP->next != NULL){
iteratorQ = iteratorP;
iteratorP = iteratorP->next;
}
if(newGoods->code == iteratorP->code){
memset(iteratorP->name,0,128);
strcpy(iteratorP->name,newGoods->name);
}
else {
printf("\t没有找到该商品编码,回车返回!\n");
getchar();
getchar();
return 0;
}
printf("\n\t更新成功,按回车键返回上一级菜单:");
getchar();
getchar();
return 0;
}
//商品查看
int showGoods(const PGoodsHead pGHead)
{
if(pGHead->goodsHead == NULL){
printf("\t商品表数据为空,回车返回!\n");
getchar();
getchar();
return -1;
}
printf("\t商品编码\t商品名\n");
PGoods iterator = pGHead->goodsHead;
for(int i = 0;i < pGHead->count; ++i){
printf("\t%d\t\t%s\n",iterator->code,iterator->name);
iterator = iterator->next;
}
printf("\n\t显示成功,按回车键返回上一级菜单:");
getchar();
getchar();
return 0;
}
//商品检测:是否存在该商品
bool checkGoods(PGoodsHead pGHead,const Goods goods)
{
if(pGHead->goodsHead == NULL){
return false;
}

PGoods iterator = pGHead->goodsHead;
for(int i = 0;i < pGHead->count; ++i){
if(iterator->code == goods.code || (strcmp(iterator->name,goods.name) == 0)){
return true;
}
iterator = iterator->next;
}
return false;
}
/***********************************************
//出入库管理
***********************************************/
//入库检测:是否存在该商品
bool checkInStorage(PStorageMonHead pSMHead,const Storage storage)
{
if(pSMHead->sMonHead == NULL){
return false;
}

PStorage iterator = pSMHead->sMonHead;
for(int i = 0;i < pSMHead->count; ++i){
if(iterator->code == storage.code && (strcmp(iterator->name,storage.name) == 0)){
//存在该商品,更新出入库数据
iterator->inStorage += storage.inStorage;
iterator->quantity = iterator->inStorage - iterator->outStorage;
return true;
}
iterator = iterator->next;
}
return false;
}
//入库
int inStorage(PGoodsHead pGHead,PStorageHead pSHead)
{
//获取一个出/入库数据
PStorage newStorage;
newStorage = (PStorage)malloc(sizeof(Storage));
memset(newStorage,0,sizeof(Storage));
newStorage->next = NULL;
newStorage->quantity = 0;
newStorage->outStorage = 0;
printf("请输入入库数据[月份 商品编码 商品名 入库量]: ");
int mon = 0;
scanf("%d %d %s %d",&mon,&newStorage->code,newStorage->name,&newStorage->inStorage);
//检查商品列表是否有该商品,没有则提示并返回
Goods goods;
goods.code = newStorage->code;
strcpy(goods.name,newStorage->name);
goods.next = NULL;
if(!checkGoods(pGHead,goods)){
printf("\t商品列表中没有该商品,回车返回!\n");
getchar();
getchar();
return -1;
}

PStorageMonHead it = pSHead->sHead;
for(int i = 0;i < pSHead->mcount; ++i){
//存在mon这个月有库存出入
if(it->mon == mon){
//出/入库。检查库存表中是否有商品出入库信息,没有则直接插入,有则直接更新出入库数据
if(!checkInStorage(it,*newStorage)){
//前插法
newStorage->quantity = newStorage->inStorage;
newStorage->next = it->sMonHead;
it->sMonHead = newStorage;
it->count++;
pSHead->allCount++;
break;
}
else break;
}
it = it->next;
}
//mon这个月从没有库存出入,新建
if(it == NULL){
it = (PStorageMonHead)malloc(sizeof(StorageMonHead));
memset(it,0,sizeof(StorageMonHead));
it->mon = mon;
newStorage->quantity = newStorage->inStorage;
//插入出入库节点
newStorage->next = it->sMonHead;
it->sMonHead = newStorage;
it->count++;
pSHead->mcount++;
pSHead->allCount++;
//插入月节点
it->next = pSHead->sHead;
pSHead->sHead = it;
}

printf("\n\t入库成功,按回车键退出入库操作:");
getchar();
getchar();
return 0;
}
//出库检测:是否存在该商品
bool checkOutStorage(PStorageMonHead pSMHead,const Storage storage)
{
if(pSMHead->sMonHead == NULL){
return false;
}

PStorage iterator = pSMHead->sMonHead;
for(int i = 0;i < pSMHead->count; ++i){
if(iterator->code == storage.code && (strcmp(iterator->name,storage.name) == 0)){
//存在该商品,更新出库数据
iterator->outStorage += storage.outStorage;
iterator->quantity = iterator->inStorage - iterator->outStorage;
return true;
}
iterator = iterator->next;
}
return false;
}
//出库
int outStorage(PGoodsHead pGHead,PStorageHead pSHead)
{
//获取一个出/入库数据
PStorage newStorage;
newStorage = (PStorage)malloc(sizeof(Storage));
memset(newStorage,0,sizeof(Storage));
newStorage->next = NULL;
newStorage->quantity = 0;
newStorage->outStorage = 0;
printf("请输入入库数据[月份 商品编码 商品名 入库量]: ");
int mon = 0;
scanf("%d %d %s %d",&mon,&newStorage->code,newStorage->name,&newStorage->outStorage);
//检查商品列表是否有该商品,没有则提示并返回
Goods goods;
goods.code = newStorage->code;
strcpy(goods.name,newStorage->name);
goods.next = NULL;
if(!checkGoods(pGHead,goods)){
printf("\t商品列表中没有该商品,回车返回!\n");
getchar();
getchar();
return -1;
}

PStorageMonHead it = pSHead->sHead;
for(int i = 0;i < pSHead->mcount; ++i){
//存在mon这个月有库存出入
if(it->mon == mon){
//出/入库。检查库存表中是否有商品出入库信息,没有则直接插入,有则直接更新出入库数据
if(!checkOutStorage(it,*newStorage)){
printf("\t该商品没有库存,回车返回!\n");
getchar();
getchar();
return -1;
}
else break;
}
it = it->next;
}

printf("\n\t出库成功,按回车键退出出库操作:");
getchar();
getchar();

return 0;
}

/***********************************************
//统计库存信息
//按时间顺序;按商品编码顺序;入库出库;
***********************************************/
//按月份对库储排序:从小到大
int sortStorageByMon(PStorageMonHead pSMHead)
{
if(pSMHead->sMonHead == NULL){
return -1;
}

PStorage temp = (PStorage)malloc(sizeof(Storage));
for(int i = 0;i < pSMHead->count; ++i){
PStorage iteratorI = pSMHead->sMonHead;
for(int j = 0;j < pSMHead->count-i-1; ++j){
PStorage iteratorJ = iteratorI->next;
if(iteratorI->code > iteratorJ->code){
iteratorI->next = iteratorJ->next;
iteratorJ->next = iteratorI;
if(j == 0)pSMHead->sMonHead = iteratorJ;
else temp->next = iteratorJ;
temp = iteratorJ;
}
}
}
return 0;
}

//显示库储信息
int showStorage(PStorageHead pSHead)
{
if(pSHead->sHead == NULL){
printf("\t出入库表数据为空,回车返回!\n");
getchar();
getchar();
return -1;
}
PStorageMonHead it = pSHead->sHead;
for(int i = 0;i < pSHead->mcount; ++i){
sortStorageByMon(it);
it = it->next;
}
printf("\t月份\t商品编码\t商品名\t库存\t入库\t出库\n");
it = pSHead->sHead;
for(int i = 0;i < pSHead->mcount;++i){
PStorage iterator = it->sMonHead;
for(int i = 0;i < it->count; ++i){
printf("\t%d\t%d\t\t%s\t%d\t%d\t%d\n",it->mon,iterator->code,iterator->name,iterator->quantity,iterator->inStorage,iterator->outStorage);
iterator = iterator->next;
}
it = it->next;
}

printf("\n\t显示成功,按回车键退出查询操作:");
getchar();
getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息