算法与数据结构课程设计产品进销存管理系统_第1页
算法与数据结构课程设计产品进销存管理系统_第2页
算法与数据结构课程设计产品进销存管理系统_第3页
算法与数据结构课程设计产品进销存管理系统_第4页
算法与数据结构课程设计产品进销存管理系统_第5页
免费预览已结束,剩余9页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实习报告题目:编制一个产品进销存管理系统的程序1、 需求分析1 针对食品这一行业,对其进行库房的产品进销存管理,选择线性顺序表来存储产品类, 选择线性链表来存储属于此产品类的产品,并将产品链挂接到相应的产品类上。其中存储产品时还应将属于此产品的一些信息如产品的进货总量,进货日期,销出数量,销售时间等进行相应存储。2 能够对此库房产品进销存管理系统进行产品类的添加、产品的添加、产品数量的添加。3 能够用一定的查询方法查询库房每种产品的总量、进货日期、销出数量、销售时间等4 本演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的操作命令;相

2、应的操作结果显示在其后。2、 概要设计1 . 设定顺序表挂接链表的抽象数据类型定义:ADT sqmountlink数据对象:D=ai|a i C kindlist,i=1,2, ,n,n >0数据关系:R=< ai-1,ai >|ai-1,ai C D,i=2,3,n 基本操作:InitMountList(&L)操作结果:构造一个空的顺序表挂接链表L。DestroyMountList(&L)初始条件:顺序表挂接链表L 已存在。操作结果:销毁顺序表挂接链表L。CreatMountList(&L)初始条件:顺序表挂接链表L 不存在。操作结果:创建一个顺序表

3、挂接链表L ,并将 L 返回。KindInsert(&L,n)初始条件:顺序表挂接链表L 已存在。操作结果:向顺序表挂接链表L 中添加 n 个产品类。ProductInsert(&L,i,n)初始条件:顺序表挂接链表L 已存在且要将产品插入的产品类 i 已存在。操作结果:向顺序表挂接链表L 中的产品类i 中添加 n 种产品。ProQuantity_add(&L,i,e,n)初始条件:顺序表挂接链表L 已存在且需添加数量的产品及产品所属的类也已存在。操作结果:添加顺序表挂接链表L 的产品类i 中的产品e 的总量。Visit(&L,i,e)初始条件:顺序表挂接链表L

4、 已存在且待查询产品所属产品类i 也已存在。操作结果:在顺序表挂接链表L中查询产品e的各项信息(其进货总量、进货日期、销出数量、销售时间等)。DisplayList(&L)初始条件:顺序表挂接链表L已存在。操作结果:显示顺序表挂接链表L的内容。2 .本程序包含两个模块:1)主程序模块:void main()初始化一个空的顺序表挂接链表L;创建初始的产品类、产品顺序表挂接链表L;列出要执行的各项操作;Loop:输入各项操作命令;switch(命令)接受命令;处理命令;2顺序表挂接链表单元模块一一实现顺序表挂接链表的抽象数据类型;各模块之间的调用关系如下:主程序模块一.一 顺序表挂接链表单

5、元模块三、详细设计3 .程序设计#include <stdio.h>#include <stdlib.h>#include <string.h>#define ok 1#define error 0#define overflow 0#define SQMOUNTLINK_INIT_SIZE 100#define SQMOUNTLINKINCREMENT 10typedef struct dateint year;int month;int day;date; 日期14typedef struct productlnodechar pname30;/产品名称

6、int totalquantity; /产品总量date goodsdate; /进货日期int salesquantity;/销出数量date salestime;/销售时间struct productlnode *nextproduct; productlnode,*plinklist;typedef struct kindlnodeproductlnode *firstproduct;char pkindname30;kindlnode;typedef structkindlnode *kindelem;int length;int listsize;sqmountlink;int In

