PDA

Visualizza la versione completa : [C] Equazione di secondo grado


Sos_Code
12-05-2012, 16:41
Ragazzi mi spiegate perché questo programma risulta corretto, ma non parte?



#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;
}

escocat
12-05-2012, 17:15
Questo

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

dovrebbe essere

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

oppure

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

Who am I
12-05-2012, 22:34
Oltre a quello usi la scanf :facepalm:

escocat
12-05-2012, 23:25
....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...

Scara95
12-05-2012, 23:33
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....

Who am I
13-05-2012, 00:02
Se il determinante è negativo, esegui l' istruzione:



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.

oregon
13-05-2012, 00:10
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
...

Who am I
13-05-2012, 00:25
Ecco un esempio pratico di applicazione dei suggerimenti che ho dato:




#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à.

oregon
13-05-2012, 00:30
Originariamente inviato da Who am I
Ecco un esempio pratico

Perché a b e c solo interi?

Who am I
13-05-2012, 01:17
Perché lui le ha dichiarate come interi, penso sia una specifica del problema.

Loading