乔治爱啃脚趾 发表于 2023-11-1 18:03:07

求助

为什么我这个入库后再出库会是一堆数字,可以帮我看看吗
#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 w;
                                     pop(s,w);
                                       printf("该商品编号为%d,生产日期为%d %d %d",w.number,w.date.year,w.date.month,w.date.day);
                                       break;}
                  case 3:{
                                        print(s);
                                        break;}
                }
                }
        }
int main()
{
        Lineup();
    return 0;
}

isdkz 发表于 2023-11-1 18:03:16

这段代码中出现一堆数字的原因是,程序在出栈操作时没有正确打印出栈元素的具体信息。

在函数 void pop(sqstack &s,selemtype k) 中,将出栈的元素赋值给了参数 k ,但没有进行打印操作。所以在出库操作中,只打印了出栈元素的编号,而没有打印出栈元素的生产日期。

为了解决这个问题,我们需要在出库操作中打印出栈元素的具体信息。修改代码如下:

case 2: {
    selemtype w;
    pop(s, w);
    printf("该商品编号为%d, 生产日期为%d年%d月%d日\n", w.number, w.date.year, w.date.month, w.date.day);
    break;
}


这样就能正确打印出栈元素的编号和生产日期了。

Mike_python小 发表于 2023-11-1 18:04:21

你好,看起来你的代码是一个栈的实现,但是我需要更多的信息才能帮助你解决问题。你说“入库后再出库会是一堆数字”,你指的是什么样的数字?是商品编号吗?这些数字是随机的吗?或者它们在你的预期之内?

请提供更多细节和背景信息,这样我才能更好地理解你的问题并给出有针对性的回答。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

乔治爱啃脚趾 发表于 2023-11-1 18:08:54

Mike_python小 发表于 2023-11-1 18:04
你好,看起来你的代码是一个栈的实现,但是我需要更多的信息才能帮助你解决问题。你说“入库后再出库会是一 ...

1.入库2.出库3.查看货物   4.退出
1
请输入商品编号及生产日期:
2 2023 3 2
1.入库2.出库3.查看货物   4.退出
2
该商品编号为1246513747,生产日期为1213482797 1229794642 1281.入库2.出库3.查看货物   4.退出
就是会出现这种情况,这是运行的结果。

乔治爱啃脚趾 发表于 2023-11-1 18:12:31

isdkz 发表于 2023-11-1 18:03
这段代码中出现一堆数字的原因是,程序在出栈操作时没有正确打印出栈元素的具体信息。

在函数 void pop( ...

这个答案与我运行出来的是一样的啊,都是一堆数字
页: [1]
查看完整版本: 求助