PDA

View Full Version : problema virgola mobile in pascal [PLZ HELP]


Ph@t3
04-11-2003, 18:11
Ho un problema col programmino qui sotto.... non capisco perchè a un certo punto mi da errore di virgola mobile... vi prego, mi serve per domani :cry:
Plz, ditemi se è un problema di codice oppure del mio pc thx!

cipi
04-11-2003, 18:25
Non ho un compilatore pascal da circa 10 anni... In che riga ti da errore?

Ph@t3
04-11-2003, 18:28
non mi da una riga specifica, me lo da dopo l'esecuzione... :cry:
Cmq ora mi cerco un compilatore che giri sotto winzozz e non sotto dos e provo con quello

cipi
04-11-2003, 18:35
mi dispiace... è passato troppo tempo dal mio ultimo programma pascal. comunque io dichiarerei "dis" di tipo integer...
AIMSORRI... ;)

Ph@t3
04-11-2003, 18:37
Ora provo... thx lo stesso

cipi
04-11-2003, 18:47
Cmq qui trovi un tutorial essenziale di TP:
http://library.thinkquest.org/27297/
Ma come mai usi un linguaggio tanto vecchio? Forse il tuo prof è un primitivo:huh: ????????

Ph@t3
04-11-2003, 18:51
Al liceo scientifico si usa solo il Pascal :(
Cmq thx per il link

a2000
04-11-2003, 18:56
http://www.area.trieste.it/html/press/magazine/10/10_10.htm


Area News
Invecchiare meglio
di Franco Del Campo



Negli Stati Uniti e in Giappone guardano a Trieste come se si trattasse di un prezioso "laboratorio" aperto sul futuro. La città, infatti, sembra aver anticipato con ampio margine una tendenza alla denatalità e all'invecchiamento della popolazione, tipica dei Paesi ricchi e industrializzati dell’occidente.

Questa ragione ha spinto AREA Science Park a fare da battistrada ad un nuovo progetto di grande interesse sociale, la costituzione del Centro Studi sulla Società Anziana, un’iniziativa che, sin dal suo esordio, ha raccolto l'adesione di molte istituzioni pubbliche e private. Oltre ad AREA e al Comune di Trieste, la lista dei soggetti promotori del CSSA coniuga istituzioni "forti" con partner privati e del mondo del no profit: Università di Trieste, Regione Friuli-Venezia Giulia, Comune di Duino-Aurisina, Azienda per i Servizi sanitari e l'Azienda ospedaliera, Istituto regionale per gli studi di servizio sociale, Iacp, Uneba, Ital-Tbs, Televita, Centro studi principe, Consorzio Senior Italia e Associazione De Banfield.

La conferma che Trieste sia considerata una "città laboratorio" da istituti di ricerca internazionali, viene da Giorgio Stanta, dell'Istituto di Anatomia Patologica dell'Università di Trieste, coordinatore scientifico del Registro dei tumori della provincia di Trieste e coordinatore di un gruppo di ricerca presso il Centro Internazionale di Ingegneria Genetica e Biotecnologia. "Già da molti anni, fin dal 1989 - spiega Stanta - collaboriamo con prestigiose organizzazioni internazionali, come il National Institute of Aging del NIH degli Stati Uniti, per lo studio della società anziana. Senza dubbio Trieste ¿ un esempio unico al mondo, che anticipa di quasi trent'anni la condizione di invecchiamento e di denatalità che sarà tipica nel prossimo futuro e per questo viene studiata attentamente. Guardando l'andamento demografico di questo secolo abbiamo visto che a Trieste fino agli anni Trenta e Quaranta c'era una fortissima mortalità infantile; poi ci si è spostati verso le età intermedie, ma da 30 anni la popolazione è stabile con un progressivo invecchiamento. Senza dubbio a Trieste si vive di più, probabilmente per la diminuzione dello stress fisico, forse per una diffusa cultura del movimento e una migliore qualità della vita. Comunque è importante che il Centro Studi sulla Società Anziana raccolga informazioni scientifiche da tutto il mondo sugli anziani e le trasmetta ai diretti interessati, che possono essere i medici di base o gli stessi anziani".

Vediamo, allora, quali sono le caratteristiche, le specialità che hanno fatto di Trieste un "laboratorio" unico al mondo sulla società anziana. L'ultimo censimento Istat (1991) rilevava che in Italia la percentuale della popolazione anziana (oltre i 65 anni) nell'ultimo secolo era più che raddoppiata, passando dal 6% al 15,3%, ma nel 2030 la percentuale di anziani supererà il 25%.

A Trieste, secondo i dati dell'anagrafe comunale (1996), questa situazione e già consolidata, con un indice di invecchiamento pari a 269 (ogni 100 giovani ci sono 269 ultra sessantacinquenni) e una popolazione di "grandi vecchi" (oltre gli 80 anni) che supera le 16.000 persone.

...

a2000
04-11-2003, 18:59
cipi pensa a trombare !

a2000
04-11-2003, 20:05
del:=b*b-4*a*c;
x1:=(-b-sqrt(del))/(2*a);
x2:=(-b+sqrt(del))/(2*a);


bello bello e ... per esempio ... , il controllo sul delta positivo prima della radice quadrata ?

a2000
04-11-2003, 20:06
e ... per esempio ... , quello di a <> 0 (abs(a) > macheps) ?

a2000
04-11-2003, 20:08
devi essere bravo, semplificare ===> e ridurre le righe di codice ad 1/3 di quelle che hai scritto !

Ph@t3
04-11-2003, 20:11
e come posso fare a ridurre le linee di codice? A me sembrano il minimo indispensabile... lo so sono niubbo di programmazione :D
Potresti per piacere spiegarmi come lo dovrei scrivere? Thx mille

a2000
04-11-2003, 20:17
ma con valori dei coefficienti che danno un delta positivo (e con a<>0) ti dà l'errore ?

a2000
04-11-2003, 20:18
(sempre e comunque prima la sostanza)

questo si impara dopo

Ph@t3
04-11-2003, 20:22
si.. mi da errore qualunque cosa faccia :(

a2000
04-11-2003, 20:27
bene, allora facciamo un po' di destructive debugging:

1) sostituisci gli input da tastiera con input da codice (metti in commento le righe sostituite)

run & test

2) forza del a un valore assegnato da codice (>0)

