如何用C++实现舞蹈模拟配对

ITlijing_2007 2008-03-12 08:42:32
这是我们课程设计的一个题目,我用创建一个类来实现,然后用模板类来实现,可是在程序编译时就是不能通过,由于所学疏浅,不能解决,请问怎么解决这个程序?谢谢~


舞会上男女各排成一队进入舞厅,跳舞时依次从男士队伍和女士队伍的队头各出一个人相互结成舞伴。如果两队的人数不等,则队伍较长中未配对的人员将等待下一轮的舞曲。
要求用程序完成该配对过程的模拟,从键盘输入所有人员的名单,输入格式为“姓名 性别”,并且男女无序,输出所有配对的男女舞伴,如果某队伍中还有人员未配对完,则另外输出所有尚未配对人员名单。
选作内容:
1. 实现下一轮次的继续配对,此时,所有尚未配对的人员应优先予以配对;
2. 将姓名与性别数据存放在文本文件中,直接从文本中读入数据。
实现说明:
1. 总是排在队头的男女相互结成舞伴,具有队列的先进先出特征,因此采用队列来完成;
2. 采用两个队列分别存放男士和女士的姓名,所有输入的人员按照性别依次分解到各自的队列中,然后顺次取出各自的队头元素来配对并输出;
3. 队列类的数据类型可以是字符数组,也可以先实现模板类,再用字符数组来实例化实现。
template<class T>
struct queueNode //定义队列中各节点类型
{
T nodeData;
queueNode *next;
};

template<class T>
class queue
{
public:
queue(int maxqueueSize=10);
virtual ~queue()
{
delete[]queue;
}
void InitQueue(); //队列初始化
int IsEmpty()const //判队列为空
{
return front==rear;
}
int IsFull()const //判断队列为空
{
return (rear+1)%maxSize==front;
}
int EnQueue(queueNode *q,T x) ; //入队
int DeQueue(queueNode *q) ; //出队
private:
int rear,front;
T *elements; //存放队列元素的数组
int maxSize; //队列数组的大小

};
template<class T>
queue<T>::queue(int maxqueueSize)//创建一个容量为maxqueueSize的空队列
{
maxSize = maxqueueSize + 1;
queue = new T[maxSize];
front = rear = 0;
}
template<class T>
void queue<T>::InitQueue()
{
queueNode *q;
q=new T[maxSize];
q- >front=q- >rear=0;
return q;
}
template<class Type>
void queue<T>::EnQueue(const Type &item)
{
assert(!IsFull());
rear=(rear+1)%maxSize;
elements[rear]=item;
}
template<class Type>
int Queue<Type>::DeQueue()
{
assert(!IsEmpty());
front=(front+1)%MaxSize;
return elements[front];
}
void DancePartner(dancer dancers[],int num) //结构数组dancer中存放跳舞的男女,num是跳舞的人数
{
queueNode *Mdancers,*Fdancers;
int i, count=0;
dancer p;
Mdancers=InitQueue(); //男士队列初始化
Fdancers=InitQueue(); //女士队列初始化
for(i=0;i <num;i++) //依次将跳舞者依其性别入队
{
p=dancer[i];
if(strcmp(p.sex, "f ")==0)
EnQueue(Fdancers,p); //排入女队
else EnQueue(Mdancers,p); //排入男队
}
cout<< "The dancing partners are: "<<endl;
while(!IsEmpty(Fdancers)&&!IsEmpty(Mdancers)) //依次输入男女舞伴名
{
count++;
p=DeQueue(Fdancers); //女士出队
cout<< "女士: "<<p.name<<endl; //打印出队女士名
p=DeQueue(Mdancers); //男士出队
cout<< "男士: "<<p.name<<endl; //打印出队男士名
}
if(!IsEmpty(Fdancers)) //输出女士剩余人数及队头女士的名字
{
cout<<" 等待下一轮舞曲妇女人数: "<<num-2*count<<endl;
p=DeQueue(Fdancers);
cout<< "队头女士名字: "<<p.name<<endl;

}
if(!IsEmpty(Mdancers)) //输出男队剩余人数及队头者名字
{
cout<< "等待下一轮舞曲男士人数:"<<num-2*count<<endl;
p=DeQueue(Mdancers);
cout<< "队头男士名字: "<<p.name<<endl;
}
}
int GetDancersInfo(dancer dancers[])
{
int count=0;
dancer p;
while (1)
{
cout<< "输出性别: "<<sex<<endl;
cin>>p.sex;
if(strcmp(p.sex, "0 ")==0) break;
cout<< "输出名字: "<<name<<endl;
cin>>p.name;
dancers[count]=p;
count++;
}
return count;
}


void main()
{
//queue<dancer>que;
dancer Dancers[maxSize];
char name[20];
char sex[8];

int DancersNum;

DancersNum=GetDancersInfo(Dancers);
if(DancersNum!=0) DancePartner(dancer,int);
getchar();
}
...全文
207 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qmm161 2008-03-13
  • 打赏
  • 举报
回复
ms应该用循环链表来实现,为什么用队列?
ryfdizuo 2008-03-12
  • 打赏
  • 举报
回复
void DancePartner(dancer dancers[],int num)
在这个函数里面你对象都没有定义就直接调用成员函数啊,而且类里面的构造函数和InitQueue函数貌似重复,
ryfdizuo 2008-03-12
  • 打赏
  • 举报
回复
你的dancer是怎么定义的?

64,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