7、itMountList(sqmountlink &L) /初始化一个空的顺序表挂接链表Lint i;L.kindelem=(kindlnode *)malloc(SQMOUNTLINK_INIT_SIZE*sizeof(kindlnode);if(!L.kindelem) exit(overflow);L.length=0;L.listsize=SQMOUNTLINK_INIT_SIZE;for(i=0;i<L.listsize;i+)(L.kindelemi).firstproduct=NULL;return ok;/InitMountListint CreatMountLis

8、t(sqmountlink &L)/创建初始的产品类、产品顺序表挂接链表Lplinklist p,q;int i,j,n,k;printf(" 此线性表L 中含有的产品类个数:n");scanf("%d",&n);for(i=0;i<n;i+)printf(" 输入第 %d 个产品类名称:n",(i+1);scanf("%s",&(L.kindelemi.pkindname);printf(" 输入此产品类含有的产品个数:n");scanf("%d&quo

9、t;,&k);if(k>=1)p=(plinklist)malloc(sizeof(productlnode); printf(" 输入此产品类所含产品的产品名称、总量、进货日期、销出数量、销售时间 :n");scanf("%s %d %d,%d,%d %d %d,%d,%d",&(p->pname),&(p->totalquantity),&(p->goods date).year),&(p->goodsdate).month),&(p->goodsdate).day)

10、,&(p->salesquantity),&(p->salestime).year),&(p->salestime).month),&(p->salestime).day);L.kindelemi.firstproduct=p;p->nextproduct=NULL;for(j=1;j<k;j+)q=(plinklist)malloc(sizeof(productlnode);printf(" 输入此产品类所含产品的产品名称、总量、进货日期、销出数量、销售时间 :n");scanf("%s %d

11、%d,%d,%d %d %d,%d,%d",&(q->pname),&(q->totalquantity),&(q->goods date).year),&(q->goodsdate).month),&(q->goodsdate).day),&(q->salesquantity),&(q->salestime).year),&(q->salestime).month),&(q->salestime).day);/ 调 试输入年月日时,年月日要用逗号分隔开。q-

12、>nextproduct=p->nextproduct;p->nextproduct=q;p=q;L.length+;return ok;/CreatMountListint KindInsert(sqmountlink &L,int n) / 向顺序表挂接链表L 中添加 n 类产品int i;kindlnode *newbase;if(L.length+n>=L.listsize)newbase=(kindlnode *)realloc(L.kindelem,(L.listsize+n)*sizeof(kindlnode);if(!newbase) exit(

13、overflow);L.kindelem = newbase;L.listsize+=n;printf(" 需添加的产品类名称:n");for(i=0;i<n;i+)scanf("%s",&L.kindelemL.length.pkindname);L.kindelemL.length.firstproduct=NULL;L.length+;return ok;/KindInsertint ProductInsert(sqmountlink &L,char pkindname2,int n)/向顺序表挂接链表L 的某产品类中添加n

14、个产品plinklist p,q;int k,j;for(k=0;k<L.length;k+)if(strcmp(L.kindelemk).pkindname,pkindname2)!=0)continue;elsebreak;if(L.kindelemk.firstproduct=NULL)q=(plinklist)malloc(sizeof(productlnode);printf(" 输入此产品类所含产品的产品名称、总量、进货日期、销出数量、销售时间 :n");scanf("%s %d %d,%d,%d %d %d,%d,%d",&(

15、q->pname),&(q->totalquantity),&(q->goodsdate).year),&(q->goodsdate).month),&(q->goodsdate).day),&(q->salesquantity),&(q->salestime).year),&(q->salestime).month),&(q->salestime).day);q->nextproduct=NULL;(L.kindelemk).firstproduct=q;for(j=1

16、;j<n;j+)p=(plinklist)malloc(sizeof(productlnode); printf(" 输入此产品类所含产品的产品名称、总量、进货日期、销出数量、销售时间 :n");scanf("%s %d %d,%d,%d %d %d,%d,%d",&(p->pname),&(p->totalquantity),&(p->goods date).year),&(p->goodsdate).month),&(p->goodsdate).day),&(p-&g

17、t;salesquantity),&(p->salestime).year),&(p->salestime).month),&(p->salestime).day);p->nextproduct=q->nextproduct;q->nextproduct=p;q=p;elsefor (q=L.kindelemk.firstproduct; ;q=q->nextproduct)if(!(q->nextproduct) break;printf(" 需添加产品的名称、总量、进货日期、销出数量、销售时间:n"

18、);for(j=0;j<n;j+)p=(plinklist)malloc(sizeof(productlnode);scanf("%s %d %d,%d,%d %d %d,%d,%d",&(p->pname),&(p->totalquantity),&(p->goods date).year),&(p->goodsdate).month),&(p->goodsdate).day),&(p->salesquantity),&(p->salestime).year),&

