饭店管理系统

一个简易的饭店管理系统——cpp课程设计

//core.cpp
#include<iostream>
#include<string>
#include<utility>
#include<vector>
#include<fstream> 
#include<sstream>
#include<cstring>
using namespace std;
#define STAR  "*******************************************************************************************"
#define SPACE "                                                                                           "
#define HELLO "*********************************欢迎来到饭店管理系统**************************************"
#define TOPSPINE "********************************食材表***************************************************"
#define LOGIN "**************************************管理员登录*******************************************"
#define CHOOSE "请选择要进行的操作(按0退出)"
//#define NULL 0
#define MaxAmount 500 //最大库存容量 500斤 
#define SumTable 100

class goods {//商品类 
	protected:
		int no;//编号 
		string name; //名称 
		double price;//单价:元/斤 or 元/份 
	public: 
		goods();
		goods(int n_,string n,double a);
		int getno();
		string  getname();
		double getprice();
		~goods();
};

class food_material:public goods { //食材 
	protected:
		double amount;// 量 单位:斤 
	public:
		food_material();
		food_material(int n_,const string  n,double a,double b);
		~food_material();
		double getamount();
		void addamount(double a);//增加amount 
		friend class fstream;
		friend class manager;
		static double sumamount;
};

class dishes:public goods {
	protected:
	public:	
		vector<pair<food_material *,double> > Ingredientsvec;//制作一份dish所需的成分表 每一个食材(food_material)对应一个用量(double) 
		dishes();
		dishes(int n_,const string  n,double a,vector<pair<food_material *,double> > b);
		~dishes();
		friend class fstream;
		friend class manager;
};

class user {
	protected:
		int no; 
		int username;//6位纯数字 
		int psword;//6位纯数字
	public:
		user();
		user(int a,int b,int c);
		int getno();
		int getusername();
		int getpsword();
};

class manager:public user {//管理员 
	protected:
		vector<food_material> vecmaterial;//记录可进食材的vector 
		vector<dishes> vecdishes;//记录菜品的vector 
	public:
		manager();
		manager(int a,int b,int c);
		void showmaterial();//显示食材列表
		void showdishes();//显示菜品列表
		void showtables();//显示餐桌使用情况 
		void order_dishes();//点菜 
		void purchase_materials();//进货 
		void count_materials();//统计现有食材 
		void Calculating_turnover();//统计流水 
};

class table {//餐桌 
	protected:
		int no;
		double pay;//消费总金额 
	public:
		bool isused;//此桌是否正在使用 
		table();
		table(int a);
		int getno();
		double getpay();
		void addpay(double a);//pay+=a 
		void startuse();//开始使用 
		void finishuse();//结束使用 
}; 

class order {//订单or发票
private:
    static int ordercount;//自动增加订单编号
    int orderID;//订单编号
    int tableID;//餐桌编号
    int listcount;//点菜数量
	double pay; 
    vector<pair<dishes,int> > ordervec;//记录pair<菜品,份数>的vector
public:
    order() {}
    order(int a);
    void orderonedish(const dishes &a,int b);//点b份菜品a 
    void display();//显示订单信息 
    void displaydishes();//显示本订单所购的菜品名和对应份数 
    void setpay(double a); 
    double getpay();
};


class RestuarantManage {
	protected:
	public:
		vector<food_material *> fptr;
		vector<dishes *> dptr;
		vector<table *> tptr;
		vector<order *> optr;
//		table t[SumTable];
		user * queryuser(int a,int b);//管理员身份验证,若验证成功返回一个指向user对象的指针,反正返回指向NULL的指针 
		user * login();//登录,并返回一个指向user的指针 
		void showmenu();//显示主系统菜单 
		void menu();//主系统 
	    bool check_inventory(int a,int b);//检查制作b份编号为a的菜品所需的食材是否充足 
	    void use_inventory(int a,int b); //消耗制作b份编号为a的菜品所需的食材
	    void init();//初始化 vector<food_material *> fptr;vector<dishes *> dptr;vector<table *> tptr;
};

RestuarantManage rm;

goods::goods() {
	name=" ";
	price=0.;
}

