PDA

View Full Version : TurboPascal


metallic
18-02-2006, 21:00
Ciao!!

Qui porgo, a chi programma in Turbo Pascal le mie domande, per ora ne ho 2:

-Ciclo FOR
-Variabili di tipo BYTE/WORD

1) Ho letto su un manuale che per terminare un ciclo FOR bisogna mettere END; (con punto e virgola), ma se faccio così sia FreePascal che TurboPascal 7.0 mi da errore dicendo che si aspetta un punto, probabilmente quest'istruzione non è valida. Io però voglio che mi venga stampato a video tre volte un messaggio e terminato il ciclo FOR ne venga mostrato un altro, ho fatto così:

PROGRAM test_iterazioni;
VAR A : INTEGER;
BEGIN
FOR A:= 3 DOWNTO 1 DO
WRITELN('Conto alla rovescia ',a);
WRITELN('BOOM!');
READLN;
END.

In effetti questo produce l'effetto desiderato, ma non riesco a capire come il compilatore riesca a capire che deve ripetere "BOOM!" una sola volta mentre l'istruzione precedente 3, in altre parole vorrei capire come fa a sapere che il primo WRITELN fa parte di FOR ed il secondo no.
Qualcuno me lo spiega? Un ciclo FOR esegue una sola istruzione e bisogna perciò definire un ciclo FOR per ogni singola istruzione?
O esiste effettivamente un'istruzione che termina il ciclo?

2)Che differenza c'è fra le due?

