Aiuto programma

yoghi871
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
yoghi871
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à! :?

yoghi871
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?

vict85
"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? :shock:


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.

yoghi871
"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? :roll:

vict85
"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? :roll:


:shock:

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.

vict85
Un'alternativa (alla fine devi mettere la scrittura su video). Pensa al perché dei vari passaggi.

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

yoghi871
Non ci crederai ma lo stavo scrivendo come hai appena scritto tu adesso... :D
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.... :?

yoghi871
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! :roll:
Intanto Ti ringrazio in modo infinito, e ti chiedo questo ultimo sforzo poi non ti romperò più.... :-D

yoghi871
"Sergio":

Sì, ma cambierebbero pesantemente molte cose.....


c'è una guida per far cambiare queste cose (curiosità mia! :D )

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

vict85
"yoghi87":
[quote="Sergio"]
Sì, ma cambierebbero pesantemente molte cose.....


c'è una guida per far cambiare queste cose (curiosità mia! :D )

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

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ù :cry:) comunque non capisco l'utilità di usare i makefile in un esame... tanto vale dare codice e versione compilata (a meno che non si preoccupi delle opzioni di compilazione).
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).

luca260786
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!!!!!!!!!!!!!!!! :(

yoghi871
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

yoghi871
è vero mi andava in conflitto con mingw! GRAZIE

luca260786
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:

#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!!!!!!!!

luca260786
Va bene provo e ti faccio sapere!!!!!!!!!!!!!!

vict85
"Sergio":

Se ti dà errori analoghi, verifica che esista il file /usr/include/stdio.h (non si sa mai...)


:shock: non mi è mai successo che un compilatore non avesse stdio.h

luca260786
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!!!!!!!!!!!!

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

vict85
"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".

luca260786
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!!!!!!!!!!!!!!!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.