仓库管理系统C语言

先创建两个文件,管理员信息.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 仓库管理系统");
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值