📄 wuban6.cpp
字号:
#include <iostream.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define OK 1
#define ERROR 0
#define FALSE 0
#define TRUE 1
#define OVERFLOW -2
#define MAXQSIZE 101 //最大队列长度
typedef char QElemType;
typedef int Status;
//typedef char name[50];
//定义队列(顺序存储结构)
typedef struct {
QElemType *base; //初始化时动态分配存储空间
int front; //头指针,若队列不为空,指向队列头元素
int rear;//尾指针,若队列不为空,指向队列尾元素下一个位置
int queuesize;
}SqQueue;
//构造一个空队列 1
int InitQueue(SqQueue &Q)
{
Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(Q.base==NULL) exit(OVERFLOW); //存储分配失败
Q.front=Q.rear=0; //Q.front取0-MAXQSIZE-1之间任何一个数都可以
return OK;
}//InitQueue
//销毁队列 2
int DestroyQueue(SqQueue &Q)
{
free(Q.base);
Q.base=NULL;
Q.front=Q.rear=0;
return OK;
}//DestroyQueue
//插入元素e为Q的新的队尾元素 7
int EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR; //队列满
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}//EnQueue
//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK.否则返回ERROR 8
int DeQueue(SqQueue &Q,QElemType &e)
{
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}//DeQueue
int scan()
{
int d;
printf("1、输入舞会上舞者的信息 2、输入所要求的舞者的信息并计算 \n");
printf("3、继续输入要计算的名字 0、退出\n");
cout<<endl;
cout<<"请选择编号"<<endl;
cin>>d;
return d;
}
//
Status main()
{
int quit=0;
SqQueue Q_m,Q_w;
int num_m,num_w; //记录男士和女士人数
int i,order_m,order_w;
char name_w[100],name_m[100];
char x,y; //所要计算的男士女士的名字
int dancenum=0,s=0;
int k ,num;
char sub_m;
char sub_w;
int m,n;
cout<<endl;
cout<<"!!!第一次请您选择 : 1、输入舞会上舞者的信息"<<endl<<endl;
while(!quit)
switch(scan())
{
case 1:
////////////////////////////////////////////////
cout<<endl<<endl;
cout<<"注意:为了保证程序正确运行,请不要把每队人数超过100个"<<endl;
cout<<"输入名字时只能输入一个字符"<<endl <<endl;
/////////////////////////////////////////////////////
while (1)
{
cout<<"请输入男士人数:"; //输入男士队列的信息
cin>>num_m;
if (num_m < 1 || num_m > 100)
cout<<"输入的数值不在计算范围之内"<<endl;
cout<<"请输入男士队列的所有姓名"<<endl;
for(i=1;i<=num_m;i++)
{
cin>>name_m[i];
}
break;
}
////////////////////////////////////////////////////////////
while (1)
{
cout<<"请输入女士人数:"; //输入女队信息
cin>>num_w;
if (num_w < 1 || num_w > 100)
cout<<"输入的数值不在计算范围之内"<<endl;
cout<<"请输入女士队列的所有姓名"<<endl;
for(i=1;i<=num_w;i++)
cin>>name_w[i];
break;
}
/////////////////////////////////////////////////////////
//输出舞者的名单
while(1)
{
cout<<"-------------------------------------" <<endl;
cout<<"男士名单为:"<<endl;
for(i=1;i<=num_m;i++)
{
cout<<" "<<name_m[i] ;
if(i%10==0) //将名单分行输出
cout<<endl;
}
cout<<endl;
cout<<"女士名单为:"<<endl;
for(i=1;i<=num_w;i++)
{
cout<<" "<<name_w[i] ;
if(i%10==0)
cout<<endl;
}
cout<<endl;
cout<<"-------------------------------------" <<endl;
break;
}
break;
///////////////////////////////////////////////////
case 2:
case 3:
InitQueue(Q_m); //初始化男士队列
InitQueue(Q_w); //初始化女士队列
for (i = 1; i <= num_m; i++)
EnQueue(Q_m,name_m[i]); //将名单进入队列中
for (i = 1; i <= num_w; i++)
EnQueue(Q_w,name_w[i]);
s=0; //对前面一次计算过后的数据再次初始化
dancenum=0;//对前面一次计算过后的数据再次初始化
///////////////////////////////////////////////////////
//输入要计算的男士名字
while(1)
{
cout<<"请输入所求的男士名字:";
cin>>x;
for (i = 1; i <= num_m; i++)
{
if(name_m[i]==x) //把所求的名字跟数组中的名字进行比较,如果相等,
{ //则进入下一个循环,不等则说明队中没有这个人,则继续输入名字
order_m=i; //记录进队次序
}
}break;
}
///////////////////////////////////////////////////////////
//输入要计算的女士名字
while (1)
{
cout<<"请输入所求的女士名字:";
cin>>y;
for (i = 1; i <= num_w; i++)
{
if(name_w[i]==y)
{
order_w=i;
break;
}
}break;
}
///////////////////////////////////////////////////////////////
//人数相等时但进队次序不相等的情况
while(1)
{
if (num_m==num_w) //
{
if(order_m!=order_w)
{
cout<<"-------------------------------------" <<endl;
cout<<endl<<endl;
cout<<"两人无一起跳舞的可能"<<endl;
cout<<endl<<endl;
cout<<"-------------------------------------" <<endl;
exit(0);
}
}break;
}
////////////////////////////////////////////////////////////
//人数不相等的情况以及人数相等但进队次序相等的情况
cout<<"请输入一起跳舞的次数k"<<endl;
cin>>k;
cout<<"请输入最大的舞曲数:"<<endl;
cin>>num;
for (i = 1; i <= num; i++)
{
DeQueue(Q_m,sub_m); //每进行一曲舞曲后舞者出队
DeQueue(Q_w,sub_w);
if (sub_m == x && sub_w == y)//如果出队的两个人名字跟所求的两个人的名
s++; //字相等则记录一次,S加1
dancenum=i; //用dancenum记录每次一起跳舞后全场进行的舞曲数
if(s==k)
{ i=num+1;//把i的值置为比舞曲数大一的数,使S 与K 相等时退出FOR循环
cout<<"-------------------------------------" <<endl;
cout<<endl<<endl;
cout<<"这次舞会中,男士"<<x<<endl;
cout<<"和女士"<<y<<endl;
cout<<"第"<<k<<"次跳舞时的舞曲数是:"<<dancenum<<endl<<endl;
cout<<"-------------------------------------" <<endl;
}
if(i==num&&s<k)//舞曲数太少时两人有可能不能在那么
//多次输入的次数的跳舞机会
{
cout<<"-------------------------------------" <<endl;
cout<<endl<<endl;
cout<<"由于舞曲数太少,两人没有一起跳舞的机会,"<<endl;
cout<<"或是输入的名字有误";
cout<<endl<<endl;
cout<<"-------------------------------------" <<endl;
}
EnQueue(Q_m,sub_m); //舞者出队后进入队尾
EnQueue(Q_w,sub_w);
}
DestroyQueue(Q_m); //计算结束后销毁队列
DestroyQueue(Q_w);
break;
case 0:quit=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -