• Jueves 20 de Febrero de 2025, 20:29

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - migul

Páginas: [1]
1
C/C++ / Re: Número aleatorio
« en: Domingo 7 de Junio de 2009, 18:51 »
ok, solucionado, gracias!

2
C/C++ / Número aleatorio
« en: Domingo 7 de Junio de 2009, 15:42 »
Holaa
Una pequeña duda: Hay alguna función de c++ que devuelva un número entero aleatorio??
Esque necesito rellenar un vector con números cualquiera, yo había pensado en la función random(), pero no se bien como funciona, ni si hay que añadir alguna biblioteca especial...
Esta es la funcion de la clase vector que había pensado (donde V es un puntero a double de dimensión length):
void Vector::fillrdn()
{

   for(int i=0;i<length;i++)
   {

      V=random();
   }
}

Y el compilador me dice que  " `random' was not declared in this scope"
Gracias y un saludo!

3
C/C++ / Re: instanciacion de un objeto en un atributo de la clase
« en: Sábado 9 de Mayo de 2009, 19:04 »
Buf al final me he deshecho de la funcion menores y he reprogramado la de ccaracteristico. Parece que ahora no hay problemas informáticos, pero creo que tengo que repasarme el álgebra... jeje
Muchas gracias por vuestra ayuda :good:

4
C/C++ / Re: instanciacion de un objeto en un atributo de la clase
« en: Sábado 9 de Mayo de 2009, 16:48 »
pero despues de corregirlo me sigue dando error, debe de haber algo mas... De todas formas al intentar depurarlo me sigue saliendo una ventanita que dice que end1.exe ha detectado un problema y debe cerrarse

5
C/C++ / Re: instanciacion de un objeto en un atributo de la clase
« en: Sábado 9 de Mayo de 2009, 16:41 »
Toda la razón, muchas gracias!

6
C/C++ / Re: instanciacion de un objeto en un atributo de la clase
« en: Sábado 9 de Mayo de 2009, 16:03 »
Ya tengo el problema de la suma solucionado, Muchas gracias!! Ya si me solucionais el de la funcion c caracteristico seria la leche jeje :P . yo creo que el error puede estar en este trozo del codigo:

double Matriz::menores(int i){
   double coef=0;
   int j,k,l;
   for (j=0;j<(length-i+1);j++);{   //recorre la diagonal en busca de menores
   Matriz menor(i);         //crea menores de orden deseado
      for (k=0;k<i;k++);
      {
         for (l=0;l<i;l++);      //los iguala a la matriz menor para no perturbar la principal
         menor.a[k+j][l+j]=a[k+j][l+j];
      }
   menor.factdet();      //calcula el determinante
   coef+=menor.det;      //los va sumando
   menor.~Matriz();
   }
   return coef;
}//en caso de pasar i=length devuelve el determinante de la matriz
void Matriz::ccaracteristico(){

   ct.q[length-1]=pow(-1,length);

      for(int i=0;i<length-1;i++)
      {
         ct.q=menores(length-i)*pow(-1,i);
      }


}

7
C/C++ / Re: instanciacion de un objeto en un atributo de la clase
« en: Sábado 9 de Mayo de 2009, 14:16 »
cierto, me ha faltado la clase polinomio. Matriz.h la he incluido al principio del todo.
Código: Text
  1.  
  2. #include "Matriz.h"
  3. #ifndef POLINOMIO_H_
  4. #define POLINOMIO_H_
  5. #include <iostream>
  6.  using namespace std;
  7. class Polinomio{
  8. public:
  9.     double *q;
  10.     int g;
  11.     Polinomio (int n);
  12.     Polinomio();
  13.     void print1();
  14.     void operator=(const Polinomio& c);
  15.  
  16.  
  17.  
  18.     virtual ~Polinomio();
  19. };
  20.  
  21. #endif /* POLINOMIO_H_ */
  22.  
  23.  
 
el cpp:

 
Código: Text
  1.  
  2. Polinomio::Polinomio(){
  3.     g=1;
  4.     q = new double [g];
  5.  
  6. }
  7. Polinomio::Polinomio(int n){
  8.     g=n;
  9.     q = new double [g];
  10.     for(int i=0;i<g;i++){
  11.         q[i]=1;
  12.     }
  13. }
  14. void Polinomio::print1()
  15. {
  16.     for(int i=0;i<g;i++){
  17.         cout<<q[i]<<endl;
  18.     }
  19. }
  20. void Polinomio::operator =(const Polinomio& c){
  21.     if(g!=c.g)
  22.     {
  23.         g=c.g;
  24.         delete [] q;
  25.         q=new double [g];
  26.     }
  27.     for(int i=0;i<g;i++)
  28.     {
  29.         q[i]=c.q[i];
  30.     }
  31. }
  32.  
  33. Polinomio::~Polinomio() {
  34.     // TODO Auto-generated destructor stub
  35. }
  36.  

