Ver Mensaje Individual
  #1 (permalink)  
Antiguo 09/12/2015, 16:27
AnaxiMarco
 
Fecha de Ingreso: diciembre-2015
Mensajes: 1
Antigüedad: 8 años, 11 meses
Puntos: 0
Pregunta Violación de segmento ('core' generado)

Hola, estoy programando una calculadora de polinomios y todo funciona bien salvo el MCD. Se compila todo bien pero cuando corro el programa en la opción 9 (MCD) aparece el mensaje de Violación de segmento ('core' generado).

Espero me pue
El código de mi programa es:

Código:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <math.h> //Se usa solo para la opción de evaluar polinomios

using namespace std;

class Poli : public vector<double> {
      public:
       Poli();
       int Gr() const;
       ostream& Print(ostream& os) const;
};

Poli::Poli() : vector<double>()
{ }

ostream& Poli::Print(ostream& os) const
{
    for (int k=0; k<this->size(); k++)
       os << " + " << (*this)[k] << "x**" << k;
    return os;
}

ostream& operator << (ostream& os, const Poli& p)
{
    return p.Print(os);
}


int Poli::Gr() const
{
   int gr= 0;
   for (int k=0; k < (*this).size(); k++)
      if ( (*this)[k] != 0.0 )
          gr= k;
   return gr;
}

Poli Integral(const Poli& p)
{
   Poli r;
   int Gp= p.Gr();
   int k= 0;
   r.push_back(0);
   while (k<=Gp)
      {
       r.push_back( p[k] /(k+1) );
       k++;
      }

    return r;
}


Poli Derivada(const Poli& p)
{
   Poli r;
   int Gp= p.Gr();
   int k= 2;
   r.push_back(p[1]);
   while (k<=Gp)
      {
       r.push_back( p[k] *(k) );
       k++;
      }
    return r;
}

Poli Suma(Poli p, Poli q)
{
   Poli r;
   int Gp= p.Gr();
   int Gq= q.Gr();
   int k= 0;
   while (k<=Gp && k<=Gq)
      {
       r.push_back( p[k] + q[k] );
       k++;
      }
   while (k<=Gp)
      r.push_back( p[k++] );

   while (k<=Gq)
      r.push_back( q[k++] );

    return r;
}

Poli Resta(Poli p, Poli q)
{
   Poli r, t;
   int Gp= p.Gr();
   int Gq= q.Gr();
   int k= 0;
   while (k<=Gp && k<=Gq)
      {
       r.push_back( p[k] - q[k] );
       k++;
      }
   while (k<=Gp)
      r.push_back( p[k++] );

   while (k<=Gq)
      r.push_back( -q[k++] );

    return r;
}

Poli Mult(Poli p, Poli q)
{
  Poli r;
  int res[p.Gr()+q.Gr()+1];
  for(int c=0; c<=p.Gr()+q.Gr(); c++)
   res[c]=0;
  for(int i=0; i<=p.Gr(); i++)
  {
   for(int j=0; j<=q.Gr(); j++)
   {
     res[i+j]+=p[i]*q[j];
   }
  }
  for(int k=0; k<=p.Gr()+q.Gr(); k++)
  {
    r.push_back(res[k]);
  }

  return r;
}

Poli Div(Poli p, Poli q)
{ 
  Poli a, b, c, r, t;
  Poli s;
  s.push_back(0);
    double f[q.Gr()-p.Gr()];
    for(int i=0; i<=q.Gr()-p.Gr(); i++)
      f[i]=0;
    f[q.Gr()-p.Gr()]=q[q.Gr()]/p[p.Gr()];
    for(int j=0; j<=q.Gr()-p.Gr(); j++)
      a.push_back(f[j]);
    b=Mult(p, a);
    s = Suma(s, a);
    c=Resta(q, b);
  return s;
}

Poli Residuo(Poli p, Poli q)
{ 
  Poli a, b, c, r, t;
  Poli s;
  s.push_back(0);
    double f[q.Gr()-p.Gr()];
    for(int i=0; i<=q.Gr()-p.Gr(); i++)
      f[i]=0;
    f[q.Gr()-p.Gr()]=q[q.Gr()]/p[p.Gr()];
    for(int j=0; j<=q.Gr()-p.Gr(); j++)
      a.push_back(f[j]);
    b=Mult(p, a);
    s = Suma(s, a);
    c=Resta(q, b);
  return c;
}

