Programma c++ per equazioni di secondo grado

di Anonimizzato21817 il
53 risposte

53 Risposte - Pagina 3

  • Dunque...prima di quella riga che, di fatto funziona, c'era un else che mandava a schermo i cout del caso in cui l'equazione è completa.Provate a compilare ora questo codice dove al posto di quella riga ho messo un else e inserite a= 4 b=0 c=-1 e vederete che il programma dà il risultato giusto ma poi stampa qualcosa che non deve stampare. Perche?


    #include <iostream>
    #include <cmath>
    #include <stdlib.h>
    using namespace std;

    float a;
    float b;
    float c;
    float x1;
    float x2;
    float d;

    int main (){

    cout<<"Inserisci a:";
    cin>>a;
    cout<<"inserisci b:";
    cin>>b;
    cout<<"Inserisci c:";
    cin>>c;

    if(a==0)
    {
    x1=x2=-(c/b);
    cout<<"l'equazione e' di primo grado\n";
    cout <<x1;
    }

    if(b==0)
    {
    x1 = sqrt(-(c/a));
    x2 = -sqrt(-(c/a));
    cout<<"l'equazione e' pura\n";
    cout <<x1<<endl;
    cout <<x2<<endl;

    }

    if(c==0)
    {
    x1 = 0;
    x2 = -(b/a);
    cout <<"l'equazione e' spuria\n";
    cout<<x1<<endl;
    cout <<x2<<endl;
    }
    else
    {
    d = sqrt((b*b)-(4*a*c));


    if (d>0){

    x1=((-b+d)/(2*a));
    x2=((-b-d)/(2*a));

    cout << "L'equazione ha due radici reali distinte"<<endl;
    cout << "La prima soluzione e':"<<x1<<endl;
    cout << "La seconda soluzione e':"<<x2<<endl;
    }

    if (d<0){

    cout <<"Impossibile in R, ha due soluzioni in C";
    }
    if (d==0){

    x1 = (-b)/(2*a);

    cout <<"x1"<<endl;

    }
    system("PAUSE");
    return 0;
    }
    }
  • 1) Usa i tag CODE per il codice e l'indentazione corretta altrimenti non si capisce NULLA

    2) "stampa qualcosa" ... magari ci puoi dire cosa?

    Comunque ... NON va bene la else ... comprendi il perché? La else si riferisce a c==0 ... quindi interviene nel caso in cui c è diverso da zero, ovvero il caso che hai indicato tu ... (c -1)

    Devi usare quella linea che avevi usato prima ma CORRETTA

    E POI correggi anche la parte del calcolo della radice del delta, che è sbagliata ...
  • Allora, posso scrivere quell'else in modo tale che non si riferisca solo al c=0 ma a tutto il blocco e che esegua le istruzioni per il calcolo di un'equazione completa nel caso le condizioni a=0, b=0, c=0 non siano soddisfatte. Quella linea funziona nel programma, perchè dovrebbe essere sbagliata stessa cosa per il delta , entrambe funzionano cosa sbaglio? Quando esegua il programma e metto un'equazione non completa alla fine mi stampa

    cout << "L'equazione ha due radici reali distinte"<<endl;
    cout << "La prima soluzione e':"<<x1<<endl;
    cout << "La seconda soluzione e':"<<x2<<endl;
  • ... in modo tale ....
    Per scrivere correttamente NON devi usare la else ma la if che ti ho indicato prima ma scritta in modo corretto ... in C non si scrive in quel modo. Hai compreso?

    Per il delta, non funziona proprio. Devi controllare se il contenuto della sqrt è minore, maggiore o uguale a zero e non il risultato della sqrt (che non potrà mai essere minore di zero). Rivedi la parte matematica perché ti stai confondendo.
  • Io sto scrivendo in c++ c'è diffrenza col C o è uguale? Ho capito cosa intendi per controllare la radice ma come?Ma se il delta non è negativo allora anche la radice esiste. E' per caso una cosa del tipo:

    if(sqrt(b*b-4*a*c)<0 )
    cout << "l'equazione è impossibile";

    else (e qui come continuo?)
  • La if

    if((a && b && c)!=0)

    è COMUNQUE sbagliata, in C e in C++.

    Per il delta NO. Scusa ma mi sembra di parlare con un muro.
    Ti ho già detto che la radice viene DOPO. Il delta è

    delta = (b*b-4*a*c)

    ed è solo questo che devi controllare se è minore, maggiore o uguale a zero. RIPETO ... rivedi la parte matematica
  • Il delta l'ho controllato se è maggiore minore o uguale ma la radice non ho idea di come farlo, invece per l'if pensi che così sia giusto: if (a && b && c !=0) ?
  • Potresti controllare ora se è giusto?
    
    #include <iostream>
    #include <cmath>
    #include <stdlib.h>
    using namespace std;
    
    float a;
    float b;
    float c;
    float x1;
    float x2;
    float d;
    
    int main (){
    
    cout<<"Inserisci a:";
    cin>>a;
    cout<<"inserisci b:";
    cin>>b;
    cout<<"Inserisci c:";
    cin>>c;
    
    if(a==0)
    {
      x1=x2=-(c/b);
      cout<<"l'equazione e' di primo grado\n";
      cout <<"La soluzione e': "<<x1;
    }
    
    if(b==0)
    {
        x1 = sqrt(-(c/a));
        x2 = -sqrt(-(c/a));
        cout<<"l'equazione e' pura\n";
        cout <<"La prima soluzione e': "<<x1<<endl;
        cout <<"La seconda soluzione e': "<<x2<<endl;
    
    }
    
    if(c==0)
    {
        x1 = 0;
        x2 = -(b/a);
        cout <<"l'equazione e' spuria\n";
        cout<<"La prima soluzione e': "<<x1<<endl;
        cout <<"La seconda soluzione e': "<<x2<<endl;
    }
    
    if (a && b && c!=0)
    {
    d =((b*b)-4*(a*c));
    
    if (d>0){
    
      x1=(-b+sqrt(d))/(2*a);
      x2=(-b-sqrt(d))/(2*a);
    
          cout << "L'equazione ha due radici reali distinte"<<endl;
          cout << "La prima soluzione e':"<<x1<<endl;
          cout << "La seconda soluzione e':"<<x2<<endl;
    }
    
    if (d<0){
    
        cout <<"Impossibile in R, ha due soluzioni in C";
    }
    if (d==0){
    
        x1 = (-b)/(2*a);
    
        cout <<"Le soluzioni sono coincidenti: "<<"x1"<<endl;
    
            }
            system("PAUSE");
            return 0;
        }
    }
    
  • No .... la if non si scrive così. Ripeti i tre confronti ...

    Anche se può sembra uguale, in molti casi può essere fonte di problemi ... Si scrive

    if (a!=0 && b!=0 && c!=0)

    Ma l'hai un libro?


    Per il delta, adesso va bene ... come vedi è molto diverso da prima ...
  • Già il delta era davvero una stupidaggine ma pensavo per l'if che quando si hanno molti parametri pensavo che l'operatore != si mettesse solo una volta e invece no. No non ho ancora un buon libro di c, c++ mi baso su guide su internet e youtube, se puoi mi consiglierest un buon libro che sia italiano o inglese non ha importanza l'importante che sia completo con tutti gli argomenti e i dovuti approfondimenti anche su ciò che avviene dietro le quinte a livello hardware. Grazie mille per l'assistenza e la pazienza.
  • Mi sembra che te l'hanno consigliato già un libro in altro thread ... poi ne esistono tantissimi (amazon) e sono tutti buoni ... L'hardware non c'entra nulla con il linguaggio, il libro lo trovi sul linguaggio...
  • Ok, ma una volta risolta una discussione come si fa a chiuderla?
  • Non si chiude
  • Ah ok
  • oregon ha scritto:


    @Jackie ... se indenti meglio il codice trovi l'errore facilmente.
    Ok, giusto; ora il codice sembra corretto e funzionante:

    http://prntscr.com/ft4dx
    http://prntscr.com/ft4ea

    http://prntscr.com/ft4g4

    http://prntscr.com/ft4ij

    http://prntscr.com/ft4ix

    http://prntscr.com/ft4j4
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    int main( void )
    {
        int a;
        int b;
        int c;
        int d;
        int x1;
        int x2;
    
        puts( "Inserisci il coefficiente della x al quadrato: \n" );
        scanf( "%d", &a );
        puts( "Inserisci il coefficiente della x: \n" );
        scanf( "%d", &b );
        puts( "Inserisci il coefficiente della c: \n" );
        scanf( "%d", &c );
    
        if (a==0) {
            puts( "L'equazione non e' di secondo grado" );
            x1=x2=-(b/a);
            puts( "x1<<endl" );
        } else {
                if(c==0) {
                    puts( "L'equazione e' spuria" );
                    x1 = 0;
                    x2 = -(b/a);
                    printf( "\nx1 = %d", x1 );
                    printf( "\nx2 = %d", x2 );
                } else {
                        if(b==0) {
                            puts( "L'equazione e' pura" );
                            x1 = -sqrt(-c/a);
                            x2 = sqrt(-c/a);
                            printf( "\nx1 = %d", x1 );
                            printf( "\nx2 = %d", x2 );
                        } else {
                                if((a && b && c)!=0) {
                                    d= (b*b)-4*a*c;
                                    if(d>0) {
                                        x1 = ((-b)-sqrt(d))/2*a;
                                        x2 = ((-b)+sqrt(d))/2*a;
                                        printf( "\nx1 = %d", x1 );
                                        printf( "\nx2 = %d", x2 );
                                    }
                                    if(d==0) {
                                        x1 = (-b)/2*a;
                                        printf( "\nx1 = %d", x1 );
                                        printf( "\nx2 = x1 = %d", x1 );
                                    }
                                    if(d<0) {
                                        puts( "Questa equazione e' impossibile in R ma ha due soluzioni complesse in C" );
                                    }
                                }
                          }
                  }
          }
    }
    
    Il probelma però è ancora quello della scelta della variabile in quanto un float sarebbe più indicato di un int...
    Grazie del programmino, spero funzioni ora!!!
Devi accedere o registrarti per scrivere nel forum
53 risposte