[C++]用C++实现简单的一卡通点餐小项目

1 项目描述

学校有一百个普通学生,每个学生有一个饭卡,可以给刷卡和充值
有10个研究生,研究生比普通学生增加了新的变量:工资wage
每个学生都可以到饭堂点菜
饭堂有10个员工,员工也持有一个饭卡,可以点菜,但是在原有的菜价的基础上优惠10%
员工和学生的饭卡中的余额初始化为随机数50-200元之间

2 系统逻辑

用户(普通学生,研究生或者员工)通过终端输入姓名,登录成功后显示该用户的对应信息
登录成功后列出菜单等待点菜,点菜成功后显示余额。

3 要求

使用面向对象方法来编程
学生学号和姓名使用const成员
使用vector容器来存储菜单

4 分析

[饭卡]
属性: 余额
方法: 刷卡 充值 显示余额

[普通学生] 继承 [饭卡]
属性: 学号 姓名
方法: 点菜 login 显示信息

[研究生] 继承 普通学生
属性:工资wage
方法:显示信息

[员工] 继承 [饭卡]
属性: 姓名
方法:点菜 login 显示信息

[饭堂]
属性: 菜单(菜名, 菜价)
方法: 列出菜单 获取菜价

5 系统时序

  1. 登录

  2. 显示该用户的对应信息

  3. 列出菜单

  4. 点菜

  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 运行效果

登录
在这里插入图片描述
点餐
在这里插入图片描述
充值
在这里插入图片描述

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值