教室预定管理系统回顾与改进
这是笔者曾经合作完成的一个C++大作业 现进行回顾
代码如下:
#include <windows.h>
#include <ctime>
#include <fstream>
#include <iostream>
#define maxn 1000
using namespace std;
string sskind[6] = {"", "化学", "物理", "生物", "计算机", "水环境"};
string ystatus[3] = {"", "审核中", "审核通过"};
string kong[2] = {"是", "否"};
int flag, cnt, x, room_count, t_cnt;
string tnum;
class Room {
protected:
string num;
string roomname;
int capacity;
int status;
int kind;
public:
int getKind() { return kind; }
string getName() { return roomname; }
};
Room* room_data[maxn];
class Room1 : public Room { //实验室
private:
int skind;
public:
Room1() { kind = 1; }
friend istream& operator>>(istream& input, Room1& a) {
input >> a.num >> a.roomname >> a.capacity >> a.status >> a.skind;
return input;
}
friend ostream& operator<<(ostream& os, Room1& a) {
os << "教室号:" << a.num << " 教室名称:" << a.roomname
<< " 容纳人数:" << a.capacity;
os << " 当前占用状态:" << a.status << " 教室类型:实验室"
<< " 实验室类型:" << sskind[a.skind] << endl;
return os;
}
};
class Room2 : public Room { //多媒体
private:
int knum;
public:
Room2() { kind = 2; }
friend istream& operator>>(istream& input, Room2& a) {
input >> a.num >> a.roomname >> a.capacity >> a.status >> a.knum;
return input;
}
friend ostream& operator<<(ostream& os, Room2& a) {
os << "教室号:" << a.num << " 教室名称:" << a.roomname
<< " 容纳人数:" << a.capacity;
os << " 当前占用状态:" << a.status << " 教室类型:多媒体"
<< " 是否配备空调:" << kong[a.knum] << endl;
return os;
}
};
class Room3 : public Room { //录课教室
private:
int snum;
public:
Room3() { kind = 3; }
friend istream& operator>>(istream& input, Room3& a) {
input >> a.num >> a.roomname >> a.capacity >> a.status >> a.snum;
return input;
}
friend ostream& operator<<(ostream& os, Room3& a) {
os << "教室号:" << a.num << " 教室名称:" << a.roomname
<< " 容纳人数:" << a.capacity;
os << " 当前占用状态:" << a.status << " 教室类型:实验室"
<< " 摄像头个数:" << a.snum << endl;
return os;
}
};
class Teacher {
private:
string num;
string name;
int level; // 1代表管理员,2代表普通教师
string phone;
string officename;
public:
Teacher() {}
void view() { //浏览教室
for (int i = 0; i < room_count; i++) {
if (room_data[i]->getKind() == 1) {
Room1* temp = (Room1*)room_data[i];
cout << *temp << endl;
} else if (room_data[i]->getKind() == 2) {
Room2* temp = (Room2*)room_data[i];
cout << *temp << endl;
} else {
Room3* temp = (Room3*)room_data[i];
cout << *temp << endl;
}
}
}
friend istream& operator>>(istream& input, Teacher& a) {
input >> a.num >> a.name >> a.level >> a.phone >> a.officename;
return input;
}
void input() {
cout << "请输入工号、姓名、手机号、办公室名称:";
cin >> num >> name >> phone >> officename;
level = 2;
}
int getLevel() { return level; }
void logout() {}
string getnum() { return num; }
};
Teacher tea[maxn];
string GetTime() { //获取当前时间
SYSTEMTIME m_time;
GetLocalTime(&m_time);
char res[100] = {0};
sprintf(res, "%02d-%02d-%02d %02d:%02d:%02d", m_time.wYear, m_time.wMonth,
m_time.wDay, m_time.wHour, m_time.wMinute, m_time.wSecond);
string time(res);
return time;
}
class Yu { //预定信息类
private:
int num; //预定号
string date; //提交的时间
string roomnum; //预定教室的序号
string ddate; //要预定的日期
int status; // 0代表撤销,1代表审核中,2代表审核通过
public:
Yu() {}
Yu(string num, string d) {
this->num = ++cnt;
date = GetTime();
roomnum = num;
ddate = d;
status = 1;
}
int getnum() { return num; }
void cancel() { status = 0; }
void succe() { status = 2; }
int getStatus() { return status; }
friend istream& operator>>(istream& in, Yu& a) {
in >> a.num >> a.date >> a.roomnum >> a.ddate >> a.status;
return in;
}
friend ostream& operator<<(ostream& os, Yu& a) {
os << a.num << " " << a.date << " " << a.roomnum << " " << a.ddate
<< " " << ystatus[a.status] << endl;
return os;
}
};
Yu yuding[maxn];
void wait() {
cout << "按任意键返回上级菜单!";
getchar();
getchar();
}
void search(int s = 0) { //查询
system("cls");
string name;
if (!s) {
cout << "请输入教室名称:";
cin >> name;
}
for (int i = 0; i < room_count; i++) {
if (s || room_data[i]->getName() == name) {
if (room_data[i]->getKind() == 1) {
Room1* temp = (Room1*)room_data[i];
cout << *temp << endl;
} else if (room_data[i]->getKind() == 2) {
Room2* temp = (Room2*)room_data[i];
cout << *temp << endl;
} else {
Room3* temp = (Room3*)room_data[i];
cout << *temp << endl;
}
}
}
wait();
}
void view_his() { //浏览预定记录(可增加预定,撤销预定)
system("cls");
cout << "预定号 提交时间 预定教室号 预定日期 预定状态" << endl;
for (int i = 0; i < cnt; i++) {
if (yuding[i].getStatus()) cout << yuding[i];
}
wait();
}
void yu_t() { //预定
system("cls");
cout << "请输入预定的教室号、预定日期:";
string jnum, date;
cin >> jnum >> date;
yuding[cnt++] = *(new Yu(jnum, date));
cout << "预定成功!" << endl;
wait();
}
void cancel_yu() { //取消预定
system("cls");
cout << "请输入要取消的预定号:";
int ynum;
cin >> ynum;
for (int i = 0; i < cnt; i++) {
if (yuding[i].getnum() == ynum) {
yuding[i].cancel();
}
}
cout << "取消预订成功!" << endl;
wait();
}
void deal() { //审核预定记录
system("cls");
cout << "请输入要处理的预定号码:";
int ynum, f;
cin >> ynum;
cout << "是否通过预定?1.是 0.否:";
cin >> f;
if (f) {
yuding[ynum - 1].succe();
} else {
yuding[ynum - 1].cancel();
}
cout << "处理成功,按任意键返回!" << endl;
wait();
}
void tregister() { //教师注册
system("cls");
tea[t_cnt++].input();
wait();
}
void menu1() { //管理员功能菜单
do {
system("cls");
cout << "1.浏览教室" << endl;
cout << "2.浏览预定记录" << endl;
cout << "3.审核预定记录" << endl;
cout << "0.退出" << endl;
cout << "请输入您的选择:";
int f;
cin >> f;
switch (f) {
case 1:
search(1);
break;
case 2:
view_his();
break;
case 3:
deal();
break;
default:
return;
}
} while (1);
}
void menu2() { //普通教师功能菜单
do {
system("cls");
cout << "1.浏览教室" << endl;
cout << "2.查询教室" << endl;
cout << "3.浏览预定记录" << endl;
cout << "4.预定教室" << endl;
cout << "5.撤销预定" << endl;
cout << "0.退出" << endl;
cout << "请输入您的选择:";
int f;
cin >> f;
switch (f) {
case 1:
search(1);
break;
case 2:
search();
break;
case 3:
view_his();
break;
case 4:
yu_t();
break;
case 5:
cancel_yu();
break;
default:
return;
}
} while (1);
}
int main_menu() { //主菜单
system("cls");
if (flag == 1) {
menu1();
return 0;
} else if (flag == 2) {
menu2();
return 0;
} else {
cout << "1.登录" << endl;
cout << "2.普通老师注册" << endl;
cout << "0.退出" << endl;
cout << "请输入您的选择:";
cin >> x;
return x;
}
}
void login() { //登陆处理
system("cls");
string pass;
cout << "请输入工号:";
cin >> tnum;
cout << "请输入密码:";
cin >> pass;
if (pass != "123456") {
cout << "密码错误!" << endl;
wait();
return;
}
for (int i = 0; i < t_cnt; i++) {
if (tea[i].getnum() == tnum) {
cout << "登录成功!" << endl;
flag = tea[i].getLevel();
wait();
return;
}
}
cout << "用户不存在!" << endl;
wait();
}
void init() { //初始化数据
fstream in("data.txt");
for (int i = 0; i < 3; i++) {
Room1* a = new Room1();
in >> (*a);
room_data[room_count++] = a;
}
for (int i = 0; i < 2; i++) {
Room2* a = new Room2();
in >> (*a);
room_data[room_count++] = a;
}
Room3* a = new Room3();
in >> (*a);
room_data[room_count++] = a;
for (int i = 0; i < 2; i++) {
in >> tea[t_cnt++];
}
for (int i = 0; i < 2; i++) {
in >> yuding[cnt++];
}
}
int main() {
init();
do {
x = main_menu();
switch (x) {
case 1:
login();
break;
case 2:
tregister();
break;
default:;
break;
}
} while (x);
return 0;
}
具体使用没有什么大碍 但是在一些方面略显不足:
没有在data.txt中删除部分数据的功能
为此添加了以下的代码:
int delete()
{
fstream in("C:\\Users\\msi-\\Desktop\\data.txt", ios::in);
fstream out("C:\\Users\\msi-\\Desktop\\temp.txt", ios::out);
string name, pass, str, estr;
cout << "输入1:" << endl;
cin >> name;
cout << "输入2:" << endl;
cin >> pass;
str = name.append(" ").append(pass);//data.txt中需要删除的某一行内容,可根据自己的需要修改
while (getline(in, estr))//得到data.txt中一行的内容
{
if (!estr.compare(str))//比较tdata.txt每一行的内容和要删除的是否一致,一致就跳过
continue;
out << estr << "\n";//不一致的内容写到temp.txt中,注意换行
}
in.close();//关闭流
out.close();
fstream outfile("C:\\Users\\msi-\\Desktop\\test.txt", ios::out);
fstream infile("C:\\Users\\msi-\\Desktop\\temp.txt", ios::in);
while (getline(infile, estr)) //将temp.txt的内容写到test.txt
{
outfile<< estr << "\n";
}
const char* path = "C:\\Users\\msi-\\Desktop\\temp.txt";
remove(path);//删除temp.txt
outfile.close();
infile.close();
}
将函数在管理员界面调用即可
浙公网安备 33010602011771号