资源描述
学号
2014-2015学年 第一学期
1308010108
《数据结构》
课程设计报告
题目:
基于栈的商品货架管理的设计
专业:
计算机科学与技术
班级:
姓名:
学号:
指导教师:
成绩:
计算机与信息工程系
2014年 11 月 22日
计算机与信息工程系 《数据结构》课程设计报告
目 录
1设计分析2
1。1设计内容2
1.2 设计任务及具体要求2
2概要设计2
2。1系统的功能简介2
2。2 总体程序框图3
3设计过程和程序代码3
3.1数据结构的设计3
3.1。1商品信息3
3。1。2商品货架(栈)3
3。1。3商品种类4
3。2算法设计4
3.2。1初始化空栈4
3。2。2上货的算法设计4
3.2。3出货(即当天的销售)的算法设计4
3。2。4补货的算法设计4
3.2。5倒货4
3.2。6将货架上摆放的货物打印出来5
3。2.7模块结构及功能5
3。2.8主要模块算法描述5
4运行结果9
5小结10
参考文献11
附录:源程序12
计算机与信息工程系 《数据结构》课程设计报告
1设计分析
1.1设计内容
商店货架以栈的方式摆放商品。商品货架可以看成一个栈,栈顶商品的生产日期最早,栈底商品的生产日期最近。生产日期越接近的越靠栈底,出货时从栈顶取货。一天营业结束,如果货架不满,则需上货.入货直接将商品摆放到货架上,则会使生产日期越近的商品越靠近栈顶。这样就需要倒货架,使生产日期越近的越靠近栈底。请编写程序模拟商品销售,上架倒货架等操作。(设有5种商品,每种商品至少有商品名和生产日期两个属性)
1.2设计任务及具体要求
设计任务:一天营业的开始,首先店主要把各个商品货架(栈)上满货物.商店内总共有5种商品,商品名为:a,b,c,d,e。补货时,店主输入第一种需要补货的商品的商品名和今天销售出去的数量。然后,输入要补上货架的商品名和生产日期并将要补上货架的商品与在货架上未销售出去的货物进行生产日期的比较.若是要补上货架的货物日期比较早就直接上货架.否则进行倒货再补货,这样就能将日期比较近的放在栈底.用另外申请的一个空栈来存储倒出的货物。第一种商品补完货后,再问店主是否还有其他商品需要补货。如需补货按第一种商品补货的程序来进行,以此类推进行补货。
要求:明确课程设计的目的,能根据课程设计的要求,查阅相关文献,为完成设计准备必要的知识,提高撰写技术文档的能力.并学习了解C语言程序设计的要求和方法,利用数据结构的相关算法和原理进行系统的设计分析,提高计算机语言编程的能力。
2概要设计
2.1系统的功能简介
商品货架管理系统可以看成是栈的设计管理,栈顶的产品的日期最早,栈底的商品日期最近,上货时需要进行倒货架以实现该功能.通过基于栈的原理实现设计商品货架管理系统,使得该系统的主要功能是实现对商品货架中产品进行合理有效的管理的实现,该系统包括对商品货架进行商品的上货、出货、补货、到货等功能,实现对商品货架信息上货、出货、补货功能的管理。
2.2 总体程序框图
主函数
出货
上货
栈初始化
补货
打印栈中货物信息
卸货
图2。2程序的总体框图
3设计过程和设计代码
3。1数据结构的设计
3.1.1商品信息
typedef struct{
char b;//存储商品名
//商品日期年、月、日
int year;
int month;
int day;
}Data;
3。1.2商品货架(栈)
#define max 5
typedef struct{
Data a[max];//0为栈底位置
int top;//栈顶
}Stack;
3。1.3商品种类
Stack *s[5];//5种商品
3。2算法设计
3。2。1初始化空栈
利用for循环为每个(商品货架)栈申请空间,并进行判断是否有申请到空间,若没有申请到空间就输出提示“空间不足!",若是有申请到空间,top指向栈顶,初始值为-1,栈底是0的位置。
3.2.2上货的算法设计
先定义四个变量分别是字符型的k1,整型的k2,k3,k4用来存储商品名和商品的生产日期,再赋值给栈元素的各个属性,即将商品上货。再赋值前先判断top是否是最大值,若是就输出提示“栈满”并结束该上货程序.当货物上满后输出提示表示商品的货架上满了并输出此时货架上货物的数量,利用for循环进行下一个商品的上货,直至将5个商品的货架全部上满.
3。2.3出货(即当天的销售)的算法设计
一天的营业结束了,店主需要为有销售出去的商品进行补货。因此需要知道是哪个商品有销售出去以及其销售的数量,让店主输入今天有销售出去的一种商品的商品名,若是店主输入此商店没有的商品名就输出提示,并让店主再次输入商品名,接着要输入销售的数量,程序要对销售的数量进行判断是否超出了栈的最大值(即货架上所能容纳货物的最大数量),若是超出输出提示,并请店主再次输入销售的数量。
3。2。4补货的算法设计
在此子函数中先定义四个变量分别是字符型的k1,整型的k2,k3,k4用来存储要补上货架的商品名和商品的生产日期,另外再初始化一个空栈L,用来存储倒出来的货物。将要补上货架的商品的生产日期与在货架上未销售出去的商品进行比较。若是日期比较早则可直接上货,否则要进行倒货再上货.每入一件货物都要进行这样的程序。
3。2。5倒货
为避免发生入货直接将商品摆放到货架上,会使生产日期越近的商品越靠近栈顶这样的事发生,因此需要倒货。将比要补上货架的货物的生产日期要早的货物倒出放入栈L,直至将要补上货架的货物入货,则可再把栈L内的货物再放回原栈。
3.2。6将货架上摆放的货物打印出来
补货完成后,要将各个商品栈内的货物的商品名以及其生产日期打印出来,这样可以检验补货时是否有将日期比较近的放在栈底。
3。2。7模块结构及功能
int main(void) //主程序
Stack *initstack() //初始化空栈
Stack *onput(Stack *S) //上货
void *outpush(Stack *S) //出货
void backstack(Stack *S,int x) //补货
Stack *outstack(Stack *S,Stack *L) //倒货
void Print(Stack *S) //打印商品栈内货物信息
3。2.8主要模块算法描述
(1)上货
Stack *onput(Stack *S){
int j;
char k1;//储存商品名
int k2,k3,k4;//储存商品生产日期年、月、日
for(j=0;j〈max;j++){
if(S-〉top==max—1){//判断栈满
printf("栈满!\n”);//栈满不能入栈
return S;}
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); return S;}
(2)出货
void *outpush(Stack *S){
printf(”请店主输入今天%c这个商品销售出去的数量:",S—>a[S-〉top].b); int x,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);//补货}
(3)补货
void backstack(Stack *S,int x){
int i,ii;
int temp;
char k1;//储存商品名
int k2,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(k2<S—〉a[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(k3<S—>a[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);}
(4)倒货:
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”);
return L;}
4运行结果
程序测试数据如下:
(1) 上货:
图(1)上货程序测试
(2)补货及出货
图(2)补货及出货测试
5小结
通过此次课程设计,我更深刻地体会到编写一个程序之前首先要分析它,知道它的功能,要做什么等等,如何实现它,这些需要我们认真的思考,分析。划分整体成各个模块,再逐一的实现它是一种很好的解决方法。在调试程序的过程中我们需要细心和耐心。通过这次商品货架管理的上机实习,我对于栈有了更多的认识,对栈的运用更加的熟练,对于栈的具体进出有了很深入的认识,尤其在输出栈的具体的进出操作过程中,在输出形式上费了很大的功夫,还有在插入新商品时,比较商品日期,开始的时候没有考虑全面,只考虑到新商品日期比所有的旧商品日期近,最后经过完善,又增加了比所有的商品日期早,和新商品日期在旧商品中间,最后才得到比较满意的结果.
总之,经过本次专业课程设计,让我掌握了开发应用软件的基本流程,运用所学编程技能的基本技巧,也让我初步了解了软件设计的基本方法,提高进行工程设计的基本技能及分析、解决实际问题的能力,为以后毕业设计和工程实践等打下良好的基础。相信通过这次的课程设计,我对所学的《数据结构(C语言版)》和各种编程语言都有了一个全新的认识。我也会积极吸取本次课程设计的经验,继续研究数据结构和所学的各种编程语言.
参考文献
[1]苏小红等。 C语言大学实用教程.(第二版)[M]。 北京:北京工业出版社,2008.
[2]吴文虎。 程序设计基础(第二版)[M]。 北京:清华大学出版社,2004.
[3]谭浩强。 C程序设计教程[M]。北京:清华大学出版社,2008。
[4]严蔚敏、吴伟民著。数据结构(C语言版)。北京:清华大学出版社,2007
附录:源程序
#include<stdio。h〉
#include〈stdlib。h〉
#include〈conio。h>
#define max 5
typedef struct{
char b;//存储商品名
//商品日期年、月、日
int year;
int month;
int day;
}Data;
typedef struct{
Data a[max];//0为栈底位置
int top;//栈顶
}Stack;
//初始化空栈
Stack *initstack(){
Stack *S;
S=(Stack *)malloc(sizeof(Stack));//申请空间 //判断是否申请到栈空间
if(!S){
printf("空间不足!\n");
return NULL;}
else{
S->top=—1;
return S;}}//将货架上摆放的货物打印出来
void Print(Stack *S){
printf(“这个商品的货架上摆放了%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){
int j;char k1;
int k2,k3,k4;
for(j=0;j<max;j++){
if(S-〉top==max—1){
printf(”栈满!\n");//栈满不能入栈
return S;}
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);
return 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”);
return L;}
//补货
void backstack(Stack *S,int x){
int i,ii;
int temp;
char k1;//储存商品名
int k2,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(k2〈S—〉a[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(k3<S—〉a[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); int x,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);}
int main(void){
Stack *s[5];//5种商品
int i;
printf(”计算机科学与技术1班 丁逸悦 学号:1308010108\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]);}//将商品入栈(上货)
char c,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');
return 0;}
14
展开阅读全文