#include<bits/stdc++.h>
#include<stdio.h>
#include <string.h>
#include <stdbool.h>
#include <cstring>
#include<limits>
#define N 50
//定义Movie结构体
struct Movie
{
char name[50];
int time;
double price;
int hall;
int seat;
};
//定义全局Movie数组
Movie movies[20];
//定义全局变量记录影片数量
int movieCount=0;
void entrance(); //系统欢迎界面
void chance(); //模式选择界面
int choice(); //操作选择
// 函数声明
//定义类
class User
{
public:
void user_welcome(); //普通用户选择界面
void user_login(); //普通用户登录界面
void user_menu(); //普通用户菜单
bool purchase(const char* movieName,int numSeat); //普通用户购票
bool refund(const char* movieName,int numSeat); //普通用户退票
void print(); //普通用户打印影票
};
//定义类
//继承
class Administrator:public User
{
public:
void administrator_welcome(); //管理员选择界面
void administrator_login(); //管理员登录界面
void administrator_menu(); //管理员菜单
void add(); //管理员添加影片
void show(); //管理员查看影片
void search(); //管理员查找影片
void expurgate(); //管理员删除影片
void modify(); //管理员修改影片
};
//定义类名
Administrator administrator;
User user;
//系统欢迎界面
void entrance()
{
std::cout<<"**************************************************"<<std::endl;
std::cout<<"* 欢迎进入影院购票系统,请选择你的身份 *"<<std::endl;
std::cout<<"* 1:管理员模式 *"<<std::endl;
std::cout<<"* 2:用户模式 *"<<std::endl;
std::cout<<"* 3:直接退出 *"<<std::endl;
std::cout<<"**************************************************"<<std::endl;
}
//模式选择界面
void chance()
{
int num;
std::cin>>num;
switch(num)
{
case 1:
//选择1,则进入管理员模式
administrator.administrator_welcome();
break;
case 2:
//选择2,则进入普通用户模式
user.user_welcome();
break;
case 3:
//退出
return;
default:
std::cout<<"选择无效,请重新输入"<<std::endl;
}
}
//管理员添加影片
void Administrator::add()
{
if(movieCount>=20)
{
//最多可在系统中添加20个影片
std::cout<<"影片存储列表已满,无法继续添加影片"<<std::endl;
return;
}
//管理员添加的影片所具有的信息
std::cout<<"请输入影片名字:";
std::cin.getline(movies[movieCount].name,sizeof(movies[movieCount].name));
std::cout<<"请输入影片时长(分钟):";
std::cin>>movies[movieCount].time;
std::cin.ignore();
std::cout<<"请输入影片价格:";
std::cin>>movies[movieCount].price;
std::cin.ignore();
std::cout<<"请输入影厅号:";
std::cin>>movies[movieCount].hall;
std::cin.ignore();
std::cout<<"请输入剩余座位数量:";
std::cin>>movies[movieCount].seat;
std::cin.ignore();
movieCount++;
std::cout<<"影片添加成功!"<<std::endl;
}
//管理员查看影片
void Administrator::show()
{
std::cout<<"所有影片列表:"<<std::endl;
for(int i=0;i<movieCount;i++)
{
//查看当前影片所具有的信息
std::cout<<"名字: "<<movies[i].name<<std::endl;
std::cout<<"时长: "<<movies[i].time<<"分钟"<<std::endl;
std::cout<<"价格: "<<movies[i].price<<"元"<<std::endl;
std::cout<<"影厅号: "<<movies[i].hall<<std::endl;
std::cout<<"剩余座位: "<<movies[i].seat<<std::endl;
//添加空行,使输出更清晰
std::cout<<std::endl;
}
}
//管理员查找影片
void Administrator::search()
{
char nameToFind[20];
std::cout<<"请输入要查找的影片名字:";
std::cin.getline(nameToFind,sizeof(nameToFind));
bool found=false;
for(int i=0;i<movieCount;i++)
{
//要查找的影片名字与系统中的匹配
if(strcmp(movies[i].name,nameToFind)==0)
{
//若匹配即可查找成功
found=true;
std::cout<<"找到影片:"<<std::endl;
std::cout<<"名字: "<<movies[i].name<<std::endl;
std::cout<<"时长: "<<movies[i].time<<"分钟"<<std::endl;
std::cout<<"价格: "<<movies[i].price<<"元"<<std::endl;
std::cout<<"影厅号: "<<movies[i].hall<<std::endl;
std::cout<<"剩余座位数量: "<<movies[i].seat<<std::endl;
//找到后退出循环
break;
}
}
//不匹配
if(!found)
{
std::cout<<"未找到名为 "<<nameToFind<<" 的影片"<<std::endl;
}
}
//管理员删除影片
void Administrator::expurgate()
{
std::string nameToDelete;
std::cout<<"请输入要删除的影片名字:";
std::cin>>nameToDelete;
std::cin.ignore();
for(int i=0;i<movieCount;i++)
{
//要查找的影片名字与系统中的匹配
if(strcmp(movies[i].name,nameToDelete.c_str())==0)
{
for(int j=i;j<movieCount-1;j++)
{
movies[j]=movies[j+1];
}
movieCount--;
std::cout<<"影片删除成功!"<<std::endl;
return;
}
}
std::cout<<"未找到影片"<<std::endl;
}
//管理员修改影片
void Administrator::modify()
{
std::string nameToModify;
std::cout<<"请输入要修改的影片名字:";
std::cin>>nameToModify;
std::cin.ignore();
bool found=false;
for(int i=0;i<movieCount;i++)
{
//要查找的影片名字与系统中的匹配
if(strcmp(movies[i].name,nameToModify.c_str())==0)
{
found=true;
std::cout<<"请输入新的影片名字:";
std::cin.getline(movies[i].name, sizeof(movies[i].name));
std::cout<<"请输入新的影片时长(分钟):";
std::cin>>movies[i].time;
std::cin.ignore();
std::cout<<"请输入新的影片价格:";
std::cin>>movies[i].price;
std::cin.ignore();
std::cout<<"请输入新的影厅号:";
std::cin>>movies[i].hall;
std::cin.ignore();
std::cout<<"请输入新的剩余座位数量:";
std::cin>>movies[i].seat;
std::cin.ignore();
std::cout<<"影片信息修改成功!"<<std::endl;
break;
}
}
//未找到
if(!found)
{
std::cout<<"未找到影片"<<std::endl;
}
}
//普通用户购票
bool User::purchase(const char* movieName,int numSeat)
{
//使用movieCount作为循环条件
for(int i=0;i<movieCount;i++)
{
//要查找的影片名字与系统中的匹配 ,且座位数量充足
if(strcmp(movies[i].name,movieName)==0&&movies[i].seat>=numSeat)
{
movies[i].seat-=numSeat;
std::cout<<"购票成功,剩余座位数: "<<movies[i].seat<<std::endl;
return true;
}
}
std::cout<<"购票失败,未找到影片或座位不足"<<std::endl;
return false;
}
//普通用户退票
bool User::refund(const char* movieName,int numSeat)
{
for(int i=0;i<movieCount;i++)
{
//名字匹配则可退票
if(strcmp(movies[i].name,movieName)==0&&movies[i].seat+numSeat<=movies[i].seat+numSeat)
{
movies[i].seat+=numSeat;
std::cout<<"退票成功,剩余座位数: "<<movies[i].seat<<std::endl;
return true;
}
}
std::cout<<"退票失败,未找到影片或座位数不正确"<<std::endl;
return false;
}
//普通用户打印影票
void User::print()
{
for(int i=0;i<movieCount;i++)
{
//打印影片所具有的信息
std::cout<<"电影票信息:"<<std::endl;
std::cout<<"电影名字: "<<movies[i].name<<std::endl;
std::cout<<"电影时长: "<<movies[i].time<<std::endl;
std::cout<<"影票价格: "<<movies[i].price<<std::endl;
std::cout<<"播放所在影厅号: "<<movies[i].hall<<std::endl;
std::cout<<"座位数量: "<<movies[i].seat<<std::endl;
}
}
//管理员菜单
void Administrator::administrator_menu()
{
//菜单
std::cout<<"**************************************************"<<std::endl;
std::cout<<"* 请选择你想要操作: *"<<std::endl;
std::cout<<"* 1. 添加影片 *"<<std::endl;
std::cout<<"* 2. 显示影片 *"<<std::endl;
std::cout<<"* 3. 查找影片 *"<<std::endl;
std::cout<<"* 4. 删除影片 *"<<std::endl;
std::cout<<"* 5. 修改影片 *"<<std::endl;
std::cout<<"* 6. 退出程序 *"<<std::endl;
std::cout<<"**************************************************"<<std::endl;
int number;
number=choice();
switch(number)
{
case 1:
//管理员添加
add();
break;
case 2:
//管理员显示
show();
break;
case 3:
//管理员查找
search();
break;
case 4:
//管理员退出
expurgate();
break;
case 5:
//管理员修改
modify();
break;
case 6:
//退出
std::cout<<"退出程序"<<std::endl;
break;
default:
std::cout<<"选择无效,请重新输入"<<std::endl;
}
std::cout<<"**************************************************"<<std::endl;
std::cout<<"* 是否要继续进行操作: *"<<std::endl;
std::cout<<"* 1:是 *"<<std::endl;
std::cout<<"* 2:否 *"<<std::endl;
std::cout<<"**************************************************"<<std::endl;
int number4;
std::cin>>number4;
if(number4==1)
{
//重复上述选择过程
administrator_menu();
}
else if(number4==2)
{
//退出
std::cout<<"选择退出"<<std::endl;
entrance();
int num;
std::cin>>num;
switch(num)
{
case 1:
//选择1,则进入管理员模式
administrator.administrator_welcome();
break;
case 2:
//选择2,则进入普通用户模式
user.user_welcome();
break;
case 3:
//退出
return;
default:
std::cout<<"选择无效,请重新输入"<<std::endl;
}
}
}
//管理员选择界面
void Administrator::administrator_welcome()
{
std::cout<<"**************************************************"<<std::endl;
std::cout<<"* 是否选择登录管理员系统: *"<<std::endl;
std::cout<<"* 1:登入 *"<<std::endl;
std::cout<<"* 2:退出 *"<<std::endl;
std::cout<<"**************************************************"<<std::endl;
int number2;
std::cin>>number2;
switch(number2)
{
case 1:
//选择登入管理员页面
administrator.administrator_login();
break;
case 2:
//不登入管理员页面,选择退出
return;
}
}
//管理员登录界面
void Administrator::administrator_login()
{
//管理员登录页面
std::cout<<"欢迎进入管理员登录界面"<<std::endl;
std::cout<<"你有三次输入机会!"<<std::endl;
//默认的正确用户名为admin
const std::string str1="admin";
//默认的正确密码为123456
const std::string str2="123456";
std::string cusername;
std::string cpassword;
int attempts=0;
while(attempts<3)
{
std::cout<<"请输入你的用户名:";
std::cin>>cusername;
//清除输入缓冲区
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
std::cout<<"请输入你的密码:";
std::cin>>cpassword;
//清除输入缓冲区
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
//输入的用户名和密码与管理员系统默认的匹配
if(cusername==str1&&cpassword==str2)
{
std::cout<<"登陆成功!"<<std::endl;
administrator_menu();
return;
}
else
{
std::cout<<"登录失败,请重试"<<std::endl;
}
attempts++;
}
//只有三次登录机会,用完则登陆失败
std::cout<<"您的登录次数已用完"<<std::endl;
}
//普通用户选择界面
void User::user_welcome()
{
//普通用户选择界面
std::cout<<"**************************************************"<<std::endl;
std::cout<<"* 是否选择登录普通用户系统: *"<<std::endl;
std::cout<<"* 1:登入 *"<<std::endl;
std::cout<<"* 2:退出 *"<<std::endl;
std::cout<<"**************************************************"<<std::endl;
int number3;
std::cin>>number3;
switch(number3)
{
case 1:
//选择登入店员页面
user.user_login();
break;
case 2:
//不登入店员页面,选择退出
return;
}
}
//普通用户登录界面
void User::user_login()
{
std::string uusername;
std::string upassword;
//已注册的用户名
std::string str3;
//已注册的密码
std::string str4;
int attempts=0;
//用户注册部分,可随意注册
std::cout<<"欢迎进入普通用户注册界面"<<std::endl;
std::cout<<"请注册你的用户名:"<<std::endl;
std::cin>>str3;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
std::cout<<"请注册你的密码:"<<std::endl;
std::cin>>str4;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
//用户登录部分
std::cout<<"欢迎进入普通用户登录界面"<<std::endl;
std::cout<<"你有三次输入机会!"<<std::endl;
while(attempts<3)
{
std::cout<<"请输入你的用户名:"<<std::endl;
std::cin>>uusername;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
std::cout<<"请输入你的密码:"<<std::endl;
std::cin>>upassword;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
//输入的用户名和密码与管理员系统默认的匹配
if(uusername==str3&&upassword==str4)
{
std::cout<<"登陆成功"<<std::endl;
//跳转到用户菜单
user.user_menu();
//登录成功后退出函数
return;
}
else
{
std::cout<<"登录失败,请重试"<<std::endl;
}
attempts++;
}
//只有三次登录机会,用完则登陆失败
std::cout<<"您的登录次数已用完"<<std::endl;
}
//操作选择
int choice()
{
int choice;
std::cin>>choice;
//清除输入缓冲区
std::cin.ignore();
return choice;
}
//普通用户菜单
void User::user_menu()
{
//菜单
std::cout<<"**************************************************"<<std::endl;
std::cout<<"* 请选择你想要操作: *"<<std::endl;
std::cout<<"* 1. 购票 *"<<std::endl;
std::cout<<"* 2. 退票 *"<<std::endl;
std::cout<<"* 3. 打印影票 *"<<std::endl;
std::cout<<"* 4. 退出程序 *"<<std::endl;
std::cout<<"**************************************************"<<std::endl;
int sum;
char movieName[20];
int numSeat=0;
std::cin>>sum;
std::cin>>movieName;
std::cin>>numSeat;
switch(sum)
{
case 1:
//选择购票操作
purchase(movieName,numSeat);
break;
case 2:
//选择退票操作
refund(movieName,numSeat);
break;
case 3:
//选择打印操作
print();
break;
case 4:
//选择退出
std::cout<<"退出程序"<<std::endl;
break;
default:
std::cout<<"选择无效,请重新输入"<<std::endl;
}
std::cout<<"**************************************************"<<std::endl;
std::cout<<"* 是否要继续进行操作: *"<<std::endl;
std::cout<<"* 1:是 *"<<std::endl;
std::cout<<"* 2:否 *"<<std::endl;
std::cout<<"**************************************************"<<std::endl;
int number5;
std::cin>>number5;
if(number5==1)
{
//重复上述选择过程
user_menu();
}
else if(number5==2)
{
//退出
std::cout<<"选择退出"<<std::endl;
return;
}
}
//主函数
int main()
{
//调用系统欢迎界面
entrance();
//调用模式选择界面
chance();
}