食堂菜品管理系统
学校拟开发一套食堂菜品管理系统,以便对菜品和同学们的评价进行管理,其中包含如下信息:
商户:商户名称、柜面位置、电话……
菜品:菜品编号、菜品名称、价格、所属商户……
学生:注册账号、昵称、电话……
食堂里的商户均不同名,一个商户可以提供多样菜品;食堂对所有商户的菜品进行编号,每样菜品由其唯一的商户提供;学生可对菜品进行评价,系统要存储学生对菜品的评分、评价内容和评价时间。
基本要求包括:
1、提供用户操作的菜单和界面,用户至少可分为学生和商户两种类型。
2、设计相应的信息表,用于记录信息,如学生信息表、商户信息表、菜品信息表、评价信息表等,要求以文件的形式存储,格式可以自行设计。
3、商户可进行如下操作:
(1)本商户信息的新增、查看、修改、删除等。
(2)发布和更新菜品信息。
(3)查询本商户菜品评价信息。
4、学生可进行如下操作:
(4)个人信息的新增、查看、修改、删除等。
(5)对各菜品信息、评价信息、统计信息(评分高低排序)的浏览。
(6)对各菜品的评分和评价。
5、系统退出时,更新相应文件中的信息;当下次运行程序时,从文件读取所有信息。
商户头文件代码(Merchant.h)
#pragma once
#ifndef MERCHANT_H
#define MERCHANT_H
class Merchant {
private:
std::string account;
std::string name;
std::string location;
std::string phone;
std::string mpassword;
public:
Merchant(std::string account, std::string name, std::string location, std::string phone, std::string mpassword) : account(account),name(name), location(location), phone(phone), mpassword(mpassword){}
std::string get_account()const;
std::string get_name()const;
std::string get_location()const;
std::string get_phone()const;
std::string get_mpassword()const;
void Set_name(std::string name);
void Set_location(std::string location);
void Set_phone(std::string phone);
void Reset_mpassword(std::string mpassword);
};
std::string Merchant::get_account()const { return account; }
std::string Merchant::get_name() const { return name; }
std::string Merchant::get_location() const { return location; }
std::string Merchant::get_phone() const { return phone; }
std::string Merchant::get_mpassword()const { return mpassword; }
void Merchant::Set_name(std::string name) { this->name = name; }
void Merchant::Set_location(std::string location) { this->location = location; }
void Merchant::Set_phone(std::string phone) { this->phone = phone; }
void Merchant::Reset_mpassword(std::string mpassword) { this->mpassword = mpassword; }
#endif
学生头文件代码(Student.h)
#pragma once
#ifndef STUDENT_H
#define STUDENT_H
class Student {
private:
std::string account;
std::string nickname;
std::string phone;
std::string spassword;
public:
Student(std::string account, std::string nickname, std::string phone, std::string spassword) : account(account), nickname(nickname), phone(phone),spassword(spassword) {}
std::string get_account()const;
std::string get_nickname()const;
std::string get_phone()const;
std::string get_spassword()const;
void Set_account(std::string account);
void Set_nickname(std::string nickname);
void Set_phone(std::string phone);
void Reset_spassword(std::string spassword);
};
std::string Student::get_account() const { return account; }
std::string Student::get_nickname() const { return nickname; }
std::string Student::get_phone() const { return phone; }
std::string Student::get_spassword()const { return spassword; }
void Student::Set_account(std::string account) { this->account = account; }
void Student::Set_nickname(std::string nickname) { this->nickname = nickname; }
void Student::Set_phone(std::string phone) { this->phone = phone; }
void Student::Reset_spassword(std::string spassword) { this->spassword = spassword; }
#endif
菜品头文件代码(Dish.h)
#pragma once
#ifndef Dish_H
#define Dish_H
class Dish {
private:
int dishId;
std::string name;
double price;
std::string merchantName;
public:
Dish(int id, std::string name, double price, std::string merchantName) : dishId(id), name(name), price(price), merchantName(merchantName) {}
int get_dishId()const;
std::string get_name()const;
double get_price()const;
std::string get_merchantName()const;
void Set_dishId(int dishId);
void Set_name(std::string name);
void Set_price(double price);
void Set_merchantName(std::string merchantName);
};
int Dish::get_dishId() const { return dishId; }
std::string Dish::get_name() const { return name; }
double Dish::get_price() const { return price; }
std::string Dish::get_merchantName() const { return merchantName; }
void Dish::Set_dishId(int dishId) { this->dishId = dishId; }
void Dish::Set_name(std::string name) { this->name = name; }
void Dish::Set_price(double price) { this->price = price; }
void Dish::Set_merchantName(std::string merchantName) { this->merchantName = merchantName; }
#endif
评价头文件代码(Review.h)
#pragma once
#ifndef REVIEW_H
#define REVIEW_H
class Review {
private:
std::string studentAccount;
std::string studentNickName;
int dishId;
double rating;
std::string content;
long long time;
public:
Review(std::string studentAccount, std::string studentNickName, int dishId, double rating, std::string content, long long time) : studentAccount(studentAccount), studentNickName(studentNickName), dishId(dishId), rating(rating), content(content), time(time) {}
std::string get_studentAccount() const;
std::string get_studentNickName() const;
int get_dishId() const;
double get_rating() const;
std::string get_content() const;
long long get_time() const;
std::string get_timestring() const;
void Set_studentAccount(std::string studentAccount);
void Set_studentNickName(std::string studentNickName);
void Set_dishId(int dishId);
void Set_rating(double rating);
void Set_content(std::string content);
void Set_time(long long time);
};
std::string Review::get_studentAccount() const { return studentAccount; }
std::string Review::get_studentNickName() const { return studentNickName; }
int Review::get_dishId() const { return dishId; }
double Review::get_rating() const { return rating; }
std::string Review::get_content() const { return content; }
long long Review::get_time() const { return time; }
std::string Review::get_timestring() const {
time_t pt = get_time();
return std::string(ctime(&pt));
}
void Review::Set_studentAccount(std::string studentAccount) { this->studentAccount = studentAccount; }
void Review::Set_studentNickName(std::string studentNickName) { this->studentNickName = studentNickName; }
void Review::Set_dishId(int dishId) { this->dishId = dishId; }
void Review::Set_rating(double rating) { this->rating = rating; }
void Review::Set_content(std::string content) { this->content = content; }
void Review::Set_time(long long time) { this->time = time; }
#endif
管理员头文件代码(Manager.h)
#pragma once
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <string>
#include <map>
#include <ctime> //获取时间
#include <algorithm>
#include <conio.h> //关闭回显
#include "Merchant.h"
#include "Student.h"
#include "Dish.h"
#include "Review.h"
#ifndef MANAGER_H
#define MANAGER_H
//文件存储位置自定义
const std::string merchantFILE = "E:/merchants.txt";
const std::string studentFILE = "E:/students.txt";
const std::string dishFILE = "E:/dishes.txt";
const std::string reviewFILE = "E:/reviews.txt";
//管理员密码
const std::string THE_KEY = "1234";
class CanteenManagementSystem {
private:
std::vector<Merchant> merchants; //创建一个商户容器用来存放商户信息
std::vector<Dish> dishes; //创建一个菜品容器用来存放菜品信息
std::vector<Student> students; //创建一个学生容器用来存放学生信息
std::vector<Review> reviews; //创建一个评价容器用来存放评价信息
public:
void MerchantloadFromFile(); // 加载商户信息
void StudentloadFromFile(); // 加载学生信息
void DishloadFromFile(); // 加载菜品信息
void ReviewloadFromFile(); // 加载评价信息
void loadFromFile(); // 从文件中加载所有信息
void MerchantnewToFile(); // 保存商户信息到文件
void StudentnewToFile(); // 保存学生信息到文件
void DishnewToFile(); // 保存菜品信息到文件
void ReviewnewToFile(); // 保存评价信息到文件
void newToFile(); // 保存所有信息到文件
void addDish(const std::string account); // 新增菜品信息
void addReviewdate(const std::string account); // 新增评价信息
void addMerchant(); // 新增商户信息
void addStudent(); // 新增学生信息
void viewMerchants(); //查看商户信息
void viewStudents(); //查看学生信息
void viewDishes(); //查看菜品信息
void viewDishesdateByMerchant(const std::string account); //查看利用商户姓名查看此商户的菜品信息
void viewReviews(); //查看评价信息
void viewReviewsdatebymerchant(const std::string account); //查看利用商户姓名查看此商户的评价信息
void viewMerchantaccount(); //查看商户的账号和昵称
void viewStudentaccount(); //查看学生的账号和昵称
//辅助更新信息的函数
void updateDishesByMerchant(const std::string merchantName, const std::string newMerchantName); //由商户姓名更新菜品信息中的商户姓名
void updateDish(const std::string account); //更新菜品信息
void updateReviewsByStudent(const std::string account, const std::string name); //由学生账号修改评价信息里面的学生昵称
//更新信息的函数
void updateMerchant(const std::string& account); //由商户姓名更新商户信息
void updateStudent(const std::string& account); //由学生账号更新学生信息
void deleteMerchantdate(const std::string& account); //删除商户信息
void deleteStudentdate(const std::string account); //删除学生信息
void deleteDishdate(std::string account); //删除菜品信息
std::string& trim(std::string& str); //剪掉字符串的首尾空格部分
bool isNumber(const std::string& str);
bool inputInterger(const std::string& str); //验证输入是否可转整数
bool inputFloat(const std::string& str); //验证输入是否可转double型
bool inputPhoneNumber(const std::string& str); //验证输入是否符合电话号码规定
void bubbleSortReviewsByRating(std::vector<Review>& reviews);
void managermenu(); //管理员界面菜单
void merchantmenu(); //商户界面菜单
void studentmenu(); //学生界面菜单
void menu(); //主菜单
// 其他必要的函数
bool isMerchant(std::string &naccount);//
bool isStudent(std::string &naccount);
bool isManager();
void resetspassword();
void resetmpassword();
};
void CanteenManagementSystem::MerchantloadFromFile() {
// 加载商户信息
std::ifstream file(merchantFILE);
std::string line;
while (getline(file, line)) {
std::istringstream ss(line);
std::vector<std::string> seglist;
std::string segment;
while (std::getline(ss, segment, '-'))
{
trim(segment);
seglist.push_back(segment);
}
if (seglist.size() != 5)
throw std::invalid_argument("预期有5个属性进行反序列化!");
try {
merchants.push_back(Merchant(seglist[0], seglist[1], seglist[2],seglist[3], seglist[4]));
}
catch (const std::exception& e) {
throw std::runtime_error("反序列化过程中数据转换错误:" + std::string(e.what()));
}
}
file.close();
}
void CanteenManagementSystem::StudentloadFromFile() {
// 加载学生信息
std::ifstream file(studentFILE);
std::string line;
while (getline(file, line)) {
std::istringstream ss(line);
std::vector<std::string> seglist;
std::string segment;
while (std::getline(ss, segment, '-'))
{
trim(segment);
seglist.push_back(segment);
}
if (seglist.size() != 4)
throw std::invalid_argument("预期有4个属性进行反序列化!");
try {
students.push_back(Student(seglist[0], seglist[1], seglist[2],seglist[3]));
}
catch (const std::exception& e) {
throw std::runtime_error("反序列化过程中数据转换错误:" + std::string(e.what()));
}
}
file.close();
}
void CanteenManagementSystem::DishloadFromFile() {
// 加载菜品信息
std::ifstream file(dishFILE);
std::string line;
while (getline(file, line)) {
std::istringstream ss(line);
std::vector<std::string> seglist;
std::string segment;
while (std::getline(ss, segment, '-'))
{
trim(segment);
seglist.push_back(segment);
}
if (seglist.size() != 4)
throw std::invalid_argument("预期有4个属性进行反序列化!");
try {
dishes.push_back(Dish(std::stoi(seglist[0]), seglist[1], std::stod(seglist[2]), seglist[3]));
}
catch (const std::exception& e) {
throw std::runtime_error("反序列化过程中数据转换错误:" + std::string(e.what()));
}
}
file.close();
}
void CanteenManagementSystem::ReviewloadFromFile() {
//加载评价信息
std::ifstream file(reviewFILE);
std::string line;
while (getline(file, line)) {
std::istringstream ss(line);
std::vector<std::string> seglist;
std::string segment;
while (std::getline(ss, segment, '-'))
{
trim(segment);
seglist.push_back(segment);
}
if (seglist.size() != 6)
throw std::invalid_argument("预期有6个属性进行反序列化!");
try {
reviews.push_back(Review(seglist[0], seglist[1], std::stoi(seglist[2]), std::stod(seglist[3]), seglist[4], std::stoll(seglist[5])));
}
catch (const std::exception& e) {
throw std::runtime_error("反序列化过程中数据转换错误:" + std::string(e.what()));
}
}
file.close();
}
void CanteenManagementSystem::loadFromFile() {
// 加载商户信息
MerchantloadFromFile();
// 加载学生信息
StudentloadFromFile();
// 加载菜品信息
DishloadFromFile();
// 加载评价信息
ReviewloadFromFile();
}
void CanteenManagementSystem::MerchantnewToFile() {
// 保存商户信息
std::ofstream file(merchantFILE, std::ios::out);
for (const auto& merchant : merchants) {
file << merchant.get_account() << "-" << merchant.get_name() << "-" << merchant.get_location() << "-" << merchant.get_phone() << "-" << merchant.get_mpassword() << std::endl;
}
file.close();
}
void CanteenManagementSystem::StudentnewToFile() {
// 保存学生信息
std::ofstream file(studentFILE, std::ios::out);
for (const auto& student : students) {
file << student.get_account() << "-" << student.get_nickname() << "-" << student.get_phone() << "-" << student.get_spassword() << std::endl;
}
file.close();
}
void CanteenManagementSystem::DishnewToFile() {
// 保存菜品信息
std::ofstream file(dishFILE, std::ios::out);
for (const auto& dish : dishes) {
file << dish.get_dishId() << "-" << dish.get_name() << "-" << dish.get_price() << "-" << dish.get_merchantName() << std::endl;
}
file.close();
}
void CanteenManagementSystem::ReviewnewToFile() {
std::ofstream file(reviewFILE, std::ios::out);
for (const auto& review : reviews) {
file << review.get_studentAccount() << "-" << review.get_studentNickName() << "-" << review.get_dishId() << "-" << review.get_rating() << "-" << review.get_content() << "-" << review.get_time() << std::endl;
}
file.close();
}
void CanteenManagementSystem::newToFile() {
// 保存商户信息
MerchantnewToFile();
// 保存学生信息
StudentnewToFile();
// 保存菜品信息
DishnewToFile();
// 保存评价信息
ReviewnewToFile();
}
void CanteenManagementSystem::addDish(const std::string account) {
int dishId;
double price;
std::string name, merchantName, term1, term2;
system("cls");
std::cout << "发布菜品信息" << std::endl;
std::cout << "请输入菜品编号: ";
bool flag = true;
while (flag) // 确保菜品编号唯一
{
flag = false;
//输入必须为整数,保证程序健壮性
while (true)
{
term1.clear();
std::getline(std::cin, term1);
term1 = trim(term1); // 删除首尾空格
if (inputInterger(term1))break;
}
dishId = std::stoi(term1);
term1.~basic_string();
for (const auto& dish : dishes) {
if (dish.get_dishId() == dishId) {
flag = true;
std::cout << "菜品已存在,请重新输入" << std::endl;
break;
}
}
}
std::cout << "请输入菜品名称: ";
std::getline(std::cin, name);
trim(name); // 删除首尾空格
std::cout << "请输入价格: ";
//确保价格是浮点型,提高程序健壮性
while (true)
{
term2.clear();
std::getline(std::cin, term2);
trim(term2); // 删除首尾空格
if (inputFloat(term2))break;
}
price = std::stod(term2);
for (int i = 0; i < merchants.size(); i++) {
if (merchants[i].get_account() == account) {
merchantName = merchants[i].get_name();
break;
}
}
dishes.push_back(Dish(dishId, name, price, merchantName));
DishnewToFile();
std::cout << "添加成功" << std::endl;
system("pause");
}
void CanteenManagementSystem::addReviewdate(const std::string account) {
system("cls");
bool flag = false;
std::string content, term, studentNickName, Account = account;
int dishId;
double rating;
time_t time;
if (!dishes.empty())
{
std::cout << "餐厅提供菜品如下:" << std::endl;
for (const auto& dish : dishes)
{
std::cout << "菜品编号: " << dish.get_dishId() << " ,菜品名称: " << dish.get_name() << " ,价格: " << dish.get_price() << " ,所属商户: " << dish.get_merchantName() << std::endl;
}
}
else {
std::cout << "餐厅现在无菜品提供 " << std::endl;
system("pause");
return;
}
std::cout << "请输入菜品编号: ";
//确保输入菜品编号为整数,提高程序健壮性
while (true)
{
term.clear();
getline(std::cin, term);
term = trim(term); // 删除首尾空格
if (inputInterger(term))break;
}
dishId = std::stoi(term);
flag = false;
auto dish = std::find_if(dishes.begin(), dishes.end(), [&](const Dish& d) {
return d.get_dishId() == dishId;
});
if (dish == dishes.end()) {
std::cout << "菜品不存在" << std::endl;
system("pause");
return;
}
flag = true;
while (flag)
{
flag = false;
std::cout << "请输入评分(0-5): ";
while (true)
{
term.clear();
getline(std::cin, term);
trim(term); // 删除首尾空格
if (inputFloat(term))break;
}
rating = std::stod(term);
if (rating < 0 || rating>5) {
flag = true;
std::cout << "评分输入错误,请重新输入" << std::endl;
}
}
std::cout << "请输入评价: ";
getline(std::cin, content);
content = trim(content);
time = std::time(nullptr);
for (auto& student : students) {
if (student.get_account() == account) {
studentNickName = student.get_nickname();
break;
}
}
std::cout << "评价成功" << std::endl;
system("pause");
reviews.push_back(Review(Account, studentNickName, dishId, rating, content, time));
ReviewnewToFile();
}
void CanteenManagementSystem::addMerchant() {
std::string name, location, phone, account, mpassword;
char ch;
bool flag = true;
while (flag)
{
system("cls");
flag = false;
std::cout << "注册商户信息" << std::endl;
std::cout << "请设置账号:";
//确保商户账号为数字
while (true)
{
account.clear();
std::getline(std::cin, account);
account = trim(account); // 删除首尾空格
if (inputInterger(account))break;
}
for (const auto& merchant : merchants) {
if (merchant.get_account() == account) {
flag = true;
std::cout << "商户账号已存在,请重新输入";
system("pause");
break;
}
}
}
std::cout << "请设置密码:";
while (true) {
ch = _getch();//读取每一个字符但不显示在控制台
if (ch == '\r' || ch == '\n') {
break;//回车表示密码输入结束
}
else {
mpassword += ch;
std::cout << '*';//显示星号
}
}
trim(mpassword); // 删除首尾空格
std::cout << std::endl;//回车被密码吃掉了,这里补一个回车
flag = true;
while (flag)
{
flag = false;
std::cout << "输入商户姓名:";
name.clear();
getline(std::cin, name);
trim(name); // 删除首尾空格
for (const auto& merchant : merchants) {
if (merchant.get_name() == name) {
flag = true;
std::cout << "此商户已存在,请重新输入";
system("pause");
break;
}
}
}
flag = true;
while (flag)
{
flag = false;
std::cout << "输入柜面位置:";
location.clear();
getline(std::cin, location);
trim(location);
for (const auto& merchant : merchants) {
if (merchant.get_location() == location) {
flag = true;
std::cout << "商户柜面已存在,请重新输入";
system("pause");
break;
}
}
}
std::cout << "输入电话: ";
//确保输入电话正确
while (true)
{
phone.clear();
getline(std::cin, phone);
trim(phone);
if (inputPhoneNumber(phone))break;
}
merchants.push_back(Merchant(account,name, location, phone,mpassword));
MerchantnewToFile();
std::cout << "注册成功" << std::endl;
system("pause");
}
void CanteenManagementSystem::addStudent() {
std::string nickName, phone, account, spassword;
char ch;
bool flag = true;
while (flag)
{
system("cls");
flag = false;
std::cout << "注册学生信息" << std::endl;
std::cout << "请输入账号: ";
//确保学生账号为数字
while (true)
{
account.clear();
std::getline(std::cin, account);
account = trim(account); // 删除首尾空格
if (inputInterger(account))break;
}
for (const auto& student : students) {
if (student.get_account() == account) {
flag = true;
std::cout << "学生账号已存在,请重新输入";
system("pause");
break;
}
}
}
std::cout << "请设置密码:";
while (true) {
ch = _getch();//读取每一个字符但不显示在控制台
if (ch == '\r' || ch == '\n') {
break;//回车表示密码输入结束
}
else {
spassword += ch;
std::cout << '*';//显示星号
}
}
trim(spassword); // 删除首尾空格
std::cout << std::endl;//回车被密码吃掉了,这里补一个回车
flag = true;
while (flag)
{
flag = false;
std::cout << "请输入昵称: ";
getline(std::cin, nickName);
trim(nickName); // 删除首尾空格
for (const auto& student : students) {
if (student.get_nickname() == nickName) {
flag = true;
std::cout << "学生昵称已存在,请重新输入";
system("pause");
break;
}
}
}
std::cout << "请输入电话: ";
//确保电话正确
while (true)
{
phone.clear();
getline(std::cin, phone);
phone = trim(phone); // 删除首尾空格
if (inputPhoneNumber(phone))break;
}
students.push_back(Student(account, nickName, phone,spassword));
StudentnewToFile();
std::cout << "注册成功" << std::endl;
system("pause");
}
void CanteenManagementSystem::viewMerchants() {
system("cls");
// 如果没有商户,直接返回
if (merchants.empty()) {
std::cout << "No merchants available." << std::endl;
system("pause");
return;
}
std::cout << "商户信息:" << std::endl;
for (const auto& merchant : merchants) {
std::cout << "商户账号: " << merchant.get_account() << ", 商户名称: " << merchant.get_name() << " ,柜面位置: " << merchant.get_location() << " ,电话号码: " << merchant.get_phone() << std::endl;
}
system("pause");
}
void CanteenManagementSystem::viewStudents() {
system("cls");
// 如果没有学生,直接返回
if (students.empty()) {
std::cout << "No students available." << std::endl;
system("pause");
return;
}
std::cout << "学生信息:" << std::endl;
for (const auto& student : students) {
std::cout << "学生账号: " << student.get_account() << " ,昵称: " << student.get_nickname() << " ,电话: " << student.get_phone() << std::endl;
}
system("pause");
}
void CanteenManagementSystem::viewDishes() {
system("cls");
// 如果没有菜品,直接返回
if (dishes.empty()) {
std::cout << "No dishes available." << std::endl;
system("pause");
return;
}
for (const auto& dish : dishes)
{
std::cout << "菜品编号: " << dish.get_dishId() << " ,菜品名称: " << dish.get_name() << " ,价格: " << dish.get_price() << " ,所属商户: " << dish.get_merchantName() << std::endl;
}
system("pause");
}
void CanteenManagementSystem::viewDishesdateByMerchant(const std::string account) {
std::string name;
system("cls");
// 如果没有菜品,直接返回
if (dishes.empty()) {
std::cout << "No dishes available." << std::endl;
system("pause");
return;
}
for (int i = 0; i < merchants.size(); i++) {
if (merchants[i].get_account() == account) {
name = merchants[i].get_name();
break;
}
}
std::cout << "菜品信息:" << std::endl;
for (const auto& dish : dishes)
{
if (dish.get_merchantName() == name) {
std::cout << "菜品编号: " << dish.get_dishId() << " ,菜品名称: " << dish.get_name() << " ,价格: " << dish.get_price() << " ,所属商户: " << name << std::endl;
}
}
system("pause");
}
void CanteenManagementSystem::viewReviews() {
system("cls");
// 如果没有评论,直接返回
if (reviews.empty()) {
std::cout << "No reviews available." << std::endl;
system("pause");
return;
}
// 创建一个副本以免修改原始数据
std::vector<Review> sortedReviews = reviews;
std::cout << "评价信息:"<< std::endl;
// 使用 bubbleSortReviewsByRating 自定义排序函数,按评分从大到小排序
bubbleSortReviewsByRating(sortedReviews);
// 输出排序后的评论
std::cout << "输出顺序按评分标准由高到低:" << std::endl;
std::cout << std::endl;
for (const Review& review : sortedReviews) {
std::cout << "昵称为 " << review.get_studentNickName() << " 的用户对菜品编号为 " << review.get_dishId() << " 的菜品给出 " << review.get_rating() <<"分 的评分" << std::endl;
std::cout << "评价内容为:" << review.get_content() << " ,评价时间: " << review.get_timestring() << std::endl;
}
system("pause");
}
void CanteenManagementSystem::viewReviewsdatebymerchant(const std::string account) {
std::string mername;
bool flag = true;
while (flag) {
system("cls");
for (int i = 0; i < merchants.size(); i++) {
if (merchants[i].get_account() == account) {
mername = merchants[i].get_name();
break;
}
}
if (!flag) {
//这里利用菜品做桥梁,利用菜品里的商户姓名和菜品编号对商户信息和评价信息进行搭桥
system("cls");
// 如果没有菜品,直接返回
if (dishes.empty()) {
std::cout << "No dishes available." << std::endl;
system("pause");
return;
}
// 如果没有评价,直接返回
if (reviews.empty()) {
std::cout << "No reviews available." << std::endl;
system("pause");
return;
}
std::cout << "评价信息:" << std::endl;
for (const auto& dish : dishes) {
if (dish.get_merchantName() == mername) {
for (const auto& review : reviews) {
if (review.get_dishId() == dish.get_dishId()) {
std::cout << "学生账号:" << review.get_studentAccount() << " ,昵称:" << review.get_studentNickName() << " ,菜品编号:" << review.get_dishId() << " ,评分:" << review.get_rating() << std::endl;
std::cout << " 评价:" << review.get_content() << " ,评价时间: " << review.get_timestring() << std::endl;
}
}
}
}
system("pause");
}
else {
std::cout << "该商户不存在" << std::endl;
system("pause");
return;
}
}
}
void CanteenManagementSystem::viewMerchantaccount() {
system("cls");
// 如果没有商户,直接返回
if (merchants.empty()) {
std::cout << "No merchants available." << std::endl;
system("pause");
return;
}
std::cout << "商户信息:" << std::endl;
for (const auto& merchant : merchants) {
std::cout << "商户账号: " << merchant.get_account() << ", 商户名称: " << merchant.get_name() << std::endl;
}
system("pause");
}
void CanteenManagementSystem::viewStudentaccount() {
system("cls");
// 如果没有学生,直接返回
if (students.empty()) {
std::cout << "No students available." << std::endl;
system("pause");
return;
}
std::cout << "学生信息:" << std::endl;
for (const auto& student : students) {
std::cout << "学生账号: " << student.get_account() << " ,昵称: " << student.get_nickname() << std::endl;
}
system("pause");
}
void CanteenManagementSystem::updateMerchant(const std::string& account) {
int i;
system("cls");
for (i = 0; i < merchants.size(); i++) {
if (merchants[i].get_account() == account)break;
}
std::string name = merchants[i].get_name();
bool flag = true;
flag = true;
std::cout << "请输入新的商户信息:" << std::endl;
std::string newName, newLocation, newPhone;
while (flag)
{
flag = false;
std::cout << "输入新的商户姓名:";
newName.clear();
getline(std::cin, newName);
trim(newName); // 删除首尾空格
for (const auto& merchant : merchants) {
if (newName != merchants[i].get_name() && merchant.get_name() == newName) {
flag = true;
std::cout << "此商户已存在,请重新输入";
system("pause");
break;
}
}
}
//更新菜品信息里的商户姓名
updateDishesByMerchant(name, newName);
merchants[i].Set_name(newName);
flag = true;
while (flag)
{
flag = false;
std::cout << "输入柜面位置:";
newLocation.clear();
getline(std::cin, newLocation);
trim(newLocation);
for (const auto& merchant : merchants) {
if (newLocation!=merchants[i].get_location() && merchant.get_location() == newLocation) {
flag = true;
std::cout << "商户柜面已存在,请重新输入";
system("pause");
break;
}
}
}
merchants[i].Set_location(newLocation);
std::cout << "商户电话:";
// 确保电话正确
while (true)
{
newPhone.clear();
getline(std::cin, newPhone);
if (inputPhoneNumber(newPhone))break;
}
merchants[i].Set_phone(newPhone);
MerchantnewToFile();
std::cout << "商户信息已更新!" << std::endl;
system("pause");
return;
}
void CanteenManagementSystem::updateStudent(const std::string& account) {
for (auto& student : students) {
if (student.get_account() == account) {
std::string nickname, phone;
std::cout << "请输入账号" << account << "的新昵称" << std::endl;
getline(std::cin, nickname);
student.Set_nickname(trim(nickname)); // 删除首尾空格
std::cout << "请输入账号" << account << "的新电话号码" << std::endl;
// 确保电话正确
while (true)
{
phone.clear();
getline(std::cin, phone);
trim(phone);
if (inputPhoneNumber(phone))break;
}
student.Set_phone(phone); // 删除首尾空格
updateReviewsByStudent(student.get_account(), student.get_nickname());
StudentnewToFile();
std::cout << "学生信息更新完成" << std::endl;
system("pause");
return;
}
}
std::cout << "未找到此学生" << std::endl;
system("pause");
}
void CanteenManagementSystem::updateDishesByMerchant(const std::string merchantName, const std::string newMerchantName) {
if (dishes.empty())return;
for (auto& dish : dishes) {
if (dish.get_merchantName() == merchantName) {
dish.Set_merchantName(newMerchantName);
DishnewToFile();
return;
}
}
std::cout << "该商户不存在" << std::endl;
}
void CanteenManagementSystem::updateDish(const std::string account) {
bool flag = true;
int dishId;
system("cls");
std::string name, term, merchantName;
for (int i = 0; i, merchants.size(); i++) {
if (merchants[i].get_account() == account) {
merchantName = merchants[i].get_name();
break;
}
}
for (auto& dish : dishes) {
if (dish.get_merchantName() == merchantName) {
flag = false; break;
}
}
if (flag) {
std::cout << "该商户没有菜品" << std::endl;
system("pause");
return;
}
else {
for (int i = 0; i < dishes.size(); i++) {
if (dishes[i].get_merchantName() == merchantName) {
std::cout << "菜品编号: " << dishes[i].get_dishId() << " ,菜品名称: " << dishes[i].get_name() << " ,价格: " << dishes[i].get_price() << std::endl;
}
}
std::cout << "请输入菜品编号: ";
while (true)
{
term.clear();
getline(std::cin, term);
trim(term);
if (inputInterger(term))break;
}
dishId = std::stoi(term);
std::string name;
double price;
for (auto& dish : dishes) {
if (dish.get_merchantName() == merchantName && dish.get_dishId() == dishId) {
std::cout << "请输入菜品名称: ";
getline(std::cin, name);
dish.Set_name(name);
std::cout << "请输入菜品价格: ";
//确保菜品价格为浮点数
while (true)
{
term.clear();
getline(std::cin, term);
trim(term);
if (inputFloat(term))break;
}
price = std::stod(term);
dish.Set_price(price);
DishnewToFile();
std::cout << "菜品信息更新完成";
system("pause");
return;
}
}
}
std::cout << "菜品编号错误";
system("pause");
return;
}
void CanteenManagementSystem::updateReviewsByStudent(const std::string account, const std::string name) {
// 遍历评价列表由学号修改评价昵称
for (int i = 0; i < reviews.size(); ++i) {
if (reviews[i].get_studentAccount() == account) {
reviews[i].Set_studentNickName(name);
ReviewnewToFile();
}
}
}
void CanteenManagementSystem::deleteMerchantdate(const std::string& account) {
std::string name,password;
bool flag = false;
system("cls");
std::string choice = "N";
std::cout << "系统为确定是本人登录请输入账号" << account << "的密码" << std::endl;
getline(std::cin, password);
for (int i = 0; i < merchants.size(); i++) {
if (merchants[i].get_account() == account && merchants[i].get_mpassword() == password) {
flag = true;
break;
}
}
if (!flag) {
std::cout << "密码错误!" << std::endl;
system("pause");
return;
}
std::cout << "您确定要注销商户" << account << "吗?(Y/N)" << std::endl;
std::cout << "此操作将无法撤销" << std::endl;
getline(std::cin, choice);
choice = trim(choice);
int id;
if (choice == "Y" || choice == "y") {
// 遍历商户列表,找到要删除的商户
for (int i = 0; i < merchants.size(); ++i) {
if (merchants[i].get_account() == account) {
// 删除商户
name = merchants[i].get_name();
merchants.erase(merchants.begin() + i);
// 删除该商户下的菜品信息
for (int j = 0; j < dishes.size(); ) {
if (dishes[j].get_merchantName() == name) {
id = dishes[j].get_dishId();
dishes.erase(dishes.begin() + j);
//删除菜品评价信息
for (int k = 0; k < reviews.size();) {
if (reviews[k].get_dishId() == id) {
reviews.erase(reviews.begin() + k);
}
else {
++k;
}
}
}
else {
++j;
}
}
MerchantnewToFile(); DishnewToFile(); ReviewnewToFile();
std::cout << "商户信息删除成功" << std::endl;
system("pause");
return;
}
}
}
std::cout << "删除已取消" << std::endl;
system("pause");
}
void CanteenManagementSystem::deleteStudentdate(const std::string account) {
system("cls");
bool flag=false;
std::string choice = "N",password;
std::cout << "系统为确定是本人登录请输入账号" << account << "的密码" << std::endl;
getline(std::cin, password);
for (int i = 0; i < students.size(); i++) {
if (students[i].get_account() == account && students[i].get_spassword() == password) {
flag = true;
break;
}
}
if (!flag) {
std::cout << "密码错误!" << std::endl;
system("pause");
return;
}
std::cout << "您确定要删除账号" << account << "吗?(Y/N)" << std::endl;
std::cout << "此操作将无法撤销" << std::endl;
getline(std::cin, choice);
choice = trim(choice); // 删除首尾空格
if (choice == "Y" || choice == "y") {
// 遍历学生列表,找到要删除学生
for (int i = 0; i < students.size(); ++i) {
if (students[i].get_account() == account) {
// 删除学生
students.erase(students.begin() + i);
// 删除该学生下的评价信息
for (int j = 0; j < reviews.size(); ) {
if (reviews[j].get_studentAccount() == account) {
reviews.erase(reviews.begin() + j);
}
else {
++j;
}
}
StudentnewToFile();
ReviewnewToFile();
std::cout << "学生信息删除成功" << std::endl;
system("pause");
return;
}
}
}
std::cout << "删除已取消" << std::endl;
system("pause");
}
void CanteenManagementSystem::deleteDishdate(std::string account) {
std::string str,name;
int dishId;
system("cls");
for (int i = 0; i < merchants.size(); i++) {
if (merchants[i].get_account() == account) {
name = merchants[i].get_name();
}
}
if (dishes.empty())
{
std::cout << "没有菜品可供删除" << std::endl;
system("pause");
return;
}
std::cout << "您的菜品有:" << std::endl;
for (int i = 0; i < dishes.size(); i++) {
if (dishes[i].get_merchantName() == name) {
std::cout << "菜品编号: " << dishes[i].get_dishId() << " ,菜品名称: " << dishes[i].get_name() << " ,价格: " << dishes[i].get_price() << std::endl;
}
}
std::cout << "请输入删除信息的菜品编号:" << std::endl;
while (true)
{
str.clear();
getline(std::cin, str);
trim(str); // 删除首尾空格
if (inputInterger(str))break;
}
dishId = std::stoi(str);
std::string choice = "N";
std::cout << "您确定要删除菜品" << dishId << "吗?(Y/N)" << std::endl;
std::cout << "此操作将不可撤销" << std::endl;
getline(std::cin, choice);
trim(choice); // 删除首尾空格
if (choice == "Y" || choice == "y") {
//删除菜品信息
auto it = std::find_if(dishes.begin(), dishes.end(), [&](const Dish& dish) {
return dish.get_dishId() == dishId;
});
if (it != dishes.end())
{
dishes.erase(it);
reviews.erase(std::remove_if(reviews.begin(), reviews.end(), [&](const Review& review) {
return review.get_dishId() == dishId;
}), reviews.end());
//删除菜品评价
DishnewToFile();
ReviewnewToFile();
std::cout << "菜品信息删除成功" << std::endl;
system("pause");
return;
}
std::cout << "Dish not found." << std::endl;
std::cout << "找不到指定的菜品!" << std::endl;
system("pause");
return;
}
std::cout << "取消删除!" << std::endl;
system("pause");
}
std::string& CanteenManagementSystem::trim(std::string& str) {
size_t start = str.find_first_not_of(" \t\n\r");
if (start == std::string::npos) {
str = " "; // 字符串全是空格,返回一个空格
return str;
}
size_t end = str.find_last_not_of(" \t\n\r");
str = str.substr(start, end - start + 1);
return str;
}
bool CanteenManagementSystem::isNumber(const std::string& str) {
return std::all_of(str.begin(), str.end(), ::isdigit);
}
bool CanteenManagementSystem::inputInterger(const std::string& str) {
std::stringstream ss(str);
int num;
// 使用 std::noskipws 设置流不跳过空白字符
ss >> std::noskipws;
// 使用 std::all_of 确保字符串中所有字符都是数字
// int型数字最大为2147483647,防止爆int
if (std::all_of(str.begin(), str.end(), ::isdigit) && ss >> num && (str.max_size() <= 10 && str[10] == 2 || str.size() < 10)) {
// 如果转换成功,则返回true并退出循环
return true;
}
else {
// 如果爆int给出提示
if (str.max_size() <= 10 && str[10] == 2 || str.max_size() < 10)std::cout << "输入值过大" << std::endl;
// 如果转换失败或者字符串中有非数字字符,则提示用户重新输入
std::cout << "输入无效,请重新输入。" << std::endl;
system("pause");
return false;
}
}
bool CanteenManagementSystem::inputFloat(const std::string& str)
{
std::stringstream ss(str);
double num;
// 使用 std::noskipws 设置流不跳过空白字符
ss >> std::noskipws;
// 使用 std::all_of 确保字符串中所有字符都是数字或者小数点
if (std::all_of(str.begin(), str.end(), [](const char& c) { return std::isdigit(c) || c == '.'; }) && ss >> num) {
// 如果转换成功,则返回true并退出循环
return true;
}
else {
// 如果转换失败或者字符串中有非数字或者非小数点字符,则提示用户重新输入
std::cout << "输入无效,请重新输入。" << std::endl;
system("pause");
return false;
}
}
bool CanteenManagementSystem::inputPhoneNumber(const std::string& str) {
const int size = 11;//电话号码限制为11位数字
if (!str.size() || str.size() != size)
{
std::cout << "输入错误,电话号码限制为" << size << "位数字!" << std::endl;
std::cout << "请重新输入:";
return false;
}
for (const char& ch : str)
if (!::isdigit(ch))
{
std::cout << "输入不合法,请核对重新输入!" << std::endl;
system("pause");
return false;
}
return true;
}
void CanteenManagementSystem::bubbleSortReviewsByRating(std::vector<Review>& reviews) {
bool swapped;
for (size_t i = 0; i < reviews.size() - 1; ++i) {
swapped = false;
for (size_t j = 0; j < reviews.size() - i - 1; ++j) {
if (reviews[j].get_rating() < reviews[j + 1].get_rating()) {
// 如果当前评分小于下一个评分,则交换它们
std::swap(reviews[j], reviews[j + 1]);
swapped = true;
}
}
// 如果这一趟没有发生交换,则已经排序完成
if (!swapped) {
break;
}
}
}
void CanteenManagementSystem::managermenu() {
int choice;
bool running = true;
bool T = isManager();
if (!T)return;
while (T&&running) {
system("cls");
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 << "[0]退出" << std::endl;
std::cout << "请选择操作: ";
std::string input;
std::getline(std::cin, input);
input = trim(input);
if (inputInterger(input))
{
choice = std::stoi(input);
switch (choice) {
case 1:
//查看商户列表
viewMerchantaccount();
break;
case 2:
//查看学生列表
viewStudentaccount();
break;
case 3:
//重置商户密码
resetmpassword();
break;
case 4:
//重置学生密码
resetspassword();
break;
case 0:
running = false;
break;
default:
system("cls");
std::cout << "无效的选项,请重新选择." << std::endl;
system("pause");
break;
}
}
}
}
void CanteenManagementSystem::merchantmenu() {
int choice;
std::string account;
bool running = true;
bool T=isMerchant(account);
if(!T)return;
while (T&&running) {
system("cls");
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 << "[7]更新菜品信息" << std::endl;
std::cout << "[8]查询菜品评价" << std::endl;
std::cout << "[0]退出" << std::endl;
std::cout << "请选择操作: ";
std::string input;
std::getline(std::cin, input);
input = trim(input);
if (inputInterger(input))
{
choice = std::stoi(input);
switch (choice) {
case 1:
//查看商户信息
viewMerchants();
break;
case 2:
//修改商户信息
updateMerchant(account);
break;
case 3:
//删除商户信息
deleteMerchantdate(account);
break;
case 4:
//查看菜品信息
viewDishesdateByMerchant(account);
break;
case 5:
//发布菜品信息
addDish(account);
break;
case 6:
//删除菜品信息
deleteDishdate(account);
break;
case 7:
//更新菜品信息
updateDish(account);
break;
case 8:
//查询本商户的菜品评价
viewReviewsdatebymerchant(account);
break;
case 0:
running = false;
break;
default:
system("cls");
std::cout << "无效的选项,请重新选择." << std::endl;
system("pause");
break;
}
}
}
}
void CanteenManagementSystem::studentmenu() {
int choice;
std::string account;
bool running = true;
bool T = isStudent(account);
if (!T)return;
while (T&&running) {
system("cls");
std::cout << "请选择操作: ";
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 << "[0]退出" << std::endl;
std::cout << "请选择操作: ";
std::string input;
std::getline(std::cin, input);
input = trim(input);
if (inputInterger(input))
{
choice = std::stoi(input);
switch (choice) {
case 1:
//查看学生信息
viewStudents();
break;
case 2:
//修改个人信息
updateStudent(account);
break;
case 3:
//删除个人信息
deleteStudentdate(account);
break;
case 4:
//浏览菜品信息
viewDishes();
break;
case 5:
//评价菜品信息
addReviewdate(account);
break;
case 6:
//查看评价信息
viewReviews();
break;
case 0:
running = false;
break;
default:
std::cout << "无效的选项,请重新选择" << std::endl;
system("pause");
break;
}
}
}
}
void CanteenManagementSystem::menu() {
int choice;
bool running = true;
while (running) {
system("cls");
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 << "[0]退出" << std::endl;
std::cout << "请选择操作: ";
std::string input;
std::getline(std::cin, input);
trim(input);
if (inputInterger(input)) {
choice = std::stoi(input);
switch (choice) {
case 1:
managermenu();
break;
case 2:
merchantmenu();
break;
case 3:
studentmenu();
break;
case 4:
addMerchant();
break;
case 5:
addStudent();
break;
case 0:
running = false;
break;
default:
std::cout << "输入错误,请重新输入" << std::endl;
system("pause");
break;
}
}
}
}
bool CanteenManagementSystem::isMerchant(std::string& naccount) {
std::string input,account;
char ch;
if (merchants.empty())return true;
std::cout << "请输入商户账号:";
while (true)
{
account.clear();
getline(std::cin, account);
account = trim(account); // 删除首尾空格
if (inputInterger(account))break;
}
naccount = account;
for (auto& merchant : merchants) {
if (merchant.get_account() == account) {
std::cout << "请输入密码:";
while (true) {
ch = _getch();//读取每一个字符但不显示在控制台
if (ch == '\r' || ch == '\n') {
break;//回车表示密码输入结束
}
else {
input += ch;
std::cout << '*';//显示星号
}
}
if (merchant.get_mpassword() == input)
{
std::cout << "密码正确! ";
system("pause");
return true;
}
else {
std::cout << "密码错误! ";
system("pause");
return false;
}
}
}
//商户账号不存在
std::cout << "该商户账号不存在" << std::endl;
system("pause");
return false;
}
bool CanteenManagementSystem::isStudent(std::string& naccount) {
std::string input, account;
char ch;
if (students.empty())return true;
std::cout << "请输入学生账号:";
while (true)
{
account.clear();
getline(std::cin, account);
account = trim(account); // 删除首尾空格
if (inputInterger(account))break;
}
naccount = account;
for (auto& student : students) {
if (student.get_account() == account) {
std::cout << "请输入密码:";
while (true) {
ch = _getch();//读取每一个字符但不显示在控制台
if (ch == '\r' || ch == '\n') {
break;//回车表示密码输入结束
}
else {
input += ch;
std::cout << '*';//显示星号
}
}
if (student.get_spassword() == input)
{
std::cout << "密码正确! ";
system("pause");
return true;
}
else {
std::cout << "密码错误! ";
system("pause");
return false;
}
}
}
//学生账号不存在
std::cout << "该学生账号不存在" << std::endl;
system("pause");
return false;
}
bool CanteenManagementSystem::isManager() {
std::string key;
char ch;
std::cout << "请输入管理员密码";
std::cout<<"(默认密码为"<<THE_KEY<<"):";
while (true) {
ch = _getch();//读取每一个字符但不显示在控制台
if (ch == '\r' || ch == '\n') {
break;//回车表示密码输入结束
}
else {
key += ch;
std::cout << '*';//显示星号
}
}
if (key == THE_KEY) {
std::cout << "密码正确" << std::endl;
system("pause");
return true;
}
else {
std::cout << "密码错误" << std::endl;
system("pause");
return false;
}
}
void CanteenManagementSystem::resetspassword() {
std::string account;
bool flag = false;
system("cls");
std::cout << "请输入需要重置密码的学生账号:";
while (true)
{
account.clear();
getline(std::cin, account);
account = trim(account); // 删除首尾空格
if (inputInterger(account))break;
}
for (int i = 0; i < students.size(); i++) {
if (students[i].get_account() == account) {
flag = true;
}
}
if (!flag) {
std::cout << "该学生不存在" << std::endl;
system("pause");
return;
}
for (int i = 0; i < students.size();) {
if (students[i].get_account() == account) {
students[i].Reset_spassword("8888");
std::cout << "账号:" << account << "的密码已重置为8888" << std::endl;
StudentnewToFile();
system("pause");
break;
}
}
}
void CanteenManagementSystem::resetmpassword() {
std::string account;
bool flag = false;
system("cls");
std::cout << "请输入需要重置密码的商户账号:";
while (true)
{
account.clear();
getline(std::cin, account);
account = trim(account); // 删除首尾空格
if (inputInterger(account))break;
}
for (int i = 0; i < merchants.size(); i++) {
if (merchants[i].get_account() == account) {
flag = true;
}
}
if (!flag) {
std::cout << "该商户不存在" << std::endl;
system("pause");
return;
}
for (int i = 0; i < merchants.size();) {
if (merchants[i].get_account() == account) {
merchants[i].Reset_mpassword("8888");
std::cout << "账号:" << account << "的密码已重置为8888" << std::endl;
MerchantnewToFile();
system("pause");
break;
}
}
}
#endif
主函数(main.cpp)
#define _CRT_SECURE_NO_WARNINGS
#include"Manager.h"
int main()
{
CanteenManagementSystem system;
// 加载数据
system.loadFromFile();
system.menu();
// 保存数据
system.newToFile();
return 0;
}
经验体会:
(一)对设计思路的梳理与实践应用
分模块处理问题:在设计时,将系统划分为多个模块(如商户、学生、菜品、评价),每个模块独立处理相应的功能,有助于保持代码结构的清晰和易管理性。
用户界面与交互:通过创建清晰的用户菜单和操作指南,使用户界面直观易用,对用户友好,这对于提高系统的可用性至关重要。
数据结构的选择与使用:合理选择数据结构(如 std::vector)来存储和处理数据,根据数据的特性(如商户名的唯一性)选择合适的存储和检索方式。
(二)编程实践与技术应用
文件操作与数据持久化:使用文本文件进行数据存储,并通过序列化与反序列化处理数据,对文件操作的处理显示了数据持久化的重要性和实现方法。
鲁棒性与错误处理:代码中的鲁棒性优化,如电话号码和学生账号的格式校验,显示了对程序健壮性的考虑。此外,使用异常处理机制来管理潜在的错误和异常情况。
性能优化:例如,采用多个.txt文件分别存储不同类型的数据,提高了数据读取的效率和便捷性。
(三)项目管理与反思
持续测试与迭代:设计过程中,对每个功能模块进行单独测试,及时发现并修复问题,这有助于避免在开发过程后期出现大量累积错误。
对用户输入的合理预期:在设计用户交互界面时,考虑到用户可能的非标准输入,如在主菜单输入非数字字符,对用户行为进行合理预期并找出应对的策略。
功能的实际应用与限制:在处理时间数据时,选择用当前时间而非用户输入来记录评价时间,还有用户输入密码时在屏幕上会被显示的问题,以实际应用场景时的灵活性和对功能实现出发进行考量。
(四)结论
总结起来,我的这次数据结构课程设计主要包括以下几个核心组成部分和关键收获:
1.系统设计与数据结构选择:
使用 std::vector 来动态存储多种类型的数据对象,例如商户、菜品、学生和评价,提供了快速的随机访问和高效的数据管理能力。
合理的数据分片存储(四个不同的.txt文件),解决了数据管理和读取效率问题。
2.文件操作与数据持久化:
通过标准的文本文件进行数据的读写操作,实现了数据的持久化存储。有较强的可复用性。
引入序列化和反序列化概念,优化了数据读写的鲁棒性和效率。
3.用户界面和交互设计:
设计了清晰的用户操作界面,包括主菜单、商户菜单、学生菜单和管理员菜单,提高了系统的易用性和用户体验。
实现了密码输入的隐藏显示(去回显),增强了用户数据的安全性。
4.异常处理与系统安全:
对输入数据进行格式校验和错误管理,增强了系统的健壮性。
管理员功能的引入,包括密码重置和账户管理,确保了系统的实用性和灵活性。
5.项目管理与测试:
采用模块化的开发方式,每完成一个功能模块就进行测试,及时发现并修复问题,这样的策略有助于保持项目的可控性和高质量。
6.对用户可能的非标准输入进行了预期和处理,展示了对用户行为的深入理解。
经验与反思:
项目开发过程中的连续测试和反思,帮助我理解了在实际应用中如何灵活调整和优化功能实现。
此项目不仅加深了我对编程和系统设计的理解,也提高了解决实际问题的能力,是我学术和职业生涯中的宝贵财富。
通过这次课程设计,我不仅应用了所学知识解决实际问题,也增强了我的项目管理、代码编写和问题解决技能,为未来更复杂的技术挑战做好了准备。
通过这次课程设计,我学会了如何合理地分解问题、选择和应用合适的数据结构、处理用户输入、以及如何在实际应用中灵活地调整功能实现。此外,项目的持续测试和优化也是确保最终产品质量的关键。这些经验对于我未来的编程和软件开发工作将是非常宝贵的财富。
最后欢迎大家提供宝贵的建议; //write by Mr.Blun 2024/4/24