goods::goods(int n_,const string  n,double a) {
	no=n_;
	name=n;
	price=a;
} 

int goods::getno() {
	return no; 
}

string  goods::getname() {
	return name; 
}

double goods::getprice() {
	return price;
}

goods::~goods() {
}

food_material::food_material() {
	amount=0.;
}

food_material::food_material(int n_,const string  n,double a,double b) :goods(n_,n,a) {
	amount=b;
	sumamount+=b;
}

double food_material::getamount() {
	return amount;
}

void food_material::addamount(double a) {
	amount+=a;
}

food_material::~food_material() {
}

dishes::dishes() {
}

dishes::dishes(int n_,const string  n,double a,vector<pair<food_material*,double> > b) :goods(n_,n,a) {
	Ingredientsvec=b;
}

dishes::~dishes() {
}

user::user(int a,int b,int c) {
	no=a;
	username=b;
	psword=c;
}

int user::getno() {
	return no;
}

int user::getusername() {
	return username;
}

int user::getpsword() {
	return psword;
}


manager::manager(int a,int b,int c):user(a,b,c) {//将食材和菜品文件的数据加入记录可进食材和菜品的vector
	vecmaterial.clear();//初始化vector 
	vecdishes.clear();
	fstream ifs;
	ifs.open("food_material.txt",ios::in);
	if (!ifs.is_open()) {
		cout<<"cannot open file \"food_material.txt\""<<endl;
		return;
	}
	food_material fm;
	while(ifs>>fm.no&&ifs>>fm.name&&ifs>>fm.price) {  
		vecmaterial.push_back(fm);					//将食材文件的数据加入记录可进食材的vector 
	}
	ifs.close();
	ifs.open("dishes.txt",ios::in);
	if (!ifs.is_open()) {
		cout<<"cannot open file \"dishes.txt\""<<endl;
		return;
	}
	string s;
	int s1;
	double s2;
	while(getline(ifs,s)) {  
		istringstream ss(s);
		dishes ds;
		ss>>ds.no>>ds.name>>ds.price;
		vecdishes.push_back(ds);
//		while(ss>>s1>>s2) { //读取输入值 ,e也可以为字符串
//			v.push_back(make_pair(fptr[s1],s2));
//		}
	}
	ifs.close();
}


void manager::showmaterial() {//显示食材列表
	int i=0;
	for (vector<food_material>::iterator iter=vecmaterial.begin();iter!=vecmaterial.end();++iter,++i) {
		cout<<iter->getno()<<"."<<iter->getname()<<" ¥"<<iter->getprice()<<"元/斤"<<"\t";
		if((i+1)%3==0) {
			cout<<endl;
		} 
	}
	cout<<endl;
}

void manager::showtables() {//显示餐桌使用情况 
	for (int i=0;i<rm.tptr.size();++i) {
		if(rm.tptr[i]->isused) {
			cout<<rm.tptr[i]->getno()<<"("<<"x"<<")"<<"\t";
		} else {
			cout<<rm.tptr[i]->getno()<<"("<<"√"<<")"<<"\t";
		} 
		if((i+1)%3==0) {
			cout<<endl;
		} 
	}
	cout<<endl;
}

void manager::showdishes() {//显示菜品列表
	int i=0;
	for (vector<dishes>::iterator iter=vecdishes.begin();iter!=vecdishes.end();++iter,++i) {
		cout<<iter->getno()<<"."<<iter->getname()<<" ¥"<<iter->getprice()<<"元"<<"\t";
		if((i+1)%3==0) {
			cout<<endl;
		} 
	}
	cout<<endl;
}

