Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Matrices con apuntadores y funciones

Estas en el tema de Matrices con apuntadores y funciones en el foro de C/C++ en Foros del Web. hola gente de forosdelweb espero su consejo he aqui el programa: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #include<stdio.h> #include<stdlib.h> int menu ( ) ; void ...
  #1 (permalink)  
Antiguo 22/04/2013, 14:46
 
Fecha de Ingreso: marzo-2013
Mensajes: 11
Antigüedad: 11 años, 7 meses
Puntos: 0
Pregunta Matrices con apuntadores y funciones

hola gente de forosdelweb espero su consejo he aqui el programa:
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);
  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 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.                 e[i][j]=e[i][j]+b[i][k]*d[k][j];
  69.                }
  70.             }
  71.         }
  72.  }
  73. main(){
  74.    int c,f,i,j,x,t,m,n,q,s;
  75.    int *a,**b,**e,*d,**g;
  76.    x=menu();
  77.    switch(x){
  78.      case 1: printf("\nDame el tamaño del Vector = ");
  79.              scanf("%d",&t);
  80.              a=(int *)malloc(sizeof(int)*t);
  81.              d=(int *)malloc(sizeof(int)*t);
  82.              printf("\nElementos del Vector A\n");
  83.              leerv(t,a);
  84.              printf("\nElementos del Vector B\n");
  85.              leerv(t,d);
  86.              printf("\nVector A\t");
  87.              imprv(t,a);
  88.              printf("Vector B\t");
  89.              imprv(t,d);
  90.              sumarv(t,a,d);
  91.              printf("\n\tSuma=\t");
  92.              imprv(t,a);
  93.              break;
  94.      case 2: printf("\nDame el Numero de Filas de la Matriz = ");
  95.              scanf("%d",&f);
  96.              printf("\nDame  el Numero de Columnas de la Matriz = ");
  97.              scanf("%d",&c);
  98.              b=(int **)malloc(sizeof(int *)*f);
  99.              e=(int **)malloc(sizeof(int *)*f);
  100.              for(j=0;j<c;j++){
  101.                 b[j]=(int *)malloc(sizeof(int)*c);
  102.                 e[j]=(int *)malloc(sizeof(int)*c);
  103.              }
  104.              printf("\nElementos de la Matriz A\n");
  105.              leerm(f,c,b);
  106.              printf("\nElementos de la Matriz B\n");
  107.              leerm(f,c,e);
  108.              printf("\n Matriz A\n");
  109.              imprm(f,c,b);
  110.              printf("\n Matriz B\n");
  111.              imprm(f,c,e);
  112.              sumam(f,c,b,e);
  113.              printf("\nSuma es\n");
  114.              imprm(f,c,b);
  115.              break;
  116.      case 3: do{
  117.               printf("Numero de Filas de la Matriz A = ");
  118.               scanf("%d",&m);
  119.               printf("Numero de Columnas de la Matriz A = ");
  120.               scanf("%d",&n);
  121.               printf("Numero de Filas de la Matriz B = ");
  122.               scanf("%d",&q);
  123.               printf("Numero de Columnas de la Matriz B = ");
  124.               scanf("%d",&s);
  125.              }while(n!=q);
  126.              b=(int **)malloc(sizeof(int *)*m);
  127.              e=(int **)malloc(sizeof(int *)*q);
  128.              g=(int **)malloc(sizeof(int *)*m);
  129.              for(j=0;j<n;j++){
  130.                 b[j]=(int *)malloc(sizeof(int)*n);
  131.                 }
  132.             for(j=0;j<s;j++){
  133.                 e[j]=(int *)malloc(sizeof(int)*s);
  134.                 g[j]=(int *)malloc(sizeof(int)*s);
  135.                 }
  136.             for(i=0;i<m;i++){
  137.                 for(j=0;j<s;j++){
  138.                     g[i][j]=0;
  139.                    }
  140.                 }
  141.             printf("\nElemetos de la Matriz A\n");
  142.             leerm(m,n,b);
  143.             printf("\nElementos de la Matriz B\n");
  144.             leerm(q,s,e);
  145.             multim(m,n,s,b,e,g);
  146.             printf("\n");
  147.             imprm(m,s,g);
  148.             break;
  149.         }  
  150.   getchar();
  151. }

