Differenze tra le versioni di "Pascal/Istruzioni di controllo"

nessun oggetto della modifica
m (Robot: Changing template: Programmare in Pascal)
 
== Strutture di selezione ==
 
=== Selezione binaria ===
 
In alcuni degli esempi precedenti si è analizzata la struttura ''if''...''then''...''else''; vediamo nello specifico in cosa consiste.<br/>
 
Nella pratica, questo costrutto consente la scelta fra due alternative: '''se''' (''if'') una certa condizione è vera '''allora''' (''then'') il programma esegue una certa istruzione (semplice o composta), '''altrimenti''' (''else'') ne esegue un'altra:
'''if''' condizione '''then''' istruzione
'''else''' istruzione;
che come abbiamo già visto permette la scelta fra un caso vero e un caso falso e in base a questo esegue il contenuto del ''then'' o dell'''else''; tuttavia a volte il ramo in ''else'' non &egraveé; strettamente utile o addirittura non serve.
 
Quando le istruzioni che seguono il ''then'' o l'''else'' sono più di una esse devono essere delimitate da istruzioni ''begin'' e ''end'' (sono istruzioni composte):
 
<source lang=pascal>
if condizione then
end;
</source>
 
Si noti come le istruzioni che precedono ''end'' ed ''else'' non debbano essere seguite da punto e virgola
 
*acquisire il numero
*eseguire una selezione binaria: ''se'' il numero è positivo,''allora'' ne calcola la radice quadrata e espone il risultato;''altrimenti'' stampa un messaggio di errore;
 
<source lang=pascal>
program radice_quadrata;
end.
</source>
 
=== Selezione multipla ===
 
Con l'uso del costrutto <code>case... of</code> è possibile eseguire selezioni più complesse. La sintassi è:
 
<source lang=pascal>
case espressione of
end;
</source>
 
Con il costrutto ''case'', il valore dell'espressione in testa viene confrontato con il valore di ogni singolo caso; quando viene trovato un valore che soddisfa le condizioni sul selettore vengono eseguite le istruzioni relative al blocco in questione; poi il controllo passa alla prima istruzione dopo il costrutto ''case''.
Se nessun valore soddisfa il selettore viene eseguita l'ultimo blocco di istruzioni individuato dalla parola chiave '''else''' (se questo blocco è stato inserito). Se la parte con ''else'' viene omessa e il selettore non eguaglia nessuno dei casi in elenco, si passa anche in questo caso alla prima istruzione dopo il costrutto ''case''.
 
<br/>Quando c'è solo un istruzione che segue un certo caso si possono omettere ''begin'' e ''end'' (questo perché, in realtà, le istruzioni delimitate da begin ed end si possono considerare come un'unica istruzione).<br/>Occorre fare attenzione che il costrutto ''case'' termina con un ''end''.
 
Occorre fare attenzione che il costrutto ''case'' termina con un ''end''.
Facciamo un esempio del costrutto case:
 
<source lang=pascal>
case contatore of
end;
</source>
 
Ecco di seguito alcune considerazioni sull'esempio proposto:
*è stata omesso il blocco facoltativo '''else'''
 
== Strutture Iterative ==
 
In Pascal abbiamo diversi tipi di strutture iterative (in genere vengono detti "''cicli''"). Una struttura iterativa prevede la ripetizione di un'istruzione semplice o composta secondo delle condizioni poste all'inizio o alla fine della struttura.
 
=== Iterazione con contatore ===
 
Questa struttura ci permette di ripetere una determinata serie di istruzioni per un numero finito di volte modificando man mano il valore di una variabile. La sua sintassi è:
 
<source lang=pascal>
for Contatore:=valore_iniziale to valore_finale do
end;
</source>
 
Nella pratica questo costrutto consente la ripetizione di un certo gruppo di istruzioni fino a quando la variabile contatore raggiunge un certo valore: '''per''' (''for''') contatore:=valore_iniziale '''fino a''' (''to'') valore_finale '''esegui''' (''do'') un blocco d'istruzioni racchiuso tra ''begin'' ed ''end''.<br/>
 
<code>Contatore</code> è una variabile (di solito vengono usate le lettere I,L,M,N,J,K) che da un valore iniziale cresce di un certo valore ad ogni ripetizione fino a che non raggiunge il valore finale, che rappresenta il valore per il quale il ciclo terminerà.
 
L'iterazione può anche procedere in modo che la variabile contatore decresca a ogni ciclo; in questo caso la sintassi è:
 