void manager::order_dishes() {//点菜系统 
	cout<<"**************欢迎使用点菜系统*************"<<endl;
	cout<<"可供选择的桌号如下:"<<endl; 
	showtables();
	cout<<"请输入桌号:(输入-1退出)"<<endl;
	int tableno;
	int i,flag=0;
hr:	cin>>tableno;
	if(tableno==-1) {
		return ;
	} else { 
		for(i=0;i<SumTable;i++)
			if(rm.tptr[i]->getno()==tableno) {
				if(rm.tptr[i]->isused) {
					cout<<"此桌已被占用,请重新选择"<<endl;
					goto hr;
				} else {
					cout<<"为您选中"<<tableno<<"号桌"<<endl;
					flag=1;
					break;
				}
			}
		if(!flag) {
			cout<<"桌号不存在"<<endl;
		} else {
			cout<<"共有"<<vecmaterial.size()<<"种菜品"<<endl;
		    cout<<"                     菜品清单如下:               "<<endl;
		    showdishes();
		    vector<pair<int,int> > v;//vector<pair<no,count> >
		    while(1) {
		    	
		    	int no;
hr2:	    	cout<<"请输入菜品编号(输入-1取消点餐退出系统,输入-2结束点餐并确认)"<<endl;
		    	cin>>no;
		    	if(no==-1) {
		    		v.clear();
		    		rm.tptr[i]->finishuse();
		    		cout<<"正在取消之前点餐操作,退出点餐系统..."<<endl;
//		    		system("pause");
//		    		system("cls");
		    		return ;
				} else if(no>=0&&no<vecmaterial.size()) {
					cout<<"购买?份(输入大于0的整数)"<<endl;
			    	int count;
			    	cin>>count;
			    	if(!rm.check_inventory(no,count)) {
			    		cout<<"食材不足,请重新操作"<<endl; 
						goto hr2;
					} else {
						v.push_back(make_pair(no,count)); 
					}
				} else if(no==-2) {
					if(!v.empty()) {
						rm.optr.push_back(new order(rm.tptr[i]->getno()));
						rm.tptr[i]->startuse();
						for(int j=0;j<v.size();++j) {
							rm.use_inventory(v[j].first,v[j].second);
							rm.tptr[i]->addpay(rm.dptr[v[j].first]->getprice()*v[j].second);
							rm.optr[rm.optr.size()-1]->orderonedish(*rm.dptr[v[j].first],v[j].second);
						}
						cout<<"您的桌号为:"<<rm.tptr[i]->getno()<<endl;
						cout<<"您的点餐清单为:";
						double l=rm.tptr[i]->getpay();
						int k=rm.optr.size()-1;
						rm.optr[k]->displaydishes();
						rm.optr[k]->setpay(l);
						cout<<"需付费:"<<l<<"元"<<endl;
						break;
					}
				} else {
					cout<<"无此菜品,请重新操作" <<endl;
					goto hr2;
				}
			}
		}
	}
} 

void manager::purchase_materials() {//进货 
	cout<<"**************欢迎使用进货系统*************"<<endl;
	cout<<"共有"<<vecmaterial.size()<<"种食材可以购买"<<endl<<endl;
    cout<<"             可供选择的食材如下:           "<<endl;
    showmaterial();
    while(1) {
    	int no;
hr3:   	cout<<"请输入食材编号(输入-1结束进货)"<<endl;
    	cin>>no;
    	if (no==-1) {
    		cout<<"正在退出进货系统..."<<endl;
    		system("pause");
    		system("cls");
    		return ;
		} else if(0<=no&&no<vecmaterial.size()){
			cout<<"购买?斤"<<endl;
	    	double count;
	    	cin>>count;
    		if(food_material::sumamount+count<MaxAmount) {
	    		rm.fptr[no]->addamount(count);
	    		food_material::sumamount+=count;
			} else {
				cout<<"cannot purchase materials,because stock will be not enough"<<endl;
				cout<<"back to the main menu..."<<endl;
				system("pause");
				system("cls");
				return ;
			} 
		} else {
			cout<<"标号为"<<no<<"的食材不存在"<<endl;
			goto hr3; 
		}
	}
}


void manager::count_materials() {//统计现有食材 
	cout<<"**************欢迎使用食材统计系统*************"<<endl;
    cout<<"           当前贮存的食材如下:		  "<<endl;
    for (int i=0;i<rm.fptr.size();++i) {
		cout<<rm.fptr[i]->no<<"."<<rm.fptr[i]->name<<" "<<rm.fptr[i]->getamount()<<"斤"<<"\t";
		if((i+1)%3==0) {
			cout<<endl;
		} 
		
	}
	cout<<endl;
} 

