搜档网
当前位置:搜档网 › C语言仓库管理系统-数据结构-课程设计

C语言仓库管理系统-数据结构-课程设计

C语言仓库管理系统-数据结构-课程设计
C语言仓库管理系统-数据结构-课程设计

C语言仓库管理系统-数据结构-课程设

C语言仓库管理系统-数据结构课程设计

一、程序设计目标

1. 问题描述

2. 问题分析

二、概要设计

1. 方案确定

2. 程序设计模块连接图

3. 模块功能说明

三、详细设计

1. 数据设计

2. 流程框图

四、C源程序清单

五、调试分析和测试结果

六、软件使用说明书

七、附录

程序设计书

题目:仓库货品管理系统

一、程序设计目标

1.问题描述

一个库存货品信息管理系统软件,要求能实现库存货品信息的输入、插入、删除、查找等功能,并能建立和更新的库存信息保存于文件供输出或打印。对于查找、删除等功能要求能按货品名、货品号分别进行。每个货品的相关信息包括:货品号、货品名、货品库存量、进货日期、货品生产厂家及供应商等。2.问题分析

实际上要完成的是一个简单数据库管理信息系统的设计,同时要掌握数据结构方面的知识。

二、概要设计

1.方案确定

库存货品信息管理系统要求实现许多功能,可遵循结构化程序设计思想来进行本系统的设计——自顶向下,逐步细化,也就是将软件设计任务划分成许多容易解决的小的子任务,即分解出许多子功能模块进行设计。本程序经过分析可划分出6个子任务:输入、输出、插入、删除、查找和保存。

2.程序设计模块连接图

库存货品信息管理系统的模块连接结构如下图:

3.模块功能说明

对本系统的功能进行分析后可作如下的模块化设计:

输入模块实现功能:按顺序将货物编号、货物名称、货物数量依次输入,并建立链表将其连接。当输入的货品编号为0时,输入结束。

插入模块实现功能:向已经存盘的文件中再输入货品的信息,包括货品编号、货品名称、货品数量等等。

删除模块实现功能:在已经存储的文件中删除指定的货品信息,并释放内存空间。删除可以按照货品编号和货品名称两中方法进行。

查找模块实现功能:在已经存储的文件中查找指定的货品信息。可以按照查找货品编号和货品名称两种方法进行。

输出模块实现功能:在输入特定的文件名之后,输出该文件中所包含的全部货品信息。

保存模块实现功能:进行上述操作后,都要进行保存操作,链表中的信息以文件形式被长期。保存。

载入模块实现功能:将磁盘上的数据文件载入链表。

主序模块实现功能:完成系统的界面处理,包括开始界面和主菜单界面。

三、详细设计

1.数据设计

(1)数据结构的选择

选取动态数据结构,本系统是通过双向链表来完成的。

动态存储分配与释放:

①申请存储空间函数malloc( )

函数首部原型为

void * malloc(unsigned int size)

②释放存储空间函数free( )

函数首部原型为

void free(void*p)

动态数据结构——双向链表

head 2030 2036

2025 2042 head 2030 2036 2025

(2) 数据类型的选择

struct commodity /*定义双向链表结构体*/

{int number; /*货物编号*/

char name[max]; /*货物名称*/ int counter; /*货物数量*/

struct commodity *piror, *next; /*定义两指针,分别指向其前驱和后继*/

};

(3)变量函数说明:

COM *input( )

操作结果:输入货品信息

COM *insert_perf( )670

C语言仓库管理系统-数据结构

操作结果:插入某货品

COM *del_perf( )

操作结果:删除某货品

serch( )

操作结果:查找某货品

print_perf( )

操作结果:输出某货品

save(COM*head)

操作结果:保存

COM *openfile( )

操作结果:载入

2.流程框图

查找模块和载入模块的算法框图在此略。

(1)输入模块(2)插入模块

(3)删除模块(4)保存模块

(5)输出模块对以上各模块的文字解释说明:

