Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 33
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    19

    [C] Equazione di secondo grado

    Ragazzi mi spiegate perché questo programma risulta corretto, ma non parte?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main()
    {
        int a, b, c;
        float det, x1, x2;
    
        printf("Inserire il valore di a, b e c:\n");
        scanf("%d%d%d", &a, &b, &c);
    
    {
       if (a != 0)
        {
            if (b != 0)
            {
                if (c != 0)
                {
                    det = sqrt(b * b - 4 * a * c);
    
                     if (det > 0)
                     {
                         x1 = (-b + det) / 2 * a;
    
                         x2 = (-b - det) / 2 * a;
    
                         printf("L'equazione ammette due soluzioni reali e distinte: %f - %f", x1, x2);
                     }
    
                     if (det < 0)
                     {
                         printf("L'equazione non ammette soluzioni reali");
                     }
    
                     if (det == 0)
                     {
                         x1 = x2 = (-b + det) / 2 * a;
                         printf("L'equazione ammette un'unica soluzione: %f", x1);
                     }
                }
                else
                {
                    x1 = 0;
    
                    x2 = - b / a;
    
                    printf("L'equazione ammette due soluzioni reali e distinte: %f - %f", x1, x2);
                }
    
            }
            else
            {
                if (c == 0)
                    printf("L'equazione ammette un'unica soluzione: \nx=0");
    
                else
                {
                    if (a * c >0)
                    {
                        x1 = + sqrt(-c / a);
                        x2 = - sqrt(-c / a);
                        printf("L'equazione ammette due soluzioni reali e distinte: %f - %f", x1, x2);
                    }
                    else
                        printf("L'equazione risulta essere impossibile");
                }
            }
        }
        else
       {
           if (b != 0)
           {
               if (c != 0)
               {
                   x1 = -c / b;
                   printf("L'equazione e' di primo grado.\n La soluzione e': %f", x1);
               }
               else
                printf("L'equazione e' di primo grado.\n La soluzione e' x=0");
           }
           else
           {
               if (c == 0)
                printf("L'equazione e' un'identita'. La soluzione e' x=0");
    
               else
                printf("L'equazione e' impossibile");
           }
    
       }
    }
        return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Questo

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

    dovrebbe essere

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

    oppure

    x1 = (-b + det) / 2 / a;

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Oltre a quello usi la scanf

  4. #4
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    ....e poi non è det<0 che causa valori immaginari, ma ciò che sta dentro la radice (il discriminante). Se imposti a,b,c in modo che

    b * b - 4 * a * c < 0

    come ti metti? Il programma va in errore.

    Inoltre ci sono degli If superflui. Ad esempio se c=0 la formula per c!=0 va ancora bene perchè quella espressione è valisa anche per c=0...

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Ti converrebbe usare il double per una maggiore precisione, a mio parere, comunque quoto sul discriminante: devi prima controllare se e minore di zero e poi eventualmente applicare la radice quadrata....
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Se il determinante è negativo, esegui l' istruzione:

    codice:
    det = sqrt(b * b - 4 * a * c);
    Dopodichè controlli il valore di det.Ma det è un nan per cui tutti i tre controlli falliscono e il programma termina senza stampare niente.
    Ti conviene togliere tutti quegli if inutili e controllare solamente:
    1) Il valore di a;
    2) Il valore del determinante.

    Oltre a tenere presente che:
    1) Non si controlla l' uguaglianza di un floating point con l' operatore == ;
    2) La scanf può lasciare dei caratteri '\n' extra nel buffer.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Il determinante è

    b * b - 4 * a * c

    e non

    sqrt(b * b - 4 * a * c)

    Quindi deve essere

    det = b * b - 4 * a * c;

    e subito dopo

    if(det<0)
    ...
    else
    ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Ecco un esempio pratico di applicazione dei suggerimenti che ho dato:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define LMAX 100
    #define EPSILON 1.0e-5
    
    int equal (double a, double b)
    {
        return b >= a-EPSILON && b<= a+EPSILON;
    }
    
    int main()
    {
        int a, b, c;
        float x1, x2,delta;
        char buffer[LMAX];
        
        printf("Inserire il valore di a:\n");
        fgets(buffer,100,stdin);
        a=atoi(buffer);
        printf("Inserire il valore di b:\n");
        fgets(buffer,100,stdin);
        b=atoi(buffer);
        printf("Inserire il valore di c:\n");
        fgets(buffer,100,stdin);
        c=atoi(buffer);
        
        if(a==0)
        {
            printf("Risultato: %f\n", -(double)c/b);
        }
        else
        {
            delta=pow(b,2.0) - 4 * a * c;
            if(equal(delta,0.0))
            {
                printf("Risultato: %f\n", -(double)b/ (2*a));
            }
            else if(delta < 0.0)
            {
                printf("Non ci sono risultati\n");
            }
            else
            {
                x1= (-b + sqrt(delta)) / (2*a);
                x2= (-b - sqrt(delta)) / (2*a);
                printf("Risultati:\n1) %f\n1) %f\n",x1,x2);
            }
        }
        
        return 0;
    }
    Viene un codice più leggibile e scritto in meno righe.

    PS: La funzione equal non è delle migliori, l' ho scritta così solo per brevità.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da Who am I
    Ecco un esempio pratico
    Perché a b e c solo interi?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Perché lui le ha dichiarate come interi, penso sia una specifica del problema.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.