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