#include <iostream>
#include <fstream>
using namespace std;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
const int Msize_Person=100; //学生人数上限
const int Msize_Music=100; //歌曲数目上限
const int Msize_End=1000; //配对上限
struct Person //学生
{
char name_p[30]; //姓名
int num_p; //学生编号
char sex[6]; //性别b/g(男/女)
};
struct Music //音乐
{
int number_m;//歌曲编号
int order;//歌序号
char name_m[30];//歌曲名
char singer[30];//歌手名
};
struct MatchList//配对列表
{
int num_b;//男编号
int num_g;//女编号
char name_b[30];//男姓名
char name_g[30];//女姓名
char sex_b[6];//男性别
char sex_g[6];//女性别
char neme_me[30];//歌名
char singer_e[30];//歌手
int number_me;//歌编号
int order_e;//歌曲序号
};
class Dance //舞伴类
{
public:
Dance(); //构造函数
void Menu(); //主界面
void Display_e();//2、显示每曲配对
void Chaxun(); //3、查询配对
void Add();//4、添加信息
void Reset(); //配对列表重置
void Match(); //自动配
void Add_P();//添加学生
void Add_M();//添加歌曲
void Display_p();//显示学生
void Display_m();//显示歌曲
void Menu_c();//查询配对
void Menu_xinximo();//音乐录入
void Menu_xinxipo();//学生录入
void Menu_add();//添加信息主界面
private:
int front_b,rear_b;//队头,队尾
int front_g,rear_g;
int front_m,rear_m;
int front_e,rear_e;
int Num_B;
int Num_G;
int Num_M;
int Min;//较少队列人数
int count;//学生总人数 用于学生编号
int FLOG;//
Person Que_Boy[Msize_Person]; //1 男生队列
Person Que_Girl[Msize_Person]; //2 女生队列
Music Que_Music[Msize_Music]; //3 歌曲队列
MatchList Que_End[Msize_End]; //4 配对队列
};
Dance::Dance()
{
Num_B=Num_G=Num_M=count=0;//男女生、歌曲数初始化为0
front_b=rear_b=Msize_Person-1;//初始化队列
front_g=rear_g=Msize_Person-1;
front_m=rear_m=Msize_Music-1;
front_e=rear_e=Msize_End-1;
}
void Dance::Menu() //主界面 *
{
cout<<"\t\t-----------------------------------------"<<endl;
cout<<"\t\t--- 欢迎进入舞池配对系统 ---"<<endl;
cout<<"\t\t--- 1、添加信息 2、每曲配对 ---"<<endl;
cout<<"\t\t--- 3、查询信息 4、退出系统 ---"<<endl;
cout<<"\t\t-----------------------------------------"<<endl;
}
void Dance::Menu_xinximo()//手动录入歌曲 *
{
cout<<"\t\t*************************************"<<endl;
cout<<"\t\t***** 歌曲信息已保存至系统 *****"<<endl;
cout<<"\t\t***** 请选择您的操作 *****"<<endl;
cout<<"\t\t***** 1、继续添加 *****"<<endl;
cout<<"\t\t***** 2、返回上一级 *****"<<endl;
cout<<"\t\t*************************************"<<endl;
}
void Dance::Menu_xinxipo()//手动录入学生 *
{
cout<<"\t\t*************************************"<<endl;
cout<<"\t\t***** 学生信息已保存至系统 *****"<<endl;
cout<<"\t\t***** 请选择您的操作 *****"<<endl;
cout<<"\t\t***** 1、继续添加 *****"<<endl;
cout<<"\t\t***** 2、返回上一级 *****"<<endl;
cout<<"\t\t*************************************"<<endl;
}
void Dance::Add_P()//添加学生
{
int flog_p1,flog_po,i,n_p;
char sel_po;
flog_p1=1;
while(flog_p1)
{//_
cout<<"请输入添加人数:"<<endl;
cin>>n_p;
if(n_p>0)
cout<<"姓名\t性别(b/g)"<<endl; //录入信息完成
for(i=0;i<n_p;i++) //添加学生信息
{//+
char name_i[30],sex_i[6];
cin>>name_i>>sex_i;
if((strcmp(sex_i,"b"))==0)//男生入队
{
int rear_ab;
rear_ab=(rear_b+1)%Msize_Person;
rear_b=(rear_b+1)%Msize_Person;
if(front_b!=rear_b)
{
strcpy(Que_Boy[rear_b].name_p,name_i);
strcpy(Que_Boy[rear_b].sex,sex_i);
Que_Boy[rear_b].num_p=count+1;//从1开始编号
Num_B=Num_B+1;//男队人数加一
count++;
ofstream outfile("student1.txt",ios::app);//男生写入文件
if(!outfile)
{cout<<"open error!"<<endl; exit(1);
}
else//写入到文件
{
outfile.write((char*)&Que_Boy[rear_ab],sizeof(Que_Boy));
}
}
else{cout<<"\t队列已满"<<endl;}
}
else if((strcmp(sex_i,"g"))==0)//女生入队
{
int rear_ag;
rear_ag=(rear_g+1)%Msize_Person;
rear_g=(rear_g+1)%Msize_Person;
if(front_b!=rear_b)
{
strcpy(Que_Girl[rear_g].name_p,name_i);
strcpy(Que_Girl[rear_g].sex,sex_i);
Que_Girl[rear_g].num_p=count+1;//从1开始编号
Num_G=Num_G+1;//加一
count++;//女队人数
ofstream outfile("student1.txt",ios::app);//女生写入文件
if(!outfile)
{cout<<"open error!"<<endl; exit(1);
}
else//写入到文件
{
outfile.write((char*)&Que_Girl[rear_ag],sizeof(Que_Girl));
}
}
else{cout<<"\t队列已满"<<endl;}
}
else
{
cout<<"\t信息录入错误,请重新输入学生信息"<<endl;
i--;
}
}//+
Min=(Num_G<=Num_B)?Num_G:Num_B;//较少队列人数
flog_po=1;
while(flog_po)
{//=
Menu_xinxipo();//是否继续添加菜单
cin>>sel_po;
switch(sel_po)
{
case '1'://继续添加
flog_po=0;
break;
case '2'://返回上一级 学生录入
flog_p1=0;//退出手动录入
flog_po=0;//返回上一级
break;
default:
cout<<"输入错误,请重新输入"<<endl;
break;
}
}//=
}//_
}
void Dance::Add_M()//添加歌曲
{
int j;
int flog_m1,flog_mo,n_m;
char sel_mo;
flog_m1=1;
while(flog_m1)
{
cout<<"输入歌曲数目"<<endl;
cin>>n_m;
char name_mi[30],singeri[30];
if(n_m>0)
cout<<"歌名"<<"\t歌手"<<endl;
for(j=0;j<n_m;j++)
{
int rear_am;
rear_am=(rear_m+1)%Msize_Music;
cin>>name_mi>>singeri;
rear_m=(rear_m+1)%Msize_Music;
if(rear_m!=front_m)
{
strcpy(Que_Music[rear_m].name_m,name_mi);
strcpy(Que_Music[rear_m].singer,singeri);
Que_Music[rear_m].number_m=1+Num_M;//歌曲从1编号
Que_Music[rear_m].order=Num_M=Num_M+1;//歌曲序号
ofstream outfile("music1.txt",ios::app);//歌曲写入文件
if(!outfile)
{
cout<<"open error!"<<endl;
//exit(1);
}
else//写入到文件
{
outfile.write((char*)&Que_Music[rear_am],sizeof(Que_Music));
}
}
else
{cout<<"\t队列已满"<<endl;}
}
flog_mo=1;
while(flog_mo)
{
Menu_xinximo();
cin>>sel_mo;
switch(sel_mo)
{
case '1'://继续添加
flog_mo=0;
break;
case '2'://返回上一级 歌曲录入
flog_m1=0;//退出手动录入
flog_mo=0;//返回上一级
break;
default:
cout<<"输入错误,请重新输入"<<endl;
break;
}
}
}
}
void Dance::Menu_add()//4、添加信息 *
{
cout<<"\t\t*********************************"<<endl;
cout<<"\t\t**** 添加信息类别 ****"<<endl;
cout<<"\t\t**** 1、添加歌曲信息 ****"<<endl;//系统提供
cout<<"\t\t**** 2、添加学生信息 ****"<<endl;
cout<<"\t\t**** 3、返回上一级菜单 ****"<<endl;
cout<<"\t\t*********************************"<<endl;
}
void Dance::Add()//4、添加信息
{
char sel_a;
int flog_a=1;
while(flog_a==1)
{
Menu_add();
cin>>sel_a;
switch(sel_a)
{
case '1'://添加歌曲
Add_M();
break;
case '2'://添加学生
Add_P();
break;
case '3'://返回上一级
flog_a=0;
break;
default:
cout<<"\t输入错误,请重新输入"<<endl;
break;
}
}
}
void Dance::Reset() //匹配列表重置*
{
front_e=rear_e=Msize_End-1;
}
void Dance::Display_e()//2、显示每曲配对信息
{
int p,q;
int f_d,min_d;
min_d=Min;
f_d=(front_e+1)%Msize_End;
if(FLOG!=0)
{
Match();//匹配
for(q=f_d;q<=rear_e;q=(q+min_d)%Msize_End)
{
cout<<"\t**********************************************************************"<<endl;
cout<<"\t\t\t\t歌序号\t歌名\t演唱者 "<<endl;
cout<<"\t\t\t\t"<<Que_End[q].number_me<<"\t"<<Que_End[q].neme_me<<"\t"<<Que_End[q].singer_e<<endl;//cout<<"\t\t男生\t\t女生"<<endl;
cout<<"\t----------------------------------------------------------------------"<<endl;
cout<<"\t编号\t\t姓名\t性别\t\t编号\t\t姓名\t性别 "<<endl;
for(p=f_d;p<min_d+f_d;p=(p+1)%Msize_End)
cout<<"\t"<<Que_End[p].num_b<<"\t"<<Que_End[p].name_b<<"\t"<<Que_End[p].sex_b<<"\t\t"<<Que_End[p].num_g<<"\t"<<Que_End[p].name_g<<"\t"<<Que_End[p].sex_g<<endl;
cout<<"\t**********************************************************************"<<endl;
f_d=(f_d+min_d)%Msize_End;
}
Reset();//匹配队列归零
}
else
{
if(Num_B==0)
cout<<"\t\t男生列表为空!"<<endl;
if(Num_G==0)
cout<<"\t\t女生列表为空!"<<endl;
if(Num_M==0)
cout<<"\t\t音乐列表为空!"<<endl;
cout<<"\t\t无法进行配对!"<<endl;
}
}
void Dance::Menu_c()////3、查询配对主界面 *
{
cout<<"\t\t*************************************"<<endl;
cout<<"\t\t**** 选择查询信息 ****"<<endl;
cout<<"\t\t**** 1、第K曲配对 ****"<<endl;
cout<<"\t\t**** 2、男女配对情况 ****"<<endl;
cout<<"\t\t**** 3、学生信息 ****"<<endl;
cout<<"\t\t**** 4、歌曲信息 ****"<<endl;
cout<<"\t\t**** 5、返回上一级 ****"<<endl;
cout<<"\t\t*************************************"<<endl;
}
void Dance::Display_m()//显示歌曲列表
{
int m,i;//,x;
m=(front_m+1)%Msize_Music;
if(Num_M==0)
cout<<"\t歌曲列表为空"<<endl;
else
{
cout<<"歌曲列表"<<endl;
for(i=0;i<Num_M;i++)
{
cout<<"\t\t歌名"<<"\t\t歌手"<<"\t\t编号"<<endl;
cout<<"\t\t"<<Que_Music[m].name_m<<"\t\t"<<Que_Music[m].singer<<"\t\t"<<Que_Music[m].number_m<<endl;
m=(m+1)%Msize_Music;
}
}
}
void Dance::Display_p()//显示学生信息
{
int m,x,i;
m=(front_b+1)%Msize_Person;
x=(front_g+1)%Msize_Person;
if(Num_B==0)
cout<<"\t男生列表为空"<<endl;
else
{
cout<<"\t\t男生名单"<<endl;
for(i=0;i<Num_B;i++)
{
cout<<"\t\t编号\t\t姓名\t性别"<<endl;
cout<<"\t\t"<<Que_Boy[m].num_p<<"\t"<<Que_Boy[m].name_p<<"\t"<<Que_Boy[m].sex<<endl;
m=(m+1)%Msize_Person;
}
}
if(Num_G==0)
cout<<"\t女生列表为空"<<endl;
else
{
cout<<"\t\t女生名单"<<endl;
for(i=0;i<Num_G;i++)
{
cout<<"\t\t编号\t\t姓名\t性别"<<endl;
cout<<"\t\t"<<Que_Girl[x].num_p<<"\t"<<Que_Girl[x].name_p<<"\t"<<Que_Girl[x].sex<<endl;
x=(x+1)%Msize_Person;
}
}
}
void Dance::Chaxun() //3、查询信息 *
{
char sel_c;
int flog_c,flog_k,k1,k,x,y;
int i,p;//j,,q;
flog_c=1;
Match();//注:每次配对都需要对配对队列清零
while(flog_c==1)
{
Menu_c();
cin>>sel_c;
switch(sel_c)
{
case '1'://第K曲配对情况
cout<<"输入k:";//<<endl;
cin>>k1;
int n_k;
n_k=k1;
if(k1>Num_M)
cout<<"找不到该歌曲,可能是超出已有歌曲范围,请重新输入"<<endl;
else
{
flog_k=0;
for(i=(front_e+1)%Msize_End;i<=rear_e;i=(i++)%Msize_End)
if(k1==Que_End[i].order_e)
{
flog_k=1;
k1=i;
break;
}
if(flog_k==1)
{
cout<<"\t**********************************************************************"<<endl;
cout<<"\t\t\t\t第"<<n_k<<"曲配对情况如下: "<<endl;
cout<<"\t\t\t\t歌编号\t歌序号\t歌名\t演唱者 "<<endl;
cout<<"\t\t\t\t"<<Que_End[k1].number_me<<"\t"<<Que_End[k1].order_e<<"\t"<<Que_End[k1].neme_me<<"\t"<<Que_End[k1].singer_e<<endl;//cout<<"\t\t男生\t\t女生"<<endl;
cout<<"\t----------------------------------------------------------------------"<<endl;
cout<<"\t编号\t\t姓名\t性别\t\t编号\t\t姓名\t性别 "<<endl;
for(p=k1;p<(k1+Min)%Msize_End;p=(p+1)%Msize_End)
cout<<"\t"<<Que_End[p].num_b<<"\t"<<Que_End[p].name_b<<"\t"<<Que_End[p].sex_b<<"\t\t"<<Que_End[p].num_g<<"\t"<<Que_End[p].name_g<<"\t"<<Que_End[p].sex_g<<endl;
cout<<"\t**********************************************************************"<<endl;
}
else
cout<<"\t未找到第k曲配对信息"<<endl;
}
break;
case '2'://男生(编号X)任意女生(编号Y), 在第K曲配对跳舞的情况
int count_c,k_b,k_g,k_m,n;
count_c=0;
cout<<"输入男(x)女(y)生及歌曲(k)编号"<<endl;
cin>>x>>y>>k;
n=k;
k_g=k_b=k_m=0;
for(i=(front_e+1)%Msize_End;i<=rear_e;i=(i++)%Msize_End)
if(k==Que_End[i].order_e)
{
k=i;
k_m=1;
break;
}
for(i=(front_e+1)%Msize_End;i<=rear_e;i=(i++)%Msize_End)
{
if(x==Que_End[i].num_b)
k_b=1;
if(y==Que_End[i].num_g)
k_g=1;
}
if(k_b!=1)
cout<<"找不到该男生,可能是超出范围"<<endl;
if(k_g!=1)
cout<<"找不到该女生,可能是超出范围"<<endl;
if(k_m!=1)
cout<<"找不到该歌曲,可能是超出范围"<<endl;
if(k_g==1&&k_b==1&&k_m==1)
{
for(i=k;i<(k+Min)%Msize_End;i=(i++)%Msize_End)
if(Que_End[i].num_b==x&&Que_End[i].num_g==y)
count_c=1;
if(count_c==1)
cout<<"编号为"<<x<<"的男生与"<<"编号为"<<y<<"的女生在第"<<n<<"曲中为一对舞伴"<<endl;
else
cout<<"编号为"<<x<<"的男生与"<<"编号为"<<y<<"的女生不能在第"<<n<<"曲中结成舞伴跳舞"<<endl;
}
break;
case '3'://学生信息
Display_p();
break;
case '4'://歌曲信息
Display_m();
break;
case '5'://返回上一级
flog_c=0;
break;
default:
cout<<"\t输入错误,请重新输入"<<endl;
break;
}
}
Reset();//注:每次配对都需要对配对队列清零
}
void Dance::Match() //自动配对
{
int i,j,flog_e;//flog_e传出配对队列队尾
int f_b,f_g,f_m;//,f_e;//临时变量 男/女/歌队头
int min,n_m;//,max;//n_m临时歌曲数
int front_bl,rear_bl;
int front_gl,rear_gl;//int flog_lb,flog_lg;//控制将数据传入临时队列
f_b=front_b;
f_g=front_g;
f_m=front_m;
n_m=Num_M;//歌曲数
front_bl=rear_bl=Msize_Person-1;//临时队列初始化
front_gl=rear_gl=Msize_Person-1;//
Person Qb_lin[Msize_Person]; //1 临时男队列
Person Qg_lin[Msize_Person]; //2 临时女队列
if(Num_G!=0&&Num_B!=0&&Num_M!=0)//如果一方信息为空,中止操作
{
FLOG=1;//没有列表为空
while(f_b!=rear_b)//复制男生信息到临时队列
{
rear_bl=(rear_bl+1)%Msize_Person;
f_b=(f_b+1)%Msize_Person;
strcpy(Qb_lin[rear_bl].name_p,Que_Boy[f_b].name_p);
strcpy(Qb_lin[rear_bl].sex,Que_Boy[f_b].sex);
Qb_lin[rear_bl].num_p=Que_Boy[f_b].num_p;
}
while(f_g!=rear_g)//复制女生信息到临时队列
{
rear_gl=(rear_gl+1)%Msize_Person;
f_g=(f_g+1)%Msize_Person;
strcpy(Qg_lin[rear_gl].name_p,Que_Girl[f_g].name_p);
strcpy(Qg_lin[rear_gl].sex,Que_Girl[f_g].sex);
Qg_lin[rear_gl].num_p=Que_Girl[f_g].num_p;
}
f_b=front_bl;//f_b/f_g重新赋初值
f_g=front_gl;
for(j=0;j<Num_M;j++)
{
min=Min;//较少队人数
int rear_p;
rear_p=(f_m+1)%Msize_Music;
f_m=(f_m+1)%Msize_Music;
for(i=0;i<min;i++)//配对,未完成
{
rear_e=(rear_e+1)%Msize_End;//配对循环加一
strcpy(Que_End[rear_e].neme_me,Que_Music[f_m].name_m);//歌曲//cout<<"歌曲:"<<Que_End[rear_e].neme_me<<endl;
strcpy(Que_End[rear_e].singer_e,Que_Music[f_m].singer);//歌手//cout<<"歌手:"<<Que_End[rear_e].singer_e<<endl;
Que_End[rear_e].number_me=Que_Music[f_m].number_m;//歌曲编号======
Que_End[rear_e].order_e=Que_Music[f_m].order;
front_bl=(front_bl+1)%Msize_Person;//男、女“出队” 临时男女队列
front_gl=(front_gl+1)%Msize_Person;//
rear_bl=(rear_bl+1)%Msize_Person;//匹配完毕 入临时队列
rear_gl=(rear_gl+1)%Msize_Person;//0=0=0=0=0=0=0=
strcpy(Que_End[rear_e].name_b,Qb_lin[front_bl].name_p);//配对 男---------
strcpy(Que_End[rear_e].sex_b,Qb_lin[front_bl].sex);
Que_End[rear_e].num_b=Qb_lin[front_bl].num_p;
strcpy(Que_End[rear_e].name_g,Qg_lin[front_gl].name_p);//女
strcpy(Que_End[rear_e].sex_g,Qg_lin[front_gl].sex);
Que_End[rear_e].num_g=Qg_lin[front_gl].num_p;//配对完毕-------------
strcpy(Qb_lin[rear_bl].name_p,Qb_lin[front_bl].name_p);//入队++++++++
strcpy(Qb_lin[rear_bl].sex,Qb_lin[front_bl].sex);
Qb_lin[rear_bl].num_p=Qb_lin[front_bl].num_p;
strcpy(Qg_lin[rear_gl].name_p,Qg_lin[front_gl].name_p);
strcpy(Qg_lin[rear_gl].sex,Qg_lin[front_gl].sex);
Qg_lin[rear_gl].num_p=Qg_lin[front_gl].num_p;//++++++++++
flog_e=rear_e;//配对 队尾
ofstream outfile("match.txt",ios::app);
if(!outfile)
{
cout<<"学生文件打开失败!"<<endl;//exit(1);
}
else
{
outfile.write((char*)&Qg_lin[rear_p],sizeof(Qg_lin));//二进制保存
}
outfile.close();
}
}
}
else
FLOG=0;//有空列表
}
int main()
{
int flog;
char selection;
flog=1;
Dance dancer;
while(flog)
{
dancer.Menu();
cin>>selection;
switch(selection)
{
case '1'://1、信息录入
dancer.Add();
break;
case '2'://2、显示配对信息
dancer.Display_e();
break;
case '3'://3、查询配对
dancer.Chaxun();
break;
case '4'://退出
cout<<"谢谢使用系统界面,按任意键退出系统……"<<endl;
flog=0;
break;
default:
cout<<"\t输入错误,请重新输入"<<endl;
break;
}
}
return 0;
}
为什么查询男女配对这个部分我无法运行 输入编号之后按回车程序没有反应 也退出不了