Esercitazione 1: Algoritmi, Aritmetica binaria

Transcript

Esercitazione 1: Algoritmi, Aritmetica binaria
Esercitazione n. 1
Algoritmi
Aritmetica binaria
Assembler
Queste slide sono distribuite con licenza Creative Commons
Attribuzione-Non commerciale-Condividi allo stesso modo 2.5 Italia
Algoritmi/1: acquistare un biglietto - Problema
Si vuole esplicitare un algoritmo che
descriva le operazioni che deve compiere
un viaggiatore che desidera acquistare un
biglietto del treno da una “macchinetta
automatica”.
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected]
2
Algoritmi/1: acquistare un biglietto - Algoritmo
1. scegliere la lingua
2. se la stazione di partenza non è quella attuale, scegliere la stazione
di partenza
3. scegliere la stazione di arrivo
4. scegliere il treno (l'orario di partenza)
5. selezionare l'eventuale riduzione
6. selezionare il metodo di pagamento
7. se il metodo di pagamento è “bancomat”, inserire la tessera e
digitare il codice
Passare al passo 9
8. se il metodo di pagamento è “moneta” inserire la moneta (e/o le
banconote)
9. ritirare il biglietto e l'eventuale resto
1. FINE
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected]
3
Algoritmi/1: acquistare un biglietto - Osservazioni
Si noti che l'algoritmo è sufficientemente
dettagliato perché possa essere eseguito da una
persona.
Comunque, alcune operazioni potrebbero essere
maggiormente dettagliate
(ad esempio, l'operazione “scegli il treno”).
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected]
4
Algoritmi/2: ritirare al Bancomat - Problema
Esplicitare un algoritmo per il ritiro di
denaro da uno sportello Bancomat
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected]
5
Algoritmi/2: ritirare al Bancomat - Algoritmo
1. Inserire la tessera
2. Digitare il codice segreto
3. Se il codice non è accettato, andare al passo 2
4. Scegliere l'operazione di prelievo denaro
5. Se la cifra desiderata è tra quelle visualizzate, andare al passo 9
6. Scegliere l'operazione “altro importo”
7. Digitare la cifra desiderata
8. Tornare al passo 5
9. Confermare l'importo desiderato
10. Scegliere se ritirare lo scontrino oppure no
11. Ritirare la tessera
12. Ritirare il denaro
13. Se si è scelto di ritirare lo scontrino, ritirarlo
14. FINE
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected]
6
Algoritmi/3: Ricerca in un insieme - Problema
Trovare un algoritmo per la ricerca di un
elemento in un insieme non ordinato
(per esempio un raccoglitore di fogli non
ordinato secondo alcun criterio)
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected]
7
Algoritmi/3: Ricerca in un insieme - Algoritmo
1. Posizionarsi all'inizio del raccoglitore
2. Se il foglio corrente è quello cercato, FINE: elemento
trovato
3. Se il foglio corrente è l'ultimo, FINE: l'elemento non
esiste nell'elenco
4. Selezionare il foglio successivo
5. Tornare al passo 2
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected]
8
Algoritmi/3: Ricerca in un insieme - Osservazioni
Si noti che l'algoritmo individuato (che fa una
ricerca sequenziale) non è adatto per una
ricerca in un elenco telefonico!
Infatti non tiene conto dell'ordinamento
(se c'è)
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected]
9
Algoritmi/4: Ricerca in un insieme ordinato - Problema
Si vuole definire un algoritmo per la ricerca di
un nome in un elenco telefonico
(cioè un algoritmo per la ricerca di un elemento
in un elenco ordinato, meglio noto come
algoritmo di ricerca binaria)
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 10
Algoritmi/4: Ricerca in un insieme ordinato - Algoritmo
1. aprire l'elenco a metà
2. se il nome cercato è nella pagina, FINE: elemento
trovato
3. se il nome cercato non è nella pagina, ma ci dovrebbe
essere se esistesse nell'elenco, FINE: nome non
esistente nell'elenco.
4. se il nome cercato è prima della pagina aperta,
selezionare la metà dell'elenco che precede la pagina
corrente, altrimenti selezionare la metà dell'elenco che
segue la pagina corrente
5. ripetere l'algoritmo usando come “elenco” la parte
selezionata al passo precedente.
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 11
Algoritmi/4: Ricerca in un insieme ordinato - Osservazioni
Si noti che l'algoritmo è più tedioso e dettagliato rispetto a quello che
naturalmente si esegue quando si cerca un nome in un elenco
telefonico. Normalmente, una persona aprirebbe l'elenco in una
posizione “casuale”, in un punto presumibilmente vicino a dove si
aspetta di trovare ciò che cerca (se uno cerca un cognome che inizia
per “T'” non comincia a cercare dalla metà, ma si porta vicino al
fondo).
Però, se si deve fare eseguire l'algoritmo a un computer, l'apertura
“casuale” dell'elenco non va bene, non è un concetto abbastanza
preciso. Questo algoritmo invece è preciso e può essere eseguito anche
da un computer.
Esercizio: il punto 2 potrebbe essere dettagliato maggiormente: si
provi a dettagliarlo meglio come esercizio per casa.
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 12
Algoritmi/4: Ricerca in un insieme ordinato - Osservazioni
Si noti che questo algoritmo si basa sull'idea che
ogni volta si ripete l'algoritmo stesso, ma su una
parte dei dati ogni volta più ristretta.
Questo è un classico esempio di ricorsione, tecnica
che verrà approfondita nelle prossime esercitazioni.
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 13
Algoritmi/5: Uscire da un labirinto - Problema
Si vuole trovare un algoritmo da applicare nel caso si debba
uscire da un labirinto...
L'algoritmo si basa sull'idea che si abbia un modo per tenere
traccia di dove si sia già passati.
L'idea di base è che man mano che si esplora un corridoio si
lasci una traccia, ad esempio sul pavimento, ad indicare che da
quel punto si è già passati.
➢ Deve esistere un criterio di scelta del corridoio da percorrere in
caso si arrivi a un bivio.
➢ Nel caso si arrivi a un vicolo cieco si deve poter tornare al
bivio precedente
➢
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 14
Algoritmi/5: Uscire da un labirinto - Algoritmo
1. Entrare nel labirinto
2. Se al bivio c'è la porta di uscita, FINE: si esce dal labirinto
3. Se si è al primo bivio, e tutte i corridoi sono stati esplorati,
FINE: il labirinto non ha uscita (cioè si sono esaurite
tutte le possibili strade che si potevano tentare e non si è
trovata un'uscita)
4. Se al bivio non ci sono corridoi (e questo non è il primo
bivio) tornare al bivio precedente
5. Se c'è almeno un corridoio non esplorato al bivio, prendere
il prima libero scegliendolo in senso orario. Andare in
fondo al corridoio fino al bivio successivo. Marcare il
corridoio
6. Tornare al passo 2
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 15
Algoritmi/5: Uscire da un labirinto - Osservazioni
Si tratta di un algoritmo che utilizza la tecnica
del backtracking:
si esplora una strada e se questa non porta da
nessuna parte (in questo caso si finisce in un
vicolo cieco) allora si torna indietro (in inglese,
“backtrack”) e si tenta un’altra strada. Fino
all'esaurimento di tutte le possibili strade o al
raggiungimento della condizione di uscita.
MazeGen
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 16
Algoritmi/6: MCD - Algoritmo
Algoritmo per il calcolo del Massimo Comun
Divisore (MCD) di due numeri:
1. Calcolare i divisori primi dei 2 numeri
2. Trovare i divisori primi comuni, ognuno con la minima
cardinalità
3. Moltiplicare i divisori primi così trovati
Nota: l'algoritmo è troppo generico e va quindi dettagliato
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 17
Algoritmi/7: mcm - Algoritmo
Algoritmo per il calcolo del minimo comune
multiplo (mcm) di due numeri:
1. Calcolare i divisori primi dei 2 numeri
2. Trovare tutti i divisori primi dei 2 numeri, ognuno con la
sua massima cardinalità tra quelle in cui compare nei due
numeri.
3. Moltiplicare i divisori primi così trovati
Nota: l'algoritmo è troppo generico e va quindi dettagliato
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 18
Algoritmi/6,7: Algoritmo per il calcolo divisori primi di N
Algoritmo per il calcolo dei divisori primi di un numero N
1. Considerare il numero primo 2. Chiamare NP questo
numero (se si preferisce, scrivere il numero 2 su un
foglietto)
2. Se il numero chiamato NP è > N, andare al passo 8
3. Se il numero N non è divisibile per NP (non esiste un Q tale
per cui N = Q * NP), andare al passo 6
4. Se N è divisibile per NP, cioè se esiste un Q tale per cui N =
Q * NP, scrivere Q al posto di N, e incrementare di 1 il
numero di volte che NP è divisore di N
5. Andare al passo 3
6. Prendere il più piccolo numero primo maggiore di NP;
chiamare NP questo numero
7. Andare al passo 2
8. FINE
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 19
Algoritmi/6,7: Algoritmo per trovare i divisori primi comuni a
due numeri
Algoritmo per trovare i divisori primi comuni a 2 numeri N1 e N2, con
la minima cardinalità
1. Se l'insieme dei divisori di N1 è vuoto, FINE
2. Prendere uno dei divisori di N1. Chiamare D questo divisore
3. Cercare se D è anche tra i divisori di N2. Se non lo è, eliminare
D dall'insieme dei divisori di N1, e tornare al passo 1
4. Se D è tra i divisori di N2, se C1 è la cardinalità con cui D
appare tra i divisori di N1 e C2 è la cardinalità con cui D appare
tra i divisori di N2, prendere il valore minimo tra C1 e C2.
Chiamare PD questo valore minimo. Aggiungere D tra i
divisori comuni di N1 e N2, con cardinalità PD
5. Eliminare D dagli insiemi di divisori comuni di N1 e N2.
Tornare al passo 1
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 20
Algoritmi/6,7: Verifica numero primo - Algoritmo
Algoritmo per determinare se un numero N è primo
1. Prendere 2 come contatore C
2. Se C è uguale a N, N è un numero primo. FINE
3. Se N è divisibile per C, N non è primo. FINE
4. Incrementare C di 1
5. Tornare al passo 2
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 21
Algoritmi/8: Bubblesort - Problema
Implementazione del cosiddetto algoritmo
di bubblesort per l'ordinamento di un
raccoglitore di fogli in ordine crescente
bubblesort
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 22
Algoritmi/8: Bubblesort - Algoritmo
1. Posizionarsi all'inizio del raccoglitore
2. Se si è arrivati all'ultimo foglio, e non è stata scambiata
nessuna coppia di fogli dall'ultima volta che è stato
eseguito il passo 1, FINE: l'insieme è ordinato
3. Se si è giunti all'ultimo foglio e sono stati fatti dei
cambiamenti dall'ultima volta che è stato eseguito il
passo 1, tornare al passo 1
4. Se il foglio corrente (che non è l'ultimo) è maggiore
del foglio successivo, scambiare i 2 fogli
5. Passare al foglio successivo
6. Tornare al passo 2
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 23
Algoritmi/9: Aritmetica binaria - DEC ­> BIN
Esplicitare un algoritmo per il passaggio da
forma decimale a forma binaria per un
numero N
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 24
Algoritmi/9: Aritmetica binaria - DEC ­> BIN
1. Se N è minore o uguale a 1, scrivere N su un pezzo
di carta e andare al passo 5
2. Dividere N per 2, e chiamare R il resto della
divisione intera, Q il suo risultato
3. Scrivere R su un pezzo di carta
4. Sostituire Q al posto di N. Andare al passo 1
5. Leggere i numeri scritti al contrario, dall'ultimo al
primo
6. FINE
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 25
Algoritmi/9: Aritmetica binaria - DEC ­> BIN - Esempio
Convertire il numero 37 in binario
N = 37
37 / 2 = 18 = Q,
R = 1
N = 18
18 / 2 = 9 = Q,
R = 0
N = 9
9 / 2 = 4 = Q,
R = 1
N = 4
4 / 2 = 2 = Q,
R = 0
N = 2
2 / 2 = 1 = Q,
R = 0
N = 1
Numero ottenuto: 100101
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 26
Algoritmi/10: Aritmetica binaria - BIN ­> DEC
Esplicitare un algoritmo per il passaggio
da forma binaria a forma decimale per un
numero N
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 27
Algoritmi/10: Aritmetica binaria - BIN ­> DEC
1. Inizialmente porre a 0 (scriverlo su un pezzo di carta)
il risultato parziale R, e a 1 la potenza corrente di 2
(che chiamiamo P)
2. Chiamare B la prossima cifra del numero binario,
letta da destra verso sinistra (cioè dalla cifra meno
significativa alla più significativa)
3. Moltiplicare B per P, e riscrivere al posto di R la
somma di R più B per P
4. Moltiplicare P per 2
5. Se non ci sono più cifre nel numero binario, FINE: il
risultato della conversione è R
6. Tornare al passo 2
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 28
Algoritmi/10: Aritmetica binaria - BIN ­> DEC - Esempio
Numero binario di partenza: 11100100
R = 0, P = 1,
B
B
B
B
B
B
B
B
=
=
=
=
=
=
=
=
0,
0,
1,
0,
0,
1,
1,
1,
R
R
R
R
R
R
R
R
=
=
=
=
=
=
=
=
0 + (1 * 0) =
0 + (2 * 0) =
0 + (4 * 1) =
4 + (8 * 0) =
4 + (16 * 0) =
4 + (32 * 1) =
36 + (64 * 1) =
100 + (128 * 1)
0,
0,
4,
4,
4,
36,
100,
= 228,
P
P
P
P
P
P
P
P
=
=
=
=
=
=
=
=
2
4
8
16
32
64
128
256
Numero decimale corrispondente: 228
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 29
Algoritmi/11: Aritmetica binaria - Somma di due numeri binari
N1 ed N2 - Algoritmo
0 + 0 = 0 con riporto 0
0 + 1 = 1 con riporto 0
1 + 0 = 1 con riporto 0
1 + 1 = 0 con riporto 1
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 30
Algoritmi/11: Aritmetica binaria - Somma di due numeri binari
N1 ed N2 - Algoritmo
1. Leggere la prima cifra binaria di ognuno dei due numeri, da
destra verso sinistra, chiamando B1 la cifra di N1, e B2 la
cifra di N2
2. Impostare il riporto R a 0
3. Se solo uno tra B1, B2 e R è 1, oppure se tutte e tre le cifre
valgono 1, scrivere 1 come prossima cifra del risultato della
somma, altrimenti scrivere 0
4. Se almeno due tra B1, B2 e R sono uguali a 1, poni R a 1,
altrimenti impostarlo a 0
5. Se non ci sono più cifre da leggere, andare al passo 8
6. Leggere la prossima cifra binaria di ognuno dei due numeri,
sempre da destra verso sinistra, chiamando B1 la cifra di N1,
e B2 la cifra di N2
7. Tornare al passo 3
8. Scrivere R
9. FINE
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 31
Algoritmi/11: Aritmetica binaria - Somma di due numeri binari
N1 ed N2 - Esempio 1
N1 = 0010001
N2 = 1010101
B1 = 1, I2 = 1,
B1 = 0, I2 = 0,
B1 = 0, I2 = 1,
B1 = 0, I2 = 0,
B1 = 1, I2 = 1,
B1 = 0, I2 = 0,
B1 = 0, I2 = 1,
non ci sono più
R = 0, scrivo 0
R = 1, scrivo 1
R = 0, scrivo 1
R = 0, scrivo 0
R = 0, scrivo 0
R = 1, scrivo 1
R = 0, scrivo 1
cifre, scrivo 0
e
e
e
e
e
e
e
metto
metto
metto
metto
metto
metto
metto
R
R
R
R
R
R
R
Il numero ottenuto alla fine è 1100110
(l'ultimo 0 scritto è trascurabile)
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 32
=
=
=
=
=
=
=
1
0
0
0
1
0
0
Algoritmi/11: Aritmetica binaria - Somma di due numeri binari
N1 ed N2 - Esempio 2
N1 = 11001111
N2 = 11100101
.|.|.|.0
.|.|.|0
.|.|.1
.|.|0
.|.1
.|1
.0
1
e
e
e
e
e
e
e
e
R
R
R
R
R
R
R
R
=
=
=
=
=
=
=
=
1
1
1
1
0
0
1
1
1
Risultato finale della somma:
110110100
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 33
Algoritmi/11: Aritmetica binaria - Somma di due numeri binari
N1 ed N2 - Esempio 3
N1 = 1001110011
N2 = 0111100110
?
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 34
Algoritmi/12: Aritmetica binaria – Passaggio da N a -N –
Algoritmo 1
Algoritmo per il passaggio da un numero (positivo o negativo)
N a -N, con rappresentazione in complemento a 2 con 8 cifre
binare (primo modo)
1. Complementare ogni singola cifra binaria in N (cioè
cambiare gli 0 in 1 e gli 1 in 0). Chiamare N' il numero così
ottenuto
2. Sommare 1 a N', il risultato è -N
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 35
Algoritmi/12: Aritmetica binaria – Passaggio da N a -N Esempi
Esempio 1:
N = 00100111
N' = 11011000
-N = 11011001
Esempio 2:
N = 01110100
N' = 10001011
-N = 10001100
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 36
Algoritmi/12: Aritmetica binaria – Passaggio da N a -N –
Algoritmo 2
Algoritmo per il passaggio da un numero (positivo o negativo) N a
-N, con rappresentazione in complemento a 2 con 8 cifre binare
(secondo modo)
1. Scandire la cifra binaria N da destra a sinistra (dalla cifra meno
significativa a quella più significativa), fino a che non si
incontra il primo '1'
2. Copiare questa porzione di numero così come è nelle cifre
meno significative di -N
3. Proseguire la scansione del numero N da destra a sinistra, ma da
questo punto le cifre lette vanno copiate in -N
COMPLEMENTATE (cioè scambiando gli '0' con gli '1' e
viceversa)
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 37
Algoritmi/12: Aritmetica binaria – Passaggio da N a -N –
Esempi
Esempio 1:
Esempio 2:
N = 00111010
-N = |.|.|.|0
|.|.|.1
|.|.|1
|.|.0
|.|0
|.0
|1
1
N = 00100000
-N =
100000
1
1
cioè -N = 11100000
cioè -N = 11000110
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 38
Algoritmi/fine: domanda difficile...
E se la domanda fosse:
implementa l'algoritmo di ricerca di
Google Search?
Esercitazioni di Fondamenti di Informatica – Politecnico di Milano sede di Cremona – A.A. 2010/2011 – Carlo Todeschini – [email protected] 39