药店药品信息管理系统

用链表实现药店药品信息管理系统

#include <stdio.h>
#include <stdlib.h>
# include <string.h>
struct medicine{int number;int in_prince;int out_price;struct medicine *next;int amount;char name[100];char factory[100];int year;int month;int day;int bzyear;int bzmonth;}; /*结构体*/ 

void m1(void);   /*打开文件,建立一个链表并储存到文件,文件指针回到头,关闭文件,释放之前的链表*/
void m2(void);   /*打开文件,从文件中读取,关闭文件 删除节点,用覆盖的方式打开文件,链表到文件,删除旧连表,关闭文件,打开文件,读取新链表,遍历新链表*/ 
void m3(void);   //修改 
void m4 (void);    //销售 
void m5(void);   //查询 
void m6(void);    //统计 
void m7(void);     //增加 
void list(struct medicine *head);    /*输出链表中的所有节点*/
struct medicine *medfile_put(FILE *medfile);  //1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭 
void lianbiaointofile(struct medicine *head,FILE *medfile); //1链表到文件 2释放旧的链表 3文件指针回头 4没有文件的打开和关闭 
void lianbiaointofile111(struct medicine *head,FILE *medfile); //1链表到文件 3文件指针回头 4没有文件的打开和关闭 ,不释放 !!!!!!!!!!为了另外储存一份初始的数据以便于求出销售了多少 
struct medicine* del(struct medicine* head, int number);   /*只是删除了结点*/ 
void sflianbiao(struct medicine *head);   //释放链表 

void h1 (void); 
void h2 (void) ;   //按药品名称查询 
void z1(void) ;  //按药品名称精准查询 
void z2(void) ;  //按药品名称模糊查询 
void h3 (void);   //按药品厂家精准查询 
int main()
{      
    int x=1;
    while(x!=0)
    {
        int n;
        printf("\n\n\n");
        printf("\t--------------------------------------------------------------\n");
        printf("\t*                  欢迎来到药店药品信息管理系统                   *\n");
        printf("\t                       请选择您接下来的服务                    \n"); 
        printf("\t--------------------------------------------------------------\n");
        printf("\t                        1.创建药品信息\n");
        printf("\t                        2.删除药品信息\n");
        printf("\t                        3.修改药品信息\n");
        printf("\t                        4.销售药品信息\n");
        printf("\t                        5.查询药品信息\n");
        printf("\t                        6.统计药品信息\n");
        printf("\t                        7.添加药品信息\n");
        printf("\t                        0.    结束     \n"); 
        printf("\t                  请输入数字来选择您想要的功能:");
        scanf("%d",&x);
        printf("\n\n\n");
        switch(x)
        {
            case 0:   return 0; break;
            case 1:    m1()    ;break;
            case 2:    m2()    ;break;
            case 3:    m3()    ;break;
            case 4:    m4()    ;break;
            case 5:    m5()    ;break;
            case 6:    m6()    ;break;
            case 7:    m7()    ;break;
            default:printf("按键错误,请重新选择!\n");break;
        }
    }
    return 0;
}


void m1(void)   /*打开文件,建立一个链表并储存到文件,文件指针回到头,关闭文件,释放之前的链表        存了两份一份不动*/ 
{ 

  FILE *medfile;
  FILE *medfile1;
  struct medicine *head=NULL;
  int n_judg; 
  struct medicine *p0,*p1,*p2;
  
  printf("您是否想输入药品信息?按1继续输入,按0结束输入:");
  scanf("%d",&n_judg);
  while(n_judg==1)
  {
    p0=(struct medicine*)malloc(sizeof(struct medicine));
    p0->next=NULL; 
    printf("输入药瓶编号:");      scanf("%d",&p0->number); 
    printf("输入进价:");          scanf("%d",&p0->in_prince);
    printf("输入售价:");          scanf("%d",&p0->out_price);
    printf("输入药品数量");       scanf("%d",&p0->amount) ;
    printf("输入药品名称");       scanf("%s",p0->name);
    printf("输入药品厂家");       scanf("%s",p0->factory);
    printf("输入生产年份");       scanf("%d",&p0->year);
    printf("输入生产月份");       scanf("%d",&p0->month);
    printf("输入生产日");       scanf("%d",&p0->day);
    printf("输入保质年份");       scanf("%d",&p0->bzyear);
    printf("输入保质月份");       scanf("%d",&p0->bzmonth);
    getchar();
    if(head==NULL) head=p0;
    else 
    {
      p1=head;
      while((p0->number>p1->number)&&(p1->next!=NULL))
      {p2=p1;p1=p1->next;}
      if(p0->number<=p1->number)
      {
          if(head==p1) head=p0;
          else p2->next=p0;
          p0->next=p1;
      }
      else p1->next=p0;
    }   
    printf("您是否想继续输入药品信息?按1继续输入,按0结束输入:");
    scanf("%d",&n_judg); 
  }
  
  medfile1=fopen("D:\\MEDFILE1.dat","w+");
  lianbiaointofile111(head,medfile1);
  fclose(medfile1);
  
  
  medfile=fopen("D:\\MEDFILE.dat","w+");
  lianbiaointofile(head,medfile);//1链表到文件 2释放旧的链表 3文件指针回头 4没有文件的打开和关闭    lianbiaointowenjian没有错!!!!! 
  fclose(medfile);
  
  medfile=fopen("D:\\MEDFILE.dat","r+"); 
  head=medfile_put(medfile);//1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭 
  fclose(medfile);
  
  
  list(head);   
  
}

