Ciao a tutti!
ho cominciato da poco con il C/C++
Oggi stavo completando un programma che calcola la divisione tra due polinomi. Dopo aver visto che funzionava, stavo cominciando a modificarlo mettento la divisione come sottoprogramma per un programma che calcoli l'MCD. Il programma non è ancora terminato, ho soltanto spostato la procedura di divisione in sottoprogramma (si può vedere ancora questa parte sotto commento prima dello spostamento). Facendo una prova, non riesco a capire per quale motivo il programma funziona correttamente fino al punto in cui mi stampa SEGMENTATION FAULT e non continua più. (il punto che dovrebbe stampare è almeno una parte di quella sottostante il commento che vi indica fin dove funziona.
Non so bene cosa voglia dire segmentation fault, ho provato a ritoccare qualcosa ma non ne vengo a capo..
un'altra cosa: il programma prima della modifica funzionava correttamente, però il modo in cui ho implementato il problema, trattando una frazione con 2 vettori, mi sembra troppo sciocco.. c'e chi mi può suggerisce un modo migliore?avevo pensato a record e struct ma non mi sembrava si potessero adattare (sono alle prime armi e si vede,penso)
Vi ringrazio per l'attenzione e vi scrivo qui sotto il codice:
#include<iostream.h>
#include<math.h>
//divisione polinomi
double somman(double,double,double,double);
double sommad(double,double,double,double);
double prodn(double,double,double,double);
double prodd(double,double,double,double);
const int dim=50;
void divpol(int&,int&,double*,double*,double*,double*,d ouble*,double*,double[][dim],double[][dim]);
int main(){
int i,gradoa,gradob,j,q,p,z,indice;
//double uno,a,b,c,d;
double quozn[50],quozd[50],an[50],ad[50],bn[50],bd[50],mn[50][50],md[50][50],s[50];
double cn[50],cd[50],dn[50],dd[50],gradoc;
bool nostampa,MCD;
cout.precision(15);
//uno=1;
cout<<"inserire grado polinomio A e grado polinomio B\n";
cin>>gradoa>>gradob;
cout<<"aquisizione e stampa polinomi a e b\n";
cout<<"inserire coefficienti (in fraz)di ogni grado di A ";
for (i=1;i<=gradoa+1;i++){
cin>>an[i];
cin>>ad[i];}
cout<<"inserire coefficienti (fraz)di ogni grado di B ";
for (i=1;i<=gradob+1;i++){
cin>>bn[i];
cin>>bd[i];}
cout<<"\nstampa polinomio A\n";
for (i=1;i<=gradoa+1;i++){
cout<<an[i]<<"/"<<ad[i]<<"*x^"<<gradoa+1-i;
if (i!=gradoa+1) cout<<" + ";}
cout<<"\nstampa polinomio B\n";
for (i=1;i<=gradob+1;i++){
cout<<bn[i]<<"/"<<bd[i]<<"*x^"<<gradob+1-i;
if (i!=gradob+1) cout<<" + ";}
cout<<"\n\n";
/*quozn[1]=an[1]*bd[1];
quozd[1]=ad[1]*bn[1];
cout<<"\t\t\tcoeff. di quoz. n°1= "<<quozn[1]<<"/"<<quozd[1]<<"\n";
for (j=1;j<=gradoa-gradob+1;j++){
for(i=j,q=1;i<=gradoa+1;i++,q++){
if (j==1){
if (q<=gradob+1){
a=quozn[1];b=quozd[1];c=bn[i];d=bd[i];
s[1]=(prodn(a,b,c,d))*(-1);
s[2]=prodd(a,b,c,d);
a=s[1];b=s[2];c=an[i];d=ad[i];
mn[j][i]=somman(a,b,c,d);
md[j][i]=sommad(a,b,c,d);}
else{
mn[j][i]=an[i];
md[j][i]=ad[i];}
cout<<mn[j][i]<<"/"<<md[j][i]<<" ";}
else{
if (q<=gradob+1){
a=quozn[j];b=quozd[j];c=bn[q];d=bd[q];
s[1]=(prodn(a,b,c,d))*(-1);
s[2]=prodd(a,b,c,d);
a=s[1];b=s[2];c=mn[j-1][i];d=md[j-1][i];
mn[j][i]=somman(a,b,c,d);
md[j][i]=sommad(a,b,c,d);}
else{
mn[j][i]=mn[j-1][i];
md[j][i]=md[j-1][i];}
cout<<mn[j][i]<<"/"<<md[j][i]<<" ";}
}
quozn[j+1]=mn[j][j+1]*bd[1];
quozd[j+1]=md[j][j+1]*bn[1];
cout<<"\n\t\t\tcoeff. di quoz. success"<<j+1<<"= "<<quozn[j+1]<<"/"<<quozd[j+1]<<endl;
}*/
divpol(gradoa,gradob,quozn,quozd,an,ad,bn,bd,mn,md );
cout<<"\t\t\tquesto ultimo coeff.di quoziente non conta\n\n";
//stampa quoziente
z=gradoa-gradob;
cout<<"quoziente = ";
for (p=1;p<=(gradoa-gradob+1);p++)
cout<<quozn[p]<<"/"<<quozd[p]<<"*x^"<<z+1-p<<" ";
//da qui non stampa più nulla e dà segmentation fault
nostampa=true;MCD=true;
cout<<"\nresto = ";
indice=1;
for (p=1;p<=q;p++){
if ((mn[j-1][p]==0)&&(nostampa));
else {
nostampa=false;
cout<<mn[j-1][p]<<"/"<<md[j-1][p]<<" ";
cn[indice]=mn[j-1][p];
cd[indice]=md[j-1][p];
indice++;
MCD=false;
}}
cout<<endl;
if (MCD) cout<<"il quoziente è l'MCD\n";
else {
cout<<"resto = ";
for (i=1;i<indice;i++)
cout<<cn[i]<<"/"<<cd[i]<<"*x^"<<indice-1-i<<" ";}
gradoc=indice-2;
if (!MCD)cout<<"\ngradoc = "<<gradoc<<endl;
return 0;}
double somman(double a,double b, double c, double d){
double prod,d1,d2,cn;
if ((a!=0)&&(c!=0)){
if ((b!=0)&&(d!=0)){
prod=b*d;
d1=prod/b;
d2=prod/d;
cn=((d1*a)+(d2*c));}
else
if (b==0) cn=c;
else if (d==0) cn=a;}
else if ((a==0)&&(c==0)) cn=0;
else if (a==0) cn=c;
else cn=a;
return cn;}
double sommad(double a,double b, double c, double d){
double cd;
if ((a!=0)&&(c!=0)){
if ((b!=0)&&(d!=0))
cd=b*d;
else if (b==0) cd=d;
else cd=b;}
else if ((a==0)&&(c==0)) cd=0;
else if (a==0) cd=d;
else cd=b;
return cd;}
double prodn(double a,double b, double c, double d){
double cn;
if ((a!=0)&&(b!=0)&&(c!=0)&&(d!=0)) cn=a*c;
else cn=0;
return cn;}
double prodd(double a,double b, double c, double d){
double cd;
if ((a!=0)&&(b!=0)&&(c!=0)&&(d!=0)) cd=b*d;
else cd=0;
return cd;}
void divpol(int &gradoa,int&gradob,double quozn[],double quozd[],double an[],double ad[],double bn[],double bd[],double mn[][dim],double md[][dim]){
int i,q,j;
double a,b,c,d,s[50];
quozn[1]=an[1]*bd[1];
quozd[1]=ad[1]*bn[1];
cout<<"\t\t\tcoeff. di quoz. n°1= "<<quozn[1]<<"/"<<quozd[1]<<"\n";
for (j=1;j<=gradoa-gradob+1;j++){
for(i=j,q=1;i<=gradoa+1;i++,q++){
if (j==1){
if (q<=gradob+1){
a=quozn[1];b=quozd[1];c=bn[i];d=bd[i];
s[1]=(prodn(a,b,c,d))*(-1);
s[2]=prodd(a,b,c,d);
a=s[1];b=s[2];c=an[i];d=ad[i];
mn[j][i]=somman(a,b,c,d);
md[j][i]=sommad(a,b,c,d);}
else{
mn[j][i]=an[i];
md[j][i]=ad[i];}
cout<<mn[j][i]<<"/"<<md[j][i]<<" ";}
else{
if (q<=gradob+1){
a=quozn[j];b=quozd[j];c=bn[q];d=bd[q];
s[1]=(prodn(a,b,c,d))*(-1);
s[2]=prodd(a,b,c,d);
a=s[1];b=s[2];c=mn[j-1][i];d=md[j-1][i];
mn[j][i]=somman(a,b,c,d);
md[j][i]=sommad(a,b,c,d);}
else{
mn[j][i]=mn[j-1][i];
md[j][i]=md[j-1][i];}
cout<<mn[j][i]<<"/"<<md[j][i]<<" ";}
}
quozn[j+1]=mn[j][j+1]*bd[1];
quozd[j+1]=md[j][j+1]*bn[1];
cout<<"\n\t\t\tcoeff. di quoz. success"<<j+1<<"= "<<quozn[j+1]<<"/"<<quozd[j+1]<<endl;}
}