<source lang=pascal>
for Contatore:=valore_iniziale downto valore_finale do
end;
</source>
 
Facciamo un esempio: implementiamo un programma che calcoli la somma dei primi n numeri naturali usando un ciclo <code>for</code> (senza usare la nota formula <math>\frac{n + (n + 1)}{2}</math>).<br/>
Il programma deve:
*tramite un ciclo for, sommare tutti i numeri da 1 a n;
*esporre il risultato.
 
<source lang=pascal>
program sommatoria;
end.
</source>
 
Analizziamo il programma riga per riga:
*dichiarazione del programma;
*dichiarazione delle variabili: i è la variabile contatore, n funge da valore finale del ciclo for, q è di volta in volta il quadrato di i mentre s è la somma dei numeri naturali fino a n;
*inizio del programma
*la somma &egrave;é inizialmente uguale a 0;
*messaggio di testo;
*il programma legge n;
*i := 2, diverso da 50, quindi il ciclo continua;
*s := s + i, cioè s:=1+2; infatti la variabile s aveva valore 1 alla fine della prima fase del ciclo.
*reiniziaricomincia il ciclo; i:=3,diverso da 50,quindi il ciclo continua;
*s := s + 1;cioè s := 3 + 3;
*e così via, fino a quando i sia diverso da 50.
 
=== Iterazione con condizione in testa ===
 
Una struttura di iterazione con condizione in testa è tradotta in Pascal con il ciclo '''while... do'''
La sua sintassi è:
 
<source lang=pascal>
while condizione do
end;
</source>
 
Ovvero: '''mentre'''(''while'') una determinata condizione è vera '''esegui'''(''do'') le istruzioni all'interno del ciclo.<br/>
Fino a quando la condizione è vera, il ciclo viene eseguito.<br/>
 
Fino a quando la condizione è vera, il ciclo viene eseguito.<br/>
Tra '''begin''' ed '''end''' vanno inserite le istruzioni che cambiano in qualche modo il valore di verità della condizione. Questo è molto importante perché altrimenti il ciclo si ripeterebbe all'infinito e il programma non riuscirebbe mai a giungere alle righe che seguono l'istruzione '''end'''. Questo è un comune errore che con un po' di attenzione può essere evitato. Se vi è una sola istruzione '''begin''' e '''end''' possono essere omessi.
Ad esempio:
 
<source lang=pascal>
...
...
</source>
 
In questo esempio viene eseguito quanto indicato all'interno del ciclo finché viene verificata la condizione, cioè ad x viene sommato 1 fino a che il suo valore non sia uguale a 5,e quindi la condizione iniziale del ciclo diventi falsa.
 
=== Iterazione con condizione finale ===
 
Per chiudere il discorso riguardo alle strutture di controllo analizziamo il ciclo con condizione finale, che in Pascal si traduce con un ciclo '''repeat... until'''
 
La sua sintassi e':
 
<source lang=pascal>
repeat
until condizione;
</source>
 
In sostanza questo ciclo ripete le istruzioni comprese tra ''Repeat'' ed ''Until'' (dall'inglese,''finché'') fino al verificarsi della condizione espressa, detta anche condizione di uscita. Anche in questo caso occorre porre attenzione al fatto che la condizione di uscita diventi vera in qualche modo, altrimenti finiamo in un loop infinito perdendo il controllo del programma.
 
Ad esempio:
 
<source lang=pascal>
x:=1;
until x=5;
</source>
 
In questo caso x viene sommato a 1 fino a che il suo valore non sia diverso da 5; quando x=5 si esce dal ciclo.
 
=== Un confronto ===
 
Nel caso del ciclo '''For''' il numero di cicli eseguiti è noto, poiché il contatore parte da un elemento iniziale ed arriva fino all'elemento finale. Nel caso di '''While''' e di '''Repeat Until''' il numero di volte che viene ripetuto il ciclo generalmente non è noto a priori, in quanto dipende dal cambiamento che subisce la variabile che controlla la condizione.
 
&Egrave;È daimportante notare che le istruzioni del ciclo '''Repeat Until''' verranno eseguite almeno una volta poichèpoiché la condizione viene verificata alla fine, dopo il codice del ciclo; un ciclo '''While''', essendo la sua condizione testata prima dell'esecuzione del codice associato al ciclo, potrebbe, se questa risulta falsa, non fare nulla e riprendere dalle istruzioni che si trovano dopo il ciclo. Questo può risultare utile in particolari casi come in altri può essere causa di bug.
 
[[Categoria:Pascal|Istruzioni di controllo]]
5 034

contributi