esercizi File
Transcript
esercizi File
Informatica compendio di esercizi Alessio Plebe e-mail: [email protected] 1 Macchina di Turing Gli esercizi sono all’incirca in ordine progressivo di difficoltà. Quelli contrassegnati con un asterisco sono particolarmente difficili, il lettore non si preoccupi se non riesce a risolverli. Notare che, come in generale nella programmazione, non vi è necessariamente una sola TM che risolve un problema, quindi negli esercizi in cui è richiesto di costruire una TM, il risultato potrà anche essere differente dalla soluzione indicata, senza per questo essere erroneo. T.1 Calcola il nastro di I/O finale, dato quello di partenza, e la TM ⇓ A STATO INPUT 0 0 1 1 2 A B A B - T.2 B NUOVO STATO 1 1 2 2 - OUTPUT ⇒ ⇒ - B A - Calcola il nastro di I/O finale, dato quello di partenza, e la TM ⇓ G STATO INPUT 0 0 1 1 2 2 3 4 G B G B G B - T.3 CASELLA NUOVO STATO 1 1 2 2 4 3 4 - G CASELLA OUTPUT ⇒ ⇒ ⇐ ⇒ ⇐ - B B G - Questa TM contiene un loop, e quindi potrebbe continuare all’infinito, sai dire qual’è la condizione che la ferma? STATO INPUT 0 0 1 1 2 x o x o - NUOVO STATO 1 0 1 2 - CASELLA OUTPUT ⇒ ⇒ ⇒ - o x o - 1 T.4 Verifica, per ciascuno dei tre nastri di I/O, se la TM si ferma p p ⇓ u p p STATO INPUT 0 0 1 1 2 2 3 p u p u p u - ⇓ p ∗ u NUOVO STATO 1 2 0 2 3 0 - p ⇓ p p u CASELLA OUTPUT ⇒ ⇒ ⇐ ⇐ - u p u u p - p T.5 Scrivi una TM che calcoli la disgiunzione logica tra due termini (la disgiunzione, che corrisponde più o meno all’italiano “oppure”, risulta falsa solo se entrambi gli operandi sono falsi, vera in tutti gli altri casi) T.6 Scrivi una TM i cui simboli possibili sono M/F, che cambi tutti gli M in F, andando verso destra, e fermandosi quando ha incontrato tre F di seguito. T.7 ∗ Scrivi una macchina di Turing i cui simboli possibili sono 0/1, che spostandosi verso destra trasformi sequenze 01 in 10 e viceversa, lasci invariate sequenze 11, e termini alla prima sequenza 00 . 2 21 Architettura dei computer Gli esercizi sono all’incirca in ordine progressivo di difficoltà. Quelli contrassegnati con un asterisco sono particolarmente difficili, il lettore non si preoccupi se non riesce a risolverli. Notare che, come in generale nella programmazione, non vi è necessariamente una sola soluzione a un problema, quindi negli esercizi in cui è richiesto di costruire una porzione di assembler, il risultato potrà anche essere differente dalla soluzione indicata, senza per questo essere erroneo. A.1 Calcola la situazione finale, dopo l’esecuzione di questo frammento di assembler RAM CPU 1000 mov $100A R1 1001 mov 20 1002 add R2 R1 1003 mov R1 $1007 R2 R1 744 R2 820 .... R3 0 .... 1006 343234 1007 10003 1008 0 1009 400000 100A 80 100B 325 100C 67588567 PC 1000 PS A.2 Calcola la situazione finale, dopo l’esecuzione di questo frammento di assembler RAM CPU 1000 1001 mov −10 R2 1002 add −20 R3 1003 add R2 R3 1006 mov R3 $100D R1 744 R2 820 R3 0 .... .... PC 1000 PS A.3 mov $100A R3 100A 130 100B 0 100C 400000 100D 80 100E 325 100F 67588567 Calcola la situazione finale, dopo l’esecuzione di questo frammento di assembler RAM CPU 100E mov $200F R2 100F add R2 1010 mov R2 $200E R2 R1 0 1011 add R2 R2 820 1012 mov R2 $200D R3 10000 .... .... PC PS 100E R2 200A 130 200B 0 200C 400000 200D 80 200E 325 200F 4 3 A.4 Calcola il contenuto della locazione di RAM 100B dopo l’esecuzione di questo frammento di assembler RAM CPU 1000 add 1001 jmpz $1004 1002 add R1 R2 −1 R1 R1 5 1003 jmp $1000 R2 0 1004 mov R2 $100B R3 3 .... 1005 PC 1000 Z PS 0 0 0 0 0 0 0 0 0 0 1006 1007 1008 1009 A.5 100A 3 100B 4 Sai dire se la CPU in queste condizioni può trovarsi in un loop infinito, e spiegare la tua risposta? RAM CPU R1 10 1000 mov 1 R2 1001 mov $100A R1 1002 add −1 R1 1003 mov R2 R3 R2 20 1004 jmpz $1006 R3 3 .... 1005 jmp $1002 1006 mov R2 $100B PC 1000 Z PS 0 0 0 0 0 0 0 0 0 0 1007 1008 1009 A.6 ∗ 100A 3 100B 4 Calcola il contenuto della locazione di RAM 100B RAM CPU R1 10 FFF mov $100A R2 1000 mov 0 1001 mov R2 R1 1002 add R1 R3 R1 R2 20 1003 add −1 R3 3 .... 1004 jmpz $1006 1005 jmp $1002 1006 add −1 1007 jmpz $1009 1008 jmp $1001 1009 mov PC FFF Z PS 0 0 0 0 0 0 0 0 0 0 A.7 A.8 A.9 ∗ R3 R2 R3 $100B 100A 3 100B 4 Calcola il contenuto in 100B, sempre nel A.6, nel caso in cui inizialmente 100A contenesse 5 Scrivi un pezzo di assembler che sommi due numeri che si trovano in RAM agli indirizzi 3003 e 3004, aggiunga 5 alla loro somma, e metta il risultato all’indirizzo 3005 ∗ Scrivi un pezzo di assembler che, dati due numeri n e m, che si trovano in RAM agli indirizzi 100A e 100B, calcoli nm , e lo scriva all’indirizzo 100C 4 2 Linguaggio Python Gli esercizi sono all’incirca in ordine progressivo di difficoltà. Quelli contrassegnati con un asterisco sono particolarmente difficili, il lettore non si preoccupi se non riesce a risolverli. Notare che, come in generale nella programmazione, non vi è necessariamente una sola soluzione a un problema, quindi negli esercizi in cui è richiesto di costruire una propria funzione, il risultato potrà anche essere differente dalla soluzione indicata, senza per questo essere erroneo. La verifica può essere effettuata semplicemente usando l’interprete Python. P.1 Cosa risponde l’inteprete Python? >>> 2 * ( ’ci’ + ’ao ’ ) P.2 Cosa risponde l’inteprete Python? [ 3, ’si’ ] + [ ’no’, 2 ] P.3 Avendo definito la variabile che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> ( 2 + 1 ) * ( [ 8 + 12 ] + [ ‘‘fo’’ + ‘‘rti’’ ] ) P.4 Avendo definito la variabile che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> l = [ 10, ’sole’, 1.3, ’A’, 1 ] >>> l[ 1:4 ] P.5 Avendo definito la variabile che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> s = ’evviva’ >>> s[ 1 ] + s[ 0 ] P.6 Avendo definito la variabile che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> l = [ 10, ’luna’, [ ’sera’, ’alba’, ’giorno’ ], [ 2, 3 ], 21, 22 ] >>> l[ 2 ][ 1:3 ] P.7 Avendo definito la variabile che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> d = { ’giallo’ : [ ’oro’, ’sole’ ], ’rosso’ : [ ’fuoco’, ’rabbia’ ] } >>> d[ ’giallo’ ][ -1 ] P.8 ∗ Avendo definito la variabile che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> d = { ’giallo’ : [ ’oro’, ’sole’ ], ’rosso’ : [ ’fuoco’, ’rabbia’ ] } >>> d[ ’giallo’ ][ 0 ][ 0:2 ] + d[ ’rosso’ ][ 1 ][ 3:-1 ] P.9 Avendo definito la funzione che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> def scambia( s ): ... return s[ -1 ] + s[ 1 : -1 ] ... >>> scambia ( "blu" ) + s[ 0 ] 5 P.10 Avendo definito la funzione che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> def balbluz( s ): ... return s[ 0:2 ] + s ... >>> balbluz( "sai" ) P.11 Avendo definito la funzione che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> def pari( x ): ... return x == 2 * ( x / 2 ) ... >>> [ pari( 4 ), pari( 3 ) ] P.12 Avendo definito la funzione che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> def maschfemm( s ): ... if s[ -1 ] == "o": ... return s[ 0:-1 ] + "a" ... if s[ -1 ] == "a": ... return s[ 0:-1 ] + "o" ... return s ... >>> [ maschfemm( ’Carlo’ ), maschfemm( ’Angela’ ) ] P.13 Avendo definito la funzione dell’esercizio P.12, cosa risponderà l’inteprete Python con questa istruzione? map (maschfemm, [ ’caro’, ’amico’, ’bravo’, ’e’, ’bello’ ] ) P.14 Avendo definito la funzione che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> def somma( n ): ... s = 0 ... while n > 0: ... s = s + n ... n = n - 1 ... return s ... >>> somma( 5 ) P.15 ∗ Avendo definito la funzione che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> def conta( c, s ): ... n = 0 ... for l in s: ... if c == l: ... n = n + 1 ... return n ... >>> conta( "b", "basta bere abbondantemente" ) 6 P.16 ∗ Avendo definito la funzione che segue, cosa risponderà l’inteprete Python nella successiva istruzione? >>> def stringl( l ): ... s = "" ... for w in l: ... s = s + " " + w ... return s ... >>> stringl( [ ’tutto’, ’quello’, ’che’, ’vuoi’ ] ) P.17 Scrivi una funzione che produca il superlativo di un aggettivo dato, tenendo conto di maschile, femminile e plurali, ovvero che sia risultati di questo tipo: >>> iss ( ’bella’ ) ’bellissima’ >>> iss( ’brutti’ ) ’bruttissimi’ >>> iss( ’cattivo’ ) ’cattivissimo’ P.18 ∗ Scrivi una funzione che produca il vezzeggiativo di un aggettivo dato, tenendo conto di maschile, femminile e plurali, tenendo conto della particolarità delle vocali finali, ovvero he riesca a dare risultati di questo tipo: >>> ucc( ’cara’ ) ’caruccia’ >>> ucc( ’freddo’ ) ’fredduccio’ >>> ucc( ’teneri’ ) ’tenerucci’ >>> ucc( ’tiepide’ ) ’tiepiducce’ P.19 ∗ Riscrivi la funzione somma che effettua lo stesso calcolo di quella all’esercizio P.14, ma usando la ricorsione. 7 Soluzioni degli esercizi T.1 B ⇓ A T.2 ⇓ G B G T.3 una x seguita da o: T.4 Si ferma solo nel primo caso ⇓ vero/falso ··· x ··· o vero/falso vero/falso STATO INPUT NUOVO STATO CASELLA OUTPUT 0 0 1 1 2 3 4 5 falso vero falso vero - 1 2 3 4 4 5 5 - ⇒ ⇒ ⇒ ⇒ ⇒ - falso vero - T.5 STATO INPUT NUOVO STATO CASELLA OUTPUT 0 0 1 1 2 2 3 M F M F M F - 0 1 0 2 0 3 - ⇒ ⇒ ⇒ ⇒ ⇒ - F F F - STATO INPUT NUOVO STATO CASELLA OUTPUT 0 0 1 1 2 2 3 4 5 6 7 0 1 0 1 0 1 - 1 2 7 3 5 0 4 0 6 0 - ⇒ ⇒ ⇐ ⇐ ⇒ ⇒ ⇒ ⇒ - 1 0 0 1 - T.6 T.7 RAM CPU R1 100 1000 mov $100A R1 1001 mov 20 1002 add R2 R1 1003 mov R1 $1007 R2 R2 20 .... R3 0 .... 1006 343234 1007 100 1008 0 1009 400000 100A 80 100B 325 100C 67588567 1000 mov $100A R3 1001 mov −10 R2 1002 add −20 R3 1003 add R2 R3 mov R3 $100D PC 1003 PS A.1 RAM CPU R1 744 R2 −10 1006 R3 100 .... .... PC 1006 PS 100A 130 100B 0 100C 400000 100D 100 100E 325 100F 67588567 100E mov $200F R2 100F add R2 A.2 RAM CPU R1 0 mov R2 $200E 1011 add R2 mov R2 $200D R2 16 1012 R3 10000 .... .... PC PS 1012 R2 1010 R2 200A 130 200B 0 200C 400000 200D 16 200E 8 200F 4 A.3 8 A.4 10 A.5 Si, perché l’istruzione a 1003, mov R2 R3, non avendo risultato 0, spegne il bit Z del registro PS, e quindi la jumpz $1006 non avverrà mai A.6 10 A.7 35 RAM CPU 1000 mov $3003 R1 1001 mov $3004 R2 1002 add R2 R1 1003 mov R1 $3005 R1 744 R2 820 .... R3 0 .... 3003 343234 3004 10003 3005 0 PC 1000 PS A.8 RAM CPU R1 mov 1001 mov 1002 mov 1 1003 mul R2 R3 20 1004 add −1 R1 3 .... 1005 jmpz $1007 1006 jmp $1003 1007 mov R3 $100C 10 R2 R3 PC 1000 1000 Z PS 0 0 0 0 0 0 0 0 0 0 $100B R1 $100A R2 R3 1008 1009 100A 3 100B 4 100B A.9 P.1 ’ciao ciao ’ P.2 [3, ’si’, ’no’, 2] P.3 [20, ’forti’, 20, ’forti’, 20, ’forti’] P.4 [’sole’, 1.3, ’A’] P.5 ’ve’ P.6 [’alba’, ’giorno’] P.7 ’sole’ P.8 ’orbi’ P.9 ’ulb’ P.10 ’sasai’ P.11 [True, False] P.12 [’Carla’, ’Angelo’] P.13 [’cara’, ’amica’, ’brava’, ’e’, ’bella’] P.14 15 P.15 4 P.16 ’ tutto quello che vuoi’ P.17 >>> def iss( p ): ... return p[ 0 : -1 ] + ’issim’ + p[ -1 ] ... 9 P.18 >>> def ucc( p ): ... if p[ -1 ] in [ ’i’, ’e’ ]: ... return p[ 0 : -1 ] + ’ucc’ + p[ -1 ] ... return p[ 0 : -1 ] + ’ucci’ + p[ -1 ] ... P.19 >>> def somma( n ): ... if n < 1: ... return 0 ... return n + somma( n - 1 ) ... end 10