09/12/2015, 16:27
|
| | Fecha de Ingreso: diciembre-2015
Mensajes: 1
Antigüedad: 8 años, 11 meses Puntos: 0 | |
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;
}
|