Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Esercizi di Linguaggio e Logica delle Macchine: Anagrammi e XOR - Prof. D'Acquisto, Esercizi di Laboratorio Di Logica

esonero: programmazione python e logica proposizionale

Tipologia: Esercizi

2020/2021

Caricato il 05/06/2021

grace05_
grace05_ 🇮🇹

4.5

(4)

22 documenti

1 / 5

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Gioia Annalia Rocco, matricola 169983.
- ESAME DI LINGUAGGIO E LOGICA DELLE MACCHINE del 31/05/2021.
Quesito 1.
Lo XOR di due testi cifrati è uguale allo XOR dei rispettivi testi in chiaro e permette ad esempio di
identificare immediatamente porzioni di testo uguali, in quanto il risultato dello XOR è una sequenza di 0.
0100111010
0100010011
0001101001
In questo caso mediante tavole di verità, ho potuto individuare nella sequenza evidenziata in giallo la
chiave dell’algoritmo simmetrico di cifratura basato su XOR, usando le proprietà per le quali, se due bit
sono uguali scrivo 0, mentre nel caso siano diversi scrivo 1.
Procediamo applicando le stesse proprietà ora, a verificare che se inseriamo la chiave appena trovata in
ricezione, possiamo produrre il medesimo risultato.
0100010011
0101111010
0001101001
Quesito 2.
Codice:
s1 = input("Inserisci la prima parola: ")
s2 = input("Inserisci la seconda parola: ")
alist1 = list(s1)
alist2 = list(s2)
alist1.sort()
print(alist1)
alist2.sort()
print(alist2)
pf3
pf4
pf5

Anteprima parziale del testo

Scarica Esercizi di Linguaggio e Logica delle Macchine: Anagrammi e XOR - Prof. D'Acquisto e più Esercizi in PDF di Laboratorio Di Logica solo su Docsity!

Gioia Annalia Rocco, matricola 169983.

  • ESAME DI LINGUAGGIO E LOGICA DELLE MACCHINE del 31/05/2021. Quesito 1. Lo XOR di due testi cifrati è uguale allo XOR dei rispettivi testi in chiaro e permette ad esempio di identificare immediatamente porzioni di testo uguali, in quanto il risultato dello XOR è una sequenza di 0. 0100111010 0100010011 0001101001 In questo caso mediante tavole di verità, ho potuto individuare nella sequenza evidenziata in giallo la chiave dell’algoritmo simmetrico di cifratura basato su XOR, usando le proprietà per le quali, se due bit sono uguali scrivo 0, mentre nel caso siano diversi scrivo 1. Procediamo applicando le stesse proprietà ora, a verificare che se inseriamo la chiave appena trovata in ricezione, possiamo produrre il medesimo risultato. 0100010011 0101111010 0001101001 Quesito 2. Codice: s1 = input("Inserisci la prima parola: ") s2 = input("Inserisci la seconda parola: ") alist1 = list(s1) alist2 = list(s2) alist1.sort() print(alist1) alist2.sort() print(alist2)

pos = 0 matches = True while pos < len(s1) and matches == True: if alist1[pos] == alist2[pos]: pos = pos + 1 else: matches = False print("Sono due anagrammi?", matches) Spiegazione: Questo programma analizza due parole inserite in input e verifica se sono 2 anagrammi (parole con lo stesso numero di caratteri che hanno le lettere uguali ma in ordine diverso). Per esempio “nave” e “vane” sono due anagrammi, perché sono parole che hanno entrambe 4 lettere e sono costituite dalle stesse lettere, ma inserite in ordine diverso. Analisi riga per riga: s1 = input("Inserisci la prima parola: ") s2 = input("Inserisci la seconda parola: ") La funzione input() consente all’utente di inserire una stringa, e quindi un valore. In questo caso il valore viene passato alle due variabili s1 e s2 tramite l’assegnazione. s1 conterrà quindi la prima parola in formato stringa, ed s2 la seconda parola, sempre in formato stringa. alist1 = list(s1) alist2 = list(s2) La funzione list() prende come argomento un iterabile, ovvero un oggetto (come una stringa) che può essere separato in diversi valori (la stringa è un insieme di caratteri) e ritorna in output una lista, contenente i valori dell’iterabile. In questo caso quindi alist1 e alist2 sono due oggetti di tipo lista, contenenti rispettamente i caratteri di s1 per la lista alist1 e i caratteri di s2 per la lista alist.

