Il problema di fondo Dipartimento di Ingegneria dell’Informazione Università degli Studi di Parma Laboratorio di Programmazione Descrizione di un problema Laurea in Ingegneria Civile e Ambientale individuazione di una soluzione Algoritmi e Programmazione Algebra di Boole Quale è il giusto punto di partenza? Cioè, di quali dati abbiamo bisogno ? Quali metodologie o tecniche utilizzare? In quale ordine eseguire le operazioni consentite da tali tecniche ? Stefano Cagnoni Lab. Programmazione 2010/11 - Algoritmi e Programmazione Algoritmo 2 Algoritmo: esempio Problema generale: Calcolare la somma di un numero arbitrario N di numeri Dall'arabo al-Khuwarizmi, e dal greco arithmós Se ho a disposizione l’operazione di somma fra 2 numeri posso risolvere il problema per qualsiasi valore di N con una stessa sequenza di operazioni. Un algoritmo è un metodo generale che risolve in un tempo finito e con una sequenza finita di passi qualsiasi istanza di un dato problema. Lab. Programmazione 2010/11 - Algoritmi e Programmazione Ad ogni valore di N corrisponde una diversa istanza del problema generale, ma tutte le istanze possono essere risolte mediante lo stesso algoritmo: Poni totale=0; Per N volte: somma un nuovo addendo a totale. 3 Lab. Programmazione 2010/11 - Algoritmi e Programmazione 4 1 Algoritmo Codifica di un algoritmo E’ possibile definire algoritmi anche per la risoluzione di problemi non informatici Fase di descrizione (scrittura) di un algoritmo attraverso un insieme ordinato (sequenziale) di codici (istruzioni, ciascuno dei quali rappresenta un’operazione), appartenenti a un qualche linguaggio di programmazione, che specificano le azioni da compiere e l’ordine in cui devono essere eseguite Il prodotto della codifica è un programma Esempi: Descrivere come raggiungere una destinazione Istruzioni per il montaggio di un mobile Istruzioni per la realizzazione di una torta Non sempre la soluzione di un problema può essere descritta tramite un algoritmo. Il calcolo di p non è un algoritmo (non ha fine) Il calcolo di p fino alla decima cifra decimale è un algoritmo Lab. Programmazione 2010/11 - Algoritmi e Programmazione Programma Lab. Programmazione 2010/11 - Algoritmi e Programmazione 5 6 Programma Testo scritto in accordo alla sintassi (insieme di regole sulla formazione delle espressioni in un linguaggio) e alla semantica (insieme di regole che consentono l’interpretazione del significato del testo) di un linguaggio di programmazione Un programma rappresenta l’insieme delle istruzioni che descrivono un processo computazionale, espresse in un qualche linguaggio Un processo trasforma un insieme di dati iniziali nei risultati finali mediante una successione di azioni elementari (operazioni) Lab. Programmazione 2010/11 - Algoritmi e Programmazione 7 Un programma può non descrivere un algoritmo (basta che la sequenza di operazioni non sia finita cioè che il programma non termini) … ... tuttavia può essere molto utile Es. gestione semafori, non ha fine poiché ripete indefinitamente la stessa sequenza Lab. Programmazione 2010/11 - Algoritmi e Programmazione 8 2 Esecuzione Algoritmo L’esecuzione delle azioni nell’ordine specificato dall’algoritmo consente di ottenere i risultati che risolvono il problema a partire dai dati in ingresso algoritmo programma Metodo risolutivo Codifica del metodo in un linguaggio di programmazione Lab. Programmazione 2010/11 - Algoritmi e Programmazione Non ambiguità (determinismo): i risultati non variano in funzione della macchina/persona che esegue l'algoritmo. Realizzabilità: deve essere eseguibile con le risorse a disposizione. Efficienza (auspicabile): deve eseguire il minimo numero possibile di operazioni 10 Il crivello di Eratostene Per definire un algoritmo è necessario: Finitezza: composto da un numero finito di passi elementari. Lab. Programmazione 2010/11 - Algoritmi e Programmazione 9 Algoritmo Un algoritmo deve avere le seguenti proprietà: 1. Si costruisce una sequenza ordinata dei numeri fra 2 e n. Condurre un'attenta analisi del problema ed eventualmente suddividere il problema in sottoproblemi più piccoli. Individuare i dati disponibili in ingresso (input) e precisare le uscite prodotte (output), cioè definire i dati di input e di output. Definire completamente e dettagliatamente la sequenza dei passi che portano alla soluzione. Lab. Programmazione 2010/11 - Algoritmi e Programmazione Si vogliono trovare tutti i numeri primi compresi fra 2 e n (in modo efficiente). 2. Si estrae il primo numero dalla sequenza. E’ necessariamente un numero primo. 3. Si eliminano dalla sequenza tutti i multipli del numero estratto al passo 2. 4. Se la sequenza non è vuota si torna al passo 2, altrimenti si termina. 11 Lab. Programmazione 2010/11 - Algoritmi e Programmazione 12 3 Il crivello di Eratostene Diagrammi di flusso (Flow Chart) Esempio : trovare i numeri primi compresi fra 2 a 20 Sequenza iniziale: 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 2 è primo; lo elimino con tutti i suoi multipli: 3,5,7,9,11,13,15,17,19 3 è primo; lo elimino con tutti i suoi multipli: I diagrammi di flusso sono un formalismo grafico per descrivere gli algoritmi. I diagrammi di flusso visualizzano graficamente i passi da cui sono formati gli algoritmi e l’ordine in cui devono essere eseguiti. 5,7,11,13,17,19 5 è primo; lo elimino con tutti i suoi multipli: … 19 è primo, la sequenza è vuota, termino. Lab. Programmazione 2010/11 - Algoritmi e Programmazione Ingresso/Uscita dati (rappresentate come schede) Un diagramma di flusso è costituito da due tipi di entità: Nodi Operazioni sui dati (rappresentate come rettangoli) Trasferimento di informazione (Assegnamenti) Calcolo di espressioni aritmetiche e logiche rappresentano le operazioni e gli stati di inizio e fine dell’algoritmo Archi orientati (di solito in realtà sono segmenti di retta orientati secondo la direzione di una freccia) Collegano fra loro i nodi, rappresentando con frecce il ‘flusso’ dei dati, cioè la sequenza delle operazioni: l’istruzione contenuta in un nodo è seguita dall’esecuzione dell’operazione contenuta nel nodo a cui punta l’arco uscente da esso Verifica di condizioni (rappresentate come rombi) Assunzione di decisioni o cicli (combinazioni di rettangoli e rombi). Possono utilizzare costanti e variabili Lab. Programmazione 2010/11 - Algoritmi e Programmazione 14 Diagrammi di flusso Operazioni rappresentabili in un diagramma di flusso: Lab. Programmazione 2010/11 - Algoritmi e Programmazione 13 Diagrammi di flusso Un diagramma di flusso è una descrizione formale, (cioè rispetta una precisa sintassi), più efficace e meno ambigua di una descrizione a parole. 15 Una struttura di questo tipo è detta grafo (orientato) Lab. Programmazione 2010/11 - Algoritmi e Programmazione 16 4 Tipi di Nodi Esempio Start Var1 Var1 Espr1 Inizio Lettura dati Elaborazione / Assegnamento Var1 Stop Fine Scrittura dati Sì No Espr1 Espr1 Espr1 Espr1 Espr1 Espr1 = > < Espr2 Espr2 Espr2 Espr2 Espr2 Espr2 Var1 Leggi un valore (ad es. 10) che sarà assegnato alla variabile Var1 Var1 Stampa il contenuto di Var1 (stampa 10) Fine Lab. Programmazione 2010/11 - Algoritmi e Programmazione 17 Esempio 2 Inizio Var1 Leggi un valore (ad es. 10) e inseriscilo nella locazione di memoria corrispondente alla variabile var1 Start Inizio Var1 Leggi Var1 Var1 > 10 Aggiungi 1 a quel valore No Var1 Var1 + 1 Sì Var1 Stop 18 Esempio 3 Start Var1 Var1 + 1 Inizio Stop Decisione Lab. Programmazione 2010/11 - Algoritmi e Programmazione Start Stampa il nuovo valore (stampa il contenuto di var1 cioè 11) Lab. Programmazione 2010/11 - Algoritmi e Programmazione Stop 19 stampa Var1 Altrimenti Var1 Fine Se Var1 <= 10 incrementa di 1 Var1 e poi stampa Var1 Fine Lab. Programmazione 2010/11 - Algoritmi e Programmazione 20 5 Strutture di Controllo Sì O1 C No O No C O2 Programmazione Strutturata Sì No O C If - Then - Else Se C è vera esegue l’operazione (o sequenza) O1, altrimenti esegue O2 Ripete una stessa operazione (o sequenza) O finché la condizione C resta vera Ogni diagramma ha esattamente un ingresso ed una uscita. Ogni azione può essere Un’operazione semplice Un’ azione composta da altri diagrammi strutturati Lab. Programmazione 2010/11 - Algoritmi e Programmazione 21 Esempio: Somma di due Numeri Var2 Sì Ripete una stessa operazione (o sequenza) O finché la condizione C non diventa vera Lab. Programmazione 2010/11 - Algoritmi e Programmazione Var1 Si compone di sequenze di azioni, decisioni (if then, if then else) e cicli (while-do, repeat until). Ciclo Repeat - Until Ciclo While Ciclo For Start 22 Esempio: Somma di N Numeri Start Somma Var1 +Var2 No N Somma I0 Somma 0 Stop Sì I<N Var Somma Somma + Var Somma II+1 Stop Lab. Programmazione 2010/11 - Algoritmi e Programmazione 23 Lab. Programmazione 2010/11 - Algoritmi e Programmazione 24 6 Algebra di Boole Algebra di Boole L’algebra di Boole è un formalismo che opera su variabili (dette variabili booleane o variabili logiche o asserzioni) che possono assumere due soli valori: Vero Falso L’algebra booleana nasce come tentativo di definire in forma algebrica processi di tipo logico-deduttivo Tuttavia, poiché di fatto l’algebra di Boole opera su variabili binarie (vero e falso sono i 2 soli simboli), i suoi operatori possono essere inclusi fra gli operatori dell’algebra binaria. Lab. Programmazione 2010/11 - Algoritmi e Programmazione X1 X2 X3 F 0 0 0 1 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 Lab. Programmazione 2010/11 - Algoritmi e Programmazione 26 NOT - AND - OR Fra le funzioni definibili tramite l’algebra di Boole alcune hanno particolare importanza per il loro significato logico e sono usate come operatori di base: AND (indicato in genere dal simbolo × ) OR (indicato in genere dal simbolo + ) NOT (indicato in genere dal simbolo - ) XOR (indicato in genere dal simbolo ) NAND (indicato in genere dal simbolo ) NOR (indicato in genere dal simbolo ) In realtà, qualunque funzione booleana può essere realizzata utilizzando 2 soli operatori: AND e NOT oppure OR e NOT Lab. Programmazione 2010/11 - Algoritmi e Programmazione Sulle variabili booleane è possibile definire delle funzioni (dette funzioni booleane o logiche) f (X1,…,XN) : {0,1}N {0,1} Possono essere definite tramite le tabelle di verità. Una tabella di verità di una funzione di N variabili ha 2N righe, una per ogni possibile combinazione delle variabili, e N+1 colonne, che rappresentano i valori delle N variabili più il valore della funzione 25 Operatori ed Espressioni Booleane 27 X NOT 0 1 1 0 X1 X2 AND 0 0 0 0 1 0 1 0 0 1 1 1 NOT (X): il risultato è la negazione della variabile AND(X1,X2): il risultato è 1 (Vero) se entrambe le variabili hanno valore 1 OR(X1,X2): il risultato è 1 (Vero) se almeno una delle variabili ha valore 1 Lab. Programmazione 2010/11 - Algoritmi e Programmazione X1 X2 OR 0 0 0 0 1 1 1 0 1 1 1 1 28 7 XOR - NAND - NOR X1 X2 XOR 0 0 0 0 1 1 1 0 1 1 1 0 X1 X2 NAND 0 0 1 0 1 1 1 0 1 1 1 0 Interpretazione logica degli operatori XOR (X1, X2): il risultato è 1 (Vero) se una sola delle due variabili ha valore 1 Se si ha una operazione del tipo: A* B (* indica una generica operazione), il risultato è vero se: NAND (X1, X2) = NOT (AND (X1,X2)) NOR (X1, X2) = NOT (OR (X1, X2)) X1 X2 NOR 0 0 1 0 1 0 1 0 0 1 1 0 Lab. Programmazione 2010/11 - Algoritmi e Programmazione * condizione OR A o B (o entrambe) sono vere AND sia A che B sono vere XOR A o B (ma non entrambe) sono vere Lab. Programmazione 2010/11 - Algoritmi e Programmazione 29 Operatori ed Espressioni Booleane Espressioni equivalenti Questi operatori possono essere combinati in espressioni booleane che rappresentano funzioni booleane e si compongono con le stesse regole utilizzate per l’algebra tradizionale. Due espressioni si dicono equivalenti quando producono lo stesso risultato per ogni combinazione dei valori delle variabili Esempio F(x1, x2, x3)= ((NOT x1) AND x2) OR x3 Lab. Programmazione 2010/11 - Algoritmi e Programmazione 30 31 ab axb+axb a XOR b (a AND (NOT b)) OR ((NOT a) AND b) Lab. Programmazione 2010/11 - Algoritmi e Programmazione 32 8 Espressioni complementari T1 e T2 sono complementari se per quelle combinazioni in cui T1 risulta 1 T2 risulta 0 e viceversa Esempio T1 = (a x c) + (a x b) T2 = (a x c) + (a x b) Lab. Programmazione 2010/11 - Algoritmi e Programmazione 33 Lab. Programmazione 2010/11 - Algoritmi e Programmazione 34 Lab. Programmazione 2010/11 - Algoritmi e Programmazione 35 Lab. Programmazione 2010/11 - Algoritmi e Programmazione 36 9 Lab. Programmazione 2010/11 - Algoritmi e Programmazione Lab. Programmazione 2010/11 - Algoritmi e Programmazione 37 38 Esercizi Sulla base di quanto visto per la somma di N numeri Definire un algoritmo per il calcolo del prodotto di N numeri Descriverlo attraverso un opportuno diagramma di flusso Verificare se le seguenti coppie di funzioni booleane sono equivalenti (cioè hanno la stessa tabella di verità): C AND (A OR NOT B) A AND (B AND NOT C) Lab. Programmazione 2010/11 - Algoritmi e Programmazione 39 e (B AND (NOT A)) OR (NOT C) e (NOT A) OR (C OR (NOT B)) Lab. Programmazione 2010/11 - Algoritmi e Programmazione 40 10