I diagrammi di flusso
Nell'argomento precedente abbiamo scritto un algoritmo a parole, e poi in pseudocodice, per concentrarci sulla logica del problema senza preoccuparci ancora della sintassi di un vero linguaggio di programmazione. Esiste anche un modo per rappresentarlo graficamente, rendendolo ancora più chiaro da seguire, a colpo d'occhio, senza dover leggere frase per frase come in un lungo testo scritto: il diagramma di flusso, uno degli strumenti piu' usati in assoluto per progettare un algoritmo prima di scriverlo davvero.
Un diagramma di flusso usa alcune forme geometriche standard, sempre le stesse in ogni diagramma indipendentemente da chi lo disegna, collegate da frecce che indicano chiaramente l'ordine di esecuzione dei passi, uno dopo l'altro:
- Ovale: indica l'inizio o la fine dell'algoritmo
- Parallelogramma: indica un dato in ingresso (input) o in uscita (output)
- Rettangolo: indica un passo di elaborazione, un'azione da compiere
- Rombo: indica una decisione, una domanda con risposta sì/no, da cui partono due frecce diverse
I simboli in breve
Ovale = inizio/fine dell'algoritmo. Parallelogramma = input (dato letto) o output (dato scritto). Rettangolo = un'azione, un passo di elaborazione. Rombo = una decisione, con due frecce in uscita per le due risposte possibili (sì/no).
Vediamo subito un esempio concreto, semplice ma completo, per fissare bene le idee: un algoritmo che stabilisce se un numero e' pari o dispari. Si parte (ovale "Inizio"), si legge il numero in input (parallelogramma), si controlla con una decisione (rombo) se il resto della divisione per 2 è zero: se sì, si scrive in output "Pari" (un altro parallelogramma); se no, si scrive "Dispari". Ogni singolo passo di questo breve ragionamento corrisponde esattamente a una delle quattro forme geometriche appena viste, senza eccezioni. Si conclude con l'ovale "Fine". Puoi vedere questo stesso esempio disegnato per intero come diagramma di flusso nello schema riassuntivo qui sotto, con tutte le forme collegate nell'ordine corretto.
Ci sono pero' altri due dettagli pratici da conoscere, utili non appena i diagrammi cominciano a farsi piu' grandi e complessi di questo semplice esempio a due sole decisioni, con molte piu' frecce e caselle da tenere in ordine.
Il verso delle frecce e il connettore
Per convenzione, un diagramma di flusso si legge dall'alto verso il basso e da sinistra verso destra, esattamente come un testo scritto. Quando il diagramma diventa molto grande e le frecce rischierebbero di incrociarsi in modo confuso, si usa un piccolo cerchio numerato chiamato connettore: due connettori con lo stesso numero indicano che il flusso prosegue da un punto all'altro del diagramma, senza dover disegnare una freccia lunghissima.
Quando una freccia torna indietro
Non tutte le frecce di un diagramma di flusso vanno sempre in avanti: a volte, dopo una decisione (rombo), una freccia torna indietro verso un passo precedente, facendo ripetere una parte dell'algoritmo piu' volte. Questa struttura si chiama ciclo o iterazione, ed e' uno dei concetti piu' importanti della programmazione: la incontreremo in dettaglio nell'ultimo argomento di questo corso.
I diagrammi di flusso sono particolarmente utili quando un algoritmo contiene diverse decisioni: seguire le frecce rende visivamente chiaro ogni possibile percorso, molto più che leggere solo del testo riga per riga, soprattutto quando le decisioni si moltiplicano e diventerebbe facile perdersi in una lunga descrizione scritta. Esistono anche programmi dedicati, come Flowgorithm, che permettono non solo di disegnare il diagramma ma anche di eseguirlo davvero, come se fosse un piccolo programma vero e proprio, mostrando i risultati passo dopo passo e permettendo di correggere subito eventuali errori di logica.
Non serve pero' un problema informatico per disegnare un diagramma di flusso: la stessa identica logica di ovali, rettangoli e rombi funziona altrettanto bene anche per rappresentare semplici decisioni quotidiane, di quelle che prendiamo ogni giorno quasi senza pensarci.
Un'idea nata prima dei computer moderni
I diagrammi di flusso non nascono con l'informatica: le prime forme risalgono agli anni '20 del Novecento, nell'ingegneria industriale, per rappresentare i passaggi di un processo produttivo. Furono poi adottati sistematicamente per progettare programmi dai matematici Herman Goldstine e John von Neumann nel 1947, proprio negli anni dei primi calcolatori come l'ENIAC che abbiamo incontrato all'inizio di questo corso.
Forme standard, non a caso
Le forme geometriche usate nei diagrammi di flusso non sono state scelte a caso da ogni singola persona: sono state formalizzate come standard ufficiale dall'ente statunitense ANSI (American National Standards Institute) tra gli anni '60 e '70 del Novecento, proprio per permettere a chiunque, in qualsiasi azienda o scuola del mondo, di leggere un diagramma disegnato da qualcun altro senza fraintendimenti sul significato dei simboli.
Diagrammi di flusso fuori dall'informatica
I diagrammi di flusso non servono solo a programmare: medici e infermieri li usano per rappresentare i protocolli diagnostici (una serie di decisioni per capire come curare un paziente), le aziende li usano per documentare i processi decisionali interni, e persino alcuni manuali di istruzioni li usano per guidare l'utente passo dopo passo tra le opzioni disponibili.
L'evoluzione moderna del diagramma di flusso
Negli anni '90, tre informatici — Grady Booch, James Rumbaugh e Ivar Jacobson, soprannominati scherzosamente "i tre amici" (the three amigos) — svilupparono l'UML (Unified Modeling Language), un insieme di diagrammi standard per progettare software complesso. Tra questi c'e' il "diagramma di attivita'", che è di fatto un'evoluzione moderna e piu' potente del classico diagramma di flusso, ancora oggi usato dagli sviluppatori professionisti.
►VideoLezione - Coding con Flowgorithm (Informatica - Open Source)
►VideoDiagramma di flusso e pseudocodifica: le basi (Andrew)
►VideoRealizziamo un flow chart con AlgoBuild (Prof. Tilocca)Disegna il tuo diagramma
Riprendi uno dei sotto-problemi che hai scomposto nell'argomento precedente (o usa questo nuovo problema: "decidere se portare l'ombrello, in base alle previsioni del tempo"). Disegna a mano su un foglio il diagramma di flusso corrispondente, usando correttamente ovale, parallelogramma, rettangolo e rombo. Scambialo con un compagno e prova a seguirne il percorso passo per passo, verificando che sia chiaro e privo di ambiguità.
Nel prossimo argomento cominceremo finalmente a scrivere i nostri primi veri programmi, usando uno strumento pensato apposta per chi inizia a programmare: Scratch, che tradurra' in blocchi visivi colorati molte delle idee incontrate qui, dalle decisioni ai cicli.
Mettiti alla prova
1. Cosa rappresenta il simbolo a forma di ovale in un diagramma di flusso?
L'inizio o la fine dell'algoritmo.
2. Cosa rappresenta il simbolo a forma di parallelogramma?
Un dato in ingresso (input) o in uscita (output).
3. Cosa rappresenta il simbolo a forma di rombo, e quante frecce ne escono di solito?
Una decisione, una domanda con risposta sì/no; ne escono due frecce, una per ciascuna risposta possibile.
4. Perché i diagrammi di flusso sono particolarmente utili quando un algoritmo contiene molte decisioni?
Perché seguire le frecce rende visivamente chiaro ogni possibile percorso, più facilmente che leggendo solo del testo.
5. Cos'è Flowgorithm, e cosa lo rende particolarmente utile a livello didattico?
È un software che permette di disegnare un diagramma di flusso e anche di eseguirlo davvero, come se fosse un piccolo programma.
6. In che ambito nacquero le prime forme di diagramma di flusso, prima ancora dell'informatica?
Nell'ingegneria industriale, per rappresentare i passaggi di un processo produttivo.
7. Vero o falso: in un diagramma di flusso, il simbolo rettangolare rappresenta sempre una decisione.
Falso: il rettangolo rappresenta un'azione o un passo di elaborazione; la decisione è rappresentata dal rombo.
8. In che verso si legge normalmente un diagramma di flusso?
Dall'alto verso il basso e da sinistra verso destra.
9. A cosa serve il connettore (cerchio numerato) in un diagramma di flusso grande?
A collegare due punti distanti del diagramma senza disegnare una freccia lunghissima che rischierebbe di incrociarsi con altre.
10. Come si chiama la struttura che si crea quando una freccia, dopo una decisione, torna indietro verso un passo precedente?
Ciclo o iterazione.
11. Che cos'e' l'UML, e chi lo sviluppo' negli anni '90?
Un insieme di diagrammi standard per progettare software, sviluppato da Grady Booch, James Rumbaugh e Ivar Jacobson.