Diagrammi di flusso con FlowRun

Breve guida per capire e utilizzare FlowRun e scrivere semplici algoritmi e programmi tramite diagrammi di flusso.

  1. Utilizzo
  2. Come e quali blocchi utilizzare
    1. Declare (dichiarazione)
    2. Input (lettura) e Output (scrittura)
    3. Assign (assegnazione)
    4. If (se … fai … altrimenti fai …)
    5. While (finchè … fai …)
    6. Do While (fai … finchè …)
    7. For (conta da … a … facendo …)
  3. Funzioni

Utilizzo

Aprire FlowRun all’indirizzo flowrun.io. Selezionare Start coding. Apparirà questa schermata:

Pe rimpostare un layout più comodo, selezionare l’icona delle opzioni del programma e selezionare l’opzione Show functions.

Selezionare poi una freccia, ad esempio all’inizio l’unica presente fra Begin e End, e selezionare quale blocco inserire fra quelli proposti dal programma:

Come e quali blocchi utilizzare

FlowRun differisce dagli schemi spesso fatti alla lavagna in quanto necessita di una dichiarazione esplicita delle variabili usate (blocco Declare) e dal fatto che non permette alle frecce di essere disegnate e connessa a piacere con i blocchi.

Declare (dichiarazione)

Il blocco Declare introduce, cioè dichiara, nel programma una variabile, che può avere un nome a piacere (senza spazi) come ad esempio, x, y, z, nome, numero, base, altezza o qualunque altro nome.

Maiuscole e minuscole fanno differenza, Nome è diverso da nome, quindi per non confondersi conviene scegliere una convenzione e mantenerla per tutto il diagramma. Ad esempio consiglio di scrivere sempre in minuscolo.

Nel primo campo, digitare il nome della variabile che si vuole introdurre nel programma, in questo caso x.

Nel secondo campo, bisogna scegliere il tipo della variabile. Ogni variabile ha un tipo, concetto comune in molti linguaggi di programmazione. Dovete dire che tipo di dati verrà memorizzato nelle variabili dichiarate.

Possibili tipi:

  • Integer: numeri interi come 0, 1, 2, 3, …, -4, -5, …
  • Real: numeri con la virgola come 0, 1.5, 3.14, -2.79, …
  • String: del testo come "Roma", "Italia", "lunedì", "Giovanni", "casa", "scuola", …
  • Boolean: può assumere solo il valore vero (true) o falso (false).

Nel caso dei numeri, selezionate sempre Integer a meno che non ci siano motivi validi per selezionare Real.

Attenzione: la virgola decimale è sostituita dal punto . secondo la convenzione anglosassone. Le stringhe, cioè il testo, devono sempre essere incluse fra virgolette "…".

Ignoriamo per ora i tipi che contengono le parentesi quadre []: questi sono array e matrici che non ha molto senso usare qui nei diagrammi ma dopo nel codice python, tramite tipi dedicati come list.

Quando il programma viene eseguito e si raggiunge un blocco Declare, la variabile dichiarata inizia a esistere nello stato del programma. Se si tenta di utilizzare la variabile prima che questa sia dichiarata, si riceve un messaggio d’errore.

In FlowRun, quando si dichiara una variabile, questa inizialmente non avrà alcun valore, si dice cioè che non è inizializzata. Usare una variabile non inizializzata genera un errore.

Una variabile può e, quando possibile, deve essere inizializzata al momento della sua dichiarazione impostandone il valore nel terzo campo, in questo campo l’espressione a + 20.

I possibili valori possono essere sia delle costanti sia delle espressioni composte da altre variabili, es:

  • 0, false, "", …
  • a + b, "Ciao " + nome, sum / count, x + 1, …

Attenzione alle costanti booleane true e false: queste devono essere scritte senza virgolette "…", in quanto non sono stringhe ma valori speciali. Non confondere true con "true" e false con "false".

Nelle espressioni è possibile utilizzare le operazioni:

  • + addizione per numeri e concatenazione per stringhe.
  • - sottrazione.
  • * moltiplicazione.
  • / divisione, sia per numeri interi che per numeri reali.
  • % resto della devisione nel caso di numero interi, detto modulo.

