Amigos como podría pasar el siguiente código a funciones? ya me confundí un poco

Iniciado por Boris Morales, 21 Octubre 2020, 17:59 PM

0 Miembros y 1 Visitante están viendo este tema.

Boris Morales


#include <stdio.h>

#include <stdlib.h>

int main()

{

     int mat[50][50];

     int n, i, j, esIdentidad = 1;

     printf("Tamanio: ");

     scanf("%d", &n);

     for(i = 0; i < n; i++)

          for(j = 0; j < n; j++)

          {

               printf( "Matriz[%d][%d]: ", i, j );

               scanf( "%d", &mat[i][j] );

               if( (mat[i][j] != 0 && i != j) ||

               (mat[i][j] != 1 && i == j))

                    esIdentidad = 0;

          }

     for(i = 0; i < n; i++)

     {

          for(j = 0; j < n; j++)

               printf("%d ", mat[i][j]);

          printf("\n");

     }

     if(esIdentidad)

          printf( "Es matriz identidad.\n");

     else

          printf( "No es matriz identidad.\n");



     system("pause");

     return 0;

}

K-YreX

Al final las funciones las puedes hacer como tú quieras pero siempre hay mejores y peores diseños.
La gracia de una función es encapsular un fragmento de código autónomo que puede ser reutilizado.

Una forma de hacerlo es crear un main() que sea fácil de leer. Que con un simple vistazo sepas lo que hace pero sin entrar en detalles. En tu caso podría ser algo como lo siguiente (de forma esquemática):

declarar matriz
pedir tamaño
inicializar matriz
mostrar matriz
comprobar si es matriz identidad


Ahora hay que analizar cada paso:
  • declarar matriz -> Es una instrucción atómica (muy sencilla). No ganas nada metiendo la declaración de la matriz en una función. En cambio, si usases memoria dinámica igual sí te conviene hacerlo pues es más complejo.

  • pedir tamaño -> En tu caso también lo haces de una forma muy sencilla pero y si compruebas que el valor que te introducen está entre 1 y el límite máximo? En ese caso ya podrías encapsular ese fragmento en una función. Para que sea lo más reutilizable posible podrías pasar como parámetros los límites y que te devuelva el valor cuando sea correcto:

    int solicitarNumero(int minimo, int maximo){
      int numero;
      do {
        printf("Introduce un numero en el rango [%d, %d]: ", minimo, maximo);
        scanf("%d", &numero);
      } while(numero < minimo || numero > maximo);
      return numero;
    }

    Ahí lo tienes una función que vas a poder reutilizar en infinidad de programas. Claro está que luego podrás añadirle más cosas como que no falle si meten caracteres que no sean numéricos, etc.

  • inicializar matriz -> Esta tarea requiere de varias líneas y es posible que en un mismo programa necesites inicializar una matriz en más de una ocasión por lo que podrías encapsularlo en una función para llamarla varias veces:
    void inicializarMatriz(int matriz[][SIZE], int filas, int columnas);
    PD: Cuando se pasan arrays como argumentos, es obligatorio especificar todas sus dimensiones menos la primera. <filas> y <columnas> representan el tamaño útil real que será el introducido por el usuario. En tu caso se puede usar un único parámetro <orden> ya que son matrices cuadradas pero haciéndolo así harás una función que te servirá para cualquier tipo de matriz.

  • mostrar matriz -> Esta es otra tarea que además de emplear varias líneas puede ser utilizada muchas veces en un mismo programa. Por lo tanto ya sabes, otra función:
    void mostrarMatriz(int matriz[][SIZE], int filas, int columnas);

  • comprobar si es matriz identidad -> Esto es otra tarea independiente por lo que puedes hacer otra función. Hay personas que prefieren comprobar y mostrar el resultado en la misma función aunque esto no es aconsejable.
    Podríamos decir que hay dos tipos de funciones: las que interactúan con el usuario y las que hacen cálculos internos sin necesidad de interactúar con el usuario. En las primeras es lógico que tendremos que mostrar mensajes pero en las segundas es mejor no hacerlo.
    Aquí lo mejor es un valor de retorno <bool> o <int> que sea 1/true si es identidad y 0/false si no lo es. En los parámetros hay más posibilidades.
    1. int esMatrizIdentidad(int matriz[][SIZE], int filas, int columnas); // vale para todas las matrices y lo primero sera comprobar que filas == columnas
    2. int esMatrizIdentidad(int matriz[][SIZE], int orden); // solo valdra para matrices cuadradas



    Con todos estos cambios y 2 cambios más:
  • Utilizar constantes para almacenar los números que haya perdidos por el código. Hacen el código más fácil de modificar.
  • Sustituir system("pause"); por getchar();. Hará la misma función con un menor gasto de recursos.
    te quedaría un código tal que:

    #include <stdio.h>

    // 2 alternativas para crear constantes
    #define SIZE 50
    const int SIZE = 50;

    int main(){
      int matriz[SIZE][SIZE];
      int orden = solicitarNumero(1, SIZE);
     
      inicializarMatriz(matriz, orden, orden);
     
      printf("La matriz resultante es:\n");
      mostrarMatriz(matriz, orden, orden);
     
      if(esMatrizIdentidad(matriz, orden, orden))
        printf("La matriz es Identidad\n");
      else
        printf("La matriz no es Identidad\n");

      getchar();
      return 0;
    }


    PD2: Te queda como trabajo a ti implementar el cuerpo de cada una de las funciones para que ese código funcione.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Boris Morales

Ohhhhh  :o

creo que ya vi por donde entonces establecer esos parámetros  ;D

Muchas gracias por la explicación, y si o voy a trabajar así  ::)