爱上高数的大雄 2021-12-30 09:22 采纳率: 100%
浏览 399
已结题

求用c语言设计一个商品订购系统

功能:
界面友好(良好的人机交互)。
1.输入商品信息并保存至文件(包括商品编号、商品名称、商品型号、商品价格、商品产地、库存数量和已订购数量等,至少包括10种产品供顾客选择)。
2.使用链表实现商品的增、删、改功能,并把更新后的信息保存至文件。
3.查询商品功能,如输入商品名称、商品型号等。
4.选购流程:所选商品编号—列出对应商品的信息—要求顾客输入邮寄地址信息—确认订购,是否继续选购其它商品,列出所有选订商品,再次确认订购。
5.订购信息保存至文件。
6.每天订购统计功能,并能根据输入的数据显示低于或高于此数据的商品信息。

  • 写回答

2条回答 默认 最新

  • 关注

    如下:
    shangpin.txt内容(只写了几个示例)

    100 哇哈哈 矿泉水 1.00 崂山 9996 4
    101 农夫山泉 矿泉水 2.00 崂山 10000 0
    102 可比克 零食 5.00 福建 9998 2
    103 可比克2 零食 5.00 福建 9998 2
    104 可比克3 零食 5.00 福建 9998 2
    105 可比克 零食 5.00 福建 9998 2
    106 牛肉粒 零食 32.00 内蒙古 2000 0
    
    

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    //定义商品结构体
    typedef struct _shangping 
    {
        int bh;          //编号
        char name[30];   //名称
        char xh[20];     //型号
        float price;     //价格
        char chandi[10]; //产地
        int kc;          //库存
        int ydg;         //已订购数量
    }ShangpinInfo;
    
    //定义链表节点
    typedef struct _stNode
    {
        ShangpinInfo product;
        struct _stNode* next;
    }LinkNode;
    
    
    //保存订购信息
    typedef struct _dginfo
    {
        int bh[20];    //商品编号
        int cnt[20];   //商品订购数量
        int nmb;       //实际订购商品的种类数量
        char addr[40]; //订购人地址
        char phone[12];//订购人电话
    
    }Dginfo;
    
    Dginfo g_dginfo[100]; //定义全局变量保存订购信息
    int g_dgNmb = 0;      //定义全局变量,保存订购信息数量
    
    //从文件中读取商品信息
    LinkNode* ReadFile(const char* name)
    {
        LinkNode* head,*p,*t;
    
        FILE* fp = 0;
    
        if ((fp=fopen(name,"r"))==0)
        {
            printf("读取商品信息失败...\n");
            return 0;
        }
        head = (LinkNode*)malloc(sizeof(LinkNode));
        head->next = NULL;
    
        p = head;
        //读取文件
        while(!feof(fp))
        {
            //逐行读取文件
            t = (LinkNode*)malloc(sizeof(LinkNode));
            t->next = NULL;
            fscanf(fp,"%d %s %s %f %s %d %d\n",&t->product.bh,t->product.name,t->product.xh,&t->product.price,t->product.chandi,&t->product.kc,&t->product.ydg);
            if(t->product.bh > 0) //避免读取到空行
            {
                p->next = t;
                p = t;
            }else
            {
                free(t); //空行,读取错误,释放空间
                t = 0;
            }
        }
        return head; //返回链表头
    }
    
    //更新商品信息文件
    void UpdateFile(const char* name,LinkNode* head)
    {
        LinkNode*t;
        FILE* fp = 0;
        if(head == 0) return;
        if ((fp=fopen(name,"w"))==0)
        {
            printf("读取商品信息失败...\n");
            return ;
        }
        t = head->next;
        while(t)
        {
            if(t->next)
                fprintf(fp,"%d %s %s %.2f %s %d %d\n",t->product.bh,t->product.name,t->product.xh,t->product.price,t->product.chandi,t->product.kc,t->product.ydg);
            else //最后一行不写入回车符
                fprintf(fp,"%d %s %s %.2f %s %d %d",t->product.bh,t->product.name,t->product.xh,t->product.price,t->product.chandi,t->product.kc,t->product.ydg);
            t = t->next;
        }
        fclose(fp);
    }
    
    //添加商品
    LinkNode* Addshangpin(LinkNode* head)
    {
        LinkNode* p,*t;
        system("cls");
    
        //如果头为空,则创建
        if (head == 0)
        {
            head = (LinkNode*)malloc(sizeof(LinkNode));
            head->next = NULL;
        }
    
        p = head;
        while(p->next)
        {
            p = p->next;
        }
        fflush(stdin);
        //尾插法
        t = (LinkNode*)malloc(sizeof(LinkNode));
        t->next = NULL;
        printf("请输入商品编号:");
        scanf("%d",&t->product.bh); getchar();
        printf("请输入商品名称:");
        scanf("%s",t->product.name); getchar();
        printf("请输入商品型号:");
        scanf("%s",t->product.xh); getchar();
        printf("请输入商品价格:");
        scanf("%f",&t->product.price); getchar();
        printf("请输入商品产地:");
        scanf("%s",t->product.chandi);
        printf("请输入商品库存:");
        scanf("%d",&t->product.kc);
        printf("请输入商品的已订购数量:");
        scanf("%d",&t->product.ydg);
        p->next = t;
        printf("商品添加成功\n");
        system("pause");
        return head;
    }
    
    //删除商品
    LinkNode* Delshangpin(LinkNode* head)
    {
        LinkNode* p,*t;
        int id;
        system("cls");
        fflush(stdin);
        printf("请输入需要删除的商品编号:");
        scanf("%d",&id);
        p = head;
        while (p->next)
        {
            if (p->next->product.bh == id)
            {
                printf("商品已删除\n");
                system("pause");
                t = p->next;
                p->next = t->next;
                free(t);
                t = 0;
                return head;
            }
            p = p->next;
        }
        printf("未找到该商品\n");
        system("pause");
        return head;
    }
    
    //修改商品信息
    LinkNode* Modshangpin(LinkNode* head)
    {
        LinkNode* p;
        int id;
        fflush(stdin);
        system("cls");
        printf("请输入需要修改的商品编号:");
        scanf("%d",&id);
        p = head->next;
        while (p)
        {
            if (p->product.bh == id)
            {
                printf("请输入商品名称:");
                scanf("%s",p->product.name); getchar();
                printf("请输入商品型号:");
                scanf("%s",p->product.xh); getchar();
                printf("请输入商品价格:");
                scanf("%f",&p->product.price); getchar();
                printf("请输入商品产地:");
                scanf("%s",p->product.chandi);
                printf("请输入商品库存:");
                scanf("%d",&p->product.kc);
                printf("请输入商品的已订购数量:");
                scanf("%d",&p->product.ydg);
                printf("商品信息已修改完成\n");
                system("pause");
                return head;
            }
            p = p->next;
        }
        printf("未找到该商品\n");
        system("pause");
        return head;
    }
    
    //查询商品
    LinkNode* Findshangpin(LinkNode* head)
    {
        LinkNode* p;
        char buf[30]={0};
        fflush(stdin);
        system("cls");
        if (head == 0)
        {
            printf("目前暂无商品\n");
            system("pause");
            return 0;
        }
        printf("请输入要查询的商品名称或者型号:");
        scanf("%s",buf);
    
        p = head->next;
        printf("编号   名称   型号    价格    产地   库存    已订购\n");
        while (p)
        {
            if (strcmp(p->product.name,buf)==0 || strcmp(p->product.xh,buf)==0)
            {
                printf("%4d  %s  %s  %.2f  %s  %d  %d\n",p->product.bh,p->product.name,p->product.xh,p->product.price,p->product.chandi,p->product.kc,p->product.ydg);
                system("pause");
                return p;
            }
            p = p->next;
        }
        printf("未找到该名称或者型号的商品\n");
        system("pause");
        return 0;
    }
    
    //显示所有商品
    void showAll(LinkNode* head)
    {
        LinkNode* p;
        system("cls");
        if(head==0)
        {
            printf("目前暂无商品\n");
            return;
        }
        p = head->next;
        printf("编号   名称   型号    价格    产地   库存    已订购\n");
        while (p)
        {
            printf("%4d  %s  %s  %.2f  %s  %d  %d\n",p->product.bh,p->product.name,p->product.xh,p->product.price,p->product.chandi,p->product.kc,p->product.ydg);
            p = p->next;
        }
        system("pause");
        return ;
    }
    
    
    
    //订购信息写入文件
    void UpdateDginfo(const char* name)
    {
        int i,j;
        FILE* fp;
        if((fp = fopen(name,"w")) == 0)
        {
            printf("文件打开失败\n");
            return;
        }
        for (i=0;i<g_dgNmb;i++)
        {
            //订购商品编号
            for(j=0;j<g_dginfo[i].nmb;j++)
            {
                //订购商品编号
                if(j< g_dginfo[i].nmb-1)
                    fprintf(fp,"%d,",g_dginfo[i].bh[j]);
                else
                    fprintf(fp,"%d ",g_dginfo[i].bh[j]);
            }
            //对应的数量
            for(j=0;j<g_dginfo[i].nmb;j++)
            {
                if(j< g_dginfo[i].nmb-1)
                    fprintf(fp,"%d,",g_dginfo[i].cnt[j]);
                else
                    fprintf(fp,"%d ",g_dginfo[i].cnt[j]);
            }
            //收件人信息
            fprintf(fp,"%s %s\n",g_dginfo[i].addr,g_dginfo[i].phone);
    
        }
        fclose(fp);
    }
    
    
    //订购商品
    void Shopping(LinkNode* head,const char* name)
    {
        LinkNode* p;
        int id,cnt=0;
        char ch;
        char addr[30];
        Dginfo dg;
        dg.nmb = 0;
        fflush(stdin);
        system("cls");
        if(head==0)
        {
            printf("目前暂无商品\n");
            return ;
        }
        while(1)
        {
            printf("请输入需要订购的商品编号:");
            scanf("%d",&id);
            p = head->next;
            while(p && p->product.bh != id)
                p = p->next;
            if(p)
            {
                printf("请输入订购数量:");
                scanf("%d",&cnt);
                p->product.ydg += cnt;
                //订购后是否需要从库存中减去?如果库存小于订购数量怎么处理?
                //这里暂时不考虑那么复杂,只是单纯的从库存中减去订购数量
                p->product.kc -= cnt; //减去订购数量
    
    
                dg.bh[dg.nmb] = id;
                dg.cnt[dg.nmb] = cnt;
                dg.nmb++;
    
            }else
                printf("未找到该商品,");
            printf("是否继续订购(Y/N):");
            fflush(stdin);
            ch = getchar();
            if(ch == 'Y' || ch == 'y')
                continue;
            else
                break;
        }
        fflush(stdin);
        printf("请输入收件人地址:");
        scanf("%s",&dg.addr); getchar();
        printf("请输入收件人电话:");
        scanf("%s",&dg.phone);
        getchar();//接收回车符
    
        g_dginfo[g_dgNmb] = dg;
        g_dgNmb++;
    
        //更新订购信息
        UpdateFile(name,head); //更新库存文件
    
        //订购信息写入文件
        UpdateDginfo("dg.txt");
    }
    
    //统计每天的订购信息,订购信息保存到了 g_dginfo全局变量中,可以考虑写入到文件
    void Tongji()
    {
        //按照产品编号统计
        int product[100][2] = {0};
        int nmb = 0;
        int i,j,k,id;
        int op,cnt=0;
        system("cls");
        fflush(stdin);
        //统计每种商品的订购信息
        for (i=0;i<g_dgNmb;i++)
        {
            for (j=0;j<g_dginfo[i].nmb;j++)
            {
                id = g_dginfo[i].bh[j];
                //查找编号是否已经存在
                for (k=0;k<nmb;k++)
                {
                    if(product[k][0] == id)
                        break;
                }
                if (k == nmb)
                {
                    product[nmb][0] = id;
                    product[nmb][1] = g_dginfo[i].cnt[j];
                    nmb++;
                }else
                    product[k][1] += g_dginfo[i].cnt[j];
            }
        }
        //显示所有订购信息
        while(1)
        {
            system("cls");
            printf("1.显示所有订购信息\n");
            printf("2.显示特定数量的订购信息\n");
            printf("3.退出统计\n");
            scanf("%d",&op);
            if(op == 3)
            {
                //system("pause");
                return ;
            }
            else if(op == 2 || op == 1)
            {
                cnt = 0;
                if(op == 2)
                {
                    printf("请输入指定数量:");
                    scanf("%d",&cnt);
                }
                printf("编号   数量\n");
                for (i=0;i<nmb;i++)
                {
                    if(product[i][1] > cnt)
                        printf("%d  %d\n",product[i][0],product[i][1]);
                }
    
                system("pause");
            }
        }
    
    }
    
    //释放内存
    void Release(LinkNode* head)
    {
        LinkNode* p;
        while (head)
        {
            p = head->next;
            free(head);
            head = p;
        }
    }
    
    
    
    int main()
    {
        int op;
        LinkNode* head = 0;
        head = ReadFile("shangpin.txt");
        while(1)
        {
            system("cls");
            printf("1.显示所有商品信息\n");
            printf("2.新增商品\n");
            printf("3.修改商品信息\n");
            printf("4.删除商品\n");
            printf("5.订购商品\n");
            printf("6.统计订购商品\n");
            printf("7.查找商品\n");
            printf("0.退出程序\n");
            scanf("%d",&op);
            switch(op)
            {
            case 0:
                printf("谢谢使用,再见\n");
                system("pause");
                return 0;
            case 1:
                showAll(head);
                break;
            case 2:
                head = Addshangpin(head);
                UpdateFile("shangpin.txt",head);
                break;
            case 3:
                head = Modshangpin(head);
                UpdateFile("shangpin.txt",head);
                break;
            case 4:
                head = Delshangpin(head);
                UpdateFile("shangpin.txt",head);
                break;
            case 5:
                Shopping(head,"shangpin.txt");
                break;
            case 6:
                Tongji();
                break;
            case 7:
                Findshangpin(head); //可以返回商品的指针
                break;
            }
        }
    
        //释放内存
        if(head)
        {
            Release(head);
            head = 0;
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月8日
  • 已采纳回答 12月31日
  • 创建了问题 12月30日

悬赏问题

  • ¥200 比特币ord程序wallet_constructor.rs文件支持一次性铸造1000个代币,并将它们分配到40个UTXO上(每个UTXO上分配25个代币),并设置找零地址
  • ¥15 关于Java的学习问题
  • ¥15 如何使用chatgpt完成文本分类任务?
  • ¥15 已知速度v关于位置s的等式,怎么转化为已知位置求速度v的等式
  • ¥15 我有个餐饮系统,用wampserver把环境配置好了,但是后端的网页却进去,是为什么,能不能帮远程一下?
  • ¥15 R运行没有名称为"species"的插槽对于此对象类"SDMmodelCV"
  • ¥20 基于决策树的数字信号处理,2ask 2psk 2fsk的代码,检查下报错的原因
  • ¥15 wincc已组态的变量过多
  • ¥60 如图:直线与椭圆X轴平行,求直线与椭圆任意一点的相切坐标计算公式
  • ¥50 如何用python使用opencv里的cv::cudacodec::VideoWriter函数对视频进行GPU硬编码