Gli algoritmi e la loro rappresentazione pag. 5 Rappresentazione grafica di un algoritmo: il flow chart Per rappresentare un algoritmo si usa un metodo grafico, chiamato FLOW CHART o DIAGRAMMA DI FLUSSO. Guardando questo disegno, si ha una comprensione immediata della complessità e della articolazione dell'algoritmo. E’ come una “mappa” dell’algoritmo, di più facile lettura rispetto alla lista delle istruzioni che dà un’idea visiva della logica di soluzione del problema che l’algoritmo risolve. Molti libretti di istruzioni propongono le istruzioni in forma grafica. Le istruzioni che compongono l'algoritmo vengono racchiuse in simboli speciali, diversi a secondo del tipo di istruzione. In questo modo il simbolo aiuta a comprendere il tipo di istruzione che si deve eseguire. Tutti questi simboli vengono collegati tra di loro da frecce per far capire in che ordine vanno eseguite le varie istruzioni. Per trovare l’istruzione da eseguire , basta seguire le frecce. I simboli usati nel flow chart sono i seguenti: Rettangoli Si mettono nei rettangoli le istruzioni la cui esecuzione non è visibile all’esterno. Tipicamente si mettono nei rettangoli le istruzioni che ordinano ad un computer di eseguire dei calcoli I O Parallelogrammi Si mettono nei parallelogrammi le istruzioni che in un programma interagiscono con il mondo esterno o con l’operatore. Le istruzioni in cui la macchina richiede dei dati si mettono in un parallelogramma con la I di Input. Le istruzioni in cui la macchina comunica un risultato si mettono in un parallelogramma con la O di Output Terminatori Indicano il punto in cui l’algoritmo inizia e gli eventuali punti di fine delle istruzioni da eseguire. Inizio Istruzione 1 Il flow chart di una SEQUENZA si presenta come quello qui accanto. Notiamo le frecce che collegano fra loro i vari blocchi del Flow Chart Il verso della freccia indica il verso di percorrenza e quindi di esecuzione dell'algoritmo. Istruzione 2 Da ognuno dei precedenti simboli può "uscire" SOLO UNA FRECCIA, in quanto finita la esecuzione della istruzione SOLO UNA è la istruzione da eseguire subito dopo. Istruzione 3 In un algoritmo per l’essere umano è tuttavia un po’ difficile definire esattamente i simboli da usare ………… Il flow si disegna prima di scrivere l'algoritmo sotto forma di istruzioni vere e proprie. ………… Il flow rappresenta il metodo di soluzione del problema; da esso si capisce quali operazioni vanno affrontate per arrivare al risultato finale e in che ordine esse vanno eseguite. Fine E’ come un pro-memoria. Dall’esame di un flow chart si può discutere facilmente sulla sua ottimizzazione Il flow chart deve essere di facile comprensione: indica infatti quali operazioni vanno eseguite. Il programma derivato dal flow sarà comprensibile solo da chi conosce quel linguaggio di programmazione. Uno stesso flow chart può essere tradotto in linguaggi di programmazione diversi. I sottoproblemi Le istruzioni che compongono il flow chart precedente possono risultare elementari o no a seconda dell'esecutore che le legge. A.S. 08-09 ©Rauch Gli algoritmi e la loro rappresentazione pag. 6 Alcune delle istruzioni sono infatti un po’ complesse, richiedono cioè la esecuzione di molte azioni che però non sono state esplicitate, ad esempio Lavati. Si suppone che la istruzione Lavati sia elementare per tutti, cioè che tutti la sappiano eseguire, anche se è ambigua perché potrebbe essere interpretata in modi diversi da esecutori diversi. Se Lavati non risulta elementare allora significa che è un problema da risolvere all’interno del problema più grosso “Risveglio”: si dice che siamo di fronte ad un sottoproblema. In questo caso al posto dell’unica istruzione Lavati, bisogna fornire un insieme di istruzioni esplicative che portino alla soluzione del sottoproblema Lavaggio I sottoproblemi vengono indicati nel flow con un simbolo particolare: Questo simbolo indica che c’è un sottoproblema da risolvere. Significa che per risolverlo sono necessarie diverse istruzioni. La definizione delle istruzioni vere e proprie che portano alla soluzione di quel sottoproblema viene cioè rimandata ad una successiva fase di analisi di maggior dettaglio. Questo modo di procedere aiuta nel disegno del flow perché consente comunque di proseguire nell’analisi del problema che si sta affrontando, anche se nel momento della sua scrittura non sia ha la minima idea di come quel particolare sottoproblema si risolva. Un flow chart di 1° livello, o a grandi blocchi è quello in cui vengono individuati i vari sottoproblemi da affrontare per arrivare alla soluzione del problema. Si può poi ritornare sui vari sottoproblemi in sospeso in un secondo momento e tracciare un flow più dettagliato o di secondo livello e così via fino a quando tutte le istruzioni individuate risultano elementari per l’esecutore. Ovviamente non occorre riscrivere tutto il flow: si provvede a dettagliare solo il flow del sottoproblema, come se il nuovo problema da affrontare fosse ora il sottoproblema. RISVEGLIO Questo flow chart di 1 livello evidenzia i sottoproblemi presenti nel problema “Risveglio” Sono state ritenute elementari le istruzioni: Spegni la sveglia Alzati ¾ ¾ ¾ ¾ Spegni la sveglia Alzati Ascolta la radio Esci Lavaggio Lavaggio, Vestizione e Colazione sono stati ritenuti dei sottoproblemi. Vestizione Per disegnare il flow chart di 2 livello non occorre ridisegnare tutto il flow. Si provvede a dettagliare solo il flow del sottoproblema che si vuole risolvere. Colazione Si ricomincia cioè daccapo nella operazione di analisi come se il nuovo problema da affrontare fosse Lavaggio, Vestizione, Colazione Lavaggio Vestizione Colazione Ascolta la radio Esci di casa ? ? ? FINE A.S. 08-09 ©Rauch Gli algoritmi e la loro rappresentazione pag. 7 La deviazione dalla sequenza: la scelta Se si prova a dettagliare l’algoritmo che risolve i sottoproblemi proposti, ci si accorge subito che al crescere della complessità del problema e del livello di dettaglio, una semplice sequenza non è più sufficiente. Ma anche l’algoritmo Risveglio che abbiamo scritto come sequenza è punitivo per l’esecutore: dovrebbe dargli una maggiore flessibilità. Le istruzioni cioè si eseguono in sequenza fino a quando non si raggiunge un certo punto dell’algoritmo in cui viene richiesto all’esecutore di prendere una decisione sul da farsi. Ad un certo punto dell’esecuzione l’algoritmo potrebbe prevedere una alternativa e l’esecutore potrebbe operare una scelta. Il programma può deviare dalla sequenza. La SCELTA è tra due possibilità. L’algoritmo propone cioè una condizione da controllare, formulata come una domanda a cui l’esecutore deve poter dare una risposta. La domanda è formulata in modo che si possa rispondere solo SI o NO. Si è di fronte a un “bivio”. Nel flow chart per indicare che l’algoritmo devia dalla sequenza a causa di una scelta si usa il simbolo: All’interno del rombo si pone la domanda a cui l’esecutore deve rispondere Si o No Dal rombo si dipartono due frecce. Una freccia punta alle istruzioni da eseguire nel caso si risponda Si alla domanda contenuta nel rombo. L’altra freccia punta verso le ? istruzioni da eseguire se si risponde No. Notiamo che il rombo è l’unico simbolo del flow da cui escono due frecce. Ad esempio nel caso dell’algoritmo precedente non è affatto detto che si debba per forza fare colazione tutte le mattine: potremmo offrire una SCELTA all’esecutore. Condizione da controllare: Hai fame? Se risponde SI l’esecutore devia dalla sequenza ed esegue le istruzioni che risolvono il sottoproblema COLAZIONE Se risponde NO l’esecutore prosegue in sequenza evitando così di fare colazione. Ad esempio potremmo aggiungere prima della istruzione ESCI DI CASA la seguente scelta: GUARDA FUORI DALLA FINESTRA SI COLAZIONE HAI FAME? NO Se risponde SI l’esecutore devia dalla sequenza ed esegue le istruzioni che lo portano a prendere con sé l’ombrello Se risponde NO l’esecutore prosegue in sequenza evitando così di mettere l’ombrello in borsa. Ovviamente questo presuppone che in borsa non ci sia già l’ombrello. Con questo algoritmo si corre il rischio di uscire di casa con due ombrelli! SI BRUTTO TEMPO ? Il problema nasce dalla formulazione non precisa della condizione da controllare. La domanda giusta sarebbe: PRENDI L’OMBRELLO NO Brutto tempo E Sei senza ombrello? Questa è una condizione composta. Si tratta di rispondere a due domande. Solo se l’esecutore risponde Si a tutte e due le domande, la risposta complessiva è Si e quindi si devia dalla sequenza per prendere l’ombrello. Se si risponde No a una delle domande o a tutte e due la risposta complessiva è No e quindi si prosegue in sequenza. A.S. 08-09 ©Rauch Gli algoritmi e la loro rappresentazione pag. 8 Le due condizioni sono tra loro in And logico: Brutto Tempo AND Sei senza Ombrello Brutto tempo? No No Si SI Sei Senza Ombrello? No Si No SI Risposta No No No SI Solo se le condizioni sono entrambe Vere (Si – 1) la Risposta complessiva è Vera (Si – 1) La scelta può anche mostrarsi nel seguente modo: In seguito alla scelta il flow si divide in due rami diversi. CONTROLLA LA TEMPERATURA L’esecutore deve eseguire delle istruzioni in alternativa. SI INDOSSA IL CAPPOTTO FA FREDDO? NO INDOSSA LA GIACCA In entrambe i casi si DEVIA dalla sequenza, per poi tornarvi quando e' terminata la esecuzione delle rispettive istruzioni. Quando si trasformano i flow in un insieme di istruzioni comprensibili all'esecutore, sorgerà la esigenza di evidenziare in qualche modo la presenza di una scelta. Nella scrittura dell’algoritmo saranno necessarie cioè delle parole "speciali" per far capire all'esecutore: ¾ ¾ ¾ ¾ quale è la condizione da controllare dove iniziano e dove finiscono le istruzioni da eseguire se si risponde SI dove riprende la normale sequenza (cioè dove finisce tutta la scelta) nel caso di scelta "completa" dove iniziano e dove finiscono le istruzioni da eseguire se si risponde NO. Queste “parole speciali” saranno diverse a seconda del linguaggio di programmazione. A.S. 08-09 ©Rauch Gli algoritmi e la loro rappresentazione pag. 9 I Cicli Un altro tipo di deviazione dalla sequenza è rappresentato dai Cicli. Si dice che l'esecutore sta svolgendo un ciclo quando una istruzione o un gruppo di istruzioni vengono eseguite tante volte quante sono necessarie per ottenere un risultato. Prima o poi deve essere possibile uscire dal ciclo. E' cioè considerato un algoritmo scorretto il così detto "Ciclo Eterno" cioè un algoritmo che propone all'esecutore la esecuzione all'infinito delle stesse istruzioni ed il cui flow è qui di fianco rappresentato. Ci deve essere quindi una condizione da controllare per decidere se rimanere in ciclo o uscire da esso. Deve essere possibile cioè per l'esecutore operare una SCELTA. Istruzione n. 1 Istruzione n. 2 Ad esempio all'interno dell'algoritmo "Lavaggio", uno dei sottoproblemi da affrontare è sicuramente Sciacquarsi. Come si fa? Bisogna Passare e mani sotto l’acqua Passare le mani sotto l'acqua Questa istruzione però non va eseguita una volta sola. Bisogna continuare a PASSARE LE MANI SOTTO L'ACQUA cioè bisogna eseguire più volte questa istruzione, controllando se sulle mani è ancora PRESENTE IL SAPONE. L'operazione SCIACQUARSI è quindi un ciclo in cui si rimane per effetto di una scelta. La condizione da controllare per continuare ad eseguire il ciclo è SAPONE PRESENTE. Se si risponde SI le frecce riportano l'esecutore all'inizio del ciclo. Se si risponde NO si esce dal ciclo. Si Sapone presente No SAPONE PRESENTE è quindi la condizione che deve essere VERA per continuare a ripetere, cioè per rimanere in ciclo. In italiano diremmo: Devi passare le mani sotto l'acqua MENTRE c'è del sapone presente su di esse. Facciamo un altro esempio. La operazione da eseguire dopo SCIACQUARSI è ASCIUGARSI. Come si fa? Bisogna STROFINARE LE MANI CON L'ASCIUGAMANO. Strofinare le mani con l'asciugamano Questa istruzione però non va eseguita una volta sola. Bisogna continuare a STROFINARE LE MANI CON L'ASCIUGAMANO cioè bisogna eseguire più volte questa istruzione, controllando se LE MANI SONO ASCIUTTE. No Mani asciutte L'operazione ASCIUGARSI è quindi un ciclo da cui si esce per effetto di una scelta. La condizione da controllare per uscire dal ciclo è LE MANI SONO ASCIUTTE. Se si risponde NO le frecce riportano l'esecutore all'inizio del ciclo. Se si risponde SI si esce dal ciclo. Si LE MANI SONO ASCIUTTE è quindi la condizione che deve essere VERA per smettere di ripetere, cioè per uscire dal ciclo. In italiano diremmo: Devi strofinare le mani con l'asciugamano FINO A QUANDO le mani risultano asciutte. Esistono quindi due possibilità: A.S. 08-09 ©Rauch Gli algoritmi e la loro rappresentazione pag. 10 1) Si continua a rimanere nel ciclo, cioè si continua a ripetere quando la condizione si verifica (cioè quando si risponde SI alla domanda posta nel rombo). Si ripete cioè Mentre risulta Vera la condizione specificata. 2) Si esce dal ciclo quando la condizione si verifica (cioè quando si risponde SI alla domanda posta nel rombo). Si ripete cioè Finchè diventa Vera la condizione specificata. Notiamo che in entrambe i casi le istruzioni che compongono il ciclo vengono eseguite per lo meno una volta. Infatti provenendo dalla sequenza l'esecutore esegue le istruzioni del ciclo e solo a fine ciclo incontra la scelta che gli consente di capire se tali istruzioni vanno eseguite di nuovo oppure no. Il controllo della condizione avviene cioè a Fine Ciclo. Esistono dei casi in cui il controllo deve essere effettuato a Inizio Ciclo. Sono i casi in cui esiste la possibilità che le istruzioni che compongono il ciclo non debbano essere MAI eseguite. Si controlla quindi la prima volta se bisogna entrare in ciclo e poi se è necessario rimanervi. Ad esempio il sottoproblema COLAZIONE si risolve sicuramente con un ciclo di istruzioni. La condizione da controllare per rimanere in ciclo e' AFFAMATO, la condizione da controllare per uscire e' SAZIO. Mangia un boccone Però non si MANGIA prima e poi si controlla se si e' sazi o affamati. Il ciclo qui accanto ci costringe a mangiare un boccone comunque, anche se non abbiamo fame! Si In effetti si dovrebbe mangiare solo se si risponde SI al controllo "AFFAMATO" o NO al controllo "SAZIO". Affamato In questi casi cioè il controllo della condizione va posto PRIMA delle istruzioni da ripetere, non dopo, come mostrato dai seguenti flow chart No AFFAMATO No SAZIO Si Si No Mangia un boccone Mangia un boccone Notiamo come un ciclo si trasforma nell’altro semplicemente negando la condizione: Affamato? È infatti la condizione contraria a Sazio? A.S. 08-09 ©Rauch Gli algoritmi e la loro rappresentazione pag. 11 Lo sai Che……? Algoritmo è un termine che deriva dal nome del matematico persiano Al Khwarazmi, autore, attorno all' 825 d. C., di un importante testo matematico. Dalla forma latina del suo nome, Algorismus, deriva la parola moderna algoritmo. Questo termine viene usato per indicare un qualsiasi metodo di calcolo (algebrico o numerico), come pure una sequenza di operazioni, da eseguire nell'ordine assegnato. Esercizi Disegnare il flow chart dei seguenti algoritmi, avendo cura di inserire tutte le istruzioni necessarie, come se fossero diretti ad un esecutore poco intelligente e privo di iniziativa. 1) Le uova sode (da il Cucchiaio di argento) Ingredienti: 6 uova Procedimento: Si mettono le uova in un recipiente ricoprendole di acqua fredda, si porta il recipiente sul fuoco e si contano sette minuti dal momento che l’acqua leva il bollore. Si passano subito in acqua fredda. 2) Dal libretto istruzioni televisore LCD della LG Selezione dei Menù Premendo ripetutamente il tasto Menu del telecomando appaiono via via i menu operativi : t Immagine, Suono, Ora, Stazione e Speciale selezionare un’opzione all’interno del menu desiderato si premono i tastitudel 3 OK 4 Per telecomando. L’opzione selezionata viene evidenziata da un cambiamento di colore (da bianco a rosso). Modificare per mezzo dei pulsanti 34l’impostazione dell’opzione che si è u selezionata. Per visualizzare gli eventuali sotto menu premere OK Sintonizzazione Automatica Menu Stazione Premere il pulsante Menu in modo da visualizzare il menu operativo Ricerca Automatica Stazione Ricerca Manuale Sistemazione Programmi Selezionare per mezzo dei pulsanti tul’opzione Ricerca Automatica Programma Favorito Premere il pulsante OK per visualizzare il sottomenu Ricerca Automatica. Selezionare per mezzo dei pulsanti tu l’opzione Sistema Selezionare il sistema premendo i tasti 34: L : Secam L/L’ (Francia Ricerca Automatica BG : PAL B/G, SECAM B/G (Europa/Europa Orientale) Sistema BG I : PAL I /II (Regno Unito, Irlanda) Memorizza dal prog. 1 Partenza DK : PAL D/K, SECAM D/K (Europa Orientale) Premere i tasti tu per selezionare Memorizza dal Prog Selezionare poer mezzo dei tasti 34 il numero del programma dal quale si desidera abbia inizio la memorizzazione. Premere i tasti tu per selezionare Partenza Premere il tasto OK per dare inizio alla sintonizzazione automatica. Vengono memorizzate tutte le stazioni ricevute. Il nome della stazione viene memorizzato per quelle stazioni che lo rendono disponibile, altrimenti alla stazione viene assegnato come nome il numero del canale preceduto da C. Per concludere la programmazione automatica premere il tasto Menu. Quando la programmazione automatica viene completata il menu Sistemazione Programmi appare sullo schermo. Consultare il paragrafo “Riordino dei Programmi” per riordinare i programmi menorizzati. Premere il tasto TV/AV per tornare ai normali programmi televisivi. 3) Calcolo dell’area del rettangolo (dal libro di Geometria) Detta B la base del rettangolo espressa in metri e H la sua altezza espressa in metri, l’area del rettangolo si calcola applicando la seguente formula: A = B⋅H A.S. 08-09 ©Rauch