/*
  Ejercicio # 5
  Nombre: Manejo de Cola de un Banco
  Autor: Carlos Rolando Calán Ajquill
  Fecha: 24/06/06 00:45
  Descripción: Programa que realiza las operaciones de Cola en un Banco
  Versión: 1.0 
*/
#include <cstdlib>
#include <iostream>
#include <conio.c>
#include <dos.h>
#include <string.h>
#define Tot 20
using namespace std;

int ColaLlena(int iC);
int ColaVacia(int iC);
void Divisiones(int x, int y);
void Rayas(int x, int y);
void Esquinas(int x,int y);
void Dibujar();
void Banco();
void SacarValoresDeLaCola(int Cola[], int &iC, int &CyC, int pos);
void SacarLaCola(int Cola[], int &iC, int &CyC);
void DesplegarLaCola(int Cola[], int iC);
void Menu(int Cola[],int &iC,int &CyC);

int main(int argc, char *argv[])
{
  int Cola[Tot];
  int iC=0;
  int CyC=5;
  system("CLS");     
  Menu(Cola, iC, CyC);  
  system("PAUSE");
  return EXIT_SUCCESS;
}
//Dibuja un Vector
void Dibujar()
{ 
  int x=-29, y=23;
  Divisiones(x,y);
  Rayas(x,y);
  Esquinas(x,y);
}
//Realiza ls operaciones de division en la pantalla principal del programa
void Divisiones(int x, int y)
{
  for(int i=0; i<9; i++)
  {
    gotoxy(x+69,y);
    cout<<"º";
    y=y+2;
  }
}
//Para realizar el rellenado de la pantalla
void Rayas(int x, int y)
{
  y--;
  for(int i=0; i<19; i++)
  {
    gotoxy(x+69,y+i);
    cout<<"º";
    gotoxy(x+72,y+i);
    cout<<"º";
  }
}
//Dibuja un caracter especial en la esquina de los graficos
void Esquinas(int x,int y)
{
  int i;
  y-=2;
  x--;
  for(int i=0; i<2; i++)
  {
    gotoxy(x+70,y);cout<<"É";cout<<"ÍÍ";
    gotoxy(x+70,y+20);cout<<"È";cout<<"ÍÍ";
    gotoxy((x+70)+3,y);cout<<"»";
    gotoxy((x+70)+3,y+20);cout<<"¼";
  }
}
//Realiza el proceso de cola del banco
void Banco()
{  
  int i, j;
  for(i=2;i<=40;i++)
    for(j=2;j<=20;j++)
    {
      //gotoxy(i, j);cout<<"ºÍÍº";
      gotoxy(i, j);cout<<"º";
    }
  gotoxy(40,18);cout<<"     ";
  gotoxy(40,19);cout<<"     ";
  gotoxy(40,20);cout<<"     ";
  gotoxy(40,20);cout<<"     ";
  cout<<"Entrada";
}
//Procedimiento para ver si la cola esta vacía
int ColaVacia(int iC)
{   
  if(iC==0)
    return 1;
  else
    return 0;
}
//Procedimiento para ver si la cola esta llena
int ColaLlena(int iC)
{
  if(iC==Tot)
    return 1;
  else
    return 0;
}
//Procedimiento para buscar un dato en la cola
int Buscar(int Array[],int iN, int Val, int &pos)
{
  int Ya=0;
  for(int j=0;j<iN;j++)
  {
    if(Array[j]==Val)
    {
      Ya=1;
      pos=j;
    }
  }
  return Ya;
}
//Realiza el procedimiento de sacar un elemento o persona de la cola
void SacarValoresDeLaCola(int Cola[], int &iC, int &CyC, int pos)
{   
  int x=41, y, j, i, k, temp;
  temp=iC-1;
  for(k=0; k<pos+1; k++)
  {
    gotoxy(x,22);
    cout<<"  ";
    gotoxy(x,19);
    cout<<Cola[0];
    gotoxy(x,19);
    cout<<"  ";
    Cola[0]=-1;
    for(j=0;j<iC;j++)
      Cola[j]=Cola[j+1];
    y=24;
    iC--;
    for(j=0;j<iC;j++)
    {
      gotoxy(x,y);
      cout<<"  ";
      gotoxy(x,y-2);
      cout<<Cola[j];
      y=y+2;
    }
  }
}
//Procedimiento para sacar un elemento de la cola
void SacarLaCola(int Cola[], int &iC, int &CyC)
{ 
  int valor, pos;
  gotoxy(1,24);cout<<"Proceso para sacar algo de la cola";
  gotoxy(1,28);cout<<"Proces de sacar a una persona";
  gotoxy(2,34);cout<<"                            ";
  gotoxy(2,37);cout<<"                            ";
  gotoxy(2,31); 
  if(ColaVacia(iC))
  {
    cout<<"Disculpe la cola esta vacía";
    getch();
  }
	else
	{
	  cout<<"Ingrese el numero de personas que desea eleminar";
		cin>>valor;
		if(Buscar(Cola, iC,  valor, pos))
      SacarValoresDeLaCola(Cola, iC, CyC, pos);
    else
		{
		  gotoxy(1,37);cout<<"Disculpe ese numero no existe";
		  getch();
     }
  }
}
//Para saber que valores tiene la cola
void DesplegarLaCola(int Cola[], int iC)
{
  int x=41, y=42, dif, i;
  dif=Tot-iC;
  for(i=0;i<dif;i++)
  {
    gotoxy(x,y);cout<<Cola[iC];    
    gotoxy(x,y);cout<<"  ";
    y-=2;
  }
  gotoxy(x,y);cout<<Cola[iC];
}
//Ingresar Valores a la Cola
void MeterEnLaCola(int Cola[], int &iC, int &CyC)
{ 
  int valor, pos;
  gotoxy(1,24);cout<<"Cola del Banco Quetzal\t";
  gotoxy(1,28);cout<<"Ingresar una persona\t";
  gotoxy(2,34);cout<<"           " ;
  gotoxy(2,37);cout<<"           ";
  gotoxy(1,31);
  if(ColaLlena(iC))
  {
    cout<<"La cola esta llena\n";
    getch();
  }
	else
	{
	  cout<<"Numero de personas \t";
		cin>>Cola[iC];
		DesplegarLaCola(Cola, iC);
		iC++;
		CyC+=2;
  }
}
//Procedimiento que contiene el menu principal
void Menu(int Cola[],int &iC, int &CyC)
{
    int Opcion = 0;
  while (Opcion != 3)
  {
    system("CLS");
    Dibujar();
    Banco();
    cout<<"\n\n\n\n\n\n\n\n";
    cout<<"\t \t \t UNIVERSIDAD MARIANO GALVEZ \n \n"; 
    cout<<"\t \t Proyecto Final Estructura De Datos \n";    
    cout<<"\t \t Carlos Rolando Calan Ajquill    Junio/2006 \n";
    cout<<"\t \t Carne: 0910-04-13429         5to. Semestre \n";
    cout<<"\t \t ----------------------------------------------\n";    
    cout<<"\t \t Proceso de una Cola en un Banco \n ";
    cout<<"\t \t ----------------------------------------------\n\n";    
		cout<<"\t 1.- Ingreso de Personas \n";
		cout<<"\t 2.- Salida de Personas \n";
		cout<<"\t 3.- Salir \n";
    cout<<"\t -------------------------------------------------\n";    
		cout<<"\t \t Seleccione una opcion \t";
		cin>>Opcion;
	  switch (Opcion)
		{
		  case 1:
        cout<<"OPCION 1:";
		    MeterEnLaCola(Cola, iC, CyC);
				break;
		  case 2:
        cout<<"OPCION 2:";
				SacarLaCola(Cola, iC, CyC);
			case 3:
        cout<<"OPCION 3:";
			  system("CLS");
        cout<<"Hecho por Carlos Rolando Calán Ajquill, hasta pronto ......\n\n";			        
			  break;
      default:
        cout;      
        cout<<"Opcion Invalida \n\n";
        break;	    
    } 
 	}  
}