Version:0.9 StartHTML:0000000105 EndHTML:0000017219 StartFragment:0000000152 EndFragment:0000017185
/******************************************************/
/*************** Isidro Pastor Jorda ******************/
/******************************************************/
/****************** Telematica ************************/
/******************************************************/
/************* Practica 7 Ejercicio 7 *****************/
/******************************************************/


#include <iostream.h>
#include <stdlib.h>
#include <string>
#include <time.h>

const int EQUIPOS = 10;
const int PARTIDOS = (EQUIPOS - 1) * 2 ;
struct dato
{
    string nombre;
    int puntos;
    int ganados;
    int empatados;
    int perdidos;
    int favor;
    int contra;
};


typedef dato Vector[EQUIPOS];

/* Prototipos de funciones */

void GeneraAleatorios(Vector tabla);
void VerResultado(Vector tabla);
int Aleatorio( int downlim, int uplim );
void OrdenaDescendenteV(Vector v);
int PosMaximoV(Vector v);
void CopiaVector (Vector vaux, Vector v);



int main()
{
    srand(time(NULL)); // inicializamos la funcion de aleatorios con semilla time(NULL)

    Vector tabla,aux;
    char opcion;


    cout << " Generador de listas de clasificacion para una liga de futbol de " << EQUIPOS << " equipos \n" ;

    /* Inicializacion del nombre de los equipos */

    tabla[0].nombre = " Valencia CF   ";
    tabla[1].nombre = " Real Madrid   ";
    tabla[2].nombre = " Barcelona     ";
    tabla[3].nombre = " Zaragoza      ";
    tabla[4].nombre = " Ath. Bilbao   ";
    tabla[5].nombre = " Villareal     ";
    tabla[6].nombre = " Espanyol      ";
    tabla[7].nombre = " Sevilla       ";
    tabla[8].nombre = " Real Sociedad ";
    tabla[9].nombre = " Deportivo     ";

    GeneraAleatorios(tabla);
    OrdenaDescendenteV(tabla);

    cout << endl;
    cout << "\n Primer clasificado " << tabla[0].nombre << " con " << tabla[0].puntos << " puntos. \n";
    cout << "\n Ultimo clasificado " << tabla[EQUIPOS - 1].nombre << " con " << tabla[EQUIPOS - 1].puntos << " puntos. \n";

    cout << "\n Quieres ver la clasificacion completa? (S/N)-> ";
    cin >> opcion;
    if ( opcion == 'S' || opcion == 's')
    {
        VerResultado(tabla);
    }

    cout << endl << endl;
    system("PAUSE");
    return 0;
}



void GeneraAleatorios(Vector tabla)
{
    int i;

    for (i = 0; i < EQUIPOS; i++)
    {

        cout << "\n Generando datos para el equipo " << tabla[i].nombre ;

        tabla[i].ganados = Aleatorio( 0, PARTIDOS + 1);

        tabla[i].perdidos = Aleatorio( 0, PARTIDOS - tabla[i].ganados + 1);

        tabla[i].empatados = PARTIDOS - (tabla[i].ganados + tabla[i].perdidos);

        tabla[i].puntos = ( tabla[i].ganados * 3 )+ tabla[i].empatados; // los ganados valen 3 puntos empatados 1

        tabla[i].favor = Aleatorio( 0, PARTIDOS * 5);
        tabla[i].contra = Aleatorio( 0, PARTIDOS * 5 );
    }

}

void VerResultado(Vector tabla)
{
    int i;

    cout << endl << "    " << "  Equipo " << "\t \t" << "PG " << "\t" << "PE " << "\t"<< "PP " << "\t" << "GF" << "\t" << "GC " << "\t" << "Ptos " ;
    cout << endl << "     ------------------------------------------------------------------------" ;

    for (i=0; i< EQUIPOS ; i++)
    {
        cout << endl;
        if (i < 10 )
           cout << ' ' ;
        cout << i+1  << ".- " << tabla[i].nombre << "\t" << tabla[i].ganados << "\t" << tabla[i].empatados << "\t"<< tabla[i].perdidos << "\t" << tabla[i].favor << "\t" << tabla[i].contra << "\t" << tabla[i].puntos ;

    }
}

