Version:0.9 StartHTML:0000000105 EndHTML:0000028350 StartFragment:0000000152 EndFragment:0000028316
/******************************************************/
/*************** Isidro Pastor Jorda ******************/
/******************************************************/
/****************** Telematica ************************/
/******************************************************/
/************* Practica 6 Ejercicio 1 *****************/
/******************************************************/

/* Definicion de constantes y tipos */

const int MAX = 10;
typedef int Vector[MAX];

/* Prototipos de las funciones */

void InicializaV (Vector v, int reset);
void GrabarVector(Vector v);
int PosMaximoV(Vector v); // Devuelve la posicion donde se encuentra el valor maximo dentro del vector dado
int PosMinimoV(Vector v);
void InvertirV(Vector v);
void MostrarV(Vector v);
// void OrdenaAscendenteV(Vector v);
void GrabarOrdenado(Vector v1);
void CopiaVector (Vector vaux, Vector v);
void Desplaza (Vector v,int i, int fin);


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

int main()
{
    int opcion, reset, opcionv;
    Vector v1, v2;
    bool salir = false;

    do
    {
        /* Menu del programa que se mostrara por pantalla */

        cout << " ***************** M E N U *******************************"<< endl;
        cout << " * 1.- Calculo del max y min de dos vectores             *"<< endl;
        cout << " * 2.- Invertir el orden de los vectores                 *"<< endl;
        cout << " * 3.- Resetear el vector a un valor dado                *"<< endl;
        cout << " * 4.- Leer " << MAX << " numeros e insertarlos en orden ascendente *"<< endl;
        cout << " * 5.- Salir del programa                                *"<< endl;
        cout << " *********************************************************"<< endl;
        cout << endl << " Elige una opcion -> " ;
        cin >> opcion;

        /* Inicializacion de los vectores para evitar problemas al valor 0 */

        InicializaV(v1, 0);
        InicializaV(v2, 0);

        /* Introduccion de los datos de los vectores */

        if (opcion == 1 || opcion == 2)
        {
            cout << endl << " Introduce " << MAX << " valores para el vector 1 -> ";
            GrabarVector (v1);

            cout << endl << " Introduce " << MAX << " valores para el vector 2 -> ";
            GrabarVector (v2);
        }

        /* switch de opcion para ejecutar la parte de codigo segun la opcion del menu elegida */

        switch (opcion)
        {
            case 1:
                cout << " El valor maximo del vector 1 es " << v1[PosMaximoV(v1)] << " y el minimo es "<< v1[PosMinimoV(v1)] << endl << endl;// Salida por pantalla
                cout << " El valor maximo del vector 2 es " << v2[PosMaximoV(v2)] << " y el minimo es "<< v2[PosMinimoV(v2)] << endl << endl;// Salida por pantalla
                break;

            case 2:
                InvertirV(v1); // llamamos a la funcion que nos invertira el vector
                InvertirV(v2);
                cout << endl << " Vector 1 invertido ->  ";
                MostrarV(v1); // mostramos el vector por pantalla
                cout << endl << endl;
                cout << " Vector 2 invertido ->  ";
                MostrarV(v2);
                cout << endl << endl;
                break;

            case 3:

                cout << endl << " Introduce el valor al que quieres resetear el vector -> ";
                cin >> reset ;

                opcionv = 0; // Iniciamos esta variable que se usara para seleccionar uno de los dos vectores

                do   // inicio de bucle do..while para control de errores de entrada de datos
                {
                    cout << endl << " Que vector quieres resetear ? (1/2) -> " ;// Eleccion del vector a resetear
                    cin >> opcionv;
                    if (opcionv != 1 && opcionv != 2) // La opcion solo puede ser 1 o 2, de lo contrario mostramos mensaje de error
                        cout << endl << " Error, la opcion debe ser 1 o 2 y has puesto "<< opcionv << endl;
                }
                while (opcionv !=1 && opcionv != 2 ); // Control de errores, pediremos introducir datos mientras no sea 1 o 2

                if (opcionv == 1)  // Si el vector elegido es el 1 iniciamos el vector al valor de reset
                    InicializaV(v1, reset);
                else
                    InicializaV(v2, reset); // en caso contrario el vector es el 2 y lo iniciamos al valor de reset

                cout << endl<<  " Vector "<< opcionv << " inicializado con el valor " << reset << endl; // Mostramos mensaje de verificacion por pantalla
                cout << endl << " El vector completo reseteado es -> " ;

                if (opcionv == 1)
                    MostrarV(v1); // Mostramos por pantalla v1 para verificar que esta reseteado
                else
                    MostrarV(v2); // Mostramos por pantalla v2 para verificar que esta reseteado

                cout << endl << endl;


                break;

            case 4:

                  cout << " Introduce " << MAX << " valores que se insertaran en orden ascendente (positivos y > 0) -> ";
                  GrabarOrdenado(v1); // Grabamos en vector con los datos de entrada

                  // OrdenaAscendenteV(v1); // Llamamos a la funcion que nos ordena en orden ascendente el vector

                  cout << " El vector ordenado es " ;
                  MostrarV(v1);
                  cout << endl << endl;
                  break;

            case 5:
                salir = true;
                break;

            default:
                cout << "\n Opcion no valida \n";
                break;

        }


        if (opcion !=5)// Usamos esto para pausar la salida y poder verla y borrar despues pantalla y mostrar menu de nuevo
        {
            system("PAUSE");
            system("cls");
        }

    }
    while (!salir);

    cout << endl << " Fin del Programa -> Isidro Pastor Jorda 2002 <- " << endl << endl;
    system("PAUSE");
    return 0;
}

