Category Archives: Pascal

Ripetizione precalcolata

Il ciclo con controllo in testa assume spesso una forma standardizzata

nella quale

  • I, una variabile intera è utilizzata come contatore di controllo, indice, all’interno della sequenza
  • 1, il valore iniziale della variabile è assegnato prima del ciclo
  • +1, il valore della variabile è modificato (incrementato…) a ogni passo
  • N, la ripetizione termina se la variabile supera un certo valore fissato.

In questi casi tutta la scrittura è convenientemente riassunta nella struttura di controllo For

Se l’indice deve essere decrementato

Ripetizione con controllo in testa

ciclo120Ripetere più volte l’esecuzione di una sequenza (con decisione in testa alla sequenza)

Decide se
eseguire istruzione 1, istruzione 2, … e poi ritornare in alto

oppure

proseguire direttamente con le istruzioni successive.

Rispetto alla ripetizione con controllo in coda c’è la possibilità che la sequenza controllata non venga eseguita neanche una volta.

Si potrebbe risolvere lo stesso problema aggiungendo alla ripetizione con decisione in coda una decisione ulteriore in testa.

Decide (selezione singola) se eseguire o meno il blocco costituito da una ripetizione (con decisione in coda)

Si può fare ma… è troppo complicato, meglio utilizzare la possibilità di controllo in testa dell’esecuzione…

Ripetizione con controllo in coda

ciclo2Ripetere più volte l’esecuzione di una sequenza (con decisione in coda alla sequenza)

Dopo aver eseguito

istruzione 1
istruzione 2

decide se ripetere la loro esecuzione o continuare con le istruzioni successive.

Note

  • La sequenza controllata è stata eseguita almeno una volta.
  • Le istruzioni controllate devono necessariamente modificare il valore di A, altrimenti la ripetizione non avrebbe mai termine.
  • La ripetizione avviene finché l’espressione non è vera…

Alternativa ciondolante

Considera attentamente i due diagrammi di flusso e le codifiche corrispondenti

ifcio1
ifcio2

Un programmatore inesperto potrebbe produrre, per il secondo diagramma di flusso, il codice seguente

Purtroppo il compilatore lo interpreterà come corrispondente al primo diagramma…

  • il compilatore non prende in considerazione l’indentazione ma associa correttamente l’Else all’ultimo If rimasto aperto
  • il ramo Else si sposta da sinistra verso destra, ciondola
  • l’uso delle etichette di apertura e chiusura dei blocchi risolve l’ambiguità.

Il programmatore alle prime armi dovrebbe utilizzare sempre le etichette di inizio e fine blocco, anche nel caso di istruzioni singole, per evitare di incorrere nell’errore dell’else ciondolante.

Selezioni annidate

if4Le condizioni perché dei blocchi siano eseguiti a scapito di altri possono essere complicate…

Procedi in modo top-down utilizzando sempre le etichette di inizio e fine blocco

Top…

…down

… down

Se l’uso delle istruzioni annidate risulta complesso è consigliabile utilizzare delle selezioni esplicite per ogni singolo blocco di istruzioni a costo di espressioni logiche più complesse…

Selezione multipla 2

if3nDecidere quale eseguire tra tante sequenze alternative di istruzioni

 Se le espressioni E, E1, E2, … sono di tipo semplice si può utilizzare una struttura di controllo che permette un’interpretazione molto fedele al diagramma di flusso

Se più casi richiedono lo stesso trattamento si possono raggruppare per intervalli e per valori singoli

Selezione multipla

Decidere quale eseguire tra tante sequenze alternative di istruzioni

Dopo aver eseguito istruzione 0 decide quale blocco eseguire in funzione del valore assunto dall’espressione E.

Se E = E1 esegue

istruzione 11
istruzione 12

altrimenti se E = E2 esegue

istruzione 21
istruzione 22

altrimenti esegue

istruzione n1
istruzione n2

e poi continua eseguendo istruzione n+1.

if3n
Non è necessario introdurre un costrutto di controllo a più uscite perché il diagramma di flusso si può trasformare nel successivo (esempio con 3 scelte…) dove cambia l’interpretazione ma non il comportamento dell’algoritmo.Dopo aver eseguito istruzione 0 decide se eseguire

istruzione 11
istruzione 12

oppure continua e quindi decide se eseguire

istruzione 21
istruzione 21

oppure

istruzione 31
istruzione 32

e quindi continua eseguendo istruzione 4.

if32

Top…

…down

Si può semplificare il codice, e rimanere più aderenti al primo diagramma di flusso, cambiando l’indentazione delle istruzioni ed eliminando le etichette di blocco superflue

Istruzioni singole…

Note

  1. Il valore assunto dell’unica espressione E decide quale blocco verrà eseguito
  2. Un solo blocco sarà eseguito in esclusiva
  3. Prima dell’Else finale possono essere inseriti ulteriori blocchi di tipo Else If (con E3, E4, …)
  4. L’ultimo blocco Else è facoltativo (quindi si può prevedere che nessuna sequenza di istruzioni venga eseguita).

Selezione doppia

if2Decidere quale eseguire tra due diverse sequenze di istruzioni

Dopo aver eseguito l’istruzione 0 decide se eseguire
istruzione 11
istruzione 12

oppure

istruzione 21
istruzione 22

e poi continua eseguendo istruzione 3.

Istruzioni singole…

In Pascal non c’è il punto e virgola prima dell’else perché il costrutto ifelse è considerato un’istruzione unica.

Selezione singola

ifDecidere se eseguire o meno una o più istruzioni

Dopo aver eseguito istruzione 0 decide se eseguire

istruzioni 11
istruzioni 12

e poi continua eseguendo istruzione 2

Se viene controllata l’esecuzione di singole istruzioni si può semplificare la scrittura

Sequenza

Una sequenza di istruzioni, allineate in verticale (attraversate dalla freccia del tempo dall’alto verso il basso)

L’esecutore eseguirà prima l’istruzione 1, poi l’istruzione 2 e infine l’istruzione 3

seq1
Le istruzioni possono essere scritte sulla stessa riga e la loro esecuzione procederà da sinistra verso destra…

seq2