/************************************************************************************
* Funcion: Aleatorio
* Descripcion: Funcion que nos da un numero aleatorio comprendido
*              entre un limite inferior, downlim (incluido) y un limite
*              superior (excluido) uplim
*
* Parametros
* Nombre       E/S       Descripcion
* -------     -----      -----------
* dowlim      float      Limite Inferior (Incluido)
* uplim       float      Limite Superior (Excluido)
*
* Valor Devuelto:
*      La funcion devuelve un valor float correspondiente al numero aleatorio
*      que ha generado la funcion entre un limite inferior (incluido) y uno superior
*
************************************************************************************/

int Aleatorio( int downlim, int uplim )  // Función que genera numeros aleatorios
{
    int aleat;

    if ( downlim < uplim)
    {
        do
        {
            aleat = rand();

        }
        while ( aleat < downlim || aleat >= uplim );
    }
    else
        aleat = 0;

    return aleat;
}


/***********************************************************************************
* Funcion: OrdenaDescendenteV
* Descripcion: Funcion que ordena de manera descendente los datos almacenados
*              en el vector de entrada
*
*
*
*  Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   v         E          vector que se piensa ordenar
*
*
* Valor devuelto:
*       void, la funcion no devuelve el valor pero modifica el vector.
***********************************************************************************/

void OrdenaDescendenteV(Vector v)
{
    Vector vaux; // Vector auxiliar para ir ordenandolo ahi
    int pmax; // variable para ir almacenando la posicion donse se encuentra el maximo del vector

    /* Vamos a recorrer el vector en orden normal, buscaremos maximos
       dentro de ese vector y los iremos guardando en el vector auxiliar
       empezando desde la posicion mas baja del vector. */

    for (int i = 0;i < EQUIPOS ; i++ )
    {
        pmax = PosMaximoV(v);// llamamos a PosMaximoV y nos dara la posicion donde esta el maximo del vector
        vaux[i] = v[pmax] ; // Copiamos en vaux el valor del maximo numero del vector dado
        v[pmax].puntos = 0;  // Sobreescribimos este valor para eliminarlo del vector y volver a llamar a la funcion
    }

    /* Llamamos a una funcion que nos copia el contenido de un vector en otro
       en nuestro caso queremo copiar el contenido de vaux en v */

    CopiaVector(vaux, v);
    return;
}


/***********************************************************************************
* Funcion: CopiaVector
* Descripcion: Funcion que copia el contenido del vector vaux en el vector v
*
*
*
*  Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
* vaux         E        Vector del que queremos hacer una copia
*   v         E/S       Vector al cual copiaremos el contenido de vaux
*
* Valor devuelto:
*       Funcion void que no devuelve nada, copia el contenido de vaux en v
***********************************************************************************/

void CopiaVector (Vector vaux, Vector v)
{
    for (int i = 0; i < EQUIPOS; i++)
        v[i] = vaux[i];
    return;
}

/******************************************************************
* Funcion: PosMaximoV
* Descripcion: Funcion que nos devuelve la posicion donde se encuentra
*     el valor maximo almacenado en un vector.
*
*  Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   v         E          Vector a recorrer para encontrar el maximo
*
*
* Valor devuelto:
*    La funcion devuelve un entero que es la posicion donde se encuentra
*    almacenada en el vector el dato de mayor valor
*******************************************************************/
int PosMaximoV(Vector v)
{
    int pos; // variable auxiliar para almacenar la posicion del dato mas alto
    pos = 0;

    for (int i=1; i<EQUIPOS; i++)
    {
        if (v[pos].puntos < v[i].puntos ) // Comparamos el vector numero a numero, si es mas grande que nuestro maximo almacenamos su posicion
            pos = i;

        /*if ( v[i-1].puntos = v[i].puntos )
        {
                if (v[pos].favor < v[i].favor)
                    pos = i;
        }    */

    }
    return pos;

}