DarkRevenge
18-02-2006, 21:27
E' da tanto che non programmo in Pascal, ma da quello che ricordo il blocco di istruzioni del for doveva essere racchiudo da BEGIN e END;. Per fare un esempio banale col tuo programma:
PROGRAM test_iterazioni;
VAR A : INTEGER;
BEGIN
FOR A:= 3 DOWNTO 1 DO
BEGIN
WRITELN('Conto alla rovescia);
WRITELN(a);
END;
WRITELN('BOOM!');
READLN;
END.

Se non racchiudi le istruzioni tra begin e end; il compilatore considera solo la prima istruzione come blocco del for.

Per quanto riguarda la seconda domanda la differenza sta nella memoria utilizzata per salvare i dati (BYTE = 8bit, WORD = 16bit), e quindi nel range di valori che possono contenere le variabili dichiarate con quei tipi (BYTE = 0...255, WORD = 0...65535).

metallic
18-02-2006, 21:52
Ah ok grazie!!

Per quanto riguarda la memoria utilizzata, è in questo modo che si ottimizzano i programmi?

DarkRevenge
18-02-2006, 22:05
Ah ok grazie!!

Per quanto riguarda la memoria utilizzata, è in questo modo che si ottimizzano i programmi?

Beh non proprio... il concetto di ottimizzazione di programmi è qualcosa di molto più complesso, e spesso la differenza tra un tipo di dato e l'altro non si sente neanche in termini di prestazioni. Certo che anche queste piccole cose possono contribuire a creare un programma leggero, ed è inutile occupare più memoria di quanta realmente ne serve.

metallic
18-02-2006, 22:14
Beh non proprio... il concetto di ottimizzazione di programmi è qualcosa di molto più complesso, e spesso la differenza tra un tipo di dato e l'altro non si sente neanche in termini di prestazioni. Certo che anche queste piccole cose possono contribuire a creare un programma leggero, ed è inutile occupare più memoria di quanta realmente ne serve.

Ah... Beh le imparerò in seguito, ma è possibile fare queste ottimizzazioni in Pascal no?

Sullo stesso sito (meglio che abbandono quel manuale perchè è pieno di caxate) ho trovato scritto che questo programma

PROGRAM potenza;
USES crt;
VAR a,b,c,i:INTEGER;
BEGIN
WRITELN('Inserisci un numero');
READLN(A)
WRITELN(' Inserisci esponente ');
READLN(B);
FOR I:= 1 TO b DO
c:=a*a;
END;
WRITELN('Il risultato della potenza è ' ,c);
READLN;
END.

Dovrebbe generare una potenza con una base ed un esponente QUALSIASI, invece nemmeno funziona. Io l'ho modificato così, ma per qualsiasi valore mi restituisce 0:

PROGRAM potenza;
USES crt;
VAR a,b,c,i:INTEGER;
BEGIN
WRITELN('Inserisci un numero');
READLN(A)
WRITELN(' Inserisci esponente ');
READLN(B);
FOR I:= 1 TO b DO
c:=a*a;
END;
WRITELN('Il risultato della potenza è ' ,c);
READLN;
END.

Ora, so che non può restituire effettivamente una potenza qualsiasi (perchè quel FOR dice di eseguire b volte quel calcolo, non di elevare a b la var. a (a proposito, com'è che si potrebbe fare ad ottenere quello scopo?), ma dovrebbe almeno resistuirmi il valore di a*a ossia a elevato alla seconda no? Cosa sbaglio? È solo curiosità, perchè esiste un modo molto più semplice per calcolare l'elevato 2, ossia:

PROGRAM elevato_due;
VAR a : INTEGER;
BEGIN
WRITE('Inserisci il numero da elevare alla seconda: ');
READLN(a);
WRITE('Il risultato è: ',a*a);
READLN;
END.

P.S. Ora tu in cosa programmi?

caviccun
19-02-2006, 23:49
Ah... Beh le imparerò in seguito, ma è possibile fare queste ottimizzazioni in Pascal no?

Sullo stesso sito (meglio che abbandono quel manuale perchè è pieno di caxate) ho trovato scritto che questo programma



Dovrebbe generare una potenza con una base ed un esponente QUALSIASI, invece nemmeno funziona. Io l'ho modificato così, ma per qualsiasi valore mi restituisce 0:



Ora, so che non può restituire effettivamente una potenza qualsiasi (perchè quel FOR dice di eseguire b volte quel calcolo, non di elevare a b la var. a (a proposito, com'è che si potrebbe fare ad ottenere quello scopo?), ma dovrebbe almeno resistuirmi il valore di a*a ossia a elevato alla seconda no? Cosa sbaglio? È solo curiosità, perchè esiste un modo molto più semplice per calcolare l'elevato 2, ossia:



P.S. Ora tu in cosa programmi?

scusa l'intromissione , anche io ho usato T.P , ed adesso uso delphi. delphi è un liguaggio visuale che si appoggia al T.P , cioè la sintassi è la stessa , ci sono le uses , ecc , assolutamente uguale , solo che , invece di usare readln si usano le caselle di testo , invece di write , l'output esce su finestre , tutto quì , ti basta poco per impadronirti del sistema , e poi potresti scrivere programmi in windows , che , se sei d'accordo , sono i più usati sui pc attuali. puoi usare facilmente i database , compreso access , che ti permetterebbe di scivere programmi personalizzati per piccoli magazzini , cosa che , con T.P è un pochino problematico.

leadergl
20-02-2006, 12:57
Ci sono vari errori nel tuo codice, ecco quello "corretto":

{01}Program Potenza;
{02}Uses crt;
{03}Var
{04} Base, Esponente: integer;
{05} iIndice, Risultato: integer;
{06}Begin
{07} Write('Inserire il numero da elevare: ');
{08} readln(Base);
{09} Write('Inserire l''esponente a cui elevare il numero: ');
{10} readln(Esponente);
{11}
{12} Risultato:=Base;
{13} IF (Esponente=0) then
{14} Risultato:=1
{15} ELSE IF (Esponente=1) then
{16} Risultato:=Base
{17} ELSE BEGIN
{18} FOR iIndice:=2 to Esponente DO
{19} Risultato:=Risultato*Base;
{20} END;
{21}
{22} Writeln('Il risultato e'': ',Risultato);
{23} readln;
{24}End.

Qui sono i tuoi errori:
TUO CODICE:
FOR I:= 1 TO b DO
c:=a*a;

CODICE CORRETTO:
Risultato:=Base;
FOR iIndice:=2 to Esponente DO
Risultato:=Risultato*Base;

k0nt3
20-02-2006, 19:22
scusa l'intromissione , anche io ho usato T.P , ed adesso uso delphi. delphi è un liguaggio visuale che si appoggia al T.P , cioè la sintassi è la stessa , ci sono le uses , ecc , assolutamente uguale , solo che , invece di usare readln si usano le caselle di testo , invece di write , l'output esce su finestre , tutto quì , ti basta poco per impadronirti del sistema , e poi potresti scrivere programmi in windows , che , se sei d'accordo , sono i più usati sui pc attuali. puoi usare facilmente i database , compreso access , che ti permetterebbe di scivere programmi personalizzati per piccoli magazzini , cosa che , con T.P è un pochino problematico.
wow anchio ho iniziato col TP :D mitico! penso che però è meglio che impara un pò il pascal prima di passare a delphi.. almeno si toglie qualche dubbio come quello che ha postato.. senza complicarsi con oggetti e interfaccie! poi il passaggio a delphi è gratis :)

metallic
23-02-2006, 21:51
Ci sono vari errori nel tuo codice

Fosse il mio quel codice... C'era scritto su un manuale! :confused:
L'ho già sostituito :cool:

ecco quello "corretto":

2 alla terza fa 16? :D

C'è qualcosa di sbagliato nel codice...
Però prima di questo, me lo spiegheresti passo-passo? Così leggendolo non riesco a capire esattamente cosa fa, le funzioni della varie variabili (in particolare iIndice),ecc...
grazie

Comunque, "uses [...]" a cosa serve?

e poi potresti scrivere programmi in windows

Ho trovato Dev-Pascal (un IDE eccellente, ma devo ancora imparare ad usarlo :() che permette di scrivere programmi in Pascal in concomitanza con le GTK o le API di Windows :D

k0nt3
23-02-2006, 22:13
Fosse il mio quel codice... C'era scritto su un manuale! :confused:
L'ho già sostituito :cool:

bel manuale ;)

2 alla terza fa 16? :D

C'è qualcosa di sbagliato nel codice...
Però prima di questo, me lo spiegheresti passo-passo? Così leggendolo non riesco a capire esattamente cosa fa, le funzioni della varie variabili (in particolare iIndice),ecc...
grazie
allora indice non è altro che una variabile che conta il numero di cicli.. non serve all'algoritmo in se, ma al programma per capire quando finire di ciclare :)
per capire devi fare una tabella dove scrivi il valore delle variabili passo-passo.
esempio: decidi di mettere base=2 e esponente=2
quindi risultato alla riga "risultato=base" diventa 2, poi indice diventa 1, il ciclo viene eseguito perchè 1<esponente, e vai avanti nel ciclo e per tutti i cicli :D

adesso non mi ricordo più l'esatto comportamento di FOR indice:=1 TO esponente.. forse si comporta come <= e non come <, e quindi il ciclo viene eseguito anche con indice=esponente (sarebbe l'errore di cui parlavi)

Comunque, "uses [...]" a cosa serve?

serve a includere librerie nel tuo programma. una libreria non è altro che un file scritto in PASCAL (però con estensione *.unit) contenente delle funzioni che poi puoi usare nei tuoi programmi. crt credo che contiene le funzioni per stampare a schermo ad esempio (è troppo che non uso pascal.. :help: )

Ho trovato Dev-Pascal (un IDE eccellente, ma devo ancora imparare ad usarlo :() che permette di scrivere programmi in Pascal in concomitanza con le GTK o le API di Windows :D
vacci piano con la grafica.. prima devi essere sicuro con gli algoritmi ;)

leadergl
23-02-2006, 22:19
ho corretto l'algoritmo ;)
m'ero scordato di far partire il FOR da 2 visto che:
Base^0=1
Base^1=Base
Base^X= ... (con X>1)

metallic
23-02-2006, 22:27
FOR iIndice:=1 to Esponente DO
Risultato:=Risultato*Base;

Non riesco a capire questo:
mettiamo che la base è 2 e l'esponente è 3, allora lui esegue tre volte Risultato*Base, ovvero tre volte 2*2
Ma poi quando ha i tre risultati (4,4,4) cosa ne fa? Come fa a restituirci il risultato della potenza? Credo che la soluzione stia nella seconda riga, ma non riesco proprio a coglierla... :mc:

metallic
23-02-2006, 22:28
ho corretto l'algoritmo
m'ero scordato di far partire il FOR da 2 visto che:
Base^0=1
Base^1=Base
Base^X= ... (con X>1)

Buono :cool:

Non è che ti potresti unire alla spiegazione? Non riesco a capire bene il funzionamento di FOR... :confused: :muro: :muro: :muro:

k0nt3
23-02-2006, 22:33
Non riesco a capire questo:
mettiamo che la base è 2 e l'esponente è 3, allora lui esegue tre volte Risultato*Base, ovvero tre volte 2*2
Ma poi quando ha i tre risultati (4,4,4) cosa ne fa? Come fa a restituirci il risultato della potenza? Credo che la soluzione stia nella seconda riga, ma non riesco proprio a coglierla...
fidati.. fai una tabellina ;) la prima volta risultato è uguale a base (a causa dell'assegnamento prima del ciclo), quindi risultato*base = base*base che è il nuovo valore di risultato! la seconda volta quindi risultato*base sarebbe (base*base)*base e lo metti in risultato... riesci a seguire?

metallic
23-02-2006, 22:39
Aaaaaaah ora è chiaro!!!

Va a riprendere il risultato del calcolo di prima giusto? E lo "ricicla" fino alla fine del ciclo FOR?

Io credevo che una volta che il ciclo fosse ricominciato avrebbe azzerato tutto...

Questa è una di quelle cose per cui deve scattare la "scintilla" in testa, prima non c'è modo di capirla :D

metallic
23-02-2006, 22:42
serve a includere librerie nel tuo programma. una libreria non è altro che un file scritto in PASCAL (però con estensione *.unit) contenente delle funzioni che poi puoi usare nei tuoi programmi.

Non vorrei abusare della tua pazienza :D

Ma... Queste librerie sono indispensabili? Cioè io non sapevo nemmeno esistessero... Ne serve almeno una per I/O o no? Perchè con FreePascal non ne ho mai avuto la necessità... Altre dove le trovo?

k0nt3
23-02-2006, 22:50
Aaaaaaah ora è chiaro!!!

Va a riprendere il risultato del calcolo di prima giusto? E lo "ricicla" fino alla fine del ciclo FOR?

Io credevo che una volta che il ciclo fosse ricominciato avrebbe azzerato tutto...

Questa è una di quelle cose per cui deve scattare la "scintilla" in testa, prima non c'è modo di capirla :D
:cool: si comporta così perchè la variabile risultato è sempre la stessa e quindi non è riinizializzata ad ogni ciclo :)
Non vorrei abusare della tua pazienza

Ma... Queste librerie sono indispensabili? Cioè io non sapevo nemmeno esistessero... Ne serve almeno una per I/O o no? Perchè con FreePascal non ne ho mai avuto la necessità... Altre dove le trovo?
si le librerie sono indispensabili, ma alcuni compilatori includono di default quelle basilari sapendo che senza le librerie puoi solo assegnare valori a variabili :D poco utile!
comunque se hai una reference per il pascal.. se cerchi la funzione che vuoi utilizzare di solito c'è scritto se devi includere qualche libreria in particolare. il tuo manuale non ne parla (anche se è scarsamente affidabile :D )? sennò prova a googlare

k0nt3
23-02-2006, 22:54
questa è quella che io chiamo reference http://www.math.uni-hamburg.de/it/software/fpk/units/node1.html spero che te la cavi con l'inglese :)
ci sono tutte le funzioni divise per libreria (o unità in pascal)

k0nt3
23-02-2006, 23:03
effettivamente crt non ti serve nel programma di prima... writeln e readln sono funzioni che non sono in nessuna librerie, ma sono proprio incluse nel pascal! ok adesso è chiaro..

leadergl
24-02-2006, 08:42
Ciao,
ieri ti avevo anche commentato il codice in un altro post (oltre a correggere i piccoli errori) ma poi ho premuto un tasto sbagliato ed ho perso tutto...mi rompevo di riscrivere il tutto ma lo faccio adesso:


{01}Program Potenza;
{02}Uses crt;
{03}Var
{04} Base, Esponente: integer;
{05} iIndice, Risultato: integer;
{06}Begin
{07} Write('Inserire il numero da elevare: ');
{08} readln(Base);
{09} Write('Inserire l''esponente a cui elevare il numero: ');
{10} readln(Esponente);
{11}
{12} Risultato:=Base;
{13} IF (Esponente=0) then
{14} Risultato:=1
{15} ELSE IF (Esponente=1) then
{16} Risultato:=Base
{17} ELSE BEGIN
{18} FOR iIndice:=2 to Esponente DO
{19} Risultato:=Risultato*Base;
{20} END;
{21}
{22} Writeln('Il risultato e'': ',Risultato);
{23} readln;
{24}End.


Analizziamo questo codice riga per riga inserendo per prima la "teoria" sull'elevazione a espenente:

Se prendiamo un generico numero (Base) e lo vogliamo elevare a potenza (Esponente): X^Y (simbolo che si trova in genere sulle calcolatrici) dobbiamo moltiplicare il nostro numero (Base) per se stesso (Base) tante volte quanto è il valore dell'esponente meno una dato che:

Base=2 Esponente=5
2^0=1
2^1=2 (che è la nostra Base di esempio)
2^2=4
2^3=8
2^4=16
2^5=32
32 è quindi il nostro risultato che è anche dato da: 2*2*2*2*2=32

Questo (2*2*2*2*2)=(2^5) si analizza in programmazione nel seguente modo:
1) Si ricerca il caso Base (o i casi base)
2) Si ricerca il passo induttivo