run & test

3) elimina in successione i blocchi di If mettodoli in commento

run & test

Ph@t3
04-11-2003, 20:36
ho provato a fare come mi hai detto, ma al primo punto c'è una cosa che mi sfugge...
in che senso "sostituisci gli input da tastiera con input da codice "?

a2000
04-11-2003, 20:53
'writeln('Tipo di disequazione');
'writeln('1 - [>0] 2 - [<0] 3 - [>=0] 4 - [<=0]');
dis := 1 'readln(dis);
'writeln('Quanto vale a?');
a := 2 'readln(a);
'writeln('Quanto vale b?');
b := 3 'readln(b);
'writeln('Quanto vale c?');
c := -5 'readln(c);

Ph@t3
04-11-2003, 21:07
col codice che mi hai dato funziona perfettamente ma solo con alcuni valori... e solo con disequazione > 0

EDIT: ora ho provato nuovamente col codice originale e inserendo una delle 3 variabili da tastiera negativa funziona tutto.... perchè mai deve essere negativa? :muro:

a2000
04-11-2003, 21:12
fino a quale step di debugging sei arrivato ? (1, 2, 3)

con quali valori non funziona ?

a2000
04-11-2003, 21:17
Originariamente inviato da Ph@t3
col codice che mi hai dato funziona perfettamente ma solo con alcuni valori... e solo con disequazione > 0

EDIT: ora ho provato nuovamente col codice originale e inserendo una delle 3 variabili da tastiera negativa funziona tutto.... perchè mai deve essere negativa? :muro:

a ma cazzo, se il discriminante del = b * b - 4 * a * c è negativo e ci fai la radice quadrata ti dà un errore di run time :

devi fare il test di positività sul delta

Ph@t3
04-11-2003, 21:17
ho fatto solo il primo, ma credo che sia li il problema....
per esempio inserendo in ordine:
1
-2
1

Funziona con tutte e 4 le opzioni...
ma non funziona con tutti i valori e non riesco a capire perchè.
Inserendo per esempio
3
2
1

non funge + :muro:

Ph@t3
04-11-2003, 21:18
e come lo faccio il test di positività sul delta? :D
lo metto in un "if...then"?

a2000
04-11-2003, 21:21
se il delta è negativo ci sono due radici complesse e coniugate

se a > 0 la parabola ha concavità verso l'alto, giace tutta nel semipiano positivo e quindi è sempre dis>0

se a < 0 la parabola ha concavità verso il basso, giace tutta nel semipiano negativo e quindi è sempre dis < 0

(se a=0 delta=b*b>0)

amen

Ph@t3
04-11-2003, 21:24
forse ora ci sono!!!! Guarda un po se così ti pare corretto, a me pare fungere!

a2000
04-11-2003, 21:27
Originariamente inviato da Ph@t3
e come lo faccio il test di positività sul delta? :D
lo metto in un "if...then"?

per domani sì (anche perchè adesso vado a vedere Il Re Leone con mia figlia) e tratti adeguatamente i casi relativi (a>0, a<0)

dopo ti faccio vedere la riduzione del codice a 1/5 delle righe (vogliamo dire 9 righe ?)

Ph@t3
04-11-2003, 21:28
wow!! Tutto in 9 righe??? Splendido... e dire che a me pareva già corto così :D

a2000
04-11-2003, 21:32
Originariamente inviato da Ph@t3
forse ora ci sono!!!! Guarda un po se così ti pare corretto, a me pare fungere!

e co' sto' cazzo di WinRar .

comunque sì se hai adeguatamente "manipolato" i casi per delta<0 andrà bene.

comunque ti anticipo che:
1) la morte sua dal punto di vista della semplificazione sintattica sarà il costrutto Select Case (up to 20 righe di codice)

2) la morte sua sull'algoritmo sarà un po' di semplificazione algebrica (up to 8-9 righe)

