c语言课设仓库管理系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《高级语言程序设计》课程设计
小型仓库管理系统
题目:
班级:
学生学号:
学生姓名:
同组成员:
指导老师:
提交时间:
成绩:
华南农业大学信息学院
一、需求分析
⑴系统概述:
本系统用于小型仓库的信息管理,可实现仓库物品信息的增加、删除、查询、显示功能,以及仓库的入库信息记录、出库信息记录、查询指定物品的信息及出入库记录、显示紧缺物品信息的功能,此外还有密码功能,可保护仓库信息的安全性。

⑵系统运行环境:
本系统方便简捷,对系统的软、硬件要求不高,在任何系统环境下都能很好的运行。

⑶功能需求描述:
本系统分为两大块,分别为系统管理和出入库管理。

其中,系统管理包括增加物品信息、删除物品信息、查询物品信息、显示物品信息、设置仓库密码五个功能;出入库管理包括物品出库、物品入库、库存物品查询、显示紧缺物品四个功能。

以下对各功能作一些介绍:
a.增加物品信息:新增一条物品信息,包括编号、名称、警界库存量。

b.删除物品信息:可通过物品编号或名称删除该物品的信息,物品数为
0时方可删除。

c.查询物品信息:可通过物品编号或名称来查询指定物品的信息,并显
示出来
d.显示物品信息:该功能可以显示所有库存物品的信息,包括物品编号、
名称、警戒库存量、当前库存数。

e.设置仓库密码:为保护仓库数据不被随意窜改,本系统要求仓库管理
员设置密码,成功后可随意更改。

f.物品入库:通过物品编号或名称可实现该指定物品的入库操作,记录
下该物品的入库信息,包括物品编号、入库物品数量、物品单价、提
供商、采购员五个信息。

g.物品出库:通过物品编号或名称可实现该指定物品的出库操作,记录
下该物品的出库信息,包括物品编号、出库物品数量、提货原因、提
货员四个信息。

如果申请的提货数量超过当前库存数时,则操作失败。

h.库存物品查询:通过物品编号或名称可查找该指定物品的信息,包括
编号、名称、警戒库存量、当前库存数五个信息,以及该物品所有的
入库与出库信息。

i. 显示紧缺物品:可以显示出所有库存数低于警戒库存量的物品信息包括物品编号、名称、警戒库存量、当前库存数五个信息点。

二、 总体设计
⑴ 总体开发思想:
a. 系统使用C 语言编译,意在复习之前学习的C 语言程序设计,并对以后所学之数据结构知识作初步的认识和预习。

b. 采用的主要数据结构是链表。

本系统采用链表来储存一整个文件中的数据,然后通过插入结点与删除结点的方法来进行数据的更改,最后把链表内容覆盖文件原有的数据,实现数据的更改。

c. 数据存贮方式包括链表、文件两种,其中链表主要用于需要更改文件中数据时的数据暂存,实现把局部的数据进行更改的作用。

文件主要用来永久性的数据存储,以及数据的提取与写入。

⑵ 系统模块结构图:
说明:本仓库管理系统有密码验证成功后登录,进入主菜单。

在主菜单中可实现个功能模块选择,功能模块主要有两个,一个是系统管理模块,一个是出入库管理模块。

而主功能模块下又有各自的详细功能:系统管理模块包含增加、删除、查询、显示物品信息和更改密码的功能;出入库管理模块包含物品出库、入库,库存物品信息查询和紧缺物品信息列表显示的功能。

⑶模块设计:
下面对上面的流程图做详细介绍:
1.密码登陆模块:
为保护仓库信息安全,本系统使用密码验证登陆。

首次使用本系统需要设置密码,以后凭密码登录。

密码为字符型,可以使用数字加字母、标点符号组成。

当输入两次一致的初始密码后,进入系统。

2.主菜单模块:
主菜单包括4个功能键:1系统管理、2出入库管理、3帮助、4退出。

进入主菜单后,根据面板上的数字指令进行操作(详细面板见后)。

若输入错误指令如:0,a,+,等字符,则系统不做任何处理,直到输入正确的指令后,系统根据指令运行。

3.系统管理菜单模块:
在主菜单按指令1后会进入系统管理菜单,她包括6个功能键:增加物品、删除物品、查询物品、显示物品、更改密码。

同样,若在这时输入错误指令,系统不会做任何处理。

输入正确指令后,进入相应的功能中,按6可以返回主菜单
a.增加物品信息:
新增一条物品信息,包括编号、名称、警界库存量。