8
C/C++ / Re: instanciacion de un objeto en un atributo de la clase
« en: Sábado 9 de Mayo de 2009, 11:10 »
esque el problema es que no hay error en el códdigo, quiero decir que me lo compila sin fallos, simplemente se detiene la ejecución, ahí va todo el código:

Código: Text
  1. #include <math.h>
  2. #include <iomanip>
  3. #include "Polinomio.h"
  4. #include "Matriz.h"
  5.  
  6. using namespace std;
  7. #ifndef _MATRIZ_H_
  8. #define _MATRIZ_H_
  9.  
  10.  
  11.  
  12.  
  13. class Matriz
  14.     {
  15.     double **a;          //array de punteros a array double, contiene los terminos de la matriz
  16. protected:
  17.     int length;     //orden de la matriz (n filas x ncolumnas)
  18.     double det;
  19.     Polinomio ct;   //Polinomio caracteristico de la matriz
  20. public:
  21.     Matriz (int n);   // reserva memoria, lenght=n: MatrizTridiag A(n);
  22.     ~Matriz ();            // destructor
  23.     bool redim(int n);
  24.     void operator=(const Matriz& B);                // A=B;
  25.     double operator () (int i,int j) const ;    // a=m(i,j);
  26.     double& operator () (int i,int j);      // function: m(i,j)=a;
  27.     Matriz operator + (const Matriz& B);        // C=A+B;
  28.     void read();                    // A.read();
  29.     void fill();                    // A.fill();
  30.     void print () const;                // A.print();
  31.     double menores(int i);
  32.     void factdet();
  33.     void ccaracteristico();
  34.     void mcaracteristico();
  35.     void cambiarfilas(int i,int j);
  36.     double determinante() {return det;}
  37.     int size () const {return length;}          // n = A.size();
  38.     };
  39. #endif
  40.  
  41.  
  42. // Matriz A(n);
  43.  
  44. Matriz::Matriz(int n)
  45.  
  46. {
  47.  
  48.     int i,j;
  49.  
  50.     length = n;
  51.     det=1;
  52.     ct.q= new double [length];
  53.     for(i=0;i<n;i++) ct.q[i]=0;
  54.  
  55.     // reserva memoria
  56.  
  57.     a = new double *[n];  // reserva memoria para el vector de punteros
  58.  
  59.     for (i=0;i<n;i++) a[i] = new double[n]; // reserva memoria para cada fila
  60.  
  61.     for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=0; // inicializa a cero
  62.  
  63.  
  64.  
  65. }
  66.  
  67. // destructor
  68.  
  69. Matriz::~Matriz()
  70.  
  71. {
  72.  
  73.     if( a != NULL)
  74.  
  75.     {       //  libera memoria
  76.  
  77.         for(int i=0;i<length;i++) delete [] a[i];
  78.  
  79.         delete [] a;
  80.  
  81.     }
  82.  
  83.     if( ct.q != NULL)
  84.     {
  85.         delete [] ct.q;
  86.     }
  87.  
  88.  
  89.  
  90. }
  91.  
  92. // A = B
  93.  
  94. void Matriz::operator = (const Matriz& B)
  95.  
  96. {
  97.  
  98.     redim(B.size());
  99.  
  100.     for(int i=0;i<length;i++) for(int j=0;j<length;j++) a[i][j]=B.a[i][j];
  101.  
  102. }
  103.  
  104. //  function: a=m[i,j];
  105.  
  106. inline double Matriz::operator() (int i,int j) const
  107.  
  108. { return a[i][j];}
  109.  
  110. // function: m[i,j]=a;
  111.  
  112. double& Matriz::operator() (int i,int j)
  113.  
  114. { return a[i][j];}
  115.  
  116. // operador suma: C=A+B
  117.  
  118. Matriz Matriz::operator+(const Matriz& B)
  119.  
  120. {
  121.  
  122.     if(length != B.length) cout<< " error: matrices de distinta dimension "<<endl;
  123.  
  124.     Matriz temp(length);
  125.  
  126.     for(int i=0;i<length;i++) for(int j=0;j<length;i++) temp.a[i][j]=a[i][j]+B.a[i][j];
  127.  
  128.     return temp;
  129.  
  130. }
  131.  
  132. // producto matriz por vector: A.prod(v,w);
  133.  
  134.  
  135.  
  136. //  redimensionamiento de una matriz
  137.  
  138. bool Matriz::redim(int n)
  139.  
  140. {
  141.  
  142.     if (length == n)
  143.  
  144.         return false;  // no es necesario redimensionar
  145.  
  146.     else
  147.  
  148.     {
  149.  
  150.         if( a!= NULL)
  151.  
  152.         {
  153.  
  154.             // primero libera memoria
  155.  
  156.             for(int i=0;i<length;i++) delete [] a[i];
  157.  
  158.             delete [] a;
  159.  
  160.         }
  161.  
  162.         length = n;
  163.  
  164.         // reserva memoria
  165.  
  166.         a = new double *[n];  // reserva memoria para el vector de punteros
  167.  
  168.         for (int i=0;i<n;i++) a[i] = new double [n]; // reserva memoria para cada fila
  169.  
  170.         return true;
  171.  
  172.     }
  173.  
  174. }
  175.  
  176. // A.read()
  177.  
  178. void Matriz::read ()
  179.  
  180. {
  181.  
  182.     for(int i=0;i<length;i++)
  183.  
  184.     {
  185.  
  186.         cout << "fila "<<i<<"-esima" << "n";
  187.  
  188.         for(int j=0;j<length;j++)
  189.  
  190.         {
  191.  
  192.             cout << "termino a["<<i<<"]["<<j<<"] = ?" << "n";
  193.  
  194.             cin >> a[i][j];
  195.  
  196.         }
  197.  
  198.     }
  199.  
  200. }
  201.  
  202. // A.fill()
  203.  
  204. void Matriz::fill()
  205.  
  206. {
  207.  
  208.     for(int i=0;i<length;i++)
  209.  
  210.     {
  211.  
  212.         a[i][i]=4;
  213.  
  214.         if(i<length-1)
  215.  
  216.         {
  217.  
  218.             a[i+1][i]=-1;
  219.  
  220.             a[i][i+1]=-1;
  221.  
  222.         }
  223.  
  224.         if(i<length-3)
  225.  
  226.         {
  227.  
  228.             a[i+3][i]=-1;
  229.  
  230.             a[i][i+3]=-1;
  231.  
  232.         }
  233.  
  234.     }
  235.  
  236. }
  237.  
  238. // A.print()
  239.  
  240. void Matriz::print () const
  241.  
  242. {
  243.  
  244.     for(int i=0;i<length;i++)
  245.  
  246.     {
  247.  
  248.         for(int j=0;j<length;j++)
  249.  
  250.             cout << a[i][j]<<"  ";
  251.  
  252.             cout<<endl;
  253.  
  254.     }
  255.  
  256. }
  257.  
  258. // A.factLU()
  259.  
  260. void Matriz::factdet()
  261.  {
  262.      int permutaciones=0;
  263.      int i,j;
  264.  
  265.  
  266.     for(int cp=0;cp<length-1;cp++)
  267.     {
  268.  
  269.  
  270.         for(i=1;i<length-cp;i++){
  271.         if(a[cp][cp]==0)    //si el pivote es cero cambiar filas
  272.         {
  273.             cambiarfilas(cp,cp+i);
  274.             permutaciones++;
  275.         }
  276.         }
  277.         if(a[cp][cp]==0)
  278.             det= 0;//si el pivote sigue siendo cero, el det es cero.
  279.  
  280.         //ahora ya aplicar formula de ferragut
  281.     for(i=cp+1;i<length;i++)
  282.     {
  283.         double pivote=a[i][cp]/a[cp][cp];
  284.         for(j=0;j<length;j++)
  285.         {
  286.             a[i][j]=a[i][j]-pivote*a[cp][j];
  287.         }
  288.  
  289.     }
  290.     }
  291.         //se calcula el determinante
  292.     for(i=0;i<length;i++)
  293.         {det=det*a[i][i];}
  294.  
  295.         det=det*pow(-1,permutaciones);
  296.  
  297.  
  298.  }
  299.  
  300.  void Matriz::cambiarfilas(int i, int j){
  301.      double tem;
  302.      for(int l=0;l<length;l++){
  303.          tem=a[i][l];
  304.          a[i][l]=a[j][l];
  305.          a[j][l]=tem;
  306.  
  307.      }
  308.  }
  309. double Matriz::menores(int i){
  310.     double coef=0;
  311.     int j,k,l;
  312.     for (j=0;j<(length-i+1);j++);{  //recorre la diagonal en busca de menores
  313.     Matriz menor(i);            //crea menores de orden deseado
  314.         for (k=0;k<i;k++);
  315.         {
  316.             for (l=0;l<i;l++);      //los iguala a la matriz menor para no perturbar la principal
  317.             menor.a[k+j][l+j]=a[k+j][l+j];
  318.         }
  319.     menor.factdet();        //calcula el determinante
  320.     coef+=menor.det;        //los va sumando
  321.     menor.~Matriz();
  322.     }
  323.     return coef;
  324. }//en caso de pasar i=length devuelve el determinante de la matriz
  325. void Matriz::ccaracteristico(){
  326.  
  327.     ct.q[length-1]=pow(-1,length);
  328.  
  329.         for(int i=0;i<length-1;i++){
  330.             ct.q[i]=menores(length-i)*pow(-1,i);
  331.         }
  332.  
  333.  
  334. }
  335. void Matriz::mcaracteristico(){
  336.     ct.print1();
  337. }
  338.  
  339.  
  340.  
  341.  
  342.  
  343. int main() {
  344.  
  345.     Matriz prueba(2);
  346.     prueba.fill();
  347.  
  348.     Matriz p(2);
  349.     p.fill();
  350.     Matriz c(2);
  351.     c=prueba+p; //al llegar aqui
  352.     c.print();
  353.     p.ccaracteristico(); //o aqui, sale del programa sin terminar de ejecutarlo
  354.     p.mcaracteristico();
  355.  
  356.  
  357.  
  358.  
  359.  
  360.     return 0;
  361.  
  362. }
  363.  

