大二上c++期末设计
这是牧心小辉第二篇博客,全程干货,分享个人感觉比较有意思的点。
这次系统制作中牧心小辉算是起到了个设计架构师的作用,代码的编写以及全盘的了解,当然也要感谢另外三位组员的贡献。
总体说明下:
这个系统执行角色分为管理员角色和顾客角色
管理员角色和顾客角色分别有:1.停车场 2.地图指引 3.品牌商品 4.vip会员四个方面的相应功能
源代码:【免费】my商场信息管理系统的源代码资源-优快云文库
一.停车场信息
管理员:
顾客:
核心函数架构:
#ifndef PARKING_H
#define PARKING_H
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <fstream>
#include <stdexcept>
#include <iomanip>// std::setprecision
#include <chrono>
using namespace std;
using namespace std::chrono;//time_point
// 基类:停车场基础功能
class BaseParking {
protected:
map<int, string> parkingSpots; // 停车位信息:车位编号 -> 车牌号
map<int, time_t> parkingTimes; // 车位编号 -> 入库时间
set<int> availableSpots; // 可购买的车位编号集合
string parkingFile; // 停车数据文件路径
void updateAvailableSpots();
public:
BaseParking() {};
BaseParking(const string& filename);
virtual ~BaseParking();
// 加载和保存数据
void loadParkingData();
void saveParkingData();
// 查询某个停车位信息
virtual void queryParkingSpot(int spot) const;
//查询所有停车信息
virtual void queryAllParkingSpots();
};
// 管理员类
class AdminParking : public BaseParking {
public:
using BaseParking::BaseParking;
// 管理员功能
void queryPurchasedSpaces(); // 查询所有已被购买车位
void queryAvailableSpots()const;//查询可购买的车位
//添加
void addParkingSpot(int spot, const string& plate);
//删除
void removeParkingSpot(int spot);
};
// 小区住户类
class ResidentParking : public BaseParking {
//private:
//set<int> ownedSpots; // 住户已购买车位编号
public:
using BaseParking::BaseParking;
// 住户功能
void purchaseSpot(int spot, const string& room);//购买新停车位
void queryOwnedSpots(const string& room) const;//查询自己的停车位
void queryAvailableSpots() const;// 查询空闲可购买车位(小区住户车主可购买的 临时车主不可查询)
//入库出库
void parkVehicle(int spot, const string& room);
void unparkVehicle(int spot, const string& room);
};
// 顾客类
class CustomerParking :public BaseParking {
private:
time_t entryTime, exitTime;
double fee;
double calculateFee(time_t entryTime, time_t exitTime) {
double duration = difftime(exitTime, entryTime) / 60.0; // 秒转换为分钟
return duration *0.05 ; // 计算费用
}
public:
using BaseParking::BaseParking;
void parkVehicle1(int spot,const string& plate);
void unparkVehicle1(int spot);
};
void adminParkingmenu();
void adminparking();
void park();
void resParkingmenu();
void resparking();
void cusParkingmenu();
void cusparking();
#endif
这个代码中感触比较深的就是构造函数的加载数据,析构函数释放数据,小白之前写的时候不晓得还能这么干,都是另起函数进行完成相应功能。
二.品牌商品
管理员:
顾客:
核心代码架构:
#ifndef BRANDMESSAGE_H
#define BRANDMESSAGE_H
#include <iostream>
#include<fstream>
#include <map>
#include <vector>
#include <string>
#include<sstream>
#include <set>
#include <stdexcept>
#include<algorithm>//find()
using namespace std;
// 基类:顾客类(查询品牌信息)
class CustomerBrand {
protected:
// 数据存储
map<int, string>Brands;
map<string, string> Locations; // 品牌名称 -> 门店位置
map<string, vector<string>> Products; // 品牌名称 -> 商品列表
map<string, vector<string>> Employees; // 品牌名称 -> 员工列表
vector<string> AvailableAreas; // 未进驻区域
public:
CustomerBrand();
virtual ~CustomerBrand();
// 加载数据
void loadFromFile();
// 保存数据
void saveToFile();
// 查询品牌信息
virtual void viewBrands()const;
// 查询品牌商品信息
virtual void viewProducts(const string&brand);
};
// 派生类:管理员类
class AdminBrand : public CustomerBrand {
public:
//构造函数
AdminBrand();
//查询品牌职工
void viewEmployee(const string& brand);
查询空余未进驻的区域
//void viewAvailableAreas();
// 招商新品牌
void addBrand(const string& brandName/*, const string& location*/);
// 删除品牌
void removeBrand(const string& brandName);
int getBrandIdByName(const string& brandName) const;
// 添加商品到品牌
void addProductToBrand(const string& brandName, const string& product);
// 删除品牌的商品
void removeProductFromBrand(const string& brandName, const string& product);
// 添加职工到品牌
void addEmployeeToBrand(const string& brandName, const string& employee);
// 删除品牌职工
void removeEmployeeFromBrand(const string& brandName, const string& employee);
};
void adminbrandhandle();
void adminbrandmenu();
void customerBrandhandle();
void customerBrandmenu();
#endif
这部分代码由于数据的存储与读取比较多,那时候调的时候是非常头疼的地方,好在后面解决了。
三.地图指引
管理员:
顾客:
核心代码架构:
#pragma once
#pragma once
//地图指引
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <unordered_map>
#include <vector>
#include <iomanip>
using namespace std;
// 商店结构体
struct Store {
string name; // 商店名称
string location; // 商店位置
string category; // 商店类别
};
// 基类:商场地图
class MallMap {
public:
MallMap(int r, int c);
virtual ~MallMap();
// 添加商店
void addStore(const string& name, int row, int col, const string& category);
void addStore(const string& name, int row, int col, const string& category, ofstream& outputFile);
// 显示地图
void showMap();
// 查找商店位置
void findStore(const string& name);
// 按类别查找商店
void findStoresByCategory(const string& category);
// 获取楼层名称(纯虚函数)
virtual string getFloorName() const = 0;
// 获取商店位置信息
string getStoreLocation(const string& name);
protected:
int rows, cols; // 地图大小
vector<vector<string>> layout; // 地图布局
unordered_map<string, Store> stores; // 商店集合
};
// 子类:第一层地图
class Floor1Map : public MallMap {
public:
Floor1Map(int r, int c) : MallMap(r, c) {}
string getFloorName() const override {
return "一层";
}
};
// 子类:第二层地图
class Floor2Map : public MallMap {
public:
Floor2Map(int r, int c) : MallMap(r, c) {}
string getFloorName() const override {
return "二层";
}
};
// 子类:第三层地图
class Floor3Map : public MallMap {
public:
Floor3Map(int r, int c) : MallMap(r, c) {}
string getFloorName() const override {
return "三层";
}
};
// 跨楼层路径规划
void navigate(MallMap* startFloor, MallMap* endFloor, const string& startStore, const string& endStore);
//管理员操作权限(总)
//管理员地图模块
void showMenu1();
void adminmap();
// 从文件加载商店信息
void loadStoresFromFile(MallMap* mallFloors[], const string& filename);
//购物者地图模块
void showMenu2();
void shopermap();
这部分代码是牧心小辉写的,我的想法就是三乘三的方格,叠加三楼的设计思路,过程中有遇到如何将三层楼的位置存储在一个文件中,而不是三个文件的问题,最终解决了,详见源代码。
四.vip会员
管理员:
顾客:
核心代码架构:
#pragma once
//vip会员
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
// 基类: VIP会员信息
class VIPMember {
protected:
string name;
int id;
string level; // 会员等级
public:
VIPMember(string name, int id, string level);
virtual void displayInfo();
//展示名字
string showname() {
return name;
}
// 保存基本信息到文件
virtual void saveToFile(ofstream& out);
// 读取基本信息从文件
virtual void loadFromFile(ifstream& in);
virtual ~VIPMember() {} // 虚析构函数
};
// 派生类: 普通VIP会员
class RegularVIP : public VIPMember {
public:
RegularVIP(string name, int id);
void displayInfo() override;
void saveToFile(ofstream& out)override;
void loadFromFile(ifstream& in) override;
};
// 派生类: 尊贵VIP会员
class PremiumVIP : public VIPMember {
private:
double discount; // 尊贵VIP会员享有的折扣
public:
PremiumVIP(string name, int id, double discount);
void displayInfo() override;
void saveToFile(ofstream& out) override;
void loadFromFile(ifstream& in) override;
};
// VIP会员管理类
class VIPMemberManager {
public:
// 添加会员
void addMember(VIPMember* member);
// 显示所有会员信息
void displayAllMembers();
// 保存所有会员信息到文件
void saveMembersToFile(const string& filename);
// 从文件读取所有会员信息
void loadMembersFromFile(const string& filename);
// 删除会员信息的方法
void deleteMember(const string& name);
//从文件中读取一个人的会员信息(为顾客操作服务
void foudshoper(string s);
~VIPMemberManager() {
for (auto& member : members) {
delete member; // 释放动态分配的内存
}
}
private:
vector<VIPMember*> members; // 存储会员的动态数组
};
//管理员操作
void adminvip();
//顾客操作
void shopervip();
这部分代码的亮点是使用到vector的动态数组,以及虚函数,虚函数妙在我只需要调用这一个函数实现vip会员信息部分和尊贵vip会员信息部分,实现动态绑定,对整体代码的简洁度,可读性有非常大的提示。
总结
具体源代码我会上传,这次比较赶水水的,主要展示了代码的主要架构和有意思的点,具体可见源代码。