货物管理系统

 

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<process.h>
#include<time.h>
#define Null 0

struct goods*input(void);
struct goods*open(void);
void add(struct goods*head);
struct goods*delete(struct goods*head);
struct goods*amend(struct goods*head);
void print(struct goods*head);
void find(struct goods*head);
void statistics(struct goods*head);
void list1(struct goods*head);
struct goods*search(struct goods*head);
struct goods*incr1(struct goods*head);
void list2(struct goods*head);
struct goods*incr2(struct goods*head);
struct goods*sort1(struct goods*head);
struct goods*sort2(struct goods*head);
struct goods*sort3(struct goods*head);
struct goods*sort4(struct goods*head);

struct goods   /*定义货物数据结构体*/
{
    char number[20];               /*编号*/
    char name[20];            /*名称*/
    float Pprice;             /*进货价*/
    float Sprice;             /*销售价*/
    char ori[30];             /*产地*/
    struct
    {
        int year;
        int month;
        int day;

    }Pdate;                    /*生产日期*/
    int Slife;                /*保质期*/
    int tim;                  /*过期时间*/
    int inv;                  /*库存量*/
    int left;                 /*剩余量*/
    int Bsold;                /*已销售量*/
    float income;             /*收益*/
    struct goods*next;
};
int main(void)
{
    struct goods*head;
    char choose='\0',yes_no='\0';
    do{
        system("cls");
    printf("|--------------------------------|\n");
    printf("|               欢迎来到商店货物管理系统                     |\n");
    printf("|              请输入菜单选项编号(0~9)                   |\n");
    printf("|--------------------------------|\n");
    printf("|     A---输入货物信息                                         |\n");
    printf("|     B---从文件读取货物信息                                   |\n");
    printf("|     C---添加一条货物信息                                     |\n");
    printf("|     D---删除一条货物信息                                     |\n");
    printf("|     E---修改一条货物信息                                     |\n");
    printf("|     F---显示所有货物信息                                     |\n");
    printf("|     G---显示差10天过期的货物信息                             |\n");
    printf("|     H---按照货物编号查找货物信息                             |\n");
    printf("|     I---统计全仓库各种货物库存总数、已销售数量和剩余总数     |\n");
    printf("|     J---增加货物促销信息                                     |\n");
    printf("|     K---增加货物补货信息                                     |\n");
    printf("|     L---按照货物编号排序                                     |\n");
    printf("|     M---按照货物名称排序                                     |\n");
    printf("|     N---按照货物剩余总数排序                                 |\n");
    printf("|     P---按照保质期截至日前排序                               |\n");
    printf("|     0---退出                                                 |\n");
    printf("|--------------------------------|\n");
    printf("                                                        \n");
    choose=getche();
    printf("\n");
    switch(choose)
    {
        case'A':{head=input();list1(head);break;}
        case'B':{head=open();list1(head);break;}
        case'C':{add(head);list1(head);break;}
        case'D':{head=delete(head);list1(head);break;}
        case'E':{head=amend(head);list1(head);break;}
        case'F':{print(head);break;}
        case'G':{head=search(head);list2(head);break;}
        case'H':{find(head);break;}
        case'I':{statistics(head);break;}
        case'J':{head=incr1(head);list2(head);break;}
        case'K':{head=incr2(head);list2(head);break;}
        case'L':{head=sort1(head);print(head);list2(head);break;}
        case'M':{head=sort2(head);print(head);list2(head);break;}
        case'N':{head=sort3(head);print(head);list2(head);break;}
        case'P':{head=sort4(head);print(head);list2(head);break;}
        case'0':{break;}
        default:printf("              %c为非法选项!\n",choose);
    }
    if(choose=='0')break;
    printf("\n                 要继续选择吗(Y/N)?\n");
    do
    {
        yes_no=getch();
    }
    while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
   }
   while(yes_no=='Y'||yes_no=='y');

}
/*
函数功能:输入货物信息
函数入口参数:空
函数返回值:结构体指针
*/
struct goods*input(void)
{
    struct goods *head,*p,*s;
    int i,n;
    printf("请问有多少个货物信息需要输入?\n");
    scanf("%d",&n);
    getchar();                 /*吸收输入n时的回车*/


