求助
1.超市内商品的信息包括商品编号和生产日期。用于商品展示的货架,是一个半封闭的货架,客人拿取商品,工作人员上架新的商品,都只能固定在开放的一端进行。当工作人员上架新商品时,需要整理展示架上的商品,使生产日期较早的商品,放在靠近固定开放的一端。请编程模拟对商品展示架中已有商品按生产日期进行整理的过程。下面是我写的部分代码。
#include<stdio.h>
#include<stdlib.h>
#define stack_init_size 100
#define stackincrement 10
#define OK 1
#define ERROR 0
typedef int status;
typedef int selemtype;
typedef struct{
selemtype *base;//栈底指针
selemtype *top;//栈顶指针
int stacksize;
}sqstack;
typedef struct //声明结构体Production用于表示生产日期
{ int year;
int month;
int day;
}production;
typedef struct
{ intnumber; //商品编号
production date; //商品生产日期
}Selemtype;
void initstack(sqstack &s)
{
s.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));
s.top=s.base;
s.stacksize=stack_init_size;
}
void push(sqstack &s,Selemtype e)//入栈
{
if(s.top-s.base>=s.stacksize){
s.base=(selemtype*)realloc(s.base,(s.stacksize+stack_init_size)*sizeof(selemtype));
if(!s.base)
printf("error");
s.top=s.base+s.stacksize;
s.stacksize+=stack_init_size;
}
*s.top=e;
s.top++;
}
void pop(sqstack &s,selemtype k)//出栈
{
selemtype *e=s.top-1;
int i=0;
if(s.base==s.top){
printf("栈为空");
}
k=*e;
s.top--;
}
status gettop(sqstack s,Selemtype k)//取栈顶元素
{
Selemtype e;
if(s.top!=s.base){
return k=*(s.top-1);
}
return ERROR;
}
void print(sqstack &s)//输出
{
selemtype *e=s.base;
int i=0;
while(i<(s.top-s.base))
{
printf("%d ",*e);
i++;
e++;
}
}
status judge(sqstack &s,Selemtype e)//栈顶元素大于输入返回1
{
Selemtype k;
gettop(s,k);
if(k.date.year>e.date.year){
return OK;
}
else if(k.date.year==e.date.year){
if(k.date.month>e.date.month){
return OK;}
else if(k.date.month==e.date.month){
if(k.date.day>e.date.day){
return OK;
}
else if(k.date.day==e.date.day){
return OK;
}
}
}
else {
return ERROR;
}
}
void Lineup()
{
int i,j=1,t;
sqstack s,temp;
Selemtype e,k;
initstack(s);
initstack(temp);
while(j!=4)
{
printf("1.入库2.出库3.查看货物 4.退出\n");
scanf("%d",&j);
if(j==1)
{
printf("请输入商品编号及生产日期:\n");
scanf("%d %d %d %d",&e.number,&e.date.year,&e.date.month,&e.date.day);
if(s.top==s.base)
{
push(s,e);
s.top++;
}
else{
gettop(s,k);
t=0;
while(!t){
pop(s,k);
push(temp,k);
t=judge(s,e);
}
}
}
}
}
int main()
{
Lineup();
return 0;
} 你的代码中有一些问题。首先,你定义了一个生产日期的结构体,但在代码中并没有使用到。其次,你定义了一个商品的结构体,但在代码中也没有使用到。最后,在整理货架的过程中,你需要将生产日期较早的商品放在靠近固定开放的一端,但是你的代码中并没有实现这个功能。
下面是我对你的代码进行了修改和补充:
#include <stdio.h>
#include <stdlib.h>
#define stack_init_size 100
#define stackincrement 10
#define OK 1
#define ERROR 0
typedef int status;
typedef struct {
int year;
int month;
int day;
} production;
typedef struct {
int number;
production date;
} Selemtype;
typedef struct {
Selemtype *base;
Selemtype *top;
int stacksize;
} sqstack;
void initstack(sqstack &s)
{
s.base = (Selemtype *)malloc(stack_init_size * sizeof(Selemtype));
s.top = s.base;
s.stacksize = stack_init_size;
}
void push(sqstack &s, Selemtype e)
{
if (s.top - s.base >= s.stacksize) {
s.base = (Selemtype *)realloc(s.base, (s.stacksize + stack_init_size) * sizeof(Selemtype));
if (!s.base) {
printf("error");
}
s.top = s.base + s.stacksize;
s.stacksize += stack_init_size;
}
*s.top = e;
s.top++;
}
void pop(sqstack &s, Selemtype &k)
{
if (s.base == s.top) {
printf("栈为空");
}
s.top--;
k = *s.top;
}
status gettop(sqstack s, Selemtype &k)
{
if (s.top != s.base) {
k = *(s.top - 1);
return OK;
}
return ERROR;
}
void print(sqstack &s)
{
Selemtype *e = s.base;
while (e < s.top) {
printf("%d ", e->number);
e++;
}
printf("\n");
}
status judge(Selemtype k, Selemtype e)
{
if (k.date.year > e.date.year) {
return OK;
} else if (k.date.year == e.date.year) {
if (k.date.month > e.date.month) {
return OK;
} else if (k.date.month == e.date.month) {
if (k.date.day > e.date.day) {
return OK;
}
}
}
return ERROR;
}
void Lineup()
{
int j = 1;
sqstack s, temp;
Selemtype e, k;
initstack(s);
initstack(temp);
while (j != 4) {
printf("1.入库2.出库3.查看货物4.退出\n");
scanf("%d", &j);
if (j == 1) {
printf("请输入商品编号及生产日期:\n");
scanf("%d %d %d %d", &e.number, &e.date.year, &e.date.month, &e.date.day);
if (s.top == s.base) {
push(s, e);
} else {
while (gettop(s, k) && judge(k, e)) {
pop(s, k);
push(temp, k);
}
push(s, e);
while (temp.top != temp.base) {
pop(temp, k);
push(s, k);
}
}
}
}
}
int main()
{
Lineup();
return 0;
}
在这个修改后的代码中,我增加了对商品结构体的使用,并在入库的过程中实现了按照生产日期进行整理的功能。具体的实现方式是,当有新商品入库时,将栈顶的商品依次弹出并压入临时栈中,直到找到合适的位置插入新商品,然后再将临时栈中的商品重新压回原栈中。
希望对你有帮助!如果还有其他问题,请随时提问。 商品展示架整理
这个问题可以使用栈来解决,每一个商品都是一个元素,存储商品编号和生产日期。根据生产日期的先后顺序,将商品入栈,并在入栈时进行整理,保证生产日期早的商品在栈底,晚的商品在栈顶。另外,为了方便查看货物,可以在出栈时将商品信息输出。
以下是修改过后的代码:
++
#include <stdio.h>
#include <stdlib.h>
#define stack_init_size 100
#define stackincrement 10
#define OK 1
#define ERROR 0
typedef int status;
typedef struct {
int year;
int month;
int day;
} Production;
typedef struct {
int number;
Production date;
} Element;
typedef struct {
Element* base; // 栈底指针
Element* top; // 栈顶指针
int stacksize;
} SqStack;
void InitStack(SqStack& s) {
s.base = (Element*)malloc(stack_init_size * sizeof(Element));
s.top = s.base;
s.stacksize = stack_init_size;
}
void Push(SqStack& s, Element e) {
if (s.top - s.base >= s.stacksize) {
s.base = (Element*)realloc(s.base, (s.stacksize + stack_init_size) * sizeof(Element));
if (!s.base) {
printf("error");
return;
}
s.top = s.base + s.stacksize;
s.stacksize += stack_init_size;
}
*s.top = e;
s.top++;
}
void Pop(SqStack& s, Element& k) {
if (s.top == s.base) {
printf("栈为空\n");
return;
}
s.top--;
k = *(s.top);
}
status GetTop(SqStack s, Element& k) {
if (s.top != s.base) {
k = *(s.top - 1);
return OK;
}
return ERROR;
}
void Print(SqStack s) {
Element* e = s.base;
while (e != s.top) {
printf("编号:%d,生产日期:%d-%d-%d\n", e->number, e->date.year, e->date.month, e->date.day);
e++;
}
}
status Judge(Element a, Element b) {
if (a.date.year < b.date.year) {
return OK;
} else if (a.date.year == b.date.year && a.date.month < b.date.month) {
return OK;
} else if (a.date.year == b.date.year && a.date.month == b.date.month && a.date.day < b.date.day) {
return OK;
} else {
return ERROR;
}
}
void Lineup() {
int op = 0;
SqStack s;
SqStack temp;
InitStack(s);
InitStack(temp);
while (op != 4) {
printf("1.入库 2.出库 3.查看货物 4.退出\n");
scanf("%d", &op);
switch (op) {
case 1: {
Element e;
printf("请输入商品编号及生产日期:\n");
scanf("%d %d %d %d", &e.number, &e.date.year, &e.date.month, &e.date.day);
if (s.top == s.base) {
Push(s, e);
} else {
Element k;
int t = 0;
while (!t) {
Pop(s, k);
Push(temp, k);
t = Judge(k, e);
}
Push(s, e);
while (temp.top != temp.base) {
Pop(temp, k);
Push(s, k);
}
}
break;
}
case 2: {
Element k;
Pop(s, k);
printf("出库:编号:%d,生产日期:%d-%d-%d\n", k.number, k.date.year, k.date.month, k.date.day);
break;
}
case 3: {
Print(s);
break;
}
case 4: {
printf("谢谢使用!\n");
break;
}
default: {
printf("输入有误,请重新输入\n");
break;
}
}
}
}
int main() {
Lineup();
return 0;
}
注意在输入商品信息时,要将商品编号和生产日期分别赋值给结构体中的对应成员。另外,为了方便查看货物,可以增加一个“查看货物”功能,输出所有存放在栈中的商品信息。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:} Mike_python小 发表于 2023-10-31 23:41
商品展示架整理
这个问题可以使用栈来解决,每一个商品都是一个元素,存储商品编号和生产日期。根据生产日 ...
你好,我想问问为什么我这个入库后出库是一堆数字
#include<stdio.h>
#include<stdlib.h>
#define stack_init_size 100
#define stackincrement 10
#define OK 1
#define ERROR 0
typedef int status;
typedef struct //声明结构体Production用于表示生产日期
{ int year;
int month;
int day;
}production;
typedef struct
{ intnumber; //商品编号
production date; //商品生产日期
}selemtype;
typedef struct{
selemtype *base;//栈底指针
selemtype *top;//栈顶指针
int stacksize;
}sqstack;
void initstack(sqstack &s)
{
s.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));
s.top=s.base;
s.stacksize=stack_init_size;
}
void push(sqstack &s,selemtype e)//入栈
{
if(s.top-s.base>=s.stacksize){
s.base=(selemtype*)realloc(s.base,(s.stacksize+stack_init_size)*sizeof(selemtype));
if(!s.base)
printf("error");
s.top=s.base+s.stacksize;
s.stacksize+=stack_init_size;
}
*s.top=e;
s.top++;
}
void pop(sqstack &s,selemtype k)//出栈
{
selemtype *e=s.top-1;
int i=0;
if(s.base==s.top){
printf("栈为空");
}
k=*e;
s.top--;
}
status gettop(sqstack s,selemtype k)//取栈顶元素
{
selemtype e;
if(s.top!=s.base){
k=*(s.top-1);
return OK;
}
return ERROR;
}
void print(sqstack &s)//输出
{
selemtype *e=s.base;
int i=0;
while(i<(s.top-s.base))
{
printf("%d ",*e);
i++;
e++;
}
}
status judge(sqstack &s,selemtype e)//栈顶元素大于输入返回1
{
selemtype k;
gettop(s,k);
if(k.date.year>e.date.year){
return OK;
}
else if(k.date.year==e.date.year){
if(k.date.month>e.date.month){
return OK;}
else if(k.date.month==e.date.month){
if(k.date.day>e.date.day){
return OK;
}
else if(k.date.day==e.date.day){
return OK;
}
}
}
else {
return ERROR;
}
}
void Lineup()
{
int i,j=1,t;
sqstack s,temp;
initstack(s);
initstack(temp);
while(j!=4)
{
printf("1.入库2.出库3.查看货物 4.退出\n");
scanf("%d",&j);
switch(j){
case 1:{
selemtype e,k;
printf("请输入商品编号及生产日期:\n");
scanf("%d %d %d %d",&e.number,&e.date.year,&e.date.month,&e.date.day);
if(s.top==s.base)
{
push(s,e);
}
else{
gettop(s,k);
t=0;
while(!t){
pop(s,k);
push(temp,k);
t=judge(s,e);
}
push(s,e);
while(temp.base!=temp.top)
{
pop(temp,k);
push(s,k);
}
}
break;}
case 2: {
selemtype k;
pop(s,k);
printf("该商品编号为%d,生产日期为%d %d %d",k.number,k.date.year,k.date.month,k.date.day);
break;}
case 3:{
print(s);
break;}
}
}
}
int main()
{
Lineup();
return 0;
}
页:
[1]