通过用C++设计一个简易的景区预约系统, 训练综合运用所学知识解决实际问题的能力, 要求在分析设计中,使用面向对象思想及其主 要特性,并通过面向对象编程实现所设计的系 统。通过实际使用面向对象机制,强化面向对 象分析设计及编程的理念,提高自己的分析解 决问题能力,让自己的程序设计和调试水平得 到提高。为了缓解景区压力,人流量大,存在安 全隐患的问题,现在需要你为某景区开发一款 简单的游客预约系统。系统用户分为游客和系 统管理员两个角色。该系统中游览时段、游览 人数上限等信息由系统管理员维护管理,游客 通过系统预约功能,提前预约游览时段,系统 通过对不同时段可预约人数的控制,能有效帮 助景区控制人流量,部分缓解了景区的安全隐 患。【功能需求】该系统为两种角色的用户提供 服务,一种是系统管理员,一种是游客。系统管 理员根据分配的账号和密码登录系统,完成预 约信息配置、预约数据的查询和统计功能;游 客如果是首次登陆系统需要注册,完成注册后 可根据手机号和密码登陆系统,通过该系统完 成预约、查看预约结果、取消预约、修改预约信 息等功能。
时间: 2023-12-10 12:42:43 浏览: 79
好的,这是一个比较完整的系统,我们需要先进行分析和设计,再进行编码实现。
【需求分析】
1. 用户角色:系统管理员、游客
2. 系统管理员功能:
- 登录系统
- 预约信息配置
- 预约数据查询
- 预约数据统计
3. 游客功能:
- 注册
- 登录系统
- 预约
- 查看预约结果
- 取消预约
- 修改预约信息
4. 系统功能:
- 控制不同时段可预约人数
- 防止超售
【系统设计】
根据需求分析,我们可以设计出以下类和其主要属性和方法:
1. User类:父类,包含所有用户的共同属性和方法
- 属性:用户名、密码、手机号
- 方法:注册、登录
2. Admin类:继承自User类,系统管理员类
- 属性:无
- 方法:预约信息配置、预约数据查询、预约数据统计
3. Tourist类:继承自User类,游客类
- 属性:预约时段、预约人数、是否取消
- 方法:预约、查看预约结果、取消预约、修改预约信息
4. TimeSlot类:
- 属性:时段编号、可预约人数、已预约人数
- 方法:无
5. ReservationSystem类:
- 属性:时段列表、已预约人数
- 方法:初始化时段列表、控制不同时段可预约人数、预约信息统计
【编码实现】
下面是C++代码实现,具体实现细节可以参考注释:
```cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 时段类
class TimeSlot {
public:
TimeSlot(int id, int maxNum) : id(id), maxNum(maxNum), reservedNum(0) {}
int getId() const {
return id;
}
int getMaxNum() const {
return maxNum;
}
int getReservedNum() const {
return reservedNum;
}
// 预约人数加1
void reserve() {
reservedNum++;
}
// 取消预约,预约人数减1
void cancel() {
reservedNum--;
}
private:
int id; // 时段编号
int maxNum; // 可预约人数上限
int reservedNum; // 已预约人数
};
// 用户类,包括管理员和游客
class User {
public:
User(string username, string password, string phoneNumber) :
username(username), password(password), phoneNumber(phoneNumber) {}
string getUsername() const {
return username;
}
string getPassword() const {
return password;
}
string getPhoneNumber() const {
return phoneNumber;
}
// 注册
virtual bool signUp() = 0;
// 登录
virtual bool signIn() = 0;
private:
string username; // 用户名
string password; // 密码
string phoneNumber; // 手机号
};
// 管理员类
class Admin : public User {
public:
Admin(string username, string password, string phoneNumber) :
User(username, password, phoneNumber) {}
// 预约信息配置
void configure(vector<TimeSlot>& timeSlots) {
cout << "请输入时段总数:" << endl;
int num;
cin >> num;
for (int i = 0; i < num; i++) {
cout << "请输入第" << i+1 << "个时段可预约人数上限:" << endl;
int maxNum;
cin >> maxNum;
TimeSlot timeSlot(i+1, maxNum);
timeSlots.push_back(timeSlot);
}
cout << "时段配置成功!" << endl;
}
// 预约数据查询
void query(const vector<TimeSlot>& timeSlots) {
cout << "当前可预约时段如下:" << endl;
for (const auto& timeSlot : timeSlots) {
cout << "时段" << timeSlot.getId() << ":";
cout << "可预约人数上限为" << timeSlot.getMaxNum() << ",";
cout << "已预约人数为" << timeSlot.getReservedNum() << endl;
}
}
// 预约数据统计
void statistics(const vector<TimeSlot>& timeSlots) {
int totalMaxNum = 0, totalReservedNum = 0;
for (const auto& timeSlot : timeSlots) {
totalMaxNum += timeSlot.getMaxNum();
totalReservedNum += timeSlot.getReservedNum();
}
cout << "当前总可预约人数上限为" << totalMaxNum << ",";
cout << "已预约人数为" << totalReservedNum << endl;
}
// 管理员不需要注册,因此返回false
bool signUp() {
return false;
}
// 登录
bool signIn() {
string username, password;
cout << "请输入管理员用户名:" << endl;
cin >> username;
cout << "请输入管理员密码:" << endl;
cin >> password;
if (username == getUsername() && password == getPassword()) {
cout << "管理员登录成功!" << endl;
return true;
} else {
cout << "管理员用户名或密码错误,请重新输入!" << endl;
return false;
}
}
};
// 游客类
class Tourist : public User {
public:
Tourist(string username, string password, string phoneNumber) :
User(username, password, phoneNumber) {}
// 预约
bool reserve(vector<TimeSlot>& timeSlots) {
// 显示可预约时段列表
cout << "当前可预约时段如下:" << endl;
for (const auto& timeSlot : timeSlots) {
cout << "时段" << timeSlot.getId() << ":";
cout << "可预约人数上限为" << timeSlot.getMaxNum() << ",";
cout << "已预约人数为" << timeSlot.getReservedNum() << endl;
}
// 选择预约时段
cout << "请输入要预约的时段编号:" << endl;
int id;
cin >> id;
if (id < 1 || id > timeSlots.size()) {
cout << "时段编号错误,请重新输入!" << endl;
return false;
}
TimeSlot& timeSlot = timeSlots[id-1];
if (timeSlot.getMaxNum() == timeSlot.getReservedNum()) {
cout << "该时段已预约满,请选择其他时段!" << endl;
return false;
}
// 选择预约人数
cout << "请输入要预约的人数:" << endl;
int num;
cin >> num;
if (num <= 0 || num > timeSlot.getMaxNum() - timeSlot.getReservedNum()) {
cout << "预约人数错误,请重新输入!" << endl;
return false;
}
// 预约成功,时段预约人数加1
timeSlot.reserve();
reservedTimeSlotId = id;
reservedNum = num;
isCanceled = false;
cout << "预约成功!" << endl;
return true;
}
// 查看预约结果
void check() const {
if (isCanceled) {
cout << "您还没有预约任何时段!" << endl;
} else {
cout << "您的预约信息如下:" << endl;
cout << "预约时段编号为" << reservedTimeSlotId << ",";
cout << "预约人数为" << reservedNum << endl;
}
}
// 取消预约
bool cancel(vector<TimeSlot>& timeSlots) {
if (isCanceled) {
cout << "您还没有预约任何时段!" << endl;
return false;
} else {
TimeSlot& timeSlot = timeSlots[reservedTimeSlotId-1];
timeSlot.cancel();
isCanceled = true;
cout << "取消预约成功!" << endl;
return true;
}
}
// 修改预约信息
bool modify(vector<TimeSlot>& timeSlots) {
if (isCanceled) {
cout << "您还没有预约任何时段!" << endl;
return false;
} else {
TimeSlot& timeSlot = timeSlots[reservedTimeSlotId-1];
timeSlot.cancel();
// 重新预约
reserve(timeSlots);
return true;
}
}
// 游客需要注册
bool signUp() {
cout << "请输入手机号:" << endl;
string phoneNumber;
cin >> phoneNumber;
setPhoneNumber(phoneNumber);
cout << "请输入密码:" << endl;
string password;
cin >> password;
setPassword(password);
cout << "注册成功!" << endl;
return true;
}
// 登录
bool signIn() {
string phoneNumber, password;
cout << "请输入手机号:" << endl;
cin >> phoneNumber;
cout << "请输入密码:" << endl;
cin >> password;
if (phoneNumber == getPhoneNumber() && password == getPassword()) {
cout << "登录成功!" << endl;
return true;
} else {
cout << "手机号或密码错误,请重新输入!" << endl;
return false;
}
}
private:
int reservedTimeSlotId; // 已预约时段编号
int reservedNum; // 已预约人数
bool isCanceled; // 是否已取消预约
};
// 预约系统类
class ReservationSystem {
public:
// 初始化时段列表
ReservationSystem() {
initTimeSlots();
}
// 控制不同时段可预约人数
void control() {
for (auto& timeSlot : timeSlots) {
timeSlot.reserve(); // 先将已预约人数清零
}
}
// 预约信息统计
void statistics() const {
int totalMaxNum = 0, totalReservedNum = 0;
for (const auto& timeSlot : timeSlots) {
totalMaxNum += timeSlot.getMaxNum();
totalReservedNum += timeSlot.getReservedNum();
}
cout << "当前总可预约人数上限为" << totalMaxNum << ",";
cout << "已预约人数为" << totalReservedNum << endl;
}
// 启动系统
void start() {
// 初始化管理员和游客
Admin admin("admin", "123456", "");
Tourist tourist("", "", "");
// 预约信息配置
if (admin.signIn()) {
admin.configure(timeSlots);
}
// 控制不同时段可预约人数
control();
// 预约数据查询
if (admin.signIn()) {
admin.query(timeSlots);
}
// 预约数据统计
if (admin.signIn()) {
statistics();
admin.statistics(timeSlots);
}
// 游客注册
if (tourist.signUp()) {
tourists.push_back(tourist);
}
// 游客登录
while (true) {
cout << "请输入手机号和密码以登录系统(以空格分隔):" << endl;
string phoneNumber, password;
cin >> phoneNumber >> password;
bool isTouristSignIn = false;
for (auto& tourist : tourists) {
if (tourist.getPhoneNumber() == phoneNumber && tourist.getPassword() == password) {
isTouristSignIn = true;
while (true) {
cout << "请选择您要进行的操作:" << endl;
cout << "1. 预约" << endl;
cout << "2. 查看预约结果" << endl;
cout << "3. 取消预约" << endl;
cout << "4. 修改预约信息" << endl;
int choice;
cin >> choice;
switch (choice) {
case 1:
tourist.reserve(timeSlots);
break;
case 2:
tourist.check();
break;
case 3:
tourist.cancel(timeSlots);
break;
case 4:
tourist.modify(timeSlots);
break;
default:
cout << "操作未定义,请重新输入!" << endl;
break;
}
cout << "是否继续进行其他操作?(y/n)" << endl;
char c;
cin >> c;
if (c == 'n' || c == 'N') {
break;
}
}
break;
}
}
if (!isTouristSignIn) {
cout << "登录失败,请重新输入手机号和密码!" << endl;
}
}
}
private:
vector<TimeSlot> timeSlots; // 时段列表
vector<Tourist> tourists; // 游客列表
// 初始化时段列表
void initTimeSlots() {
timeSlots.push_back(TimeSlot(1, 10));
timeSlots.push_back(TimeSlot(2, 20));
timeSlots.push_back(TimeSlot(3, 15));
timeSlots.push_back(TimeSlot(4, 30));
}
};
int main() {
ReservationSystem system;
system.start();
return 0;
}
```
以上就是一个简单的景区预约系统的设计和实现,该系统使用了面向对象思想和主要特性,并通过面向对象编程实现了所设计的系统,可以有效帮助景区控制人流量,部分缓解了景区的安全隐患。
阅读全文