若增加的物品信息中,发现仓库内物品的两个信息:编号或者名称一样的话,会打印出仓库内相同物品的信息,并报告保存失败。

在保存成功或保存失败后,我们都可以按ENTER键进行继续增加的操作,也可以按任意键结束物品的增加。


加的物品信息会以编号为准进行升序排序,使信息有序。

注意,在输入信息时如果输入的数据有误,如编号、警戒库存量用字母写入,则会提示数据有误,允许在当前页面重新输入数据。

b.删除物品信息:
可通过物品编号或名称删除物品的信息,物品数为0时可删除。

进入此功能后,我们首先选择删除方式:1编号或者2名称,若输入3,则返回系
统管理菜单。

若按其他键则系统不做任何处理。

当选择删除的物品中库存
值为0时,系统会提示是否删除。

选Y则删除,选N不删除。

操作过后
会返回系统管理菜单。

在输入信息时如果输入的数据有误,如编号用字母写入,则会提示数据有误,允许在当前页面重新输入数据。

c.查询物品信息:
可通过物品编号或名称来查询指定物品的信息,并显示出来。

同样,进入此功能后,我们首先选择查询方式:1编号或者2名称,若输入3,则返
回系统管理菜单。

输出的物品信息包括物品编号、名称、警戒库存量和当前库存量。

在输入信息时如果输入的数据有误,如编号用字母写入,则会提示数据有
误,允许在当前页面重新输入数据。

d.显示物品信息:该功能可以一列表形式显示所有库存物品的信息,包括物
品编号、名称、警戒库存量、当前库存数。

e.设置仓库密码:进入此功能后,我们需要输入两个相同的新密码,密码格
式有数字、字母和标点符号组成,长度在20个字符以内。

若输入的两个新密码不一致,则返回系统管理菜单。

若密码一致则会打印出新密码,提示提示使用者记住,然后返回。

4. 出入库管理菜单模块:
在主菜单按指令2后会进入系统管理菜单,她包括5个功能键:物品出库、物品入库、库存物品查询、显示紧缺物品信息。

同样,若在这时输入错误指令,系统不会做任何处理。

输入正确指令后,进入相应的功能中。

按5可返回主菜单。

a.物品入库:
若仓库中无物品信息,则返回库存管理菜单。

否则:
通过物品编号或名称进行指定物品的入库操作。

其中,按1通过编号入库,按2通过名称入库,按3可返回库存管理菜单,输入其他错误的指令则系统不作处理。

开始入库操作后,输入相应的信息,包括物品编号、入库物品数量、物品单价、提供商、采购员,系统会找出相匹配的物品信息进行出库操作。

若存在该物品,系统会记录下该物品的入库信息,成功后返回库存管理菜单,否则也会返回。

注意,在输入信息时如果输入的数据有误,如编号、入库数、单价用字母写入,则会提示数据有误,允许在当前页面重新输入数据。

b.物品出库:
若仓库中无物品信息,则返回库存管理菜单。

否则:
通过物品编号或名称进行指定物品的出库操作。

其中,按1通过编号出库,按2通过名称出库,按3可返回库存管理菜单,输入其他错误的指令则系统不作处理。

开始出入库操作后,输入相应的信息,包括物品编号、出库物品数量、提货原因、提货员四个信息。

如果存在该物品并且申请的提货数量在合理范围内时,则操作成功,系统会记录下该物品的出库信息并返回,否则如出库数超过当前库存数,会失败并返回。

注意,在输入信息时如果输入的数据有误,如编号、出库数用字母写入,则会提示数据有误,允许在当前页面重新输入新数据。

c.库存物品查询:
若仓库中无物品信息,则返回库存管理菜单。

否则:
通过物品编号或名称可查找该指定物品的信息。

其中,按1通过编号查询,按2通过名称查询,按3可返回库存管理菜单,输入其他错误的指令则系统不作处理。

当找到匹配的物品信息时,打印物品信息包括编号、名称、警戒库存量、当前库存数五个信息,以及该物品所有的入库与出库信息。

若物品无出库活入库信息,系统也会打印出提示。

在输入信息时如果输入的数据有误,如编号用字母写入,则会提示数据有误,允许在重新输入新编号。

d.显示紧缺物品:
此功能可以显示出所有库存数低于警戒库存量的物品信息,包括物品编
号、名称、警戒库存量、当前库存数五个信息点,以列表的形式打印出来,按任意键后返回库存管理菜单。