    for(i=1;i<=n;i++)
    {
        if(i==1)
       {
           printf("==============请输入%d个货物信息===============\n",i);
           p=(struct goods*)malloc(sizeof(struct goods));
           printf("编号:");
           scanf("%s",p->number);
           printf("名称:");
           scanf("%s",p->name);
           printf("进货价:");
           scanf("%f",&p->Pprice);
           printf("销售价:");
           scanf("%f",&p->Sprice);
           printf("产地:");
           scanf("%s",p->ori);
           printf("生产日期(年 月 日):");
           scanf("%d %d %d",&p->Pdate.year,&p->Pdate.month,&p->Pdate.day);
           printf("保质期(月):");
           scanf("%d",&p->Slife);
           printf("库存量:");
           scanf("%d",&p->inv);
           printf("已销售数量:");
           scanf("%d",&p->Bsold);
           p->income=(p->inv-p->Bsold)*(p->Sprice-p->Pprice);
           p->left=p->inv-p->Bsold;
           head=p;
       }
       else
       {
           printf("==============请输入%d个货物信息===============\n",i);
           s=(struct goods*)malloc(sizeof(struct goods));
           printf("编号:");
           scanf("%s",s->number);
           printf("名称:");
           scanf("%s",s->name);
           printf("进货价:");
           scanf("%f",&s->Pprice);
           printf("销售价:");
           scanf("%f",&s->Sprice);
           printf("产地:");
           scanf("%s",s->ori);
           printf("生产日期(年 月 日):");
           scanf("%d %d %d",&s->Pdate.year,&s->Pdate.month,&s->Pdate.day);
           printf("保质期(月):");
           scanf("%d",&s->Slife);
           printf("库存量:");
           scanf("%d",&s->inv);
           printf("已销售数量:");
           scanf("%d",&s->Bsold);
           s->income=(s->inv-s->Bsold)*(s->Sprice-s->Pprice);
           s->left=s->inv-s->Bsold;
           p->next=s;
           p=s;
       }

    }
    s->next=Null;
    return head;
}
/*
函数功能:从文件读取货物信息
函数入口参数:空
函数返回值:结构体指针
*/
struct goods*open(void)
{
    struct goods *head,*p,*s;
    int i,n;

    printf("将信息按:'编号 名称 进货价 销售价 产地 生产日期 保质期库存量 已销售数量'输入\n");
    printf("\n");
    printf("请问有多少个货物信息需要输入?\n");
    scanf("%d",&n);
    getchar();                 /*吸收输入n时的回车*/

    char ad[]="D:\\goods.txt";
    FILE * fp;
    while((fp=fopen(ad,"r+"))==NULL)
    {
        printf("没有找到输入的文件请重新输入文件名及其所在地址:\n");
        gets(ad);
    }