void manager::Calculating_turnover() {//统计流水 
	double sum=0;
	for(int i=0;i<rm.optr.size();++i) {
		sum+=rm.optr[i]->getpay();
	}
	cout<<"本饭馆累计营业额为"<<sum<<"元"<<endl; 
	cout<<"查询订单?(输入0==no,1==yes)"<<endl; 
	int opt;
	cin>>opt;
	if(!opt) {
		return ;
	} else if(opt==1) {
		cout<<"请输入订单号"<<endl;
		int no;
		cin>>no;
		rm.optr[no]->display();
	}
}

order::order(int a) {
	ordercount++;
    tableID=a;
    orderID=ordercount;//订单编号自动加1
}

void order::orderonedish(const dishes &a,int b) {//点b份菜品a 
	ordervec.push_back(make_pair(a,b));
    listcount++;
}

void order::displaydishes() {//显示本订单所购的菜品名和对应份数 
	for(int i=0;i<listcount;i++)
		cout<<ordervec[i].first.getname()<<"("<<ordervec[i].second<<"份)""\t";
    cout<<endl;
}

void order::display() {//显示订单信息 
    cout<<"订单信息"<<endl;
	cout<<"订单号:"<<orderID<<",";
    cout<<"桌号:"<<tableID<<",";
    cout<<"所购菜品编号清单:";
    for(int i=0;i<listcount;i++)
		cout<<ordervec[i].first.getname()<<"("<<ordervec[i].second<<"份)""\t";
    cout<<endl;
}

void order::setpay(double a) {
	pay=a; 
} 

double order::getpay() {
	return pay;
}

user * RestuarantManage::queryuser(int a,int b) {//管理员身份验证,若验证成功返回一个指向user对象的指针,反正返回指向NULL的指针 
	user * uptr=NULL;
	fstream ifs("user.txt",ios::in);
	if(!ifs) {
		cout<<"cannot open file \"user.txt\" "<<endl;
	}
	int no,username,psword;
    while(ifs>>no&&ifs>>username&&ifs>>psword) {
    	if(username==a) {
    		if(psword==b) {
    			cout<<"管理员身份验证通过"<<endl;
				uptr = new user(no,username,psword);//建立一个user对象,表示登录成功 
				return uptr;
			} else {
				cout<<"用户名或密码错误"<<endl;
				return  NULL; 
			}
		}
	}
	cout<<"管理员不存在"<<endl;
    return NULL;
}

user * RestuarantManage::login() {//登录,并返回一个指向user的指针 
	cout<<STAR<<endl;
	cout<<SPACE<<endl;
    cout<<HELLO<<endl;
    cout<<SPACE<<endl;
    cout<<LOGIN<<endl;
	int username,psword;
	cout<<"请输入账号:(6位纯数字)" <<endl;
	cin>>username;
	cout<<"请输入密码:(6位纯数字)" <<endl;
	cin>>psword;
	if(user * uptr=queryuser(username,psword)) {
		return uptr;
	} else  {//验证失败则重新登录 
		cout<<"请重新输入"<<endl;
		system("pause");
		system("cls");
		login();
	}
} 

void RestuarantManage::showmenu() {//显示主系统菜单选项 
	cout<<STAR<<endl;
	cout<<SPACE<<endl; 
    cout<<HELLO<<endl;
	cout<<" 0:             	退出                      "<<endl;
    cout<<" 1:             	点菜                      "<<endl;
    cout<<" 2:             	进货                      "<<endl;
    cout<<" 3:             	食材统计                  "<<endl;
    cout<<" 4:             	统计流水                  "<<endl;
    cout<<" 5:             	注销                      "<<endl;
	cout<<STAR<<endl;
} 