È possibile anche usare le parentesi tonde ( e ) come nelle espressioni matematiche. Se sono necessari più livelli di parentesi, usate sempre le tonde, non le quadre o le graffe, es. ((a + b) * c - d) / e, FlowRun e i linguaggi di programmazione riescono a comprendere di quello che si vuole indicare. Parentesi quadre e graffe hanno altri usi.

Input (lettura) e Output (scrittura)

I blocchi Input e Output chiedono all’utente (lettura) o comunicano all’utente (scrittura) il valore di una variabile o, in generale, scrivono un’espressione nella console del programma, il testo sulla destra o in basso che il programma scrive e dove l’utente scrive gli input.

Durante la lettura, l’utente inserisce un valore e questo viene assegnato alla variabile, sovrascrivendo l’eventuale valore precedente memorizzato in precedenza. Nell’esempio viene letta la variabile name. La variabile deve essere stata dichiarata in precedenza.

Durante la scrittura, il valore della variabile viene comunicato all’utente, lasciando la variabile inalterata. È un errore scrivere una variabile se a questa non è stato ancora assegnato un valore. Nell’esempio viene scritta la variabile x.

È anche possibile scrivere un’espressione, intesa come valore composto da una o più variabili, ad esempio x + y oppure "Ciao " + nome se nome è una variabile di tipo stringa. Il programma scriverà la somma o la concatenazione delle due variabili.

Assign (assegnazione)

L’assegnazione imposta una variabile a un determinato valore, cioè assegna quel valore alla variabile già dichiarata. Abbiamo visto che questo è anche possibile tramite il blocco Input, tramite cui alla variabile viene assegnato un valore dato dall’utente. Con il blocco Assign invece il valore viene calcolato dal programma.

L’assegnazione può essere usata per assegnare a una variabile un valore, come nell’esempio seguente c = a + b. La variabile c deve esistere, cioè deve essere stata dichiarata in precedenza.

È possibile usare qualunque espressione, anche complessa, in un’assegnazione.

Non dichiarare una variabile e per poi assegnargli un valore subito dopo. Specifica direttamente quel valore nel blocco Declare.

L’assegnazione è per cambiare valore a una variabile presistente. Si può usare il valore della stessa variabile poco prima che questa cambi valore, ad esempio nel caso n = n + 1, che incrementa la variabile n di uno.

If (se … fai … altrimenti fai …)

Valuta una condizione, cioè un’espressione o una domanda che può avere solo risposta vero o falso. In caso vero, il programma prosegue con i blocchi sulla destra. In caso falso, il programma prosegue con i blocchi sulla sinistra. Al termine il programma continua dritto.

L’espressione ha tipicamente una forma che può avere solo risposta vero o falso, ad esempio x > 0, x > y, x == y, country == "Italia", …

Non sono espressioni valide: x + y, x - 5, … in quanto la loro risposta non può essere solo vero o falso, non sono cioè valide espressioni booleane.

Le condizioni possono essere scritte con gli operatori:

  • == uguale
  • != diverso
  • > maggiore, >= maggiore o uguale
  • < minore, <= minore o uguale

Le condizioni possono essere composte insieme tramite operazioni not (!), and (&&) e or (||).

Alcuni esempi per comprendere meglio:

  • a > b && c < d, vera se a è maggiore di b E c è minore di d, cioè se sia la prima che la seconda condizione sono vere. Entrambe devono essere vere (and).
  • name == "Carlo" || a == b, vera se name è Carlo O a è uguale a b, cioè se la prima condizione oppure la seconda condizione (o entrambe) sono vere (or). Almeno una deve essere vera.
  • a > b && b > c && c > d, tutte e 3 le condizioni devono essere vere.
  • (a > b && b > c) || a == c, sia la prima che la seconda condizione devono essere vere (and), oppure la terza condizione deve essere vera (or).
  • ! valid, ad esempio se esiste una variabile valid booleana e in questo caso la condizione è vera se questa variabile è falsa.

While (finchè … fai …)

