⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wuban6.cpp

📁 数据结构课程设计,舞伴问题,一个很有价值的程序
💻 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 + -