void RestuarantManage::init() {//初始化 vector<food_material *> fptr;vector<dishes *> dptr;vector<table *> tptr;
	fstream ifs;
	ifs.open("food_material.txt",ios::in);
	if (!ifs.is_open()) {
		cout<<"cannot open file \"food_material.txt\""<<endl;
		return;
	}
	int no;
	string name;
	double price;
	while(ifs>>no&&ifs>>name&&ifs>>price) {
		food_material* x=new food_material(no,name,price,0.0);
		fptr.push_back(x);
	}
	ifs.close();
	ifs.open("dishes.txt",ios::in);
	if (!ifs.is_open()) {
		cout<<"cannot open file \"dishes.txt\""<<endl;
		return;
	}
	string s;
	int s1;
	double s2;
	while(getline(ifs,s)) {  
		istringstream ss(s);
		vector<pair<food_material *,double> >v;
		ss>>no>>name>>price;
		while(ss>>s1>>s2) { //读取输入值 ,e也可以为字符串
			v.push_back(make_pair(fptr[s1],s2));
		}
		dishes* y=new dishes(no,name,price,v);
		dptr.push_back(y);
	}
//	for(int k=0;k<dptr[0]->Ingredientsvec.size();++k) {//测试读入 
//		cout<<dptr[0]->Ingredientsvec[k].first->getname()<<dptr[0]->Ingredientsvec[k].second<<endl;
//	}
	ifs.close();
	for(int i=0;i<SumTable;++i) {
		table* z=new table(i);
		tptr.push_back(z);
	}
}

void RestuarantManage::menu() {//主系统 
	user *uptr=login();
	init();
	manager * mptr=new manager(uptr->getno(),uptr->getusername(),uptr->getpsword());
	int tmp;
	system("pause");
	system("cls");
	while(1) {
		showmenu();
		cout<<CHOOSE<<endl; 
		cin>>tmp;
		switch(tmp) {
			case 0:
				cout<<"正在退出系统..."<<endl;
				system("pause");
				exit(0); 
			case 1:
				system("cls");
				mptr->order_dishes();//点菜 
				system("pause");
				system("cls");
				break;
			case 2:
				system("cls");
				mptr->purchase_materials();//进货 
//				system("pause");
//				system("cls");
				break;
			case 3:
				system("cls");
				mptr->count_materials();//统计现有食材 
				system("pause");
				system("cls");
				break;
			case 4:
				system("cls");
				mptr->Calculating_turnover();
				system("pause");
				system("cls"); 
				break; 
			case 5:
				delete mptr;//注销删除指向之前管理员的指针 
				cout<<"用户已注销"<<endl;
				mptr=new manager(login()->getno(),login()->getusername(),login()->getpsword());;
				break;
			default :
				cout<<"无此选项,请重新选择" <<endl; 
		}
	}	
}

bool RestuarantManage::check_inventory(int a,int b) { //检查制作b份编号为a的菜品所需的食材是否充足 
	int i;
	for(i=0;i<dptr.size();++i) {
		if(dptr[i]->getno()==a) {
			break;
		}
	} 
	int flag=1;
	for(int j=0;j<dptr[i]->Ingredientsvec.size();++j) {
		if(dptr[i]->Ingredientsvec[j].first->getamount()-dptr[i]->Ingredientsvec[j].second*b<0) {
			flag=0;
			break;
		}
	}
	if(!flag) {
		return false;
	} else {
		return true;
	}
}

void RestuarantManage::use_inventory(int a,int b) { //消耗制作b份编号为a的菜品所需的食材
	int i;
	if(check_inventory(a,b)) {
		for(i=0;i<dptr.size();++i) {
			if(dptr[i]->getno()==a) {
				break;
			}
		} 
		for(int j=0;j<dptr[i]->Ingredientsvec.size();++j) {
			dptr[i]->Ingredientsvec[j].first->addamount(-1.0*dptr[i]->Ingredientsvec[j].second*b);
		}		
	} else {
		cout<<"食材不足,无法制作"<<b<<"份编号为"<<a<<"的菜品"<<endl;
	}
} 


table::table(int a) {
	no=a;
	pay=0;
	isused=false; 
}

int table::getno() {
	return no;
}

double table::getpay() {
	if(isused==false) {
		return 0;
	} else {
		return pay;
	} 
	
}

void table::addpay(double a) {
	pay+=a;
}

