Aiuto programma
Salve a tutti sono nuovo e questa è la prima domanda che vi porgo, io devo creare un programma che acquisisca un polinomio di grado 2 e ne calcola la radice. vorrei qualche dritta sul calcolo delle radici di un polinomio di grado 2. Grazie per l'aiuto
Risposte
Ecco i risultati delle tue equazioni:
Equzazione di 2° grado: +3.000000x^2-7.000000x+1.000000=0
Le due soluzioni sono: 6.54138, 0.458619
Equzazione di 2° grado: +3.000000x^2-6.000000x+3.000000=0
La soluzione coincidente è: 1
Equzazione di 2° grado: +3.000000x^2+2.000000x+1.000000=0
Le due soluzioni complesse sono: -0.333+nani,-0.333+nani
nella prima e nella terza c'è qualcosa che non và!
Equzazione di 2° grado: +3.000000x^2-7.000000x+1.000000=0
Le due soluzioni sono: 6.54138, 0.458619
Equzazione di 2° grado: +3.000000x^2-6.000000x+3.000000=0
La soluzione coincidente è: 1
Equzazione di 2° grado: +3.000000x^2+2.000000x+1.000000=0
Le due soluzioni complesse sono: -0.333+nani,-0.333+nani
nella prima e nella terza c'è qualcosa che non và!

lo compilato e mi dice:
nan
Errore nella chiamata di sqrt(): : Numerical argument out of domain
quindi non riesce a fare la radice quadrata di delta?
nan
Errore nella chiamata di sqrt(): : Numerical argument out of domain

quindi non riesce a fare la radice quadrata di delta?
"yoghi87":
Fantastico l'ho finito e mi si è compilato però non mi convincono i risultati che mi dà? cioè le radici a mano mi vengono diverse
poi per le soluzioni complesse mi scrive cosi:
Equzazione di 2° grado: +4.000000x^2+4.000000x+4.000000=0
Le due soluzioni complesse sono: -0.5+nani,-0.5+nani
NANI?
Credo che nan stia per "Not-A-Number" http://en.wikipedia.org/wiki/NaN
Per controllare dovresti mettere un if-statement:
a è il numero usato per il numero immaginario. Serve
if (isnan(a)) return 1;
Cosa stai usando per i numeri complessi?
Non stai usando complex.h (standard ISO-C99), vero!?
In complex.h esiste una funzione csqrt:
Definita come:
#include <complex.h> double complex csqrt(double complex z); float complex csqrtf(float complex z); long double complex csqrtl(long double complex z);
In realtà potresti usare i complessi... ma non potresti usare gcc dato che questa opzione è segnata come broken nel http://gcc.gnu.org/gcc-4.2/c99status.html.
La funzione di math.h sqrt (o simili) ritornano un domain error quando il numero che gli viene passato è minore di zero. Un domain error è implementation-defined, questo vuol dire che non si può sapere in anticipo come si comporta il compilatore. Dal tuo risultato ritengo che faccia ritornare NaN (cosa comprensibile).
Quindi molto probabilmente mettere un meno nella funzione sqrt basterebbe per risolvere il problema. In ogni caso metti un po' di controlli.
"Sergio":
quindi non riesce a fare la radice quadrata di delta?
Hai riletto quello che avevo scritto in quel messaggio? Ripeto:
Se usi delta come variabile, basta calcolarlo all'inizio una sola volta (all'interno di polinomio_2()). Dovresti poi calcolare le radici nell'ambito delle istruzioni condizionali; ad esempio, se delta <0... come fai a calcolare sqrt(delta)? Quindi: prima calcoli delta = ecc., poi:
a) se delta > 0, allora calcoli subito x1 e x2 (ma non come hai fatto: devi dividere per (2*a));
b) se delta = 0, allora ti basta -b/(2*a);
c) se delta < 0, allora ne cambi il segno, ne estrai la radice, ecc.
Più chiaro?
Prima calcoli il delta, poi, all'interno delle if calcoli le soluzioni e se delta<0 ne cambi il segno prima di passarlo a sqrt().[/quote]
Scusa ma non ho capito!