void m2(void)
{
   int x=1; 
   while(x==1)
   {
        FILE *medfile;
        int number;
        struct medicine *head=NULL;
    
        medfile=fopen("D:\\MEDFILE.dat","r+"); 
        head=medfile_put(medfile);//1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭 
        fclose(medfile); 
    
        printf("\t请输入要删除的药品的编号:");
        scanf("%d",&number);
        head=del(head,number); 
    
        fopen("D:\\MEDFILE.dat","w+");
        lianbiaointofile(head,medfile);//链表到文件 ,并回到头 
        fclose(medfile);
    
        medfile=fopen("D:\\MEDFILE.dat","r+"); 
        head=medfile_put(medfile);
        fclose(medfile);
        list(head);
        
        sflianbiao(head); 
        
        printf("是否想要继续删除?按1继续,按0退出");
        scanf("%d",&x); 
   }
}

void m3(void)
{
    int x=1;
    while(x==1)
    {
        FILE* medfile; 
        struct medicine *head=NULL;
        int bianhao;  /*想要修改的编号*/
        medfile=fopen("D:\\MEDFILE.dat","r+");
        head=medfile_put(medfile);//文件到链表  
        fclose(medfile);  /*因为有rewind所以指回了开头*/ 
        struct medicine* p=head;/*下面用p操作*/
        
        printf("请输入您想要修改药品的编号:");
        scanf("%d",&bianhao);
        while((p->number!=bianhao)&&(p!=NULL))
        {
            p=p->next;
        }
        if (p->number!=bianhao)
        printf("该药品编号不存在!");  
        if (p->number==bianhao)
        {
            printf("请输入新的进价:");        scanf("%d",&p->in_prince);           
            printf("请输入新的售价:");        scanf("%d",&p->out_price);           
            printf("请输入新的药品数量:");    scanf("%d",&p->amount);            
            printf("请输入新的药品名称:");    scanf("%s",p->name);           
            printf("请输入新的药品厂家:");    scanf("%s",p->factory);            
            printf("输入新的生产年份");       scanf("%d",&p->year);
            printf("输入新的生产月份");       scanf("%d",&p->month);
            printf("输入新的生产日");         scanf("%d",&p->day);
            printf("输入新的保质年份");       scanf("%d",&p->bzyear);
            printf("输入新的保质月份");       scanf("%d",&p->bzmonth);
        } 
        medfile=fopen("D:\\MEDFILE.dat","w+");
        lianbiaointofile(head,medfile);//链表到文件 释放旧链表 
        fclose(medfile);
        medfile=fopen("D:\\MEDFILE.dat","r+");
        head=medfile_put(medfile);  //1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭 
        list(head);
        fclose(medfile);
        printf("您是否想继续修改?按1继续,按0退出");
        scanf("%d",&x);
    }
    
}

void m4(void)
{
    int x=1;
    while(x==1)
    {
        int n;
        FILE *medfile;
        int bianhao;
        struct medicine *head=NULL;
    
        medfile=fopen("D:\\MEDFILE.dat","r+"); 
        head=medfile_put(medfile);//1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭 
        fclose(medfile); 
    
        printf("\t请输入要销售的药品的编号:");
        scanf("%d",&bianhao);
        struct medicine* p=head;/*下面用p操作*/
        while((p->number!=bianhao)&&(p!=NULL))
        {
            p=p->next;
        }
        if (p->number!=bianhao)
        printf("该药品编号不存在!");  
        if (p->number==bianhao)
        {
            printf("请输入您要销售药品的数量:");
            scanf("%d",&n);
            int flag=0;
            while(flag==0)
            {
                if(n>p->amount)
                {   
                   printf("您输入的药品数量已超过库存,请重新输入") ;
                   flag=0;
                   scanf("%d",&n);
                } 
                if (n<=p->amount)
                {
                    flag=1;
                    printf("销售成功!");
                    p->amount=p->amount-n;
                    printf("%d",p->amount);
                }
            }
        } 
    
        fopen("D:\\MEDFILE.dat","w+");
        lianbiaointofile(head,medfile);   //链表到文件 ,并回到头 
        fclose(medfile);
    
        medfile=fopen("D:\\MEDFILE.dat","r+"); 
        head=medfile_put(medfile);
        fclose(medfile);
    
        list(head);
        sflianbiao(head); 
        
        printf("您是否想继续销售?按1继续,按0退出");
        scanf("%d",&x);
    }
}

