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

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

如下:
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;
}

https://www.docin.com/p-247625493.html