面向对象程序课程设计
(2017/2018 学年第二学期第 17 周)
指导教师:
班级:1
学号:20
姓名:
面向对象程序课程设计
一、 题目
自助点餐系统
二、 需求分析
1. 系统管理
(1) 用户管理
该系统为两种角色的用户提供服务,一种是餐厅管理员,一种是顾客。餐厅管理
员根据账号、密码登录系统。顾客无需登录即可使用系统。
(2) 信息管理
系统统退出后能保存当天的订单信息,要求每天一个文档,文档名按照日期命名。
2. 业务需求
(1) 顾客下单
顾客通过该餐厅在系统中提供的菜单为自己点餐。系统能够根据顾客的要求正确
生成订单,订单分两种,一种是在店消费,另一种是外卖。
(2) 管理员权限
管理员可以根据订单编号查找删除修改某个订单,订单可以按照下单时间先后排
序。能够实现对餐厅菜式和价格的管理,包括对菜品和对应价格的增加、修改、删除、查
找,折扣的设置。系统可根据历史记录对销售情况进行统计,根据餐厅管理员的输入日期
统计某天的销售情况并显示(包括一共接了多少单,销售额是多少,各个菜品的销售情况,
外卖和在店销售的占比)。
三、 系统结构图
四、 类的设计
五、 程序代码与说明
//head.h
#include
#include
#include
#include
using namespace std;
class Date{
private:
int day;
int month;
int year;
int hour;
int minute;
public:
Date();
Date(int d,int m,int y);
string format();
string format(string s);
string formatByYMD(string s);
};
/**
* 菜品类
*/
class Food{
private:
int id;//菜品编号,用来标识
char name[20];//名称
float price;//价格
float discount;//折扣
public:
Food();
Food(int fid,char* fname,float fprice,float dis=1.0);//构造函数
int getId();
char* getName();
float getPrice();//原价
float getPriceBydis();//折后价
float getDiscount();
void setId(int fid);
void setName(char* fname);
void setPrice(int fprice);
void setDiscount(float dis);
};
/**
* 菜单类
*/
class Menu{
private:
list foods;
public:
void add(Food *food);//添加菜品
void remove(int id);//删除菜品(根据 id)
void update(Food *food);//修改菜品
Food * find(int id);//查询菜品
list getFoods();
void saveToFile();
void getFromFile();
void display();
};
/**
* 订单项,
*/
class Orderitem{
private:
Food *food;//菜品
int count;//数量
float total;//合计
public:
Orderitem(Food *f,int c);
float getTotal();//单价*数量
Food* getFood();
int getCount();
};
/*
*订单类
*/
class Order{
protected:
char oid[20];
//编号
list items;//订单项
float amount;
//订单总额
Date *orderTime;//下单时间
public:
Order();//构造函数
char* getOid();
void add(Orderitem* oi);//添加菜品
Date* getOrderTime();
virtual float getAmount();//返回订单合计价格
virtual void display();//打印订单详情
};
/*
* 外卖订单 即线上订单
*/
class OnlineOrder:public Order{
private:
Date *deliveryTime;//送餐时间
char addr[200];//送餐地址
char tel[20];//客户电话
float fee=1;//外卖费
public:
float getAmount(); //重写订单费用
void setDeliveryTime(Date *time);
void setAddr(char* a);
void setTel(char *t);
void set(float f);
void display();
};
/*
* 在店消费订单 即线下订单
*/
class UnderlineOrder:public Order{
private:
int did;//餐桌号
float boxFee=5;//包厢费
public:
float getAmount(); //重写订单费用
void setDid(int d);
void setBoxFee(float f);
void display();
};
/*
*订单管理类
*/
class OrderUtils{
private:
Order* orders[1000];//每天最多 1000 条订单
int orderCount=0;//当前订单数量
public:
int getOrderCount();
void addOrder(Order *order);
void saveToFile();//保存当天订单到本地文件
Order *find(char *oid);//通过 id 查询订单并返回
void *update(Order* order);//修改订单
void display();//根据下单时间打印出订单
};
//OrderUtils.cpp
#include"head.h"
#include
#include
int OrderUtils::getOrderCount(){
return orderCount;
}
void OrderUtils::addOrder(Order *order){
orders[orderCount++]=order;
}
void OrderUtils::saveToFile(){
string fname=(new Date())->formatByYMD("-");
fname+=".dat";
ofstream out(fname,ios::out|ios::trunc);
for(int i=0;igetOid())==0){
return orders[i];
}
}
}
void *OrderUtils::update(Order* order){
Order* old=find(order->getOid());
//
}
void OrderUtils::display(){
cout<<"************************"<getOid()<<"\t"<getOrderTime()->format("-")<<"\t\t"<getAmou
nt()<//Menu.cpp
#include"head.h"
#include
using namespace std;
//菜单中增加菜品 增
void Menu::add(Food * food){
foods.push_back(food);
}
//根据 id 删 删
void Menu::remove(int id){
list::iterator iter;
for(iter=foods.begin();iter!=foods.end();iter++){
if((*iter)->getId()==id){
foods.erase(iter);
break;
}
}
}
// 改
void Menu::update(Food *food){
remove(food->getId());
foods.push_back(food);
}
//根据 id 查询,返回值为 Food 类 查
Food* Menu::find(int id){
//迭代器遍历 list 集合
list::iterator iter;
for(iter=foods.begin();iter!=foods.end();iter++){
if((*iter)->getId()==id){
return *iter;
}
}
return NULL;
}
list Menu::getFoods(){
return foods;
}
//菜品写入到文件
void Menu::saveToFile(){