Ph@t3
04-11-2003, 21:39
wow :D. Se porto sto programma in 9 righe al mio prof mi promuove direttamente adesso :cool:
Cmq ora il prog funziona benissimo.. gli ho detto di dirmi che la disequazione non ha soluzioni reali quando il delta è < 0 e ora non si impalla più :cool:
Thx mille per tutto!!

a2000
04-11-2003, 21:43
cioè non è che non ha soluzioni reali, non ha radici reali, ma è sempre dis>0 per a>0 e dis<0 per a<0 e sono casi che devi considerare.

comunque per ora va bene così.

notte.

Ph@t3
04-11-2003, 21:46
Bè certo, ma quelli li considero domani :D
Notte anche a te :)

cipi
05-11-2003, 15:19
Originariamente inviato da a2000
cipi pensa a trombare !


...ma mi do da fare!!! Ho trombato nei primi 5 giorni del mese dodici ultra80, otto ultra90, e due oltre100... :old:
Non mi sembra male, vero? :D :D :D
Il fatto è che me le ruba tutte wicasa.... che si sa essere un :oink:
ciao

a2000
05-11-2003, 15:49
Originariamente inviato da cipi
...ma mi do da fare!!! Ho trombato nei primi 5 giorni del mese dodici ultra80, otto ultra90, e due oltre100... :old:
...


cosa vuoi a Trieste vi dovete adattare ! :D

a2000
06-11-2003, 14:02
3 righe di calcolo + l'input dati:



Sub Ph@t3()
a = 1
b = 2
c = 4
dis = 2 '1 - [<0] 2 - [<=0] 3 - [>=0] 4 - [>0]'
dis = dis - 2.5
If a = 0 Then Exit Sub


d = b * b - 4 * a * c
If d >= 0 Then: x1 = 0.5 * (b - Sqr(d)) / a: x2 = 0.5 * (b + Sqr(d)) / a
msg$ = "La disequazione è verificata " & Choose(Sgn(d) + 2, _
Choose((Sgn(a) * Sgn(dis) > 0) + 2, "per tutti i valori di R", "per nessun valore di R"), _
Choose((Sgn(a) * Sgn(dis) > 0) + 2, "per tutti i valori di R, " & Choose((Abs(dis) < 1) + 2, "incluso x1=x2= " & x1, "escluso x1=x2= " & x1), IIf(Abs(dis) < 1, "solo per x1=x2= " & x1, "per nessun valore di R")), _
"per tutti i valori " & Choose((Sgn(a) * Sgn(dis) > 0) + 2, "esterni", "interni") & " a x1= " & x1 & " e x2= " & x2 & Choose((Abs(dis) < 1) + 2, ", inclusi x1 e x2", ", esclusi x1 e x2"))


End Sub

Ph@t3
06-11-2003, 14:13
wow :D
Ma come faccio a scriverlo in pascal? Non serve scrivere "program"? E il begin?
Perchè ho provato a scriverlo così, ma non funge, mi chiede il begin.
Mi potresti spiegare un po il codice? Le sub non le abbiamo ancora viste :mc:
Thx!!

a2000
06-11-2003, 15:27
no, lo puoi scrivere direttamente come main program senza bisogno di subroutine.

il problema è piuttosto l'esistenza del costrutto di selezione Choose in Pascal:


Funzione Choose

Seleziona e restituisce un valore da un elenco di argomenti.

Sintassi

Choose(indice, scelta-1[, scelta-2, ... [, scelta-n]])

La sintassi della funzione Choose è composta dalle seguenti parti:

Parte Descrizione
indice Obbligatoria. Espressione numerica o campo che restituisce un valore compreso tra 1 e il numero delle scelte disponibili.
scelta Obbligatoria. Espressione Variant contenente una delle scelte possibili.



Osservazioni

Choose restituisce un valore dell'elenco di scelte in base al valore di indice. Se indice è 1, Choose restituisce la prima scelta dell'elenco; se indice è 2, restituirà la seconda scelta e così via.



se l'equivalente di Choose c'è e lo puoi usare bene, senno' o ti fai un function (ma direi che è ancora presto) o usi gli If Then con qualche riga in più (poche) ma guadagnando in leggibilità.

Ph@t3
06-11-2003, 15:36
Quindi in teoria potrei scriverlo così com'è?
Le subrutine sarebbero i "sub" vero?
Cmq ora faccio un po di prove, poi ti dico :D

a2000
06-11-2003, 15:47
sì, sì più o meno (Pascal, Basic e Fortran sono fratelli anzi Padre e figli :D ): se trovi l'equivalente della funzione Choose devi fare solo qualche correzione sintattica.

tieni conto però che il tuo prof. potrebbe arricciare il naso perchè è troppo compatto e quindi poco leggibile ...
comunque i parametri di selezione delle varie "frasi" sono tre:

1) segno di delta <0, =0, >0
2) segno del prodotto a*dis >0, <0
3) un indice di disequazione in senso stretto 0, 1

un'altra soluzione è caricare una matrice di frasi msg$(1 To 3, 1 To 2, 1 To 2)

da cui estrai quella che ti serve in base ai tre indici calcolati.