void m5(void)
{
    int x=1;
    while(x==1)
    {
        printf("\t    1.按药品编号\n");
        printf("\t    2.按药品名称\n");
        printf("\t    3.按药品厂家\n");
        int n;
        printf("\t请输入您想按照什么方式进行查询:");   scanf("%d",&n);
    
        switch(n)
        {
            case 1:  h1();  break;
            case 2:  h2();  break;
            case 3:  h3();  break;
            default:printf("按键错误\n");break;
        }
        printf("您是否想继续查询?按1继续查询,按0退出:");
        scanf("%d",&x);
    }
}

void m6(void)
{
    int x=1;
    while(x==1)
    {
        FILE *medfile;
        FILE *medfile1;
        struct medicine *head=NULL;
        struct medicine *head1=NULL;
    
        medfile=fopen("D:\\MEDFILE.dat","r+"); 
        head=medfile_put(medfile);//1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭 
        fclose(medfile); 
    
        medfile1=fopen("D:\\MEDFILE1.dat","r+"); 
        head1=medfile_put(medfile1);//1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭
        fclose(medfile1); 
    
    
        struct medicine* p=head;/*下面用p操作*/
        struct medicine* p2=head;/*下面用p2操作*/
        struct medicine* p3=head;/*下面用p3操作*/
    
        struct medicine* p1=head1;/*下面用p1操作*/
    
        while (p!=NULL)
        {
            int kk=p1->amount-p->amount;      //   销售量 
            int ww=kk*(p->in_prince-p->out_price);                         //成交额 
            printf("%d号药品的销售量是%d  成交额是%d\n\n\n",p->number,kk,ww);
            p=p->next;
        }
    
        while (p2!=NULL)
        {
            if(p2->amount<20)
            printf("库存警告!%d号药品存货量小于20,请及时补货\n\n\n",p2->number) ;
            p2=p2->next;
        }
    
        while(p3!=NULL)
        {
            if (p3->year==p3->bzyear)   //在同一年
            {
                if(p3->year-p3->bzyear<3)
                printf("警告! %d号药品即将过期!\n\n\n",p3->number); 
            } 
            if (p3->year!=p3->bzyear)      //相差一年 
            {
                if (p3->year-p3->bzyear==1)
                {
                    if (p3->bzmonth-p3->month>9)
                    printf("警告! %d号药品即将过期!\n\n\n",p3->number);
                }
            }
        p3=p3->next;
        }
        printf("您是否想重新统计?按1重新统计,按0退出:");
        scanf("%d",&x);
    }
}

void m7(void)
{
  int x=1;
  while(x==1)
  {
     FILE *medfile;
     struct medicine *head=NULL;
     medfile=fopen("D:\\MEDFILE.dat","r+"); 
     head=medfile_put(medfile);//1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭 
     fclose(medfile);
     struct medicine *p0,*p1,*p2;
     p0=(struct medicine*)malloc(sizeof(struct medicine));
     p0->next=NULL; 
     printf("输入药瓶编号:");      scanf("%d",&p0->number); 
     printf("输入进价:");          scanf("%d",&p0->in_prince);
     printf("输入售价:");          scanf("%d",&p0->out_price);
     printf("输入药品数量:");    scanf("%d",&p0->amount);
     printf("输入药品名称:");    scanf("%s",p0->name);
     printf("输入药品厂家:");    scanf("%s",p0->factory);
     printf("输入生产年份");       scanf("%d",&p0->year);
     printf("输入生产月份");       scanf("%d",&p0->month);
     printf("输入生产日");         scanf("%d",&p0->day);
     printf("输入保质年份");       scanf("%d",&p0->bzyear);
     printf("输入保质月份");       scanf("%d",&p0->bzmonth);
     getchar();
     if(head==NULL) head=p0;
     else 
     {
        p1=head;
        while((p0->number>p1->number)&&(p1->next!=NULL))
        {p2=p1;p1=p1->next;}
        if(p0->number<=p1->number)
        {
          if(head==p1) head=p0;
          else p2->next=p0;
          p0->next=p1;
        }
        else p1->next=p0;
     }  
     medfile=fopen("D:\\MEDFILE.dat","w+");
     lianbiaointofile(head,medfile);//1链表到文件 2释放旧的链表 3文件指针回头 4没有文件的打开和关闭 
     fclose(medfile);
  
     medfile=fopen("D:\\MEDFILE.dat","r+"); 
     head=medfile_put(medfile);
     fclose(medfile);
     list(head);
     sflianbiao(head); 
     
     printf("您是否想继续添加药品信息?按1继续,按0退出:");
     scanf("%d",&x); 
   }
}

