前言
銜接上一篇“c++學(xué)習(xí)筆記-STL案例-機(jī)房預(yù)約系統(tǒng)3-登錄模塊”,本文主要設(shè)計管理員模塊,從管理員登錄和注銷、添加賬號、顯示賬號、查看機(jī)房、清空預(yù)約五個功能進(jìn)行分析和實現(xiàn)。
目錄
7 管理員模塊
7.1 管理員登錄和注銷
7.1.1 構(gòu)造函數(shù)
?編輯7.1.2 管理員子菜單
7.1.3 菜單功能實現(xiàn)
?編輯
7.1.4 接口對接
7.4.5 測試結(jié)果
7.2 添加賬號
7.2.1 添加賬號
7.2.2 添加功能實現(xiàn)
7.2.3 測試結(jié)果
7.2.4 去重操作
7.2.4.1?獲取文件中學(xué)生和老師信息
7.2.4.2?去重函數(shù)封裝
7.2.4.3?添加去重操作
7.2.4.4 bug解決
?7.3 顯示賬號
7.3.1 顯示功能實現(xiàn)
7.3.2 測試結(jié)果
7.4 查看機(jī)房
7.4.1 添加機(jī)房信息
7.4.2 機(jī)房類創(chuàng)建
7.4.3 初始話機(jī)房信息
7.4.4 顯示機(jī)房信息
7.4.5 測試結(jié)果
7.5 清空預(yù)約
7.51. 清空功能實現(xiàn)
7.5.2?確認(rèn)清除判斷
7.5.3 測試結(jié)果
總結(jié)
7 管理員模塊
7.1 管理員登錄和注銷
7.1.1 構(gòu)造函數(shù)
- 在manager類的構(gòu)造函數(shù)中,初始化管理員信息,代碼如下:
//有參構(gòu)造 參數(shù):管理員姓名、密碼
Manager::Manager(string name, string pwd)
{
//初始化管理員信息
this->m_Name = name;
this->m_Pwd = pwd;
}
添加位置如圖:
7.1.2 管理員子菜單
- 在機(jī)房預(yù)約系統(tǒng).cpp中,當(dāng)用戶登錄的是管理員,添加管理員菜單接口
- 將不同的分支提供出來:
? ? ? ? 添加賬號
? ? ? ? 查看賬號
? ? ? ? 查看機(jī)房
? ? ? ? 清空預(yù)約
? ? ? ? 注銷登錄
實現(xiàn)注銷功能
- 添加全局函數(shù) void managerMenu(Identity * &manager),代碼如下:
//進(jìn)入管理員子菜單
void managerMenu(Identity*& manager)
{
while (true)
{
//調(diào)用管理員子菜單
manager->operMenu();//父類指針創(chuàng)建子類對象,調(diào)用共同接口
//將父類指針 轉(zhuǎn)為子類對象指針,調(diào)用子類的其他接口
Manager* man = (Manager*)manager; // (Manager*)是強(qiáng)制轉(zhuǎn)換
int select = 0;
//接收用戶選擇
cin >> select;
if (select == 1)
{
//添加賬號
cout << "添加賬號" << endl;
man->addPerson();
}
else if (select == 2)
{
//查看賬號
cout << "查看賬號" << endl;
man->showPerson();
}
else if (select == 3)
{
//查看機(jī)房
cout << "查看機(jī)房" << endl;
man->showComputer();
}
else if (select == 4)
{
//清空預(yù)約
cout << "清空預(yù)約" << endl;
man->clearFile();
}
else
{
//注銷登錄
delete manager;//銷毀堆區(qū)對象
cout << "注銷成功" << endl;
system("pause");
return;
}
}
}
?添加位置如圖:
?????????其中,void managerMenu(Identity * &manager), “??Identity * ”父類指針接收,前面創(chuàng)建人時用父類指針創(chuàng)建的具體人;
?? ??? ?Manager* man = (Manager*)manager; ?// (Manager*)是強(qiáng)制轉(zhuǎn)換,將父類指針 轉(zhuǎn)為子類對象指針,調(diào)用子類的其他接口
7.1.3 菜單功能實現(xiàn)
- 在實現(xiàn)成員函數(shù)void Manager::operMenu()代碼如下:
//manager子菜單界面
void Manager::operMenu()
{
cout << "歡迎管理員"<<this->m_Name<<"登錄!" << endl;
cout << "\t\t -------------------------------------------------" << endl;
cout << "\t\t| |\n";
cout << "\t\t| 1.添加賬號 |\n";
cout << "\t\t| |\n";
cout << "\t\t| 2.查看賬號 |\n";
cout << "\t\t| |\n";
cout << "\t\t| 3.查看機(jī)房 |\n";
cout << "\t\t| |\n";
cout << "\t\t| 4.清空預(yù)約 |\n";
cout << "\t\t| |\n";
cout << "\t\t| 0.注銷登錄 |\n";
cout << "\t\t| |\n";
cout << "\t\t -------------------------------------------------" << endl;
cout << "請選擇您的操作:" << endl;
}
添加位置如圖:??
7.1.4 接口對接
- 管理員成功登錄后,調(diào)用管理員子菜單界面
- 在管理員登錄驗證分支中,添加代碼:
//進(jìn)入管理員身份子菜單
managerMenu(person);
7.4.5 測試結(jié)果
登錄成功
?選1-4后會重復(fù)出現(xiàn)管理員子菜單,因為管理員功能還未實現(xiàn),但是顯示“添加賬號”表示成功進(jìn)入添加賬號分支:
7.2 添加賬號
7.2.1 添加賬號
(1) 功能描述:
- 給學(xué)生或教師添加新的賬號
(2) 功能要求:
- 添加學(xué)生學(xué)號不能重復(fù)、教師職工號不能重復(fù)
7.2.2 添加功能實現(xiàn)
在Manager.h中添加"globalFile.h"引入文件的宏定義,添加"fstream"做文件寫出到txt相關(guān)操作,如下圖所示:
在Manager.cpp的addPerson()成員函數(shù)中,實現(xiàn)添加新賬號功能,代碼如下:
//添加賬號
void Manager::addPerson()
{
cout << "請輸入添加賬號的類型:" << endl;
cout << "1、添加學(xué)生" << endl;
cout << "2、添加老師" << endl;
string fileName;//操作文件名
string tip;//提示id號
ofstream ofs;//文件操作對象
int select = 0;
cin >> select;//接受用戶選項
if (select == 1)
{
//添加的是學(xué)生
fileName = STUDENT_FILE;
tip = "請輸入學(xué)號:";
}
else
{
//添加的是學(xué)生
fileName = TEACHER_FILE;
tip = "請輸入職工號:";
}
//利用追加的方式寫文件
ofs.open(fileName, ios::out | ios::app);
int id; //學(xué)號或者職工號
string name;
string pwd;
cout << tip << endl;
cin >> id;
cout << "請輸入您的姓名:" << endl;
cin >> name;
cout << "請輸入密碼:" << endl;
cin >> pwd;
//向文件中添加數(shù)據(jù)
ofs << id << " " << name << " " << pwd << endl;
cout << "添加成功" << endl;
system("pause");
system("cls");
ofs.close();
}
其中,app追加的方式寫文件?ofs.open(fileName, ios::out | ios::app),可以實現(xiàn)在原有信息上添加新的信息。
添加位置如圖:?
7.2.3 測試結(jié)果
登錄管理員賬號:
添加學(xué)生賬號:
添加老師賬號:
7.2.4 去重操作
7.2.4.1?獲取文件中學(xué)生和老師信息
-
要去除重復(fù)的賬號,首先要將學(xué)生和老師的賬號信息獲取到程序中,方可檢測
- 在manager.h中,添加兩個容器,用于存放學(xué)生和教師信息
- 添加一個新的成員函數(shù) void initVector()? 初始化容器
(1)添加頭文件#include<vector>、#include"student.h"、#include"teacher.h";添加vStu、vTea、initVector()
//學(xué)生容器
vector<Student> vStu;
//老師容器
vector<Teacher> vTea;
//初始化容器
void initVector();
添加位置如圖:
(2)實現(xiàn)initVector():
void Manager::initVector()
{
//確保容器清空狀態(tài)
vStu.clear();
vTea.clear();
//讀取信息 學(xué)生、老師
ifstream ifs;
ifs.open(STUDENT_FILE, ios::in);
if (!ifs.is_open())
{
cout << "文件讀取失敗" << endl;
return;
}
Student s;
while (ifs >> s.m_Id && ifs >> s.m_Name && ifs >> s.m_Pwd)
{
vStu.push_back(s);
}
cout << "當(dāng)前學(xué)生數(shù)量為:" << vStu.size() << endl;
ifs.close();
ifs.open(TEACHER_FILE, ios::in);
Teacher t;
while (ifs >> t.m_EmpId && ifs >> t.m_Name && ifs >> t.m_Pwd)
{
vTea.push_back(t);
}
cout << "當(dāng)前老師數(shù)量為:" << vTea.size() << endl;
ifs.close();
}
添加位置如圖:?
(3)測試結(jié)果:
7.2.4.2?去重函數(shù)封裝
(1)在manager.h文件中添加成員函數(shù)bool checkRepeat(int id,int type);
(2)在manager.cpp文件中實現(xiàn)成員函數(shù)bool checkRepeat(int id,int type);
//檢測重復(fù) 參數(shù):(傳入id,傳入類型) 返回:(true 代表重復(fù);false 代碼不重復(fù))
bool Manager::checkRepeat(int id, int type)
{
if (type == 1)
{
//檢測學(xué)生
for (vector<Student>::iterator it = vStu.begin(); it != vStu.end(); it++)
{
if (id == it->m_Id)
{
return true;
}
}
}
else
{
//檢測老師
for (vector<Teacher>::iterator it = vTea.begin(); it != vTea.end(); it++)
{
if (id == it->m_EmpId)
{
return true;
}
}
}
return false;
}
?添加位置如圖:?
7.2.4.3?添加去重操作
在manager.cpp的void Manager::addPerson()函數(shù)中增加如下代碼:
if (select == 1)
{
//添加的是學(xué)生
fileName = STUDENT_FILE;
tip = "請輸入學(xué)號:";
errorTip = "學(xué)號重復(fù),請重新輸入";
}
else
{
//添加的是學(xué)生
fileName = TEACHER_FILE;
tip = "請輸入職工號:";
errorTip = "職工號重復(fù),請重新輸入";
}
//利用追加的方式 寫文件
ofs.open(fileName, ios::out | ios::app);
int id; //學(xué)號或者職工號
string name; //姓名
string pwd; //密碼
cout << tip << endl;
while (true)
{
cin >> id;
bool ret = checkRepeat(id, select);
if (ret)//有重復(fù)
{
cout << errorTip << endl;
}
else
{
break;
}
}
?添加位置如圖:?
測試結(jié)果:
(1)控制臺顯示“添加成功”
?(2)txt文本中新增了王五的數(shù)據(jù):
7.2.4.4 bug解決
(1)bug描述:
- 雖然可以檢測到重復(fù)的賬號,但是剛添加的賬號由于沒有更新到容器中,因此不會被檢查
- 導(dǎo)致剛加入的賬號的學(xué)號或者職工號,再次添加時依然會重復(fù)
(2)解決方案:
- 在每次添加新賬號時,重新初始化容器
在添加完畢后加入代碼:
//初始化容器
this->initVector();
添加位置如圖:?
?7.3 顯示賬號
功能描述:顯示學(xué)生信息或教師信息
7.3.1 顯示功能實現(xiàn)
在manager.h添加#include<algorithm>
在manager.cpp的showPerson()成員函數(shù)中,實現(xiàn)顯示賬號功能,代碼如下:
//打印學(xué)生信息
void printStudent(Student& s)
{
cout << "學(xué)號:" << s.m_Id << " 姓名:" << s.m_Name << " 密碼:" << s.m_Pwd << endl;
}
//打印老師信息
void printTeacher(Teacher& t)
{
cout << "職工號:" << t.m_EmpId << " 姓名:" << t.m_Name << " 密碼:" << t.m_Pwd <<endl;
}
//查看賬號
void Manager::showPerson()
{
cout << "請選擇要查看的內(nèi)容" << endl;
cout << "1、查看所有的學(xué)生" << endl;
cout << "2、查看所有的老師" << endl;
int select = 0;//接收用戶的選擇
cin >> select;
if (select == 1)
{
//查看學(xué)生
cout << "所有學(xué)生的信息如下:" << endl;
for_each(vStu.begin(), vStu.end(), printStudent);
}
else
{
//查看老師
cout << "所有老師的信息如下:" << endl;
for (vTea.begin(), vTea.end(), printTeacher);
}
system("pause");
system("cls");
}
添加位置如圖:
復(fù)習(xí)一下:managerMenu函數(shù)管理子菜單中,添加了showPerson()函數(shù),可以調(diào)用這里的查看函數(shù),顯示查看所有學(xué)生信息或老師信息的結(jié)果
7.3.2 測試結(jié)果
查看學(xué)生:
查看老師:
7.4 查看機(jī)房
7.4.1 添加機(jī)房信息
在案例需求中,機(jī)房一共有三個,其中1號機(jī)房容量20臺機(jī)器,2號50臺機(jī)器,3號100臺機(jī)器
在comnputerRoom.txt中添加三條信息:
7.4.2 機(jī)房類創(chuàng)建
在頭文件下,創(chuàng)建新的文件computerRoom.h
并添加如下代碼:
#pragma once
#include<iostream>
using namespace std;
//機(jī)房類
class ComputerRoom
{
public:
int m_Comid; //機(jī)房id
int m_MaxNum; //機(jī)房最大容量
};
添加位置如圖:
7.4.3 初始話機(jī)房信息
在Manager管理員類下,添加機(jī)房的容器,用于保護(hù)機(jī)房信息
在Manager.cpp 有參構(gòu)造函數(shù)中,追加如下代碼,初始化機(jī)房信息:
//初始化機(jī)房信息
this->initComVector();
void Manager::initComVector()
{
//獲取機(jī)房信息
ifstream ifs;
ifs.open(COMPUTER_FILE, ios::in);
ComputerRoom c;
while (ifs >> c.m_Comid && ifs >> c.m_MaxNum)
{
this->vCom.push_back(c);
}
cout << "當(dāng)前機(jī)房數(shù)量:" << vCom.size() << endl;
ifs.close();
}
添加位置如圖:
7.4.4 顯示機(jī)房信息
在manager類的showComputer成員函數(shù)中添加如下代碼:
//查看機(jī)房
void Manager::showComputer()
{
cout << "機(jī)房的信息如下:" << endl;
for_each(vCom.begin(), vCom.end(), printComputerRoom);
system("pause");
system("cls");
}
添加位置如圖:
7.4.5 測試結(jié)果
登錄管理員賬號后,當(dāng)前機(jī)房數(shù)量為3,查看機(jī)房具體信息:
7.5 清空預(yù)約
功能描述:清空生成的order.txt預(yù)約文件
7.51. 清空功能實現(xiàn)
(1)實現(xiàn)思路
ofstream ofs(ORDER_FILE, ios::trunc);
trunc的方式打開:如果文件存在,刪除后重新創(chuàng)建
(2)在Manager的cleanFile成員函數(shù)中添加如下代碼:
//清空預(yù)約記錄
void Manager::clearFile()
{
ofstream ofs(ORDER_FILE, ios::trunc);
ofs.close();
cout << "清空成功!" << endl;
system("pause");
system("cls");
}
?添加位置如圖:
7.5.2?確認(rèn)清除判斷
在機(jī)房預(yù)約系統(tǒng).cpp中void managerMenu(Identity*& manager)函數(shù)的分支4下添加如下代碼:
else if (select == 4)
{
//清空預(yù)約
cout << "確認(rèn)清空?" << endl;
cout << "1 確認(rèn)" << endl;
cout << "2 取消" << endl;
cin >> selectConcret;
if (selectConcret == 1)
{
cout << "清空預(yù)約" << endl;
man->clearFile();
}
system("pause");
system("cls");
}
??添加位置如圖:
7.5.3 測試結(jié)果
在order.txt添加如下測試信息:
?登錄管理員賬號后選擇“清空預(yù)約”:
再次打開order.txt文件后清空了信息:
?還可以選擇“取消”,則信息不會被清空。
總結(jié)
? ? ? ? 本文圍繞管理員賬號的功能:添加賬號、查看賬號、查看機(jī)房、清空預(yù)約、注銷登錄,進(jìn)行了實現(xiàn)與測試,主要運(yùn)用了c++中的文件流fstream、容器vector、算法algorithm,main函數(shù)調(diào)用LogIn函數(shù)登錄管理員賬號,LogIn的分支3為管理員身份驗證,驗證成功就通過managerMenu進(jìn)入管理員身份子菜單,子菜單接受用戶輸入的操作選項:1?添加賬號;2 查看賬號;3 查看機(jī)房;4 清空預(yù)約;5 注銷登錄。文章來源:http://www.zghlxwxcb.cn/news/detail-805974.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-805974.html
到了這里,關(guān)于c++學(xué)習(xí)筆記-STL案例-機(jī)房預(yù)約系統(tǒng)4-管理員模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!