Crittografia
Una spia invia
al suo capo messaggi composti di sole lettere maiuscole, senza spazi né segni di
interpuzione. Prima di inviare un messaggio, la spia lo trasforma usando un
codice crittografico. Il codice crittografico, rappresentato in un file, è
composto da una sequenza di linee, dove ogni linea ha il formato:
L XYZ
dove L, X, Y, Z sono lettere maiuscole dell'alfabeto
inglese. L'ovvio significato del codice è che la lettera L deve
essere tradotta con la sequenza di lettere XYZ. Ad esempio, se il
codice è il seguente:
C XXX
I QWE
O OPA
A EMU
L CAR
S ONE
ed il messaggio è il seguente:
CIAOLISA
il testo tradotto è il seguente:
XXXQWEEMUOPACARQWEONEEMU
Si noti che (come evidenziato nell'esempio) non necessariamente tutte le
26 lettere dell'alfabeto inglese sono codificate.
Il problema consiste nello scrivere un programma che traduca un messaggio,
contenuto in un file, utilizzando un codice, anch'esso contenuto in un file. Due
aspetti che devono essere presi in considerazione sono i seguenti:
- Alcune lettere dell'alfabeto potrebbero essere codificate più di una volta
nel codice (un codice di questo tipo si dice incoerente). Ad esempio,
se nel file dell'esempio precedente occorresse anche la linea:
O USA
il codice sarebbe incoerente.
- Alcune lettere del messaggio potrebbero non essere codificate dal codice,
che in tal caso si dice incompleto rispetto al messaggio. Ad esempio,
se il messaggio fosse:
CIAOANNA
il codice visto in precedenza sarebbe incompleto, perché la lettera `N' non è codificata.
In particolare, si richiede di risolvere i seguenti punti:
- Scrivere una (o più) funzioni che, ricevuto il nome di un file
contenente un codice, restituisca un valore logico indicante se esso è
coerente oppure no.
- Scrivere una (o più) funzioni che, ricevuti i nomi
dei due file c ed m contenenti rispettivamente un
codice e un messaggio, restituisca un valore logico indicante se il codice in
c è
incompleto oppure no rispetto al messaggio in m.
- Scrivere una (o più) funzioni che, ricevuti i nomi dei due file c ed m contenenti rispettivamente un
codice e un messaggio ed il nome di un file g su cui stampare,
verifichi se il codice di è coerente e completo rispetto al
messaggio in m, e in tal caso scriva su g il messaggio tradotto.
Esercizio adattatato dalle Dispense del corso di Informatica aa 2000/01, Corso di laurea in Ingegneria Aereospaziale, di Marco Cadoli