C语言-餐饮管理系统

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define N sizeof(user) 
#define M sizeof(table) 
#define T sizeof(order) 
#define S sizeof(menu) 

typedef struct User{
	char username[12];//账号 
	char password[18];//密码
	int vip;//1为会员  0不是
	int adm;//administrator同上
	//或将以上的采用数据域的方式存储 
	struct User* next; 
}user; //注意初始化 ,可以写一个初始化函数  借鉴7月9号的笔记中的“初始化” 


typedef struct Menu{
	int num;//1~10为热菜  11~20为冷菜  21~25为饮料 
	char name[20];
	int price;
	struct Menu* next; 
}menu;


typedef struct Table{
	int number;
	int is_blank;
	int peoplenum;
	struct Order* ordert;//接该桌的订单的头结点 
	int price;//该桌的总价 
	struct Table* next; 
}table; 


typedef struct Order{
	int number;//菜的编号
	char name[20];
	int copies;//菜的份数
	int price;
	int xiaoji;
	struct Order* next; 
}order;


//以下为自定义函数
void welcome();
int ORDER(order* head);//点菜函数 
//void reg();//注册函数 
void login();
void logon();
void show();//显示菜单函数 
void client();//客户函数 
void look_amend();//查看修改函数 
void add();//加菜函数 
void cancel();//取消菜函数 
int priceall();//计算总价函数 
void getpassword(char password[18],char againpassword[18]);
int is_password_same(char password[18],char againpassword[18]);
void save_user(user* p);
menu* ffmenuhot();
menu* ffmenucold();
menu* ffmenudrink();
table* fftable();
void resave_table(table* head);



table* fftable()
{
	FILE *fp1;       //文件指针 
	int n = 0;
	table* head = NULL;
	table* q;
	table* p;
	//system("md E:\\canyin\\table");
	fp1 = fopen("E:\\canyin\\table\\table.txt","a+");     //以只读的方式打开文件 
	if(fp1 == NULL)
	{
		printf("文件打开失败\n");
		//getchar();
		//exit(0);
	}
	else
	{
		while(!feof(fp1))        //判断文件位置标志是否移动到文件末尾 
		{
		    n ++;
		   	p = (table*)malloc(sizeof(table)); //向内存申请一段空间 
		    //fread(p, N, 1, fp1);     //将fp所指向的文件中的内容赋给p
			fscanf(fp1,"%d %d %d %d %d", &p->number , &p->is_blank , &p->peoplenum , &p->price , &p->ordert ); 
		    if(n == 1)
		    {
		      	head = p;
		      	q = p;
		    }
		    else             //创建链表 
		    {
		    	q->next = p;
		    	q = p;
			}
	    }
	    q->next = NULL;
	}
    fclose(fp1);    //关闭文件 
    return head;   //返回头指针 
}



void resave_table(table* head)
{
	table* p;
	p = head;
	//system("md E:\\canyin\\table");
	FILE *file;       //文件指针 
	file = fopen("E:\\canyin\\table\\table.txt","wb+");    //以追加的方式打开文件 
	if(file == NULL)
	{
		printf("文件打开失败\n");
	}
	///if(fwrite(p, N, 1, fp)!=1)    //将p所指向的1个大小为N的数据结构写入fp所指向的文件中 
	//{
		//printf("文件写入失败\n");
	while(p->next != NULL)
	{
	    fprintf( file ,"%d %d %d %d %d \n", p->number, p->is_blank , p->peoplenum , p->price , p->ordert);
	    p=p->next;
	}
	//}
	fclose(file);        //关闭文件 
}