/******************************************************************
* Funcion: GrabarVector
* Descripcion: Funcion que graba los datos introducidos en el vector
*
*
*  Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   v         E/S        Vector de entrada para modificarlo
*
*
* Valor devuelto:
*       La funcion solo devuelve el vector modificado. void
*******************************************************************/

void GrabarVector(Vector v)
{
    for (int i=0; i < MAX; i++)
        cin >> v[i];
return;
}


/******************************************************************
* Funcion: InicializaV
* Descripcion: Funcion que inicializa el vector a un valor dado
*    Introducimos el valor de reset en todas las posiciones del vector
*
*  Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   v         E/S
* reset       E         Valor al que inicializaremos el vector
*
* Valor devuelto:
*     Funcion void, no devuelve ningun valor
*******************************************************************/

void InicializaV (Vector v, int reset)
{
    for (int i=0; i<MAX; i++)
        v[i] = reset;
    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<MAX; i++)
    {
        if (v[pos] < v[i]) // Comparamos el vector numero a numero, si es mas grande que nuestro maximo almacenamos su posicion
            pos = i;
    }
    return pos;

}

/******************************************************************
* Funcion: PosMinimoV
* Descripcion: Funcion que nos devuelve la posicion donde se encuentra
*     el valor minimo almacenado en un vector.
*
*
*  Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*  v         E          Vector a recorrer para encontrar el minimo
*
*
* Valor devuelto:
*    La funcion devuelve un entero que es la posicion donde se encuentra
*    almacenada en el vector el dato de menor valor
*******************************************************************/

int PosMinimoV(Vector v) // Similar a la funcion PosMaximoV
{
    int pos; // variable auxiliar para almacenar la posicion del dato mas pequenyo
    pos = 0;

    for (int i=1; i<MAX; i++)
    {
        if (v[pos] > v[i])
            pos = i;
    }
    return pos;

}

/******************************************************************
* Funcion: InvertirV
* Descripcion: Funcion que invierte el orden de los contenidos almacenados
*              en un vector.
*
*
*  Parametros:

* Nombre      E/S       Descripcion
* ------     -----      -----------
*  v          E/S        Vector que sera modificado para obtener el vector invertido
*
*
* Valor devuelto:
*       La funcion es de tipo void, no devuelve nada pero se modifica
*       el contenido del vector v dentro de la funcion
*
*******************************************************************/


