1、让店主输入第一种需要补货的商品的商品名和今天销售出去的数量。然后,输入要补上货架的商品名和生产日期并将要补上货架的商品与在货架上未销售出去的货物进行生产日期的比较。若是要补上货架的货物日期比较早就直接上货架。否则进行倒货再补货,这样就能将日期比较近的放在栈底。用另外申请的一个空栈来存储倒出的货物。第一种商品补完货后,再问店主是否还有其他商品需要补货。如需补货按第一种商品补货的程序来进行。以此类推进行补货。三、设计1. 数据结构的设计(1)商品信息:typedef struct char b;/存储商品名 /商品日期年、月、日 int year; int month; int day;Data;
2、(2)商品货架(栈)#define max 5 Data amax;/0为栈底位置 int top;/栈顶Stack;(3)商品种类:Stack *s5;/5种商品2.算法设计: (1)初始化空栈: 利用for循环为每个(商品货架)栈申请空间,并进行判断是否有申请到空间,若没有申请到空间就输出提示“空间不足!”,若是有申请到空间,top指向栈顶,初始值为1,栈底是0的位置。(2)上货的算法设计: 先定义四个变量分别是字符型的k1,整型的k2,k3,k4用来存储商品名和商品的生产日期,再赋值给栈元素的各个属性,即将商品上货。再赋值前先判断top是否是最大值,若是就输出提示“栈满”并结束该上货程序
3、。当货物上满后输出提示表示商品的货架上满了并输出此时货架上货物的数量,利用for循环进行下一个商品的上货,直至将5个商品的货架全部上满。(3)出货(即当天的销售)的算法设计:一天的营业结束了,店主需要为有销售出去的商品进行补货。因此需要知道是哪个商品有销售出去以及其销售的数量,让店主输入今天有销售出去的一种商品的商品名,若是店主输入此商店没有的商品名就输出提示,并让店主再次输入商品名,接着要输入销售的数量,程序要对销售的数量进行判断是否超出了栈的最大值(即货架上所能容纳货物的最大数量),若是超出输出提示,并请店主再次输入销售的数量。(4)补货的算法设计:在此子函数中先定义四个变量分别是字符型的
4、k1,整型的k2,k3,k4用来存储要补上货架的商品名和商品的生产日期,另外再初始化一个空栈L,用来存储倒出来的货物。将要补上货架的商品的生产日期与在货架上未销售出去的商品进行比较。若是日期比较早则可直接上货,否则要进行倒货再上货。每入一件货物都要进行这样的程序。(5)倒货:为避免发生入货直接将商品摆放到货架上,会使生产日期越近的商品越靠近栈顶这样的事发生,因此需要倒货。将比要补上货架的货物的生产日期要早的货物倒出放入栈L,直至将要补上货架的货物入货,则可再把栈L内的货物再放回原栈。(6)将货架上摆放的货物打印出来:补货完成后,要将各个商品栈内的货物的商品名以及其生产日期打印出来,这样可以检验
5、补货时是否有将日期比较近的放在栈底。(7)模块结构及功能:1)int main(void) /主程序2)Stack *initstack() /初始化空栈3)Stack *onput(Stack *S) /上货4)void *outpush(Stack *S) /出货5)void backstack(Stack *S,int x) /补货6)Stack *outstack(Stack *S,Stack *L) /倒货7)void Print(Stack *S) /打印商品栈内货物信息(8)主要模块算法描述: 上货: Stack *onput(Stack *S) int j; char k1;/
6、储存商品名 int k2,k3,k4;/储存商品生产日期年、月、日 for(j=0;jtop=max-1)/判断栈满 printf(栈满!n);/栈满不能入栈 return S; S-top+;栈数%d ,S-top);/打印货物所在的栈数 /输入商品名和生产日期 fflush(stdin);/清除缓存区 scanf(%c %d/%d/%d,&k1,&k2,&k3,&k4);/输入商品信息aS-top.b=k1;top.year=k2;top.month=k3;top.day=k4;该商品的货架满了!此时该商品的货架上共有%d个商品nntop+1);出货:/出货void *outpush(St
7、ack *S)请店主输入今天%c这个商品销售出去的数量:top.b); int x,i; do%dx); if(xmax)该货架上没有这么多商品!请重输! while(xmax); for(i=1;itop-;此时%c这个商品的货架的数量剩下%d件需要补上货架的数量为%dnntop.b,S-top+1,x);/补货 backstack(S,x);补货:void backstack(Stack *S,int x) int i,ii; int temp;/储存生产日期分别对应年月日 Stack *L; L=initstack();/重新申请一个空栈用来倒货时存放货物请输入要补上货架的商品名(一个字
8、符)空一格并输入该商品生产日期(年/月/日)每上货一件以回车键结束:i+)top=-1)/此时货架上无商品可以直接上货补货成功第%d件!,i);此时的栈顶数为:%dn else if(k2top.year)/若生产年份要补上货架的比货架上的早则直接上货架 temp=1; else for(ii=S-top;ii-1&top!=-1;ii-) temp=0;/用来标记是否有货物上架 if(k2=S-top.year)/若生产年份要补上货架的与货架上的一样则比较月份 if(k3top.month)/若生产月份要补上货架的与货架上的一样则比较生产当天日期 if(k4top.day)/若生产当天日期要
9、补上货的比货架上的早或是相同则直接上货否则要倒货重新上货架 /倒货 L=outstack(S,L); if(k2top.year)/此时生产年份要补上货架的比货架上的近/倒货 if(temp=0) while(L-top-1)/将存储在L栈中的商品上架top=L-aL-top-;补货完成!nn Print(S);倒货:Stack *outstack(Stack *S,Stack *L) L-top=S-top;倒货一次! return L;四、源程序清单:#includestdlib.hconio.h/初始化空栈Stack *initstack() Stack *S; S=(Stack *)m
10、alloc(sizeof(Stack);/申请空间 /判断是否申请到栈空间 if(!S)空间不足! return NULL;top=-1;/将货架上摆放的货物打印出来void Print(Stack *S)%c这个商品的货架上摆放了%d个货物: while(S-1)%c %d/%d/%dntop.year,S-top.month,S-top.day);/上货Stack *onput(Stack *S)top=max-1)int main(void) Stack *s5; int i;计算机类1102班 郑桂萍 学号:3110307201nn商店共有5种商品,分别是a,b,c,d,enn for
11、(i=0;5; si=initstack();/初始化栈请输入要上货的第%d种商品名(一个字符)空一格并输入该商品生产日期(年/月/日)每上货一件以回车键结束:,i+1); si=onput(si);/将商品入栈(上货) char c,yes_no; do请店主输入今天有销售出去一个商品的商品名:%cc); switch(c) case a: outpush(s0); break;b outpush(s1);c outpush(s2);d outpush(s3);e outpush(s4); default:商店无%c此商品!输入错误!,c);请问店主还有销售出去的商品么?如果有请按Y,否则按Nn yes_no=getchar(); if(yes_no!=Yyes_no!N)输入错误nn while(yes_no! while(yes_no= return 0;五、测试数据及测试结果:测试数据:5个商品货架上货:a 2012/1/1a 2011/2/2a 2011/1/1b 2012/2/2c 2012/2/2d 2012/2/2e 2012/2/2
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1