La duda que tengo es cuando pongo los siguientes datos:
1.- elijo la opcion 3
2.- en numero de filas de la matriz A pongo 2
3.- en numero de columnas de la matriz A pongo 3
4.- en numero de filas de la matriz B pongo 3
5.- en numero de columnas de la matriz B pongo 2
y luego me pide los datos
Elementos de la matriz A
[0][0] = 1
[0][1] = 1
[0][2] = 1
[1][0] = 1
[1][1] = 1
[1][2] = 1
Elementos de la matriz B
[0][0] = 2
[0][1] = 2
[1][0] = 2
[1][0] = 2
[1][1] = 2
[2][0] = 2
luego de dar intro el programa pone una pantalla de "El programa dejo de funcionar". No entiendo porque deja de funcionar. Le pregunte a mi profe y dice que no debe de hacer eso el llama a eso "romperse" pero no me dice en donde esta mal y lo revise pero no veo un error espero poder contar con su ayuda
  #2 (permalink)  
Antiguo 22/04/2013, 15:31
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Matrices con apuntadores y funciones

Lo acabo de compilar y probar. Funciona excelente!

Código otros:
Ver original
  1. MENU
  2.  1.- Suma de Vectores
  3.  2.- Suma de Matrices
  4.  3.- Multiplicacion de Matrices
  5.  4.- Salir
  6.  Elige una opcion => 2
  7.  
  8. Dame el Numero de Filas de la Matriz = 2
  9.  
  10. Dame  el Numero de Columnas de la Matriz = 2
  11.  
  12. Elementos de la Matriz A
  13. [0][0] = 1
  14. [0][1] = 1
  15. [1][0] = 1
  16. [1][1] = 1
  17.  
  18. Elementos de la Matriz B
  19. [0][0] = 2
  20. [0][1] = 2
  21. [1][0] = 2
  22. [1][1] = 2
  23.  
  24.  Matriz A
  25. 1   1  
  26. 1   1  
  27.  
  28.  Matriz B
  29. 2   2  
  30. 2   2  
  31.  
  32. Suma es
  33. 3   3  
  34. 3   3

Perdon, pense que era la suma el problema. Ahi vi el error en la multiplicacion. Ahora lo reviso
  #3 (permalink)  
Antiguo 22/04/2013, 15:48
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 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
  #4 (permalink)  
Antiguo 22/04/2013, 16:24
 
Fecha de Ingreso: marzo-2013
Mensajes: 11
Antigüedad: 11 años, 7 meses
Puntos: 0
Pregunta Respuesta: Matrices con apuntadores y funciones

Cita:
Iniciado por sam90 Ver Mensaje
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
¡EH! era ese el error
ahora pondre mas atencion al reservar la memoria.
Muchas gracias sam90
  #5 (permalink)  
Antiguo 22/04/2013, 18:18
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Matrices con apuntadores y funciones

Te tiro un consejo, para descubrir errores en estos casos. (descubrir errores es parte del aprendizaje).
Primero de todo proba con muchos casos. Yo probe con matrices cuadradas y funcionaba perfector. Despues pase a otros tipos de matrices tipo 2x3 y 3x2 y ahi vi que fallaba. Asi que eso te daba un indicio de donde podria ser el error.

Otra forma es poner varios printf para debuguear. La idea es ver que printf se llega a imprimir y cual no. Asi sabes en que linea mas o menos se pincha el programa.

Saludos

Etiquetas: apuntadores, funcion, funciones, int, matrices, programa, salir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:35.