Informatica! appunti dalle lezioni dal 18/09/2012 al 28/09/2012!!
Definizioni! Informatica: scienza per l elaborazione automatica dell informazione! Informatica = Informazione + Automatica! Informazione: sequenza di simboli a cui associamo un significato! Automatica: creazione di dispositivi artificiali a cui delegare compiti normalmente attribuiti a persone!
Contesto! Il compito di un ingegnere è di trovare la soluzione a un problema! L informatica tratta solo di problemi di elaborazione dell informazione! Una soluzione con particolari caratteristiche prende il nome di algoritmo!
Algoritmo! Un algoritmo è una sequenza finita di istruzioni comprensibili all esecutore ed eseguibili! La sequenza deve essere deterministica, ossia ogni volta che un istruzione viene eseguita, è determinata l istruzione successiva! Il caso e le scelte sono esclusi dagli algoritmi!
Computer! Escludendo il caso e la scelta, gli algoritmi sono soluzioni che possono essere automatizzate! Il computer, in origine concepito come persona che fa di conto, diventa il calcolatore come lo conosciamo oggi, perché sostituibile da una macchina!
Raffinamento di algoritmi! Un algoritmo può illustrare le azioni da eseguire a un livello arbitrario di dettaglio! Il livello giusto è quello che rende le azioni comprensibili all esecutore! La riscrittura di un algoritmo con un maggiore dettaglio prende il nome di raffinamento!
Diagramma di flusso! Notazione grafica per esprimere algoritmi! inizio! sì! condizione?! no! istruzione! fine!
Algoritmo per cuocere la pasta! acqua in pentola! pentola sul fuoco! attendi! sì! bolle?! no! sale! no! pasta! attendi! cotta?! scola! sì!
Considerazioni! Quando ci sono ripetizioni nell algoritmo, tipicamente si formano cicli (anelli, loop) nel diagramma di flusso! Il determinismo degli algoritmi vieta che vi siano due freccie uscenti da un istruzione!
Programmi! Un algoritmo può essere espresso in diversi modi:! in un linguaggio naturale (es. italiano)! con una notazione grafica (es. diagramma)! in un linguaggio comprensibile al calcolatore (es. C++)! Si definisce programma un algoritmo scritto in un linguaggio comprensibile al calcolatore!
Soluzioni a un problema! Se esiste una soluzione a un problema, ne esistono molte altre! Il problema della ricerca di un nome nell elenco telefonico, ad esempio, ha due possibili algoritmi:! ricerca sequenziale! ricerca binaria!
Ricerca sequenziale! Si parte dall inizio e si scorre l elenco fino a che non si trova il nome cercato.! Caso migliore: il nome cercato è all inizio dell elenco! Caso pessimo: il nome cercato è alla fine dell elenco!
Ricerca binaria! Si apre l elenco a metà, se il primo nome presente viene prima di quello cercato, si considera la seconda metà dell elenco, altrimenti si prende la prima metà! Si ripete finché non si trova il nome cercato!
Confronto tra algoritmi! In media la ricerca binaria fornisce risultati più rapidi (ma non sempre: se il nome è all inizio dell elenco la ricerca sequenziale è la migliore)! Per un confronto completo tra algoritmi bisogna considerare il caso ottimo, il caso pessimo, e il caso medio! Molti algoritmi si basano inoltre su importanti ipotesi: se l elenco non è in ordine alfabetico, ad esempio, la ricerca binaria non può essere applicata, e quella sequenziale è l unica scelta possibile!
Proprietà degli algoritmi! Correttezza!!Un algoritmo è corretto quando fornisce la soluzione che ci si aspetta, quella per cui l algoritmo è stato creato! Efficienza!!Un algoritmo è efficiente quando ottiene il risultato con un consumo minimo di risorse (energia, tempo, etc.)! La correttezza è generalmente più importante!!
Ricordarsi che...! Il computer fa quello che gli dite di fare, NON quello che volete che lui faccia.!
Altro problema: MCD! Dati due numeri x, y, trovarne il massimo comun divisore! Un algoritmo molto semplice cerca il MCD a partire dal più piccolo tra x e y, e diminuendo ogni volta di un unità, finché non si trova un numero che li divide entrambi (caso migliore: uno dei due è il MCD, caso peggiore: il MCD vale 1)!
: input x,y : output : assegnamento di valore sì x y? no m y m x sì m divide sia x sia y? no m m m- 1
Assegnamento e variabili! la scrittura x y rappresenta l operazione che copia il valore di y in x, chiamata assegnamento! x e y si chiamano variabili (perché il loro valore può variare)! attenzione: il vecchio valore di x viene sovrascritto (e quindi perso)!
Sulla correttezza degli algoritmi! Dimostrare la correttezza degli algoritmi è tutt altro che semplice! Per dimostrare che un algoritmo NON è corretto basta UN SOLO caso in cui esso non fa quello che ci si aspetta! Per la correttezza, invece, si dovrebbe dimostrare che l algoritmo funziona in TUTTI i casi! Per certi algoritmi, tale dimostrazione è possibile (ad esempio per un algoritmo per l MCD inventato dal matematico Euclide, si può fare la dimostrazione in matematica)! Per gli algoritmi per cui non è possibile fare una dimostrazione di correttezza, non rimane che il testing: farli funzionare con una serie di input e controllarne gli output! Più è grande l insieme di input usati per il testing, più possiamo essere certi della correttezza!
Le operazioni della CPU! Il processore di un calcolatore, dal momento che è un circuito elettronico, può solo ricevere segnali elettrici in ingresso, ed emetterne altri in uscita! Un modo di vedere la sua attività è quello di interpretare questi segnali elettrici come numeri, e vedere il processore come un esecutore di operazioni logico-aritmetiche!
Interpretazione! Ciò che realmente succede: può essere visto come: input numerico CPU output numerico
Il concetto di codifica! La codifica è una corrispondenza iniettiva tra entità di qualunque genere e numeri interi!
Codifica binaria! Il processore, abbimo detto, lavora solo con segnali elettrici, che vanno codificati numericamente perché il computer sia in grado di elaborare testi, immagini e suoni! Segnali elettrici a valori alti di tensione vengono fatti corrispondere al numero 1! Segnali elettrici a valori bassi di tensione vengono fatti corrispondere al numero 0! Questa si chiama codifica binaria! Da questo punto di vista, il calcolatore opera solo con due cifre: 0 e 1! Tutta l informazione che un calcolatore elabora viene espressa con queste due cifre, per mezzo della codifica binaria!!
Numerazione: le basi! Noi siamo abituati a una numerazione basata su 10 cifre: da 0 a 9! La base della nostra numerazione è il 10:!!147 = 7 x 10 0 + 4 x 10 1 + 1 x 10 2! La base del sistema binario è il 2:!!1011 = 1 x 2 0 + 1 x 2 1 + 0 x 2 2 + 1 x 2 3!!Se si svolge il calcolo si ottiene il numero che, in base 10, corrisponde a 1011 in base 2.!!
Base 2 -> Base 10! 1011 2, ossia 1011 in base 2, a che numero in base 10 corrisponde?! Stiamo cercando la x tale che: 1011 2 = x 10! Basta ricordarsi la definizione di base 2:!!1011 = 1 x 2 0 + 1 x 2 1 + 0 x 2 2 + 1 x 2 3 = 11! Perciò 1011 in base 2 vuol dire 11 in base 10:!!1011 2 = 11 10! Il nostro 11 è per il calcolatore 1011!
Base 10 -> Base 2! Il metodo per esprimere in base 2 un numero dato in base 10 è il seguente! Cerchiamo la x tale che: 25 10 = x 2! Si procede con una sequenza di divisioni per 2, fintantoché il quoziente non diventa 0, e scrivendo la sequenza dei resti in ordine inverso!
Come si scrive 25 in base 2?! 25 : 2 = 12 con resto 1! 12 : 2 = 6 con resto 0! 6 : 2 = 3 con resto 0! 3 : 2 = 1 con resto 1! 1 : 2 = 0 con resto 1! Una volta ottenuto il quoziente pari a 0, scriviamo i resti in ordine inverso:!!25 10 = 11001 2!
Verifica del metodo! 11001 è davvero la codifica in base 2 di 25?! Basta svolgere i calcoli basati sulla definizione di sistema binario! 11001 2 = 1 x 2 0 + 1 x 2 3 + 1 x 2 4 = 1 + 8 + 16 = 25 10 (gli addendi con lo 0 sono stati omessi perché ovviamente non influiscono sulla somma)!
Numeri binari in memoria! In un calcolatore, i numeri binari sono tipicamente memorizzati in sequenze di caselle (note anche come parole) di lunghezza fissa dipendente dalla struttura del calcolatore stesso.! Ad esempio, una parola di 4 bit può contenere il numero 0101 2! 0 1 0 1
Combinazioni possibili di numeri! Una parola di 4 bit può contenere 2 4 = 16 numeri binari diversi: da 0000 a 1111! In generale, una parola di n bit può contenere 2 n numeri binari diversi!
Dimensioni delle memorie! 8 bit = 1 Byte (1B)! 2 10 Byte = 1024 Byte = 1 KiloByte (1KB)! 2 20 Byte = 1048576 Byte = 1 MegaByte (1MB)! 2 30 Byte = 1073741824 Byte = 1 GigaByte (1GB)! 2 40 Byte = 1099511627776 Byte = 1 TeraByte (1TB)!
Interpretazioni possibili dei numeri! Se non ci preoccupiamo del segno dei numeri, e li consideriamo sempre positivi, la sequenza che va da 0000 2 a 1111 2 corrisponde ai numeri da 0 10 a 15 10! In generale, data una parola da n bit e interpretando i numeri binari come numeri senza segno, solo positivi, i numeri esprimibili con tale parola vanno da 0 a 2 n -1!
Numeri con segno! Se vogliamo introdurre anche i numeri negativi, una possibililità è di usare il primo bit a sinistra per esprimere il segno del numero: 0 sta per +, 1 sta per -! Con questa convenzione, chiamata modulo e segno, 1010 2 = -2 10, e 0111 2 = 7 10! In generale, con una parola di n bit si possono esprimere i numeri compresi tra (2 n-1 1) e 2 n-1 1!
Complemento a due! La rappresenazione modulo e segno ha un inconveniente: ci sono due rappresentazioni per 0 10 : ad esempio, se si hanno parole da 4 bit, sia 0000 2 sia 1000 2 corrispondono a 0 10! Con la rappresentazione in complemento a due si ovvia a questo problema: 0 10 si rappresenta solo con 0000 2, +1 10 come al solito con 0001 2 mentre per ottenere la rappresentazione binaria di -1 10, si procede come segue!
Da numero positivo a negativo (1)! Data la rappresentazione binaria di +1 10 :!!0001 2! La rappresentazione di si ottiene così:! si invertono tutti i bit! si somma 1! Quindi, la rappresentazione in complemento a due di -1 10 è:!!1111 2!
Da numero positivo a negativo (2)! Analogamente per +2 10 :!!0010 2! La rappresentazione in complemento a 2 di per -2 10 è:!!1110 2! E così via fino a utilizzare tutte le configurazioni di bit possibili della parola! Con una parola da n bit, in complemento a due si possono rappresentare i numeri compresi tra tra 2 n-1 e 2 n-1 1 (da notare che c è un numero in più grazie al fatto che 0 10 ha un unica rappresentazione)!