Siccome il nostro problema è molto semplice è un po esagerato parlare di "passo induttivo"...comunque:
1) Il caso, o i casi, base è quella particolare situazione in cui non c'è alcun bisogno di fare dei calcoli perchè il risultato è noto per qualsiasi valore di ingresso (in questo caso per qualsiasi valore della nostra base).

I nostri casi base saranno quando l'esponente è UGUALE a 0 oppure UGUALE ad 1 perchè in entrambi i casi i valori di uscita sono conosciuti:
Base^0=1
Base^1=Base

2) Il nostro "passo induttivo" è invece quella formulazione matematica del problema che ci permette di scindere il problema in sotto-problemi di più semplice risoluzione sino ad arrivare ad una serie di problemi talmente semplici che si possono risolvere tramite i nostri casi base.
Come detto nel nostro problema questo non serve poichè è un problema semplicissimo (ed anche perchè in genere questo modo di procedere si utilizza con le funzioni ricorsive), comunque vediamo il nostro algoritmo che effettua la moltiplicazione:
(2*2*2*2*2) = (2^5)

{12} Risultato:=Base;
{13} IF (Esponente=0) then
{14} Risultato:=1
{15} ELSE IF (Esponente=1) then
{16} Risultato:=Base
{17} ELSE BEGIN
{18} FOR iIndice:=2 to Esponente DO
{19} Risultato:=Risultato*Base;
{20} END;


