Vai al contenuto
Elettronica e Didattica

Risorse di elettronica, elettrotecnica e tecnologia varia per studenti curiosi.

Classe terza

Algoritmi e diagrammi di flusso

Il concetto di algoritmo e i suoi requisiti, i simboli e le strutture di controllo dei diagrammi di flusso, la programmazione strutturata e alcuni esempi risolti.

Il concetto di algoritmo

Quando si parla di evoluzione di un sistema, si parla di un processo che accade o può accadere. L’algoritmo è la descrizione di tale processo mediante una successione di fasi che conducono alla realizzazione di un obiettivo prefissato.

L’esempio più comune per chiarire questo concetto è la preparazione del caffè:

  1. Mettere l’acqua e il caffè nella caffettiera.
  2. Chiudere la caffettiera.
  3. Mettere la caffettiera sul fornello.
  4. Accendere il gas.
  5. Attendere la bollitura.
  6. Spegnere il gas.
  7. Servire nella tazza.

Un algoritmo è adatto a descrivere un sistema: allo stesso modo di quest’ultimo, accetta dati in ingresso, effettua un’elaborazione e restituisce dati in uscita. Affinché sia un metodo realistico ed efficace per la risoluzione di un problema, deve soddisfare i seguenti requisiti:

  1. Finitezza: deve portare alla conclusione mediante un numero finito di passi; in particolare, non deve contenere cicli infiniti.
  2. Non ambiguità: deve essere interpretabile in modo univoco da qualsiasi esecutore.
  3. Determinismo: deve portare a risultati noti a priori sulla base dei valori di ingresso.
  4. Realizzabilità: deve essere realizzabile con le risorse disponibili.

Diagramma di flusso: strutture principali

Un diagramma di flusso è una rappresentazione visuale del problema, esposto secondo precise regole formali: è una mappa concettuale del processo. I simboli principali sono i seguenti:

Simboli del diagramma di flusso: elaborazione, inizializzazione, input/output, condizione, inizio e fine
Simboli principali dei diagrammi di flusso.
  • Elaborazione: è l’istruzione da compiere.
  • Inizializzazione: imposta le variabili di input ai valori iniziali.
  • Input/output: lettura degli ingressi e scrittura delle uscite.
  • Inizio: punto di inizio dell’algoritmo.
  • Condizione: stabilisce l’istruzione successiva sulla base di un test (ad esempio vero/falso).
  • Fine: punto di termine dell’algoritmo.

Le strutture di controllo fondamentali, alla base degli algoritmi, sono le seguenti.

Sequenza semplice

Terminata l’elaborazione del blocco 1, il processo passa all’elaborazione del blocco 2.

Due blocchi in successione: blocco 1 e blocco 2

Selezione multipla

All’inizio della struttura viene posta una condizione, che può essere vera o falsa. A seconda della risposta a tale condizione, il processo segue un ramo o l’altro.

Condizione con due rami, vero e falso, che si ricongiungono

Selezione semplice

C’è un solo ramo, corrispondente a una sola delle risposte (ad esempio vero); se si verifica l’altra risposta, il processo prosegue con l’istruzione successiva, senza eseguire un’elaborazione specifica.

Condizione con un solo ramo che esegue istruzioni; l'altro ramo prosegue direttamente

Ciclo post-condizionale

Esegue una sequenza di istruzioni finché una determinata condizione non diventa vera (o falsa). La condizione viene controllata dopo l’esecuzione del blocco di istruzioni, pertanto la sequenza di istruzioni viene eseguita almeno una volta.

Ciclo post-condizionale: sequenza di istruzioni seguita dalla condizione

Ciclo pre-condizionale

Esegue un controllo sulla condizione prima di eseguire le istruzioni, pertanto può accadere che tali istruzioni non siano mai eseguite.

Ciclo pre-condizionale: la condizione precede la sequenza di istruzioni
Illustrazione: nel ciclo pre-condizionale si controlla il bordo prima di camminare, nel post-condizionale si cammina prima di controllare
Fig. 1 – Differenza fra il ciclo post-condizionale e il ciclo pre-condizionale.

Ciclo iterativo

È un particolare ciclo pre-condizionale in cui una variabile interna è incrementata fino a raggiungere un valore massimo e a ogni iterazione viene eseguito un blocco di istruzioni.

Ciclo iterativo: inizializzazione i = 0, condizione i ≤ 10, istruzioni, incremento i = i + 1
Fig. 2 – Esempio di ciclo iterativo.

Programmazione strutturata. È un criterio per la stesura di algoritmi che impone l’utilizzo di sole tre strutture di controllo fondamentali: sequenza, selezione e iterazione. Un programma ben strutturato facilita la leggibilità, la comprensione, la verifica della funzionalità, la correzione e l’aggiornamento.

Il teorema di Böhm–Jacopini stabilisce che, utilizzando solamente queste tre strutture, è possibile realizzare qualsiasi algoritmo.

Alcuni esempi di algoritmi

Maggiore fra due numeri

L’algoritmo riceve in input due numeri, li pone a confronto tramite un blocco di selezione e restituisce il maggiore. Vengono usate le variabili NUM1 e NUM2 per leggere i dati di input e MAG per salvare il risultato.

Diagramma di flusso per il maggiore fra due numeri

Maggiore fra tre numeri

Il risultato del confronto fra i primi due numeri viene confrontato con il terzo. Il secondo confronto è affidato a una selezione semplice: se la condizione risulta falsa, non deve essere intrapresa alcuna azione. In generale lo stesso problema può avere più algoritmi risolutivi.

Diagramma di flusso per il maggiore fra tre numeri

Esempi

ES. 1. Avendo a disposizione un secchio da 4 litri e uno da 3 litri, descrivere l’algoritmo per riempire il secchio da 4 litri con 2 litri d’acqua.

  1. Riempire il secchio da 4 l.
  2. Travasare nel secchio da 3 l.
  3. Svuotare il secchio da 3 l.
  4. Trasferire il litro rimasto nel secchio da 3 l.
  5. Riempire di nuovo il secchio da 4 l.
  6. Travasare nel secchio da 3 l (ne entrano 2 l).
  7. Nel secchio da 4 l restano 2 l.
Diagramma di flusso dell'algoritmo dei due secchi

ES. 2. Trasformare i numeri negativi in positivi.

Diagramma di flusso: leggi un numero, se è minore di 0 moltiplicalo per −1, comunica il numero positivo

ES. 3. Conto alla rovescia di 20 secondi prima di lanciare il razzo.

Diagramma di flusso del conto alla rovescia con ciclo pre-condizionale su secondiMancanti

Il conto alla rovescia usa un ciclo pre-condizionale: finché secondiMancanti è maggiore di 0, se ne sottrae uno; quando la condizione diventa falsa, si comunica «lancio effettuato».