void polinomio_2()
{
delta = b*b-4*a*c;
x1 = (-b+sqrt(delta))/2;
x2 = (-b-sqrt(delta))/2;
r = -b/(2*a);
i1 = sqrt(delta)/(2*a);
i2 = -sqrt(delta)/(2*a);
if (delta>0)
printf("Le due soluzioni sono: %lg, %lg\n", x1, x2);
else if(delta==0)
printf("La soluzione coincidente è: %lg\n", r);
else if(delta<0)
printf("Le due soluzioni complesse sono: %+0.3g%+0.3gi,%+0.3g%+0.3gi\n",r, i1, r, i2);
}
devo mettere il calcolo del delta dove?

"yoghi87":
Scusa ma non ho capito!![]()
void polinomio_2()
{
delta = b*b-4*a*c;
x1 = (-b+sqrt(delta))/2;
x2 = (-b-sqrt(delta))/2;
r = -b/(2*a);
i1 = sqrt(delta)/(2*a);
i2 = -sqrt(delta)/(2*a);
if (delta>0)
printf("Le due soluzioni sono: %lg, %lg\n", x1, x2);
else if(delta==0)
printf("La soluzione coincidente è: %lg\n", r);
else if(delta<0)
printf("Le due soluzioni complesse sono: %+0.3g%+0.3gi,%+0.3g%+0.3gi\n",r, i1, r, i2);
}
devo mettere il calcolo del delta dove?

Pensa a come lo faresti tu...
$x = (-b +- sqrt(Delta))/(2*a)$
calcoli $sqrt(Delta)$ e lo salvi (segnando il caso $Delta<0$).
Poi lo metti dentro l'equazione.
Un'alternativa (alla fine devi mettere la scrittura su video). Pensa al perché dei vari passaggi.
P.S: Ora è giusto
void polinomio_2() { /* calcolo del delta */ delta = b*b-4*a*c; /* calcolo di sqrt(delta) */ if(delta<0) s_delta = sqrt(-delta); else if (delta>0) s_delta = sqrt(delta); else s_delta = 0; /* calcolo soluzioni: le soluzioni x1 e x2 sono uguali se delta=0 */ if(delta>=0) { x1 = (-b + s_delta)/2*a x2 = (-b - s_delta)/2*a } else { r = -b/2*a; /* non serve memorizzarne 2, basta stampare -i al posto di i */ i = s_delta/2*a } [...] }
P.S: Ora è giusto
Non ci crederai ma lo stavo scrivendo come hai appena scritto tu adesso...
Quindi ormai è concluso.... però devo chiederti 2 ultime cose:
-si può fare un eseguibile che non parti con il comando da shell, ma si esegue cliccando sopra l'icona come i programmi normali?
-e un ultima cosa riguardo il progetto: devo anche creare il makefile del programma, siccome io per problemi di lavoro non ho seguito le lezioni e quindi ancje quella per la creazione del makefile non so come devo fare....

Quindi ormai è concluso.... però devo chiederti 2 ultime cose:
-si può fare un eseguibile che non parti con il comando da shell, ma si esegue cliccando sopra l'icona come i programmi normali?
-e un ultima cosa riguardo il progetto: devo anche creare il makefile del programma, siccome io per problemi di lavoro non ho seguito le lezioni e quindi ancje quella per la creazione del makefile non so come devo fare....

Progetto_Radici: Progetto_Radici.c
gcc -ansi -Wall -O -lm Progetto_Radici.c -o Progetto_Radici
Potrei provare a fare cosi ma non ho capito a cosa serve ne dove devo scriverlo ne come salvarlo!
Intanto Ti ringrazio in modo infinito, e ti chiedo questo ultimo sforzo poi non ti romperò più....
gcc -ansi -Wall -O -lm Progetto_Radici.c -o Progetto_Radici
Potrei provare a fare cosi ma non ho capito a cosa serve ne dove devo scriverlo ne come salvarlo!

Intanto Ti ringrazio in modo infinito, e ti chiedo questo ultimo sforzo poi non ti romperò più....

"Sergio":
Sì, ma cambierebbero pesantemente molte cose.....
c'è una guida per far cambiare queste cose (curiosità mia!

PS. il Makefile deve essere lanciato come eseguibile? o rimane semplicemente un file di testo che si trova nella directory del programma?

"yoghi87":
[quote="Sergio"]
Sì, ma cambierebbero pesantemente molte cose.....
c'è una guida per far cambiare queste cose (curiosità mia!

