c语言 课设之仓库管理/*
问题描述:
已知一工厂有5个仓库(仓库编号、仓库名称、负责人),用于保存公司生产的10个产品(产品编号、产品名称、产品规格),任何一种产品可以保存在该5个仓库中,编写一程序完成以下功能:
1)产品入库:从键盘输入仓库编号、产品编号,入库日期,入库数量。需要判断仓库编号是否存在、产品编号是否存在、入库日期格式是否合法(格式为:YYYY-MM-DD,如2009-01-02),入库数量是否大于0,入库日期格式是否合法(格式为:YYYY-MM-DD,如2009-01-02))
2)产品出库:从键盘输入仓库编号、产品编号、出库日期,出库数量,需要判断仓库编号是否存在、产品编号是否存在、入库日期格式是否合法(格式为:YYYY-MM-DD,如2009-01-02),入库数量是否大于0,是否小于当前该仓库的库存量,出库日期格式是否合法(格式为:YYYY-MM-DD,如2009-01-02))出入库时间必须通过调用系统时间获得。
3)查询指定仓库编号的入库记录
4)查询指定产品编号的入库记录
5)查询指定仓库编号的出库记录
6)查询指定产品编号的出库记录
7)所有数据符合实际应用要求
提示:
?定义一个日期结构体保存日期,具体信息为:年、月、日
?判断入库日期和出库日期的格式是否合法时,需要判断长度是否为10,第5位和第8位是否为’-’,字符,将1-4位表示的年份,6-7位表示的月份,9-10位表示的日期分别转换成整数。判断是否满足构成日期的条件闰年月份只能是1-12之间的数,如果是闰年,二月可以是29天否则不能大于28,1,3,5,7,8,10,12月可以是31天,其余只能小于等于30(建议写成函数)。
?定义一个结构体数组,保存5个仓库信息,具体为:仓库编号、仓库名称、负责人
?定义一个结构体数组,保存10个产品信息,具体为:产品编号、产品名称、产品规格。
?定义一个产品出库(入库)链表,保存产品的出库(入库)信息。具体为:仓库编号、产品编号,入库日期,入库数量,操作类型(为1 表示入库,为-1表示出库)
?产品入库时,需要查询仓库数组和产品数组,如果产品编号和仓库编号存在,则插入产品出库(入库)链表
?产品出库时,需要查询产品出库(入库)链表,查询产品编号、仓库编号的入库记录得到入库的数量(类型为1),查询产品编号、仓库编号的出库记录得到出库的数量(类型为-1),计算得到该产品在该仓库的库存量,如果出库数量小于库存量,插入产品出库(入库)链表,类型为-1。*/
#include
#include
#include
#include
#include
//#include
char filename[20]={"c:\\仓库物流信息.txt"};
//仓库信息结构体
typedef struct stoinfo
{
char stoNo[4];
char stoname[20];
char stopers[20];
}STORAGE;
//商品信息结构体
typedef struct gooinfo
{char gooNo[4];
char gooname[20];
char googuige[20];
}GOODS;
//库记录结构体
typedef struct kuinfo
{ char kustoNo[4];
char kugooNo[4];
char kudatinfo[10];
int kustan;
int kind;
struct kuinfo *next;
}KUINFO;
STORAGE stoINFO[5]={{"1","甲","贾一"},{"2","乙","贾二"},{"3","丙","贾三"},{"4","丁","贾四"},{"5"," 无","贾五"}};
GOODS gooINFO[10]={{"10","一","大"},{"11","二","大"},{"12","三","大"},{"13","四","大"},{"14","五","大"},
{"15","六","大"},{"16","七","大"},{"17","八","大"},{"18","九","大"},{"19","十","大"}};
char date[10],knock[4]={"0"};
void baocun(KUINFO *head);//保存出入库记录到文件
int check(char date[]);//判断日期是否符合要求
void c1(KUINFO *head);
void c2();
void c3();
void c4();
void c5();
void c6();
struct kuinfo *head;
int main()
{
int x;char n;
printf("\n\n\n\n\n\n\n\t\t=================================================\n\n");
printf("\t\t\t 欢迎使用仓库管理系统\n\n");getchar();
printf("\t\t\t是否进入仓库管理系统(Y-N).\n");
printf("\t\t\t输入操作代码.\n\t\t\t(仅输入n或N时退出):");
scanf("%c",&n);
printf("\t\t==================================================");
if(n=='n'||n=='N')
{printf("\n\n \t\t\t欢迎下次使用");return 0;}
printf("\n\t\t\t\t 质询方式:12345678\n");
printf("\t\t\t\t\t\t作者:伤心的石头");
getchar();
head=NULL;
do{system("cls");
printf("\n\n\n\t******************欢迎使用仓库管理系统************************ \n");
printf("\t\t* * * * * * * * * * *\n");
printf("\t\t1)\t产品入库:\n");
printf("\t\t2)\t产品出库:\n");
printf("\t\t3)\t查询指定仓库编号的入库记录:\n");
printf("\t\t4)\t查询指定产品编号的入库记录:\n");
printf("\t\t5)\t查询指定仓库编号的出库记录:\n");
printf("\t\t6)\t查询指定产品编号的出库记录:\n");
printf("\t\t0)\t退出\n");
printf("\t************************************************************** \n");
printf("\t\t\t\t说明:输入0终止当前操作返回菜单界面\n");
while(1)
{printf("输入合法操作代码<0-6>:");
rewind(stdin);
scanf("%d",&x);
if(x==0||x==1||x==2||x==3||x==4||x==5||x==6)
break;
}
switch(x)
{
case(1):
c1(head); break;
case(2):
c2(); break;
case 3:
c3(); break;
case 4:
c4(); break;
case 5:
c5(); break;
case 6:
c6(); break;
case 0:
break;
}
}while(x);
printf("操作完成");
return 0;
}
////////////////////////////////////////////////////////////////////////////////////1111
vo
id c1(KUINFO *head)
{
int i=0,j=0,k,r=0 ;char bo[20],co[20],d,date1[5],date2[5];KUINFO *p1,*q1;
q1=p1=(KUINFO *)malloc(sizeof(KUINFO));
while(1)
{printf("第%d次入库输入\n",r+1);
while(1)
{ j=0;
printf("输入仓库编号(1~5)");
rewind(stdin);
scanf("%s",bo);
if(strcmp(knock,bo)==0) return;
for(i=0;i<5;i++)
{
if(strcmp(stoINFO[i].stoNo,bo)==0) break;
if(i==4&&strcmp(stoINFO[4].stoNo,bo)!=0)
{printf("\n输入信息不合法"); j=1;break;}
}
if(j==0)
break;
}
while(1)
{ j=0;
printf("输入产品编号(10~19):");
rewind(stdin);
scanf("%s",co);
if(strcmp(knock,co)==0) return;
for(i=0;i<10;i++)
{
if(strcmp(gooINFO[i].gooNo,co)==0) break;
if(i==9&&strcmp(gooINFO[9].gooNo,co)!=0)
{printf("\n输入信息不合法"); j=1;break;}
}
if(j==0)
break;
}
while(1)
{ time_t t=time(0);
char tmp[64];int p;
strftime(tmp,sizeof(tmp),"%x %X %j %z",localtime(&t));
puts(tmp);
printf("输入合法入库时间(YYYY-MM-DD):");
rewind(stdin);
scanf("%s",date);
if(strcmp(date,knock)==0) return;
date1[0]='2';date1[1]='0';date1[2]=tmp[6];date1[3]=tmp[7];date1[4]='\0';
for(i=0;i<4;i++) date2[i]=date[i];date2[4]='\0';
if(p=check(date)&&strcmp(date1,date2)==0)
break;
}
while (1)
{printf("输入产品数量:");
scanf("%d",&k);
if(k==0) return;
if(k<0) printf("\n输入数据不合法");
else break;
}
r++;
/*将入库记录放在入库对应的记录链表中 定义两个指针 把输入四个数据赋值给链表kuinfo*/
strcpy(p1->kustoNo,bo);
strcpy(p1->kugooNo,co);
strcpy(p1->kudatinfo,date);
p1->kustan=k;
p1->kind=1;
//if(r==1)
head=p1;
//else q1->next=p1;
q1=p1;
p1=(KUINFO *)malloc(sizeof(KUINFO));
q1->next=NULL;
baocun(head);
printf("产品是否继续入库(Y-N)");
rewind(stdin);
scanf("%c",&d);
if(d=='n'||d=='N')
break;
}
printf("结束" );
system("pause");
}
/////////////////////////////////调用函数 判断月天数
int check(char date[])
{
int year,month,day,i,j;
if((date[5]-'0')>1)
return 0;
if((date[5]-'0')==1&&(date[6]-'0')>2)
return 0;
if((date[4]!='-')||(date[7]!='-')||strlen(date)!=10)
return 0;
for(i=0,year=0;i<4;i++) //字符串转化成整型
year=year*10+(date[i]-'0');
for(i=5,month=0;i<7;i++)
month=month*10+(date[i]-'0');
for(i=8,day=0;i<10;i++)
day=day*10+(date[i]-'0');
if(month<=0||month>12)
return 0;
else
{
j=(year%4==0&&year%100!=0||year%400==0); //闰年条件:等于1为闰年
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(day<0||day>31)
return 0;
else
return 1;
}
else if(month==4||month==6||month==9||month==11)
{
if(day<0||day>30)
return 0;
else
return 1;
}
else if(j==1&&month==2)
{
if(day<0||day>29)
return 0;
el
se
return 1;
}
else
{
if(day<0||day>28)
return 0;
else
return 1;
}
}
}
/* 通过链表 把记录放入到文件中 可调用函数*/
void baocun(KUINFO *head)
{FILE *fp;KUINFO *p1;
fp=fopen(filename,"a");
rewind(stdin);
p1=head;
while(p1!=NULL)
{p1->kind=1;
fprintf(fp," %s %s %s %d %d \n",p1->kustoNo,p1->kugooNo,p1->kudatinfo,p1->kustan,p1->kind);
p1=p1->next;
}
fclose(fp);
printf("\n记录已保存");
}
//*******************************************dsfszffsd************************************************2222
void c2()
{FILE *fp;
int i=0,j=0,k,m,d,sum=0,r=0;char bo[20],co[20],d1;
char b[20],c[20],dat[10];
rewind(stdin);
while(1)
{printf("第%d次出库输入\n",r+1);
//1将入库记录从文件读到一个结构体中 拿结构体来判断
//2 直接用指针 来比较
while(1)
{ j=0;fp=fopen(filename,"r");
printf("输入仓库编号(1~5):");
rewind(stdin);
scanf("%s",bo);
if(strcmp(knock,bo)==0) return;
while(!feof(fp))
{
fscanf(fp,"%s%s%s%d%d",b,c,date,&d,&m);
if(strcmp(b,bo)==0) break;
if(feof(fp))//如果文件读完后还未跳出
{j=1; printf("输入数据不合法");break;}
}
rewind(fp);//把指针指向文件头
if(j==0)
break;
}
while(1)
{ j=0;
printf("输入产品编号(如10~19):");
rewind(stdin);
scanf("%s",co);
if(strcmp(knock,co)==0) return;
while(!feof(fp))
{fscanf(fp,"%s%s%s%d%d",b,c,date,&d,&m);
if(strcmp(c,co)==0&&strcmp(b,bo)==0) break;
if(feof(fp))
{j=1; printf("输入数据不合法");break;}
}
rewind(fp);//把指针指向文件头
if(j==0)
break;
}
while(1)
{
time_t t=time(0);
char tmp[64];int p;
strftime(tmp,sizeof(tmp),"%x %X %j %z",localtime(&t));
date[5]=tmp[0];date[6]=tmp[1];date[8]=tmp[3];date[9]=tmp[4];
date[0]='2';date[1]='0';date[2]=tmp[6];date[3]=tmp[7];date[4]='-';date[7]='-';
printf("系统时间是:");puts(date);
if(p=check(date))
break;
}
while (1)
{ rewind(fp);
printf("输入产品规格(数量):");
scanf("%d",&k);sum=0;
if(k==0) return;
while(!feof(fp))
{
fscanf(fp,"%s%s%s%d%d",b,c,dat,&d,&m);
if(strcmp(c,co)==0&&strcmp(b,bo)==0)
{sum+=d*m;
d=0;m=0;}
}
rewind(fp);//把指针指向文件头
if(k>sum||k<0) printf("\n输入数据不合法 \n该库该产品库存量总量%d",sum);
else { printf("现在该库该产品库存量总量%d\n",sum-k); break;}
}
r++;
fclose(fp);
//*将入库记录放在入库对应的记录链表中 定义两个指针 把输入四个数据赋值给链表iningfo
fp=fopen(filename,"a");
m=-1;
fprintf(fp," %s %s %s %d %d \n",bo,co,date,k,m);
fclose(fp);
rewind(stdin);
printf("产品是否继续入库(Y-N)");
scanf("%c",&d1);
if(d1=='n'||d1=='N')
break;
}
printf("结束" );
system("pause
");
}
//////////////////////////////////////////////////////////////////33
void c3()
{ FILE *fp1;
char a[20],b[20],bo[20],j=0;
int c,d,m;
while(1)
{ j=0;fp1=fopen(filename,"r");
printf("输入查询仓库编号(1~5):");
rewind(stdin);
scanf("%s",bo);
if(strcmp(knock,bo)==0) return;
while(!feof(fp1))
{
fscanf(fp1,"%s%s%s%d%d",b,a,date,&d,&m);
if(strcmp(b,bo)==0) break;
if(feof(fp1))//如果文件读完后还未跳出
{j=1; printf("输入数据不合法");break;}
}
rewind(fp1);//把指针指向文件头
if(j==0)
break;
}
fscanf(fp1,"%s%s%s%d%d",a,b,date,&c,&d);
while(!feof(fp1))
{
if(d==1&&strcmp(a,bo)==0)
printf("\n仓库编号%s 产品编号 %s 入库日期 %s 入库数量%d",a,b,date,c);
fscanf(fp1,"%s%s%s%d%d",a,b,date,&c,&d);
}
fclose(fp1);
printf("\n操作结束");
system("pause");
}
//////////////////////////////////////////////////////////////////44444
void c4()
{ FILE *fp1;
char a[20],b[20],bo[20],j=0;
int c,d,m;
while(1)
{ j=0;fp1=fopen(filename,"r");
printf("输入查询产品编号(10~19):");
rewind(stdin);
scanf("%s",bo);
if(strcmp(knock,bo)==0) return;
while(!feof(fp1))
{
fscanf(fp1,"%s%s%s%d%d",b,a,date,&d,&m);
if(strcmp(a,bo)==0) break;
if(feof(fp1))//如果文件读完后还未跳出
{j=1; printf("输入数据不合法");break;}
}
rewind(fp1);//把指针指向文件头
if(j==0)
break;
}
fscanf(fp1,"%s%s%s%d%d",a,b,date,&c,&d);
while(!feof(fp1))
{
if(d==1&&strcmp(b,bo)==0)
printf("仓库编号%s 产品编号 %s 入库日期 %s 入库数量%d\n",a,b,date,c);
fscanf(fp1,"%s%s%s%d%d",a,b,date,&c,&d);
}
fclose(fp1);
printf("\n操作结束");
system("pause");
}
/////////////////////////////////////////////////////////////////////////////5555
void c5()
{ FILE *fp1;
char a[20],b[20],bo[20],j=0;
int c,d,m;
while(1)
{ j=0;fp1=fopen(filename,"r");
printf("输入查询仓库编号(1~5):");
rewind(stdin);
scanf("%s",bo);
if(strcmp(knock,bo)==0) return;
while(!feof(fp1))
{
fscanf(fp1,"%s%s%s%d%d",b,a,date,&d,&m);
if(strcmp(b,bo)==0) break;
if(feof(fp1))//如果文件读完后还未跳出
{j=1; printf("输入数据不合法");break;}
}
rewind(fp1);//把指针指向文件头
rewind(stdin);
if(j==0)
break;
}
fscanf(fp1,"%s%s%s%d%d",a,b,date,&c,&d);
while(!feof(fp1))
{
if(d==-1&&strcmp(a,bo)==0)
printf("仓库编号%s 产品编号 %s 出库日期 %s 出库数量%d \n",a,b,date,c);
fscanf(fp1,"%s%s%s%d%d",a,b,date,&c,&d);
}
fclose(fp1);
printf("\n操作结束");
system("pause");
}
///////////////////////////////////////////////////66666
void c6()
{ FILE *fp1;
char a[20],b[20],bo[20];
int c,d,j=0,m;
fp1=fopen(filename,"r");
rew
ind(stdin);
while(1)
{ j=0;fp1=fopen(filename,"r");
printf("输入查询产品编号(11~19):");
rewind(stdin);
scanf("%s",bo);
if(strcmp(knock,bo)==0) return;
while(!feof(fp1))
{
fscanf(fp1,"%s%s%s%d%d",b,a,date,&d,&m);
if(strcmp(a,bo)==0) break;
if(feof(fp1))//如果文件读完后还未跳出
{j=1; printf("输入数据不合法");break;}
}
rewind(fp1);//把指针指向文件头
if(j==0)
break;
}
fscanf(fp1,"%s%s%s%d%d",a,b,date,&c,&d);
while(!feof(fp1))
{
if(d==-1&&strcmp(b,bo)==0)
printf("仓库编号%s 产品编号 %s 出库日期 %s 出库数量%d\n",a,b,date,c);
fscanf(fp1,"%s%s%s%d%d",a,b,date,&c,&d);
}
fclose(fp1);
printf("\n操作结束");
system("pause");
}