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

Programa matriz transversa c++

Estas en el tema de Programa matriz transversa c++ en el foro de C/C++ en Foros del Web. Tengo este codigo para sacar la matriz transversa de una matriz @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #include <iostream>     #include <iomanip>     ...
  #1 (permalink)  
Antiguo 19/06/2012, 20:15
 
Fecha de Ingreso: marzo-2012
Mensajes: 30
Antigüedad: 12 años
Puntos: 0
Programa matriz transversa c++

Tengo este codigo para sacar la matriz transversa de una matriz
Código C++:
Ver original
  1. #include <iostream>
  2.     #include <iomanip>
  3.     #include <vector>
  4.     #include <cmath>
  5.     #include <cstdlib>
  6.     using namespace std;
  7.      
  8.     void leerDimensiones(unsigned &n, unsigned &m){
  9.         try{
  10.             cout<<"Numero de filas y columnas (0 y 0) para salir: "<<endl;
  11.             cin>>n>>m;
  12.             if(n==0 && m==0) throw string("¡Error! Matriz vacía.");
  13.             if(n<=0) throw 1;
  14.             if(m<=0) throw 2;
  15.         }catch(int e){
  16.             switch(e){
  17.             case 1:
  18.                 cout<<"El numero de filas debe ser mayor a 0!"<<endl;break;
  19.             case 2:
  20.                 cout<<"El numero de columnas debe ser mayor a 0!"<<endl; break;
  21.             }
  22.             leerDimensiones(n,m);
  23.         }
  24.     }
  25.      
  26.     void leerlim(double &li, double &ls){
  27.         try{
  28.             cout<<"Limites inferior y superior: "<<endl;
  29.             cin>>li>>ls;
  30.             if(li>=ls) throw 1;
  31.         }catch (int e){
  32.             cout<<"El limite inferior debe ser menor al superior !"<<endl;
  33.             leerlim(li,ls);
  34.         }
  35.     }
  36.      
  37.     int **randMatE(unsigned n, unsigned m, int li, int ls) {
  38.         unsigned i,j,d=ls-li; int **a;
  39.         a=new int*[n];
  40.         for (i=0;i<n;i++){
  41.             a[i]=new int[m];
  42.             for (j=0;j<m;j++)
  43.                 a[i][j]= (int)((double)rand()/RAND_MAX*d+li);}
  44.         return a;
  45.     }
  46.      
  47.     void showMat(int **a, unsigned n, unsigned m){
  48.         unsigned i,j;
  49.         for (i=0;i<n;i++){
  50.             for (j=0;j<m;j++){
  51.                 cout<<" "<<setw(8)<<setprecision(5)<<a[i][j];
  52.                 if ((j+1)%10==0) cout<<endl;
  53.             }
  54.             cout<<endl;
  55.         }
  56.     }
  57.      
  58.      
  59.     int **trans(int **a, unsigned n, unsigned m) {
  60.         unsigned i,j;int **at;
  61.         at=new int *[n];
  62.         for(i=0;i<m;i++)
  63.             at[i]=new int(m);
  64.         for(i=0;i<n;i++){
  65.             for(j=0;j<m;j++)
  66.                 at[j][i]=a[i][j];
  67.         }
  68.         return at;
  69.     }
  70.      
  71.     int main(){
  72.         double li,ls;int **a;
  73.         unsigned n,m;
  74.         cout<<"***** Matriz traspuesta *****"<<endl;
  75.         try{
  76.             do {
  77.                 leerDimensiones(n,m);
  78.                 leerlim(li,ls);
  79.                 a=randMatE(n,m,li,ls);
  80.                 showMat(a,n,m);
  81.                 a=trans(a,n,m);
  82.                 cout<<"Matriz transpuesta"<<endl;
  83.                 showMat(a,m,n);
  84.             } while(n!=0 && m!=0);
  85.         } catch(string &e) {
  86.             cout<<e;
  87.         }
  88.         return 0;
  89.     }

que funciona hasta que pongo matrices grandes como 15x12
creo que el error esta en la funcion:
Código C++:
Ver original
  1. int **trans(int **a, unsigned n, unsigned m) {
  2.     unsigned i,j;int **at;
  3.     at=new int *[n];
  4.     for(i=0;i<m;i++)
  5.         at[i]=new int(m);
  6.     for(i=0;i<n;i++){
  7.         for(j=0;j<m;j++)
  8.             at[j][i]=a[i][j];
  9.     }
  10.     return at;
  11. }
realmente no se que estoy haciendo mal...
Gracias de antemano
  #2 (permalink)  
Antiguo 20/06/2012, 01:36
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Programa matriz transversa c++

Si "n" son las filas y "m" las columnas, y si "a" es una matriz de nxm, entonces at es mxn:
Código C:
Ver original
  1. at=new int *[m]; // ahora las filas es m
  2.     for(i=0;i<m;i++)
  3.         at[i]=new int(n); // y las columnas es n
proba asi


Saludos
  #3 (permalink)  
Antiguo 20/06/2012, 06:56
 
Fecha de Ingreso: marzo-2012
Mensajes: 30
Antigüedad: 12 años
Puntos: 0
Respuesta: Programa matriz transversa c++

Cita:
Iniciado por cesar_casla Ver Mensaje
Si "n" son las filas y "m" las columnas, y si "a" es una matriz de nxm, entonces at es mxn:
Código C:
Ver original
  1. at=new int *[m]; // ahora las filas es m
  2.     for(i=0;i<m;i++)
  3.         at[i]=new int(n); // y las columnas es n
proba asi


Saludos
Ya deje mi code asi
Código C++:
Ver original
  1. int **trans(int **a, unsigned n, unsigned m) {
  2.     unsigned i,j;int **at;
  3.     at=new int *[m]; // ahora las filas es m
  4.     for(i=0;i<m;i++)
  5.         at[i]=new int(n); // y las columnas es n
  6.     for(i=0;i<n;i++){
  7.         for(j=0;j<m;j++)
  8.             at[j][i]=a[i][j];
  9.     }
  10.     return at;
  11. }

pero aun asi no funciona con numeros como 15x12 ... y al poner matrices grandes como 12x12 imprime barbaridades jaja sera que el error esta en la funcion que muestra?? Gracias por la ayuda
  #4 (permalink)  
Antiguo 20/06/2012, 14:07
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Programa matriz transversa c++

Buenas,

El error es complicado de ver, pero se trata de un pequeño matiz a la hora de crear la memoria con new.

Fíjate en la diferencia:

Código C++:
Ver original
  1. //Estoy inicializando memoria para una variable de tipo entero y asignandole el valor 5
  2. int *puntero = new int(5);
  3.  
  4. //Estoy inicializando memoria para 5 variables de tipo entero (consecutivas en memoria)
  5. int *puntero = new int[5];

Ahora fíjate en tu código:

Código C++:
Ver original
  1. int **trans(int **a, unsigned n, unsigned m) {
  2.     unsigned i,j;int **at;
  3.     at=new int *[m]; // ahora las filas es m
  4.     for(i=0;i<m;i++)
  5.    //Incorrecto, estás inicializando para una sóla columna
  6.    // at[i]=new int(n); // y las columnas es n
  7.      //Correcto  
  8.      at[i]=new int[n]; // y las columnas es n
  9.     for(i=0;i<n;i++){
  10.         for(j=0;j<m;j++)
  11.             at[j][i]=a[i][j];
  12.     }
  13.     return at;
  14. }

Saludos.

Etiquetas: c++, funcion, matrices
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 03:21.