Ver Mensaje Individual
  #3 (permalink)  
Antiguo 22/04/2013, 15:48
sam90
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: Matrices con apuntadores y funciones

Ahora si!!

Código C:
Ver original
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int menu();
  4. void leerv(int t,int *a);
  5. void sumarv(int t,int *a,int *b);
  6. void imprv(int t,int *a);
  7. void leerm(int f,int c,int **a);
  8. void imprm(int f,int c,int **a);
  9. void sumam(int f,int c,int **a,int **b);
  10. void multim(int m,int n, int s,int **b,int **d,int **e);
  11. int menu(){
  12.     int x;
  13.     do{
  14.      printf("\tMENU\n");
  15.      printf(" 1.- Suma de Vectores\n");
  16.      printf(" 2.- Suma de Matrices\n");
  17.      printf(" 3.- Multiplicacion de Matrices\n");
  18.      printf(" 4.- Salir\n");
  19.      printf(" Elige una opcion => ");
  20.      scanf("%d",&x);
  21.     }while(x<1&&x>4);
  22.   return x;
  23.  }
  24. void leerv(int t,int *a){
  25.       for(int i=0;i<t;i++){
  26.           printf("[%d]= ",i);
  27.           scanf("%d",&a[i]);    
  28.          }
  29.  }
  30. void sumarv(int t,int *a,int *b){
  31.     for(int i=0;i<t;i++){
  32.       a[i]=a[i]+b[i];
  33.      }
  34.  }
  35. void imprv(int t,int *a){
  36.     for(int i=0;i<t;i++){
  37.         printf("%d\t",a[i]);
  38.        }
  39.     printf("\n");
  40.  }
  41. void leerm(int f,int c,int **a){
  42.     for(int i=0;i<f;i++){
  43.         for(int j=0;j<c;j++){
  44.             printf("[%d][%d] = ",i,j);
  45.             scanf("%d",&a[i][j]);
  46.            }
  47.         }
  48.  }
  49. void imprm(int f,int c,int **a){
  50.     for(int i=0;i<f;i++){
  51.         for(int j=0;j<c;j++){
  52.             printf("%d\t",*(*(a+i)+j));
  53.            }
  54.         printf("\n");
  55.         }
  56.  }
  57. void sumam(int f,int c,int **a,int **b){
  58.     for(int i=0;i<f;i++){
  59.         for(int j=0;j<c;j++){
  60.             a[i][j]=a[i][j]+b[i][j];
  61.            }
  62.         }
  63.   }
  64. void multim(int m,int n,int s,int **b,int **d,int **e){
  65.     for(int i=0;i<m;i++){
  66.         for(int j=0;j<s;j++){
  67.             for(int k=0;k<n;k++){
  68.         printf("i=%d  k=%d  j=%d \n", i , k , j);
  69.                 e[i][j]=e[i][j]+b[i][k]*d[k][j];
  70.                }
  71.             }
  72.         }
  73.  }
  74.  
  75. int ** New_Matriz(int p,int q)
  76. {
  77.     int ** m , j;
  78.     m =(int **)malloc(sizeof(int *)*p);
  79.     for(j=0;j<p;j++)
  80.         m[j]=(int *)malloc(sizeof(int)*q);
  81.     return m;          
  82. }
  83.  
  84. void To_Cero(int ** m,int p,int q)
  85. {
  86.     int i, j;
  87.     for(i=0;i<p;i++)
  88.         for(j=0;j<q;j++)
  89.             m[i][j]=0;
  90.     return;        
  91. }
  92.  
  93. main(){
  94.    int c,f,i,j,x,t,m,n,q,s;
  95.    int *a,**b,**e,*d,**g;
  96.    x=menu();
  97.    switch(x){
  98.      case 1: printf("\nDame el tamaño del Vector = ");
  99.              scanf("%d",&t);
  100.              a=(int *)malloc(sizeof(int)*t);
  101.              d=(int *)malloc(sizeof(int)*t);
  102.              printf("\nElementos del Vector A\n");
  103.              leerv(t,a);
  104.              printf("\nElementos del Vector B\n");
  105.              leerv(t,d);
  106.              printf("\nVector A\t");
  107.              imprv(t,a);
  108.              printf("Vector B\t");
  109.              imprv(t,d);
  110.              sumarv(t,a,d);
  111.              printf("\n\tSuma=\t");
  112.              imprv(t,a);
  113.              break;
  114.      case 2: printf("\nDame el Numero de Filas de la Matriz = ");
  115.              scanf("%d",&f);
  116.              printf("\nDame  el Numero de Columnas de la Matriz = ");
  117.              scanf("%d",&c);
  118.              b=(int **)malloc(sizeof(int *)*f);
  119.              e=(int **)malloc(sizeof(int *)*f);
  120.              for(j=0;j<c;j++){
  121.                 b[j]=(int *)malloc(sizeof(int)*c);
  122.                 e[j]=(int *)malloc(sizeof(int)*c);
  123.              }
  124.              printf("\nElementos de la Matriz A\n");
  125.              leerm(f,c,b);
  126.              printf("\nElementos de la Matriz B\n");
  127.              leerm(f,c,e);
  128.              printf("\n Matriz A\n");
  129.              imprm(f,c,b);
  130.              printf("\n Matriz B\n");
  131.              imprm(f,c,e);
  132.              sumam(f,c,b,e);
  133.              printf("\nSuma es\n");
  134.              imprm(f,c,b);
  135.              break;
  136.      case 3: do{
  137.               printf("Numero de Filas de la Matriz A = ");
  138.               scanf("%d",&m);
  139.               printf("Numero de Columnas de la Matriz A = ");
  140.               scanf("%d",&n);
  141.               printf("Numero de Filas de la Matriz B = ");
  142.               scanf("%d",&q);
  143.               printf("Numero de Columnas de la Matriz B = ");
  144.               scanf("%d",&s);
  145.              }while(n!=q);
  146.              
  147.              b = New_Matriz(m,n);
  148.              e = New_Matriz(q,s);
  149.              g = New_Matriz(m,s);
  150.              To_Cero(g,m,s);
  151.  
  152.             printf("\nElemetos de la Matriz A\n");
  153.             leerm(m,n,b);
  154.             printf("\nElementos de la Matriz B\n");
  155.             leerm(q,s,e);
  156.  
  157.  
  158.             multim(m,n,s,b,e,g);
  159.             printf("\n");
  160.             imprm(m,s,g);
  161.             break;
  162.         }  
  163.   getchar();
  164. }

Tenes un problema al reservar memoria. Al querer ahorrar tiempo reservando memoria estabas metiendo la pata. Fíjate que ahí cree un función que según dos entero reserva memoria para una matriz. Eso aclarece las cosas un poco.

Saludos