void client()
{
	order* orderh;
	orderh=(order*)malloc(sizeof(order));
	int tablenum;
	printf("当前可选择的桌位有:\n");
	table* head;
	table* p;
	head = (table*)malloc(sizeof(table));
	p = (table*)malloc(sizeof(table));
	head = fftable();
	p = head;
	while(p->next != NULL)
	{
		if(p->is_blank==0)
		    printf("%d号\t",p->number);
	}
	printf("请选择你的桌位号:");
	scanf("%d",&tablenum);
	p = head;
	while(p->number == tablenum)
	{
		p->is_blank = 1;
		p->ordert = orderh;
		break;
	}
    //确定座位号 
	//char a;
	/* 
	printf("1.点菜");
	printf("2.查看已点的菜"); 
	scanf("%s",&a);
	switch(a)
	{
		case'1':order();break;//调用点菜函数 
		case'2':look_amend();break;//调用查看函数
		default:printf("请输入正确的选项!");break; 
	 } */
	 printf("请点菜:\n");
	 p->price = ORDER(orderh);
	 resave_table(head); 
}


int ORDER(order* head)
{
	menu* hot;
	menu* cold;
	menu* drink;
	int copies;
	int i=1;
	int priceall = 0;
	hot = ffmenuhot();
	cold = ffmenucold();
	drink = ffmenudrink();
	menu *h , *c , *d;
	show();//显示菜单函数 
	int numo; 
    printf("\n请输入你要点的菜的序号:(以#结束)"); 
    //将要点的菜加入订单链表中
    //order* head;
    order* p;
    order* q;
    head = (order*)malloc(sizeof(order));
    p = head;
    while(getch()!='#')
    {
    	printf("%d:",i);
    	scanf("%d",&numo);
    	printf("份数:");
    	scanf("%d",&copies);
    	h = hot;
    	c = cold;
    	d = drink;
    	while(h->next != NULL)
    	{
    		if(h->num==numo)
    		{
    			//p = (order*)malloc(sizeof(order));
    			q = (order*)malloc(sizeof(order));
    			q->next = NULL;
    			p->number = h->num;
    			strcmp(p->name , h->name );
    			p->price = h->price;
    			p->copies = copies;
    			p->next = q;
    			q = p;
    			priceall = priceall + copies*(h->price);
    			break;
			}
		}
		
		while(c->next != NULL)
    	{
    		if(c->num==numo)
    		{
    			//p = (order*)malloc(sizeof(order));
    			q = (order*)malloc(sizeof(order));
    			q->next = NULL;
    			p->number = c->num;
    			strcmp(p->name , c->name );
    			p->price = c->price;
    			p->copies = copies;
    			p->next = q;
    			q = p;
    			priceall = priceall + copies*(h->price);
    			break;
			}
		}
    	
    	while(d->next != NULL)
    	{
    		if(d->num==numo)
    		{
    			//p = (order*)malloc(sizeof(order));
    			q = (order*)malloc(sizeof(order));
    			q->next = NULL;
    			p->number = d->num;
    			strcmp(p->name , d->name );
    			p->price = d->price;
    			p->copies = copies;
    			p->next = q;
    			q = p;
    			priceall = priceall + copies*(h->price);
    			break;
			}
		}
		i++;
	}
    
    
	printf("\n点菜成功!"); 
	printf("您的订单总价是:%d",priceall);
	Sleep(10000);
	system("cls");
	return priceall;
	//look_amend();
}

void look_amend()
{
	char a; 
	printf("你点的菜是:\n");
	//将订单链表中的菜逐个输出 
	printf("1.添加菜品\n");
	printf("2.删除菜品\n");
	printf("3.确定\n"); 
	scanf("%s",&a);
	switch(a)
	{
		case'1':add();break;//调用加菜函数 
		case'2':cancel();break;//调用减菜函数
		case'3':priceall();break; 
		default:printf("请输入正确的选项!");break; 
	 } 
}

void add()
{
	show();
	printf("请输入你要加入的菜的序号:");
	//将菜加入订单链表
	printf("\n加菜成功!");
	Sleep(2000);
	system("cls"); 
	look_amend();
}


void cancel()
{
	printf("你点的菜是:");
	printf("\n请输入你要删除的菜的序号:");
	//将菜从订单链表中删除
	printf("\n取消成功!"); 
	Sleep(2000);
	system("cls"); 
	look_amend();
}

