Chi sono? Come contattarmi? Introduzione ai Diagrammi di Flusso Matteo Baldoni Dipartimento di Informatica Università degli Studi di Torino Corso Svizzera, 185 I-10149 Torino (ITALY) e-mail: [email protected] URL: http://www.di.unito.it/~baldoni Tel.: +39 011 670 67 56 Fax.: +39 011 75 16 03 Introduzione alla Programmazione e JavaScript Pagina del corso: http://www.di.unito.it/~baldoni/didattica/ “Sono nato a Torino nel 1968, nel febbraio 1993 mi sono laureato con lode in Scienze dell’Informazione e nel febbraio 1998 sono diventato Dottore in Ricerca in Informatica. Dal luglio 1999 sono ricercatore in Informatica presso il Dipartimento di Informatica dell’Università degli Studi di Torino.” Introduzione ai Diagrammi di Flusso Obiettivi di questo corso ■ ■ Gli Algoritmi ■ Introduzione alla programmazione: – Cos’è un algoritmo – Cos’è un programma – Diagrammi di flusso – Concetto di variabile – Linguaggi di programmazione – Interpreti, compilatori Introduzione a JavaScript (client-side): – Core language – Oggetti – Document Object Model (DOM) ■ Un algoritmo è una sequenza di passi che sono necessari per risolvere un determinato problema: una successione finita di istruzioni che definiscono le operazioni da eseguire sui dati assegnati, per produrre risultati. Ogni operazione definisce una azione compiuta sui dati d’ingresso per produrre dati in uscita Risultato Dati di Input Matteo Marco Giovanni Alberto Luisa Carlo Cristina Introduzione ai Diagrammi di Flusso 3 I Programmi ■ 2 Algoritmo di Ordinamento Alberto Carlo Cristina Giovanni Luisa Matteo Marco Introduzione ai Diagrammi di Flusso 4 Scrivere programmi Un programma è la traduzione in un determinato linguaggio di programmazione dell’algoritmo risolutivo del problema in esame. ■ Analisi del problema da risolvere (dati iniziali, risultati attesi, ecc.) ■ Sviluppo dell’algoritmo come sequenza di passi che trasformi i dati iniziali nei risultati desiderati ■ Codifica dell’algoritmo in un linguaggio di programmazione Java Pascal class ordinamenti (…) { … } program ordina (input, output); begin … end. C/C++ JavaScript void ordina (…) { … } function ordina (…) { … } … e altri ancora Introduzione ai Diagrammi di Flusso 5 Introduzione ai Diagrammi di Flusso 6 1 Esempio: il calcolo del M.C.D. Esempio: il calcolo del M.C.D. ■ ■ Si vuole definire un algoritmo per il calcolo del Massimo Comun Divisore (M.C.D.) tra due numeri interi non negativi Proprietà di Euclide (300 a.C.): ognuno dei divisori comuni di due numeri a e b è contemporaneamente divisore sia di a e b, sia del resto r del quoziente di a con b se questo non è nullo: M.C.D. (a, b) = M.C.D. (b, r) dove r = a mod b Es.: M.C.D. (20, 12) = 4 M.C.D. (7, 21) = 7 M.C.D. (5, 9) = 1 M.C.D. (0, 6) = 6 M.C.D. (20, 12) = M.C.D. (12, 8) = M.C.D. (8, 4) =4 Introduzione ai Diagrammi di Flusso 20 mod 12 = 8 12 mod 8 = 4 8 mod 4 = 0 7 Descriviamo come calcolre il M.C.D. c Start d Considera i numeri a e b d Considera i numeri a e b e Se b = 0 allora la risposta è a e Se b = 0 allora la risposta è a e vai all’istruzione h f Calcola r = a mod b f Calcola r = a mod b g Se r = 0 allora la risposta è b, g Se r = 0 allora la risposta è b, e vai all’istruzione h altrimenti torna altrimenti torna all’istruzione f all’istruzione f Stop h Introduzione ai Diagrammi di Flusso ■ L’esecuzione sequenziale è interrotta da istruzioni di tipo “vai”, “torna” Se b = 0 allora la risposta è a ■ Le istruzioni sono numerate e vai all’istruzione h ■ Istruzioni del tipo “se … allora”, “se … allora … altrimenti” operano una scelta tra due condizioni d Considera i numeri a e b e f Calcola r = a mod b g Se r = 0 allora la risposta è b, altrimenti torna ■ all’istruzione f h Stop ■ =5 =4 =1 =0 8 M.C.D. (20, 12) = M.C.D. (12, 8) = M.C.D. (8, 4) =4 20 mod 12 = 8 12 mod 8 = 4 8 mod 4 = 0 M.C.D. (5, 9) = M.C.D. (9, 5) = M.C.D. (5, 4) = M.C.D. (4, 1) = =1 5 9 5 4 mod 9 mod 5 mod 4 mod 1 =5 =4 =1 =0 Introduzione ai Diagrammi di Flusso 10 Descriviamo come calcolare il M.C.D. ■ c Start d Considera i numeri a e b e Se b = 0 allora la risposta è a f Calcola r = a mod b g Se r = 0 allora la risposta è b, ■ e vai all’istruzione h L’istruzione “3” è necessaria per evitare che si esegua b mod 0 che non è possibile (num / 0 è impossibile!) altrimenti torna all’istruzione f Il risultato è il M.C.D. qualunque siano i valori a e b (generalità) Introduzione ai Diagrammi di Flusso Stop 9 Descriviamo come calcolare il M.C.D. Start mod 9 mod 5 mod 4 mod 1 Descriviamo come calcolare il M.C.D. Start c 5 9 5 4 Introduzione ai Diagrammi di Flusso c h M.C.D. (5, 9) = M.C.D. (9, 5) = M.C.D. (5, 4) = M.C.D. (4, 1) = =1 11 h Stop ■ Istruzioni (fare qualcosa) e dichiarazioni (definire qualcosa) Dichiarazioni: – di variabili – costanti (numeriche, logiche, caratteri, stringhe, ecc.) Istruzioni: – salti condizionati e incondizionati – confronti – assegnamenti – istruzione di inizio – istruzione di fermata Introduzione ai Diagrammi di Flusso 12 2 Diagrammi di flusso Diagrammi di flusso inizia c Start Blocco iniziale d Considera i numeri a e b inizia leggi a e b Blocco di input/output e Se b = 0 allora la risposta No è a e vai all’istruzione h No Blocco di controllo r = a mod b f Calcola r = a mod b g Se r = 0 allora la risposta stampa a No Blocco finale stop stop Introduzione ai Diagrammi di Flusso 13 Diagrammi di flusso ■ ■ I blocchi azione hanno una sola freccia intrante ed una uscente Un blocco di controllo ha una freccia entrante e due uscenti Una freccia entra in un blocco oppure si inserisce in un’altra freccia Ciascun blocco è raggiungibile dal blocco iniziale Il blocco finale è raggiungibile da qualsiasi blocco <SCRIPT> <!-- Inizio script JavaScript inizia var a0, b0, r; a0 = window.prompt("Inserisci il primo numero"); b0 = window.prompt("Inserisci il secondo numero"); leggi a e b var a = a0, b = b0; No Si b=0 r = a mod b Si stampa b azione No 15 No Introduzione ai Diagrammi di Flusso test ■ azione iterazione: while Si azione test No iterazione: do while (repeat until) azione ■ azione sequenza test selezione: if then Introduzione ai Diagrammi di Flusso 16 Diagrammi di flusso: schemi di base Si azione azione Vedremo più avanti nel corso cosa significa questo programma // Fine script --> </SCRIPT> stop ■ test ■ if (b != 0) { r = a % b; while (r != 0) { a = b; b = r; r = a % b; document.writeln("M.C.D. (" + a + ", " + b + ") = <BR>"); } document.writeln(b); } else document.writeln(a); stampa a r=0 No 14 document.writeln("M.C.D. (" + a + ", " + b + ") = <BR>"); Diagrammi di flusso: schemi di base selezione: if then else Si Introduzione ai Diagrammi di Flusso Il programma M.C.D. in JavaScript Introduzione ai Diagrammi di Flusso azione r=0 stampa b h Stop ■ stampa a Si stampa b all’istruzione f ■ Si Blocco azione Si g altrimenti torna b=0 r = a mod b r=0 No è b, ■ leggi a e b Si b=0 ■ No Si 17 In realtà ogni blocco azione descritto precedentemente può essere composto da uno schema di base (che a sua volta…) Se si usano solo gli schemi descritti si realizzano diagrammi di flusso strutturati (nota: ogni algoritmo descrivibile da un diagramma di flusso è descrivibile anche da un diagramma di flusso strutturato [teorema di Böhm-Iacopini]) L’uso di diagrammi di flusso strutturati è consigliabile ed incoraggiata (la strasformazione in programma ne sarà facilitata come anche la comprensione) Non è necessaria nessun altro schema per descrivere un qualsiasi algoritmo [tesi di Church] Introduzione ai Diagrammi di Flusso 18 3 Diagrammi di flusso: schemi di base Diagrammi di flusso: schemi di base inizia leggi a e b inizia No leggi a e b b=0 Calcola M.C.D. mediante la proprietà di Euclide Calcola M.C.D. r = a mod b Si stampa a No No r=0 b=0 Si r = a mod b stampa a Si stampa b No stop r=0 Si stampa b stop Introduzione ai Diagrammi di Flusso 19 Introduzione ai Diagrammi di Flusso Calcolo del massimo tra n numeri Calcolo del massimo tra n numeri ■ ■ 5 4 1 6 8 5 3 7 1 2 3 4 5 6 7 8 9 1 3 1 6 8 5 3 7 3 4 5 6 7 8 9 5 MAX ♥ Introduzione ai Diagrammi di Flusso 6 8 5 3 7 2 3 4 5 6 7 8 9 2 MAX ♥ 3 10 ♠ Introduzione ai Diagrammi di Flusso 22 Calcolo del massimo tra n numeri ■ 4 ♣ 1 21 Proviamo a farlo a mano… 2 4 ♣ Calcolo del massimo tra n numeri 2 5 10 Introduzione ai Diagrammi di Flusso 1 Proviamo a farlo a mano… Dato un insieme di n (≥ 2) numeri, vogliamo scrivere un algoritmo per la determinazione del massimo elemento dell’insieme 2 ■ 20 3 Proviamo a farlo a mano… 2 10 1 ♠ 2 4 1 6 8 5 3 7 3 4 5 6 7 8 9 ♣ 23 5 MAX ♥ Introduzione ai Diagrammi di Flusso 3 10 ♠ 24 4 Calcolo del massimo tra n numeri ■ 2 1 Calcolo del massimo tra n numeri Proviamo a farlo a mano… ■ 4 1 6 8 5 3 7 3 4 5 6 7 8 9 2 5 ♣ MAX ♥ 3 10 2 5 4 1 1 2 3 4 ♠ 25 4 1 6 1 2 3 4 5 ♣ ■ 6 8 5 3 7 7 8 9 MAX ♥ 3 10 2 5 4 1 6 1 2 3 4 5 leggi n i=1 max = tavolo[1] i <= n calcola max Si confronta il tavolo con max 7 6 7 8 9 MAX ♥ 27 6 8 ♣ 3 10 ♠ 26 5 3 7 7 8 9 MAX ♥ 3 10 ♠ Introduzione ai Diagrammi di Flusso Calcolo del massimo tra n numeri inizia calcola max 3 Proviamo a farlo a mano… ♠ Introduzione ai Diagrammi di Flusso inizia 5 Calcolo del massimo tra n numeri Proviamo a farlo a mano… 5 6 8 Introduzione ai Diagrammi di Flusso Calcolo del massimo tra n numeri 2 5 ♣ Introduzione ai Diagrammi di Flusso ■ Proviamo a farlo a mano… 28 Variabili ■ Una variabile è un nome associato ad una locazione di memoria e può contenere dei dati inizia confronta ... Si No tavolo[i] > max No max = tavolo[i] 2 5 4 1 6 1 2 3 4 5 6 5 3 7 7 8 9 3 10 i=i+1 ♣ scrivi max stop calcola max stop confronta ... 8 MAX ♥ ♠ stop Introduzione ai Diagrammi di Flusso 29 Introduzione ai Diagrammi di Flusso 30 5 Variabili ■ ■ ■ ■ ■ ■ ■ Array (o Vettore) Ad ogni istante una variabile individua un valore Il valore contenuto il una variabile è l’ultimo assegnatole e resta inalterato finche’ una successiva assegnazione non modifica il valore stesso L’assegnazione è effettuata mediante una istruzione detta istruzione di assegnazione L’istruzione di assegnazione permette di assegnare ad una variabile il valore di una espressione generica Alle variabili (e costanti) sono associati degli identificatori Una variabile è rappresentata dalla coppia: <identificatore,valore> Per non itrodurre confusione denoteremo con “=“ l’istruzione di assegnazione e con “==“ il confronto per uguale Introduzione ai Diagrammi di Flusso 31 ■ ■ ■ ■ Ad ogni istante un array individua un insieme di valori Ogni singolo valore nell’array è individuato dall’identificatore dell’array e da un indice che ne individua la posizione nella sequenza degli elementi nell’array stesso, es. tavolo[2] Un array è caratterizzato da una dimensione che esprime il numero di elementi che contiene L’operazione di assegnazione permette di modificare il valore di un determinato elemento della sequenza come per una qualsiasi variabile In genere gli elementi di un array sono tutti dello stesso tipo (stringhe, interi, caratteri, ecc.) ma in alcuni linguaggi di programmazione sono permessi array di elementi di tipo diverso, es. JavaScript, ma non è una scelta consigliabile Introduzione ai Diagrammi di Flusso ■ ■ 5 4 1 6 1 2 3 4 5 ♣ 6 8 5 3 7 7 8 9 MAX ♥ 3 10 ♠ Introduzione ai Diagrammi di Flusso 32 ■ Dato un insieme di n (≥ 2) numeri, vogliamo scrivere un algoritmo per la determinare il più piccolo elemento dell’insieme ■ Suggerimento: – L’algoritmo è del tutto analogo a quello per la ricerca del più grande – È sufficiente modificare il test di confronto tra l’elemento minore trovato temporaneamente e la nuova posizione del tavolo considerata tavolo[i] < min 33 Introduzione ai Diagrammi di Flusso 34 Esercizio: Numeri pari e dispari Scrivere un algoritmo che calcoli il fattoriale di un numero intero non negativo n. n! = 1 * 2 * … * (n -2) * (n -1) * n ■ ■ Suggerimento. Le varibili usate nell’algoritmo sono: – n, il numero intero positivo considerato – fatt, la variabile destinata ad assumere il valore del fattoriale di n (n!), in essa si accumulano I successivi prodotti parziali – i, varibile contatore Introduzione ai Diagrammi di Flusso 2 minore invece di maggiore Esercizio: Calcolo del fattoriale ■ Un array (vettore) è costituito da una sequenza di elementi consecutivi nella memoria Esercizio: calcolare il minore tra n numeri Array (o Vettore) ■ ■ ■ 35 Scrivere un algoritmo che determini se un numero intero positivo n è pari o dispari Un numero è pari se è un multiplo di 2, dispari altrimenti Suggerimento: – sfruttare l’operazione modulo “mod” notando che un numero n è multiplo di 2 se n mod 2 = 0 – un confronto può coinvolgere anche espressioni Introduzione ai Diagrammi di Flusso 36 6 Esercizio: La somma di n numeri ■ Algoritmi di ordinamento Scrivere un algoritmo che calcoli la somma di primi n numeri interi positivi: n ∑i = somma ■ L’ordinamento (sort) è il procedimento che dispone un insieme di elementi in ordine crescente o decrescente secondo un determinato criterio. i=0 ■ 2 5 4 1 6 8 5 3 7 3 Suggerimento: – se invece di sommare fosse stato richiesto di moltiplicare? – somma = 1 + 2 + … + (n -2) + (n -1) + n – n! = 1 * 2 * … * (n -2) * (n -1) * n F. Gauss [1777-1855]: 1 1 ■ ■ Si ricerca l’elemento minimo e lo si scambia con il primo (tavolo[1]) Si ripete la ricerca considerando gli elementi dal secondo all’ultimo e si scambia l’elemento più piccolo con tavolo[2] In n – 1 passi gli elementi saranno ordinati 3 4 5 6 7 8 9 10 1 ■ 2 5 4 1 6 8 5 3 7 3 1 2 3 4 5 6 7 8 9 Introduzione ai Diagrammi di Flusso 10 Individuato l’elemento più piccolo tra quelli considerati si effettua lo scambio 3 1 4 5 ♦ 6 ♥ 7 8 9 10 4 5 6 7 8 9 10 38 Le carte sul tavolo vengono percorse da sinistra verso destra cercando l’elemento più piccolo L’algoritmo per la ricerca del più piccolo è simile a quello per la ricerca del più grande 2 5 4 1 2 3 6 8 5 3 7 3 4 1 5 ♦ 6 7 ♥ 8 9 10 ♠ 40 Ordinamento per Selezione 5 4 2 6 8 5 3 7 3 2 6 Introduzione ai Diagrammi di Flusso ■ 1 3 39 Ordinamento per Selezione ■ 5 Ordinamento per Selezione 2 5 4 1 6 8 5 3 7 3 2 4 Introduzione ai Diagrammi di Flusso ■ 1 2 37 Ordinamento per Selezione ■ 3 1 2 3 3 4 5 5 6 7 8 n ⋅ ( n + 1) 2 Introduzione ai Diagrammi di Flusso 2 7 8 9 10 ♠ A scambio completato avremo un tavolo con n carte con la certezza di avere l’elemento più piccolo in prima posizione 1 5 4 2 6 8 5 3 7 3 1 2 3 4 ♣ 5 ♦ 6 ♥ 7 8 9 10 ♠ È l’elemento più piccolo!! Introduzione ai Diagrammi di Flusso 41 Introduzione ai Diagrammi di Flusso 42 7 Ordinamento per Selezione ■ ■ ■ Si considera la rimanente parte del tavolo Si seleziona il più piccolo dei rimanenti elementi e lo si mette in seconda posizione E così via fino a completament o (n – 1 passi) Ordinamento per Selezione 1 5 4 2 6 8 5 3 7 3 1 2 3 4 5 6 7 8 9 10 ■ ■ 1 2 4 5 6 8 5 3 7 3 1 2 3 4 5 6 7 8 9 10 1 2 3 5 6 8 5 4 7 3 1 2 3 4 5 6 7 8 9 Introduzione ai Diagrammi di Flusso ■ 10 L’algoritmo effettua gli n – 1 cicli considerando ogni volta una porzione di tavolo più piccola di una posizione L’elemento non più considerato da un ciclo successivo (quello posizionato nella posizione i-esima è il più piccolo di tutti i rimanenti ma più grandi di quelli già oggetto di uno scambio NOTA: è sufficiente memorizzare la posizione di min 43 Lo scambio: variabili temporanee tavolo[posizione di min] = tavolo[i] tavolo[i] = temp No i<n Si trova minore min in {tavolo[i] … tavolo[n]} (la sua posizione) stop scambia min con tavolo[i] i=i+1 44 Calcolo del minore tra n numeri inizia calcola min 2 5 4 1 2 3 1 inizia confronta ... 6 8 5 3 7 3 4 5 ♦ 6 ♥ 7 8 9 inizia j=i Si 10 No posizione di min = i j <= n calcola min Si confronta il tavolo con min ♠ inizia scambia ■ i=1 Introduzione ai Diagrammi di Flusso inizia scambia temp = tavolo[posizione di min] inizia No tavolo[j] < tavolo[posizione di min] posizione di min = j j=j+1 È necessario memorizzarsi in una variabile temporanea il più piccolo elemento trovato per effettuare lo scambio stop calcola min stop confronta ... stop Introduzione ai Diagrammi di Flusso 45 Iterazioni: ciclo “while” ■ ■ ■ ■ Le iterazioni permettono l’esecuzione ripetuta di una serie di istruzioni, definendo un ciclo Nell’iterazione di tipo while l’espressione test è valutata iterazione: while prima di ogni ciclo, se il No valore è vero il ciclo viene effettuato, altrimenti si prosegue con il blocco successivo seguendo l’arco etichettato “No” A priori non è noto il numero di ripetizioni del ciclo Caratteristica analoga si può dire anche dell’iterazione repeat … until (o do Introduzione … while)ai Diagrammi di Flusso Introduzione ai Diagrammi di Flusso 46 Iterazioni: ciclo “for” ■ ■ ■ test Si ■ istruzioni ■ 47 L’iterazione di tipo for è un’iterazione di tipo while inizia calcola min dove, però, il numero di cicli è noto a priori j=i Una variabile, j, è assegnato un valore iniziale No La variabile è incrementata j <= n ad ogni ciclo di un certo valore, nell’esempio di 1 Si confronta il tavolo Il test che coinvolge la con min variabile in oggetto controlla se questa ha superato un j=j+1 certo estremo È quindi noto a priori il numero di cicli che verranno stop calcola min effettuati (nell’esempio n - i + 1 volte) Introduzione ai Diagrammi di Flusso 48 8 Soluzione esercizio: Calcolo del fattoriale inizia Quale è la classe di funzioni calcolabili? inizia calcola fatt leggi n ■ Babbage [1837]: “Di quali operazioni deve essere dotata una machina per effettuare tutti i calcoli che un essere umano può teoricamente effettuare?” ■ Anni ‘30: A. Church, K. Gödel, E. Post, A. Tarski, A. Turing proposero, nel giro di pochi anni, un gran numero di possibili definizioni, ciascuna basata su di un particolare aspetto della nozione di funzione calcolabile, ciascuno con le sue caratteristiche i=1 fatt = 1 i <= n No Si fatt = fatt * i calcola fattoriale i=i+1 scrivi fatt stop calcola fatt stop Introduzione ai Diagrammi di Flusso 49 Funzioni Ricorsive ■ Kleene [1936]: le funzioni ricorsive sono quelle definibili a partire dalla funzione costante 0, dalla funzione successore, ricorsione primitiva e ricerca del minimo (minimo elemento tale che…) ■ Intuitivamente: 0 e successore corrispondono all’assegnamento, ricorsione primitiva all’iterazione di tipo for, il principio del minimo all’iterazione di tipo while Introduzione ai Diagrammi di Flusso A. Church, A. Turing: “Le funzioni ricorsive (parziali) sono esattamente le funzioni calcolabili”. ■ Le sole funzioni per cui esistono programmi sono le funzioni ricorsive. Quindi esistono decine di problemi per cui non è possibile trovare soluzioni ricorsive (es. non esiste un algoritmo per calcolare le soluzioni di qualunque equazone di grao n) ■ Kleene [1936]: “Tutte le definizioni proposte sono equivalenti, e descrivono sempre la classe delle funzioni ricorsive”. ■ Metodo di Aritmetizzazione: assegnare numeri a oggetti in modo sistematico ed effettivo, e nel tradurre proprietà degli oggetti in proprietà dei loro corrispondenti numeri ■ Gödel: “L’aritmetizzazione è possibile effettuarla mediante funzioni ricorsive!” ■ Equivalenza tra tutte le definizioni non è una dimostrazione che la definizione di funzione ricorsiva corrisponda a quella di calcolabile (ma è un buon indizio…) Introduzione ai Diagrammi di Flusso 52 La Tesi di Church [1936] Le funzioni calcolabili sono calcolabili mediante computer! Introduzione ai Diagrammi di Flusso ■ 51 La Tesi di Church [1936] ■ 50 Funzioni Ricorsive Dedekind [1888]: analisi matematica del concetto di numero naturale. I numeri naturali sono generati a partire dallo 0, dall’operazione di successore, dalla ricorsione primitiva e soddisfano il principio del minimo (nessun elemento è asciato fuori) ■ Introduzione ai Diagrammi di Flusso 53 ■ Poiché i computer calcolano tutte e sole le funzioni ricorsive, ogni definizione equivalente di ricorsività descrive un approccio alternativo alla calcolabilità attraverso computer, e dunque un tipo di linguaggio di programmazione ■ La dimostrazione di equivalenza fra un dato approccio e la calcolabilità mediante computer consiste nel tradurre il metodo di calcolo di una generica funzione implicito nel dato approccio in una serie di istruzioni (in linguaggio macchina) eseguibili direttamente dal computer (compilazione = aritmtizzazione) Introduzione ai Diagrammi di Flusso 54 9 Problema della Fermata ■ ■ ■ Altro problema “impossibile” da risolvere: “Decidere se un computer si ferma (e ottiene dunque un valore) quando calcola seguendo le istruzioni di un dato programma per un dato argomento”. (Decidere se una funzione ricorsiva parziale è definita per un dato argomento) “Se un programma che fornisce risposte a domande riguardanti la fermata di dati programmi per dati argomenti non mente mai, esso non può fornire tutte le risposte.” “Un sistema di assiomi e regole che sia definibile mediante un programma e che non menta mai non può fornire risposte a ogni domanda riguardo i numeri” (teorema di Gödel) Introduzione ai Diagrammi di Flusso 55 10