(1)输入模块:其实就是一个建立链表的操作模块。建立链表的具体操作就是逐一输入各结点数据,并建立其前后相链的关系。首先设三个指针变量:head,ptr1,ptr2。它们都是指向结构体类型数据的。先使head的值为NULL,

这是链表为空的情况。用malloc函数开辟一个结点,并使ptr1,ptr2都指向它,之后从键盘读入一个货品的数据给ptr1所指向的结点。当输入的ptr1-

>num不为0时,令head=ptr1;ptr2=ptr1,即把ptr1的值赋给head,使

ptr2,ptr1,head都指向这一新开辟的结点,此结点就成为链表中的第一个结点。再开辟一个新结点并使ptr1指向它,读入该结点的数据,如果输入的

ptr1->num不为0,则应链入这第二个结点,这时和上一个结点的处理不同,是将ptr1的值赋给ptr2->next,也就是使第一个结点的next成员指向第二个结点,接着将ptr2也指向结点2。再开辟一个新结点并使ptr1指向它,读入该

结点的数据,同样将ptr1的值赋给ptr2->next,也就是使第三个结点链接到

第二个结点之后,并接着将ptr1的值赋给ptr2,使ptr2指向结点3。再开辟一个新结点,并使ptr1指向它,输入该结点的数据,如果输入ptr1->num为0,则是输入结束标志,此结点不被链接到链表中,就将NULL赋给ptr2->next。

建立链表过程至此结束,ptr1最后所指结点并未链入链表中。

(2)插入模块:要完成的是链表的插入操作,即将一个新结点插入到一个已有的链表中,对刚刚建立的链表,首先新设一个指针变量ptr0,并开辟一个结点使ptr3指向它,输入该结点的数据,即新货的有关数据,接下来查找要插入位置结点,找到后只需修改此结点和ptr0指向结点指针域的值即可,链表中所有

元素位置均不需移动,这就体现了链表的优点。

(3)删除模块:要完成的是链表的删除操作,只需修改链表中要删除结点的前一个结点的链指针。使之指向被删除结点的后面一个结点即可。

(4)保存模块:将最终想要保留的数据信息保存于文件中。

(5)输出模块:要完成的是依次输出链表中各结点的数据的操作。首先找到链表头结点的地址,也就是head的值,然后设一个指针变量ptr1,先指向第一

个结点,输出ptr1所指的结点,然后使ptr1后移一个结点,再输入直至链表的尾结点结束。

四、C源程序清单

#include /*标准输入/输出头文件*/

#include /*包含绘制图形函数等头文件*/

#include /*包含字符串处理函数头文件*/ #include /*包含动态存储与释放函数头文件*/

#include

#define LEN sizeof(COM)

#define PRINT "% -15ld% -15s% -15d\n",ptr1->num,ptr1->name,ptr1-

>count

#define CHECK_COUNT ptr1->count<0

#define CHECK_COUNT2 ptr3->count<0

#define NULL 0

typedef struct com

{long int num;

char name[10];

int count;

struct com *prior, *next;

}COM; /*定义结构体*/ COM *input(); /*输入货品信息*/ COM *insert( ); /*插入货品信息*/ COM *delet( ); /*删除货品信息*/ void search( ); /*查找货品信息*/ void save(COM *head); /*保存货品信息*/

COM *openfile( ); /*从文件将货品信息载入链表*/

void print( ); /*输出货品信息*/ FILE *fp; /*定义指向文件的指针变量*/

COM *head=NULL;

COM *ptr1=NULL,*ptr2=NULL;

char filename1[10]; /*定义字符数组,用来存放文件名*/

char filename2[ ]={".dat"}; /*文件扩展名.dat*/

https://www.sodocs.net/doc/c3454074.html,

char string3[ ]={"count"};

int n=1;

if((ptr1=(COM*)malloc(LEN))==NULL) /*申请空间函数*/ {printf("No enough memory,fail to creat linklist!");

getch( );

/*无回显的从键盘读取任意一个字符*/

}

