Problema funzione "non dichiarata"

di il
5 risposte

Problema funzione "non dichiarata"

Buonasera a tutti,
sono al primo anno di Fisica e nel corso di Elementi di programmazione sto affrontando per la mia prima volta dei codici di C++. Quello che riporto qui è un codice atto a generare polinomi, calcolarli fornendo al programma la variabile x e trovare gli zeri della funzione polinomio (i primi due punti sono stati svolti a lezione, l'ultimo lo sto cercando di sviluppare io).
So bene che una funzione non dichiarata è un problema risolvibile facilmente in linea teorica, ma in questo caso non comprendo proprio dove ho sbagliato.
Ecco il codice:
# include <iostream>
using namespace std;

class Polinomio
{int grado;
double * coefficienti;
double v(double * pppp, int gggg, double zzzz)
{
if( gggg ) return pppp[0] + zzzz *
v(pppp+1, gggg-1, zzzz); return pppp[0];}


public:
double calcola(double z)
{double * pippo = coefficienti;
int grado = this->grado;
return v(pippo, grado, z);}

Polinomio(  ) {  }
Polinomio(int n, double * c) :
grado(n), coefficienti(c) {  }
//double zeropublic(double amain, double bmain, double Xoh) {double ah = amain; double bh = bmain; return zero(ah, bh, Xoh);}
double zero(double a, double b, Polinomio pp, double Xo) 
{
double Fa = pp.calcola(a); double Fb = pp.calcola(b); 
double c = b-a; double Fc = pp.calcola(c);
double d = (b-a)/2;
double p1 = Fa*Fb; double p2 = Fa*Fc;
if(!p1 == 0) if (p1 > 0) cout << "Fra i due estremi il polinomio non si annulla: selezionane altri due."; 
if(d < (1/(10^17))) return Xo = Fa; if(Fc == 0) return Xo = a; {if(p2 < 0) {a = c; zero(a, b, pp, Xo);}; {b = c; zero(a, b, pp, Xo);}; };

};};

int main(  )
{int n;
cout << "dimmi il grado ", cin >> n;
double * d = new double[n+1];
cout << "dimmi i valori di "
<< n+1 << " coefficienti "
" (ordinati) ";
for( int i=0; i <= n; ++i )
cin >> d[i];
Polinomio p(n, d);
double x; double amain; double bmain; double Xoh;

do
{int scelta;
cout << "io so fare:\n"
"0: uscita\n"
"1: calcolo di un polinomio\n"
"2: calcolo di uno zero\n"
"altro: varie ed eventuali\n\n"
"fai la tua scelta ",
cin >> scelta;
switch(scelta)
{
default:
cout << "ripassa\n";
break;
case 0: return 222;
case 1:
cout << "dimmi x ",
cin >> x,
cout << "p("<<x<<") : " <<
p.calcola(x) << endl;
break;
case 2:
cout << "dimmi a", cin >> amain, "dimmi b", cin >> bmain,
cout << zero(amain, bmain, p, Xoh) << endl;
}
} while(true);
}


L'errore che ottengo sul terminale è, su windows:

linea 69 - 'zero' undeclared (first use this function)

e anche su ubuntu mi riporta un frase dal significato analogo, come da aspettative.

Qualcuno può illuminarmi a riguardo?

Grazie per l'attenzione.
Enrico C.

5 Risposte

  • Re: Problema funzione "non dichiarata"

    Per forza: zero(...) non e' una funzione, ma un metodo (sei tu che deciso l'implementazione ), e quindi va scritto come p.zero(...).
  • Re: Problema funzione "non dichiarata"

    Ok, grazie! In effetti non sapevo che tutti i metodi si debbano eseguire tramite oggetti della classe.. Comunque, ora il codice mi da' un'altro problema, stavolta a livello di calcoli, credo.
    Il programma si compila, parte, inserisco a e b, ma al posto di ogni risultato mi da' in uscita "nan" (ovvero not a number, da quanto ho visto in giro). Eppure, nuovamente, non vedo dove sia il problema. (scusate il macello di cicli if che ho messo, ma non conoscevo altri metodi per considerare tutti i vari casi)
    # include <iostream>
    # include <math.h>
    using namespace std;
    
    class Polinomio
    {int grado;
    double * coefficienti;
    double v(double * pppp, int gggg, double zzzz)
    {
    if( gggg ) return pppp[0] + zzzz *
    v(pppp+1, gggg-1, zzzz); return pppp[0];}
    
    
    public:
    double calcola(double z)
    {double * pippo = coefficienti;
    int grado = this->grado;
    return v(pippo, grado, z);}
    
    Polinomio(  ) {  }
    Polinomio(int n, double * c) :
    grado(n), coefficienti(c) {  }
    //double zeropublic(double amain, double bmain, double Xoh) {double ah = amain; double bh = bmain; return zero(ah, bh, Xoh);}
    double zero(double a, double b, double * Xo) 
    {double * pippo = coefficienti; int grado = this->grado;
    double Fa = v(pippo, grado,a); double Fb = v(pippo, grado, b);
    double c = b-a; double Fc = v(pippo, grado, c);
    double d = (b-a)/2; double pow(double x, double y);
    double p1 = Fa * Fb; double p2 = Fa * Fc;
    if(p1 == 0) {if (Fa = 0) {return Fa;} else {}; if (Fb = 0) {return Fb;} else {}; 
    if ((Fa=0)&&(Fb=0))   
    {Xo[1]=a, Xo[2]=b; return * Xo;}else {};}; 
    {
    {if (p1 > 0) ; else
    {
    if(d < pow(10,-10)) 
    {return a;} else {
    if(Fc == 0) 
    {return c;} else
    {if(p2 < 0) 
    {a = c; zero(a, b, Xo);} else {b = c; zero(a, b, Xo);}}
    }}}}
    };};
    
    int main(  )
    {int n;
    cout << "dimmi il grado ", cin >> n;
    double * d = new double[n+1];
    cout << "dimmi i valori di "
    << n+1 << " coefficienti "
    " (ordinati) ";
    for( int i=0; i <= n; ++i )
    cin >> d[i];
    Polinomio p(n, d);
    double x; double amain; double bmain; double * Xoh = new double[2];
    
    do
    {int scelta;
    cout << "io so fare:\n"
    "0: uscita\n"
    "1: calcolo di un polinomio\n"
    "2: calcolo di uno zero\n"
    "altro: varie ed eventuali\n\n"
    "fai la tua scelta \n",
    cin >> scelta;
    switch(scelta)
    {
    default:
    cout << "ripassa\n";
    break;
    case 0: return 222;
    case 1:
    cout << "dimmi x ",
    cin >> x,
    cout << "p("<<x<<") : " <<
    p.calcola(x) << endl;
    break;
    case 2:
    cout << "dimmi a\n", cin >> amain, cout << "dimmi b\n", cin >> bmain,
    cout << p.zero(amain, bmain, Xoh) << endl;
    }
    } while(true);
    }
    
  • Re: Problema funzione "non dichiarata"

    Se vuoi che qualcuno si metta a leggere il tuo codice, usa un minimo di indentazione, cerca di renderlo un po' più leggibile, che così davvero non si capisce niente..
  • Re: Problema funzione "non dichiarata"

    Eccolo, scusate. Ho corretto alcune parti e spero di averlo semplificato e reso più chiaro da leggere.
    # include <iostream>
    # include <math.h>
    using namespace std;
    
    class Polinomio
    {int grado;
    double * coefficienti;
    double v(double * pppp, int gggg, double zzzz)
    {
    if( gggg ) return pppp[0] + zzzz *
    v(pppp+1, gggg-1, zzzz); return pppp[0];}
    
    
    public:
    double calcola(double z)
    {double * pippo = coefficienti;
    int grado = this->grado;
    return v(pippo, grado, z);}
    
    Polinomio(  ) {  }
    Polinomio(int n, double * c) :
    grado(n), coefficienti(c) {  }
    double zero(double a, double b, double * Xo) 
    {double * pippo = coefficienti; int grado = this->grado;
    double Fa = v(pippo, grado,a); double Fb = v(pippo, grado, b);
    double c = b-a; double Fc = v(pippo, grado, c);
    double d = (b-a)/2; double pow(double x, double y);
    double p1 = Fa * Fb; double p2 = Fa * Fc;
    if(p1 == 0) 
          {if ((Fa=0)&&!(Fb=0)) {cout << "Il polinomio si annulla nell'estremo a="; cout << a;} else; 
           if (!(Fa=0)&&(Fb=0)) {cout << "Il polinomio si annulla nell'estremo b="; cout << b;} else; 
           if ((Fa=0)&&(Fb=0)) {cout << "Il polinomio si annulla nei due estremi a="; cout << a; cout << " e b="; cout << b;} else;};
    
    {{if (p1 > 0) cout << "Fra i due estremi il polinomio non si annulla: riprova"; else 
         {if(d < pow(10,-17)) {cout << "Il polinomio si annulla nel punto "; cout << a;} else 
               {if(Fc == 0) {cout << "Il polinomio si annulla nel punto "; cout << c;} else
                      {if(p2 < 0) {a = c; zero(a, b, Xo);} else {b = c; zero(a, b, Xo);}}
    }}}}
    };};
    
    int main(  )
    {int n;
    cout << "dimmi il grado ", cin >> n;
    double * d = new double[n+1];
    cout << "dimmi i valori di "
    << n+1 << " coefficienti "
    " (ordinati) ";
    for( int i=0; i <= n; ++i )
    cin >> d[i];
    Polinomio p(n, d);
    double x; double amain; double bmain; double * Xoh = new double[2];
    
    do
    {int scelta;
    cout << "io so fare:\n"
    "0: uscita\n"
    "1: calcolo di un polinomio\n"
    "2: calcolo di uno zero\n"
    "altro: varie ed eventuali\n\n"
    "fai la tua scelta \n",
    cin >> scelta;
    switch(scelta)
    {
    default:
    cout << "ripassa\n";
    break;
    case 0: return 222;
    case 1:
    cout << "dimmi x ",
    cin >> x,
    cout << "p("<<x<<") : " <<
    p.calcola(x) << endl;
    break;
    case 2:
    cout << "dimmi a\n", cin >> amain, cout << "dimmi b\n", cin >> bmain,
    cout << p.zero(amain, bmain, Xoh) << endl;
    }
    } while(true);
    }
    
  • Re: Problema funzione "non dichiarata"

    Tu dici che queste linee

    {{if (p1 > 0) cout << "Fra i due estremi il polinomio non si annulla: riprova"; else
    {if(d < pow(10,-17)) {cout << "Il polinomio si annulla nel punto "; cout << a;} else
    {if(Fc == 0) {cout << "Il polinomio si annulla nel punto "; cout << c;} else
    {if(p2 < 0) {a = c; zero(a, b, Xo);} else {b = c; zero(a, b, Xo);}}
    }}}}
    };};

    sono scritte in modo chiaro?

    Ma dai ...
Devi accedere o registrarti per scrivere nel forum
5 risposte