Ver Mensaje Individual
  #2 (permalink)  
Antiguo 22/04/2014, 03:20
Avatar de leosansan
leosansan
 
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 11 meses
Puntos: 49
Respuesta: Matriz con punteros

Es más fácil que lo veas a explicarlo.

El código es totalmente modular: se introducen las dimensiones, se asigna memoria dinámicamente , se rellenan, se multiplican y por último se libera la memoria:

Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. void leer_dimen_coeficientes( const char* msg, int* pnum );
  4. int** asig_memoria( int fil, int col );
  5. void ver_matriz( int **mat, int fil, int col );
  6. void introducir_matriz( const char* msg, const char* nombre, int** mat, int fil, int col );
  7. void crear_matriz_producto( int **c,int **a,int **b,int fil, int col,int co1);
  8. void liberar_mem_vector( int** mat, int fil );
  9.  
  10. int main( void )
  11. {
  12.     int **A;
  13.     int fil_1, col_1;
  14.     int **B;
  15.     int fil_2, col_2;
  16.     int **C;
  17.     leer_dimen_coeficientes( "Introduce el numero de filas de A: ", &fil_1 );
  18.     leer_dimen_coeficientes( "Introduce el numero de columnas de A: ", &col_1 );
  19.     A = asig_memoria( fil_1, col_1 );
  20.     introducir_matriz( "Introduce los valores de los elementos de A:\n","A", A, fil_1, col_1 );
  21.     puts("A:");
  22.     ver_matriz( A, fil_1, col_1 );
  23.  
  24.     /*leer_dimen_coeficientes( "Introduce el numero de filas de B = columnas de A: ", &fil_2 );*/
  25.     fil_2 = col_1; /** <== condicion para que se puedan multiplicar **/
  26.     leer_dimen_coeficientes( "Introduce el numero de columnas de B : ", &col_2 );
  27.     B = asig_memoria( fil_2, col_2 );
  28.     introducir_matriz( "Introduce los valores de los elementos de B:\n","B", B, fil_2, col_2 );
  29.     puts("B:");
  30.     ver_matriz( B, fil_2, col_2 );
  31.  
  32.     C= asig_memoria( fil_1, col_2 );
  33.     crear_matriz_producto(  C,A,B, fil_1,col_2, col_1 );
  34.     puts("AxB:");
  35.     ver_matriz( C, fil_1, col_2 );
  36.  
  37.     liberar_mem_vector( A, fil_1 );
  38.     liberar_mem_vector( B, fil_2 );
  39.     liberar_mem_vector( C, fil_1 );
  40.  
  41.     return 0;
  42. }
  43. void leer_dimen_coeficientes( const char* msg, int* pnum )
  44. {
  45.    int c;
  46.    printf( "%s", msg );
  47.    fflush( stdout );
  48.    scanf( "%d", pnum );
  49.    while( (c = getchar()) != '\n' && c != EOF );
  50. }
  51. int** asig_memoria( int fil, int col )
  52. {
  53.     int i;
  54.     int** mat;
  55.     mat = malloc( fil * sizeof *mat );
  56.       for( i = 0; i < fil; ++i )
  57.          mat[i] = malloc( col * sizeof **mat );
  58.     return mat;
  59. }
  60. void introducir_matriz( const char* msg, const char* nombre, int** mat, int fil, int col )
  61. {
  62.    int c, i, j;
  63.    printf( "%s", msg );
  64.    fflush( stdout );
  65.    for( i = 0; i < fil; ++i )
  66.       for( j = 0; j < col; ++j )
  67.       {
  68.          printf( "%s[%d][%d] = ", nombre, i, j );
  69.          fflush( stdout );
  70.          scanf( "%d", &mat[i][j] );
  71.       }
  72.    while( (c = getchar()) != '\n' && c != EOF );
  73. }
  74. void ver_matriz( int **mat, int fil, int col )
  75. {
  76.    int i,j;
  77.    for( i = 0; i < fil; ++i )
  78.    {
  79.       for( j = 0; j < col; ++j )
  80.          printf( "%4d ",  mat[i][j]);
  81.       putchar('\n');
  82.    }
  83. }
  84. void crear_matriz_producto( int **c,int **a,int **b,int fil1, int col2 ,int co1)
  85. {
  86.     int i,j,k;
  87.     for( i = 0; i < fil1; ++i )
  88.         for( j = 0; j < col2; ++j )
  89.             {
  90.                 c[i][j] = 0;
  91.                     for ( k = 0; k <co1; k++)
  92.                         c[i][j] += a[i][k]*b[k][j];
  93.             }
  94.  
  95. }
  96. void liberar_mem_vector( int** mat, int fil )
  97. {
  98.    int i;
  99.    for( i = 0; i < fil; ++i )
  100.       free( mat[i] );
  101.    free( mat );
  102. }

¡¡¡Saluditos!!!