算法与数据结构的商品货架管理课程设计报告还有程序源代码.docx
《算法与数据结构的商品货架管理课程设计报告还有程序源代码.docx》由会员分享,可在线阅读,更多相关《算法与数据结构的商品货架管理课程设计报告还有程序源代码.docx(20页珍藏版)》请在冰豆网上搜索。
算法与数据结构的商品货架管理课程设计报告还有程序源代码
福建工程学院
课程设计
课程:
算法与数据结构
题目:
商品货架管理
专业:
计算机类
班级:
1102
座号:
3110307201
******
2012年6月26日
一、要解决的问题
商店货架以栈的方式摆放商品。
商品货架可以看成一个栈,栈顶商品的生产日期最早,栈底商品的生产日期最近。
生产日期越接近的越靠栈底,出货时从栈顶取货。
一天营业结束,如果货架不满,则需上货。
入货直接将商品摆放到货架上,则会使生产日期越近的商品越靠近栈顶。
这样就需要倒货架,使生产日期越近的越靠近栈底。
请编写程序模拟商品销售,上架倒货架等操作。
(设有5种商品,每种商品至少有商品名和生产日期两个属性)
二、算法基本思想描述:
一天营业的开始,首先店主要把各个商品货架(栈)上满货物。
商店内总共有5种商品,商品名为:
a,b,c,d,e。
一一将每个商品的货架上满货物。
接着一天的营业结束了,店主要将今天有销售出去的商品所对应的货架补满。
让店主输入第一种需要补货的商品的商品名和今天销售出去的数量。
然后,输入要补上货架的商品名和生产日期并将要补上货架的商品与在货架上未销售出去的货物进行生产日期的比较。
若是要补上货架的货物日期比较早就直接上货架。
否则进行倒货再补货,这样就能将日期比较近的放在栈底。
用另外申请的一个空栈来存储倒出的货物。
第一种商品补完货后,再问店主是否还有其他商品需要补货。
如需补货按第一种商品补货的程序来进行。
以此类推进行补货。
三、设计
1.数据结构的设计
(1)商品信息:
typedefstruct
{
charb;//存储商品名
//商品日期年、月、日
intyear;
intmonth;
intday;
}Data;
(2)商品货架(栈)
#definemax5
typedefstruct
{
Dataa[max];//0为栈底位置
inttop;//栈顶
}Stack;
(3)商品种类:
Stack*s[5];//5种商品
2.算法设计:
(1)初始化空栈:
利用for循环为每个(商品货架)栈申请空间,并进行判断是否有申请到空间,若没有申请到空间就输出提示“空间不足!
”,若是有申请到空间,top指向栈顶,初始值为-1,栈底是0的位置。
(2)上货的算法设计:
先定义四个变量分别是字符型的k1,整型的k2,k3,k4用来存储商品名和商品的生产日期,再赋值给栈元素的各个属性,即将商品上货。
再赋值前先判断top是否是最大值,若是就输出提示“栈满”并结束该上货程序。
当货物上满后输出提示表示商品的货架上满了并输出此时货架上货物的数量,利用for循环进行下一个商品的上货,直至将5个商品的货架全部上满。
(3)出货(即当天的销售)的算法设计:
一天的营业结束了,店主需要为有销售出去的商品进行补货。
因此需要知道是哪个商品有销售出去以及其销售的数量,让店主输入今天有销售出去的一种商品的商品名,若是店主输入此商店没有的商品名就输出提示,并让店主再次输入商品名,接着要输入销售的数量,程序要对销售的数量进行判断是否超出了栈的最大值(即货架上所能容纳货物的最大数量),若是超出输出提示,并请店主再次输入销售的数量。
(4)补货的算法设计:
在此子函数中先定义四个变量分别是字符型的k1,整型的k2,k3,k4用来存储要补上货架的商品名和商品的生产日期,另外再初始化一个空栈L,用来存储倒出来的货物。
将要补上货架的商品的生产日期与在货架上未销售出去的商品进行比较。
若是日期比较早则可直接上货,否则要进行倒货再上货。
每入一件货物都要进行这样的程序。
(5)倒货:
为避免发生入货直接将商品摆放到货架上,会使生产日期越近的商品越靠近栈顶这样的事发生,因此需要倒货。
将比要补上货架的货物的生产日期要早的货物倒出放入栈L,直至将要补上货架的货物入货,则可再把栈L内的货物再放回原栈。
(6)将货架上摆放的货物打印出来:
补货完成后,要将各个商品栈内的货物的商品名以及其生产日期打印出来,这样可以检验补货时是否有将日期比较近的放在栈底。
(7)
模块结构及功能:
1)intmain(void)//主程序
2)Stack*initstack()//初始化空栈
3)Stack*onput(Stack*S)//上货
4)void*outpush(Stack*S)//出货
5)voidbackstack(Stack*S,intx)//补货
6)Stack*outstack(Stack*S,Stack*L)//倒货
7)voidPrint(Stack*S)//打印商品栈内货物信息
(8)主要模块算法描述:
上货:
Stack*onput(Stack*S)
{
intj;
chark1;//储存商品名
intk2,k3,k4;//储存商品生产日期年、月、日
for(j=0;j{
if(S->top==max-1)//判断栈满
{
printf("栈满!
\n");//栈满不能入栈
returnS;
}
S->top++;
printf("栈数%d",S->top);//打印货物所在的栈数
//输入商品名和生产日期
fflush(stdin);//清除缓存区
scanf("%c%d/%d/%d",&k1,&k2,&k3,&k4);//输入商品信息
S->a[S->top].b=k1;
S->a[S->top].year=k2;
S->a[S->top].month=k3;
S->a[S->top].day=k4;
}
printf("该商品的货架满了!
\n");
printf("此时该商品的货架上共有%d个商品\n\n",S->top+1);
returnS;
}
出货:
//出货
void*outpush(Stack*S)
{
printf("请店主输入今天%c这个商品销售出去的数量:
",S->a[S->top].b);
intx,i;
fflush(stdin);//清除缓存区
do{
fflush(stdin);
scanf("%d",&x);
if(x>max)
printf("该货架上没有这么多商品!
请重输!
\n");
}while(x>max);
for(i=1;i<=x;i++)S->top--;
printf("此时%c这个商品的货架的数量剩下%d件需要补上货架的数量为%d\n\n",S->a[S->top].b,S->top+1,x);
//补货
backstack(S,x);
}
补货:
//补货
voidbackstack(Stack*S,intx)
{
inti,ii;
inttemp;
chark1;//储存商品名
intk2,k3,k4;//储存生产日期分别对应年月日
Stack*L;
L=initstack();//重新申请一个空栈用来倒货时存放货物
printf("请输入要补上货架的商品名(一个字符)空一格并输入该商品生产日期(年/月/日)每上货一件以回车键结束:
\n");
for(i=1;i<=x;i++)
{
//输入商品名和生产日期
fflush(stdin);//清除缓存区
scanf("%c%d/%d/%d",&k1,&k2,&k3,&k4);
if(S->top==-1)//此时货架上无商品可以直接上货
{
S->top++;
S->a[S->top].b=k1;
S->a[S->top].year=k2;
S->a[S->top].month=k3;
S->a[S->top].day=k4;
printf("补货成功第%d件!
\n",i);
printf("此时的栈顶数为:
%d\n",S->top);
}
else{
if(k2a[S->top].year)//若生产年份要补上货架的比货架上的早则直接上货架
{
S->top++;
S->a[S->top].b=k1;
S->a[S->top].year=k2;
S->a[S->top].month=k3;
S->a[S->top].day=k4;
printf("补货成功第%d件!
\n",i);
printf("此时的栈顶数为:
%d\n",S->top);
temp=1;
}
else
{
for(ii=S->top;ii>-1&&S->top!
=-1;ii--)
{
temp=0;//用来标记是否有货物上架
if(k2==S->a[S->top].year)//若生产年份要补上货架的与货架上的一样则比较月份
{
if(k3a[S->top].month)//若生产月份要补上货的比货架上的早则直接上货
{
S->top++;
S->a[S->top].b=k1;
S->a[S->top].year=k2;
S->a[S->top].month=k3;
S->a[S->top].day=k4;
printf("补货成功第%d件!
\n",i);
printf("此时的栈顶数为:
%d\n",S->top);
temp=1;
if(temp==1)break;
}
else
{
if(k3==S->a[S->top].month)//若生产月份要补上货架的与货架上的一样则比较生产当天日期
{
if(k4<=S->a[S->top].day)//若生产当天日期要补上货的比货架上的早或是相同则直接上货否则要倒货重新上货架
{
S->top++;
S->a[S->top].b=k1;
S->a[S->top].year=k2;
S->a[S->top].month=k3;
S->a[S->top].day=k4;
printf("补货成功第%d件!
\n",i);
printf("此时的栈顶数为:
%d\n",S->top);
temp=1;
if(temp==1)break;
}
else
{
//倒货
L=outstack(S,L);
}
}
else
{
//倒货
L=outstack(S,L);
}
}
}
if(k2>S->a[S->top].year)////此时生产年份要补上货架的比货架上的近
{
L=outstack(S,L);//倒货
}
}
if(temp==0)
{
S->top++;
S->a[S->top].b=k1;
S->a[S->top].year=k2;
S->a[S->top].month=k3;
S->a[S->top].day=k4;
printf("补货成功第%d件!
\n",i);
printf("此时的栈顶数为:
%d\n",S->top);
}
while(L->top>-1)//将存储在L栈中的商品上架
{
S->top++;
S->a[S->top]=L->a[L->top--];
}
L=initstack();
}
}
}
printf("补货完成!
!
\n\n");
Print(S);
}
倒货:
//倒货
Stack*outstack(Stack*S,Stack*L)
{
L->top++;
L->a[L->top]=S->a[S->top];
S->top--;
printf("此时的栈顶数为:
%d\n",S->top);
printf("倒货一次!
\n\n");
returnL;
}
四、源程序清单:
#include
#include
#include
#definemax5
typedefstruct
{
charb;//存储商品名
//商品日期年、月、日
intyear;
intmonth;
intday;
}Data;
typedefstruct
{
Dataa[max];//0为栈底位置
inttop;//栈顶
}Stack;
//初始化空栈
Stack*initstack()
{
Stack*S;
S=(Stack*)malloc(sizeof(Stack));//申请空间
//判断是否申请到栈空间
if(!
S)
{
printf("空间不足!
\n");
returnNULL;
}
else
{
S->top=-1;
returnS;
}
}
//将货架上摆放的货物打印出来
voidPrint(Stack*S)
{
printf("%c这个商品的货架上摆放了%d个货物:
\n",S->a[S->top].b,S->top+1);
while(S->top>-1)
{
printf("%c%d/%d/%d\n",S->a[S->top].b,S->a[S->top].year,S->a[S->top].month,S->a[S->top].day);
S->top--;
}
}
//上货
Stack*onput(Stack*S)
{
intj;
chark1;
intk2,k3,k4;
for(j=0;j{
if(S->top==max-1)
{
printf("栈满!
\n");//栈满不能入栈
returnS;
}
S->top++;
printf("栈数%d",S->top);
//输入商品名和生产日期
fflush(stdin);//清除缓存区
scanf("%c%d/%d/%d",&k1,&k2,&k3,&k4);
S->a[S->top].b=k1;
S->a[S->top].year=k2;
S->a[S->top].month=k3;
S->a[S->top].day=k4;
}
printf("该商品的货架满了!
\n");
printf("此时该商品的货架上共有%d个商品\n\n",S->top+1);
returnS;
}
//倒货
Stack*outstack(Stack*S,Stack*L)
{
L->top++;
L->a[L->top]=S->a[S->top];
S->top--;
printf("此时的栈顶数为:
%d\n",S->top);
printf("倒货一次!
\n\n");
returnL;
}
//补货
voidbackstack(Stack*S,intx)
{
inti,ii;
inttemp;
chark1;//储存商品名
intk2,k3,k4;//储存生产日期分别对应年月日
Stack*L;
L=initstack();//重新申请一个空栈用来倒货时存放货物
printf("请输入要补上货架的商品名(一个字符)空一格并输入该商品生产日期(年/月/日)每上货一件以回车键结束:
\n");
for(i=1;i<=x;i++)
{
//输入商品名和生产日期
fflush(stdin);//清除缓存区
scanf("%c%d/%d/%d",&k1,&k2,&k3,&k4);
if(S->top==-1)//此时货架上无商品可以直接上货
{
S->top++;
S->a[S->top].b=k1;
S->a[S->top].year=k2;
S->a[S->top].month=k3;
S->a[S->top].day=k4;
printf("补货成功第%d件!
\n",i);
printf("此时的栈顶数为:
%d\n",S->top);
}
else{
if(k2a[S->top].year)//若生产年份要补上货架的比货架上的早则直接上货架
{
S->top++;
S->a[S->top].b=k1;
S->a[S->top].year=k2;
S->a[S->top].month=k3;
S->a[S->top].day=k4;
printf("补货成功第%d件!
\n",i);
printf("此时的栈顶数为:
%d\n",S->top);
temp=1;
}
else
{
for(ii=S->top;ii>-1&&S->top!
=-1;ii--)
{
temp=0;//用来标记是否有货物上架
if(k2==S->a[S->top].year)//若生产年份要补上货架的与货架上的一样则比较月份
{
if(k3a[S->top].month)//若生产月份要补上货的比货架上的早则直接上货
{
S->top++;
S->a[S->top].b=k1;
S->a[S->top].year=k2;
S->a[S->top].month=k3;
S->a[S->top].day=k4;
printf("补货成功第%d件!
\n",i);
printf("此时的栈顶数为:
%d\n",S->top);
temp=1;
if(temp==1)break;
}
else
{
if(k3==S->a[S->top].month)//若生产月份要补上货架的与货架上的一样则比较生产当天日期
{
if(k4<=S->a[S->top].day)//若生产当天日期要补上货的比货架上的早或是相同则直接上货否则要倒货重新上货架
{
S->top++;
S->a[S->top].b=k1;
S->a[S->top].year=k2;
S->a[S->top].month=k3;
S->a[S->top].day=k4;
printf("补货成功第%d件!
\n",i);
printf("此时的栈顶数为:
%d\n",S->top);
temp=1;
if(temp==1)break;
}
else
{
//倒货
L=outstack(S,L);
}
}
else
{
//倒货
L=outstack(S,L);
}
}
}
if(k2>S->a[S->top].year)////此时生产年份要补上货架的比货架上的近
{
L=outstack(S,L);//倒货
}
}
if(temp==0)
{
S->top++;
S->a[S->top].b=k1;
S->a[S->top].year=k2;
S->a[S->top].month=k3;
S->a[S->top].day=k4;
printf("补货成功第%d件!
\n",i);
printf("此时的栈顶数为:
%d\n",S->top);
}
while(L->top>-1)//将存储在L栈中的商品上架
{
S->top++;
S->a[S->top]=L->a[L->top--];
}
L=initstack();
}
}
}
printf("补货完成!
!
\n\n");
Print(S);
}
//出货
void*outpush(Stack*S)
{
printf("请店主输入今天%c这个商品销售出去的数量:
",S->a[S->top].b);
intx,i;
fflush(stdin);
do{
fflush(stdin);
scanf("%d",&x);
if(x>max)
printf("该货架上没有这么多商品!
请重输!
\n");
}while(x>max);
for(i=1;i<=x;i++)S->top--;
printf("此时%c这个商品的货架的数量剩下%d件需要补上货架的数量为%d\n\n",S->a[S->top].b,S->top+1,x);
//补货
backstack(S,x);
}
intmain(void)
{
Stack*s[5];//5种商品
inti;
printf("计算机类1102班郑桂萍学号:
3110307201\n\n");
printf("商店共有5种商品,分别是a,b,c,d,e\n\n");
for(i=0;i<5;i++)
{
s[i]=initstack();//初始化栈
printf("请输入要上货的第%d种商品名(一个字符)空一格并输入该商品生产日期(年/月/日)每上货一件以回车键结束:
\n",i+1);
s[i]=onput(s[i]);//将商品入栈(上货)
}
charc,yes_no;
do
{
fflush(stdin);
printf("请店主输入今天有销售出去一个商品的商品名:
\n");
fflush(stdin);
scanf("%c",&c);
switch(c)
{
case'a':
outpush(s[0]);
break;
case'b':
outpush(s[1]);
break;
case'c':
outpush(s[2]);
break;
case'd':
outpush(s[3]);
break;
case'e':
outpush(s[4]);
break;
default:
printf("商店无%c此商品!
输入错误!
\n",c);
}
do
{
fflush(stdin);
printf("请问店主还有销售出去的商品么?
如果有请按Y,否则按N\n");
yes_no=getchar();
if(yes_no!
='Y'&&yes_no!
='N')
{
printf("输入错误\n\n");
}
}while(yes_no!
='Y'&&yes_no!
='N');
}while(yes_no=='Y');
return0;
}
五、测试数据及测试结果:
测试数据:
5个商品货架上货:
a2012/1/1
a2012/1/1
a2011/2/2
a2011/1/1
a2011/1/1
b2012/2/2
b2012/2/2
b2012/2/2
b2012/2/2
b2012/2/2
c2012/2/2
c2012/2/2
c2012/2/2
c2012/2/2
c2012/2/2
d2012/2/2
d2012/2/2
d2012/2/2
d2012/2/2
d2012/2/2
e2012/2/2
e2012/2/2
e2012/2/2