数据结构课程设计-商品货架管理(C语言)
數據結構課程設計——商品貨架管理(順序棧)
一、問題描述
商品貨架可以看成一個棧,棧頂商品的生產日期最早,棧底商品的生產日期最近。上貨時,需要進行倒貨架,以保證生產日期較近的商品在較下的位置。
二、基本要求
針對一種特定商品,實現上訴管理過程。
三、實現提示
用棧模擬貨架和周轉空間。
四、源程序
#include <stdio.h> #include <string.h>//字符串 #include<time.h>//時間 #include<stdlib.h> #include <conio.h> #include <windows.h> #define size 3 //貨架最大容量 //商品信息結構體 struct Data{int year; //年份int month; //月份int day; //日期int num; //數量 int data; //保質期 int num_1; //貨件編號 }; //定義順序棧 typedef struct{struct Data sp[size];//看成數組 int top;//棧頂 }seqstack; void InitStack(seqstack *S1); int StackEmpty(seqstack *S1); int StackFull(seqstack *S1); void push(seqstack *S1,seqstack *S2); void pop(seqstack *S1,seqstack *S2); void find(seqstack *S1); void Print(seqstack *S1); void output(seqstack *S1); void print1(seqstack *S1); void del(seqstack *S1); void save(seqstack *S1); void menu();void InitStack(seqstack *S1){ //棧初始化S1->top=-1; } int StackEmpty(seqstack *S1){ //判斷棧是否空if(S1->top==-1) return 1;else return 0; } int StackFull(seqstack *S1){ //判斷棧是否滿if(S1->top==size-1)return 1;else return 0; }void push(seqstack *S1,seqstack *S2){ //商品貨件上架(錄入商品貨件信息)int i,n,m,j=0;time_t t;struct tm * lt;time (&t);//獲取Unix時間戳。lt = localtime (&t);//轉為時間結構。struct Data p;m=(lt->tm_year+1900)*365+(lt->tm_mon)*30+lt->tm_mday;printf("------------歡迎進入商品上貨界面!------------\n\n\n");if(StackFull(S1))printf("\t*貨架已滿,無法上貨!");else{printf("該貨架最大容量為%d!,貨架已有%d件貨物!\n\n",size,S1->top+1);do{fflush(stdin);printf("\n請輸入本次上貨的件數:"); //超過貨架最大容量,重新輸入scanf("%d",&n);if(n+S1->top+1>size) printf("\n該貨架最大容量為%d且貨架已有%d件貨物!請重新輸入!\n\n",size,S1->top+1);}while(n+S1->top+1>size); for(j=0;j<n;j++){printf("\n請輸入第%d件貨物的信息:\n",j+1);printf("\n\to貨件編號:");scanf("%d",&p.num_1); do{fflush(stdin); printf("\n\to生產日期:"); //生產日期小于今天且規范,貨件為近十年的貨件scanf("%d/%d/%d",&p.year,&p.month,&p.day);if((p.year*365+(p.month-1)*30+p.day)>m||p.year<=0||p.year<(lt->tm_year+1890)||p.month<=0||p.month>12||p.day<=0||p.day>30)printf("\n輸入的生產日期不對!請重新輸入!\n");}while((p.year*365+(p.month-1)*30+p.day)>m||p.year<=0||p.year<(lt->tm_year+1890)||p.month<=0||p.month>12||p.day<=0||p.day>30);do{fflush(stdin);printf("\n\to商品數量:");scanf("%d",&p.num);if(p.num<=0) printf("\n輸入的數量不對!請重新輸入!\n");}while(p.num<=0); printf("\n\to保質期(天):");scanf("%d",&p.data);i=1;while(S1->top!=-1&&((p.year*365+(p.month-1)*30+p.day)-(S1->sp[S1->top].year*365+(S1->sp[S1->top].month-1)*30+S1->sp[S1->top].day))>0){ //倒貨S2->top++;S2->sp[S2->top]=S1->sp[S1->top];S1->top--; }S1->top++;S1->sp[S1->top]=p;for(;S2->top>-1;S2->top--){S1->top++;S1->sp[S1->top]=S2->sp[S2->top];} }if(i==1) printf("\n商品上架成功"); }printf("\n\n\n返回上一層,");system("pause"); system("cls"); }void find(seqstack *S1){ //查詢界面int n,j;printf("----------歡迎進入商品查詢界面!----------\n\n");if(StackEmpty(S1)) printf("\n\t*貨架為空,無法查詢,請先添加貨物!\n"); //貨架空else{do{printf("\n【按 生產日期 查詢輸入1】\t【按 數量 查詢輸入2】\t【退出查詢界面輸入0】"); printf("\n\n\n請選擇您的選項:");scanf("%d",&n); switch(n){ case 1: { //按生產日期查詢int month,year,day;int i=0; printf("\n請輸入要查詢的日期:");scanf("%d/%d/%d",&year,&month,&day); for(j=S1->top;j>=0;j--){if(S1->sp[j].year==year&&S1->sp[j].month==month&&S1->sp[j].day==day){if(i==0) printf("\n%d年%d月%d日生產的旺仔牛奶如下:\n\n",year,month,day); //存在該貨件if(i==0) printf("\t貨件編號\t生產日期\t保質期(天)\t商品數量\n\n");printf("\t%d",S1->sp[j].num_1); printf("\t\t%d/%d/%d",S1->sp[j].year,S1->sp[j].month,S1->sp[j].day);printf("\t%d",S1->sp[j].data);printf("\t\t%d",S1->sp[j].num);printf("\n\n");i=1;}}if(i==0) printf("\n\n\t無%d/%d/%d生產的旺仔牛奶!\n",year,month,day); //無該貨件printf("\n\n----------------------------------------\n\n"); break;}case 2:{int num; //按數量查詢int i=0;printf("\n請輸入要查詢的數量:");scanf("%d",&num); for(j=S1->top;j>=0;j--){if(S1->sp[j].num<=num){if(i==0) printf("\n貨架上%d件以下的旺仔牛奶如下:\n\n",num); if(i==0) printf("\t貨件編號\t生產日期\t保質期(天)\t商品數量\n\n"); //存在該數量以下的貨件printf("\t%d",S1->sp[j].num_1); printf("\t\t%d/%d/%d",S1->sp[j].year,S1->sp[j].month,S1->sp[j].day);printf("\t%d",S1->sp[j].data);printf("\t\t%d",S1->sp[j].num);printf("\n\n");i=1;}}if(i==0) printf("\n\n\t無%d件以下的旺仔牛奶!\n",num); //無此類貨件printf("\n----------------------------------------\n\n"); break;}}}while(n!=0);}printf("\n\n返回上一層,"); system("pause");system("cls"); }void Print(seqstack *S1){ //貨架的貨件信息int j;printf("----------歡迎進入貨架清單界面!----------\n\n\n");if(StackEmpty(S1)) printf("\t*貨架為空,請先添加貨物!\n"); //貨架空else{print1(S1);}printf("\n\n返回上一層,");system("pause");system("cls"); }void print1(seqstack *S1){int j;printf("貨架清單如下:\n\n");printf("\t貨件編號\t生產日期\t保質期(天)\t商品數量\n\n");for(j=S1->top;j>=0;j--){printf("\t%d",S1->sp[j].num_1); printf("\t\t%d/%d/%d",S1->sp[j].year,S1->sp[j].month,S1->sp[j].day);printf("\t%d",S1->sp[j].data);printf("\t\t%d",S1->sp[j].num);printf("\n\n");} } void pop(seqstack *S1){ //貨件出架int j,num_1,num;printf("------------歡迎進入商品出貨界面!------------\n\n\n");if(StackEmpty(S1)) printf("\t*貨架為空,請先添加貨物!\n"); ///貨架空else{print1(S1);printf("請輸入您要出貨貨件的編號:");scanf("%d",&num_1);for(j=S1->top;j>=0;j--){if(S1->sp[j].num_1==num_1){do{fflush(stdin); //輸入的出貨件數需小于該貨件原本有的貨件數量printf("\n請輸入該貨件出貨數量:");scanf("%d",&num);if(num>S1->sp[j].num)printf("該貨件無%d件商品,請重新輸入!\n"); }while(num>S1->sp[j].num);S1->sp[j].num-=num;printf("\n\t出貨成功!");if(S1->sp[j].num<20) printf("該貨件商品小于20件!\n"); //出貨后數量小于20會提示上貨break;}}}printf("\n\n返回上一層,"); system("pause");system("cls"); } void del(seqstack *S1,seqstack *S2){ //刪除貨件char name[20];int num_1,T,j;struct Data p1;printf("------------歡迎進入商品刪除界面!------------\n\n\n");if(StackEmpty(S1)) printf("\t*貨架為空,請先添加貨物!\n"); //貨架空else{print1(S1);printf("請輸入您要刪除貨件的編號:");scanf("%d",&num_1); for(j=S1->top;j>=0;j--){if(S1->sp[j].num_1==num_1){while(S1->top>j){S2->top++;S2->sp[S2->top]=S1->sp[S1->top];S1->top--;}p1=S1->sp[S1->top];S1->top--;for(;S2->top>-1;S2->top--){S1->top++;S1->sp[S1->top]=S2->sp[S2->top];}printf("\n\n\t該貨件刪除成功!\n");break;}}}printf("\n\n返回上一層,");system("pause");system("cls"); }void outdata(seqstack *S1){ //打印過期貨件int m,i=0,j;time_t t;struct tm * lt;time (&t);//獲取Unix時間戳。lt = localtime (&t);//轉為時間結構。m=(lt->tm_year+1900)*365+(lt->tm_mon)*30+lt->tm_mday; //當前系統時間if(StackEmpty(S1)) printf("\t*貨架為空,請先添加貨物!\n"); //貨架空else{for(j=S1->top;j>=0;j--){if((S1->sp[j].year*365+(S1->sp[j].month-1)*30+S1->sp[j].day+S1->sp[j].data)<m){if(i==0) printf("已過期的旺仔牛奶如下(今日日期為:%d/%d/%d):\n\n",lt->tm_year+1900,lt->tm_mon+1,lt->tm_mday);if(i==0) printf("\t貨件編號\t生產日期\t保質期(天)\t商品數量\n\n");printf("\t%d",S1->sp[j].num_1); printf("\t\t%d/%d/%d",S1->sp[j].year,S1->sp[j].month,S1->sp[j].day);printf("\t%d",S1->sp[j].data);printf("\t\t%d",S1->sp[j].num);printf("\n\n");i=1;}}if(i==0) printf("\n\t貨架無過期的旺仔牛奶!\n"); }printf("\n\n返回上一層,");system("pause");system("cls"); } void save(seqstack *S1){ //保存貨件信息int i,j;FILE *fp; if(StackEmpty(S1)) printf("\t*貨架為空,請先添加貨物!\n"); //貨架空else{fp=fopen("goods.txt","w");if(!fp){printf("文件不存在\n");return;}//將商品信息寫入文件fprintf(fp,"===========================商品信息一覽表===========================\n");fprintf(fp,"\n");fprintf(fp,"貨件編號\t\t生產日期\t\t保質期(天)\t\t商品數量\n\n");for(j=S1->top;j>=0;j--){fprintf(fp,"%d",S1->sp[j].num_1); fprintf(fp,"\t\t%d/%d/%d",S1->sp[j].year,S1->sp[j].month,S1->sp[j].day);fprintf(fp,"\t\t%d",S1->sp[j].data);fprintf(fp,"\t\t%d",S1->sp[j].num);fprintf(fp,"\n\n");}fclose(fp); //把緩沖區內最后剩余的數據輸出到內核緩沖區,并釋放文件指針printf("數據已成功導入文件goods.txt!\n"); printf("\n √保存成功!");}printf("\n\n返回上一層,");system("pause");system("cls"); } void menu(){printf("\n\n\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳ “旺仔牛奶 ”貨架 ┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("\n\n");system("color DF"); printf("\t\t\t ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("\t\t\t ┃ ┃\n");printf("\t\t\t ┃ 請選擇您要操作的項目 ┃\n");printf("\t\t\t ┃ ┃\n");printf("\t\t\t ┃ 1 上貨 ┃\n");printf("\t\t\t ┃ ┃\n");printf("\t\t\t ┃ 2 出貨 ┃\n");printf("\t\t\t ┃ ┃\n");printf("\t\t\t ┃ 3 查詢 ┃\n");printf("\t\t\t ┃ ┃\n");printf("\t\t\t ┃ 4 過期貨件 ┃\n");printf("\t\t\t ┃ ┃\n");printf("\t\t\t ┃ 5 貨架清單 ┃\n");printf("\t\t\t ┃ ┃\n");printf("\t\t\t ┃ 6 刪除貨件 ┃\n");printf("\t\t\t ┃ ┃\n");printf("\t\t\t ┃ 7 保存操作 ┃\n");printf("\t\t\t ┃ ┃\n");printf("\t\t\t ┃ 0 退出系統 ┃\n");printf("\t\t\t ┃ ┃\n");printf("\t\t\t ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");} int main(){seqstack A,B;InitStack(&A);InitStack(&B); //值等于棧頂 int i;do{menu();printf("\n\n");printf(" *請輸入您的選擇(0 - 6):");scanf("%d",&i);printf("\n\n");switch(i){case 1:push(&A,&B);break; //創建top case 2:pop(&A);break;case 3:find(&A);break; case 4:outdata(&A);break;case 5:Print(&A);break;case 6:del(&A,&B);break;case 7:save(&A);break; case 0:printf("正在退出該系統,歡迎下次使用!\n\n");for(int i=0;i<30;i++){Sleep(150);printf("<<"); }system("cls");break; default:printf("請輸入正確的選項!\n\n");system("pause");system("cls");;break; }}while(i!=0);return 0; }五、各功能介紹
1.上貨
(1)先判斷棧是否滿
(2)滿,提示貨架已滿,無法上貨,否則,輸入需要上貨的件數,添加貨件的信息,即完成上貨
2.出貨
(1)先判斷貨件是否空
(2)空,提醒上貨,否則,根據貨架清單輸入出貨貨件的編號和數量,完成出貨
3.查詢
(1)先判斷棧是否空
(2)空,提醒上貨,否則,根據菜單輸入相依編號(1.按生產日期,2.數量,0.退出查詢),然后根據需入的編號找相應貨件,存在,輸出該貨件信息,否則,打印“無此商品”
4.打印過期貨件
(1)先判斷棧是否空
(2)空,提醒上貨,否則,看貨架是否存在過期貨件,輸出相應的結果
5.刪除貨件
(1)先判斷棧是否空
(2)空,提醒上貨,否則,根據貨架信息輸入刪除貨件的編號,刪除該貨件
6.打印貨架清單
(1)先判斷棧是否空
(2)空,提醒上貨,否則,打印出貨架的全部貨件信息
7.保存操作
(1)先判斷貨架是否空
(2)空,提醒上貨,否則,保存
六、程序運行截圖
1.菜單界面
2.錄入貨件信息
瀏覽當前輸入的貨件信息
3.貨件出貨
貨架為空
出貨
出貨后貨架信息
3.查詢貨件
貨架為空
按生產日期查詢
按數量查詢
4.打印過期貨件
貨架為空
存在過期貨件
無過期貨件
5.打印貨架清單
貨架為空
貨架清單
6.刪除貨件
貨架為空
刪除后的貨件
刪除后貨架清單
7.保存操作
貨架為空
保存成功
8.退出系統
總結
以上是生活随笔為你收集整理的数据结构课程设计-商品货架管理(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2777):组件之间的通讯方式
- 下一篇: 前端学习(2801):传递id