先创建两个文件,管理员信息.txt, 货物信息.txt
管理员经理的账号:1 密码:1 (代码可改)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
typedef struct goods//定义货物的结构体
{
int num;
char name[200];
float price;
int number;
struct goods *next;
}stu;
typedef struct User//定义管理员的结构体
{
char name[200];//姓名
char pwd[200];//密码
struct User *unext;
}user;
stu *head=(stu*)malloc(sizeof(stu));//货物的头
user *uhead=(user*)malloc(sizeof(user));//管理员的头
void main1();
void enter(stu*head); //录入货物信息并且到文件
void select(stu*head);//查找货物 按照货物数量从大到小
void quit();//退出系统
void output();//输出货物信息
void sort();//对货物数量冒泡排序
void Delete();//删除货物信息
void change();//改动货物信息
void denglu1();//登录
void denglu2(); //登录
void writefile(int flag);//将内容写入文件
void Register();//注册管理员
void menu();//管理员的菜单函数
void readfile();//读取文件
void output1();//按数量排序浏览
void outgoods();//出库
void denglu0();//总管登录
void manager1();//总管登录界面
void manager2();//管理管理员的页面
void readuser();//浏览管理员信息
void adduser();//增加管理员的信息
void Deleteuser();//删除管理员的信息
void sumprice();//算价格总和
void menu1();//显示管理员的功能菜单
void system();
void manager22();
void denglu00();
void denglu11();
void main11();
int main()
{
system();
head->next = NULL;
readfile();
main1();
return 0;
}
void Deleteuser()
{
printf("请输入你要删除的管理员姓名:\n");
char name[20];
scanf("%s",name);
int flag=1;
user *p=uhead;
FILE *fp=fopen("管理员信息.txt","r");
while(!feof(fp))
{
p->unext=(user*)malloc(sizeof(user));
p=p->unext;
fscanf(fp,"%s %s ",p->name,p->pwd);
p->unext=NULL;
}
fclose(fp);
p=uhead->unext;
user *q=uhead;
while(p != NULL)
{
if(strcmp(p->name,name) == 0)
{
q->unext=p->unext;
free(p);
flag=0;
printf("删除成功\n");
break;
}
q=q->unext;
p=p->unext;
}
if(flag == 1 )
{
printf("未找到该管理员删除失败\n");
return ;
}
FILE *fw=fopen("管理员信息.txt","w");
q = uhead->unext;
while(q != NULL)
{
fprintf(fw,"%s %s ",q->name,q->pwd);
q =q->unext;
}
fclose(fw);
}
void adduser()
{
char name[20];
char password[20];
printf("请输入要增加的管理员名:\n" );
scanf("%s",name);
printf("请输入密码\n" );
scanf("%s",password);
user *p=uhead;
/*查重*/
FILE *fp=fopen("管理员信息.txt","r");
while(!feof(fp))
{
p->unext=(user *)malloc(sizeof(user));
p=p->unext;
fscanf(fp,"%s %s ",p->name,p->pwd);
p->unext=NULL;
}
fclose(fp);
p=uhead->unext;
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
printf("该管理员已存在请重新输入!\n");
printf("请输入要增加的管理员名:\n" );
scanf("%s",name);
printf("请输入密码\n");
scanf("%s",password);
continue;
}
p=p->unext;
}
FILE *fw=fopen("管理员信息.txt","a+");
if(fw==NULL)
{
printf("文件打开失败!");
exit(0);
}
else
{
fprintf(fw,"%s %s ",name,password);
printf("\n添加成功!");
}
fclose(fw);
}
void readuser()
{
FILE *fp=fopen("管理员信息.txt","r");
user *p=uhead;
char ch;
ch=fgetc(fp);
if(ch==EOF)
{
printf("无管理员信息!");
return ;
}
rewind(fp);
while(!feof(fp))
{
p->unext=(user *)malloc(sizeof(user));
p=p->unext;
fscanf(fp,"%s %s ",p->name,p->pwd);
p->unext=NULL;
}
fclose(fp);
p=uhead->unext;
printf("姓名\t密码\n");
while(p != NULL)
{
printf("%s\t%s\n",p->name,p->pwd);
p = p->unext;
}
return;
}
void manager1()//经理登录操作
{
char name[20];
printf("请输入账户:\n");
scanf("%s",name);
printf("\n");
printf("请输入密码:\n");
char a[20];
char c;
int i;
while((c=getch())!='\r') /*输入密码以及回删*/
{
if(c!='\b')
{
printf("*");
a[i]=c;
i++;
}
else if(i!=0)
{
printf("\b \b");
i--;
}
}
a[i]='\0';
printf("\n");
if(strcmp(name,"1")==0 && strcmp(a,"1")==0)//经理的密码
{
printf("登录成功!");
system("pause");
system("cls");
manager2();//执行经理的功能
}
else
{
printf("登陆失败!");
}
}
void manager22()
{
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 ****************************************\n");
printf("\n\n请选择:");
}
void manager2()
{
while(1)
{
manager22();
int num;
scanf("%d",&num);
fflush(stdin);
switch(num)
{
case 1:
readuser();
system("pause");
system("cls");
break;
case 2:
adduser();
system("pause");
system("cls");
break;
case 3:
Deleteuser();
system("pause");
system("cls");
break;
case 4:
system("cls");
denglu0();
break;
case 5:
quit();
break;
default:
printf("无效输入!");
system("pause");
system("cls");
denglu1();
}
}
}
void denglu00()
{
printf("\t **********************仓库经理页面*******************\n");
printf("\t * 1.登录 *\n");
printf("\t * 2.返回 *\n");
printf("\t * 3.退出 *\n");
printf("\t *****************************************************");
printf("\n\n请选择:");
}
void denglu0()//仓库总管登陆页面
{
while(1)
{
denglu00();
int num;
scanf("%d",&num);
fflush(stdin);
switch(num)
{
case 1:
manager1();
system("pause");
system("cls");
break;
case 2:
system("cls");
main1();
break;
case 3:
quit();
break;
default:
printf("无效输入!");
system("pause");
system("cls");
}
}
}
void outgoods()
{
stu *p=head;
p=head->next;
printf("请输入你要出库的货物编号:\n");
int n;
scanf("%d",&n);
fflush(stdin);
while(p != NULL)
{
if(p->num == n)
{
printf("请输入要出库的货物数量:\n");
int m;
scanf("%d",&m);
if((p->number-m) <0)
{
printf("货物数量不足!\n");
return ;
}
else
{
p->number=p->number-m;
printf("出库成功\n");
writefile(1);
return ;
}
}
p = p->next;
}
printf("未找到该货物编号出库失败\n");
return ;
}
void Register()
{
user *uhead=(user*)malloc(sizeof(user));
uhead->unext=NULL;
user *p = uhead;
p->unext=(user*)malloc(sizeof(user));//用链表存储管理员的信息
p=p->unext;
printf("请输入要注册的管理员名:\n" );
scanf("%s",p->name);
printf("请输入密码\n" );
scanf("%s",p->pwd);
FILE *fw=fopen("管理员信息.txt","r");
if(fw==NULL)
{
printf("文件打开失败!");
exit(0);
}
user *q=uhead;//让q指向头
while(!feof(fw)) //打开文件读取
{
q->unext=(user*)malloc(sizeof(user));
q->unext->unext=NULL;//创建完节点后赋空
q=q->unext;
fscanf(fw,"%s %s ",q->name,q->pwd);//用链表来存储读取到的内容
if(strcmp(q->name,p->name) == 0)//判断管理员姓名是否被注册过
{
printf("管理员姓名重复请重新输入\n");
system("pause");
return;
}
}
fclose(fw);
//和之前的信息比较是否重复
//判断是否重复到此结束
//把管理员的信息录入文件
FILE *fp=fopen("管理员信息.txt","a+");
if(fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
else
{
fprintf(fp,"%s %s ",p->name,p->pwd);
}
fclose(fp);
system("pause");
system("cls");
}
void enter()//录入货物信息
{
stu *p=head;
int n;
printf("请输入要录入的货物个数:");
scanf("%d",&n);
while(p->next!=NULL)//遍历链表
{
p=p->next;
}
stu *q=p;//用q去记录链表的最后一个节点
for(int m = 0; m < n; m ++)
{
int flag = 0;
printf("请输入编号 \n");
int num;
scanf("%d",&num);//先输入一个号等会儿在赋值
p=head;//把p重新指向头
if(p->next!=NULL)//判断当前链表是否有数据
{
while(p->next!=NULL)//如果有数据的话就判断是否重复
{
if(p->next->num == num)//判断是否重复了
{
printf("编号重复!请重新输入!\n");
flag = 1;
m --;//为了一直判断是否重复-1+1不变
break;
}
p=p->next;//指针移动
}
}
if (flag == 0)//如果没有重复的话
{
q->next=(stu *)malloc(sizeof(stu));//给尾节点的下一个节点开劈空间
q->next->num = num;//把输入的编号给链表的值
printf("请输入名称\n");
scanf("%s",q->next->name);
printf("请输入价格\n");
scanf("%f",&q->next->price);
while (1)
{
if (q->next->price <= 0)
{
printf("请输入大于零的货物价格!\n");
scanf("%f",&q->next->price);
}
else
{
break;
}
}
printf("请输入货物数量\n");
scanf("%d",&q->next->number);
while (1)
{
if (q->next->number <= 0)
{
printf("请输入大于零的货物数量!\n");
scanf("%d",&q->next->number);
}
else
{
break;
}
}
}
if (flag == 0)//如果不重复的话指针移动
{
q=q->next;
q->next=NULL;
}
}
printf("\n货物信息已经录入完毕!");
writefile(1);
return ;
}
void writefile(int flag)//把信息存入文件
{
FILE *fp;
if (flag == 1)
{
fp=fopen("货物信息.txt","w");
if(fp==NULL)
{
printf("文件打开失败!");
return ;
}
for(stu *m=head->next;m!=NULL;m=m->next)
{
fprintf(fp,"%d %s %f %d\n",m->num,m->name,m->price,m->number);
}
}
else
{
fp=fopen("货物信息.txt","a+");
if(fp==NULL)
{
printf("文件打开失败!");
return ;
}
for(stu *m=head->next;m!=NULL;m=m->next)
{
fprintf(fp,"%d %s %f %d\n",m->num,m->name,m->price,m->number);
}
}
fclose(fp);
}
void readfile()//从文件中读取数据并创建链表
{
FILE *fp=fopen("货物信息.txt","r");
stu *p=head->next;
while(!feof(fp))
{
p=(stu*)malloc(sizeof(stu));
fscanf(fp,"%d %s %f %d\n",&p->num,p->name,&p->price,&p->number);
p=p->next;
}
fclose(fp);
}
void output()//显示货物信息的函数
{
FILE *fp=fopen("货物信息.txt","r");
char ch;
ch =fgetc(fp);
if( ch == EOF )
{
printf("无信息\n");
return;
}
rewind(fp);
printf("正在检索请等待\n");
printf("编号\t名称\t价格\t数量\n");
stu *p=head->next;
while(p != NULL)
{
printf("%d\t%s\t%.1f\t%d\n",p->num,p->name,p->price,p->number);
p=p->next;
}
printf("已显示全部库存!");
return ;
}
void output1()
{
sort();
printf("正在检索请等待\n");
printf("编号\t名称\t价格\t数量\n");
stu *p=head->next;
while(p != NULL)
{
printf("%d\t%s\t%.1f\t%d\n",p->num,p->name,p->price,p->number);
p=p->next;
}
printf("已显示全部库存!");
return ;
}
void sort()//冒泡按照库存数量
{
stu *f, *p, *x, *y;
f = NULL;
//判断是否只有一个元素或者没有元素
if(head -> next == NULL || head -> next -> next == NULL)
{
return;
}
while(f != head->next->next)//外层判断少一次循环
{
for(p = head; p -> next -> next != f; p = p -> next)
{
if(p -> next -> number > p -> next -> next ->number)
{
x = p -> next;//x和y首先指向这两个要交换的节点
y = p -> next -> next;
p -> next = y;//交换三部曲
x -> next = y -> next;
y -> next = x;
}
}
f = p -> next;//把 f 往前移
}
return ;
}
void select()//查询货物的函数
{
stu *p=head->next;
printf("请输入你要查询的货物编号:\n");
int n;
scanf("%d",&n);
fflush(stdin);
while(p!=NULL)
{
if(p->num == n)
{
printf("找到该货物!\n");
printf("编号\t名称\t价格\t数量\n");
printf("%d\t%s\t%.1f\t%d\n",p->num,p->name,p->price,p->number);
printf("\n");
return ;
}
p=p->next;
}
printf("\n未找到该货物!");
return ;
}
void change()//改动货物
{
stu*p=head;
p=head->next;
printf("请输入你要改动的货物编号:\n");
int n;
scanf("%d",&n);
fflush(stdin);
int flag=1;//用flag判断是否改动成功
while(p!=NULL)
{
if(p->num == n)
{
printf("请输入要改动的货物数据:\n");
scanf("%d %s %f %d",&p->num,p->name,&p->price,&p->number);
printf("改动成功\n");
flag=0;
writefile(1);
return ;
}
p=p->next;
}
if(flag==1)
{
printf("未找到该货物编号改动失败\n");
return ;
}
}
void quit()//退出系统
{
int a=3;
printf(" 秒后关闭程序");
while(--a>=1)
{
printf("\r%d",a);
printf("\b");
Sleep(1000);
}
system("cls");
printf("感谢您的使用!再见\n");
exit(0);
}
void Delete()//删除货物的函数
{
printf("请输入你要删除的货物编号:\n");
int n;
scanf("%d",&n);
fflush(stdin);
stu *q=head;
int flag=1;//用flag判断是否删除成功
while(q->next != NULL)
{
if(q->next->num==n)
{
q->next=q->next->next; //如果q的下一个节点是要找的编号那么把q->next赋值为下下个
flag=0;
printf("删除成功\n");
writefile(1);
return ;
}
q=q->next;
}
if(flag == 1 )
{
printf("未找到该货物删除失败\n");
return ;
}
}
void denglu2()
{
char password[200];
char users[200];
int flag=1,i;
FILE *fw=fopen("管理员信息.txt","r");//读取之前的管理员信息
if(fw == NULL)
{
printf("文件读取失败!");
return ;
}
char ch;
ch=fgetc(fw);
if(ch==EOF)
{
printf("无信息!");
return ;
}
rewind(fw);
printf("管理员姓名:\n");
user *p = uhead;
scanf("%s",users);
printf("管理员密码:\n");
char a[20];
char c;
while((c=getch())!='\r') /*输入密码以及回删*/
{
if(c!='\b')
{
printf("*");
a[i]=c;
i++;
}
else if(i!=0)
{
printf("\b \b");
i--;
}
}
a[i]='\0';
printf("\n");
while(!feof(fw))
{
p->unext=(user*)malloc(sizeof(user));
p->unext->unext=NULL;
p=p->unext;
fscanf(fw,"%s %s ",p->name,p->pwd);//提取信息到链表中
}
p=uhead->unext;
while(p!=NULL)
{
if(strcmp(p->name,users) == 0&&strcmp(a,p->pwd) == 0 )
{
printf("登录成功!\n");
system("pause");
system("cls");
menu();
}
p=p->unext;
}
printf("登陆失败!");
}
void menu1()
{
printf("\t\t仓库货物管理系统\n");
printf("\t *************************MENU**********************\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 * 8.统计价格总和 *\n");
printf("\t * 9.返回 *\n");
printf("\t * 0.退出系统 *\n");
printf("\t ***************************************************\n\n");
printf("请选择:");
}
void menu()
{
int a;
while(1)
{
menu1();
scanf("%d",&a);
fflush(stdin);
switch (a)
{
case 1:
enter();
system("pause");
system("cls");
break;
case 2:
output();
system("pause");
system("cls");
break;
case 3:
select();
system("pause");
system("cls");
break;
case 4:
change();
system("pause");
system("cls");
break;
case 5:
Delete();
system("pause");
system("cls");
break;
case 6:
output1();
system("pause");
system("cls");
break;
case 7:
outgoods();
system("pause");
system("cls");
break;
case 8:
sumprice();
system("pause");
system("cls");
break;
case 9:
system("cls");
denglu1();
break;
case 0:
quit();
break;
default:
printf("输入无效!");
system("pause");
system("cls");
break;
}
}
}
void sumprice()
{
stu *q=head->next;
float n=0;
while(q != NULL)
{
n = n + (q->price * q->number);
q = q->next;
}
printf("所有货物总价格为:\n");
printf("%.1f",n);
printf("\n");
}
void denglu11()
{
printf("\t **********管理员注册登录页面**********\n");
printf("\t * 1.登录 *\n");
printf("\t * 2.注册 *\n");
printf("\t * 3.返回 *\n");
printf("\t * 4.退出 *\n");
printf("\t **************************************\n");
printf("\n\n请选择:");
}
void denglu1()//管理员 界面
{
while(1)
{
system("cls");
system("date/t");
system("time/t");
denglu11();
int num;
scanf("%d",&num);
fflush(stdin);
switch(num)
{
case 1:
denglu2();
system("pause");
system("cls");
break;
case 2:
Register();
break;
case 3:
system("cls");
main1();
break;
case 4:
quit();
break;
default:
printf("无效输入!");
system("pause");
system("cls");
}
}
}
void main11()
{
printf(" 仓库货物管理系统\n");
printf(" ****************************MENU****************************\n");
printf(" * 1.管理经理登录 *\n");
printf(" * 2.管理员 *\n");
printf(" * 3.退出 *\n");
printf(" ************************************************************\n");
printf("\n\n请选择:");
}
void main1()
{
while(1)
{
main11();
int num;
scanf("%d",&num);
fflush(stdin);
if(num==1)
{
system("cls");
denglu0();//经理登录
}
else if(num==2)
{
system("cls");
denglu1();//管理员登录
}
else if(num==3)
{
quit();
}
else
{
printf("无效输入!");
system("pause");
system("cls");
}
}
}
void system()
{
system("color f1");
system("date/t");
system("time/t");
system("title 仓库管理系统");
}