wow wow 2022-04-08 18:39 采纳率: 100%
浏览 26
已结题

用自定义函数,链表与动态数组来表达集合数据

管理某个超市的商品。商品信息包括商品编号(条码号)、名称、库存数量、定价、折扣、生产日期、保质期(天)、类别。要求如下: 新增商品信息。修改商品信息,不允许修改商品编号。删除某种商品。商品编号和名称都是唯一的,新增和修改商品信息时需要保证这一约束。输入商品编号查询商品信息。输入商品名称查询商品信息。输出所有商品的信息报表。输出库存量低于某个数的商品信息报表。输出所有商品的价格报表,包括商品编号、名称、定价、折扣、折后价。统计平均价格(定价)。持久化商品信息到数据文件中。程序启动时自动读取商品数据文件中的数据到内存中。

  • 写回答

2条回答 默认 最新

  • 关注

    基本就是链表的基本操作,可以尝试自己先写一写。
    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct _stuffinfo
    {
        int id; //编号
        char name[20];//名称
        int kc; //库存
        float price; //定价
        float zk;  //折扣
        int year,mon,day;//生产日期
        int bzq; //保质期(天)
        char type[10]; //类别
        struct _stuffinfo* next;
    }Stuffinfo;
    
    //初始化链表
    Stuffinfo* initList(Stuffinfo* head)
    {
        head = (Stuffinfo*)malloc(sizeof(Stuffinfo));
        head->next = 0;
        return head;
    }
    //新增商品
    void addStuf(Stuffinfo* head)
    {
        Stuffinfo* tail;
        Stuffinfo* p = (Stuffinfo*)malloc(sizeof(Stuffinfo));
        p->next = 0;
        printf("请输入商品编号:");
        scanf("%d",&p->id);
        printf("请输入商品名称:");
        scanf("%s",p->name);
        printf("请输入库存数量:");
        scanf("%d",&p->kc);
        printf("请输入定价:");
        scanf("%f",&p->price);
        printf("请输入折扣(0-1):");
        scanf("%f",&p->zk);
        printf("请输入生产日期(YYYY MM DD):");
        scanf("%d %d %d",&p->year,&p->mon,&p->day);
        printf("请输入保质期:");
        scanf("%d",&p->bzq);
        printf("请输入类别:");
        scanf("%s",p->type);
        //找到链表的末尾
        tail = head;
        while(tail && tail->next)
            tail = tail->next;
        tail->next = p;
        printf("商品添加成功!\n");
    }
    //删除商品 根据商品编号删除
    void delStuff(Stuffinfo* head)
    {
        int id; //
        Stuffinfo* p,*front;
        printf("请输入需要删除的商品编号:");
        scanf("%d",&id);
        front = head;
        p = front->next;
        while(p)
        {
            if(p->id == id)
            {
                front->next = p->next;
                free(p);
                printf("删除成功!\n");
                return ;
            
            }else
            {
                front = p;
                p = p->next;
            }
        }
        printf("未找到改商品!\n");
    }
    
    //修改商品信息
    void modStuff(Stuffinfo* head)
    {
        int id; //
        Stuffinfo* p;
        printf("请输入需要修改信息的商品编号:");
        scanf("%d",&id);
        p = head->next;
        while(p)
        {
            if(p->id == id)
            {
                break;
            }else
                p = p->next;
        }
        if (p)
        {
            printf("请输入商品名称:");
            scanf("%s",p->name);
            printf("请输入库存数量:");
            scanf("%d",&p->kc);
            printf("请输入定价:");
            scanf("%f",&p->price);
            printf("请输入折扣(0-1):");
            scanf("%f",&p->zk);
            printf("请输入生产日期(YYYY MM DD):");
            scanf("%d %d %d",&p->year,&p->mon,&p->day);
            printf("请输入保质期:");
            scanf("%d",&p->bzq);
            printf("请输入类别:");
            scanf("%s",p->type);
            printf("商品信息修改成功!\n");
        }else
            printf("未找到该商品!\n");
    }
    
    //输出所有商品新
    void showAllStuf(Stuffinfo* head)
    {
        Stuffinfo* p;
        printf("所有商品信息如下:");
        p = head->next;
        while(p)
        {
            printf("%6d %20s %6d %6.2f %4.2f %4d-%2d-%2d %3d %10s\n",p->id,p->name,p->kc,p->price,p->kc,p->year,p->mon,p->day,p->bzq,p->type);
            p = p->next;
        }
    }
    
    //统计低于某个价格的商品信息
    void tongji(Stuffinfo* head)
    {
        Stuffinfo* p;
        int n;
        printf("请输入最低库存量:");
        scanf("%d",&n);
        printf("库存低于%d的商品如下:\n");
        p = head->next;
        while(p)
        {
            if(p->kc < n)
                printf("%6d %20s %6d %6.2f %4.2f %4d-%2d-%2d %3d %10s\n",p->id,p->name,p->kc,p->price,p->kc,p->year,p->mon,p->day,p->bzq,p->type);
        }
    }
    
    //输出所有商品的价格表,并统计平均价格
    void showPrice(Stuffinfo* head)
    {
        Stuffinfo* p = head->next;
        float ave = 0;
        int nmb = 0;
        printf("商品价格表:\n");
        while(p)
        {
            printf("%6d %20s %6.2f %4.2f %6.2f\n",p->id,p->name,p->price,p->kc,p->price*p->zk);
            nmb++;
            ave += p->price*p->zk;
            p = p->next;
        }
        printf("平均价格:%6.2f\n",ave/nmb);
    }
    
    //保存到文件
    void saveFile(Stuffinfo* head)
    {
        Stuffinfo* p;
        FILE* fp;
        fp = fopen("data.txt","w");
        p = head->next;
        while(p)
        {
            fprintf(fp,"%d %s %d %f %f %d-%d-%d %d %s\n",p->id,p->name,p->kc,p->price,p->kc,p->year,p->mon,p->day,p->bzq,p->type);
            p = p->next;
        }
        printf("保存成功!\n");
        fclose(fp);
    }
    //读取文件
    void readFile(Stuffinfo* head)
    {
        Stuffinfo *p,*t;
        FILE* fp = fopen("data.txt","r");
        t = head;
        while(!feof(fp))
        {
            p = (Stuffinfo *)malloc(sizeof(Stuffinfo));
            fscanf(fp,"%d %s %d %f %f %d-%d-%d %d %s\n",&p->id,p->name,&p->kc,&p->price,&p->kc,&p->year,&p->mon,&p->day,&p->bzq,p->type);
            if(p->id > 0)
            {
                t->next = p;
                t = p;
            }else
                free(p);
            
        }
        fclose(fp);
        printf("读取成功!\n");
    }
    
    int main()
    {
        Stuffinfo* head=0;
        int op,flag = 1;
        head = initList(head);
        readFile(head); //读取文件数据
        while(flag)
        {
            printf("1.插入数据\n");
            printf("2.修改数据\n");
            printf("3.删除数据\n");
            printf("4.显示所有数据\n");
            printf("5.统计库存低于某个值的商品\n");
            printf("6.输出商品的价格表\n");
            printf("7.保存到文件\n");
            printf("0.退出\n");
            printf("请选择:");
            scanf("%d",&op);
            switch(op)
            {
            case 1:addStuf(head);break;
            case 2:modStuff(head);break;
            case 3:delStuff(head);break;
            case 4:showAllStuf(head);break;
            case 5:tongji(head);break;
            case 6:showPrice(head);break;
            case 7:saveFile(head);break;
            case 0:flag = 0;break;
            }
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥50 opencv4nodejs 如何安装
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥15 复杂网络,变滞后传递熵,FDA