9
C/C++ / Re: instanciacion de un objeto en un atributo de la clase
« en: Viernes 8 de Mayo de 2009, 18:11 »
Mira los constructores son:

Polinomio::Polinomio(int n){
   g=n;
   q = new double [g];
   for(int i=0;i<g;i++){
      q=1;
   }
}

Matriz::Matriz(int n)

{

   int i,j;

   length = n;
   det=1;
   ct.q= new double [length];
   for(i=0;i<n;i++) ct.q=0;

   // reserva memoria

   a = new double *[n];  // reserva memoria para el vector de punteros

   for (i=0;i<n;i++) a = new double[n]; // reserva memoria para cada fila

   for(i=0;i<n;i++) for(j=0;j<n;j++) a[j]=0; // inicializa a cero



}


y el destructor:

Matriz::~Matriz()

{

   if( a != NULL)

   {       //  libera memoria

       for(int i=0;i<length;i++) delete [] a;

       delete [] a;

   }

   if( ct.q != NULL)
   {
      delete [] ct.q;
   }



}

10
C/C++ / instanciacion de un objeto en un atributo de la clase
« en: Viernes 8 de Mayo de 2009, 17:19 »
Estoy desesperado! No entiendo por que eclipse no me deja ejecutar una funcion miembro de la clase matriz de mi programa. Siempre que el programa encuentra que tiene que ejecutar una función miembro de matriz en la que se instancia una nueva matriz (matriz temp en el caso de la suma p. ej) sale de la ejecucion y me da error. El codigo parece que está bien no tiene ningún problema (creo). ¿Será cosa del compilador o del entorno? Aquí dejo una de las funciones que me dan problema:

double Matriz::menores(int i){
   double coef=0;
   int j,k,l;
   for (j=0;j<(length-i+1);j++);{   //recorre la diagonal en busca de menores
   Matriz menor(i);         //crea menores de orden deseado
      for (k=0;k<i;k++);
      {
         for (l=0;l<i;l++);      //los iguala a la matriz menor para no perturbar la principal
         menor.a[k+j][l+j]=a[k+j][l+j];
      }
   menor.factdet();      //calcula el determinante
   coef+=menor.det;      //los va sumando
   menor.~Matriz();    //Los destruye para que no se ocupe mucha memoria.
   }
   return coef;
}//en caso de pasar i=length devuelve el determinante de la matriz

...
Gracias de antemano! :D

Páginas: [1]