5. 其他模块:
主菜单上有另外两个功能键:帮助、退出。

a.帮助:
在主菜单上按指令3可显示帮助信息,里面详细介绍本系统的功能、使用方法,以及注意事项。

有此可以帮助使用者更好的使用本软件,驾驭本软件。

按任意键可以返回主菜单。

b.退出:
在主菜单上按指令4可以安全的退出系统,并且显示退出页面,图见后。

⑷界面设计:界面的布局(可以采用截图)及使用操作;
1.首先进入的是首次使用系统的初密码设置功能(如图):
首次使用本系统需要设置密码,密码为字符型,由数字、字母、标点符号组成。

密码不一致,重新输入(直到输入连个一致的密码为止)
当输入两次一致的初始密码后,进入系统。

2.接下来是主菜单
在这里输入1、2、3、4,可以进入相应的功能中。

按3进入帮助系统页面:
按4退出系统:
3.系统管理
在主菜单按1请进入系统管理菜单
按1为增加物品功能(输入示例数据,可以一条条的增加物品信息)
增加完毕后返回
按2为删除物品信息功能(已输入示例数据)
选择Y,或N,这里选N
按3进入物品查询功能(已输入示例数据)
按4进入显示物品功能
按5更改密码(若输入的两个新密码不一致则返回系统管理菜单)
按6返回主菜单。

4.出入库管理
在主菜单按2进入库存管理菜单
按2进行物品入库操作(已输入示例数据)
数据有误,返回
数据无误,成功后返回。

按1进行物品出库操作
成功
按3进入库存查询
查询结果:
按4显示紧缺物品信息
以上详细操作可以参照模块设计部分。

⑸数据结构设计:
主要定义了一个结构体:物品信息结构体。

如下面代码:
struct wupinxinxi//物品结构体
{
int bianhao,jingjiekucunliang,kucun;
char mingcheng[20];
struct wupinxinxi *next;
}; //定义结构体包含bianhao,mingcheng,jingjiekucunliang,kucun四个成员,建立单向链表结点的类型
源代码中,在几个函数中使用到了构体类型指针变量,入增加物品中(代码如下):
struct wupinxinxi *head=NULL;
struct wupinxinxi *p0,*p1,*p2;//定义结构体类型指针变量
此外所有的函数中都用到了结构体指针,用来进行文件的各种操作,包括创建、清空、追加信息等。

三、详细设计
1.模块功能:
本系统有两大功能模块,系统管理及出入库管理。

a.系统管理可实现仓库物品信息的增加、删除、查询、显示功能和密码更
改功能。

b.出入库管理包括仓库的入库信息记录、出库信息记录、查询指定物品的
信息及出入库记录、显示紧缺物品信息的功能。

c.此外还有帮助、退出功能。

帮助功能详细介绍本系统的功能、使用方法,
以及注意事项。

2.主要函数:
主要有三大函数:主干函数void zhuhanshu();系统管理函数void
xitongguanli()和库存管理函数void kucunguanli()。

