该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#include"stdlib.h"
#include
#define G 1
enum function{ cold, stomach, anticatarrhals, gutta };
enum usage{koufu,waiyong,aftermeal,beforemeal};
typedef struct date_
{
int year, month, day;
}date;
typedef struct howuse_
{enum usage u;
int times;
int dosage;
}howuse;
typedef struct drug_
{
char name[20];//名称
char number[12];//编号
date product;//生产日期
int use;//有效期
date end;//失效日期
enum function f;//主治类别
howuse h;//用法与用量
struct drug_ * next;
}drug;
drug *head=NULL,*rear=NULL;
drug * search(char *num)
{
drug *p;
p=head;
while(p!=NULL&&strncmp(p->number,num,12)!=0)
{
p=p->next;
}
return p;
}
//根据编号寻找药品
bool isexist(date d)
{
bool flag=1;
if(d.day==0&&d.month==0&&d.year==0)
flag=0;
return flag;
}//判断失效日期是否存在
date add_(date d,int m)
{
int temp;
temp=m+(d.month);
if(temp>=12)
{
d.year++;
d.month=temp-12;
}
else d.month=temp;
return d;
}//日期和月份相加
bool compare(date d1,date d2)
{
bool flag=0;
if(d1.year>d2.year)flag=1;
else if(d1.year
else if(d1.month>d2.month)flag=1;
else if(d1.month
else if(d1.day>=d2.day)flag=1;
else flag=0;
return flag;
}
//比较两个日期大小
void cal_end()
{
char num[13];
date d3;
drug *d1;d1=(drug *)malloc(sizeof(struct drug_));
printf("请输入你想计算药品的编号:");
scanf("%s",num);
d1=search(num);
if(d1==NULL)
printf("无此药品");
if(isexist(d1->end))
printf("该药品的失效日期为:%d年%d月%d日\n",d1->end.year,d1->end.month,d1->end.day);
else {
d3=add_(d1->product,d1->use);
printf("该药品的失效日期为:%d年%d月%d日\n",d3.year,d3.month,d3.day);
free(d1);
}//计算失效日期
}
void add()
{
drug*p,*s;date d;float x;
p=(drug *)malloc(sizeof(struct drug_));
printf("请输入药品名称:");
scanf("%s",p->name);
printf("请输入编号:");
scanf("%s",p->number);
while(strlen(p->number)!=12)
{
printf("编号格式不对,请重新输入:");
scanf("%s",p->number);
}
while(head!=NULL)
{
s=search(p->number);
while(s!=p)
{
printf("该编号已经存在,请重新输入:");
scanf("%s",p->number);
}
}
L1: printf("请输入生产日期(年月日),没有请输入0:");
scanf("%d%d%d",&p->product.year,&p->product.month,&p->product.day);
if(p->product.year!=0)
{
while(p->product.month>12||p->product.month<1||p->product.day>30||p->product.month<0)
{
printf("日期格式不对,请检查后重新输入:");
scanf("%d%d%d",&p->product.year,&p->product.month,&p->product.day);
}
}
L2: printf("请输入有效期(没有请输入0):");
scanf("%f",&x);
while(fabs(x-(int)x)>1e-8)
{
printf("有效期非整数,请重新输入:");
scanf("%f",&x);
}
p->use=x;
printf("请输入失效日期(没有请输入0):");
scanf("%d%d%d",&p->end.year,&p->end.month,&p->end.day);
if(p->end.year!=0)
{
while(p->end.month>12||p->end.month<1||p->end.day>31||p->end.day<0)
{
printf("日期格式不对,请检查后重新输入:");
scanf("%d%d%d",&p->end.year,&p->end.month,&p->end.day);
}
}
if(isexist(p->product)&&p->use!=0&&isexist(p->end))
{
d=add_(p->product,p->use);
if(p->end.year!=d.year||p->end.month!=d.month||p->end.day!=d.day)
{
printf("生产日期有效期失效期矛盾:请检查后重新输入!");
goto L1;
}
}
if(isexist(p->product)&&p->use==0&&!isexist(p->end))
{
printf("信息缺失,请补充有效期或失效日期!");
goto L2;
}
if(!isexist(p->product)&&p->use!=0&&!isexist(p->end))
{
printf("信息缺失,请补充生产日期或失效日期");
goto L1;
}
if(!isexist(p->product)&&p->use==0&&!isexist(p->end))
{
printf("信息全部缺失,请补充!\n");
goto L1;
}
printf("请输入主治类别:1.感冒药 2.胃药 3.消炎药 4.滴眼液\n");
int a;
scanf("%d",&a);
switch(a)
{
case 1:p->f=cold;break;
case 2:p->f=stomach;break;
case 3:p->f=anticatarrhals;break;
case 4:p->f=gutta;break;
default:printf("输入错误!");break;
}
printf("请输入用法:1.口服,2.外用,3.饭前服用,4.饭后服用\n");
scanf("%d",&a);
switch(a)
{
case 1:p->h.u=koufu;break;
case 2:p->h.u=waiyong;break;
case 3:p->h.u=beforemeal;break;
case 4:p->h.u=aftermeal;break;
}
printf("请输入一日服用的次数:");
scanf("%d",&p->h.times);
printf("请输入一次服用的量(片/滴):");
scanf("%d",&p->h.dosage);
if(head==NULL)
{
head=p;
rear=p;
}
else {
rear->next=p;
rear=p;
}
p->next=NULL;
}
void print_(drug*p)
{
date d;
printf("**************************************\n");
printf("药品名称:%s\n",p->name);
printf("药品编号:%s\n",p->number);
if(isexist(p->product))
printf("生产日期:%d年%d月%d日\n",p->product.year,p->product.month,p->product.day);
else printf("生产日期暂无。\n");
if(p->use!=0)
printf("有效期为:%d个月\n",p->use);
else printf("有效期暂无\n");
if(isexist(p->end))
printf("失效日期:%d年%d月%d日\n",p->end.year,p->end.month,p->end.day);
else {
d=add_(p->product,p->use);
printf("该药品的失效日期为:%d年%d月%d日\n",d.year,d.month,d.day);
}
switch(p->f)
{
case 0:printf("主治类别:感冒药\n");break;
case 1:printf("主治类别:胃药\n");break;
case 2:printf("主治类别: 消炎药\n");break;
case 3:printf("主治类别:滴眼液\n");
}
switch(p->h.u)
{
case 0:printf("用法:口服\n");break;
case 1:printf("用法:外用\n");break;
case 2:printf("用法:饭前服用\n");break;
case 3:printf("用法:饭后服用\n");}
printf("一日次数:%d\n",p->h.times);
printf("每次的量:%d\n",p->h.dosage);
printf("**************************************");
}
//打印一种药品的所有信息
void print_end()
{
date d,d1,d2;
drug *q;q=head;
printf("请输入设定日期(年月日):");
scanf("%d%d%d",&d.year,&d.month,&d.day);
d1=add_(d,G);
if(isexist(q->end))
d2=q->end;
else d2=add_(q->product,q->use);
while(q!=NULL)
{
if(compare(d1,d2)&&!compare(d,d2))
{
print_(q);
q=q->next;}
}
}
void main()
{add();
print_end();
getchar();