Questo è il vero codice del programma e questo:

{12} Risultato:=Base;
{18} FOR iIndice:=2 to Esponente DO
{19} Risultato:=Risultato*Base;

è la porzione di codice che ci restituisce il risultato.
Siccome abbiamo detto che per esponenti <2 (ovvero 0 ed 1) siamo nel nostro caso base qui dovremo trattare solo esponenti UGUALI o MAGGIORI di 2 e dovremo effettuare l'operazione:
"Base * Base" = Base^2 successivamente
(Base^2) * Base = Base^3
...
(Base ^ (N-1) * Base = Base^N risultato voluto
Che come vedi sono solo delle semplici moltiplicazioni che in programmazione potremmo scrivere:

VAR Risultato, Base, Esponente: Integer;

{se esponente = 5}
Risultato=Base*Base {2}
Risultato=Risultato*Base{3}
Risultato=Risultato*Base{4}
Risultato=Risultato*Base{5}

che semplificato sarebbe:

{18} FOR iIndice:=2 to Esponente DO
{19} Risultato:=Risultato*Base;


Inoltre ho usato USES CRT; poichè volevo mettere il comando:
clrscr; {pulitura schermo}
che fa parte di quella libreria...ma poi mi son dimenticato :p

Spero che adesso sia tutto chiaro, in caso contrario chiedi pure ;)