其中主函数main()调用主干函数;
系统管理函数调用子函数有:
void zengjiawupin()//增加物品信息函数
void shanchuwupin()//删除物品信息函数
void chaxunwupin()//查询物品信息函数
void xianshiwupin()//显示物品信息函数
void genggaimima()//更改密码函数
库存管理函数调用的子函数有:
void chuku()//物品出库函数
void ruku()//物品入库函数
void kucunchaxun()//查询库存信息函数
void xianshijinque()//显示紧缺物品函数
此外还有其他函数:
int tongjiwupin()//统计物品个数函数
int tongjichuku()//统计出库个数函数
int tongjiruku()//统计入库个数函
void tuichu()//退出画面
void zhucaidan()//显示主菜单
void bangzhu()//帮助系统函数
void denglu()//验证密码函数
在这里展现一些函数参数及其含义:
FILE *fp;//定义结构体指针
struct wupinxinxi *head=NULL;//定义头位空
struct wupinxinxi *p0,*p1,*p2;//定义结构体类型指针变量
char xuanze=13;//创建变量为ENTER键值,用于后面的按键功能
int bianhao1=0,hao=0,jing=0,cun=0,chukushu=0,n=0,k=0,flag=0,i;
char
mingcheng1[20]={'\0'},ming[20]={'\0'},shang[20]={'\0'},yuanyin[100]={'\0'},tihuoy uan[20]={'\0'};//定义变量(一定长度)
3.主要程序清单:
a.这是系统主菜单的代码:
void xitongguanli()//系统管理函数
{
char xuanze;//创建变量,用来储存键值
void zengjiawupin();
void shanchuwupin();
void chaxunwupin();
void xianshiwupin();
void genggaimima();//声明函数
xitongguanlicaidan();//调用菜单函数
xuanze=getch();
for(;xuanze!='1'&&xuanze!='2'&&xuanze!='3'&&xuanze!='4'&&xuanze!='5'& &xuanze!='6';)//判断:键值是否有效
xuanze=getch();
switch(xuanze)//选择功能函数
{
case '1':zengjiawupin();break;//进入增加物品功能
case '2':shanchuwupin();break; //进入删除物品功能
case '3':chaxunwupin();break; //进入查询物品功能
case '4':xianshiwupin();break; //进入显示物品功能
case '5':genggaimima();break; //更改密码功能
case '6':zhuhanshu();break; //返回主函数功能
}
}
b.这是统计物品信息条数函数的代码:
int tongjiwupin()//统计物品个数函数
{
FILE *fp;//定义结构体指针
int bianhao=0,kucun=0,jingjiekucunliang=0,n;
char mingcheng[20]={'\0'},tigongshang[20]={'\0'};//定义变量
fp=fopen("wupinxinxi.dat","r");//打开文件
for (n=0;!feof(fp);n++)//计算信息条数
fscanf(fp,"%d %s %d %d",&bianhao,mingcheng,&jingjiekucunliang,&kucun);
n--;
fclose(fp);//关闭文件
return (n);//返回信息条数
}
c.这个事很重要的一个:库存物品信息查询,输出包括物品信息积极所有的
出入库信息:
void kucunchaxun()//查询库存信息函数
{
FILE *fp;//定义结构体变量
int
bianhao=0,hao=0,jing=0,cun=0,rukushu=0,chukushu=0,flag=0,k=0,n=0,i,count =0;//定义变量
float danjia=0;
char
mingcheng[20]={'\0'},ming[20]={'\0'},shang[20]={'\0'},caigouyuan[20]={'\0'},ti gongshang[20]={'\0'},yuanyin[100]={'\0'},tihuoyuan[20]={'\0'};
char xuanze;//创建变量,用来储存键值
system("cls");
if((fp=fopen("wupinxinxi.dat","r"))==NULL)//判断文件是否存在,若不存在则新建
{
printf("\n\n\n\n\n\n\n\n\n 当前仓库无物品信息!\n\n 请按任意键返回库存管理菜单");
getch();
kucunguanli();
}
k=tongjiwupin();//统计物品信息条数
if(k==0)//若无物品,则返回主函数
{
printf("\n\n\n\n\n\n\n\n\n 当前仓库无物品信息!\n\n 请按任意键返回主菜单");
getch();
zhuhanshu();
}
else
{
system("cls");
printf("\n\n 请输入查库方式(按3可返回库存管理菜单):\n 1.通过编号入库 2.通过名称入库");
xuanze=getch();
for(;xuanze!='1'&&xuanze!='2'&&xuanze!='3';)
xuanze=getch();
if (xuanze=='1')//通过物品编号查询
{
printf("\n 请输入物品编号:");
scanf("%d",&bianhao);
for(;bianhao==0;)//判断数据是否有误(编号不能为0或者字符),若有误则重输
{
scanf("%s",mingcheng);
printf("\n 输入错误,请重新输入!");
printf("\n 请输入物品编号:");
scanf("%d",&bianhao);
}
}
if (xuanze=='2')//通过物品名称查询
{
printf("\n 请输入物品名称:");
scanf("%s",mingcheng);
}
if (xuanze=='3')//返回库存管理菜单
kucunguanli();
system("cls");
fp=fopen("wupinxinxi.dat","r");//打开文件
for(i=0;i<k;i++)//逐条读取物品信息,寻找匹配信息
{
fscanf(fp,"%d%s%d%d",&hao,ming,&jing,&cun);
if(bianhao==hao||!strcmp(mingcheng,ming))
{
printf("\n\n 物品编号为:%d,名称为:%s警戒库存量为:%d当前库存量为:%d\n\n",hao,ming,jing,cun);//找到匹配信息打印
flag=1;//标记
}
}
fclose(fp);//关闭文件
if(flag==0)//若找不到匹配信息则返回库存管理菜单
{
printf("\n\n\n 不存在该物品!请按任意键返回库存管理菜单");
getch();
kucunguanli();
}
if((fp=fopen("ruku.dat","r"))==NULL)//判断文件是否存在,若不存在则新建
{
fp=fopen("ruku.dat","w");
fclose(fp);
}
k=tongjiruku();//统计入库信息条数
if(k==0)//无入库信息
{
printf(" 此物品尚无入库信息!");
}
else
{
fp=fopen("ruku.dat","r");//打开文件
for(i=0;i<k;i++)//逐条寻找匹配的入库信息,找到则打印出来
{
fscanf(fp,"%d%s%d%f%s%s",&hao,ming,&rukushu,&danjia,shang,caigouyua n);
if(bianhao==hao||!strcmp(mingcheng,ming))
{
printf(" 第%3d次入库:入库数:%d,单价:%.2f,提供商:%s,采购员:%s\n",++count,rukushu,danjia,shang,caigouyuan);
flag=1;//标记
}
}
fclose(fp);
if(flag==0)//没有匹配的入库信息
printf(" 此物品尚无入库信息!");
}
printf("\n");
flag=0;//初始化变量
count=0;//初始化变量
if((fp=fopen("chuku.dat","r"))==NULL)//判断文件是否存在,若不存在则新建
{
fp=fopen("chuku.dat","w");
fclose(fp);
}
k=tongjichuku();//统计出库信息条数
if(k==0)//没有出库信息
{
printf(" 此物品尚无出库信息!");
}
else
{
fp=fopen("chuku.dat","r");//打开文件
for(i=0;i<k;i++)//逐条寻找匹配的出库信息,找到则打印出来
{
fscanf(fp,"%d%s%d%s%s",&hao,ming,&chukushu,yuanyin,tihuoyuan);
if(bianhao==hao)
{
printf(" 第%3d次出库:出库数:%d 原因:%s 提货员:%s\n",++count,chukushu,yuanyin,tihuoyuan);
flag=1;//标记
}
}
fclose(fp);
if(flag==0)//没有匹配的出库信息
printf(" 此物品尚无出库信息!");
}
}
printf("\n\n\n 请按任意键返回库存管理菜单"); getch();
kucunguanli();//返回库存管理菜单
}
由于代码量过多,在此不枚举。