/*
void enter()//登录 
{ 
	printf("账号:\n"); 
	printf("密码:");
	//调用判断登录函数; 
	printf("\n登录成功!");
	Sleep(2000);
	printf("\n欢迎您!");//判断普通客户  会员  管理员 
	client();
}*/
/*
void login()
{
	printf("账号:\n"); 
	printf("密码:");
	//调用判断登录函数; 
	printf("\n登录成功!");
	Sleep(2000);
	printf("\n欢迎您!");//判断普通客户  会员  管理员 
	client();
}*/

/*
void reg()//注册函数 
{
	//注册账户 
	printf("注册成功!");
	Sleep(2000);
	system("cls");
	order();//调用点菜函数 
} */


void show()//显示 
{
	menu* p1;
	menu* p2;
	menu* p3;
	menu* headhot;
	menu* headcold;
    menu* headdrink;
	headhot = ffmenuhot();
	headcold = ffmenucold();
	headdrink = ffmenudrink();
	p1 = headhot;
	p2 = headcold;
	p3 = headdrink;
	printf("热菜:\n");
	printf("序号       菜名       价格\n"); 
	printf("%d %s %d \n", p1->num, p1->name  , p1->price);
	while(p1->next != NULL)
	{
	    printf("%d %s %d \n", p1->num, p1->name  , p1->price);
        p1=p1->next;
	}
	
	
	printf("冷菜:\n");
	printf("序号       菜名       价格\n");
	while(p2->next!=NULL)
	{
	    printf("%d %s %d \n", p2->num, p2->name  , p2->price);
        p2=p2->next;
	}
	
	printf("饮料:\n");
	printf("序号       菜名       价格\n"); 
	while(p3->next!=NULL)
	{
	    printf("%d %s %d \n", p3->num, p3->name  , p3->price);
        p3=p3->next;
	}
} 

 
int priceall()//合计价格 
{
	//计算总价并输出 
	printf("您订单的总价是:");
 	printf("\n请等待服务员为你上菜(如需修改请和服务员联系)");
} 


void welcome()
{
	system("cls");
	system("color 3E");
	printf("===============欢迎来到赣味客家餐馆管理系统===============\n\n\n\n");
	printf("\t 1.登录\n"); 
	printf("\t 2.注册\n");
	printf("请选择[1 2] : [   ]\b\b\b");
	int n;
	while(1)
	{
		scanf("%d",&n);
		switch(n)
		{
			case 1:
				login();//登录 
				break;
			case 2:
				logon();//注册 
				break;	
			default:
				break;
		}
	}
}

user* ff1()               //将存账号的文件里的内容输出到链表中
{
	FILE *fp1;       //文件指针 
	int n = 0;
	user* head = NULL;
	user* q;
	user* p;
	system("md E:\\canyin\\zhanghu");
	fp1 = fopen("E:\\canyin\\zhanghu\\zhanghu.txt","a+");     //以只读的方式打开文件 
	if(fp1 == NULL)
	{
		printf("文件打开失败\n");
		//getchar();
		//exit(0);
	}
	else
	{
		while(!feof(fp1))        //判断文件位置标志是否移动到文件末尾 
		{
		    n ++;
		   	p = (user*)malloc(N); //向内存申请一段空间 
		    //fread(p, N, 1, fp1);     //将fp所指向的文件中的内容赋给p
			fscanf(fp1,"%s %s %d %d",p->username ,p->password ,&p->vip ,&p->adm); 
		    if(n == 1)
		    {
		      	head = p;
		      	q = p;
		    }
		    else             //创建链表 
		    {
		    	q->next = p;
		    	q = p;
			}
	    }
	    q->next = NULL;
	}
    fclose(fp1);    //关闭文件 
    return head;   //返回头指针 
}

