Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - risolvitore di equazioni di secondo grado. Problema con sqrt(x)
Forum - Pascal - risolvitore di equazioni di secondo grado. Problema con sqrt(x)

Avatar
tullio1995 (Normal User)
Rookie


Messaggi: 59
Iscritto: 20/03/2011

Segnala al moderatore
Postato alle 18:15
Mercoledì, 23/03/2011
Codice sorgente - presumibilmente Delphi

  1. program equazioni;
  2. uses crt;
  3. var a,b,c,d,e,g:INTEGER
  4. f:REAL;
  5. begin
  6. clrscr;
  7. writeln('Inserisci a: ');
  8. readln(a);
  9. writeln('Inserisci b: ');
  10. readln(b);
  11. writeln('Inserisci c: ');
  12. readln(c);
  13. d:=(b*b)-(4*a*c);
  14. f:=sqrt(d);
  15. e:=2*a;
  16. g:=d+f div e;
  17. writeln('il risultato è ',c);
  18. readln;
  19. end.


mi da l'errore "ERROR:Incompatible types: got EXTENDED expected SMALLINT"
mi sapete aiutare?

Ultima modifica effettuata da tullio1995 il 23/03/2011 alle 21:37
PM
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Up
1
Down
V
Segnala al moderatore
Postato alle 21:48
Mercoledì, 23/03/2011
Sarò sintetico, anche perchè basta leggere gli errori del compilatore :)
Se bisogna dividere due interi ed ottenere un risultato di tipo integer, si può (deve ??) usare l'operatore DIV ... bene alla riga 16 non mi sembrano 2 interi, ma un real e un integer dunque l'operatore DIV si altera un po' ... detto ciò lascio a voi la soluzione
G.

Non ho capito bene cosa hai detto...?? - tullio1995 - 23/03/11 22:03
Semplicemente che non puoi dividere un Real con un DIV ed ottenere un integer come per magia. Però, Goblin, l'errore del compilatore non sembra proprio quello.... ?? - a_butta - 23/03/11 22:23
quindi dovrei mettere tutte le variabili ad real? - tullio1995 - 23/03/11 22:26
a_butta, l'errore è 'got EXTENDED expected SMALLINT' che tradotto in ita(g)liano suona come "mi hai dato un extended(real) ma io voglio un integer", e nella riga 16 cerchi di fare il DIV di un real (f) da qui l'errore. - Goblin - 24/03/11 11:21
Giusto!! :) :) Non avevo considerato che Extended era real e che il Freepascal non ti dà Integer ma SmallInt XD... Scusate per l'imprecisione, ma non sono molto abituato al fp :) - a_butta - 24/03/11 20:36


Ibis redibis non morieris in bello
PM
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 20:12
Mercoledì, 23/03/2011
linea?

come linea? - tullio1995 - 23/03/11 21:37
se intendevi la riga dell'errore 14,11 - tullio1995 - 23/03/11 21:39
PM
Avatar
Saladino (Member)
Pro


Messaggi: 90
Iscritto: 30/05/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 7:31
Giovedì, 24/03/2011
Credo che il problema sia alla riga 16,che ancora non ho capito a cosa serva, dove tu sommi un reale con un intero.

Codice sorgente - presumibilmente Pascal

  1. g:=d+f div e;



con le dichiarazioni che hai fatto è sbagliata.

Se vuoi risolvere puoi arrotondare f con la funzione round,cioè

Codice sorgente - presumibilmente Pascal

  1. g:=d+Round(f) div e;



O se no fare il cast ad Int64
Codice sorgente - presumibilmente Pascal

  1. g:=d+Int64(f) div e;



anche se sicuramente è meglio usare round(è stata creata proprio per situazioni di questo tipo)

Infine,la cosa più importante e che il compilatore non segnala dando poi un runtime error,devi cambiare la variabile d in un tipo reale in modo tale che la sqrt funzioni.

Per rivederti i tipi reali http://www.freepascal.org/docs-html/prog/progsu144.html

Per la FUNZIONE SQRT che accetta valori in entrata reali http://www.freepascal.org/docs-html/rtl/system/sqrt.html


P.S
Credo che dovresti sostituire quell' è con un e'
Codice sorgente - presumibilmente Plain Text

  1. writeln('il risultato è ',c);



con
Codice sorgente - presumibilmente Plain Text

  1. writeln('il risultato e'' ',c);


Ultima modifica effettuata da Saladino il 24/03/2011 alle 7:33
PM
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 10:44
Giovedì, 24/03/2011
Testo quotato

Codice sorgente - presumibilmente Delphi

  1. program equazioni;
  2.       uses crt;
  3.       var a,b,c,d,e,g:INTEGER
  4.       f:REAL;
  5.       begin
  6.       clrscr;
  7.       writeln('Inserisci a: ');
  8.       readln(a);
  9.       writeln('Inserisci b: ');
  10.       readln(b);
  11.       writeln('Inserisci c: ');
  12.       readln(c);
  13.       d:=(b*b)-(4*a*c);
  14.       f:=sqrt(d);
  15.       e:=2*a;
  16.       g:=d+f div e;
  17.       writeln('il risultato è ',c);
  18.       readln;
  19.       end.




salve,
ci sono un pò di errori:

1) prima di calcolare
Codice sorgente - presumibilmente Plain Text

  1. f:=sqrt(d);


devi assicurarti che d sia maggiore o uguale a 0, se no ti va in errore;

2) le soluzioni sono due, g1 e g2, che vanno dichiarate Real;

3) la formula corretta è:
Codice sorgente - presumibilmente Plain Text

  1. g1 := (-b - f) / e
  2. g2 := (-b + f) / e

;

4) nella writeln mostri il termine noto anziche' il risultato;

ciao. :k:

Ultima modifica effettuata da gigisoft il 24/03/2011 alle 10:48
Hai ragione,non me ne sono che fosse un programma per risolvere equazioni,credevo che fosse di prova per testare qualcosa. Meno male che ci sei tu! - Saladino - 25/03/11 09:28
PM