Per comprendere meglio questo blocco, immaginare si chiami finché, che è una traduzione in italiano di mentre più adatta a rappresentare il comportamento del blocco.

Così come il blocco If visto in precedenza, il blocco While introduce una condizione che deve essere scritta in forma di espressione vero o falso, cioè un’espressione booleana. Nell’esempio riportato si chiede se x sia diverso da zero.

Ricordatevi che != significa diverso da. Si possono naturalmente usare tutti gli operatori booleani e le parentesi come illustrato nel paragrafo precedente.

Il blocco introduce una ripetizione (loop). I blocchi sulla destra vengono ripetuti finché la condizione è vera. La condizione viene valutata all’inizio di ogni ripetizione. Si ripete fino a quando la condizione rimane vera, cioè finché x è diverso da zero.

Quando la condizione diventa falsa, il ciclo si interrompe e il programma continua dopo il ciclo. Se la condizione è falsa fin dall’inizio, i blocchi sulla destra non vengono eseguiti neanche una volta.

Do While (fai … finchè …)

Così come il blocco While visto precedentemente, il blocco Do While introduce una condizione che deve essere scritta in forma di espressione vero o falso, nell’esempio riportato si chiede se x sia maggiore di 5.

Il blocco introduce una ripetizione (loop). I blocchi sulla destra vengono ripetuti finché la condizione è vera. La condizione viene valutata alla fine di ogni ripetizione. Si ripete fino a quando la condizione rimane vera.

Quando la condizione diventa falsa, il ciclo si interrompe e il programma continua dopo il ciclo. I blocchi sopra la condizione vengono eseguiti almeno una volta, anche se la condizione è falsa fin dall’inizio: questa è la differenza fondamentale tra While e Do While. In questo caso il contenuto del blocco viene eseguito almeno una volta. Nel caso di While è possibile che il contenuto non venga mai eseguito.

Il loop Do While in pratica si usa poco e non tutti i linguaggi hanno questa funzionalità. Ad esempio python non lo supporta ma, se necessario, si può scrivere con le istruzioni while, if e break. Consiglio di non usarlo mai.

For (conta da … a … facendo …)

Il blocco For ripete le istruzioni sulla destra un determinato numero di volte. Introduce una variabile, tipicamente chiamata i, un contatore, che viene inizializzato a un numero, tipicamente 0, e incrementato ogni volta di 1 fino a raggiungere un valore massimo (incluso) impostato nell’esempio a 10.

In questo caso il blocco viene ripetuto 11 volte. Il contatore i è una variabile vera e propria gestita e incrementata dal blocco For che può essere usata nelle istruzioni ripetute, es. se messa in un’istruzione Output questa stamperà tutti i numeri da 0 a 11, come nell’esempio.

Sia il valore di inizio, di fine e l’incremento possono essere espressioni, es. si può chiedere all’utente fino a che numero n contare e poi usare n come valore massimo nel blocco For.

Quando usare While? Quando usare For? Usare While quando il numero di ripetizioni non è noto a priori, es. finché l’utente non scrive zero. Usare For quando il numero di ripetizioni è noto, es. ripeti 10 volte oppure anche ripeti n volte dove n è una variabile: il valore di n non è noto finché il programma non viene eseguito ma quando viene eseguito il valore di n è noto e il numero di ripetizioni è quindi fissato a n.

Funzioni

FlowRun riconosce alcune funzioni che possono essere usate nelle espressioni di inizializzazione di una variabile, di assegnazione, di Output e nelle espressioni condizionali.

Alcuni esempi:

  • randomInt(n) - un numero casuale tra 0 e n.
  • length(s) - la lunghezza della stringa s, ovvero di quanti caratteri è composta.
  • abs(n) - il valore assoluto di n.
  • real2int(n) - la parte intera di n, cioè n senza le sue cifre decimali.
  • sqrt(n) - la radice quadrata di n.

La funzione readInput() senza alcun parametro può essere usata per abbreviare i diagrammi ed condensare 2 blocchi Declare e Input in un solo blocco Declare usando la funzione come valore iniziale della variabile.

L’elenco completo di tutte le funzioni supportate è disponibile nella documentazione di FlowRun.