//从菜单文件中读取菜单 
menu* ffmenuhot()
{
	FILE *fp1;       //文件指针 
	int n = 0;
	menu* head = NULL;
	menu* q;
	menu* p;
	system("md E:\\canyin\\menu");
	fp1 = fopen("E:\\canyin\\menu\\hotcai.txt","a+");     //以只读的方式打开文件 
	if(fp1 == NULL)
	{
		printf("文件打开失败\n");
		//getchar();
		//exit(0);
	}
	else
	{
		while(!feof(fp1))        //判断文件位置标志是否移动到文件末尾 
		{
		    n ++;
		   	p = (menu*)malloc(sizeof(menu)); //向内存申请一段空间 
		    //fread(p, N, 1, fp1);     //将fp所指向的文件中的内容赋给p
			fscanf(fp1,"%d %s %d",&p->num ,p->name ,&p->price); 
		    if(n == 1)
		    {
		      	head = p;
		      	q = p;
		    }
		    else             //创建链表 
		    {
		    	q->next = p;
		    	q = p;
			}
	    }
	    q->next = NULL;
	}
    fclose(fp1);    //关闭文件 
    return head;   //返回头指针 
}


menu* ffmenucold()
{
	FILE *fp1;       //文件指针 
	int n = 0;
	menu* head = NULL;
	menu* q;
	menu* p;
	system("md E:\\canyin\\menu");
	fp1 = fopen("E:\\canyin\\menu\\coldcai.txt","a+");     //以只读的方式打开文件 
	if(fp1 == NULL)
	{
		printf("文件打开失败\n");
		//getchar();
		//exit(0);
	}
	else
	{
		while(!feof(fp1))        //判断文件位置标志是否移动到文件末尾 
		{
		    n ++;
		   	p = (menu*)malloc(sizeof(menu)); //向内存申请一段空间 
		    //fread(p, N, 1, fp1);     //将fp所指向的文件中的内容赋给p
			fscanf(fp1,"%d %s %d",&p->num ,p->name ,&p->price); 
		    if(n == 1)
		    {
		      	head = p;
		      	q = p;
		    }
		    else             //创建链表 
		    {
		    	q->next = p;
		    	q = p;
			}
	    }
	    q->next = NULL;
	}
    fclose(fp1);    //关闭文件 
    return head;   //返回头指针 
}


menu* ffmenudrink()
{
	FILE *fp1;       //文件指针 
	int n = 0;
	menu* head = NULL;
	menu* q;
	menu* p;
	system("md E:\\canyin\\menu");
	fp1 = fopen("E:\\canyin\\menu\\drink.txt","a+");     //以只读的方式打开文件 
	if(fp1 == NULL)
	{
		printf("文件打开失败\n");
		//getchar();
		//exit(0);
	}
	else
	{
		while(!feof(fp1))        //判断文件位置标志是否移动到文件末尾 
		{
		    n ++;
		   	p = (menu*)malloc(sizeof(menu)); //向内存申请一段空间 
		    //fread(p, N, 1, fp1);     //将fp所指向的文件中的内容赋给p
			fscanf(fp1,"%d %s %d",&p->num ,p->name ,&p->price); 
		    if(n == 1)
		    {
		      	head = p;
		      	q = p;
		    }
		    else             //创建链表 
		    {
		    	q->next = p;
		    	q = p;
			}
	    }
	    q->next = NULL;
	}
    fclose(fp1);    //关闭文件 
    return head;   //返回头指针 
}