19、;(p->salestime).month),&(p->salestime).day);p->nextproduct=q->nextproduct;q->nextproduct=p;q=p;return ok;/ProductInsertvoid ProQuantity_add(sqmountlink &L,char pkindname1,char pname1,int n) /添加顺序表挂接链表L 的某产品类中的某产品的总量,且需添加的产品总量为nint i, k;plinklist p;for(i=0;i<L.length;i+)if(s

20、trcmp(L.kindelemi).pkindname,pkindname1)!=0) continue;elsebreak;if(i<L.length)for (p=L.kindelemi.firstproduct;p!=NULL;p=p->nextproduct)k=strcmp(p->pname,pname1);if(k=0)p->totalquantity=p->totalquantity+n;printf(" 查 看 添 加 后 产 品 的 各 项 输出 :%s %d %,d%d,%d %d %d,%d,%dn",p->pna

21、me,p->totalquantity,(p->goodsdate).year,( p->goodsdate).month,(p->goodsdate).day,p->salesquantity,(p->salestime).year,(p->salestime).month,(p->salestime).day);/ProQuantity_addvoid Visit(sqmountlink &L,char pkindname3,char pname3) / 在顺序表挂接链表L 中,查询属于某产品类的某产品的各项信息int i, k;pl

22、inklist p;for(i=0;i<L.length;i+) if(strcmp(L.kindelemi).pkindname,pkindname3)!=0) continue;elsebreak; if(i<L.length) for (p=L.kindelemi.firstproduct;p!=NULL;p=p->nextproduct)k=strcmp(p->pname,pname3);if(k=0)break;if(k!=0)printf(" 此产品不存在:n");elseprintf(" 输出待查询产品的各项信息:n"

23、;);printf("%s %s %d %d,%d,%d %d %d,%d,%dn",(L.kindelemi).pkindn ame,p->pname,p->totalquantity,(p->goodsdate).year,(p->goodsdate).month,(p->goodsdate).day,p->salesquantity,(p->salestime).year,(p->salestime).month,(p->salestime).day);/ Visitvoid DisplayList(sqmount

24、link &L)/显示各产品所属产品类,产品名称、产品总量,进货日期,销出数量,销售时间int i;plinklist p;printf(" 产品类产品 产品总量进货日期销出数量销售时间n");for(i=0;i<L.length;i+) if(!(L.kindelemi.firstproduct)printf("%sn",(L.kindelemi).pkindname);for(p=L.kindelemi.firstproduct;p;p=p->nextproduct)printf("%s %s %d %d,%d,%d %

25、d %d,%d,%dn",(L.kindelemi).pkindn ame,p->pname,p->totalquantity,(p->goodsdate).year,(p->goodsdate).month,(p->goodsdate).day,p->salesquantity,(p->salestime).year,(p->salestime).month,(p->salestime).day);/DisplayListvoid DestroyMountList(sqmountlink &L)/销毁已存在的顺序表挂接链

26、表Lint i;kindlnode *p;plinklist q;for(i=L.length;i>=0;i-) p=&(L.kindelemi);if(*p).firstproduct=NULL) free(p);elsewhile(*p).firstproduct)for(q=(*p).firstproduct;q->nextproduct;q=q->nextproduct); free(q); free(p);/DestroyMountList void menu_operation()/操作菜单printf(" 输入所要执行操作:n");p

27、rintf(" 产品类的添加:1n");printf(" 产品的添加:2n");printf(" 产品数量的添加:3n");printf(" 查询每种产品所属产品类,产品总量,进货日期,销出数量,销售时间:4n");0n");printf(" 释放 L 所占内存空间,退出程序:/menu_operation/* 主程序 */void main(void)int order;int i,n;char a30;char b30;sqmountlink L;InitMountList(L);print

28、f(" 创建初始的产品类、产品顺序表挂接链表Ln");CreatMountList(L);DisplayList(L);printf(" 初始的产品类、产品顺序表挂接链表L 创建完成n");menu_operation();loop:printf(" 输入命令:");scanf("%d",&order);switch(order)case 1:printf(" 需添加产品类的个数:");scanf("%d",&i);KindInsert(L,i);printf

