c++课外实践模板.docx
《c++课外实践模板.docx》由会员分享,可在线阅读,更多相关《c++课外实践模板.docx(18页珍藏版)》请在冰豆网上搜索。
c++课外实践模板
数据结构课外实践报告
项目名称:
餐饮管理
所在班级:
软件工程一班
小组成员:
王敬云120904046
朱奇亮120904031
聂梦妍120904041
张红飞120904049
秦渝涛120904042
任课教师:
熊晶
起止时间:
项目基本信息
项目名称
餐饮管理系统
项目简介
根据餐饮行业的特点,该系统以餐饮业务为基础,突出前台管理,从专业角度出发,提供科学有效的管理模式。
点菜收银管理可实现点菜、结账、清台。
进货管理可记录商品入库情况。
点菜收银、营业分析、库房管理的有机结合,可为酒店经营方向提供依据,为酒店餐馆的发展提供重要保证。
小组成员
王敬云朱奇亮聂梦妍张红飞秦渝涛
任务分工
王敬云:
登录人员权限设置,新人员的注册,主界面设置;
朱奇亮:
结账界面,进货信息界面的设置;
聂梦妍:
登录,开台,商品信息界面的设置;
张红飞:
数据库备份,数据库还原的实现;
秦渝涛:
点菜,加减菜,菜式信息界面的设置;
课外实践评定成绩记录
指导教师意见
系统完成情况:
优良中差
报告完成情况:
优良中差
答辩评定成绩
团队整体成绩:
成员成绩
王敬云
120904046
朱奇亮
120904031
聂梦妍
120904041
张红飞
120904049
秦渝涛
120904042
综合成绩
一、
问题描述及分析
问题描述
传统的酒店行业使用手工记账和核算,这是极易出现问题的,比如:
(1)速度慢且容易出错
(2)不容易查询客户的消费信息。
(3)收银过程中容易出现账单丢失的情况。
(4)做销售数据统计分析既费时又费力,还容易出现偏差。
而目前餐饮行业竞争愈发激烈,只有解决上述问题才能在竞争中求得生存。
因此本系统将实现点餐、管理、销售统计一体化的工作,帮助餐饮管理者快速、有效地分析数据和进行酒店管理。
需求分析
从分析饭店店的基本情况入手,根据餐饮行业的特点和实际情况,进行系统的可行性分析,来了解企业的管理特点和存在的问题,酒店管理系统应以餐饮业务为基础,在此基础上,进行详细分析,得出系统功能结构图。
本系统主要是用于后台管理,重视营业数据分析等功能,从专业角度出发,努力为餐饮管理者提供科学有效地管理模式和数据分析功能。
像餐台数据包括餐台编号、状态(有人/空闲);菜品信息有名称,价格等。
二、功能模块及数据结构描述
本系统有三种操作权限,其中,营业员只可以执行开台、点菜、买单及查询日收入操作;领班可以执行开台、点菜、买单、进货、添加新员工、日收入及月收入查询等操作;经理具有最高权限,除了领班及营业员的操作权限外,还可以设置员工权限、添加商品信息及菜式信息、备份与恢复数据库及初始化数据等操作。
本系统主要涉及餐厅的日常运营,包括餐台的安排、点菜、结算、员工管理、销售统计等功能。
·后台服务:
实现对餐厅顾客开台、点菜/加菜、预订、签单、结账(打折)功能。
需要实现预订与开台的冲突处理等。
·后台管理:
餐台号管理、菜系管理、菜品管理、登录人员权限管理。
需要保证对于以上各种信息的管理能够同步反应到前台服务界面,防止出现加错菜品到餐台等情况。
·销售统计:
统计某一时间段的营业额。
三、主要算法流程描述及部分核心算法
系统整体框架
核心算法
(1)注册
voidCZhucedlg:
:
OnButtonOk()
{
UpdateData();//更新,获取编辑框中的数据
if(m_Name.IsEmpty()||m_Pwd.IsEmpty()||m_Pwd1.IsEmpty())//判断用户名和密码是否为空
{
AfxMessageBox("用户名密码不能为空");
return;
}
if(m_Pwd!
=m_Pwd1)//判断两次输入的密码是否一直
{
AfxMessageBox("密码不一致");
return;
}
m_pRs=theApp.m_pCon->Execute((_bstr_t)("select*fromLoginwhereUname='"+m_Name+"'"),NULL,adCmdText);
if(m_pRs->adoEOF)//从数据库中获取和当前注册的用户名相同的记录
{
theApp.m_pCon->Execute((_bstr_t)("insertintoLogin(Uname,Upasswd,power)values('"+m_Name+"',\
'"+m_Pwd+"',2)"),NULL,adCmdText);//如果记录为空,说明输入的用户名合法,把该用户名密码插入到数据库中
AfxMessageBox("注册成功");
CDialog:
:
OnOK();//注册成功,将注册窗口关闭
}
else
{
AfxMessageBox("用户名已存在");
return;
}
}
(2)登录
voidCLogindlg:
:
OnOK()
{
UpdateData();
if(!
m_Uname.IsEmpty()||!
m_Upasswd.IsEmpty())
{
CStringsql="SELECT*FROMLoginWHEREUname='"+m_Uname+"'andUpasswd='"+m_Upasswd+"'";
try
{
m_pRs.CreateInstance("ADODB.Recordset");
m_pRs->Open((_variant_t)sql,theApp.m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
if(m_pRs->adoEOF)
{
AfxMessageBox("用户名或密码错误!
");
m_Uname="";
m_Upasswd="";
i++;
UpdateData(false);
if(i==3)
{
OnCancel();
}
}
else
{
theApp.name=m_Uname;
theApp.pwd=m_Upasswd;
CDialog:
:
OnOK();
return;
}
}
catch(_com_errore)
{
CStringtemp;
temp.Format("连接数据库错误信息:
%s",e.ErrorMessage());
AfxMessageBox(temp);
return;
}
}
else
{
AfxMessageBox("用户名密码不能为空");
}
}
(3)开台
voidCKaitaidlg:
:
OnButtonOk()
{
UpdateData();//从编辑框中获取已经选择的桌号
if(m_ZhuoHao.IsEmpty())
AfxMessageBox("桌号不能为空");//判断桌号是否为空
else
{
CStringStr="select*fromTableUSEwhereTableUSEID=1";//在数据库中找到已经有人的桌号
m_pRs=theApp.m_pCon->Execute((_bstr_t)Str,NULL,adCmdText);//m_rPs指向在数据库中获取的记录
while(!
m_pRs->adoEOF)
{
Value=(char*)(_bstr_t)m_pRs->GetCollect("桌号");
if(m_ZhuoHao==Value)//将已开台的桌号和输入的桌号做比较,如果相同,说明已经有人
{
AfxMessageBox("有人了");
m_ZhuoHao="";//将编辑框置空
UpdateData(false);//数据更新,将编辑框置空的操作获取到编辑框中
return;
}
m_pRs->MoveNext();
}
m_pRs=NULL;
CStringStr1="select*fromTableUSEwhere桌号="+m_ZhuoHao+"";//从数据库中获取桌号为m_ZhuoHao的桌
m_pRs=theApp.m_pCon->Execute((_bstr_t)Str1,NULL,adCmdText);
if(m_pRs->adoEOF)//如果获取的记录为空,说明输入错误
{
AfxMessageBox("没有这种桌子");
m_ZhuoHao="";
UpdateData(false);
return;
}
m_pRs=NULL;
CDiancaidlgdlg;//开台成功之后登录到主界面
dlg.m_ZhuoHao=m_ZhuoHao;
dlg.DoModal();//以模态的方式登录
CDialog:
:
OnOK();//登录到主界面之后关闭登录界面
}
}
(4)加菜后账单
voidCJiacaidlg:
:
OnButtonOK()
{
UpdateData();
CStringSql;
CStringzhuohao;
if(m_ZhuohaoCombo.GetCurSel()==-1)//若下拉列表控件中没有选择数据则提示选择
{
AfxMessageBox("请选择要加菜的桌号");
return;
}
m_ZhuohaoCombo.GetLBText(m_ZhuohaoCombo.GetCurSel(),zhuohao);//获取下拉列表控件中所选择的信息
inti=m_CaidanCheck.GetItemCount();//获取点菜列表项中的总数
if(i==0)//如果项数为0,提示请点菜
{
AfxMessageBox("请点菜");
return;
}
CStringSql1,Str,Str1,Value,TotleValue;
Sql1="deletefrompaybillwhere桌号="+zhuohao+"";//从数据库账单中删除此餐桌号原本的账单信息
theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText);
doubleTotle=0;//定义变量记录总消费
//循环计算账单总消费
for(intn=0;n
{
Str=m_CaidanCheck.GetItemText(n,0);//将第n项第一列的信息保存到Str中
Str1=m_CaidanCheck.GetItemText(n,1);//将第n项第二列的信息保存到Str1中
Sql1="select*fromcaishiinfowhere菜名='"+Str+"'";//从数据库菜式信息表中获取菜式为“Str”的信息
m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText);
Value=(char*)(_bstr_t)m_pRs->GetCollect("菜价");
Totle=atof(Value)*atof(Str1);//将菜价与消费数量从字符串类型转换为浮点类型,再相乘
TotleValue=(char*)(_bstr_t)Totle;//将总消费转化成Cstring类型
//将菜单信息添加到数据库中
Sql1="insertintopaybill(桌号,菜名,数量,消费)values("+zhuohao+",'"+Str+"',"+Str1+","+TotleValue+")";
theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText);
}
AfxMessageBox("操作成功");
CDialog:
:
OnOK();
}
(5)结账
voidCJiezhangdlg:
:
OnChangeEDITshishou()
{
doublezhaoling;
CStringShiShou,YingShou;
m_ShiShou.GetWindowText(ShiShou);
m_YingShou.GetWindowText(YingShou);//获取编辑框中的信息
zhaoling=atof(ShiShou)-atof(YingShou);//转换类型,并计算找零
CStringstr;
str.Format("%0.2f",zhaoling);//设置输出格式
m_ZhaoLing.SetWindowText(str);//获取找零金额
}
四、系统使用说明
操作注意事项
(1)经理权限的帐号是mrkj,密码是111
领班权限的帐号是cab,密码是123
领班权限的帐号是wmz,密码是wmz
营业员权限的帐号是abc,密码是123
(2)实例可执行文件位置:
餐饮管理系统\Debug\餐饮管理.exe
操作流程
本系统有三种操作权限,其中,营业员只可以执行开台、点菜、买单及查询日收入操作;领班可以执行开台、点菜、买单、进货、添加新员工、日收入及月收入查询等操作;经理具有最高权限,除了领班及营业员的操作权限外,还可以设置员工权限、添加商品信息及菜式信息、备份与恢复数据库及初始化数据等操作。
在使用本系统时,单击“登录”按钮,在登录页面中输入相应的用户名和密码即可进入相应权限的操作页面。
本系统主页面如图1.1所示。
图1.1餐饮管理系统主界面
下面简单介绍本系统的操作流程,首先以管理员身份登录,对系统中的基本信息进行设置,操作步骤如下:
(1)通过“管理”/“后台管理”/“商品信息”菜单命令,添加商品信息。
(2)通过“管理”/“后台管理”/“进货”命令,执行进货操作。
(3)通过“管理”/“后台管理”/“菜式信息”命令,添加菜式。
(4)通过“财政收支”/“进货查询”命令,可查询某日的进货信息。
基本信息设置完成后,饭店就可以正常营业了,操作方法如下:
(1)单击“开台”按钮,进入“开台”模块,在该模块中双击状态为空闲的桌号,如图1.2所示。
图1.2选择桌号
(2)单击“就要这桌”按钮,进入“点菜”窗口,在该窗口中选择菜单名,然后单击
按钮,添加点菜数量,如图1.3所示。
图1.3“点菜”窗口
(3)单击“确定”按钮,完成点菜操作。
(4)单击“加减菜”按钮,可以为每桌加菜或退菜。
(5)单击“顾客买单”按钮,进入“结帐”窗口,在该窗口中选择要结帐的桌号,然后输入实收金额,如图1.4所示。
图1.4“结帐”窗口
(6)单击“结帐”按钮,完成结帐操作。
五、问题及解决办法
1.人员权限设置问题
解决方法:
在数据库中设置power权限,power为2,为营业员权限,是最低权限;power为1,为领班权限,除营业员权限之外还增加了部分权限;power为0,为经理权限,是最高权限,可以进行所有操作。
2.用户注册与数据库的连接
解决方法:
如果用户名没有被占用,而且两次密码输入相同,通过SQL/语句写入数据库。
3.结账算法中找零的触发事件
解决方法:
分别获取实收,应收编辑框的数据,相减,获得找零编辑框的数据,但要注意数据类型的转换,主要代码如下:
m_ShiShou.GetWindowText(ShiShou);
m_YingShou.GetWindowText(YingShou);//获取编辑框中的信息
zhaoling=atof(ShiShou)-atof(YingShou);//转换类型,并计算找零
CStringstr;
str.Format("%0.2f",zhaoling);//设置输出格式
m_ZhaoLing.SetWindowText(str);//获取找零金额
4.数据库备份的实现
解决方法:
/用CopyFile(buf,strpath,false)语句,使当前buf路径下的文件拷贝到strpath中,实现数据库备份。
如果为TRUE,则新路径中已经存在该文件了,就覆盖。
这个函数使整个数据库都备份,仍有局限性。
5.加减菜式后账单的结算
解决方法:
一个餐台作了加减菜式的操作后,在数据库中要删除该餐台的所有账单信息,从数据库的菜式信息表中获取所有的菜式总数,菜价,及每份菜式数量,进行计算后的新账单写入数据库的账单中,计算过程中要注意数据类型的转化。
6.菜式信息更改功能的实现
解决方法:
先将要修改的菜式信息在数据库中作修改,再在菜式信息界面的列表中将原有的信息全部删除,再从数据库中读取所有的菜式信息到菜式信息界面的列表中,并且同时将编辑框中原有的输入数据情空。
7.未输入用户名密码时,提示“用户名密码不允许为空”当关闭提示后,正确输入后显示时,依然显示同样的提示。
此问题为没有添加更新数据语句,需添加UpdateData语句。
8.在程序运行时,系统经常提示以下错误,通常为上一次的运行窗口没有关闭
9.当系统编译时出现以下问题时,可能是在添加控件的过程中不够慎重,添加之后又删除了,但是系统已经生成了此控件的一些默认代码,但是编译时却找不到此控件而造成的,所以添加控件要慎重考虑。
结论:
设计系统过程中添加控件要慎重,控件一旦添加,vc系统将自动生成系统默认的代码,致使一些在不谨慎情况下添加的不需要的控件在被删除之后影响整个系统的运行。
六、课外实践总结
这学期的课外实践已经基本上完成,在这次课外实践中,感觉很有收获,虽然上课很认真的听讲,实验课感觉挺简单的,但真正到实践的时候,还是困难重重。
首先,让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更进一步的理解和认识;其次,在系统解读过程中,遇到了很多问题,通过查阅相关资料,上网查询以及跟同学共同讨论的方法,解决了大部分问题。
但因为时间问题,系统中仍然有一些不明白的问题没有解决,需要提高和完善。
通过本次课外实践,让我们更清楚的了解了每一个人本身的弱点,明白了团体力量的强大,同时锻炼了我们思考问题的能力,有助于进一步提高我们的编程能力。