void login()      // 账号登陆 
{ 
	system("cls");   //清屏 
	user* p;
	user* head;    
	head = ff1();
	p = head;
    //调用函数 ,返回值为头结点的指针
    /*
	p = head;
	while(p->next!=NULL)
	{
	    printf("%s %s %d %d\n", p->username ,p->password , p->vip, p->adm);
        p=p->next;
	}*/
    do{
	    char t, c, k, name1[12], password1[18];
	    int i = 0;
		printf("***************************\n\n\n\n");
		printf("\t\t     登陆状态       ");
		printf("请输入您的账号:");
		scanf("%s", name1);
		printf("请输入您的密码:");
		for(;;)              //此处为输入密码不回显操作 
		{
			k = getch();       //输入k 
			if(k == '\r')      //如果输入k为回车,则跳出循环 
			{
				break;
			}
			else if(k == '\b')  //如果输入k为删除键 
			{
				if(i > 0)       //如若密码还没完全删除 
				{
					printf("\b");
					printf(" ");
					printf("\b");
					i--;
				}
			}
			else              //如果输入的k既不是删除键,也不是回车键 
			{
				password1[i] = k;   //把k的值赋给_password[i]; 
				printf("*");      //输出*号,保护用户隐私 
				i ++;              //密码位数加1 
			}
		}
		password1[i] = '\0';
		while( (p != NULL) && (strcmp(p->username, name1) != 0) )   //遍历链表,寻找当前输入的账户的账号 
		{
			p = p->next;
		}
		if(p != NULL)   //如果p不为空 
		{
	    	if(strcmp(p->password, password1) == 0)     //如果输入的密码正确 
			{
				printf("正在登陆....\n");
				Sleep(500);      //暂停0.5秒
				system("cls");
				printf("登陆成功!\n");
				break;    //跳出循环
			}
			else      //如果输入的密码错误
			{ 
				printf("正在登陆....\n");
				Sleep(500);
				system("cls");
				printf("-------------------------\n");
				printf("|                       |\n");
				printf("| 密码错误!是否继续?  |\n");
				printf("| 1.是             2.否 |\n");
				printf("|                       |\n");
				printf("-------------------------\n");
				while(1)
				{
					t = getch();  //输入t    
					if(t == '1')          
					{
						system("cls");  //清屏 
						break;
					}
					else if(t == '2')     //如果输入t为n,进入开始界面 
					{
						welcome();
						break;
					}
				}
			} 
	   }
	   else              //如果p为空,即输入的账号不正确 
	   {
	   	    printf("正在登陆....\n");
	   	    Sleep(500);
	   	    system("cls");
	   	    printf("-------------------------\n");
	   	    printf("|                       |\n");
			printf("|  账号错误!是否继续? |\n");
			printf("|                       |\n");
			printf("|  1.是            2.否 |\n"); 
			printf("|                       |\n");
			printf("-------------------------\n");
			while(1)      //死循环防止其他按键干扰 
			{
				c = getch();
				if(c == '1')
				{  
					system("cls");
					break;
				}
				else if(c == '2')
				{
					welcome();
					break;
				}
			}
	   }
    }while(1);      //永远为真 
   	Sleep(500);      //暂停0.5秒 
   	client();
   	//menu();         //账号密码均正确,进入主菜单 
}





void logon()        //注册账号 
{	
    //system("md E:\\canyin\\zhanghu");
	system("cls");
	user* p; 
	p = (user*)malloc(N);     //向内存申请一段空间 
	p->next==NULL;
	//do
	//{
		char name[12],password[18],againpassword[18],c,k;
		int i = 0; 
		printf("赣味客家餐饮管理系统\n");
		printf("**************************\n");
		printf("请输入账号(手机号):\n");
		scanf("%s",name);
		//printf("请输入密码:\n");
		for(;;)              //此处为输入密码不回显操作 
		{
			getpassword(password,againpassword);
		    if(is_password_same(password,againpassword)==1);
		//if(strcmp(password, againpassword) == 0)        //如果输入的两次密码均正确 
		    {
			    strcpy(p->username, name);
			    strcpy(p->password, password);
			    printf("\n是否注册为会员(0.否,1.是)");
			    scanf("%d", &p->vip);
			    printf("\n是否注册为管理员(0.否,1.是)"); 
			    scanf("%d", &p->adm); 
			    printf("正在注册....\n");
			    save_user(p);
			    Sleep(500);
			    system("cls");
			    printf("注册成功!\n");
			    Sleep(500);         //暂停0.5秒 
			    break;              //跳出循环 
		    }
		/*
		else    //如果输入的两次密码不同 
		{
			printf("正在注册....\n");
			Sleep(500);
			system("cls");
			printf("-----------------------------");
			printf("|                           |");
			printf("|  注册失败!两次密码不统一,是否继续注册? |");
			printf("|                           |");
			printf("|  1.是               2.否  |"); 
			printf("|                           |");
			printf("-----------------------------");
			while(1)
			{
				c = getch();
				if(c == '1')
				{
					system("cls");
					//logon();
					
					break;
				}
				else if(c == '2')
				{
					welcome();
					break;
				}
			}
		}*/
	}
	//}while(1);    //永远为真 
	printf("正在自动为您登陆....\n");
	Sleep(500);
	printf("\n登录成功!");
	Sleep(2000);
	printf("\n欢迎您!");//判断普通客户  会员  管理员 
	client();
	//login();
}

