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:

  1. 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.

  2. 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:

  1. 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.
  2. 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.
  3. 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