void table::startuse() {
	isused=true;
}

void table::finishuse() {
	pay=0;
	isused=false;
}


double food_material::sumamount=0;

int order::ordercount=0;

int main() {
	rm.menu();
	cout<<SPACE<<endl;
	return 0;
}
//dishes.txt
0 Scrambled_Eggs_with_Tomato 13 7 0.5 6 0.5
1 Pork_with_pickled_cabbage 33 0 0.7 4 0.5
2 Stewed_potato_with_spareribs 55 4 0.6 8 0.4
3 Cola_Chicken_Wings 45 9 1.2
4 Braised_Prawns 50 5 1
5 Kung_Pao_Chicken 37 9 1.1
6 Boiled_meat 49 4 0.9
7 Eggplant_with_radish 18 1 0.8 2 0.8
8 Elbow 60 4 1.2
9 Quick_cucumber 13 1 0.9
//food_material.txt
0 cabbage 1
1 eggplant 3
2 radish 4
3 cucumber 2
4 pork 35
5 Prawns 28
6 Tomatoes 4
7 egg 5
8 potato 3
9 chicken 25
//user.txt
0 123456 123456
1 212421 325324
2 124214 124211
3 234325 324234
4 123214 436342
5 124325 533242
6 346433 242323
7 534534 533241
8 124214 756745
9 523543 623542
一、需求分析 随着社会服务行业的发展,餐饮业对自身服务的质量和能力也有了更高的要求。餐饮管理系统正是在这样的情况之下越来越受到重视。餐厅的内部服务项目众多,既需要完成前台的服务工作,还需要完成后台的管理工作,如果没有一套可靠的餐饮管理系统,单凭手工操作,不仅效率低,而且会极大地影响到酒店的服务质量。 设计的目标:实现餐饮管理的科学化、自动化,提高各个模版的办公效率,为高质量的餐饮服务提供保证。 系统功能概述 民以食为天,随着人民生活水平的提高,餐饮业在服务行业中占有越来越重要的地位。经过多年发展,餐饮管理已经逐渐由定性管理,进入到重视定量管理的科学阶段。众所周知,在定量管理的具体实现方法和手段方面,最有效的工具就是计算机管理。 传统的手工操作管理存在着许多无法避免的问题,例如: 人工计算机账单金额出现差错; 收银工作中跑单、漏单、偷钱现象普遍; 个别服务员作弊、改单、宰客情形时有发生; 客人消费单据难以保存和查询。 如果借助计算机来管理,就可以轻松的解决处理这些问题。一个餐饮管理信息系统应该包括基本的餐厅的服务管理、管理人员信息的维护等,以及与之相应的操作。所以整个餐饮管理信息系统分为两个大部分,即后台的数据管理维护和前台的操作。后台数据库的管理能保证系统各项功能正常运行,前台操作能提供给客户尽可能方便快捷的服务。 功能模块划分 1. 前台操作系统 订餐管理模块:点菜(输入桌台代码和食物代码)、加菜、下单。 结账管理模块:结账(输入桌台代码)、结账方式选择(包括现金结账、信用卡结账、支票结账、签单等)。 交班管理模块:统计当班数据(包括桌台数、人民币结账金额以及总金额等),为下班操作作准备。 2. 后台管理维护系统 用户权限设置:可以查询员工的基本资料(姓名、性别、年龄、出生年月、籍贯、家庭住址等),员工登录名称、密码、员工操作权限等,可以根据需要进行设置。 菜谱设置:新菜单录入(包括菜式名称、代码、类型、价格、成本等)、菜式修改、删除等菜式维护。 付款方式设置:分为人民币付款、信用卡、支票签单等,可以根据需要进行添加和删除。 系统流程分析 系统流程图1所示。当用户进入系统主界面以后,新用户经过注册后才能凭借其用户名和密码登录,老用户可以直接登录。用户登录以后,系统自动判断出其操作权限。操作权限包括普通员工和管理人员。新用户的操作权限默认为是普通员工。普通员工只能进行订餐、结账操作,而管理人员除此之外还可以进行系统设置与营业分析。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值