void getpassword(char password[18],char againpassword[18])
{
	char k;
	int i=0;
	printf("请输入密码:\n");
		for(;;)              //此处为输入密码不回显操作 
		{
			k = getch();       //输入k 
			if(k == '\r')      //如果输入k为回车,则跳出循环 
			{
				break;
			}
			
			else if(k == '\b')  //如果输入k为删除键 
			{
				if(i > 0)       //如若密码还没完全删除 
				{
					printf("\b");
					printf(" ");
					printf("\b");
					i --;
				}
			}
			
			else              //如果输入的k既不是删除键,也不是回车键 
			{
				password[i] = k;   //把k的值赋给_password[i]; 
				printf("*");      //输出*号,保护用户隐私 
				i ++;              //密码位数加1 
			}
		}
		
		password[i] = '\0';
		i = 0;
		printf("\n请确认您的密码:\n");
		for(;;)              //此处为输入密码不回显操作 
		{
			k = getch();       //输入k 
			if(k == '\r')      //如果输入k为回车,则跳出循环 
			{
				break;
			}
			else if(k == '\b')  //如果输入k为删除键 
			{
				if(i > 0)       //如若密码还没完全删除 
				{
					printf("\b");
					printf(" ");
					printf("\b");
					i --;
				}
			}
			else              //如果输入的k既不是删除键,也不是回车键 
			{
				againpassword[i] = k;   //把k的值赋给_password[i]; 
				printf("*");      //输出*号,保护用户隐私 
				i++;              //密码位数加1 
			}
		}
		againpassword[i] = '\0';
}


int is_password_same(char password[18],char againpassword[18])
{
	char c;
	if(strcmp(password, againpassword) != 0)
	{
		{
			printf("正在注册....\n");
			Sleep(500);
			system("cls");
			printf("-----------------------------");
			printf("|                           |");
			printf("|  注册失败!两次密码不统一,是否继续注册? |");
			printf("|                           |");
			printf("|  1.是               2.否  |"); 
			printf("|                           |");
			printf("-----------------------------");
			while(1)
			{
				c = getch();
				if(c == '1')
				{
					system("cls");
					//logon();
					getpassword(password,againpassword);
					break;
				}
				else if(c == '2')
				{
					return 0;
					welcome();
					//break;
				}
			}
		}
	}
	else
	    return 1;
}

void save_user(user* p)
{
	system("md E:\\canyin\\zhanghu");
	FILE *file;       //文件指针 
	file = fopen("E:\\canyin\\zhanghu\\zhanghu.txt","a");    //以追加的方式打开文件 
	if(file == NULL)
	{
		printf("文件打开失败\n");
	}
	///if(fwrite(p, N, 1, fp)!=1)    //将p所指向的1个大小为N的数据结构写入fp所指向的文件中 
	//{
		//printf("文件写入失败\n");
	fprintf( file ,"%s %s %d %d\n", p->username , p->password , p->vip , p->adm );
	//}
	fclose(file);        //关闭文件 
}



int main()
{
	/*
	char a;
	printf("欢迎进入餐饮管理系统!"); 
	Sleep(2000);//暂停1s
	system("cls");
	printf("1.登录");
	printf("2.注册"); 
	scanf("%s",&a);
	switch(a)
	{
		case'1':enter();break;//调用登录函数 
		case'2':reg();break;//调用注册函数
		default:printf("请输入正确的选项!");break; 
	 } */
	 welcome();//调用登陆函数 
 } 
 

这是以前写的餐饮管理系统,和大佬们没得比,可以参考一下,因为是以前写的所以文件找不到了,可以自己把文件部分修改一下重新创建即可 

C语言-餐饮管理系统 

C语言-餐饮管理系统

上一篇:VS C++ WChar*转Char*


下一篇:替换空格JS