while pos < len(s1) and matches == True: Con questa istruzione stiamo definendo come il ciclo deve funzionare e per quanto deve andare avanti. In particolare la condizione pos < len(s1), significa che il while scorrerà tante volte quanto sarà lunga la parola s1. Infatti len(s1) ritorna la lunghezza della parola, e dato che pos sarà incrementata di ciclo in ciclo, il while continuerà a funzionare fino a quando tutti i caratteri di s non saranno stati analizzati. Il while deve controllare anche un’altra condizione, che è concatenata alla prima grazie all’operatore and. L’altra condizione è matches == True, ovvero il ciclo deve continuare ad andare avanti fino a che il valore di matches non cambia, ovvero diventa False. Come già spiegato prima matches controlla che i due caratteri siano uguali o meno, e se anche solo 1 carattere è diverso interrompe appunto il ciclo while. Per la presenza dell’operatore and entrambe le condizione devono essere verificate allo stesso tempo, altrimenti il ciclo while termina. if alist1[pos] == alist2[pos]: pos = pos + 1 L’if controlla la veridicità di una particolare espressione. In questo caso alist1[pos] e alist2[pos] sono i caratteri delle liste s1 e s2 che sono in fase di confronto. Questo perché con l’espressione lista[indice] si va a prendere lo specifico elemento che si trova in quella lista e ha quel particolare indice. In questo caso l’indice è pos e le liste sono alist1 e alist2. Ricordiamo inoltre che le liste alist1 e alist2 sono state ordinate alfabeticamente. Questo significa che se è presente una ‘a’ in entrambe le parole, allora entrambe le ‘a’ saranno confrontate in questa espressione e l’if incrementerà la variabile pos di 1. else: matches = False La clausola else esegue il blocco di codice al suo interno soltanto quando quello che è stato scritto nell’espressione if non si verifica. In questo caso i caratteri confrontati e corrispondenti non erano uguali. Questo significa che le due parole non erano anagrammi e che il ciclo while va fermato. L’unico modo per fermare il while è quindi quello di aggiornare il valore della variabile matches per far si che le due condizioni presenti al primo ciclo non siano più entrambi vere (matches non è più uguale a True). print("Sono due anagrammi?", matches) Infine tramite la funzione print viene stampato il risultato del programma, dove viene mostrato il valore della variabile matches. In particolare se matches = True allora le due parole sono anagrammi, invece se matches = False , non lo sono. Valori delle variabili: Se a inizio programma vengono dati alle variabili s1 e s2 i seguenti valori:

s1 = “nave” s2 = “vane” le variabili successive assumono i seguenti valori: alist1 = [‘a’, ‘e’, ‘n’, ‘v’] alist2 = [‘a’, ‘e’, ‘n’, ‘v’] matches = True In questo caso le variabili alist1 e alist2 hanno gli stessi valori perché sono delle liste ordinate di parole che hanno gli stessi caratteri e lo stesso numero di essi. Nel caso in cui invece: s1 = “cane” s2 = “cera” le variabili successive assumono i seguenti valori: alist1 = [‘a’, ‘c’, ‘e’, ‘n’] alist2 = [‘a’, ‘c’, ‘e’, ‘r’] matches = False In questo caso la variabile matches sarà uguale a False, perché le liste delle due parole ordinate alfabeticamente saranno diverse e i caratteri non corrisponderanno. In particolare sarà la ‘n’ ad essere diversa dalla ‘r’. Questo significa che le due parole non sono anagrammi.