void h1 (void)    //按药品编号查询 
{
    int y=1;
    while (y==1)
    {
        FILE *medfile;
        int bianhao;
        struct medicine *head=NULL;
    
        medfile=fopen("D:\\MEDFILE.dat","r+"); 
    
        head=medfile_put(medfile);//1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭 
    
        fclose(medfile); 
        struct medicine* p=head;/*下面用p操作*/
        printf("请输入您要查询药品的编号:") ;
        scanf("%d",&bianhao);
        while((p->number!=bianhao)&&(p!=NULL))
        {
            p=p->next;
        }
        if (p==NULL)
        printf("该药品编号不存在!");  
        if (p->number==bianhao)
        {
            printf("以检索到该药品:");
            printf("药品编号:%d 药品进价:%d 药品售价:%d 药品数量:%d 药品名称:%s 药品厂家:%s 生产年:%d 生产月:%d 生产日:%d 保质年:%d 保质月:%d",p->number,p->in_prince,p->out_price,p->amount,p->name,p->factory,p->year,p->month,p->day,p->bzyear,p->bzmonth);                                         
        } 
        printf("您是否想继续按照药品编号查询?按1继续,按0退出:");
        scanf("%d",&y); 
    }
}

void h2 (void)    //按药品名称查询 
{
    int s=1;
    while(s==1)
    {
        int m;
        printf("1精准查询"); 
        printf("2模糊查询"); 
        printf("请输入您要精准查询还是模糊查询:");
        scanf("%d",&m);
        switch(m)
        {
            case 1:  z1();break;
            case 2:  z2();break; 
            default:printf("按键错误\n");break;
        }
        printf("您是否想继续按照药品名称查询?按1继续,按0退出");
        scanf("%d",&s);
    }
}

void z1(void)        //按药品名称精准查询 
{
    char b[100];
    FILE *medfile;
    
    struct medicine *head=NULL;
    
    medfile=fopen("D:\\MEDFILE.dat","r+"); 
    
    head=medfile_put(medfile);//1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭 
    
    fclose(medfile); 
    struct medicine* p=head;/*下面用p操作*/
    
    printf("请输入您要精准查询的药品名称:");
    scanf("%s",b);
    
    while((strcmp(p->name,b)!=0)&&(p!=NULL))
    {
        p=p->next;
    }
    if (strcmp(p->name,b)!=0)
    printf("该药品编号不存在!");  
    if (strcmp(p->name,b)==0)
    {
        printf("以检索到该药品:");
        printf("药品编号:%d 药品进价:%d 药品售价:%d 药品数量:%d 药品名称:%s 药品厂家:%s 生产年:%d 生产月:%d 生产日:%d 保质年:%d 保质月:%d",p->number,p->in_prince,p->out_price,p->amount,p->name,p->factory,p->year,p->month,p->day,p->bzyear,p->bzmonth);
    } 
    
    
}

void z2(void)   //按药品名称模糊查询 
{
    char c[100];
    int flag;
    FILE *medfile;
    
    struct medicine *head=NULL;
    
    medfile=fopen("D:\\MEDFILE.dat","r+"); 
    
    head=medfile_put(medfile);//1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭 
    
    fclose(medfile); 
    struct medicine* p=head;/*下面用p操作*/
    
    printf("请输入模糊查询的药品名称:");
    scanf("%s",c);
    
    while(p!=NULL)
    {
        int flag=0;
        int i=0; 
        for (int t=0;c[t]!='\0';t++)
        {
            if(strchr (p->name,c[t])!=NULL)
            {
                i++;
            }
        }
        if(i>3)
        {
            printf("该药品名称已被检索到:");
            printf("药品编号:%d 药品进价:%d 药品售价:%d 药品数量:%d 药品名称:%s 药品厂家:%s 生产年:%d 生产月:%d 生产日:%d 保质年:%d 保质月:%d",p->number,p->in_prince,p->out_price,p->amount,p->name,p->factory,p->year,p->month,p->day,p->bzyear,p->bzmonth);
            flag=1;
            break;
        }
        p=p->next;
    }
    
    if (flag==0)
    printf("模糊查询未检测到该药品");


} 

