AOT LAB Agent and Object Technology Lab Dipartimento di Ingegneria dell’Informazione Università degli Studi di Parma Fondamenti di Informatica Algoritmi Prof. Agostino Poggi AOT LAB Algoritmo Il termine algoritmo deriva dal matematico arabo Al-Khowarzimi del IX secolo d.c. che suggerì un metodo per sommare 2 numeri rappresentati dal sistema numerico Hindu Nel medioevo con il termine algorismus si indicava il complesso di operazioni nel calcolo numerico con numeri arabi Oggi con il termine algoritmo si indica la sequenza finita di passi effettuabili per risolvere una classe di problemi in un tempo finito 2 AOT LAB Algoritmo Un algoritmo è un metodo generale che risolve qualsiasi istanza di un dato problema di elaborazione Un algoritmo deve avere le seguenti proprietà: Finitezza: composto da un numero finito di passi elementari 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 3 AOT LAB Algoritmo Per definire un algoritmo è necessario: Condurre un'attenta analisi del problema ed eventualmente suddividere il problema in piccoli sottoproblemi Individuare i possibili ingressi e precisare le uscite (definizione dei dati) Definire completamente e dettagliatamente la sequenza dei passi che portano alla soluzione 4 AOT LAB Problema dei Secchi Sono presenti due secchi con capacità volumetrica rispettivamente di 4 e 3 litri Determinare le operazioni necessarie per far si che il primo secchio (da 4 litri) sia riempito con 2 litri Possiamo agire sui due secchi attraverso le seguenti operazioni: Riempire completamente un secchio Svuotarlo completamente Travasare una certa quantità di liquido da un secchio all’altro 5 AOT LAB Problema dei Secchi 1. Riempi il secchio da 4 litri (4, 0) 2. Travasa nel secchio da 3 litri finché e pieno (1,3) 3. Vuota il secchio da 3 litri (1,0) 4. Travasa nel secchio da 3 litri (0,1) 5. Riempi il secchio da 4 litri (4,1) 6. Travasa nel secchio da 3 litri finché e pieno (2,3) 6 AOT LAB 4L Problema dei Secchi 3L 7 AOT LAB Gestione di una Biblioteca La biblioteca contiene un certo numero di scaffali Ogni scaffale contiene un certo numero di libri che non vengono spostati quando un libro è estratto La biblioteca è dotata di schedario Le schede sono poste in ordine alfabetico per autore A parità di primo autore per secondo e così via A parità di autori le schede sono in ordine di data 8 AOT LAB Accesso a un Libro 1. Si cerca la scheda del libro nello schedario 2. Trovata questa, si segna su un foglietto il numero di scaffale e la posizione del libro 3. Si ricerca lo scaffale indicato 4. Si accede alla posizione del libro 5. Lo si preleva 6. Se richiesto 1. si scrive sulla scheda: data del prestito e nome di chi prende in prestito 9 AOT LAB Accesso a un Libro Il passo 1, a sua volta, può essere esploso nella seguente insieme di passi (sottoprocedura): 1. Si esamini la prima scheda dello schedario 2. Se nome dell’autore e titolo coincidono con quello ricercato 1. La ricerca è conclusa 2. Altrimenti si passi alla scheda successiva 3. Si proceda di scheda in scheda fino a trovare la scheda cercata 4. Se vengono esaurite le schede 1. La ricerca è conclusa in modo infruttuoso (il libro cercato non è presente nella biblioteca) 10 AOT LAB Algoritmi e Informatica I calcolatori possono essere visti come esecutori di algoritmi Gli algoritmi vengono descritti tramite programmi, cioè tramite una sequenza di istruzioni scritte in un linguaggio comprensibile dal calcolatore Compito di un esperto informatico e di produrre algoritmi e codificarli in programmi 11 AOT LAB Algoritmi e Informatica Per scrivere un programma abbiamo bisogno di Descrivere i dati Definire le istruzioni che operano sui dati In modo tale che a partire dai dati iniziali otteniamo dei dati finali rappresentanti la soluzione alla nostra istanza di problema 12 AOT LAB Descrizione dei Dati Abbiamo bisogno di variabili (contenitori di valori) per esprimere le varie istanze di problemi Le variabili si definiscono in termini di: Nome: l’identificatore (a cui fare riferimento) Tipo: l’insieme dei possibili valori che possono essere assunti (char, stringa, intero, reale, booleana) Valore: il valore attualmente assunto dalla variabile È molto importante non confondere il nome col valore 13 AOT LAB Tipi di Istruzioni Ci sono tre tipologie di istruzioni: Assegnamento ed istruzioni aritmetico-logiche Istruzioni di I/O Strutture di controllo 14 AOT LAB Assegnamento ed istruzioni aritmetico-logiche Le istruzioni di assegnamento permettono di depositare un valore in una variabile A=5 Le istruzioni aritmetiche permettono di eseguire un calcolo aritmetico e di depositarne il risultato in una variabile A=A+1 A=B+C Le istruzioni logiche permettono di verificare la veracità di una espressione logica A == 5 A > 12 A <= B 15 AOT LAB I/O Esistono due tipi di istruzioni di I/O: Istruzioni di lettura che permettono di leggere dei dati da un dispositivo esterno • Leggi A Istruzioni di lettura che permettono di leggere dei dati da un dispositivo esterno • Scrivi A 16 AOT LAB Strutture di Controllo Ci sono tre tipi di strutture di controllo: Sequenza Condizione Iterazione Il teorema di Jacopini-Bohm afferma che è possibile scrivere algoritmi per risolvere qualunque problema usando solo queste strutture di controllo (purché esista un algoritmo risolutivo) 17 AOT LAB Rappresentazione degli Algoritmi Esistono due formalismi principali per rappresentare gli algoritmi Diagrammi di flusso Pseudo codice 18 AOT LAB Diagramma di Flusso I diagrammi di flusso sono un formalismo grafico per descrivere gli algoritmi I diagramma di flusso scompongono in passi successivi gli algoritmi Un diagramma di flusso è una descrizione più efficace e meno ambigua di una descrizione a parole 19 AOT LAB Diagramma di Flusso Le operazioni su cui si basa un diagramma di flusso sono: Trasferimento di informazioni Esecuzione di calcoli Assunzione di decisioni Esecuzione di iterazioni Un diagramma di flusso è costituito da due tipi di entità: Nodi Archi 20 AOT LAB Tipi di Nodi Start Var ← Expr Var Inizio Elaborazione / Assegnamento Lettura dati Stop Fine Si Var No Decisione Scrittura dati Espr1 Espr1 Espr1 Espr1 Espr1 Espr1 = ≠ > ≥ < ≤ Espr2 Espr2 Espr2 Espr2 Espr2 Espr2 21 AOT LAB Strutture di Controllo I Si/No I No/Si I No/Si Si/No O If - Then - Else No/Si Si/No O While - Do O Repeat - Until 22 AOT LAB Somma di Tre Numeri Start Var1 Var2 Var3 Somma ← Var1 +Var2 + Var3 Somma Stop 23 AOT LAB Somma di N Numeri Start No N I←0 Somma ← 0 I<N Si Var Somma Somma ← Somma + Var I←I+1 Stop 24 AOT LAB Pseudo Codice Lo pseudo codice è una sorta di linguaggio che descrive un algoritmo attraverso istruzioni simili alle istruzioni di un linguaggio di programmazione Si descrivono algoritmi utilizzando pseudo codice perché passare dalla descrizione in pseudo codice alla effettiva descrizione in un linguaggio di programmazione è (o dovrebbe essere) semplice 25 AOT LAB Tipi di Istruzione Elaborazione/Assegnamento A = Expr Lettura Leggi Var Scrittura Scrivi Var 26 AOT LAB Strutture di Controllo Condizione semplice Se condizione { ... } Condizione a due vie Se condizione { ... } Altrimenti { ... } Iterazione Finchè condizione { ... } 27 AOT LAB Somma di Tre Numeri Leggi Var1 Leggi Var2 Leggi Var3 Somma = Var1 + Var2 + Var3 Scrivi Somma 28 AOT LAB Somma di N Numeri Leggi N I=0 Somma = 0 Finché I < N { Leggi Var Somma = Somma + Var I=I+1 } Scrivi Somma 29 AOT LAB Programmazione Top-Down La programmazione top-down è una tecnica di programmazione per la realizzazione di programmi con la scomposizione iterativa di un problema in sotto problemi 30 AOT LAB Programmazione Top-Down La programmazione top-down si presta molto bene per la definizione di algoritmi con i diagrammi di flusso: All’inizio il diagramma di flusso è rappresentato da un nodo che rappresenta la soluzione al problema Questo nodo viene scomposto in una rete di nodi in modo iterativo La scomposizione termina quando i singoli nodi possono essere rappresentati da semplici sequenze di istruzioni del linguaggio di programmazione scelto 31 AOT LAB Somma di N Numeri Start Somma gli N numeri Stop 32 AOT LAB Somma di N Numeri Start Inizializzazione Leggi e somma gli N numeri Stampa la somma Stop 33 AOT LAB Somma di N Numeri: Inizializzazione N I←0 Somma ← 0 34 AOT LAB Somma di N Numeri: Leggi e somma gli N numeri No I<N Si Var Somma ← Somma + Var I←I+1 35 AOT LAB Somma di N Numeri Start No N I←0 Somma ← 0 I<N Si Var Somma Somma ← Somma + Var I←I+1 Stop 36 AOT LAB Stampa il Numero di Righe Start Calcola e stampa il numero di righe Stop 37 AOT LAB Stampa il Numero di Righe Start Inizializzazione Calcola il numero di righe Stampa il numero di righe Stop 38 AOT LAB Stampa il Numero di Righe: Inizializzazione Nome Documento Righe ← 0 39 AOT LAB Stampa il Numero di Righe: Leggi una Riga No Ci sono Righe? Si Leggi una riga Righe ← Righe + 1 40 AOT LAB Stampa il Numero di Righe Start Nome Documento No Ci sono Righe? Si Righe ← 0 Righe Leggi una riga Righe ← Righe + 1 Stop 41