Poli MCD(Poli p, Poli q)
{
  Poli m;
  do
    {
      m= Residuo(p, q);
      q = p;
      p = m;
    }
  while(m.Gr() != 0);
  return m;
}

int main()
{

   Poli p;
   p.push_back(8);
   p.push_back(2);
   p.push_back(0);
   p.push_back(1);

   Poli q;
   q.push_back(2);
   q.push_back(0);
   q.push_back(4);
   q.push_back(1);
   q.push_back(4);
   q.push_back(9);
   
 
   Poli r, s;
   int b, a;
   cout<<"CALCULADORA DE POLINOMIOS\n";
   cout<<"Por favor elija la operación que quiera hacer con los polinomios ingresados\n";
   cout<<"1 Sumar los polinomios p y q\n";
   cout<<"2 Restar los polinomios p y q\n";
   cout<<"3 La integral de p y la integral de q\n";
   cout<<"4 La derivada de p y la derivada de q\n";
   cout<<"5 Evaluar p y q en un punto elegido por el usuario\n";
   cout<<"6 Multiplicar p y q\n";
   cout<<"7 Dividir q (el polinomio de mayor grado) entre p\n";
   cout<<"8 El residuo de dividir q entre p\n";
   cout<<"9 El MCD de los polinomios q (de mayor grado) y p\n"<<endl;
   cin>>a;

   switch(a)
   {
     case 1:
     {
       r= Suma(p, q);
       cout<<"La suma de los polinomios p y q es:\n";
       cout<< r << endl;
       cout<<"\n El grado de la suma es:"<< r.Gr() << endl;
     }
     break;
    case 2:
     {
       r= Resta(p, q);
       cout<<"La resta de los polinomios p y q es:\n";
       cout<< r << endl;
       cout<<"\n El grado de la resta es:"<< r.Gr() << endl;
     }
     break;
    case 3:
     {
       r= Integral(p);
       s= Integral(q);
       cout<<"La integral del polinomio p es:\n";
       cout<< r <<" + c"<< endl;
       cout<<"\n El grado de la integral de p es: "<< r.Gr() << endl;
       cout<<"\n La integral del polinomio q es:\n";
       cout<<s<< " + c"<< endl;
       cout<<"\n El grado de la integral de q es:"<< s.Gr() << endl;
     }
     break;
    case 4:
     {
      r= Derivada(p);
      s= Derivada(q);
      cout<<"La derivada del polinomio p es:\n";
      cout << r << endl;
      cout<<"El grado de la derivada de p es: "<< r.Gr() << endl;
      cout<<"La derivada del polinomio q es:\n";
      cout << s << endl;
      cout<<"El grado de la derivada de q es: "<< s.Gr() << endl;
     }
     break;
    case 5:
     {
      cout<<"Ingrese el número donde quiere evaluar a los polinomios p y q: "<<endl;
      cin>>b;
      int sum1=0, par1;
      for(int j=0; j<=p.Gr(); j++)
      {
       par1=p[j]*pow(b,j);
       sum1+=par1;
      }
      int sum2=0, par2;
      for(int j=0; j<=q.Gr(); j++)
      {
       par2=q[j]*pow(b,j);
       sum2+=par2;
      }
      cout<<"\n El valor del polinomio p en "<<b<<" es: "<<sum1<<endl;
      cout<<"\n El valor del polinomio q en "<<b<<" es: "<<sum2<<endl;
     }
     break;
    case 6:
     {
      Poli r;
      r= Mult(p, q);
      cout<<"La multiplicación de p y q es:\n";
      cout<<r<< endl;
      cout<<"El grado de la multiplicación es: "<<r.Gr()<<endl;
     }
     break;
    case 7:
     {
       Poli r;
       r= Div(p, q);
       cout<<"La división q entre p es:\n";
       cout<< r << endl;
       cout<<"El grado de la división es: "<<r.Gr()<<endl;
     }
     break;
   case 8:
     {
       Poli r;
       r= Residuo(p, q);
       cout<<"La división q entre p es:\n";
       cout<< r << endl;
       cout<<"El grado del residuo es: "<<r.Gr()<<endl;
     }
     break;
   case 9:
     {
       Poli r;
       r=MCD(p, q);
       cout<<"El MCD de los polinomios p y q es:\n";
       cout<<r <<endl;
     }
     break;
   }
  

   return EXIT_SUCCESS;
}