Programmazione I Fondamenti di programmazione ( Lezione I ) Problemi, Algoritmi, Diagrammi di flusso Fabrizio Messina messina@dmi.unict.it www.dmi.unict.it/~messina
Algoritmo Dato un problema, un algoritmo è una procedura, cioè una sequenza di passi, che può essere eseguita automaticamente da una macchina in modo da risolvere il problema dato. Un problema risolvibile mediante un algoritmo si dice computabile. F. Messina Programmazione I 2
Esempio di algoritmo Il pollo alle mandorle: - Abbiamo gli ingredienti (pollo, olio, mandorle, cipolla, sale, pepe, etc.) con le giuste quantità; - Seguiamo la ricetta; - Serviamo il piatto a tavola. F.Messina Programmazione I 3
Un altro esempio di algoritmo La costruzione di un kit di montaggio: - Procuriamo il kit e gli strumenti; - Apriamo la scatola; - Leggiamo le istruzioni; - Mettiamo insieme i pezzi. F. Messina Programmazione I 4
Risoluzione di un problema Algoritmo Input Esecutore Output Generalmente, la risoluzione di un dato problema consiste nel prendere alcuni dati iniziali (input) relativi al problema e nel fornire un risultato (output) che risolve quest ultimo. F. Messina Programmazione I 5
Ma Non è così facile come sembra! Per scrivere la giusta sequenza di passi bisogna essere un bravo cuoco o un bravo costruttore! F. Messina Programmazione I 6
Infatti Problema Risolutore Algoritmo Uomo la risoluzione automatica prevede comunque una notevole componente umana!!! Esecut ore Processo di esecuzione Macchina F. Messina Programmazione I 7
Definizione di algoritmo Un algoritmo è una sequenza ordinata e finita di passi (azioni o istruzioni) che producono un ben determinato risultato in un tempo finito. F. Messina Programmazione I 8
Caratteristiche di un algoritmo 1. Azioni eseguibili e non ambigue. Non ambigue, inoltre non sono ammessi un pò e a piacere, che non sono termini adatti ad una macchina. 2. Determinismo. Fatto un passo, il successivo è uno ed uno solo, ben determinato. Alternative sono possibili, ma la scelta deve essere univoca. 3. Numero finito di passi. 4. Terminazione. L esecuzione deve finire e deve produrre il risultato in tempo finito. Osservazione : la 3 non implica la 4. F. Messina Programmazione I 9
Esempio di non terminazione 1. Si consideri un numero N; 2. Scrivere N; 3. Scrivere il numero successivo; 4. Ripetere il passo precedente. F. Messina Programmazione I 10
Ancora un esempio Ricerca di un nominativo in un elenco. Non ordinato. Es.: Una lista di firme. Ordinato. Es.: Elenco telefonico. F. Messina Programmazione I 11
Codifica dell algoritmo Affinché una macchina riesca a comprendere ed eseguire i passi specificati da un algoritmo, quest ultimo deve essere prima codificato in un opportuno programma scritto in un linguaggio di alto livello. Algoritmo Traduzione Programma F. Messina Programmazione I 12
L esecuzione automatica Uomo Algoritmo Programma Pseudo-codice Linguaggio di alto livello Traduttore Input Linguaggio macchina Macchina F. Messina Programmazione I 13 Esecuzione Output
Scomposizione in sottoproblemi Ricetta del pollo alle mandorle: 1. Preparare il soffritto ed aggiungervi il pollo; 2. Unire le mandorle pelate al soffritto; 3. Mescolare fino a quando il pollo sarà ben dorato; 4. Aggiungere del pepe; 5. Rosolare con vino bianco fino a quando il pollo è cotto; 6. Aggiungere olio q.b.; 7. Se preferisci salato, allora aggiungi sale; F. Messina Programmazione I 14
Scomposizione in sottoproblemi La ricetta precedente è un esempio di cosa significa scomporre un problema in sottoproblemi. Ogni sottoproblema può essere scomposto in problemi via via più elementari. Top-down vs. Bottom-Up F. Messina Programmazione I 15
Top down TOP DOWN: 1. Si formula inizialmente una visione generale del sistema, senza scendere nel dettaglio delle sue parti. 2. Ogni parte del sistema è successivamente rifinita per decomposizione aggiungendo dettagli. 3. Successive decomposizioni permetteranno di specificare ulteriori dettagli, finché la specifica completa è sufficientemente dettagliata da validare il modello. F. Messina Programmazione I
Bottom Up BOTTOM UP: 1. Parti individuali del sistema sono specificate in dettaglio. 2. Le parti vengono connesse tra loro in modo da formare componenti più grandi. 3. Successive connessioni/composizioni permetteranno di realizzare un sistema completo. F. Messina Programmazione I
Descrizione di un algoritmo Si descrive un algoritmo cercando di sintetizzare il più possibile la sua sequenza di passi. La descrizione avviene mediante : pseudo-codice, oppure diagramma di flusso. F. Messina Programmazione I 18
Diagrammi di flusso I diagrammi di flusso permettono di descrivere in modo grafico le azioni che costituiscono un algoritmo e il loro flusso di esecuzione. Ogni azione elementare è rappresentata da un blocco. Esistono 4 tipi di blocchi. F. Messina Programmazione I 19
Diagrammi di flusso (1) Istruzioni di inizio e fine. Inizio Fine F. Messina Programmazione I 20
Diagrammi di flusso (2) Operazioni di lettura (input) o scrittura (output). Leggi il dato Scrivi il dato F. Messina Programmazione I 21
Diagrammi di flusso (3) Istruzioni imperative (azioni oppure operazioni). Calcola : 20+34 F. Messina Programmazione I 22
Connettori I singoli diagrammi devono essere uniti tramite i connettori. L esecuzione delle istruzioni deve essere fatta sequenzialmente, ovvero seguendo i connettori. Quando si scrive l algoritmo bisogna fare molta attenzione alla direzione del flusso di esecuzione. F. Messina Programmazione I 23
Istruzione di assegnamento Una variabile numerica è un entità caratterizzata : da un nome, e da un valore (o contenuto) che può cambiare nel tempo Un espressione è una combinazione di operatori aritmetici, costanti e variabili che può essere calcolata generando un singolo valore numerico. Es.: X, X + 1, X + (Y * 3). Istruzione di assegnamento : Variabile Espressione; Es.: Z 3; Z X + 3; X X + 1; F. Messina Programmazione I 24
Esempio Descrivere, mediante diagramma di flusso, un algoritmo che calcoli la somma di due numeri letti in input. F. Messina Programmazione I 25
Diagramma di flusso : Somma Inizio Z X+Y Leggi X Stampa Z Leggi Y Fine F. Messina Programmazione I 26
Esempio Descrivere, mediante diagramma di flusso, un algoritmo che scambi i valori di due variabili lette in input. F. Messina Programmazione I 27
Diagramma di flusso: Scambio Inizio Leggi X Leggi Y Aux X X Y Y Aux Scrivi X Scrivi Y Fine F. Messina Programmazione I 28
Variazioni nel flusso di esecuzione Ci sono dei momenti in cui il flusso di esecuzione può scegliere tra diverse direzioni; In genere, questi salti sono subordinati al verificarsi di una condizione (che può risultare vera o falsa); Si parla di istruzioni condizionali. F. Messina Programmazione I 29
Diagrammi di flusso (4) Istruzioni condizionali. Es.: Condizione Falso Più sale? Falso Vero Vero F. Messina Programmazione I 30
Esempio Descrivere, mediante diagramma di flusso, un algoritmo che determini il massimo tra due numeri letti in input. F. Messina Programmazione I 31
Diagramma di flusso : Max Inizio X > Y Falso Leggi X Vero Stampa Y Leggi Y Stampa X Fine F. Messina Programmazione I 32
Esempio Descrivere, mediante diagramma di flusso, un algoritmo che determini se un numero letto in input è pari o dispari. F. Messina Programmazione I 33
Diagramma di flusso : Pari o Inizio Resto = 0 Falso Leggi N Vero Scrivi : N è dispari Dividi N per 2 Scrivi : N è pari Fine F. Messina Programmazione I 34
Esercizio Scrivere la ricetta del pollo alle mandorle utilizzando i diagrammi di flusso. Nota: dove è richiesta una ripetizione ad esempio fino a quando utilizzare un istruzione condizionale del tipo mostrato nella prossima diapositiva. F. Messina Programmazione I 35
Ripetizione o ciclo Il pollo è cotto? Falso Rosolare con vino Vero F. Messina Programmazione I 36
Programmazione I Fondamenti di programmazione ( Lezione II ) Notazione Lineare Strutturata Fabrizio Messina messina@dmi.unict.it www.dmi.unict.it/~messina
Esempio Descrivere, mediante diagramma di flusso, un algoritmo che calcoli il fattoriale di un numero intero positivo letto in input. F. Messina Programmazione I 38
Esempio : Fattoriale Inizio Leggi N Fatt Fatt * M M M +1 Fatt 1 M 1 Scrivi Fatt VERO M > N FALSO Fine F. Messina Programmazione I 39
Considerazioni I diagrammi a blocchi si rivelano : poco pratici, soggetti a errori, illeggibili se di notevole complessità. Per ovviare a tali inconvenienti si adotta la Notazione Lineare Strutturata (NLS) o pseudo-codice. F. Messina Programmazione I 40
Notazione Lineare Strutturata Tre costrutti fondamentali : Sequenza Selezione Iterazione. Inoltre, esiste un unico punto d ingresso ed un unico punto d uscita. F. Messina Programmazione I 41
Sequenza Istruzione 1 Istruzione 2 Istruzione 1; Istruzione 2; Istruzione n; Istruzione n F. Messina Programmazione I 42
Selezione (o condizione) Falso Cond izion e Vero Blocco 2 Blocco 1 if (Condizione) then else end if Blocco 1; Blocco 2; La clausola else può anche essere assente. F. Messina Programmazione I 43
Iterazione (o ciclo) Falso Cond izion e Vero while (Condizione) do Blocco; end while; Blocco F. Messina Programmazione I 44
F. Messina Programmazione I 45 Ricapitolando...
Risultato fondamentale TEOREMA (Böhm-Jacopini) : I tre costrutti fondamentali della NLS sono sufficienti a descrivere qualunque algoritmo. F. Messina Programmazione I 46
Esempio : Somma Inizio Z X+Y Leggi X Stampa Z Leggi Y Fine F. Messina Programmazione I 47
Esempio : Somma in NLS Inizio Leggi X Leggi Y Z X + Y Stampa Z Fine F. Messina Programmazione I 48
Esempio : Max Inizio X > Y Falso Leggi X Vero Stampa Y Leggi Y Stampa X Fine F. Messina Programmazione I 49
Esempio : Max in NLS Inizio Leggi X Leggi Y if (X > Y) then Stampa X else Stampa Y end if Fine F. Messina Programmazione I 50
Esempio : Numeri da 1 a N Inizio Leggi N M 0 while (M < N) do M M + 1 Stampa M end while Fine F. Messina Programmazione I 51
Esempio : Somma dei primi N numeri Inizio Leggi N i 0 S 0 while (i < N) do i i + 1 S S + i end while Stampa S Fine F. Messina 52
Esempio : Somma dei numeri pari minori di N Inizio Leggi N i 2 S 0 while (i < N) do S S + i i i + 2 end while Stampa S Fine F. Messina 53
Algoritmo di Euclide per il m.c.m. Inizio Leggi A, B MA A MB B while (MA <> MB) do if (MA > MB) then MB MB + B else MA MA + A end if end while Stampa mcm = MA Fine Es.: m.c.m. (3, 7) = 21 54 MA MB 3 7 6 9 14 12 15 21 18 21
Algoritmo di Euclide per il M.C.D. Inizio Leggi A, B if (A < B) then MB A MA B else MA A MB B end if while (MB<>0) do r MA%MB MA MB MB r end while stampa MA Es.: M.C.D. (21, 14) = 7 MA MB MA%MB 21 14 7 14 7 0 7 0 --- M.C.D.(21,14) = 7
Fine Programmazione I 56