Fondamenti di Informatica I / Fondamenti di Programmazione
CORSI DI LAUREA IN INGEGNERIA ELETTRONICA E INGEGNERIA GESTIONALE Prova scritta del 9 febbraio 2012
Esercizio 1 (16 punti)
Un’antica tecnica di crittografia consiste nel sostituire ogni lettera dell'alfabeto con un'altra, in base a una tabella di corrispondenze nota soltanto al mittente e al destinatario del messaggio segreto.
Per esempio, se le corrispondenze sono:
a b c d e f g h i j k l m n o p q r s t u v w x y z I K E F G L V W X Y J Z H M N O P C D R S A U B T Q
il testo "ciao mondo" diventa "EXIN HNMFN".
Si vuole realizzare un programma per decrittografare un file di testo cifrato con una versione di questa tecnica che utilizza una tabella di corrispondenze di tutti i caratteri stampabili della tabella ASCII standard compresi tra lo spazio e il simbolo ~ (in pratica, un numero di caratteri pari a '~' - ' ' + 1, cioè 95). I caratteri non compresi in questo insieme, inclusi quindi TAB e '\n', restano invariati.
La tabella di corrispondenze è contenuta in un file in cui ogni riga contiene una e una sola corrispondenza, nella forma [<carattere originale>][<sostituto nel testo cifrato>], come nell’esempio riportato a fianco.
Con questa tabella il testo "ciao mondo" diventa " zWL[-L~xL".
Si scriva un programma in linguaggio C che riceva sulla riga di comando i nomi di tre file. Il primo file contiene la tabella di sostituzione, il secondo un testo ASCII cifrato e il terzo e` il file in cui dovra` essere scritto il testo in chiaro (cioe` decrittografato).
Si assuma che:
- la tabella di sostituzione sia corretta, cioe` non ci siano duplicazioni ne' righe mancanti - i caratteri nella tabella di sostituzione possano non essere ordinati
- il testo cifrato abbia lunghezza ignota
All'indirizzo http://web.diegm.uniud.it/pierluca/public_html/downloads/teaching/crittografia si trovano il file crittografia_chiave.dat e il file crittografia_testo_cifrato.txt con cui è possibile provare il programma.
Esercizio 2 (14 punti)
L'aritmetica degli intervalli opera su variabili che assumono come valori degli intervalli (chiusi) di valori reali. Ad esempio a = [2.1, 3.4], definisce la variabile a che ha come valore l'insieme di numeri
reali compresi tra i valori 2.1 e 3.4.
Le operazioni aritmetiche di somma e moltiplicazione (ci limiteremo ad esse) possono essere estese agli intervalli nel modo seguente. Dati due intervalli a = [a1, a2] e b = [b1, b2] la somma è data da a + b = [a1 + b1, a2 + b2], e il prodotto da
a × b = [min(a1 × b1, a1 × b2, a2 × b1, a2 × b2), max(a1 × b1, a1 × b2, a2 × b1, a2 × b2)].
Un intervallo può essere rappresentato in linguaggio C mediante la struttura struct intervallo contenente i due valori estremi, riportata a lato. Un’operazione fra intervalli può essere descritta attraverso la struct operazione riportata a lato. Il campo operatore può contenere soltanto il carattere '+' o '*' per rappresentare, rispettivamente, la somma o il prodotto.
Si scriva la funzione
struct intervallo (struct operazione v_operazioni[], int n_operazioni)
che riceve come argomenti un vettore di operazioni e la sua dimensione e restituisce l’intervallo somma di tutti i risultati ottenuti dall’esecuzione delle operazioni contenute nel vettore.
Per esempio, se il vettore contiene i seguenti valori:
v_operazioni[3] = { {'+', {2.1, 3.4}, {-1.2, -0.5}} , {'*', {-1.1, -0.2}, {2.1, 3.4}} , {'+', {-1.2, -0.5}, {-1.1, -0.2}} };
la funzione deve restituire l’intervallo [-5.14, 1.78], essendo [0.9, 2.9], [-3.74, -0.42] e [-2.3, -0.7] i risultati delle operazioni rappresentate rispettivamente da v_operazioni[0], v_operazioni[1] e v_operazioni[2].
struct intervallo {
float v_min;
float v_max;
};
struct operazione {
char operatore;
struct intervallo operando_a;
struct intervallo operando_b;
};
[i][z]
[a][W]
[m][-]
[n][~]
[R][,]
[d][x]
[ ][[]
[c][ ] [4][.]
[o][L]
[(][%]
ecc.