void InvertirV(Vector v)
{
    int i, j, aux; // declaramos dos indices y una variable auxiliar para almacenar datos intermedios

    i = 0; // Contador inferior
    j = MAX - 1; // Contador superior

    while ( i < j ) // repetimos hasta que el indice inferior sea mayor que el indice superior
    {
        aux = v[i]; // guardamos en nuestra variable auxiliar el valor almacenado en v[i]
        v[i] = v[j]; // guardamos en v[i] el valor de v[j] que estara por el final del vector
        v[j] = aux; // guardamos en v[j] el valor que tenia antes v[i] y habremos intercambiado los valores
        i++; // aumentamos el indice inferior
        j--; // decrementamos el indice superor
    }


}

/***********************************************************************************
* Funcion: MostrarV
* Descripcion: Funcion que unicamente muestra por pantalla el contenido
*              de nuestro vector.
*
*
*  Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   v         E          Vector a mostrar por pantalla, no se modifica en la funcion
*
*
* Valor devuelto:
*       La funcion solo muestra por pantalla, es void y no se modifica nada
***********************************************************************************/


void MostrarV(Vector v)
{
    for (int i = 0; i < MAX; i++)
        cout << " " << v[i];
    return;

}

/***********************************************************************************
* Funcion: OrdenaAscendenteV
* Descripcion: Funcion que ordena de manera ascendente 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 OrdenaAscendenteV(Vector v)     eliminamos esta funcion que ordena el vector ya introducido
{
    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 inverso, buscaremos maximos
       dentro de ese vector y los iremos guardando en el vector auxiliar
       empezando desde la posicion mas alta del vector.
       El hecho de hacerlo mientras i > MAX - (MAX + 1) es simplemente
       indicar que el bucle se repite mientras que i sea mayor que -1

    for (int i = MAX -1;i > MAX - (MAX + 1); 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] = 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 < MAX; i++)
        v[i] = vaux[i];
    return;
}


/***********************************************************************************
* Funcion: GrabarOrdenado
* Descripcion: Funcion que graba los valores introducidos de forma ordenada directamente en el vector
*
*
*
*  Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*
*   v         E/S       Vector en el que iremos introduciendo los datos
*
* Valor devuelto:
*       Funcion void que no devuelve nada, va introduciendo valores en el vector y ordenandolos
***********************************************************************************/



void GrabarOrdenado(Vector v)// esta funcion ira grabando ordenadamente el vector conforme se introduzca
{
    int aux, insertar;

    cin >> v[0]; // leemos el primer caracter introducido

    for (int i=1; i < MAX ; i++)
    {
        cin >> aux; // leeremos el siguiente
        insertar = i; // el punto a insertar ahora sera el valor inicial de insercion
        if ( aux < v[insertar-1] ) // Comparamos si el valor anterior es menor al introducido
        {
            while ( aux < v[insertar-1] && insertar >= 0 ) // mientras que el anterior sea menos e insertar mayor que cero
            {
                insertar--; // iremos reduciendo en uno la posicion donde insertaremos nuestro valor
            }
            Desplaza(v, insertar, i ) ; // una vez sepamos donde insertar el valor desplazaremos los valores del vector
            v[insertar] = aux; // y a continuacion insertaremos el valor leido
        }
        else
            v[i] = aux;

     }
return;
}


/***********************************************************************************
* Funcion: Desplaza
* Descripcion: Funcion que graba los valores introducidos de forma ordenada directamente en el vector
*
*
*
*  Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
* insertar     E        Punto de nuestro vector hasta donde tenemos que desplazar
*   v         E/S       Vector donde haremos los desplazamientos
*  fin        E         Posicion que ocupa el ultimo elemento introducido hasta el momento
*
* Valor devuelto:
*       Funcion void que no devuelve nada, desplaza los valores del vector un lugar desde insertar hasta el final
****************************************************************************************************************/



void Desplaza (Vector v,int insertar, int fin)
{
       for (fin; fin > insertar; fin--) // repetiremos el desplazamiento mientras que fin sea mayor que la posicion donde vamos a insertar
           v[fin] = v[fin-1]; // copiamos el valor de la casilla anterior en la casilla actual
}