PS. il Makefile deve essere lanciato come eseguibile? o rimane semplicemente un file di testo che si trova nella directory del programma?

Non sono molto un patito di linux (anche perché ogni volta che mi ci metto lo distruggo, cioé si danneggia definitivamente e non mi riparte più

Personalmente uso notepad++ e visual studio sotto windows.
Su linux potresti installare eclipse e CDT ma temo che configurarlo ti faccia passare la voglia di usarlo (questo non è un attacco a linux, configurare eclipse non è una cosa per principianti).
Comunque c'é un programma (make se non mi sbaglio) che lo legge e fa quello che c'é scritto (cioé compilare il tuo codice).
Caro Sergio ho di nuovo bisogno del tuo aiuto... Ho seguito le altre discussioni e ho fatto come Yoghi87 visto che seguiamo lo stesso corso di laurea, ho fatto lo stesso programmino solo che a me il compilatore mi dà questi errori, te li posto:
gcc -ansi -Wall -O -lm EquazioniSempliceGrado2.c -o EquazioniSempliceGrado2
EquazioniSempliceGrado2.c:16:19: error: stdio.h: Nessun file o directory
EquazioniSempliceGrado2.c:17:54: error: math.h: Nessun file o directory
EquazioniSempliceGrado2.c: In function ‘immetti_coefficienti’:
EquazioniSempliceGrado2.c:34: warning: implicit declaration of function ‘printf’
EquazioniSempliceGrado2.c:34: warning: incompatible implicit declaration of built-in function ‘printf’
EquazioniSempliceGrado2.c:35: warning: implicit declaration of function ‘scanf’
EquazioniSempliceGrado2.c:35: warning: incompatible implicit declaration of built-in function ‘scanf’
EquazioniSempliceGrado2.c: In function ‘main’:
EquazioniSempliceGrado2.c:52: warning: incompatible implicit declaration of built-in function ‘printf’
EquazioniSempliceGrado2.c:58: warning: incompatible implicit declaration of built-in function ‘printf’
make: *** [EquazioniSempliceGrado2] Error 1
Cosa devo fare???????????? L' ho ricontrollato 1000 volte e nn vedo alcuna differenza....
Sono veramente in crisi xchè credevo finalmente di avercela fatta!!!!!!!!!!!! Uso anche io Ubuntu 7.10 per la compilazione, mentre uso gvim sia su Windows che su Ubuntu e quindi sono identici!!!!!!!!!!!!! Grazie 1000 in anticipo!!!!!!!!!!!!!!!!
gcc -ansi -Wall -O -lm EquazioniSempliceGrado2.c -o EquazioniSempliceGrado2
EquazioniSempliceGrado2.c:16:19: error: stdio.h: Nessun file o directory
EquazioniSempliceGrado2.c:17:54: error: math.h: Nessun file o directory
EquazioniSempliceGrado2.c: In function ‘immetti_coefficienti’:
EquazioniSempliceGrado2.c:34: warning: implicit declaration of function ‘printf’
EquazioniSempliceGrado2.c:34: warning: incompatible implicit declaration of built-in function ‘printf’
EquazioniSempliceGrado2.c:35: warning: implicit declaration of function ‘scanf’
EquazioniSempliceGrado2.c:35: warning: incompatible implicit declaration of built-in function ‘scanf’
EquazioniSempliceGrado2.c: In function ‘main’:
EquazioniSempliceGrado2.c:52: warning: incompatible implicit declaration of built-in function ‘printf’
EquazioniSempliceGrado2.c:58: warning: incompatible implicit declaration of built-in function ‘printf’
make: *** [EquazioniSempliceGrado2] Error 1
Cosa devo fare???????????? L' ho ricontrollato 1000 volte e nn vedo alcuna differenza....
Sono veramente in crisi xchè credevo finalmente di avercela fatta!!!!!!!!!!!! Uso anche io Ubuntu 7.10 per la compilazione, mentre uso gvim sia su Windows che su Ubuntu e quindi sono identici!!!!!!!!!!!!! Grazie 1000 in anticipo!!!!!!!!!!!!!!!!

perchè se lo provo a compilare con dev-c++ mi dà i seguenti errori:
[Linker error] undefined reference to __cpu_features_init
ld returned 1 exit status
[Linker error] undefined reference to __cpu_features_init
ld returned 1 exit status
è vero mi andava in conflitto con mingw! GRAZIE
Sergio è praticamente identico a quello di yoghi, ma lo cambierò naturalmente visto che nn possiamo farlo uguale ma era solo x esercitarmi e vedere come si scriveva, quindi ho scritto così per le librerie:
Cmq ho parlato cn alcuni dell'università e mi hanno spiegato che potrebbero nn essere installate le librerie infatti dovrei capire come Yoghi fa a compilare i programmi io ho creato il Makefile come mi hanno insegnato all'Uni e ho eseguito il Makefile con il comando make!!!!!!!!!!!!!!!! Ho installato alcune librerie che ho trovato nella sezione Gestione dei pacchetti Synapctis vedrò se funziona!!!!!!!!!!!!!!!!! Fammi sapere se ti devo postare ugualmente il sorgente!!!!!!!!!! A più tardi!!!!!!!!
#include <stdio.h> #include <math.h>
Cmq ho parlato cn alcuni dell'università e mi hanno spiegato che potrebbero nn essere installate le librerie infatti dovrei capire come Yoghi fa a compilare i programmi io ho creato il Makefile come mi hanno insegnato all'Uni e ho eseguito il Makefile con il comando make!!!!!!!!!!!!!!!! Ho installato alcune librerie che ho trovato nella sezione Gestione dei pacchetti Synapctis vedrò se funziona!!!!!!!!!!!!!!!!! Fammi sapere se ti devo postare ugualmente il sorgente!!!!!!!!!! A più tardi!!!!!!!!
Va bene provo e ti faccio sapere!!!!!!!!!!!!!!
"Sergio":
Se ti dà errori analoghi, verifica che esista il file /usr/include/stdio.h (non si sa mai...)

Si Sergio l'HelloWorld funziona cioè il make funziona e le librerie stdio.h e math.h ci sono!!!!!!!!!!!! Ora provo il mio programmino vediamo che succede!!!!!!!!!!!!
Sergio ci siamo......... Ora però nn me lo fa eseguire e non capisco il perché............Ah ecco il compilatore di default crea l'eseguibile in formato exe penso come posso fare???? Infatti nè l'HelloWorld ne il mio programmino partono!!!!!!!!!!!!!!! Sicuramente con Windows funzioneranno ma purtroppo li devo testare con Ubuntu!!!!!!!!!! Grazie 1000
"luca260786":
Sergio ci siamo......... Ora però nn me lo fa eseguire e non capisco il perché............Ah ecco il compilatore di default crea l'eseguibile in formato exe penso come posso fare???? Infatti nè l'HelloWorld ne il mio programmino partono!!!!!!!!!!!!!!! Sicuramente con Windows funzioneranno ma purtroppo li devo testare con Ubuntu!!!!!!!!!! Grazie 1000
I compilatori su ubuntu non creano di default un eseguibile in .exe. Forse intendi dire che ti crea un eseguibile.
P.S: è stupida come cosa... ma hai provato a farli partire? Anche negli IDE c'é un pulsante "built" o "compile" e uno "run".
Ciao Sergio finalemente sono riuscito a fare il programma per l'esame e funziona correttamente, anche grazie ai vostri aiuti!!!!!!!!!!!!!!!!!!!!!!!!!!
Ora volevo mettere un'aggiunta:
Se il valore acquisito è un numero tutto bene, passa all'acquisizione del secondo, e così il terzo, mentre se per caso uno dei tre valori è di tipo char il programma si deve fermare lì e richiedere nuovamente l'inserimento di un numero!!!!!!!!!!!!!! Come posso fare???????????? Ho qualche idea ma nn riesco a praticarla!!!!!!!!!!!!! Grazie 1000 in anticipo!!!!!!!!!!!!!!!
Ora volevo mettere un'aggiunta:
Se il valore acquisito è un numero tutto bene, passa all'acquisizione del secondo, e così il terzo, mentre se per caso uno dei tre valori è di tipo char il programma si deve fermare lì e richiedere nuovamente l'inserimento di un numero!!!!!!!!!!!!!! Come posso fare???????????? Ho qualche idea ma nn riesco a praticarla!!!!!!!!!!!!! Grazie 1000 in anticipo!!!!!!!!!!!!!!!