29、(" 输出修改后的产品库存管理表:n");DisplayList(L);goto loop;case 2:printf(" 需添加产品所属产品类的名称:");scanf("%s",&a);printf(" 需向此产品类添加产品的个数:");scanf("%d",&i);ProductInsert(L,a,i);printf(" 输出修改后的产品库存管理表:n");DisplayList(L);goto loop;case 3:printf(" 输入需

30、添加数量的产品所属产品类的名称:");scanf("%s",&a);printf(" 输入需添加数量的产品的名称:");scanf("%s",&b);printf(" 输入需添加产品的数量:");scanf("%d",&n);ProQuantity_add(L,a,b,n);printf("输出修改后的产品库存管理表:n");DisplayList(L);goto loop;case 4:printf("输入待查询产品所属产品类的名

31、称:");scanf("%s",&a);printf("输入待查询产品的名称:");scanf("%s",&b);Visit(L,a,b);goto loop;case 0:DestroyMountList(L);exit(0);2.函数的调用关系图四、设计和调试分析1 .因要存取产品类和产品,而产品又从属于某一个产品类,所以本程序在存储结构设计方 面采取了顺序表挂接链表的形式,其中顺序表存储产品类,链表存储产品。2 .因考虑到产品类与产品类之间,一类中的产品与另一产品类及另一产品类的产品并无联系,所以本程序

32、并未采用图的邻接表的形式存储,而是采用了类似图的邻接表的存储结 构存储。3 .本程序中产品类的添加、属于同一类产品的添加都采用末尾插入。4 .本程序的设计还存在一些缺点;例如对某些不合逻辑的输入,还缺少一些判错处理(比 如逻辑上销售时间肯定在进货时间之后,此程序未给出这方面相应的比较判断处理) 有些操作函数的设计不完善(如:货物可能分几次进入,而显示时间的存储单元只有一 个,无法同时显示在不同时间进货的日期。查询某产品的各项信息时,必须事先知道产 品属于哪一类等)。5 .起初程序设计中采用了固定长度的数组,在动态分配存储空间时将所分配空间的起始地址赋给了所定义的数组名,调试时出错。因固定长度的

33、数组名为一常量地址,不可再对 其赋值。程序中年月日的输入是用逗号分隔的,调试时用空格进行分隔,出错。五、用户手册1、本程序的运行环境为 DOS操作系统,执行文件为 Text1.exe2、进入演示程序后即显示文本方式的用户界面3.运行程序,显示上述命令行对话框,按照其中的提示信息一步步进行操作即可。六、测试结果-创建初始的产品类、产品顺序表挂接链表L-此线性表L中含有的产品类个数:2输入第1个产品类名称:meat输入此产品类含有的产品个数:2输入此产品类所含产品的产品名称、总量、进货日期、销出数量、销售时间fish 100 1988,05,06 20 1988,06,05输入此产品类所含产品的产

34、品名称、总量、进货日期、销出数量、销售时间pork 200 1988,06,05 20 1988,08,06输入第2个产品类名称:fruit输入此产品类含有的产品个数:1输入此产品类所含产品的产品名称、总量、进货日期、销出数量、销售时间apple 200 1988,05,06 50 1988,08,09产品类产品产品总量进货日期销出数量销售时间meatfish1001988,5,6201988,6,5meatpork2001988,6,5201988,8,6fruitapple2001988,5,6501988,8,9初始的产品类、产品顺序表挂接链表L创建完成-输入所要执行操作:产品类的添加:1 产品的添加:2产品数量的添加:34查询每种产品所属产品类,产品总量,进货日期,销出数量,销售时间:释放 L 所占内存空间,退出程序:0输入命令:1需添加产品类的个数:2需添加的产品类名称:vegetable milk输出修改后的产品库存管理表:产品类产品产品总量进货日期销出数量销售时间meatfish1001988,5,6201988,6,5meatpork2001988,6,5201988,8,6fruitapple2001988,5,6501988,8,9vegetablemilk输入命令:2需添加产品所属产品类的名称:fruit需向此产品类添加产品的个数:2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论