求个C++大神帮小女子度过难关啊!不然就要挂科挂科滴干活了ⷶⷶ&#

2025-02-23 06:41:40
推荐回答(1个)
回答1:

// exam.cpp : 定义控制台应用程序的入口点。
//
#include 
#include 
#include 
#include 
#include 
using namespace std;

class Student
{
public:
enum STUDENT_CMP
{
CMP_CARD_NO = 1,
CMP_NAME,
CMP_POS,
CMP_DROP
};
Student()
{
cmp_flag = CMP_DROP;
used = 0;
row = -1;
col = -1;
}
Student(STUDENT_CMP cmp, string para, int nrow = 0, int ncol = 0)
{
switch(cmp)
{
case CMP_NAME:
name = para;
break;
case CMP_POS:
row = nrow;
col = ncol;
break;
case CMP_CARD_NO:
default:
card_number = para;
break;
}
cmp_flag = cmp;
used = 1;
}
string name;
string card_number;
int row, col;
int used;
STUDENT_CMP cmp_flag;
bool operator==(const Student &rhs) const
{
if (!used || !rhs.used)
{
return false;
}
STUDENT_CMP flag = cmp_flag == CMP_DROP ? rhs.cmp_flag : cmp_flag;
switch(flag)
{
case CMP_NAME:
return name == rhs.name;
case CMP_POS:
return row == rhs.row && col == rhs.col;
case CMP_CARD_NO:
default:
return card_number == rhs.card_number;
break;
}
}
};

class SeatManager
{
public:
SeatManager()
:row(8), col(8), seat_used(0)
{
seat_order.resize(row * col);
srand(0);
}
int menu()
{
cout << "*******************************************************" << endl;
cout << "选项:" << endl;
cout << "1.安排座位" << endl;
cout << "2.取消学生座位      (根据准考证号)"           << endl;
cout << "3.查看座位学生信息  (根据座位行列号row col)"  << endl;
cout << "4.查看座位          (根据准考证号)"           << endl;
cout << "5.查看座次表"                                 << endl;
cout << "-1.退出"                                      << endl;
cout << "  请选择:";
int choose = -1;
cin >> choose;
cout << endl;
switch(choose)
{
case 1:
seat_add();
break;
case 2:
seat_del();
break;
case 3:
seat_query_by_card_number();
break;
case 4:
seat_query_by_col_row();
break;
case 5:
seat_print();
break;
case -1:
return -1;
default:
cout << "输入错误! 请重新输入" << endl;
break;
}
return 0;
}
protected:
void seat_add()
{
if (seat_used >= seat_order.size())
{
cout << "没有空闲座位!" << endl;
return;
}

size_t seat_remain = seat_order.size() - seat_used;
// 剩余位置中选出一个随机位置
size_t seat_new_pos = rand() % seat_remain;

// 扫一遍座位,只有NULL的才是空座位,直到找到第seat_new_pos个空位
size_t seat_null_index = 0;
for (size_t i = 0; i < seat_order.size(); ++i)
{
if (!seat_order[i].used)
{
if (seat_null_index == seat_new_pos)
{
seat_new_pos = i;
break;
}
++seat_null_index;
break;
}
}
if (seat_new_pos == seat_order.size())
{
cout << "没有空闲座位!" << endl;
seat_used = seat_order.size();
return;
}

// 录入学生信息
seat_order[seat_new_pos].col = seat_new_pos%col + 1;
seat_order[seat_new_pos].row = seat_new_pos/col + 1;
cout << "找到空闲座位: " << seat_order[seat_new_pos].row << " 排" << ", " 
<< seat_order[seat_new_pos].col << " 列" << endl;

cout << "请输入准考证号:";
cin >> seat_order[seat_new_pos].card_number;
// 查找是否已经存在
vector::iterator old = find(seat_order.begin(), seat_order.end(), 
Student(Student::CMP_CARD_NO, seat_order[seat_new_pos].card_number));
if (old != seat_order.end())
{
cout << "已经存在该准考证号的学生: 姓名 = " << old->name << endl;
return;
}

cout << "请输入学生姓名:";
cin >> seat_order[seat_new_pos].name;
seat_order[seat_new_pos].used = 1;

// 记录座位已使用
++seat_used;
}
void seat_del()
{
if (seat_used == 0)
{
cout << "目前座位表为空!" << endl;
return;
}
cout << "请输入学生准考证号:";
string stu_del_card_number;
cin >> stu_del_card_number;

vector::iterator old = find(seat_order.begin(), seat_order.end(), 
Student(Student::CMP_CARD_NO, stu_del_card_number));
if (old == seat_order.end())
{
cout << "未找到该学生!" << endl;
return;
}
old->used = 0;
cout << "成功取消!" << endl;
}
void seat_query_by_col_row()
{
if (seat_used == 0)
{
cout << "目前座位表为空!" << endl;
return;
}
cout << "请输入学生座位(ex:1 2):";
int ncol, nrow;
cin >> nrow >> ncol;
if(nrow > col || nrow < 1)
{
cout << "排数超过范围!" << endl;
return;
}
if(ncol > col || ncol < 1)
{
cout << "列数超过范围!" << endl;
return;
}
Student &old = seat_order[(nrow - 1) * col + (ncol - 1)];
if (!old.used)
{
cout << "该座位尚未分配!" << endl;
return;
}

cout << "学生姓名: " << old.name << endl;
cout << "学生姓名: " << old.name << endl;
}
void seat_query_by_card_number()
{
if (seat_used == 0)
{
cout << "目前座位表为空!" << endl;
return;
}
cout << "请输入学生准考证号:";
string stu_del_card_number;
cin >> stu_del_card_number;

vector::iterator old = find(seat_order.begin(), seat_order.end(), 
Student(Student::CMP_CARD_NO, stu_del_card_number));
if (old == seat_order.end())
{
cout << "未找到该学生!" << endl;
return;
}
cout << "学生所在座位: " << old->row << " 排," << old->col << " 列" << endl;
}
void seat_print()
{
ofstream file("seatlist.txt", ios::trunc);
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
int index = i*col + j;
if (!seat_order[index].used)
{
cout << i+1 << "排" << j+1 << "列: 无人" << endl;
file << i+1 << "排" << j+1 << "列: 无人" << endl;
}
else
{
cout << i+1 << "排" << j+1 << "列: " 
<< "cardnumber = " << seat_order[index].card_number 
<< "     name = " << seat_order[index].name << endl; 
file << i+1 << "排" << j+1 << "列: " 
<< "cardnumber = " << seat_order[index].card_number 
<< "     name = " << seat_order[index].name << endl; 
}
}
}
file.close();
}
private:
vector seat_order;
size_t seat_used;
const int col, row;
};

int main(int argc, _TCHAR* argv[])
{
SeatManager man;
while(man.menu() != -1);

return 0;
}

没怎么注释,要理解代码的话,再说咯.