void h3 (void)   //按药品厂家精准查询 
{
    int g=1;
    while(g==1)
    {
        char u[100];
        FILE *medfile;
    
        struct medicine *head=NULL;
    
        medfile=fopen("D:\\MEDFILE.dat","r+"); 
    
        head=medfile_put(medfile);//1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭 
    
        fclose(medfile); 
        struct medicine* p=head;/*下面用p操作*/
    
        printf("请输入您要精准查询的药品厂家:");
        scanf("%s",u);
      
        while((strcmp(p->factory,u)!=0)&&(p!=NULL))
        {
            p=p->next;
        }
        if (strcmp(p->factory,u)!=0)
        printf("该药品编号不存在!");  
        if (strcmp(p->factory,u)==0)
        {
            printf("以检索到该药品:");
            printf("药品编号:%d 药品进价:%d 药品售价:%d 药品数量:%d 药品名称:%s 药品厂家:%s 生产年:%d 生产月:%d 生产日:%d 保质年:%d 保质月:%d",p->number,p->in_prince,p->out_price,p->amount,p->name,p->factory,p->year,p->month,p->day,p->bzyear,p->bzmonth);
        } 
        printf("您是否想继续按照药品厂家精准查询?按1继续,按0退出:");
        scanf("%d",&g);
    }
}

void lianbiaointofile111(struct medicine *head,FILE *medfile) //1链表到文件 3文件指针回头 4没有文件的打开和关闭 ,不释放 
{
    struct medicine *p;
    p=head;
    while(p!=NULL)
    {
        fwrite(p,sizeof(struct medicine),1,medfile);        
        p=p->next;
    }
    rewind(medfile);
}

void list(struct medicine *head)    /*输出链表中的所有节点*/
{
    struct medicine *p;           /*存储*/
    if (head == NULL)
    printf("药品信息为不存在!\n");
    else
    {
        printf("药品信息如下:\n");
        p=head;               
        while (p != NULL)   /*循环的赋值然后输出*/
        {
            printf("编号:%d 进价:%d 售价:%d 库存数量:%d 名称:%s 厂家:%s 生产年:%d 生产月:%d 生产日:%d 保质年:%d 保质月:%d\n\n",p->number, p->in_prince, p->out_price,p->amount,p->name,p->factory,p->year,p->month,p->day,p->bzyear,p->bzmonth);
            p = p->next;
        }
    }
}

struct medicine *medfile_put(FILE *medfile)  //1文件内容到链表 2文件的指针回头 3函数返回新链表的头指针 4没有文件的打开和关闭   有问题!!!!!!!!! 
{
    struct medicine *p1=NULL,*p2=NULL,*head=NULL; 
    while(!feof(medfile))
    {
        p1=(struct medicine*)malloc(sizeof(struct medicine));
        fread(p1,sizeof(struct medicine),1,medfile);               
        if(head==NULL) head=p1;
        else p2->next=p1;
        p2=p1;
    }   
    p1->next=NULL; 
    rewind(medfile);        
    return(head);
}

void lianbiaointofile(struct medicine *head,FILE *medfile) //1链表到文件 2释放旧的链表 3文件指针回头 4没有文件的打开和关闭 
{
    struct medicine *p;
    p=head;
    while(p!=NULL)
    {
        fwrite(p,sizeof(struct medicine),1,medfile);        
        p=p->next;
    }
    sflianbiao(head);
    rewind(medfile);
}

struct medicine* del(struct medicine* head, int number)    /*只是删除了结点*/ 
{
    struct medicine* p1=NULL;
    struct medicine* p2=NULL;
    if (head == NULL)
        printf("链表为空无法进行删除!\n");
    else
    {
        p1 = head;
        while ((number != p1->number) && (p1->next != NULL))
        {
            p2 = p1;
            p1 = p1->next;
        }
        if (p1->number==number)
        {
            if (p1 == head)
                head = p1->next;
            else
                p2->next = p1->next;
            free(p1);
            printf("该节点已经删除\n");
        }
        else
            printf("链表中不存在该节点,无法删除!\n");
    }
    return head;
}

void sflianbiao(struct medicine *head)   //释放链表 
{
    struct medicine *p1=head,*p2 ;  
    while(p1!=NULL)
    {  p2=p1;
       p1=p1->next;
       free(p2);
    } 
} 

猜你喜欢

转载自www.cnblogs.com/panghushalu/p/12217182.html