C语言课程设计------食品仓库管理系统
篇幅较长,有些代码可能存在冗余,仅供参考。发现有问题欢迎提出。
目录
1.题目描述:
编写一个程序来管理食品仓库的货物,系统能实现以下功能:
食品信息输入 添加新食品信息 食品出库 修改食品信息 查询食品信息 食品排序 统计 月报表 导出食品信息
2.代码解析
首先定义我们需要的头文件:
#include<stdio.h>
#include<stdlib.h>
# include<windows.h>
# include<string.h>
#include<time.h>
#include<conio.h>
以及方便我们后续操作的宏定义:
#define format1 "%d %s %s %d %lf %d %d %d\n"
#define format2 "%d%s%s%d%lf%d%d%d\n"
#define format3 "%-6d\t%-6s\t%-6s\t%-6d\t%-6.2lf\t%-6d%-2d %-2d\n"
#define data1 stock[i].number,stock[i].name,stock[i].cate,stock[i].amount,stock[i].price,
stock[i].year,stock[i].month,stock[i].day
#define data2 &stock[i].number,&stock[i].name,&stock[i].cate,&stock[i].amount,&stock[i].price,
&stock[i].year,&stock[i].month,&stock[i].day
(1)结构体
我们的食品信息包含:食品号、名字、种类、库存、单价、入库时间以及入库量、出库量。所以我们可以构建结构体来完成:
struct sku
{
int number; //商品号
char name[20]; //名称
char cate[20]; //食品类别
int amount; //库存
int iput; //入库量
int iout ; //出库量
double price; //单价
int year; //年
int month; //月
int day; //日
}stock[100], //储存食品信息(量)
istock[1000], //储存入库信息(量)
ostock[1000], //储存出库信息(量)
swap; //用于排序和统计模块的交换信息
struct TJ //用于月报表
{
int SPHao[100]; //储存出入库信息的食品号
int SPShu[100]; //储存出入库信息的食品数
};
struct TJ rukuTJ[12], //储存1—12月的入库信息
chukuTJ[12]; //储存1—12月的出库信息
(2)主要设置函数
(我在这里先建立了我们后面需要用到的主要函数,来分别实现不同的功能)
void tianjia(int n);//添加食品信息
void rk();//添加食品库存
void qc();//减少食品库存
void xg();//修改
void findmenu();//查找信息
void tj();//统计
void sortmenu();//信息排序
void ybb();//月报表
int dc();//显示食品信息
void sc();//删除信息
void endmenu();//退出界面
(3)主函数:
int main()
{
FILE* fp;
fp = fopen("ship1.txt", "a+");//先创建一个文件
if (fp == NULL)
{
printf("无法打开文件\n");
return -1;
}
fclose(fp);
menu();//菜单
return 0;
}
(4)编写菜单:
void menu()
{
printf("======================================\n");
printf("* 欢迎使用食品仓库管理系统 *\n");
printf("*====================================*\n");
printf("* 1.添加食品信息 *\n");
printf("*====================================*\n");
printf("* 2.添加食品库存 *\n");
printf("*====================================*\n");
printf("* 3.食品出库 *\n");
printf("*====================================*\n");
printf("* 4.修改食品信息 *\n");
printf("*====================================*\n");
printf("* 5.查询食品信息 *\n");
printf("*====================================*\n");
printf("* 6.统计食品物资 *\n");
printf("*====================================*\n");
printf("* 7.排序食品信息 *\n");
printf("*====================================*\n");
printf("* 8.月报表 *\n");
printf("*====================================*\n");
printf("* 9.显示食品信息 *\n");
printf("*====================================*\n");
printf("* 10.删除食品信息 *\n");
printf("*====================================*\n");
printf("* 0.退出系统 *\n");
printf("======================================\n");
printf("请选择你要进行的操作:\n");
int x;
while (scanf("%d", &x) != EOF)
{
switch (x)
{
case 1:printf("请输入添加数量:\n");
int n;
scanf("%d", &n);
tianjia(n);//添加食品信息
break;
case 2:rk();//食品入库
break;
case 3:qc(); //食品出库
break;
case 4:xg();//修改食品信息
break;
case 5:findmenu();//查找
break;
case 6:tj(); //统计食品信息
break;
case 7:sortmenu(); //食品排序
break;
case 8:ybb(); /月报表
break;
case 9:dc(); //导出食品信息
break;
case 10:
sc();//删除食品信息
break;
case 0:
endmenu(); //退出系统界面
exit(0);
default:printf("没有此选项,请重新输入\n");
}
}
}
(5)添加食品信息:
void tianjia(int n)//添加食品信息
{
system("cls");
printf("=================================\n");
printf("*********添加食品信息************\n");
printf("请写入信息\n");
FILE* fp;
fp = fopen("ship1.txt", "a+");
int i;
for (i = 0; i < n; i++)
{
printf("请输入食品号:\n");
scanf("%d", &stock[i].number);
printf("请输入名称:\n");
scanf("%s", &stock[i].name);
printf("请输入食品类别:\n");
scanf("%s", &stock[i].cate);
printf("请输入库存:\n");
scanf("%d", &stock[i].amount);
printf("请输入食品单价:\n");
scanf("%lf", &stock[i].price);
printf("请输入日期 年/月/日:\n");
daTe:
scanf("%d %d %d", &stock[i].year, &stock[i].month, &stock[i].day);
if((stock[i].month==1||stock[i].month==3||stock[i].month==5||stock[i].month==7||stock[i].month==8||stock[i].month==10||stock[i].month==12)&&(stock[i].day>=31||stock[i].day<0))
{
printf("入库日期有误,重新输入日期:\n");
goto daTe; //输入的日期如果是错误的,如13月32日,就会返回到输入日期这步,重新输入
}
if((stock[i].month==4||stock[i].month==6||stock[i].month==9||stock[i].month==11)&&stock[i].day>=30||stock[i].day<0)
{
printf("入库日期有误,重新输入日期:\n");
goto daTe; //同上
}
if((stock[i].month==2)&&stock[i].day>=29||stock[i].day<0)
{
printf("入库日期有误,重新输入日期:\n");
goto daTe; //同上
}
fprintf(fp,format1,data1);//将输入的食品信息写入到文件
}
fclose(fp);
printf("添加成功\n按任意键继续\n");
_getch();
system("cls");//清屏
menu();//返回到菜单
}
(6)Count
我们可以先写一个Count()函数用来统计我们写入到文件中的食品信息量的多少以及读取文件的信息
int COUNT()//用于统计文件中食品的数量 ,读取文件信息
{
int i = 0;
FILE* fp;
fp = fopen("ship1.txt", "r");
if (fp == NULL)
{
printf("无法打开文件\n");
return -1;
}
while (!feof(fp))
{
fscanf(fp, format2, data2); //读取文件信息
i++;
}
fclose(fp);
return i;//返回文件中食品信息数量
}
(7)添加食品库存
(只用于添加库存的数量)
void rk()//添加食品库存
{
system("cls");
printf("===============================\n");
printf("*********入库食品信息**********\n");
printf("===============================\n");
FILE* fp,*fp1;
int imax = COUNT();//先读取文件中原有的食品信息
int i,number,iput;
char ch;
again://与下面goto again对应
printf("请输入要入库的食品号:\n");
scanf("%d", &number);
for (i = 0; i < imax; i++)
{
if (number == stock[i].number)
{
printf("---已找到该食品:\n");
printf("食品号\t名字\t类别\t库存\t价格\t入库时间\n");
printf(format3, data1);
printf("请输入要入库的食品量:\n");
scanf("%d", &iput);
stock[i].amount = stock[i].amount + iput;//原来的食品库存加上现在新加的库存量
istock[i].iput+=iput;//统计入库的食品数量(用于月报表)
printf("请输入入库时间:\n");
daTe:
scanf("%d %d %d", &stock[i].year, &stock[i].month, &stock[i].day);
if((stock[i].month==1||stock[i].month==3||stock[i].month==5||stock[i].month==7||stock[i].month==8||stock[i].month==10||stock[i].month==12)&&(stock[i].day>31||stock[i].day<0))
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
if((stock[i].month==4||stock[i].month==6||stock[i].month==9||stock[i].month==11)&&stock[i].day>30||stock[i].day<0)
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
if((stock[i].month==2)&&stock[i].day>29||stock[i].day<0)
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
//将食品号、入库量、时间写入入库量的文本文件中
fp1=fopen("rukudan.txt","a+");//用于统计入库数量的文本文件
fprintf(fp1,"%d %d %d %d %d\n",stock[i].number,istock[i].iput,stock[i].year,stock[i].month,stock[i].day);
fclose(fp1);
//将入库后的总信息写入文件中
if ((fp = fopen("ship1.txt", "w")) == NULL)//这里以“w”的方式打开是为了清除之前的食品信息,将现在的新食品信息写入
{
printf("无法打开文件\n");
return;
}
for (i = 0; i < imax; i++)
{
fprintf(fp, format1, data1);
}
fclose(fp);
printf("入库成功,是否(y/Y N/n)继续入库:\n");
getchar();
ch = getchar();
if (ch == 'y' || ch == 'Y')
goto again;
else
{
printf("按任意键返回\n");
_getch();
system("cls");
menu();
}
return;
}
}
printf("找不到该信息,按任意键返回\n");
_getch();
system("cls");
menu();
}
(8)修改食品信息:
void xg()//修改
{
system("cls");
printf("================================\n");
printf("********食品信息修改************\n");
FILE* fp= fopen("ship1.txt", "r");
if (!fp)
{
printf("打开失败!\n");
return -1;
}
int i = 0, number,imax = 0,p=0;
imax = COUNT(); //读取食品信息的文件
printf("请输入你要修改食品的食品号:\n");
scanf("%d", &number);
for (i = 0; i < imax; i++)
{
if (number == stock[i].number)
{
printf("已找到该信息\n");
printf("食品号\t名字\t类别\t库存\t价格\t入库时间\n");
printf(format3, data1);
printf("请选择要修改的信息:\n");
printf("******** 1.库存 *******\n");
printf("******** 2.单价 *******\n");
printf("******* 3.入库时间 *******\n");
printf("******* 4.确认修改 *******\n");
printf("**************0.返回菜单***************\n");
while (scanf("%d", &p) != EOF)
{
switch (p)
{
case 1:printf("请输入新的库存量:\n");
scanf("%d", &stock[i].amount);
break;
case 2:
printf("请输入新的单价:\n");
scanf("%lf", &stock[i].price);
break;
case 3:
printf("请输入新的入库时间:\n");
daTe:
scanf("%d %d %d", &stock[i].year, &stock[i].month, &stock[i].day);
if((stock[i].month==1||stock[i].month==3||stock[i].month==5||stock[i].month==7||stock[i].month==8||stock[i].month==10||stock[i].month==12)&&(stock[i].day>31||stock[i].day<0))
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
if((stock[i].month==4||stock[i].month==6||stock[i].month==9||stock[i].month==11)&&stock[i].day>30||stock[i].day<0)
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
if((stock[i].month==2)&&stock[i].day>29||stock[i].day<0)
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
break;
case 4:
if ((fp = fopen("ship1.txt", "w")) == NULL)
{
printf("无法打开文件\n");
return;
}
for (i = 0; i < imax; i++)
{
fprintf(fp, format1, data1);//打印在文件里面
}
fclose(fp);
printf("修改成功\n");
break;
case 0:system("cls");
menu();
break;
default:printf("输入格式错误,请重新选择\n");
}
printf("请选择修改项目:\n");
}
return;
}
}
printf("找不到该信息---按任意键继续\n");
_getch();
system("cls");
menu();
}
(9)查找信息
void findmenu()//查找信息
{
system("cls");//清屏
printf("================================\n");
printf("* 1.食品号查询 *\n");
printf("* 2.果仁类 *\n");
printf("* 3.饼干类 *\n");
printf("* 4.肉脯类 *\n");
printf("* 5.糖果类 *\n");
printf("* 6.果脯类 *\n");
printf("* 0.返回主菜单 *\n");
printf("*=========================*\n");
printf("请选择:\n");
int i = 0,n,imax=0,number,flag=0;
char guoren[10] = "果仁类",bingan[10]="饼干类",roufu[10]="肉脯类",tangguo[10]="糖果类",guofu[10]="果脯类";
imax =COUNT();
if (imax <= 0)
{
printf("请先添加信息\n");
return;
}
while (scanf("%d", &n) != EOF)
{
switch (n)
{
case 1:
printf("-------请输入食品号:\n");
scanf("%d", &number);
for (i = 0; i < imax; i++)
if (number == stock[i].number)
{
flag = 1;
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
printf(format3, data1);
}
if (flag == 0)
printf("* 没有该食品,重新选择查询方式 *\n");
break;
case 2:
flag = 0;
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
{
if (strcmp(guoren,stock[i].cate)==0)
{
flag = 1;
printf(format3, data1);
}
}
if (flag == 0)
printf("* 没有该食品,重新选择查询方式 *\n");
break;
case 3:
flag = 0;
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
if (strcmp(bingan, stock[i].cate) == 0)
{
flag = 1;
printf(format3, data1);
}
if (flag == 0)
printf("* 没有该食品,重新选择查询方式 *\n");
break;
case 4:
flag = 0;
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
{
if (strcmp(roufu, stock[i].cate) == 0)
{
flag = 1;
printf(format3, data1);
}
}
if (flag == 0)
printf("* 没有该食品,重新选择查询方式 *\n");
break;
case 5:
flag = 0;
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
{
if (strcmp(tangguo, stock[i].cate) == 0)
{
flag = 1;
printf(format3, data1);
}
}
if (flag == 0)
printf("* 没有该食品,重新选择查询方式 *\n");
break;
case 6:
flag = 0;
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
{
if (strcmp(guofu, stock[i].cate) == 0)
{
flag = 1;
printf(format3, data1);
}
}
if (flag == 0)
printf("* 没有该食品,重新选择查询方式 *\n");
break;
case 0:system("cls"); menu(); break;
default:printf("-----请重新选择:\n");
}
printf("======请选择:====\n");
}
}
(10)统计
void tj()//统计
{
system("cls");
printf("================================\n");
printf("*********食品信息统计***********\n");
printf("================================\n");
printf("\n");
int imax = 0, i = 0, count = 0;
imax = COUNT();
for (i = 0; i < imax; i++)
{
count += stock[i].amount;
}
int average_count = count / imax;
printf("* 总食品平均库存量:%d\n",average_count);
printf("**********************\n");
int j = 0,x;
printf("* 大于平均库存的食品降序排序: *\n");
printf("=====================================\n");
for (i = 0; i < imax; i++)
{
if (stock[i].amount > average_count)
{//把大于平均库存的食品排于前面
swap = stock[j];
stock[j] = stock[i];
stock[i] = swap;
j++;
}
}
for (i = 0; i < j - 1; i++)
for (x = i + 1; x< j; x++)
{
if (stock[i].amount < stock[x].amount)
{//把大于平均库存的食品按升序排序
swap = stock[i];
stock[i] = stock[j];
stock[j] = swap;
}
}
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < j; i++)
printf(format3, data1);
printf("\n* 库存量最少的食品(最多10件): *\n");
printf("=======================================\n");
for (i = 0; i < imax - 1; i++)
for (j = i + 1; j < imax; j++)
{
if (stock[i].amount > stock[j].amount)
{//罗列出库存量最少的10种商品,且按升序排序
swap = stock[i];
stock[i] = stock[j];
stock[j] = swap;
}
}
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
if (imax > 10)//食品量大于10,就只打印10个信息
{
for (i = 0; i < 10; i++)
printf(format3, data1);
}
else//不大于10就全部打印
{
for (i = 0; i < imax; i++)
printf(format3, data1);
}
//统计果仁、饼干、柔肤、糖果、果脯各类的数量
int guor = 0, bing = 0, rouf = 0, tangg = 0, guof = 0;
for (i = 0; i < imax; i++)
{
if (strcmp(stock[i].cate, "果仁类") == 0)
guor += stock[i].amount;
if (strcmp(stock[i].cate, "饼干类") == 0)
bing += stock[i].amount;
if (strcmp(stock[i].cate, "肉脯类") == 0)
rouf+= stock[i].amount;
if (strcmp(stock[i].cate, "糖果类") == 0)
tangg+= stock[i].amount;
if (strcmp(stock[i].cate, "果脯类") == 0)
guof += stock[i].amount;
}
printf("\n---------------");
printf("果仁类库存:%d\n",guor);
printf("---------------");
printf("饼干类库存:%d\n",bing);
printf("---------------");
printf("肉脯类库存:%d\n",rouf);
printf("---------------");
printf("糖果类库存:%d\n",tangg);
printf("---------------");
printf("果脯类库存:%d\n",guof);
printf("---------------");
printf("其他类别 :%d\n",count-guor-bing-rouf-tangg-guof);
printf("****按任意键返回****\n");
_getch();
system("cls");
menu();
}
(11)食品信息排序
void sortmenu()//信息排序
{
system("cls");
printf("=============================\n");
printf("* 1.食品号排序 *\n");
printf("* 2.库存量排序 *\n");
printf("* 3.单价排序 *\n");
printf("* 0.返回主菜单 *\n");
printf("请选择:\n");
int i = 0,n, imax = 0, j = 0;
imax = COUNT();
if (imax <= 0)
{
printf("请先添加信息\n");
return;
}
while (scanf("%d", &n) != EOF)
{
switch (n)
{
case 1:printf("**********食品号排序**********\n");
for (i = 0; i < imax-1; i++)
for (j = i+1; j < imax; j++)
if (stock[i].number > stock[j].number)
{//食品按升序排序,冒泡排序。满足条件就将食品信息整体进行交换,下同。
swap = stock[i];
stock[i] = stock[j];
stock[j] = swap;
}
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for(i=0;i<imax;i++)
printf(format3, data1);
break;
case 2:printf("**********库存量排序**********\n");
for (i = 0; i < imax - 1; i++)
for (j = i + 1; j < imax; j++)
{
if (stock[i].amount > stock[j].amount)
{//库存量按升序排序
swap = stock[i];
stock[i] = stock[j];
stock[j] = swap;
}
}
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
printf(format3,data1);
break;
case 3:printf("**********单价排序**********\n");
for (i = 0; i < imax - 1; i++)
for (j = i + 1; j < imax; j++)
{
if (stock[i].price > stock[j].price)
{//单价按升序排序
swap = stock[i];
stock[i] = stock[j];
stock[j] = swap;
}
}
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
printf(format3, data1);
break;
case 0:system("cls"); menu(); break;
default:printf("请重新选择:\n");
}
printf("请选择:\n");
}
}
(12)月报表
void ybb()//月报表
{
system("cls");
printf("================================\n");
printf("*********月报表******************\n");
FILE *fp3,*fp4;
int imax = COUNT();
//读取出库信息量
int k=0,outcount=0;
int i=0 , j=0,flag ;
fp4=fopen("chukudan.txt","r");//读取出库单文件信息
while(fscanf(fp4,"%d %d %d %d %d",&ostock[i].number,&ostock[i].iout,&ostock[i].year,&ostock[i].month,&ostock[i].day)!=EOF)
{
i++;
outcount++;//统计出库的信息量
}
//将出库月、量读入到chukuTJ结构体中
for(i=0;i<12;i++)
{
k=0;
for(j=0;j<outcount;j++)//
if(ostock[j].month-1==i)
{
chukuTJ[i].SPHao[k]=ostock[j].number;
chukuTJ[i].SPShu[k]=ostock[j].iout;
k++;
}
}
fclose(fp4);
int chukucount=0;//计数每月同一食品出库量
//打印出库信息
printf("出库月报表:\n");
for(i=0;i<12;i++)//1~12月
{
printf("----------%d月出库月报表:----------\n",i+1);
for(j=1;j<=100;j++)//食品号为1~100
{
flag=0,chukucount=0;
for(k=0;k<100;k++)//每个月中储存的食品信息量(最多100)
if(chukuTJ[i].SPHao[k]==j)
{
chukucount+=chukuTJ[i].SPShu[k];
flag=1;
}
if(flag==1)
printf("* 食品号为%d的出库量为;%d *\n",j,chukucount);
}
}
//入库月报表
int incount=0;//入库信息量
i=0;
fp3=fopen("rukudan.txt","r");
while((fscanf(fp3,"%d %d %d %d %d",&istock[i].number,&istock[i].iput,&stock[i].year,&istock[i].month,&istock[i].day))!=EOF)
{
incount++;
i++;
}
//将入库月、量转移到rukuTJ结构体中
for(i=0;i<12;i++)
{
k=0;
for(j=0;j<incount;j++)
if(istock[j].month-1==i)
{
rukuTJ[i].SPHao[k]=istock[j].number;
rukuTJ[i].SPShu[k]=istock[j].iput;
k++;
}
}
int rukucount=0;//入库量
fclose(fp4);
//打印入库信息
printf("\n入库月报表:\n");
for(i=0;i<12;i++)
{
printf("----------%d月入库月报表:----------\n",i+1);
for(j=1;j<=100;j++)//食品号为1~100
{
flag=0,rukucount=0;
for(k=0;k<100;k++)
if(rukuTJ[i].SPHao[k]==j)
{
rukucount+=rukuTJ[i].SPShu[k];
flag=1;
}
if(flag==1)
printf("* 食品号为%d的出库量为;%d *\n",j,rukucount);
}
}
fclose(fp3);
printf("按任意键继续_ _ _\n");
_getch();
system("cls");
menu();
}
(13) 显示食品信息
int dc()//信息显示
{
system("cls");
time_t timetemp;//定义时间结构体变量
struct tm* p;//定义时一个结构体指针
time(&timetemp);
p=localtime(&timetemp);//获取当前时间
//这里来获取当前时间,判断库存中的食品距离当前时间是否过期
int nowmonth=1+p->tm_mon,nowyear=1900+p->tm_year;//nowmonth、nowyear为当前月、年
printf("================================\n");
printf("********显示食品信息************\n");
printf("****红色表示该食品库存少于10****\n");
printf("****蓝色表示该库存入库时间大于六个月****\n");
printf("****黄色表示该食品库存少于10且入库时间大于六月*****\n");
printf("===================================================\n");
int i = 0,imax=0,j,summonth=0;
int warn=10;//库存警告值
FILE* fp;
imax=COUNT();
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for(i=0;i<imax;i++)
{
summonth=0;
for(j=0;j<nowyear-stock[i].year;j++)
{
summonth+=13-stock[i].month;
}
summonth+=nowmonth;//入库月距今月差
if(stock[i].amount<=warn&&summonth>6)//如果库存少且入库时间大于6个月
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);//显示黄色
printf(format3, data1);
}
else if(stock[i].amount<=warn)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);//显示红色
printf(format3, data1);
}
else if(summonth>6)//如果入库月距离本月大于6个月
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE);//显示蓝色
printf(format3, data1);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);//显示白色
printf(format3,data1);
}
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);//显示白色
printf("按任意键继续\n");
_getch();
system("cls");
menu();
}
(14)删除食品信息
void sc()
{
system("cls");
printf("*******************************\n");
printf("**********删除食品信息*********\n");
printf("*******************************\n");
FILE* fp;
int i = 0,number,index = 0;
int imax = COUNT();
char ch;
again:
printf("* 请输入要删除食品的食品号 *\n");
scanf("%d", &number);
for (i = 0; i < imax; i++)
{
if (number == stock[i].number)
{
index = i;
printf("食品号\t名字\t类别\t库存\t价格\t入库时间\n");
printf(format3,data1);
printf("找到了所要删除的信息\n你是否(y/Y N/n)要删除,输入0返回主菜单\n");
getchar();
ch = getchar();
if (ch == 'Y' || ch == 'y')
{
for (i = 0; i < imax; i++)
{
if (i < index)
stock[i].number = stock[i].number;
else
stock[i] = stock[i + 1];
}
fp = fopen("ship1.txt", "w");
for (i = 0; i < imax - 1; i++)
{
fprintf(fp, format1, data1);
}
fclose(fp);
printf("删除成功- - -按任意键返回\n");
_getch();
system("cls");
menu();
}
else if (ch == '0')
{
printf("按任意键返回_ _ _\n");
_getch();
system("cls");
menu();
}
else
{
printf("* 请重新输入删除的信息 *\n");
goto again;
}
return;
break;
}
}
printf("没有此信息- - -按任意键返回上一级\n");
_getch();
system("cls");
menu();
}
(15)退出系统菜单
void endmenu()
{
system("cls");
printf("================================\n");
printf("*********感 谢 使 用*********\n");
printf("================================\n");
}
该系统整体代码如上,如果大佬发现有什么问题,欢迎提出,或有不清楚的地方欢迎提问,感谢支持!!!
3.代码汇总
源代码,有点多:
#include<stdio.h>
#include<stdlib.h>
# include<windows.h>//清屏函数
# include<string.h>
#include<time.h>
# include<conio.h>//调用getch()函数,从标准输入设备(键盘)读入一个字符,不显在显示器上
#define format1 "%d %s %s %d %lf %d %d %d\n"
#define format2 "%d%s%s%d%lf%d%d%d\n"
#define format3 "%-6d\t%-6s\t%-6s\t%-6d\t%-6.2lf\t%-6d%-2d %-2d\n"
#define data1 stock[i].number,stock[i].name,stock[i].cate,stock[i].amount,stock[i].price,stock[i].year,stock[i].month,stock[i].day
#define data2 &stock[i].number,&stock[i].name,&stock[i].cate,&stock[i].amount,&stock[i].price,&stock[i].year,&stock[i].month,&stock[i].day
struct sku
{
int number;//商品号
char name[20];//名称
char cate[20];//食品类别
int amount;//库存
int iput;//入库量
int iout ;//出库量
double price;//单价
int year;//存入年
int month;//存入月
int day;//存入日
}stock[100],
istock[1000],//入库
ostock[1000],//出库
swap;//作为临时结构体,用于排序和统计模块的交换信息
struct TJ//用于月报表
{
int SPHao[100]; //1 3
int SPShu[100];
};
struct TJ rukuTJ[12], chukuTJ[12];// kucunTJ[12]
void tianjia(int n);//添加食品信息
void rk();//添加食品库存
void qc();//减少食品库存
void xg();//修改
void findmenu();//查找信息
void tj();//统计
void sortmenu();//信息排序
void ybb();//月报表
int dc();//显示食品信息
void sc();//删除信息
void endmenu();
void zuzhi()
{
system("cls");
printf("======================================\n");
printf("*********食品仓库管理系统*************\n");
printf("* 学院:信息工程学院 *\n");
printf("* 组长: *\n");
printf("* 成员: *\n");
printf("* 专业:网络工程 *\n");
printf("* 班级:网络N211 \n");
printf("**************************************\n");
printf("======================================\n");
printf("press any key\n");
_getch();
system("cls");
}
void menu()
{
printf("======================================\n");
printf("* 欢迎使用食品仓库管理系统 *\n");
printf("*====================================*\n");
printf("* 1.添加食品信息 *\n");
printf("*====================================*\n");
printf("* 2.添加食品库存 *\n");
printf("*====================================*\n");
printf("* 3.食品出库 *\n");
printf("*====================================*\n");
printf("* 4.修改食品信息 *\n");
printf("*====================================*\n");
printf("* 5.查询食品信息 *\n");
printf("*====================================*\n");
printf("* 6.统计食品物资 *\n");
printf("*====================================*\n");
printf("* 7.排序食品信息 *\n");
printf("*====================================*\n");
printf("* 8.月报表 *\n");
printf("*====================================*\n");
printf("* 9.显示食品信息 *\n");
printf("*====================================*\n");
printf("* 10.删除食品信息 *\n");
printf("*====================================*\n");
printf("* 0.退出系统 *\n");
printf("======================================\n");
printf("请选择你要进行的操作:\n");
int x,n;
while (scanf("%d", &x) != EOF)
{
switch (x)
{
case 1:printf("请输入添加数量:\n");
int n;
scanf("%d", &n);
tianjia(n);
break;
case 2:rk();
break;
case 3:qc();
break;
case 4:xg();
break;
case 5:findmenu();
break;
case 6:tj();
break;
case 7:sortmenu();
break;
case 8:ybb();
break;
case 9:dc();
break;
case 10:
sc();
break;
case 0:
endmenu();
exit(0);
default:printf("没有此选项,请重新输入\n");
}
}
}
int main()
{
FILE* fp;
fp = fopen("ship1.txt", "a+");//先创建一个文件
if (fp == NULL)
{
printf("无法打开文件\n");
return -1;
}
fclose(fp);
zuzhi();
menu();
return 0;
}
void tianjia(int n)//添加食品信息
{
system("cls");
printf("=================================\n");
printf("*********添加食品信息************\n");
printf("请写入信息\n");
FILE* fp;
fp = fopen("ship1.txt", "a+");
int i;
for (i = 0; i < n; i++)
{
printf("请输入食品号:\n");
scanf("%d", &stock[i].number);
printf("请输入名称:\n");
scanf("%s", &stock[i].name);
printf("请输入食品类别:\n");
scanf("%s", &stock[i].cate);
printf("请输入库存:\n");
scanf("%d", &stock[i].amount);
printf("请输入食品单价:\n");
scanf("%lf", &stock[i].price);
printf("请输入日期 年/月/日:\n");
daTe:
scanf("%d %d %d", &stock[i].year, &stock[i].month, &stock[i].day);
if((stock[i].month==1||stock[i].month==3||stock[i].month==5||stock[i].month==7||stock[i].month==8||stock[i].month==10||stock[i].month==12)&&(stock[i].day>=31||stock[i].day<0))
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
if((stock[i].month==4||stock[i].month==6||stock[i].month==9||stock[i].month==11)&&stock[i].day>=30||stock[i].day<0)
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
if((stock[i].month==2)&&stock[i].day>=29||stock[i].day<0)
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
fprintf(fp,format1,data1);
}
fclose(fp);
printf("添加成功\n按任意键继续\n");
_getch();
system("cls");
menu();
}
int COUNT()//用于统计文件中食品的数量 ,读取文件信息
{
int i = 0;
FILE* fp;
fp = fopen("ship1.txt", "r");
if (fp == NULL)
{
printf("无法打开文件\n");
return -1;
}
while (!feof(fp))
{
fscanf(fp, format2, data2); //读取文件信息
i++;
}
fclose(fp);
return i;//返回文件中信息数量
}
void rk()//添加食品库存
{
system("cls");
printf("===============================\n");
printf("*********入库食品信息**********\n");
printf("===============================\n");
FILE* fp,*fp1;
int imax = COUNT();
int i,number,iput;
char ch;
again:
printf("请输入要入库的食品号:\n");
scanf("%d", &number);
for (i = 0; i < imax; i++)
{
if (number == stock[i].number)
{
printf("---已找到该食品:\n");
printf("食品号\t名字\t类别\t库存\t价格\t入库时间\n");
printf(format3, data1);
printf("请输入要入库的食品量:\n");
scanf("%d", &iput);
stock[i].amount = stock[i].amount + iput;
istock[i].iput+=iput;
printf("请输入入库时间:\n");
daTe:
scanf("%d %d %d", &stock[i].year, &stock[i].month, &stock[i].day);
if((stock[i].month==1||stock[i].month==3||stock[i].month==5||stock[i].month==7||stock[i].month==8||stock[i].month==10||stock[i].month==12)&&(stock[i].day>31||stock[i].day<0))
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
if((stock[i].month==4||stock[i].month==6||stock[i].month==9||stock[i].month==11)&&stock[i].day>30||stock[i].day<0)
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
if((stock[i].month==2)&&stock[i].day>29||stock[i].day<0)
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
//将食品号、入库量、时间写入文本
fp1=fopen("rukudan.txt","a+");
fprintf(fp1,"%d %d %d %d %d\n",stock[i].number,istock[i].iput,stock[i].year,stock[i].month,stock[i].day);
fclose(fp1);
//将入库后的总信息写入文件中
if ((fp = fopen("ship1.txt", "w")) == NULL)
{
printf("无法打开文件\n");
return;
}
for (i = 0; i < imax; i++)
{
fprintf(fp, format1, data1);
}
fclose(fp);
printf("入库成功,是否(y/Y N/n)继续入库:\n");
getchar();
ch = getchar();
if (ch == 'y' || ch == 'Y')
goto again;
else
{
printf("按任意键返回\n");
_getch();
system("cls");
menu();
}
return;
}
}
printf("找不到该信息,按任意键返回\n");
_getch();
system("cls");
menu();
}
void qc()//食品出库
{
system("cls");
printf("=================================\n");
printf("********食品出库*****************\n");
FILE* fp,*fp2;
int i = 0, imax = 0, iout = 0, number = 0;
char ch;
imax = COUNT();//食品信息量
if (imax <= 0)
{
printf("请先添加信息\n");
return;
}
again: //go to语句,下面从go to返回到此
printf("请输入出库食品的食品号:\n");
scanf("%d", &number);
for (i = 0; i < imax; i++)
{
if (number == stock[i].number)
{
printf("食品号\t名字\t类别\t库存\t价格\t入库时间\n");
printf(format3, data1);
printf("已找到该信息,输入Y/y进行出库,输入0退出,其他重新选择出库食品\n");
getchar();
ch = getchar();
if (ch == 'Y' || ch == 'y')
{
printf("请输入出库数量:\n");
scanf("%d", &iout);
if(iout>stock[i].amount)
{//如果出库的数量大于库存,那么出库的数量就等于库存量
printf("出库失败,库存量不足__返回菜单\n");
_getch();
system("cls");
menu();
//iout=stock[i].amount;
//printf("库存少于出库量,现库存为0\n");
}
else
{
stock[i].amount = stock[i].amount - iout;
ostock[i].iout=0;
ostock[i].iout+=iout;
}
printf("请输出出库时间:\n");
daTe:
scanf("%d %d %d", &ostock[i].year, &ostock[i].month, &ostock[i].day);
if((ostock[i].month==1||ostock[i].month==3||ostock[i].month==5||ostock[i].month==7||ostock[i].month==8||ostock[i].month==10||ostock[i].month==12)&&(ostock[i].day>31||ostock[i].day<0))
{
printf("出库日期有误,重新输入日期:\n");
goto daTe;
}
if((ostock[i].month==4||ostock[i].month==6||ostock[i].month==9||ostock[i].month==11)&&ostock[i].day>30||ostock[i].day<0)
{
printf("出库日期有误,重新输入日期:\n");
goto daTe;
}
if((ostock[i].month==2)&&ostock[i].day>29||ostock[i].day<0)
{
printf("出库日期有误,重新输入日期:\n");
goto daTe;
}
//把出库量、时间、食品号写入文件中
fp2=fopen("chukudan.txt","a+");
fprintf(fp2,"%d %d %d %d %d\n",stock[i].number,ostock[i].iout,ostock[i].year,ostock[i].month,ostock[i].day);
fclose(fp2);
//把出库后的总信息写入文件中
if ((fp = fopen("ship1.txt", "w")) == NULL)
{
printf("无法打开文件\n");
return;
}
for (i = 0; i < imax; i++)
fprintf(fp, format1, data1);
fclose(fp);
printf("出库成功,按任意键返回\n");
_getch();
system("cls");
menu();
}
else if(ch=='0')
{
system("cls");
menu();
}
else
{
printf("重新选择:\n");
goto again;//返回至again再进行出库
}
}
}
printf("找不到该信息\n按任意键返回\n");
_getch();
system("cls");
menu();
}
void xg()//修改
{
system("cls");
printf("================================\n");
printf("********食品信息修改************\n");
FILE* fp= fopen("ship1.txt", "r");
if (!fp)
{
printf("打开失败!\n");
return -1;
}
int i = 0, number,imax = 0,p=0;
imax = COUNT();
printf("请输入你要修改食品的食品号:\n");
scanf("%d", &number);
for (i = 0; i < imax; i++)
{
if (number == stock[i].number)
{
printf("已找到该信息\n");
printf("食品号\t名字\t类别\t库存\t价格\t入库时间\n");
printf(format3, data1);
printf("请选择要修改的信息:\n");
printf("******** 1.库存 *******\n");
printf("******** 2.单价 *******\n");
printf("******* 3.入库时间 *******\n");
printf("******* 4.确认修改 *******\n");
printf("**************0.返回菜单***************\n");
while (scanf("%d", &p) != EOF)
{
switch (p)
{
case 1:printf("请输入新的库存量:\n");
scanf("%d", &stock[i].amount);
break;
case 2:
printf("请输入新的单价:\n");
scanf("%lf", &stock[i].price);
break;
case 3:
printf("请输入新的入库时间:\n");
daTe:
scanf("%d %d %d", &stock[i].year, &stock[i].month, &stock[i].day);
if((stock[i].month==1||stock[i].month==3||stock[i].month==5||stock[i].month==7||stock[i].month==8||stock[i].month==10||stock[i].month==12)&&(stock[i].day>31||stock[i].day<0))
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
if((stock[i].month==4||stock[i].month==6||stock[i].month==9||stock[i].month==11)&&stock[i].day>30||stock[i].day<0)
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
if((stock[i].month==2)&&stock[i].day>29||stock[i].day<0)
{
printf("入库日期有误,重新输入日期:\n");
goto daTe;
}
break;
case 4:
if ((fp = fopen("ship1.txt", "w")) == NULL)
{
printf("无法打开文件\n");
return;
}
for (i = 0; i < imax; i++)
{
fprintf(fp, format1, data1);//打印在文件里面
}
fclose(fp);
printf("修改成功\n");
break;
case 0:system("cls");
menu();
break;
default:printf("输入格式错误,请重新选择\n");
}
printf("请选择修改项目:\n");
}
return;
}
}
printf("找不到该信息---按任意键继续\n");
_getch();
system("cls");
menu();
}
void findmenu()//查找信息
{
system("cls");//清屏
printf("================================\n");
printf("* 1.食品号查询 *\n");
printf("* 2.果仁类 *\n");
printf("* 3.饼干类 *\n");
printf("* 4.肉脯类 *\n");
printf("* 5.糖果类 *\n");
printf("* 6.果脯类 *\n");
printf("* 0.返回主菜单 *\n");
printf("*=========================*\n");
printf("请选择:\n");
int i = 0,n,imax=0,number,flag=0;
char guoren[10] = "果仁类",bingan[10]="饼干类",roufu[10]="肉脯类",tangguo[10]="糖果类",guofu[10]="果脯类";
imax =COUNT();
if (imax <= 0)
{
printf("请先添加信息\n");
return;
}
while (scanf("%d", &n) != EOF)
{
switch (n)
{
case 1:
printf("-------请输入食品号:\n");
scanf("%d", &number);
for (i = 0; i < imax; i++)
if (number == stock[i].number)
{
flag = 1;
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
printf(format3, data1);
}
if (flag == 0)
printf("* 没有该食品,重新选择查询方式 *\n");
break;
case 2:
flag = 0;
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
{
if (strcmp(guoren,stock[i].cate)==0)
{
flag = 1;
printf(format3, data1);
}
}
if (flag == 0)
printf("* 没有该食品,重新选择查询方式 *\n");
break;
case 3:
flag = 0;
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
if (strcmp(bingan, stock[i].cate) == 0)
{
flag = 1;
printf(format3, data1);
}
if (flag == 0)
printf("* 没有该食品,重新选择查询方式 *\n");
break;
case 4:
flag = 0;
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
{
if (strcmp(roufu, stock[i].cate) == 0)
{
flag = 1;
printf(format3, data1);
}
}
if (flag == 0)
printf("* 没有该食品,重新选择查询方式 *\n");
break;
case 5:
flag = 0;
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
{
if (strcmp(tangguo, stock[i].cate) == 0)
{
flag = 1;
printf(format3, data1);
}
}
if (flag == 0)
printf("* 没有该食品,重新选择查询方式 *\n");
break;
case 6:
flag = 0;
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
{
if (strcmp(guofu, stock[i].cate) == 0)
{
flag = 1;
printf(format3, data1);
}
}
if (flag == 0)
printf("* 没有该食品,重新选择查询方式 *\n");
break;
case 0:system("cls"); menu(); break;
default:printf("-----请重新选择:\n");
}
printf("======请选择:====\n");
}
}
void tj()//统计
{
system("cls");
printf("================================\n");
printf("*********食品信息统计***********\n");
printf("================================\n");
printf("\n");
int imax = 0, i = 0, count = 0;
imax = COUNT();
for (i = 0; i < imax; i++)
{
count += stock[i].amount;
}
int average_count = count / imax;
printf("* 总食品平均库存量:%d\n",average_count);
printf("**********************\n");
int j = 0,x;
printf("* 大于平均库存的食品降序排序: *\n");
printf("=====================================\n");
for (i = 0; i < imax; i++)
{
if (stock[i].amount > average_count)
{//把大于平均库存的食品排于前面
swap = stock[j];
stock[j] = stock[i];
stock[i] = swap;
j++;
}
}
for (i = 0; i < j - 1; i++)
for (x = i + 1; x< j; x++)
{
if (stock[i].amount < stock[x].amount)
{//把大于平均库存的食品按升序排序
swap = stock[i];
stock[i] = stock[j];
stock[j] = swap;
}
}
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < j; i++)
printf(format3, data1);
printf("\n* 库存量最少的食品(最多10件): *\n");
printf("=======================================\n");
for (i = 0; i < imax - 1; i++)
for (j = i + 1; j < imax; j++)
{
if (stock[i].amount > stock[j].amount)
{//罗列出库存量最少的10种商品,且按升序排序
swap = stock[i];
stock[i] = stock[j];
stock[j] = swap;
}
}
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
if (imax > 10)//食品量大于10,就只打印10个信息
{
for (i = 0; i < 10; i++)
printf(format3, data1);
}
else//不大于10就全部打印
{
for (i = 0; i < imax; i++)
printf(format3, data1);
}
//统计果仁、饼干、柔肤、糖果、果脯各类的数量
int guor = 0, bing = 0, rouf = 0, tangg = 0, guof = 0;
for (i = 0; i < imax; i++)
{
if (strcmp(stock[i].cate, "果仁类") == 0)
guor += stock[i].amount;
if (strcmp(stock[i].cate, "饼干类") == 0)
bing += stock[i].amount;
if (strcmp(stock[i].cate, "肉脯类") == 0)
rouf+= stock[i].amount;
if (strcmp(stock[i].cate, "糖果类") == 0)
tangg+= stock[i].amount;
if (strcmp(stock[i].cate, "果脯类") == 0)
guof += stock[i].amount;
}
printf("\n---------------");
printf("果仁类库存:%d\n",guor);
printf("---------------");
printf("饼干类库存:%d\n",bing);
printf("---------------");
printf("肉脯类库存:%d\n",rouf);
printf("---------------");
printf("糖果类库存:%d\n",tangg);
printf("---------------");
printf("果脯类库存:%d\n",guof);
printf("---------------");
printf("其他类别 :%d\n",count-guor-bing-rouf-tangg-guof);
printf("****按任意键返回****\n");
_getch();
system("cls");
menu();
}
void sortmenu()//信息排序
{
system("cls");
printf("=============================\n");
printf("* 1.食品号排序 *\n");
printf("* 2.库存量排序 *\n");
printf("* 3.单价排序 *\n");
printf("* 0.返回主菜单 *\n");
printf("请选择:\n");
int i = 0,n, imax = 0, j = 0;
imax = COUNT();
if (imax <= 0)
{
printf("请先添加信息\n");
return;
}
while (scanf("%d", &n) != EOF)
{
switch (n)
{
case 1:printf("**********食品号排序**********\n");
for (i = 0; i < imax-1; i++)
for (j = i+1; j < imax; j++)
if (stock[i].number > stock[j].number)
{//食品按升序排序,冒泡排序。满足条件就将食品信息整体进行交换,下同。
swap = stock[i];
stock[i] = stock[j];
stock[j] = swap;
}
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for(i=0;i<imax;i++)
printf(format3, data1);
break;
case 2:printf("**********库存量排序**********\n");
for (i = 0; i < imax - 1; i++)
for (j = i + 1; j < imax; j++)
{
if (stock[i].amount > stock[j].amount)
{//库存量按升序排序
swap = stock[i];
stock[i] = stock[j];
stock[j] = swap;
}
}
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
printf(format3,data1);
break;
case 3:printf("**********单价排序**********\n");
for (i = 0; i < imax - 1; i++)
for (j = i + 1; j < imax; j++)
{
if (stock[i].price > stock[j].price)
{//单价按升序排序
swap = stock[i];
stock[i] = stock[j];
stock[j] = swap;
}
}
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for (i = 0; i < imax; i++)
printf(format3, data1);
break;
case 0:system("cls"); menu(); break;
default:printf("请重新选择:\n");
}
printf("请选择:\n");
}
}
void ybb()//月报表
{
system("cls");
printf("================================\n");
printf("*********月报表******************\n");
FILE *fp3,*fp4;
int imax = COUNT();
//读取出库信息量
int k=0,outcount=0;
int i=0 , j=0,flag ;
fp4=fopen("chukudan.txt","r");//读取出库单文件信息
while(fscanf(fp4,"%d %d %d %d %d",&ostock[i].number,&ostock[i].iout,&ostock[i].year,&ostock[i].month,&ostock[i].day)!=EOF)
{
i++;
outcount++;//统计出库的信息量
}
//将出库月、量读入到chukuTJ结构体中
for(i=0;i<12;i++)
{
k=0;
for(j=0;j<outcount;j++)//
if(ostock[j].month-1==i)
{
chukuTJ[i].SPHao[k]=ostock[j].number;
chukuTJ[i].SPShu[k]=ostock[j].iout;
k++;
}
}
fclose(fp4);
int chukucount=0;//计数每月同一食品出库量
//打印出库信息
printf("出库月报表:\n");
for(i=0;i<12;i++)//1~12月
{
printf("----------%d月出库月报表:----------\n",i+1);
for(j=1;j<=100;j++)//食品号为1~100
{
flag=0,chukucount=0;
for(k=0;k<100;k++)//每个月中储存的食品信息量(最多100)
if(chukuTJ[i].SPHao[k]==j)
{
chukucount+=chukuTJ[i].SPShu[k];
flag=1;
}
if(flag==1)
printf("* 食品号为%d的出库量为;%d *\n",j,chukucount);
}
}
//入库月报表
int incount=0;//入库信息量
i=0;
fp3=fopen("rukudan.txt","r");
while((fscanf(fp3,"%d %d %d %d %d",&istock[i].number,&istock[i].iput,&stock[i].year,&istock[i].month,&istock[i].day))!=EOF)
{
incount++;
i++;
}
//将入库月、量转移到rukuTJ结构体中
for(i=0;i<12;i++)
{
k=0;
for(j=0;j<incount;j++)
if(istock[j].month-1==i)
{
rukuTJ[i].SPHao[k]=istock[j].number;
rukuTJ[i].SPShu[k]=istock[j].iput;
k++;
}
}
int rukucount=0;//入库量
fclose(fp4);
//打印入库信息
printf("\n入库月报表:\n");
for(i=0;i<12;i++)
{
printf("----------%d月入库月报表:----------\n",i+1);
for(j=1;j<=100;j++)//食品号为1~100
{
flag=0,rukucount=0;
for(k=0;k<100;k++)
if(rukuTJ[i].SPHao[k]==j)
{
rukucount+=rukuTJ[i].SPShu[k];
flag=1;
}
if(flag==1)
printf("* 食品号为%d的出库量为;%d *\n",j,rukucount);
}
}
fclose(fp3);
printf("按任意键继续_ _ _\n");
_getch();
system("cls");
menu();
}
int dc()//信息显示
{
system("cls");
time_t timetemp;//定义时间结构体变量
struct tm* p;//定义时一个结构体指针
time(&timetemp);
p=localtime(&timetemp);//获取当前时间
int nowmonth=1+p->tm_mon,nowyear=1900+p->tm_year;//nowmonth、nowyear为当前月、年
printf("================================\n");
printf("********显示食品信息************\n");
printf("****红色表示该食品库存少于10****\n");
printf("****蓝色表示该库存入库时间大于六个月****\n");
printf("****黄色表示该食品库存少于10且入库时间大于六月*****\n");
printf("===================================================\n");
int i = 0,imax=0,j,summonth=0;
int warn=10;//库存警告值
FILE* fp;
imax=COUNT();
printf("食品号\t名称\t食品类别 库存量 单价\t入库时间 \n");
for(i=0;i<imax;i++)
{
summonth=0;
for(j=0;j<nowyear-stock[i].year;j++)
{
summonth+=13-stock[i].month;
}
summonth+=nowmonth;//入库月距今月差
if(stock[i].amount<=warn&&summonth>6)//如果库存少且入库时间大于6个月
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);//显示黄色
printf(format3, data1);
}
else if(stock[i].amount<=warn)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);//显示红色
printf(format3, data1);
}
else if(summonth>6)//如果入库月距离本月大于6个月
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE);//显示蓝色
printf(format3, data1);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);//显示白色
printf(format3,data1);
}
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);//显示白色
printf("按任意键继续\n");
_getch();
system("cls");
menu();
}
void sc()
{
system("cls");
printf("*******************************\n");
printf("**********删除食品信息*********\n");
printf("*******************************\n");
FILE* fp;
int i = 0,number,index = 0;
int imax = COUNT();
char ch;
again:
printf("* 请输入要删除食品的食品号 *\n");
scanf("%d", &number);
for (i = 0; i < imax; i++)
{
if (number == stock[i].number)
{
index = i;
printf("食品号\t名字\t类别\t库存\t价格\t入库时间\n");
printf(format3,data1);
printf("找到了所要删除的信息\n你是否(y/Y N/n)要删除,输入0返回主菜单\n");
getchar();
ch = getchar();
if (ch == 'Y' || ch == 'y')
{
for (i = 0; i < imax; i++)
{
if (i < index)
stock[i].number = stock[i].number;
else
stock[i] = stock[i + 1];
}
fp = fopen("ship1.txt", "w");
for (i = 0; i < imax - 1; i++)
{
fprintf(fp, format1, data1);
}
fclose(fp);
printf("删除成功- - -按任意键返回\n");
_getch();
system("cls");
menu();
}
else if (ch == '0')
{
printf("按任意键返回_ _ _\n");
_getch();
system("cls");
menu();
}
else
{
printf("* 请重新输入删除的信息 *\n");
goto again;
}
return;
break;
}
}
printf("没有此信息- - -按任意键返回上一级\n");
_getch();
system("cls");
menu();
}
void endmenu()
{
system("cls");
printf("================================\n");
printf("*********感 谢 使 用*********\n");
printf("================================\n");
}