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!