Lucidi 10
Transcript
Lucidi 10
Informa(ca appun( dalla lezione del 4/12/2012 Ricorsione per il fattoriale! • Dato un intero n, si definisce il suo fattoriale (n!) così:! !n! = n*(n-1)*(n-2)*(n-3)*…*3*2*1 0! = 1 per definizione! • Anche il calcolo del fattoriale di n può essere risolto in maniera ricorsiva:! – caso base: if (n==0) return 1;! – ipotesi: supponiamo di conoscere (n-1)!! – passo: n = n * (n-1)!! Integrazione! int fattoriale(int n){! !if (n==0)! !!return 1;! !else! !!return n*fattoriale(n-1);! }! Stringhe! • Sono sequenze di caratteri, e C++ fornisce un tipo (string) per gestirle, includendo (se il compilatore lo richiede) la libreria omonima: #include <string>! • Esempio di dichiarazione e assegnamento di valore:! Mario !string nome;! !nome = “Mario”;! !cout << nome;! Caratteristiche delle stringhe! • Le stringhe, a differenza degli interi, vengono inizializzate automa(camente: string s; //s ha già un valore: “ ” (stringa vuota) • Per l’input di una stringa può servire un altro comando oltre a cin, perché gli spazi vengono considera( come separatori: cin >> s; //se l’input è “molto bene”, s riceve solo “molto” getline(cin,s); //in questo modo, tuOo l’input fino all’enter premuto //dall’utente finisce in s Differenze con gli array! • Le stringhe sono sequenze di caratteri, quindi potrebbero essere paragonate ad array di caratteri, ma vi sono differenze! • Le stringhe possono essere parametro di cin e cout direttamente, mentre con gli array serve sempre un ciclo for per fare cin e cout del contenuto delle loro celle! • Gli array hanno una dimensione fissa predeterminata, mentre le stringhe possono cambiare dimensione durante l’esecuzione del programma: le stringhe sono strutture dati dinamiche! Funzioni string! • concatenazione (+): crea una nuova stringa a partire da due stringhe unendole in un’unica sequenza di caratteri! • length: restituisce la lunghezza di una stringa, ossia il numero dei suoi caratteri; si invoca per mezzo della dot notation! • substr: prende due parametri (i, lung) e restituisce una sottostringa che inizia all’iesima posizione della stringa iniziale ed ha lung caratteri; anche substr vuole la dot notation! Uso di funzioni string! string n = “mario”;! mario rossi string c = “rossi”;! 11 io r string nc = n + “ ” + c;! int x = nc.length();! string s = nc.substr(3,4);! cout << nc << “\n” << x << “\n” << s; ! Palindroma ricorsiva (codice)! bool palindroma(string s){! if (s.length()==0 || s.length()==1)! !!return true;! else! !!return (s.substr(0,1)==s.substr(s.length()-1,1)! !! ! ! ! !&& ! ! !palindroma(s.substr(1,s.length()-2)));! }! !! Versione alternativa! bool palindroma(string s){! if (s.length()==0 || s.length()==1)! !!return true;! else! !!if (s.substr(0,1)!=s.substr(s.length()-1,1))! !! !return false;! !!else! !! !return palindroma(s.substr(1,s.length()-2));! }! !! Iterazione vs ricorsione! • Ogni algoritmo ricorsivo può essere riscritto in forma iterativa: tipicamente con un ciclo for o un ciclo while, e senza che nel codice sia inclusa una chiamata ricorsiva della funzione! Palindroma iterativa (pseudocodice)! bool palindroma(stringa s){! !while (s non è vuota && s non è 1 char){! !!if (primo_char(s)!=ultimo_char(s))! !! !return false;! !!else! !! !s = sottostringa(s);! !}! !return true;! }! Memorie! • Dispositivi in grado di conservare al loro interno informazione per un intervallo di tempo significativo! RAM chiavetta USB CD/DVD SD card Hard disk Tecnologie diverse! elettronica ottica magnetismo Caratteristiche diverse! • Velocità! • Non volatilità! • Tolleranza ai guasti! Caratteristiche diverse! • Costo (a parità di dimensione)! ! Hard disk! • E’ il dispositivo di memoria con la maggiore capacità: centinaia di GB contro qualche unità di GB degli altri dispositivi! • E’ anche il dispositivo più suscettibile ai guasti a causa delle parti meccaniche che lo compongono (testina di lettura/ scrittura su braccio mobile e dischi magnetici rotanti), ed è il più lento! • I dischi sono divisi in settori concentrici, ciascuno dei quali diviso in blocchi! • Quando c’è la richiesta di una scrittura/lettura di un dato in un blocco, la testina deve essere posizionata sul blocco corretto! • Tale posizionamento necessita di un tempo con due componenti: seek time (posizionamento sul settore giusto) e latenza (attesa della rotazione del disco perché il blocco giusto raggiunga la testina)! • A tali tempi bisogna aggiungere il tempo necessario per il trasferimento dei dati dal disco alla RAM (transfer time)! Memorie elettroniche non volatili! • Le chiavette USB, le SD card, e i più recenti hard disk a stato solido sono basati su tecnologia elettronica, ma, a differenza delle RAM, non sono volatili! • La non volatilità è data da uno strato di ossido scrivibile e cancellabile (per mezzo di appositi valori di tensione) che si accompagna in questi dispositivi ai circuiti elettronici! • In origine chiamati memorie flash perché l’alta tensione usata per cancellarle era paragonata a un flash (Toshiba, primi anni ‘80)! • I primi modelli potevano solo essere cancellati completamente, oggi la cancellazione è selettiva e l’utente può scegliere quali file cancellare e quali conservare! Gerarchia di memorie! • Tutti i dispositivi di memoria che sono presenti nell’architettura di un calcolatore sono organizzati in una gerarchia! più veloce Registri Cache RAM più grande Hard disk Gerarchia di memorie! • Ogni livello comunica solo con i livelli immediatamente adiacenti! • I registri sono dispositivi di memoria direttamente connessi alla CPU (es.: PC, il Program Counter, contiene l’indirizzo in memoria della prossima istruzione da eseguire)! • La cache è un dispositivo di memoria direttamente connesso coi registri che riporta il contenuto di una parte della RAM! • Quando i dati viaggiano tra cache, registri, e CPU, non attraversano il bus del calcolatore, perché questi 3 dispositivi sono tutti costruiti su una stessa scheda elettronica (perciò si ottiene velocità molto maggiore)! Uso della gerarchia! • Quando necessita di un dato da elaborare, la CPU lo cerca nel dispositivo di memoria più vicino! • Se il dato non viene trovato, lo si cerca nel dispositivo di memoria successivo, con un costo maggiore in termini di tempo! • Nel peggiore dei casi, il dato va recuperato nell’hard disk, il dispositivo più lento di tutti!