请打开我的c文件查看。

谢谢!
四、总结
在这次程序设计的过程中,我的确遇到了不少困难。

首先是知识的遗忘、生疏,以及在以前的学习中留下的难点——链表和文件!在以前的学习中,链表和文件是我最头疼的事情,虽读书过十遍,却还是不能理解透彻,更别提应用自如了。

在代码的完成过程中,很多地方需要用到链表和文件,特别是文件。

而我的程序思路又是这样的:建一个存放文件信息的文件,一个存放物品出库信息的文件,一个存放物品入库信息的文件,还有一个存储密码的文件。

这样就有了四个文件。

我这样考虑是有原因的,因为系统有一个功能就是要打印物品信息以及所有的出入库信息,这样文件多了虽然代码实现比较麻烦,可是却能更好的存放信息和读取信息。

经过近一个月的的奋斗,我终于完成了,虽然有一小部分是参考网上的代码的出来的,但我的知识着实巩固了很多,提高了很多!现在想想我当时的“四个文件”想法,觉得有些幼稚。

现在我想到一些方案,我们完全可以将四个文件合并成为一个!只需要在写入文件时用代码实现加入标记的符号!比如说,密码放在文件的第一行,除了密码功能,其他操作都不需要去读第一行的数据,直接从第二行读起。

而物品信息在他的数据面前加一个编辑号,如1,那么,一个信息为编号10,名称wupin,警戒库存量5,写进文件时就变成:
1(标记)10(编号)wupin(名称)5(警戒库存量)0(初始库存为0)其他的出库、入库信息记录也采用相似的方法,那么在读取数据出来时,通过第一个数据(标记)就可知道读取的是物品信息还是出库信息、入库信息了。

需要注意的是,每次往文件里边写数据,都要写进一些“垃圾信息”,而读出来时我们要筛选需要的数据。

像这样吧几个文件抽在一起,需要写进去的数据有:编号,名称,警戒库存量,当前库存值,出库数,提货员,提货原因,……,入库数,采购员,……。

不知道这要的想法老师认不认同?
经过这次课程设计,我不再畏惧链表、文件!相反,我开始觉得他们很有趣。

就像老师当时所说,理解了就会了,很简单的!我想,以后学习数据结构时我会跟容易学好,更有激情去学习!!!。

相关文档
最新文档