    for(i=1;i<=n;i++)
    {
        if(i==1)
       {
           p=(struct goods*)malloc(sizeof(struct goods));
           fscanf(fp,"%s %s %f %f %s %d %d %d %d %d %d",p->number,p->name,&p->Pprice,&p->Sprice,p->ori,&p->Pdate.year,&p->Pdate.month,&p->Pdate.day,&p->Slife,&p->inv,&p->Bsold);
           p->income=(p->inv-p->Bsold)*(p->Sprice-p->Pprice);
           p->left=p->inv-p->Bsold;
           head=p;
       }
       else
       {
           s=(struct goods*)malloc(sizeof(struct goods));
           fscanf(fp,"%s %s %f %f %s %d %d %d %d %d %d",s->number,s->name,&s->Pprice,&s->Sprice,s->ori,&s->Pdate.year,&s->Pdate.month,&s->Pdate.day,&s->Slife,&s->inv,&s->Bsold);
           s->income=(s->inv-s->Bsold)*(s->Sprice-s->Pprice);
           s->left=s->inv-s->Bsold;
           p->next=s;
           p=s;
       }
    }
    s->next=Null;
    fclose(fp);
    return head;
}
/*
函数功能:增加一条货物信息
函数入口参数:结构体指针
函数返回值:空
*/
void add(struct goods*head)
{
    struct goods*p,*pi,*pl;
    char num[20];
    printf("请问要在哪个货物后面添加记录(输入货物编号):\n");
    scanf("%s",num);
    pi=(struct goods *)malloc(sizeof(struct goods));
    p=pl=head;
    while((strcmp(pl->number,num)!=0)&&(pl->next!=Null))
    {
        pl=pl->next;
    }
    if(strcmp(pl->number,num)==0)
    {
        printf("========请输入新货物的信息===========\n");
        printf("编号:");
        scanf("%s",pi->number);
        printf("名称:");
        scanf("%s",pi->name);
        printf("进货价:");
        scanf("%f",&pi->Pprice);
        printf("销售价:");
        scanf("%f",&pi->Sprice);
        printf("产地:");
        scanf("%s",pi->ori);
        printf("生产日期(年 月 日):");
        scanf("%d %d %d",&pi->Pdate.year,&pi->Pdate.month,&pi->Pdate.day);
        printf("保质期(月):");
        scanf("%d",&pi->Slife);
        printf("库存量:");
        scanf("%d",&pi->inv);
        printf("已销售数量:");
        scanf("%d",&pi->Bsold);
        pi->income=(pi->inv-pi->Bsold)*(pi->Sprice-pi->Pprice);
        pi->left=pi->inv-pi->Bsold;
        if(head=Null)
        {
            head=pi;
            pi->next=Null;
        }
        else
        {
            while((strcmp(p->number,num)!=0)&&(p->next!=Null))
                  {
                      p=p->next;
                  }
           if(p->next!=Null)
           {
               pi->next=p->next;
               p->next=pi;
           }
           else
           {
               p->next=pi;
               pi->next=Null;
           }
        }
    }
    else
        printf("没有找到相应的货物信息记录,请重试!\n");

}
/*
函数功能:删除一条货物信息
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*delete(struct goods*head)
{
    struct goods*p,*q;
    char num[20];
    p=head;

    printf("请输入要删除货物的编号:\n");
    scanf("%s",num);
    if(head==Null)
    {
        printf("没有要删除的货物信息!\n");
        return head;
    }
    while((strcmp(p->number,num)!=0)&&(p->next!=Null))
    {
        q=p;
        p=p->next;
    }
    if(strcmp(p->number,num)==0)
    {
        if(p==head)
            head=p->next;
        else
            q->next=p->next;
        free(p);
    }
    else
        printf("没有找到相应货物信息,请重试!\n");
    return head;
}
/*
函数功能:修改一条货物信息
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*amend(struct goods*head)
{
    struct goods*p,*q;
    int flag=0;
    char num[20];
    p=head;

    printf("请输入要修改货物的编号:\n");
    scanf("%s",num);
    if(head==Null)
    {
        printf("没有要修改的货物信息!\n");
        return head;
    }
    while(p!=Null)
    {
        if(strcmp(p->number,num)==0)
        {
           flag=1;
           printf("============请输入新的货物信息==========\n");
           printf("编号:");
           scanf("%s",p->number);
           printf("名称:");
           scanf("%s",p->name);
           printf("进货价:");
           scanf("%f",&p->Pprice);
           printf("销售价:");
           scanf("%f",&p->Sprice);
           printf("产地:");
           scanf("%s",p->ori);
           printf("生产日期(年 月 日):");
           scanf("%d %d %d",&p->Pdate.year,&p->Pdate.month,&p->Pdate.day);
           printf("保质期(月):");
           scanf("%d",&p->Slife);
           printf("库存量:");
           scanf("%d",&p->inv);
           printf("已销售数量:");
           scanf("%d",&p->Bsold);
          p->income=(p->inv-p->Bsold)*(p->Sprice-p->Pprice);
          p->left=p->inv-p->Bsold;
        }
        p=p->next;
    }
    if(flag==0)
        printf("没有找到要修改的货物信息,请重试!\n");
    return head;
}
/*
函数功能:查看所有货物信息记录
函数入口参数:结构体指针
函数返回值:无
*/
void print(struct goods*head)
{
    struct goods*p;
    p=head;
    printf("==========================货物信息========================================\n");
    printf("编号 名称 进货价 销售价 产地 生产日期 保质期 库存量 已销售数量 剩余量 收益\n");
    while(p!=Null)
    {
        printf("%s %s %.2f %.2f %s %d %d %d %d %d %d %d %.2f\n",p->number,p->name,p->Pprice,p->Sprice,p->ori,p->Pdate.year,p->Pdate.month,p->Pdate.day,p->Slife,p->inv,p->Bsold,p->left,p->income);
        p=p->next;
    }
}
/*
函数功能:按编号查找一条货物信息
函数入口参数:结构体指针
函数返回值:无
*/
void find(struct goods*head)
{
    struct goods*p;
    char num[20];
    int flag=0;
    p=head;

    printf("请输入要查找货物的编号:\n");
    scanf("%s",num);
    while(p!=Null)
    {
        if(strcmp(p->number,num)==0)
        {
            flag=1;
            printf("==============================货物信息====================================\n");
            printf("\n");
            printf("编号 名称 进货价 销售价 产地 生产日期 保质期 库存量 已销售数量 剩余量 收益\n");
            printf("%s %s %.2f %.2f %s %d %d %d %d %d %d %d %.2f",p->number,p->name,p->Pprice,p->Sprice,p->ori,p->Pdate.year,p->Pdate.month,p->Pdate.day,p->Slife,p->inv,p->Bsold,p->left,p->income);
        }
         p=p->next;
    }
    if(flag==0)
    printf("没有找到该编号的货物信息,请重试!\n");
}

