1 项目描述
学校有一百个普通学生,每个学生有一个饭卡,可以给刷卡和充值
有10个研究生,研究生比普通学生增加了新的变量:工资wage
每个学生都可以到饭堂点菜
饭堂有10个员工,员工也持有一个饭卡,可以点菜,但是在原有的菜价的基础上优惠10%
员工和学生的饭卡中的余额初始化为随机数50-200元之间
2 系统逻辑
用户(普通学生,研究生或者员工)通过终端输入姓名,登录成功后显示该用户的对应信息
登录成功后列出菜单等待点菜,点菜成功后显示余额。
3 要求
使用面向对象方法来编程
学生学号和姓名使用const成员
使用vector容器来存储菜单
4 分析
[饭卡]
属性: 余额
方法: 刷卡 充值 显示余额
[普通学生] 继承 [饭卡]
属性: 学号 姓名
方法: 点菜 login 显示信息
[研究生] 继承 普通学生
属性:工资wage
方法:显示信息
[员工] 继承 [饭卡]
属性: 姓名
方法:点菜 login 显示信息
[饭堂]
属性: 菜单(菜名, 菜价)
方法: 列出菜单 获取菜价
5 系统时序
-
登录
-
显示该用户的对应信息
-
列出菜单
-
点菜
-
显示余额。
6 系统框架
7 类的编写
根据框架图,整理类之间的关系,实现每个类中的属性和方法,再实例化,代码如下:
typedef struct _MENU
{
string name;//菜名
float price;//菜价
}Menu;
//饭堂
class cateen
{
private:
static Menu menu[5];//菜单
public:
//罗列显示菜单
static void list()
{
cout<<"菜单名\t价格"<<endl;
for(int i=0;i<5;i++)
{
cout<<menu[i].name<<"\t"<<menu[i].price<<endl;
}
}
//获取菜单价格
static float getPrice(string n)
{
for(int i=0;i<5;i++)
{
if(menu[i].name == n)//找到菜单名
{
return menu[i].price;//获取到菜单价格
}
}
return -1;//没找到菜单
}
};
//定义菜单和价格
Menu cateen::menu[5]=
{
{"黄焖鸡米饭",16.5},
{"五谷鱼粉",14.3},
{"酸菜鱼",24},
{"牛肉汤杂面",17.8},
{"鸡腿双排饭",15.5},
};
//饭卡
class card
{
private:
float money;
public:
//初始化卡的余额
card()
{
srand((unsigned)time(NULL));
money=50+rand()%150;//饭卡余额随机50~200
}
//刷饭卡
bool pay(float m)
{
if(m>money)//余额不足
{
cout<<"余额不足,无法购买"<<endl;
return false;
}
cout<<"价格为"<<m<<endl;
money -= m;
return true;
}
//充值
void charge(float m)
{
money += m;
}
//显示余额
void shomoney()
{
cout<<"饭卡余额:"<<money<<endl;
}
};
//人
class person: public card
{
private:
public:
//点餐
virtual bool order(string n) = 0;
//登录
virtual bool login(string n)=0;
//显示信息
virtual void show() =0;
};
//普通学生(继承人)
class student:public person
{
private:
const int num;//学号
const string name;//姓名
public:
student(string ni,int n):num(n),name(ni)//const修饰成员变量只能在初始化列表中完成
{
}
//点餐
virtual bool order(string n)
{
float price=cateen::getPrice(n);//获取菜单价格
//没找到菜
if(price == -1)
{
return false;
}
//刷饭卡
return pay(price);
}
//登录
virtual bool login(string n)
{
if(n==name)
{
return true;
}
else
{
return false;
}
}
//显示信息
virtual void show()
{
shomoney();//显示余额
cout<<"学号:"<<num<<"\t"<<"名字:"<<name<<endl;//显示学号和名字
}
};
//研究生(继承学生)
class graduate:public student
{
private:
float wage;//工资
public:
//定义工资
graduate(string ni,int n):student(ni,n)
{
wage=10000;
}
//显示信息
void show()
{
student::show();
cout<<"工资:"<<wage<<endl;
}
};
//员工
class staff:public person
{
private:
const string name;
public:
staff(string n):name(n)
{
}
//点餐
virtual bool order(string n)
{
//获取菜单价
float price = cateen::getPrice(n);
if(price == -1)
{
return false;
}
//刷卡,打9折
return pay(0.9*price);
}
//登录
virtual bool login(string n)
{
if(n == name)
{
return true;
}
else
{
return false;
}
}
//显示信息
virtual void show()
{
//显示余额
shomoney();
cout<<"员工名字:"<<name<<endl;
}
};
8 系统时序的编写
在主函数中实现项目时序代码的编写:登录->显示用户信息->列出菜单->点餐->显示余额
主函数代码
int main(int argc,char *argv[])
{
int i=0;
int login_break=1;//登录标志位
int order_continue=0;//继续点餐标志位
float money;//充值金额
vector<person*> pvec;
//100个普通的学生
//学号: 10001-10100
//姓名: student1 - student100
for(i=0;i<100;i++)
{
stringstream ss;
ss<<i+1;
string str ="student"+ss.str();
person* p=new student(str,1+i);//姓名和学号
pvec.push_back(p);//加入容器
}
//10个研究生
//学号: 10101-10110
//姓名: graduate101 - graduate110
for(;i<110;i++)
{
stringstream ss;
ss<<i+1;
string str ="graduate"+ss.str();
person* p=new graduate(str,1+i);//姓名和学号
pvec.push_back(p);//加入容器
}
//10个员工
//姓名: staff111 - staff120
for(;i<120;i++)
{
stringstream ss;
ss<<i+1;
string str ="staff"+ss.str();
person* p=new staff(str);//姓名和学号
pvec.push_back(p);//加入容器
}
//登录
string name;
person * pcur=NULL;
while(login_break)
{
cout<<"请输入你的名字:"<<endl;
cin>>name;
for(int i=0;i<pvec.size();i++)
{
if(pvec[i]->login(name))
{
cout<<"登录成功"<<endl;
pcur = pvec[i];
login_break=0;
break;
}
}
if(pcur ==NULL)//登录失败
{
cout<<"输入错误,请重新输入"<<endl;
}
}
//显示该用户的信息
pcur->show();
//列出菜单
cateen::list();
//点菜
string eating;
while(1)
{
cout<<"请点餐:"<<endl;
cin>>eating;
if(!pcur->order(eating))
{
cout<<"点餐失败,重新点餐"<<endl;
}
else
{
cout<<"点餐成功,你点的为:"<<eating<<endl;
//显示当前饭卡剩余余额
cout<<"当前";
pcur->shomoney();
}
cout<<"是否继续点餐?按2充值饭卡,1继续点餐,按0退出点餐"<<endl;
cin>>order_continue;
if(order_continue==0)
{
break;
}
else if(order_continue ==2)
{
cout<<"请输入充值的金额:";
cin>>money;
pcur->charge(money);
//显示饭卡余额
cout<<"充值成功,";
pcur->shomoney();
}
}
return 0;
}
9 运行效果
登录
点餐
充值