metallic
25-02-2006, 21:54
questa è quella che io chiamo reference http://www.math.uni-hamburg.de/it/s...nits/node1.html spero che te la cavi con l'inglese


Sì me la cavo discretamente (non molto, ma l'inglese informatico è abbastanza facile...) :D
È molto utile come reference!

Questo è il vero codice del programma e questo:

{12} Risultato:=Base;
{18} FOR iIndice:=2 to Esponente DO
{19} Risultato:=Risultato*Base;

è la porzione di codice che ci restituisce il risultato.
Siccome abbiamo detto che per esponenti <2 (ovvero 0 ed 1) siamo nel nostro caso base qui dovremo trattare solo esponenti UGUALI o MAGGIORI di 2 e dovremo effettuare l'operazione:
"Base * Base" = Base^2 successivamente
(Base^2) * Base = Base^3
...
(Base ^ (N-1) * Base = Base^N risultato voluto

Ti ringrazio del chiarimento sulla logica della programmazione e sul ciclo FOR :D
Non riuscivo a capire come funzionasse perchè pensavo che una volta terminato il ciclo FOR sì ne comincia un altro (finchè la condizione non è falsa), ma pensavo si azzerasse tutto, perciò per me non aveva senso "Risultato:=Risultato*Base;"
Perchè avrebbe dovuto restituire sempre Base*Base...
Ora (dopo :mc: :muro: ) ho capito :cool:

metallic
25-02-2006, 22:00
Ah, vi devo chiedere ancora un aiutino:

non sono riuscito a trovare un manuale DECENTE ed APPROFONDITO (nonché in ITALIANO :cool: ) di TurboPascal in tutta la rete! Roba da matti...

Ne conoscete uno che tratta nei dettagli il TurboPascal (comprese magari le questioni GTK/API) ma che per chi non ha MAI programmato sia semplice da capire? Io ne ho trovato uno che sembra abbastanza completo con eMule, ma è INCOMPRENSIBILE, presuppone già delle buone conoscienze di programmazione...

In alternativa va bene anche un libro (basta che non costi troppo...) cartaceo da ordinare...

Grazie :D

leadergl
26-02-2006, 01:49
Qui ho messo un po di materiale e la guida è molto buona ;)

http://www.leadergl.e1000.it/index.php?PHPSESSID=d7afcb659ab84403a697b4051c3d9dbb&direction=0&order=&directory=Programmazione

k0nt3
26-02-2006, 10:22
in italiano è davvero difficile trovare materiale buono... io ho trovato qualcosa di interessante in inglese :)

http://www.freepascal.org/packages/gtk/tutorial/pgtk-contents.html questo è abbastanza ufficiale per gtk

comunque l'uso di gtk lo considererei un argomento avanzato, ti consiglio di avere prima una buona padronanza del linguaggio.. e magari un'infarinatura sugli oggetti :D

metallic
26-02-2006, 18:02
Qui ho messo un po di materiale e la guida è molto buona


Grazie, sembra davvero una guida molto completa, alla fine dovrei essere abbastanza bravo col TP :D
Spero sia semplice... :(
Credo che la programmazione sia la cosa più difficile dell'informatica (ramo Software)...

in italiano è davvero difficile trovare materiale buono... io ho trovato qualcosa di interessante in inglese

Nel senso che per le GTK gli HOWTO sono scadenti o proprio non ci sono? Figurati, io non ero riuscito a trovare una guida nemmeno in inglese, nemmeno sul sito ufficiale di FreePascal...
Grazie del link :D

comunque l'uso di gtk lo considererei un argomento avanzato, ti consiglio di avere prima una buona padronanza del linguaggio.. e magari un'infarinatura sugli oggetti

Si questo di sicuro, era solo per sapere se c'era qualcosa per il futuro, quando sarò capace di creare buone applicazioni DOS/SHELL...