鱼C论坛

 找回密码
 立即注册
查看: 397|回复: 3

[已解决]求助

[复制链接]
发表于 2023-10-31 23:39:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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
{    int  number;                  //商品编号
         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;
}
最佳答案
2023-10-31 23:41:50
商品展示架整理

这个问题可以使用栈来解决,每一个商品都是一个元素,存储商品编号和生产日期。根据生产日期的先后顺序,将商品入栈,并在入栈时进行整理,保证生产日期早的商品在栈底,晚的商品在栈顶。另外,为了方便查看货物,可以在出栈时将商品信息输出。

以下是修改过后的代码:
++#include <stdio.h>#include <stdlib.h>#define stack_init_size 100#define stackincrement 10#define OK 1#define ERROR 0typedef 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;}
注意在输入商品信息时,要将商品编号和生产日期分别赋值给结构体中的对应成员。另外,为了方便查看货物,可以增加一个“查看货物”功能,输出所有存放在栈中的商品信息。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-31 23:41:16 | 显示全部楼层
你的代码中有一些问题。首先,你定义了一个生产日期的结构体,但在代码中并没有使用到。其次,你定义了一个商品的结构体,但在代码中也没有使用到。最后,在整理货架的过程中,你需要将生产日期较早的商品放在靠近固定开放的一端,但是你的代码中并没有实现这个功能。

下面是我对你的代码进行了修改和补充:
#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;
}

在这个修改后的代码中,我增加了对商品结构体的使用,并在入库的过程中实现了按照生产日期进行整理的功能。具体的实现方式是,当有新商品入库时,将栈顶的商品依次弹出并压入临时栈中,直到找到合适的位置插入新商品,然后再将临时栈中的商品重新压回原栈中。

希望对你有帮助!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-31 23:41:50 | 显示全部楼层    本楼为最佳答案   
商品展示架整理

这个问题可以使用栈来解决,每一个商品都是一个元素,存储商品编号和生产日期。根据生产日期的先后顺序,将商品入栈,并在入栈时进行整理,保证生产日期早的商品在栈底,晚的商品在栈顶。另外,为了方便查看货物,可以在出栈时将商品信息输出。

以下是修改过后的代码:
++#include <stdio.h>#include <stdlib.h>#define stack_init_size 100#define stackincrement 10#define OK 1#define ERROR 0typedef 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;}
注意在输入商品信息时,要将商品编号和生产日期分别赋值给结构体中的对应成员。另外,为了方便查看货物,可以增加一个“查看货物”功能,输出所有存放在栈中的商品信息。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-1 00:39:17 | 显示全部楼层
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
{    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)//出栈 
{
        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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-22 04:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表