Version:0.9 StartHTML:0000000105 EndHTML:0000024884 StartFragment:0000000152 EndFragment:0000024850
/******************************************************/
/*************** Isidro Pastor Jorda ******************/
/******************************************************/
/****************** Telematica ************************/
/******************************************************/
/************* Practica 6 Ejercicio 3 *****************/
/******************************************************/


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

const int FILAS = 3;
const int COLUMNAS = 3;
typedef int Matriz[FILAS][COLUMNAS];
typedef int Vector[FILAS*COLUMNAS];

void InicializaMatriz(Matriz M, int reset);
void GrabarMatriz(Matriz M);
void MostrarMatriz(Matriz M);
void CalculaTraspuesta (Matriz A, Matriz T);
int MediaMatriz(Matriz M);
void MaxMinMatriz(Matriz A,int & maximo,int & minimo) ;
void Concatena(Matriz M, Vector v);
void MostrarV(Vector v);
int MatrizToVector (int  i,int j);

int main()
{
    bool salir = false;
    int opcion, maximo, minimo, media, i, j, pos;
    char opcion2;
    Matriz A, traspuesta;
    Vector v;

    InicializaMatriz(A, 0); // Inicializamos la matriz A a ceros
    InicializaMatriz(traspuesta, 0); // Inicializamos la matriz traspuesta a ceros
    Concatena(A, v); // Como A es aqui una matriz de ceros nos sirve para inicializar v
    do
    {
                   /* Menu del programa que se mostrara por pantalla */

        cout << " ******************** M E N U ****************************"<< endl;
        cout << " * 1.- Presentacion en pantalla de la matriz tabulada    *"<< endl;
        cout << " * 2.- Calculo de la traspuesta y presentacion           *"<< endl;
        cout << " * 3.- Media de los elementos, maximo y minimo           *"<< endl;
        cout << " * 4.- Representar en un vector de " << FILAS*COLUMNAS << " elementos           *"<< endl;
        cout << " * 5.- Devolver valor de i,j del vector concatenado      *"<< endl;
        cout << " * 6.- Salir del programa                                *"<< endl;
        cout << " *********************************************************"<< endl;
        cout << endl << " Elige una opcion -> " ;
        cin >> opcion;

        if ( opcion != 6)  // usaremos esto para preguntar por una nueva matriz cada vez que elijamos opcion
        {
            cout << " Quieres introducir una nueva matriz ? ( S/N )-> ";
            cin >> opcion2;
        }
        else
            opcion2 = 'N';

        if ( opcion2 == 's' || opcion2 == 'S' ) // Si queremos introducir una nueva mantriz llamaremos a la funcion correspondiente
        {
               cout << " Introduce los " << FILAS*COLUMNAS << " valores para la matriz todos seguidos: \n";
               GrabarMatriz( A );
        }


         switch (opcion)
         {
             case 1: // Presentacion en pantalla de la matriz tabulada
                 cout << " La matriz tabulada resultante es: \n \n";
                 MostrarMatriz(A);
                 break;

             case 2:  // Calculo de la traspuesta y presentacion
                 CalculaTraspuesta (A, traspuesta); // Calculamos la traspuesta con la funcion
                 cout << " La matriz traspuesta de ";
                 MostrarMatriz(A); // Mostramos la matriz inicial
                 cout << " es la matriz ";
                 MostrarMatriz(traspuesta); // Mostramos la matriz traspuesta
                 break;

             case 3: // Media de los elementos, maximo y minimo
                 media = MediaMatriz(A);
                 MaxMinMatriz(A, maximo, minimo);

                 cout << " La media de los elementos es  -> " << media << endl ;
                 cout << " El maximo de los elementos es -> " << maximo << endl;
                 cout << " El minimo de los elementos es -> " << minimo << endl;
                 break;

             case 4: // Representar en un vector de FILAS*COLUMNAS elementos
                 Concatena(A, v); // Concatenamos la matriz en el vector
                 cout << " El vector concatenado es: ";
                 MostrarV(v);
                 cout << endl << endl;
                 break;


             case 5:
                 Concatena(A, v); // Concatenamos la matriz introducida con el vector v
                 do // Bucle para control de errores y asegurarnos que el numero introducido es correcto
                 {
                     cout << " Dame las coordenadas i y j -> ";
                     cin >> i >> j;
                     cout << endl;

                     if ( i >= FILAS) // Mensajes de error si nos excedemos en el numero de filas o columnas
                        cout << " Error las filas introducidas exceden de la matriz " << endl;
                     if (j >= COLUMNAS)
                        cout << " Error las columnas introducidas exceden de la matriz " << endl;
                 }
                 while ( i >= FILAS || j >= COLUMNAS); // repetimos mientras i y j sean mayores que los valores de la matriz

                 pos = MatrizToVector (i, j);// Llamada a la funcion que devuelve la posicion del vector
                 cout << " El valor buscado se encuentra en la posicion " << pos << " del vector y vale " << v[pos] << endl ;
                 break;

             case 6: // Salir del programa
                 salir = true; // Activamos el "centinela" para salir del programa y termina su ejecucion
                 break;

             default: // En caso que la opcion elegida no sea correcta mostraremos mensaje y repetiremos bucle
                 cout << endl << " Error en la eleccion " << endl;
                 break;
         }

        if (opcion != 6)
        {
            system("PAUSE"); // Pausamos la salida por pantalla hasta pulsar una tecla
            system("cls"); // Limpiamos pantalla para dibujar de nuevo el menu
        }

    }
    while (!salir);

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

/******************************************************************
* Funcion: InicializaMatriz
* Descripcion: Funcion que inicializa una matriz al valor de reset
*
*
* Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   M         E/S        Matriz a inicializar
* reset       E          Valor usado para inicializar la matriz
*
* Valor devuelto:
*       void, la matriz no devuelve nada pero modifica el vector
*******************************************************************/

void InicializaMatriz(Matriz M, int reset)
{

    for (int i = 0; i < FILAS; i++ )
        for (int j = 0; j< COLUMNAS; j++)
            M[i][j] = reset;

    return;
}

/******************************************************************
* Funcion: GrabarMatriz
* Descripcion: Funcion para grabar en la matriz los datos introducidos
*              por teclado.
*
* Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   M         E/S        Matriz que iremos asignando valores leidos por teclado
*
*
* Valor devuelto:
*       void, no devuelve nada la funcion pero modifica la matriz M
*******************************************************************/

void GrabarMatriz(Matriz M)
{
    for (int i = 0; i < FILAS; i++ )
        for (int j = 0; j< COLUMNAS; j++)
            cin >> M[i][j];
}

/******************************************************************
* Funcion: MostrarMatriz
* Descripcion: Funcion para mostrar por pantalla la matriz tabulada
*
*
* Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   M         E          Matriz a mostrar por pantalla
*
*
* Valor devuelto:
*       void, la funcion solo muestra por pantalla la matriz
*******************************************************************/

void MostrarMatriz(Matriz M)
{
    cout << endl << endl;
    for (int i = 0; i < FILAS; i++ )
    {
        for (int j = 0; j< COLUMNAS; j++)
        {
            if (M[i][j] < 10)
                cout << "  " << M[i][j];
            else
                cout << " " << M[i][j];
        }


        cout << endl;
    }
    cout << endl;
}

/******************************************************************
* Funcion: CalculaTraspuesta
* Descripcion: Funcion para intercambiar filas por columnas de una matriz
*
*
* Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   M         E         Matriz original de la que queremos calcular la traspuesta
*   T         E/S       Matriz donde iremos almacenando los valores de la traspuesta
*
* Valor devuelto:
*       void, la funcion no devuelve nada pero se modifica la matriz T
*******************************************************************/

void CalculaTraspuesta (Matriz M, Matriz T)
{
    for (int i = 0; i < FILAS; i++ )
        for (int j = 0; j< COLUMNAS; j++)
            T[j][i] = M[i][j];

    return;
}

/**********************************************************************************
* Funcion: MediaMatriz
* Descripcion: Funcion para calcular la media de los valores de una matriz
*
*
* Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   M         E          Matriz de la que queremos calcular la media de sus valores
*
*
* Valor devuelto:
*       La funcion devuelve un entero que sera la media de los valores de la matriz
***********************************************************************************/

int MediaMatriz(Matriz M)
{
    int aux;
    aux = 0;

    for (int i = 0; i < FILAS; i++ )
        for (int j = 0; j< COLUMNAS; j++)
            aux = aux + M[i][j];

    return (aux / FILAS*COLUMNAS);
}

/******************************************************************
* Funcion: MaxMinMatriz
* Descripcion:Funcion que modifica los valores de max y min, que tomaran
*             los valores maximo y minimo de la matriz
*
* Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   M         E          Matriz de la que queremos obtener los datos
*  max        E/S        variable donde almacenamos el valor maximo
*  min        E/S        variable donde almacenamos el valor minimo
*
* Valor devuelto:
*       void, la funcion no devuelve nada pero modifica max y min
*******************************************************************/

void MaxMinMatriz(Matriz M,int & max,int & min)
{
    min = M[0][0]; // Inicializamos maximo y minimo por si no estuvieran antes
    max = M[0][0];

    for (int i = 1; i < FILAS; i++ )
        for (int j = 0; j< COLUMNAS; j++)
        {
            if (M[i][j] > max)
                max = M[i][j];
            if (M[i][j] < min)
                min = M[i][j];
        }
}

/******************************************************************
* Funcion:Concatena
* Descripcion: Funcion que concatena una matriz en un vector
*
*
* Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   M         E         Matriz origen de los datos
*   v         E/S       Vector destino de la concatenacion
*
* Valor devuelto:
*       void, la funcion no devuelve nada pero modifica el vector v
*******************************************************************/

void Concatena(Matriz M, Vector v)
{
    int k; // Variable indice para el vector v
    k = 0;

    for (int i = 0; i < FILAS; i++ )
        for (int j = 0; j < COLUMNAS; j++)
        {
            v[k] = M[i][j];
            k++;
        }
}

/*******************************************************************************
* Funcion: MatrizToVector
* Descripcion: Funcion que nos devuelve dada la posicion de la matriz
*              indicando Filas y columnas a su correspondiente en un
*              vector concatenado con los valores de la matriz
*
* Parametros:
*
* Nombre      E/S       Descripcion
* ------     -----      -----------
*   i         E          Valor de la fila de la matriz
*   j         E          Valor de la columna de la matriz
*
* Valor devuelto:
*       Devuelve un entero correspondiente al indice donde se encuentra
*       el valor de i,j de la matriz en un vector v concatenado con la matriz
*******************************************************************************/

int MatrizToVector (int  i,int j)
{
    int aux;

    aux = ((i * COLUMNAS)+ j );
    return(aux);
}


/***********************************************************************************
* 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 < FILAS*COLUMNAS; i++)
        cout << " " << v[i];
    return;

}