Corsi di Laurea in Biotecnologie (primo anno interfacoltà) Corso integrato di Matematica, Informatica e Statistica Informatica di base Linea 1 Daniela Besozzi Dipartimento di Informatica e Comunicazione Università degli Studi di Milano Seconda lezione: I linguaggi di programmazione e gli algoritmi (capitoli 7 e 8) Informatica di base – Linea 1 2 Prima Parte: A che punto siamo arrivati? “La lezione di settimana scorsa è stata pesantissima: non mi ricordo nulla!” Informatica di base – Linea 1 3 La volta scorsa • Come funziona un computer? – processore – memoria – programmi: • serie di istruzioni elementari • vengono eseguiti dal computer in linguaggio macchina (istruzioni binarie) Informatica di base – Linea 1 4 Seconda parte: Come si scrivono i programmi? “Non vorrà mica farci scrivere dei programmi questa qua, vero?!” Informatica di base – Linea 1 5 Linguaggio macchina • Un programma è una serie di istruzioni elementari codificate in linguaggio macchina – la serie è molto lunga (anche milioni di righe di codice) che prende il nome di oggetto binario – ricordiamoci: un’istruzione è composta da 4 byte: 10011111 00101000 00000011 01110100 • Scrivere un programma direttamente in linguaggio macchina è un processo: – lungo e soggetto ad errori – praticamente impossibile per programmi complessi! Informatica di base – Linea 1 6 Assembly • E’ possibile scrivere istruzioni più semplici: ADD 2000 2040 2080 usiamo lettere e numeri invece che bit • Ognuna di queste istruzioni viene poi trasformata in un’istruzione in linguaggio macchina: – il programma che effettua la trasformazione in linguaggio macchina si chiama assembler – il linguaggio si chiama assembly Informatica di base – Linea 1 7 “Questo l’ho capito!” • “Voi informatici siete degli scansafatiche e, al posto che scrivere direttamente in linguaggio macchina (che è l’unica cosa che i computer possono eseguire), scrivete in assembly (che è un po’ più semplice) e poi chiedete all’assembler di trasformarlo in linguaggio macchina.” Informatica di base – Linea 1 8 Tutto in assembly? • Abbiamo detto: – l’assembler trasforma un’istruzione scritta in assembly in una istruzione scritta in linguaggio macchina – l’oggetto binario (l’insieme delle istruzioni di un programma) è lungo anche milioni di istruzioni • Quindi, per scrivere un programma, dovremmo scrivere migliaia (anche milioni) di istruzioni in assembly… – E’ ancora troppo difficile! Informatica di base – Linea 1 9 Linguaggi di programmazione di alto livello • I linguaggi di programmazione di alto livello permettono di specificare istruzioni in linguaggi più semplici per l’uomo: – istruzioni più complesse rispetto alle istruzioni elementari eseguite dal processore – il compilatore trasforma ogni istruzione di un programma di alto livello in una o più (spesso molte di più!) istruzioni elementari Informatica di base – Linea 1 10 Codifica del software Informatica di base – Linea 1 11 Quanta automazione? • Il passaggio dal codice di alto livello al codice in linguaggio macchina è automatico • E’ possibile semplificare ulteriormente la creazione di codice? – in parte sì (ad esempio, riutilizzo del codice) – in buona parte no: è un’operazione che deve essere svolta manualmente dai programmatori Informatica di base – Linea 1 12 Quanto è difficile? • E’ difficile scrivere codice di alto livello? – molto meno che scrivere il codice in linguaggio macchina – semplici programmi sono facili da scrivere • un corso universitario è sufficiente per imparare le basi – programmi complessi e/o di grandi dimensioni sono più difficili da scrivere • spesso contengono errori Informatica di base – Linea 1 13 Errori dei programmi Informatica di base – Linea 1 14 Errori dei programmi (2) Informatica di base – Linea 1 15 Errori dei programmi (3) Informatica di base – Linea 1 16 Terza Parte: Cosa sono gli algoritmi Non c’entrano nulla con i “logaritmi”! Informatica di base – Linea 1 17 Gli “algoritmi” che conoscete già • Serie di istruzioni finalizzate a conseguire uno scopo: – come si cucina una torta? – come si fa una somma in colonna? – come si monta un mobiletto? • Queste sono procedure, non algoritmi, ora scopriamo la differenza... Informatica di base – Linea 1 18 Cos’è un algoritmo • Procedimento che permette di risolvere un dato problema attraverso una serie di passi eseguiti in una sequenza specificata: – assume in input delle informazioni – produce in output delle informazioni Problema Input Algoritmo Informatica di base – Linea 1 Output 19 Algoritmo: 5 proprietà fondamentali • Input specificato: – bisogna specificare cosa l’algoritmo assume in input • Output specificato: – quali risultati può generare l’algoritmo • Determinatezza • Efficacia • Terminazione Informatica di base – Linea 1 20 Determinatezza • L’algoritmo specifica precisamente la sequenza di operazioni • Ogni operazione deve avere una sola interpretazione possibile • Esempio: – “eseguire i passi necessari” “eseguire i passi 1, 2, 5” – “aggiungete un po’ di sale” “aggiungete 4g di sale” Informatica di base – Linea 1 21 Efficacia (o calcolabilità) • L’algoritmo deve poter essere eseguito in modo meccanico • Deve essere possibile calcolare ogni operazione • Ad ogni passo si ha la conoscenza: – degli input dell’algoritmo – dei risultati calcolati nei passi precedenti Informatica di base – Linea 1 22 Terminazione • Come potrebbe non terminare una procedura? – alcune operazioni possono essere ripetute – se fossero ripetute all’infinito, la procedura potrebbe non terminare Informatica di base – Linea 1 23 Programmi e algoritmi • Un programma è un algoritmo espresso in un particolare linguaggio di programmazione: – un programma implementa un algoritmo – un algoritmo può essere implementato in diversi modi • Gli informatici studiano principalmente gli algoritmi – ma anche come possono essere implementati Informatica di base – Linea 1 24 Programmi e algoritmi Problema possono esistere più algoritmi per risolvere lo stesso problema Input Algoritmo Output un algoritmo può essere implementato con linguaggi diversi Programma Informatica di base – Linea 1 25 Dal problema al programma Espressi in linguaggio naturale Problema lavoro umano Espressi in linguaggi formali Algoritmo implementazione (fatta dall’uomo) Codice di alto livello Compilazione e assemblamento Codice oggetto 26 Linguaggi naturali vs formali • Linguaggi naturali: – es: italiano, inglese, etc... – sono soggetti ad interpretazioni • Linguaggi formali: – es: assembly, C++, Java (2 linguaggi di alto livello) – sono univocamente interpretabili Informatica di base – Linea 1 27 Terza Parte: Pensiamo in modo algoritmico! “Mmm, qua diventa difficile....” Informatica di base – Linea 1 28 Prendiamo un problema reale • Abbiamo dei CD in una scaffalatura – uno spazio per ogni CD • Ogni CD ha un prezzo • Vogliamo mettere il CD con il prezzo minore all’inizio della scaffalatura (a sinistra) • Definiamo l’algoritmo MEAS (=Metti Economico A Sinistra) – MEAS è un nome inventato solo per questa lezione! Informatica di base – Linea 1 29 Input e Output • Input: una sequenza di CD che riempie completamente una scaffalatura orizzontale. • Es: 5 2 4 1 • Output: al termine, i CD in input sono in un ordine tale che il CD con il prezzo minore è nella prima posizione a sinistra dello scaffale. • Es: 1 5 4 2 Informatica di base – Linea 1 30 Procedura MEAS 1. Sia alfa la prima posizione a sinistra 2. Sia beta la posizione appena a destra di alfa 3. Se il CD in posizione beta costa meno del CD in posizione alfa, allora scambia il CD in posizione alfa con il CD in posizione beta 4. Se c’è almeno una posizione a destra di beta, sposta beta a destra di una posizione e torna al passo 3, altrimenti termina Informatica di base – Linea 1 31 Esempio 5 • Input: • Passo 1: 5 2 2 4 4 1 1 • Passo 2: 5 2 4 1 • Passo 3: 2 5 4 1 • Passo 4: 2 5 4 1 + torna al passo 3 alfa alfa beta alfa beta alfa beta 32 Esempio (cont.) • Passo 3: 2 5 • Passo 4: 2 • Passo 3: 1 alfa alfa alfa 4 1 5 4 1 + torna al passo 3 5 4 beta beta 2 beta • Passo 4: termina. Informatica di base – Linea 1 33 La procedura MEAS è un algoritmo? • • • • Input e un output sono definiti Ogni istruzione è deterministica Ogni istruzione può essere calcolata L’algoritmo termina: – perché ad ogni iterazione del ciclo (istruzioni 3 e 4) beta indica una posizione sempre più a destra e le posizioni sono finite • Dunque la procedura MEAS è un algoritmo Informatica di base – Linea 1 34 Diagramma di flusso • Serve per rappresentare in forma grafica i passi di un algoritmo – permette di visualizzare i blocchi di istruzioni, le scelte, le iterazioni, … • Serve ai programmatori, non ai computer… Informatica di base – Linea 1 35 Diagramma di flusso Inizio Beta è la posizione successiva CD in pos. beta costa meno CD in pos. alfa? Alfa è la prima posizione a sinistra sì Scambia CD in pos alfa e beta no Sposta beta a destra di una posizione sì C’è almeno una posizione dopo beta? no Termina 36 Informatica di base – Linea 1 37 Ordinamento dei CD • Consideriamo un nuovo problema: – vogliamo ordinare tutti i CD in base al loro prezzo • Possiamo: – trovare un metodo completamente nuovo oppure – estendere il metodo precedente Informatica di base – Linea 1 38 Input e Output • Input: una sequenza di CD che riempie completamente una scaffalatura orizzontale. • Es: 5 2 4 1 • Output: al termine tutti i CD in input sono ordinati a seconda del loro prezzo, da sinistra (il più basso) a destra (il più alto). • Es: 1 2 4 5 Informatica di base – Linea 1 39 Idea! • Eseguo MEAS una volta e metto il CD più economico a sinistra • Poi eseguo MEAS un’altra volta, considerando tutte le posizioni tranne la prima (il più economico è già nella prima posizione) – metto il secondo più economico al secondo posto • Continuo fino a quando non l’ho fatto per tutti! Informatica di base – Linea 1 40 Esempio • Applico MEAS a 5 – ottengo: 1 2 5 4 4 1 2 • Nella prima posizione c’è il CD giusto • Applico MEAS a 5 4 2 – ottengo: 2 5 4 • Nella seconda posizione c’è il CD giusto • Applico MEAS a 5 4 – ottengo: 4 5 • Nella 3° e 4° posizione ci sono i CD giusti Informatica di base – Linea 1 41 MEAS Procedura OrdinaCD 1. Sia alfa la prima posizione a sinistra 2. Sia beta la posizione appena a destra di alfa 3. Se il CD in posizione beta costa meno del CD in posizione alfa, allora scambia il CD il posizione alfa con il CD in posizione beta 4. Se c’è almeno una posizione a destra di beta, sposta beta a destra di una posizione e torna al passo 3 5. Se ci sono almeno due posizioni a destra di alfa, sposta alfa alla posizione appena a destra di alfa e torna al passo 2 6. Termina Informatica di base – Linea 1 42 Per capire meglio • Alfa è la posizione in cui vogliamo mettere il CD più economico rimasto tra quelli da considerare – all’inizio è la prima posizione, poi si sposta verso destra • Ogni volta che cambio il valore di alfa, beta “scorre” tutti quelli successivi alla ricerca del CD più economico rimasto Informatica di base – Linea 1 43 Prova tu! • Inventati qualche input e prova ad “eseguire a mano” l’algoritmo OrdinaCD: – esempio: 7 2 9 3 4 • Prova a disegnare il diagramma di flusso di OrdinaCD: – parti dal diagramma di flusso di MEAS e modificalo Informatica di base – Linea 1 44 OrdinaCD è un algoritmo? • • • • Input e un output sono definiti Ogni istruzione è deterministica Ogni istruzione può essere calcolata L’algoritmo termina: – perché beta indica una posizione sempre più spostata a destra (e le posizioni sono finite!) – ogni volta che beta arriva all’ultima posizione, alfa viene spostato a destra (e le posizioni sono finite!) • Dunque la procedura OrdinaCD è un algoritmo Informatica di base – Linea 1 45 Quarta parte: La complessità computazionale “Ahi, se si chiama “complessità”, tanto facile non deve essere…” Informatica di base – Linea 1 46 Avremmo potuto usare un algoritmo diverso? • Certo, esistono diversi algoritmi diversi per ordinare • “Ma allora qual è il migliore?” • Quello che utilizza meglio le risorse del computer: – tempo di calcolo – spazio di memoria Informatica di base – Linea 1 47 “Qua stai barando!” • “Mi hai appena detto che un algoritmo è una cosa teorica, indipendente da come viene implementata ed eseguita su un computer!” • “Non mi puoi mica venire a dire che per confrontare due algoritmi vai a guardare quanto tempo ci mettono le loro implementazioni (cioè i programmi) ad essere eseguite su un computer!” Informatica di base – Linea 1 48 La complessità computazionale • E’ possibile misurare la complessità di un algoritmo, indipendentemente dalla sua implementazione o dal computer sul quale viene eseguito • Il tempo non è misurato in termini di secondi ma in termini di altri parametri: – nell’esempio dei CD, potremmo scegliere il numero di scambi che dobbiamo fare Informatica di base – Linea 1 49 Esempio: la complessità di MEAS • Assumiamo che il nostro input sia composto da n CD: quante volte eseguiamo il ciclo per confrontare il prezzo di due CD? • Soluzione: “circa” n – “circa”: non ci interessa il risultato esatto (es: n-1 o 2n), ci interessa il comportamento asintotico • Il tempo di calcolo di MEAS è lineare nella dimensione dell’input: – se raddoppia l’input (il numero di CD), raddoppia il tempo necessario per calcolare l’output Informatica di base – Linea 1 50 Esempio: la complessità di OrdinaCD • Vai a rivedere i due algoritmi: quale sarà la complessità di OrdinaCD? • Per spostare alfa a destra di una posizione bisogna eseguire MEAS una volta – alfa deve essere spostato a destra n volte • Soluzione: la complessità di ordinaCD è di n2 – se raddoppia il numero di CD in input, il tempo necessario per completare l’algoritmo è di 4 volte tanto Informatica di base – Linea 1 51 “Non mi sembra così importante” • “I computer sono così veloci, cosa vuoi che mi interessi se un algoritmo risolve un problema un po’ più velocemente di un altro?” – esistono problemi così “difficili” che, se non si trovano algoritmi efficienti, la loro implementazione (cioè il programma) potrebbe richiedere anni di esecuzione (anche migliaia di anni!) prima di trovare la soluzione Informatica di base – Linea 1 52 Un esempio (di bioinformatica) • Problema: determinare l’avvolgimento di una proteina a partire dalla sequenza di amino acidi (protein folding) • E’ un problema tanto difficile che non sono noti algoritmi efficienti per risolverlo – “perché è così difficile?” – “a cosa ci serve sapere che è difficile?” l’analisi della complessità di un algoritmo vi permette di rispondere a queste domande Informatica di base – Linea 1 53 Un altro esempio: la ricerca (1) • Problema: ricercare un valore in un elenco di n elementi • Soluzione semplice: – scorro tutti i valori fino a quando non trovo quello che mi serve – complessità computazione: n (lineare) • Soluzione avanzata (richede che l’elenco sia ordinato) – complessità computazionale: log2 n (logaritmica) Informatica di base – Linea 1 54 Un altro esempio: la ricerca (2) • Per elenchi piccoli, quasi non fa differenza – ma per elenchi lunghi, la differenza è enorme! • Esempio: n = 1012 = 1 000 000 000 000 – soluzione semplice: 1 000 000 000 000 di confronti – soluzione avanzata: log2 1012 ≈ 40 • Esempio: se Google usasse la soluzione semplice ci metterebbe anni per effettuare una sola ricerca... invece ci mette pochi millisecondi! Informatica di base – Linea 1 55 Quinta parte: Riepilogo Informatica di base – Linea 1 56 Gli algoritmi • Cos’è un algoritmo • Quali sono le proprietà di un algoritmo: – Input definito – Output definito – Determinatezza – Efficacia – Terminazione Informatica di base – Linea 1 57 Come si ragiona in modo algoritmico? • Capacità che dovete acquisire: – come si può trovare un algoritmo che risolva un (semplice) problema? – dato un algoritmo, sono in grado di capire cosa fa? • I diagrammi di flusso possono aiutarvi a capire meglio un algoritmo Informatica di base – Linea 1 58 Dove studiamo? • Sul libro di testo (Snyder, “Fluency”): – Capitolo 7, sezione “Software” e “Programmazione avanzata” – Capitolo 8 Informatica di base – Linea 1 59 Esercizi • Vi è richiesto di acquisire la capacità di generare degli algoritmi che risolvano dei semplici problemi • Negli esercizi che seguono: – trovate l’algoritmo che risolve il problema – disegnate il diagramma di flusso corrispondente • se vi risulta più semplice, partite dal diagramma di flusso e POI trovate l’algoritmo – eseguite qualche prova per verificare che il vostro algoritmo sia corretto Informatica di base – Linea 1 60 Esercizi 1. Dato uno scaffale pieno di CD, si calcoli il numero dei CD 2. Dato uno scaffale pieno di CD, si calcoli il prezzo medio dei CD 3. Dato un numero intero positivo n, si dica se n è primo: – Un numero n è primo se non può essere diviso per nessun altro numero intero ad eccezione di 1 e di n Informatica di base – Linea 1 61 Esercizi 4. Si descriva l’algoritmo per effettuare una somma “in colonna” di due numeri, entrambi di due cifre – iniziate con: sia a1 la cifra più a destra del primo numero, a2 la cifra più a sinistra.... 5. Si modifichi l’algoritmo OrdinaCD in modo tale che, se ci fossero degli spazi vuoti nello scaffale, questi vengano ordinati tutti sulla destra Informatica di base – Linea 1 62