Esercizio sulle strutture, gli array di strutture: Assassinio a Void City

Sherlock Holmes è stato incaricato di indagare sulla misteriosa morte del pesce Float, ucciso da un’'esplosione di bit avvenuta in una delle case a schiera nella periferia Void City. 
Il Dr. Watson si presenta a rapporto da Holmes in Return Street.

Watson: “Ci sono novità, Holmes: pare che Float fosse uscito un'’ora prima del decesso a prendere una boccata d’'acqua”. 

Holmes: “Ciò che è più strano, è che la bomba sia stata fabbricata appositamente per esplodere in un istante preciso, il che fa supporre che l’assassino conoscesse bene le abitudini del pesce, ossia ne fosse il custode”.

Watson: “Il problema è che in queste tre case a schiera, ognuna di un diverso colore, abitano tre custodi di diverse nazionalità, che prediligono bevande differenti e custodiscono tre diversi animali, a rotazione. Chi di essi custodiva il pesce?”

Watson: “Ho pedinato le tre persone sino al bar Char, essendo impossibile interrogarli o entrare nelle loro case senza un indizio. Ma ciascuno di essi parla una lingua a me sconosciuta, per cui dai discorsi ho solo compreso che: l'’italiano vive nella casa rossa; il proprietario della casa verde beve birra; chi ha la casa blu è francese; chi tiene il cane è distante da chi aveva il pesce; chi beve vino ha un
gatto, chi abita nella casa blu è lontano dal tedesco; chi beve caffè è a sinistra della casa rossa; il gatto è a destra del cane”.

Holmes: “Elementare, mio caro Watson: ciò che mi avete detto individua inequivocabilmente l’'assassino: a me un portatile con DevC++!”
La soluzione è la seguente:
                 CASA         CASA        CASA
COLORE      blu            rosso        verde
NAZIONE    francese     italiano     tedesco
ANIMALE    cane           gatto        pesce
BEVANDA   caffè           vino         birra

Ogni casa ha caratteristiche di diversa natura (colore, nazione, animale, bevanda).

Le strutture (struct) sono il costrutto del C++ che consente di rappresentare elementi dai componenti di tipo diverso. Mentre gli array consentono di rappresentare elementi dai componenti dello stesso tipo.
Quindi, ciascuna casa è una struttura con i membri colore, nazione, animale, bevanda. Poiché le case sono tutte dello stesso tipo, la sequenza di case è memorizzata come array di strutture.

Il programma controlla tutte le possibili combinazioni, e stampa quelle che concordano con gli indizi. Tutte le combinazioni sono 312 =531441. 

Infatti, i valori possibili possono essere rappresentati con enumerati da 0 a 2:
enum Colori {ROSSO=0, VERDE=1, BLU=2};
enum Nazioni {ITALIANO=0, FRANCESE=1, TEDESCO=2};
enum Animali {CANE=0, GATTO=1, PESCE=2};
enum Bevande {BIRRA=0, VINO=1, CAFFE=2};

Ad esempio, la tabella di sopra si codifica come 2102 0011 1220. Gli enumerati possono essere visti con valori alfabetici o numerici a seconda delle comodità. In sostanza ciascun tentativo sarà un numero a 12 cifre in base 3. Per provare tutti i tentativi, si usa un contatore decimale da 0 a 531440, da cui estrarre ogni volta le “terzine” (ossia le corrispondenti cifre in base 3). Questo viene svolto dalla funzione provaAltraSoluzione.

La funzione controlla provvede a vedere se ciascun indizio è soddisfatto: tentativo per tentativo, se esiste una casa per cui un indizio è violato allora la funzione termina restituendo false. Altrimenti, se nessun indizio è stato violato, restituisce true.

L'alunno di quarta D SIA che presenterà in laboratorio il programma in C++ spiegando la soluzione avrà 10 come valutazione.



tratto dall'esercitazione del prof. Mario G. Cimino presso il Dipartimento di Ingegneria dell'Informazione  di Pisa - Corso di Laurea di Ingegneria Biomedica - Insegnamento di Informatica.
http://www.ing.unipi.it/~o1553499


Commenti

Post popolari in questo blog

Simulazioni di reti (con Cisco Packet Tracer)

Esercizi sulla rappresentazione della virgola mobile IEEE 754 (Floating Point)