功能要求:假设考场有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;
}