clrscr( );

printf("Please input depend on the emply(goodsnumber==0 over):\n");

C语言仓库管理系统-数据结构

do

{printf("Please input the No.%d goods''%s:\n",n,string1);

scanf("%ld",&ptr1->num);flushall();

if(ptr1->num==0)

{printf("Please press any key to back to last Menu:");

getch( );

free(ptr1);

return(0);

}

printf("Please input the No.%d

goods''%s:\n",n,string2);scanf("%s",&ptr1->name);

flushall( );

/*刷新缓冲区函数*/

printf("Please input the No.%d

goods''%s:\n",n,string3);scanf("%d",&ptr1->count);

flushall( );

if(CHECK_COUNT)

printf("Please input the right goodscount!\n");

}while(CHECK_COUNT);

while(ptr1->num!=NULL)

{ if(n==1)

head=ptr1;

else ptr2->next=ptr1;

ptr1->prior=ptr2;

n=n+1;

ptr2=ptr1;

if((ptr1=(COM* )malloc(LEN))==NULL)

{ printf("No enough memory,fail to creat linklist!");

getch( );

}

do

{printf("Please input the No.%d goods''%s:\n",n,string1);

scanf("%ld",&ptr1->num);

flushall( );

if(ptr1->num==0)

{ptr1->num=NULL;

break;}

printf("Please input the No.%d

goods''%s:\n",n,string2);scanf("%s",&ptr1->name);

flushall( );

printf("Please input the No.%d

goods''%s:\n",n,string3);scanf("%d",&ptr1->count);

flushall( );

if(CHECK_COUNT)

printf("Please input the right goodscount!\n");

}while(CHECK_COUNT);

}

ptr2->next=NULL;

gotoxy(1,24);

printf("Finish the inputting of goods''message,press any key to back to last Menu,please save:");

getch();

return(head);

}

/*插入模块*/

COM * insert( )

{COM * ptr3;

char string1[ ]={"goodsnumber"};

char string2[ ]={"goodsname"};

char string3[ ]={"goodscount"};

char judge[10];

clrscr( );

gotoxy(18,10);

printf("Please input inserted goods''fliename:");

head=openfile( );

if(head==NULL)

return(NULL);

else

do

{clrscr( );

printf("Please input inserted goods''goodsmessage:\n");

if((ptr3=(COM*)malloc(LEN))==NULL)

{printf("No enough memory,fail to creat node!");

getch();

}

do

{printf("Please input

goods''%s(>0):\n",string1);scanf("%ld",&ptr3->num);

flushall( );

if(ptr3->num<=0)

{printf("Error inputting!please choose the inserted goods again\n");

getch( );return;

}

printf("Please input goods''%s:\n",string2);scanf("%s",&ptr3->name);flushall( );

printf("Please input goods''%s:\n",string3);scanf("%d",&(ptr3->count)); flushall( );

if(CHECK_COUNT2)

printf("Please input the right goodscount(>0)!\n");

}while(CHECK_COUNT2);

ptr1=head;

while(ptr1!=NULL)

{ptr2=ptr1;

ptr1=ptr1->next;

ptr1->prior=ptr2;

}

ptr2->next=ptr3;

ptr3->prior=ptr2;

ptr3->next=NULL;

printf("\nInserting success!Cotinue to insert?(yes or no):");

scanf("%s",judge);

clrscr( );

}while(! strcmp(judge,"yes"));

gotoxy(20,10);

printf("Inserting success!\n");

gotoxy(18,11);

printf("Press any key to back to last Menu\n");

gotoxy(16,12);

printf("And make sure to Save(6) them or you will lose them!\n"); getch( );

return(head);

}

/*删除模块*/

COM *delet( )

{char name[10];

char judge[10];

https://www.sodocs.net/doc/c3454074.html,

gotoxy(20,10);

printf("Please input delected goods''fliename:");

head=openfile( );

clrscr( );

if(head==NULL)

return(NULL);

else

do

{do

{clrscr( );

gotoxy(3,4);

printf("Please input delected goods''message:");

gotoxy(1,9);

printf("

*1.Del depend on goodsnumber\n");

gotoxy(1,10);

C语言仓库管理系统-数据结构

printf(" *2.Del depend on goodsname\n");

gotoxy(10,22);

printf("please choose a number between 1 and 2:");

scanf("%d",&sel);

switch(sel)

{case 1:clrscr( );

gotoxy(6,6);

printf("Please input goodsnumber:");

scanf("%d",&del_num);

break;

case 2:clrscr( );

gotoxy(6,6);

printf("Please input goodsname:");

scanf("%s",&name);

break;

}

}while(sel!=1&&sel!=2);

ptr1=head;

if(ptr1->num==del_num||(strcmp(ptr1->name,name)==0))

{ head=ptr1->next;

printf("Success to delect goodsmessage!\n");

}

else /*判断是否是目标结点*/

{ while(ptr1!=NULL&&ptr1->num!=del_num&&strcmp(ptr1-

>name,name)!=0)

{ptr2=ptr1;

ptr1=ptr1->next;

ptr1->prior=ptr2;

}

if(ptr1->num==del_num||(strcmp(ptr1->name,name)==0))

{ptr2->next=ptr1->next;

ptr1->next->prior=ptr1->prior;

free(ptr1);

printf("\nSuccess to delect goodsmessage!\n\n");

}

else printf("\nCan''t find this goodsmessage!\n\n");

}

printf("Cotinue to delect?(yes or no):");

scanf("%s",judge);

}while(!strcmp(judge,"yes"));

clrscr( );

gotoxy(20,10);

printf("Delecting success!\n");

gotoxy(18,11);

printf("Press any key to back to last Menu\n");

gotoxy(16,12);

printf("And make sure to Save(6) them or you will lose them!\n"); getch( );

return(head);

}

/*查找模块*/

void search( )

{char name[10];

char judge[10];

int sel;

long int sel_num;

clrscr( );

gotoxy(18,10);

printf("Please press searched goods''fliename:");

head=openfile( );

if(head==NULL)

return;

else

do

{do

{clrscr( );

gotoxy(5,4);

printf("Please choose the way to search:");

gotoxy(1,9);

printf(" *1. Search depend on goodsnumber\n");

printf(" *1. Search depend on goodsname\n");

gotoxy(10,22);

printf("please choose a number between 1 and 2:");

scanf("%d",&sel);

switch(sel)

{case 1:clrscr( );

printf("Please input goodsnumber:");

scanf("%ld",&sel_num);

break;

case 2:clrscr( );

printf("Please input goodsname:");

scanf("%s",name);

break;

}

}while(sel!=1&&sel!=2);

ptr1=head;

while(ptr1!=NULL&&ptr1->num!=sel_num&&strcmp(ptr1-

>name,name)!=0)

ptr1=ptr1->next;

if ((ptr1->num==sel_num)||(strcmp(ptr1->name,name)==0))

{printf("\n Success to search goodsmessage!\n");

printf("goodsnumber goodsname goodscount\n\n");

printf(PRINT);

}

else

printf("\nCan''t find this goodsmessage!\n\n");

printf("Cotinue to search?(yes or no):");

scanf("%s",judge);

}while(!strcmp(judge,"yes"));

gotoxy(10,24);

printf("Please press any key to back to last Menu:");

getch( );

}

/*输出模块*/

void print( )

{int i=1;

clrscr( );

gotoxy(18,10);

printf("Please input printed goods''filename:");

head=openfile( );

if(head==NULL)

https://www.sodocs.net/doc/c3454074.html, follows:\n");

printf("goodsnumber goodsname goodscount\n\n");

ptr1=head;

do

{printf(PRINT);

ptr1=ptr1->next;

if(i/10==1) /*超过十行换页*/

https://www.sodocs.net/doc/c3454074.html,

clrscr( );

gotoxy(0,6);

printf("goodsnumber goodsname goodscount\n\n");

}

i=i+1;

}while(ptr1!=NULL);

gotoxy(10,24);

printf("Please press any key to back to last Menu:");

getch( );

}

C语言仓库管理系统-数据结构

/*保存模块*/

void save(COM *head)

{ clrscr();

gotoxy(8,13);

printf("Please input saved goods''filename(limit to letter or number):");

scanf("%s",filename1);

if((fp=fopen(strcat(filename1,filename2),"wb"))==NULL) /*以二进制只写方式打开一个流*/

{printf("Fail to creat FILE!");

getch( );

return;

}

ptr1=ptr2=head;

while(ptr1!=NULL)

{if(fwrite(ptr1,sizeof(COM),1,fp)!=1)

{printf("Fail to print message to FILE!");

getch( );

return;

}

ptr1=ptr1->next;

}

fclose(fp);

gotoxy(10,24);

printf("Saving success!Press any key to back to last Menu:");

getch();

}

/*载入模块*/

COM * openfile( )

{int n=1;

scanf("%s",filename1);

if((fp=fopen(strcat(filename1,filename2),"rb"))==NULL)

{gotoxy(15,13);

printf("This filename isn''t exist,please check if exist.\npress any key back to Menu");

getch( );

return(NULL);

}

if((ptr1=ptr2=(COM*)malloc(LEN))==NULL)

{printf("No enough memory,fail to creat linklist!\nPlease press any key back to Menu\n");

getch( );

return(NULL);

}

if(fread(ptr1,sizeof(COM),1,fp)!=1) /*从fp指向的流中读取1个字段,每个字段为COM的字符长,并把它们放到ptr1指向的字符数组中,文件的位置指示器随着所读取的字符数而下移*/

{printf("Fail to print message from FILE!\nPlease press any key back to Menu\n");

getch( );

return(NULL);

}

if(ptr1->next==NULL)

head=ptr1;

else

{ do

{if(n==1)

head=ptr1;

else ptr2->next=ptr1;

n=n+1;

ptr2=ptr1;

if((ptr1=(COM*)malloc(LEN))==NULL)

{printf("No enough memory,fail to creat linklist!\nPlease press any key to back to Menu\n");

getch( );return(NULL);

}

if(fread(ptr1,sizeof(COM),1,fp)!=1)

{printf("Fail to print message from FILE!\nPlease press any key to back to Menu\n");

getch( );return(NULL);

}

}while(ptr1->next!=NULL);

ptr2->next=ptr1;

}

return(head);

fclose(fp);} /*关闭文件函数*/

void main( )

{char message[ ]={" ----*The instruction of GOODS SYSTEM*----- \n\n"

" You can input many kinds of messages,and you can use \n"

" goodname as

FILEname

\n"

" This SYSTEM can do operation like insert or delect to the \n"

" goodsmessage that have saved,then saved again.while you \n"

" can search message depend on the goodsnub or goodsname. \n\n\n"

" ---*Welcome to enter the GOODS SYSTEM!*--- \n"

};

char

menu[ ]={" ******************MENU********************

\n\n\n"

" *1.Input

\n"

" *2.Output

\n"

" *3.Insert

\n"

" *4.Delete

\n"

" *5.Search

\n"

" *6.Save

\n"

https://www.sodocs.net/doc/c3454074.html,

textbackground(LIGHTGRAY);

textcolor(BLUE);

/*背景为银灰色,字为蓝色*/

clrscr( );

gotoxy(4,8);

printf("%s",message);

gotoxy(10,22);

printf(" Please press any key into the Menu!");

getch( );

do

{clrscr( );

gotoxy(1,7);

printf("%s",menu);

gotoxy(10,20);

printf("please choose a number from 0 to 6:");

scanf("%d",&sel);

switch(sel)

{case 1:head=input( ); /*输入模块*/ break;

case 2:print( ); /*输出模块*/

break;

case 3:head=insert( ); /*插入模块*/ break;

case 4:head=delet( ); /*删除模块*/ break;

case 5:search( ); /*查找模块*/

break;

case 6:save(head); /*保存模块*/ break;

case 0:break;}

}while(sel!=0);

}

C语言仓库管理系统-数据结构

五、调试分析和测试结果

各模块功能测试:

1. COM *input( )输入模块功能测试

用户逐一输入的数据不断添加就形成了一个列表。前面已经表明本系统的数据结构选取动态数据结构——双向链表,因此此列表在内存中是以链表的形式存储的。那么输入模块实际上就是一个建立链表的操作模块。通过模块save( )

将内存中的已输入的数据存入到指定路径的某

*.dat文件中去.

特别指出: * 为用户自己规定的货品名。

输入条件: goodsnumb ld型,且>0. 当=0时退出

goodsname s 型

goodscount d型,且>0. 当<0时显示输入错误,重输字样。

调用save( )时goos’filename:d:\pll\fu

输出结果:货品保存在用户指定路径的 *.dat文件中以免丢失。

2.Print( )输出模块

可将指定文件中的内容显示在屏幕上。

输出条件:调用载入模块时,goos’filename:d:\pll\fu

输出结果:如输出条件正确,则可在屏幕上显示如下:

goodsnumb goodsname

goodscount

0001 a

125

0002 b

230

0003 c

180

3. insert( )插入模块

插入模块要完成的是链表的插入操作,即将一个新结点插入一个已有的链表中。

输入条件:调用载入模块。goos’filename:d:\pll\fu

按货品名的number, name, count 分别输入,如输错则有信息提示。

输出结果:输入正确后,则显示插入成功,返回菜单后,存盘。

4. Delet( )删除模块

删除模块要完成的是链表的删除操作,即将一个结点从已有的链表中删除。

输入条件:调用载入模块。goos’filename:d:\pll\fu

有两种删除方式按号和名删除,如输错则有信息提示。

输出结果:输入正确后,则显示删除成功,返回菜单后,存盘。

5. search( )查找模块

链表的查找操作是指在已知链表中查找值为某指定值的结点。

输入条件:调用载入模块。goos’filename:d:\pll\fu

有两种查找方式按号和名查找,如输错则有信息提示。

输出结果:输入正确后,则显示查找成功,返回菜单后,存盘。

6.Save( )保存模块

保存模块最终将想要保留的数据信息保存于文件。

7.COM *openfile( )载入模块

用于调用。

六、软件使用说明书

本系统为库存货品信息管理系统软件,能实现库存货品信息的输入、插入、删除、查找等功能,并能建立和更新的库存信息保存于文件供输出或打印。对于查找、删除等功能能够按货品名、货品号分别进行。每个货品的相关信息包括:货品号、货品名、货品库存量、进货日期、货品生产厂家及供应商等。

本系统功能基本全面,且操作简单,易于学习和掌握。

下面介绍了此软件的使用说明:

1.仓库.exe;

2.进入演示系统后首先是一个动画界面,按任意键即可进入本系统,其画面如下:

-----*The instruction of GOODS SYSTEM*------

You can input many kinds of messages,and you can use

goodname as

FILEname

This SYSTEM can do operation like insert or delect to the

goodsmessage that have saved,then saved again.while

you

can search message depend on the goodsnub or goodsname.

*** Welcome to enter the GOODS MIS!

***

Please press any key into Menu

3.任意键即可进入菜单

*********MENU********* *

*1.Input

*2.Print

*3.Insert

*4.Delete

*5.Search

*6.Save

*0.Esc please choose a number from 0 to 6:

这时可按提示进行你想要的操作啦!

4.对于0----6的具体操作和输入的条件请详见前面的调试分析,您便可轻松操作了!

七、附录

所用到的库函数:

stdio.h /*标准输入/输出头文件*/

conio.h /*包含绘制图形函数等头文件*/

string.h /*包含字符串处理函数头文件*/

stdlib.h /*包含动态存储与释放函数头文件*/

graphics.h /*图函数*/

相关主题