功能要求:假设考场有8×8的座位,本程序可自动对考生进行座位安排,每当一个考生进入考场就为他安排座位。
循环显示如下图所示的主菜单:
选择1,为新来的考生安排座位,其方法是:用户输入准考证号和姓名,然后系统随机产生该考生座位的行号和列号,要求做到一个考生只有一个座位,而且在已有考生的位置上不能再安排新的考生;
选择2,取消某人考场座位;
选择3,要求输入座位的行号和列号,然后显示该座位学生的信息;
选择4,要求输入某考生准考证号,然后显示该学生的座位;
选择5,显示考场座次表,要求再每个座位对应的行列上显示该考生的准考证号。
|-------------------------------------------|
请输入选项编号(1—5): |
1-设定考场座位 |
2-取消考场座位 |
3-显示某座位考生信息 |
4-查找学生座位 |
5-显示考场座次表 |
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
//定义一个学生类
class student
{
public:
student()
{
stestnum=""; sname=="";
}
void setmessage()
{
cin>>stestnum>>sname;
}
string stestnum;//考号
string sname;//姓名
};
student cstu[64];//8*8=64个座位,用对象数组存储
const int row=8, col=8; //座位行和列
void arrange_seat(int seat[][col]); //设定考场座位
void cancel_seat(int seat[][col]); //取消考场座位
void find_student(int seat[][col]); //显示某座位考生信息
void find_seat(int seat[][col]); // 查询找生座位
void display_seats(int seat[][col]);//显示考场座次表
int main()
{
int choose, seat[row][col],i,j;
//嵌套循环
for (i=0; i<row; i++){
for (j=0; j<col; j++){
seat[i][j] = 0; //0表示座位为空
}
}
do
{
cout<<"|------------ 考场系统座位设计 -----------|"<<endl
<<"|------------ 请输入选项编号(1-5) -----------|"<<endl
<<" | 1-设定考场座位 | "<<endl
<<" | 2-取消考场座位 | "<<endl
<<" | 3-显示某座位考生信息 | "<<endl
<<" | 4-查询找生座位 | "<<endl
<<" | 5-显示考场座次表 | "<<endl
<<" | 0-退出! | "<<endl
<<"|------------------------------------------------|"<<endl;
cin>>choose;
if (1 == choose) arrange_seat(seat);
else if (2 == choose) cancel_seat(seat);
else if (3 == choose) find_student(seat);
else if (4 == choose) find_seat(seat);
else if (5 == choose) display_seats(seat);
else exit(1);
} while( choose );
}
//选择1,为新来的考生安排座位,方法:用户输入准考证号和姓名,系统随机产生
//-------该考生座位的行号和列号,要求做到一个考生只有一个座位,而且在已有考生的位
void arrange_seat(int seat[][col])
{
time_t t;
int newseat,r=0,c=0;
srand((unsigned int)time(&t));
for ( r=0; r<row; r++)
{
for ( c=0; c<col; c++)
{
if (seat[r][c] == 0)break; //有空位子
if (r==row && c==col)
{
cout<<"本教室考生已满!"<<endl;
return ;
}
}
}
do
{
newseat = rand()%64; //产生座位号
r = newseat/8; //行
c = newseat - r*8 ;//列
}while( seat[r][c] != 0); //座位已经有人重先产生座位号
//---------------------------------//
seat[r][c]=newseat;
cout<<"请输入准考证号和姓名:";
cstu[newseat].setmessage(); //把信息存储到学生类中
for (int i=0; i<64; i++)
{
if ( i != newseat) //相同准考证号不能重复申请位子
{
if ( cstu[newseat].stestnum == cstu[i].stestnum )
{
cout<<"对不起!该准考证号已申请过座位,请您核对后再输入:";
cstu[newseat].setmessage(); //
i--;
}
}
}
cout<<"操作成功!"<<endl;
}
/********************************************/
//选择2,取消某人考场座位(假设取消后的座位别人能坐)
void cancel_seat(int seat[][col])
{
string name;
int i,r,c;
cout<<"输入要取消的考生姓名:";
cin>>name;
for (i=0; i<64; i++)
{
if (cstu[i].sname == name)
{
r = i/8; //行
c = i - r*8 ;//列
seat[r][c]=0; //赋值为0代表此座位无人
cstu[i].stestnum = "";//清空存储信息
cstu[i].sname = "";
cout<<"操作成功!"<<endl;
return ;
}
}
cout<<"该考场没有此人!"<<endl;
cout<<endl;
}
//选择3,要求输入座位的行号和列号,然后显示该座位学生的信息;
void find_student(int seat[][col])
{
int r,c;
cout<<"请输入行号row和列号col:";
cin>>r>>c;
r = r-1;
c = c-1;
if ( cstu[r*8+c].stestnum =="" || cstu[r*8+c].sname == "")
{
cout<<"该座位目前为空."<<endl;
}
else
{
cout<<"准考证:"<<cstu[r*8+c].stestnum<<", 姓名:"<<cstu[r*8+c].sname<<endl;
}
cout<<endl;
}
//选择4,要求输入某考生准考证号,然后显示该学生的座位;
void find_seat(int seat[][col])
{
int r,c;
string textnum;
cout<<"请输入准考证号:";
cin>>textnum;
for ( r=0; r<row; r++)
{
for (c=0; c<col; c++)
{
if (textnum == cstu[r*8+c].stestnum)
{
cout<<"查询结果: "<<"row:"<<r+1<<","<<"col:"<<c+1<<endl;
return ;
}
}
}
cout<<"准考证错误!"<<endl;
cout<<endl;
}
//选择5,显示考场座次表,要求再每个座位对应的行列上显示该考生的准考证号。
void display_seats(int seat[][col])
{
int r,c;
cout<<"本考场座位占用情况如下(*代表无人,数字代表准考证号):"<<endl;
for ( r=0; r<row; r++)
{
for (c=0; c<col; c++)
{
if (seat[r][c] != 0) //不为0则有人
{
//输出的行左对齐,列宽10
cout.setf(ios::left);
cout<<setw(10)<<(cstu[r*8+c].stestnum);//有人输出准考证号
}else
{
cout.setf(ios::left);
cout<<setw(10)<<"********";//无人输出*******
}
}
}
cout<<endl<<endl;
}