/*
函数功能:统计全仓库各种货物库存总数、已销售数量和剩余总数
函数入口参数:结构体指针
函数返回值:无
*/
void statistics(struct goods*head)
{
    struct goods*p;
    int sum1=0,sum2=0,sum3=0;
    p=head;
    printf("======全仓库各种货物库统计======\n");
    printf("\n");
    printf("库存总数  已销售数量  剩余总数\n");
    while(p!=Null)
    {
        sum1=sum1+p->inv;
        sum2=sum2+p->Bsold;
        sum3=sum3+p->left;
        p=p->next;
    }
    printf("%d %d %d\n",sum1,sum2,sum3);
}
/*
函数功能:显示差10天过期的货物信息
函数入口参数:结构体指针
函数返回值:无
*/
struct goods*search(struct goods*head)
{
    int flag=0;
    struct goods*p,*q;
    p=head,q=head;
    int y,m,d;
    struct tm *t;
    time_t tt;
    time(&tt);
    t=localtime(&tt);
    printf("当前时间为%d年%d月%d日\n",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
    y=t->tm_year+1900;
    m=t->tm_mon+1;
    d=t->tm_mday;
    while(p!=Null)
    {
        p->tim=(p->Pdate.year*365+p->Pdate.month*30+p->Pdate.day+p->Slife*30)-(y*365+m*30+d);
        if(p->tim==10)
            flag=1;
        p=p->next;
    }
    if(flag==0)
        printf("货物中没有找到指定差10天过期的货物信息");
    else
    {
        printf("===============================货物信息===========================================\n");
        printf("编号 名称 进货价 销售价 产地 生产日期 保质期 过期日期 库存量 已销售数量 剩余量 收益\n");
        while(q!=Null)
        {
           if(q->tim==10)
           {
               printf("%s %s %.2f %.2f %s %d %d %d %d %d %d %d %d %.2f\n",q->number,q->name,q->Pprice,q->Sprice,q->ori,q->Pdate.year,q->Pdate.month,q->Pdate.day,q->Slife,q->tim,q->inv,q->Bsold,q->left,q->income);
               }
        q=q->next;
        }
        }

    return head;

}
/*
函数功能:增加促销信息
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*incr1(struct goods*head)
{
    int flag=0;
    struct goods*p;
    p=head;
    while(p!=Null)
    {
        if(p->tim==10)
           {
               flag=1;
               p->Sprice=p->Sprice/2;
           }
        p=p->next;
    }
    if(flag==0)
        printf("没有找到指定差10天过期的物品,请重试!\n");
    else
        printf("已将指定差10天过期的物品以半价出售!");
    return head;

};

/*
函数功能:增加补货信息
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*incr2(struct goods*head)
{

    int flag=0,add;
    struct goods*q;
    q=head;
    while(q!=Null)
    {
        if(q->left<100)
           {
                printf("======================货物信息=============================\n");
                printf("编号 名称 进货价 销售价 产地 库存量 已销售数量 剩余量 收益\n");
                printf("%s %s %.2f %.2f %s %d %d %d %.2f\n",q->number,q->name,q->Pprice,q->Sprice,q->ori,q->inv,q->Bsold,q->left,q->income);
                printf("请输入该货物需要补货的量\n");
                scanf("%d",&add);
                q->inv=q->inv+add;
                q->income=(q->inv-q->Bsold)*(q->Sprice-q->Pprice);
                q->left=q->inv-q->Bsold;
                flag=1;
                }
        q=q->next;
    }
    if(flag==0)
         printf("没有找到剩余量少于100的货物信息\n");
    return head;

};
/*
函数功能:按照货物编号
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*sort1(struct goods*head)
{
    struct goods*p,*p1,*p2,*p3;
    struct goods h, t;
    if (head == Null)
        return Null;
    h.next=head;
    p=&h; //使用头结点,避免特殊情况的处理,因为代价太高
    while (p->next!=Null)
    {
        p=p->next;
    }
    p=p->next=&t; //!!!链表的尾节点可能被交换到链表中间去,这里使用了一个固定的节点
    while (p!=h.next)
    {
        p3=&h;
        p1=p3->next;
        p2=p1->next;
        while (p2!=p) //p指向的是已就序的节点
        {
            if (strcmp(p1->number,p2->number)>0)
            {//避免在双层循环内进行特殊情况的判断,因为这里的时间复杂度是O(n^2)
                p1->next=p2->next;
                p2->next=p1;
                p3->next=p2;

                p3=p2; //由于加了表头和表尾,整个交换过程更简洁
                p2=p1->next;

            } else {
                p3=p1;
                p1=p2;
                p2=p2->next;
            }
        }
        p=p1;
    }
    while (p->next!=&t)
    {
        p=p->next;  //虽然这里复杂度是O(n),但是远比在双层循环内的特殊处理要高效的多
    }
    p->next=Null;
    return h.next;

};
/*
函数功能:按照货物名称
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*sort2(struct goods*head)
{
    struct goods*p,*p1,*p2,*p3;
    struct goods h, t;
    if (head == Null)
        return Null;
    h.next=head;
    p=&h; //使用头结点,避免特殊情况的处理,因为代价太高
    while (p->next!=Null)
    {
        p=p->next;
    }
    p=p->next=&t; //!!!链表的尾节点可能被交换到链表中间去,这里使用了一个固定的节点
    while (p!=h.next)
    {
        p3=&h;
        p1=p3->next;
        p2=p1->next;
        while (p2!=p) //p指向的是已就序的节点
        {
            if (strcmp(p1->name,p2->name)>0)
            {//避免在双层循环内进行特殊情况的判断,因为这里的时间复杂度是O(n^2)
                p1->next=p2->next;
                p2->next=p1;
                p3->next=p2;

                p3=p2; //由于加了表头和表尾,整个交换过程更简洁
                p2=p1->next;

            } else {
                p3=p1;
                p1=p2;
                p2=p2->next;
            }
        }
        p=p1;
    }
    while (p->next!=&t)
    {
        p=p->next;  //虽然这里复杂度是O(n),但是远比在双层循环内的特殊处理要高效的多
    }
    p->next=Null;
    return h.next;

};
/*
函数功能:按照货物剩余总数
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*sort3(struct goods*head)
{
    struct goods*p,*p1,*p2,*p3;
    struct goods h, t;
    if (head == Null)
        return Null;
    h.next=head;
    p=&h; //使用头结点,避免特殊情况的处理,因为代价太高
    while (p->next!=Null)
    {
        p=p->next;
    }
    p=p->next=&t; //!!!链表的尾节点可能被交换到链表中间去,这里使用了一个固定的节点
    while (p!=h.next)
    {
        p3=&h;
        p1=p3->next;
        p2=p1->next;
        while (p2!=p) //p指向的是已就序的节点
        {
            if ((p1->left)>(p2->left))
            {//避免在双层循环内进行特殊情况的判断,因为这里的时间复杂度是O(n^2)
                p1->next=p2->next;
                p2->next=p1;
                p3->next=p2;

                p3=p2; //由于加了表头和表尾,整个交换过程更简洁
                p2=p1->next;

            } else {
                p3=p1;
                p1=p2;
                p2=p2->next;
            }
        }
        p=p1;
    }
    while (p->next!=&t)
    {
        p=p->next;  //虽然这里复杂度是O(n),但是远比在双层循环内的特殊处理要高效的多
    }
    p->next=Null;
    return h.next;

};
/*
函数功能:按照保质期截至日前排序
函数入口参数:结构体指针
函数返回值:结构体指针
*/
struct goods*sort4(struct goods*head)
{
    struct goods*p,*p1,*p2,*p3;
    struct goods h, t;
    if (head == Null)
        return Null;
    h.next=head;
    p=&h; //使用头结点,避免特殊情况的处理,因为代价太高
    while (p->next!=Null)
    {
        p=p->next;
    }
    p=p->next=&t; //!!!链表的尾节点可能被交换到链表中间去,这里使用了一个固定的节点
    while (p!=h.next)
    {
        p3=&h;
        p1=p3->next;
        p2=p1->next;
        while (p2!=p) //p指向的是已就序的节点
        {
            if ((p1->tim)>(p2->tim))
            {//避免在双层循环内进行特殊情况的判断,因为这里的时间复杂度是O(n^2)
                p1->next=p2->next;
                p2->next=p1;
                p3->next=p2;

                p3=p2; //由于加了表头和表尾,整个交换过程更简洁
                p2=p1->next;

            } else {
                p3=p1;
                p1=p2;
                p2=p2->next;
            }
        }
        p=p1;
    }
    while (p->next!=&t)
    {
        p=p->next;  //虽然这里复杂度是O(n),但是远比在双层循环内的特殊处理要高效的多
    }
    p->next=Null;
    return h.next;
};


/*
函数功能:将数据从缓冲区存储到硬盘文件中
函数入口参数:结构体指针
函数返回值:无
*/
void list1(struct goods*head)
{
    char ad[]="D:\\goods.txt";;
    FILE * fp;
    struct goods*p;

    p=head;
    fp=fopen(ad,"w+");
    fprintf(fp,"==============================货物信息=====================================\n");
    fprintf(fp,"编号 名称 进货价 销售价 产地 生产日期 保质期 库存量 已销售数量 剩余量 收益\n");
    while(p!=Null)
    {
        fprintf(fp,"%s %s %.2f %.2f %s %d %d %d %d %d %d %d %.2f\n",p->number,p->name,p->Pprice,p->Sprice,p->ori,p->Pdate.year,p->Pdate.month,p->Pdate.day,p->Slife,p->inv,p->Bsold,p->left,p->income);
        p=p->next;
    }
    fclose(fp);
}
/*
函数功能:将数据从缓冲区存储到硬盘文件中
函数入口参数:结构体指针
函数返回值:无
*/
void list2(struct goods*head)
{
    char ad[]="D:\\goods.txt";
    FILE * fp;
    struct goods*p;

    p=head;
    fp=fopen(ad,"w+");
    fprintf(fp,"===============================货物信息============================================\n");
    fprintf(fp,"编号 名称 进货价 销售价 产地 生产日期 保质期 过期日期 库存量 已销售数量 剩余量 收益\n");
    while(p!=Null)
    {
        fprintf(fp,"%s %s %.2f %.2f %s %d %d %d %d %d %d %d %d %.2f\n",p->number,p->name,p->Pprice,p->Sprice,p->ori,p->Pdate.year,p->Pdate.month,p->Pdate.day,p->Slife,p->tim,p->inv,p->Bsold,p->left,p->income);
        p=p->next;
    }
    fclose(fp);
}
posted @ 2013-11-04 08:42  乱七八糟 。  阅读(317)  评论(0编辑  收藏  举报