资源描述
中北大学
数 据 结 构
课 程 设 计 说 明 书
学生姓名:
宋立群
学 号:
1021011803
学 院:
软件学院
专 业:
软件开发与测试
题 目:
产品进销存管理系统
指导教师
何志英
2011年12月20日
(一)设计任务概述
针对某一种行业的库房的产品进销存情况进行管理.
1、采用一定的存储结构对库房的货品及其数量进行分类管理;
运用链表进行存储,同时用到指针变量,运用循环存储,对存储产品的信息要用到日期结构体和产品结构体,对存储要用到文件指针以及文件的一些方法的使用.
2、可以进行产品类的添加、产品的添加、产品数量的添加;
首先要找到链表的指针变量,对指针变量进行修改,然后再进行产品的出入。
3、能够查询库房每种产品的总量、进货日期、销出数量、销售时间等;
首先要定义一个查询函数,对产品类的指针变量进行循环查询,再对产品的指针变量进行循环查询,找到产品时,在调用显示产品信息函数,显示查询到的产品的各项信息。
(二)本设计所采用的数据
运用链表进行存储,同时用到指针变量,循环存储
(三)功能模块详细设计
3.1详细设计思想
1、顺序表挂接链表的抽象定义类型:
ADT sqmountlink{
数据对象:D={ai|ai∈kindlist,i=1,2,…,n,n〉=0}
数据关系:R={〈ai-1,ai>|ai—1,ai∈D,i=1,2,3,…,n}
基本操作:
InitMountLisr(&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已存在且待查询的产品所属产品类i也存在
操作结果:在顺序表挂接链表L中查询产品e的各项信息
DisplayList(&L)
初始条件:顺序表挂接链表L已存在
操作结果:现实顺序表挂接链表L的内容
3.2核心代码
#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 10
typedef struct date{
int year;
int month;
int day;
}date; //日期
typedef struct productlnode{
char pname[30]; //产品名称
int totalquantity; //产品总量
date goodsdate; //进货日期
int salesquantity; //消除数量
date salestime; //销售时间
struct productlnode *nextproduct;
}productlnode,*plinklist;
typedef struct kindlnode{
productlnode *firstproduct;
char pkindname[30];
}kindlnode;
typedef struct{
kindlnode *kindelem;
int length;
int listsize;
}sqmountlink;
int InitMountList(sqmountlink &L){
//初始化一个空的顺序表挂接链表L
int 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。kindelem[i]).firstproduct=NULL;
}
return ok;
}//InitMountList
int 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(overflow);
L。kindelem=newbase;
L。listsize+=n;
}
printf("需添加的产品类名称:\n”);
for(i=0;i〈n;i++){
scanf("%s”,&L。kindelem[L。length].pkindname);
L。kindelem[L.length]。firstproduct=NULL;
L.length++;
}
return ok;
}//KindInsert
int ProductInsert(sqmountlink &L,char pkindname2[],int n){ //向顺序表挂接链表L的某产品类中添加N个产品
plinklist p,q;
int k,j;
for(k=0;k<L。length;k++){
if(strcmp((L。kindelem[k])。pkindname,pkindname2)!=0)
continue;
else
break;
}
if(L.kindelem[k].firstproduct==NULL){
q=(plinklist)malloc(sizeof(productlnode));
printf(”输入此产品类所含产品的产品名称、总量、进货日期、销售数量、销售时间:\n");
scanf("%s %d %d,%d,%d %d %d,%d,%d”,&(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。kindelem[k])。firstproduct=q;
for(j=1;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-〉goodsdate).year),&((p->goodsdate)。month),&((p—〉goodsdate).day),&(p-〉salesquantity),&((p-〉salestime).year),&((p-〉salestime)。month),&((p-〉salestime).day));
p-〉nextproduct=q—>nextproduct;
q-〉nextproduct=p;
q=p;
}
}
else{
for(q=L。kindelem[k]。firstproduct; ;q=q—>nextproduct){
if(!(q—〉nextproduct))
break;
}
printf(”需添加产品的名称、总量、进货日期、销售数量、销售时间:\n");
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—〉goodsdate)。year),&((p—〉goodsdate).month),&((p-〉goodsdate).day),&(p—〉salesquantity),&((p-〉salestime)。year),&((p->salestime).month),&((p->salestime)。day));
p—〉nextproduct=q->nextproduct;
q—〉nextproduct=p;
q=p;
}
}
return ok;
}//ProductInsert
void ProQuantity_add(sqmountlink &L,char pkindname1[],char pname1[],int n){ //添加顺序表挂接链表L的某产品类中的某产品的总量,且需添加的产品总量为n
int i,k;
plinklist p;
for(i=0;i<L。length;i++){
if(strcmp((L.kindelem[i])。pkindname,pkindname1)!=0)
continue;
else
break;
}
if(i〈L。length){
for(p=L。kindelem[i]。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,%d\n",p->pname,p-〉totalquantity,(p-〉goodsdate).year,(p->goodsdate)。month,(p-〉goodsdate).day,p—〉salesquantity,(p—>salestime)。year,(p—〉salestime)。month,(p—〉salestime).day);
}
}
}
}//ProQuantity_add
void ProQuantity_subtract(sqmountlink &L,char pkindname4[],char pname4[],int n){ //添加顺序表挂接链表L的某产品类中的某产品销出数量,且销出的数量n
int i,k;
plinklist p;
for(i=0;i〈L.length;i++){
if(strcmp((L。kindelem[i])。pkindname,pkindname4)!=0)
continue;
else
break;
}
if(i<L。length){
for(p=L。kindelem[i]。firstproduct;p!=NULL;p=p-〉nextproduct){
k=strcmp(p—〉pname,pname4);
if(k==0){
p—>salesquantity=p—>salesquantity+n;
printf("查看添加后产品的各项输出:%s %d %d,%d,%d %d %d,%d,%d\n",p->pname,p—〉totalquantity,(p-〉goodsdate)。year,(p—〉goodsdate).month,(p-〉goodsdate).day,p-〉salesquantity,(p—〉salestime).year,(p->salestime)。month,(p—〉salestime)。day);
}
}
}
}//ProQuantity_subtract
void Visit(sqmountlink &L,char pkindname3[],char pname3[]){ //在顺序表挂接链表L中,查询属于某产品类的某产品的各项信息
int i,k;
plinklist p;
for(i=0;i〈L.length;i++){
if(strcmp((L。kindelem[i])。pkindname,pkindname3)!=0)
continue;
else
break;
}
if(i〈L。length){
for(p=L。kindelem[i]。firstproduct;p!=NULL;p=p->nextproduct){
k=strcmp(p->pname,pname3);
if(k==0)
break;
}
if(k!=0)
printf(”此产品不存在:\n”);
else{
printf(”输出待查询产品的各项信息:\n");
printf(”产品类★产 品★产品总量★进 货 日 期★销售数量★销 售 时 间\n”);
printf(”%s %s %d %d,%d,%d %d %d,%d,%d\n”,(L。kindelem[i])。pkindname,p-〉pname,p—>totalquantity,(p—>goodsdate).year,(p-〉goodsdate)。month,(p->goodsdate).day,p—>salesquantity,(p—>salestime).year,(p-〉salestime)。month,(p—>salestime).day);
}
}
}//Visit
void DisplayList(sqmountlink &L){ //显示各产品所属产品类、产品名称、产品总量、进货日期、销售数量、销售时间
int i;
plinklist p;
printf(”产品类★产 品★产品总量★进 货 日 期★销售数量★销 售 时 间\n”);
for(i=0;i〈L.length;i++){
if(!(L.kindelem[i].firstproduct))
printf(”%s\n”,(L。kindelem[i])。pkindname);
for(p=L.kindelem[i].firstproduct;p;p=p—〉nextproduct)
printf(”%s %s %d %d,%d,%d %d %d,%d,%d\n",(L.kindelem[i])。pkindname,p—>pname,p—〉totalquantity,(p->goodsdate)。year,(p->goodsdate)。month,(p-〉goodsdate)。day,p-〉salesquantity,(p-〉salestime)。year,(p—>salestime)。month,(p—〉salestime).day);
}
}//DisplayList
void menu_operation(){//操作菜单
printf(”┌──────────┐\n”);
printf("│输入所要执行的操作:│\n”);
printf(”│1、产品类添加: │\n”);
printf("│2、产品添加: │\n");
printf("│3、产品数量添加: │\n");
printf(”│4、产品售出: │\n");
printf("│5、查询产品: │\n”);
printf(”│0、退出程序: │\n”);
printf(”└──────────┘\n");
}//mene_operation
/*—-———————-—-—--——-————-—--———-主程序——--———-—-—————--—-—-—————-*/
void main(void){
int order;
int i,n;
char a[30];
char b[30];
sqmountlink L;
InitMountList(L);
printf(”☆输入时间时请按照“年,月,日”格式输入。☆\n”);
loop:
menu_operation();
printf("输入命令:”);
scanf(”%d”,&order);
switch(order){
case 1:
printf(”需添加产品类的个数:");
scanf(”%d",&i);
KindInsert(L,i);
printf("修改后的产品库存管理表:\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(”输入需添加数量的产品所属产品类的名称:”);
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(”输入售出产品所属产品类的名称:");
scanf(”%s",&a);
printf(”输入售出产品的名称:”);
scanf("%s",&b);
printf("输入售出产品的数量:");
scanf("%d”,&n);
ProQuantity_subtract(L,a,b,n);
printf(”修改后的产品库存管理表:\n");
DisplayList(L);
goto loop;
case 5:
printf("输入待查询产品所属产品类的名称:”);
scanf(”%s",&a);
printf(”输入待查询产品的名称:”);
scanf("%s”,&b);
Visit(L,a,b);
goto loop;
case 0:
exit(0);
}
}
3。3程序运行结果
程序启动界面。
产品类的添加。
产品的添加。
产品数量的添加.
产品售出.
产品查询。
(四) 课程设计心得,存在问题及解决方法
拿到这道题时,我没有选择自己去编写,我想我从来没有编过这么复杂的程序,一定编不成,我选择了上网去查,值得庆幸的是我找到了一部分的程序,然后拷贝上程序在机房运行,发现有许多错误,我就开始一个一个解决问题,其中有些问题是一些符号的丢失,还有头文件的错误运用,还有对一些输入超出程序范围的数据进行修改,才使程序得以继续进行,最后我通过自己和请教同学,最终整个程序得以运行,不过最重要的不是仅仅让程序运行成功,而是了解整个程序的思想设计和功能的实现,然后我开始翻译程序,把每一句都弄的清清楚楚为止,从中我复习了很多知识点,也学到了很多我以前不知道的东西。通过对本系统的开发,我对软件开发过程有了更清楚地了解,首先是问题的定义,需求分析,然后概要设计,详细设计等,让我知道了仅仅学习课本知识是不行的,还得经常去自己设计一些小的项目去发现问题,必须培养动手能力,这样才能既复习了知识点,又可以学会详细的数据结构思想和设计,所以我在以后一定要加强这方面的学习。
13
展开阅读全文