Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
1
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 1
Giochiamo a Mastermind
Mastermind o Master Mind è un gioco da tavolo di abilità mentale (di
crittoanalisi) per due giocatori: un giocatore, il "decodificatore", deve
indovinare il codice segreto composto dal suo avversario, detto "codificatore".
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 2
Giochiamo a Mastermind La versione più diffusa del gioco usa dei piolini di 6 colori differenti per la
formazione del codice da indovinare.
Dopo che il codificatore ha composto il codice, il decodificatore fa il suo
primo tentativo, cercando di indovinare il codice.
Il codificatore, appena il suo avversario ha completato il tentativo, fornisce
degli aiuti indicando :
• con piolini neri, il numero di piolini colorati giusti al posto giusto.
• con pioli bianchi, il numero di piolini colorati giusti ma messi al posto
sbagliato.
Non viene indicato quali piolini sono giusti o sbagliati ma solo quanti. Se il
decodificatore riesce ad indovinare il codice entro il numero di tentativi
predeterminati (solitamente 10) allora quest'ultimo vince la partita, altrimenti
vince il codificatore.
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
2
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 3
Giochiamo a Mastermind
Tentativi del
decodificatore
Codice da indovinare
Indicazioni del
codificatore
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 4
Esempio Mastermind Analisi e Specifica
Definizione del problema: Sviluppare un programma per giocare con una
versione semplificata di Mastermind.
Il codificatore è il computer che formula un codice formato da tre numeri interi, ciascuno
compreso tra 0 e 9.
Il decodificatore deve indovinare i tre numeri immessi dal codificatore con la stessa
sequenza di immissione. Il decodificatore ha a disposizione un solo tentativo.
Il risultato deve indicare quali numeri sono stati indovinati nella giusta posizione:
• se il numero indovinato è giusto e nella stessa posizione del codice ciò è indicato con il
segno +
• se il numero indovinato appartiene al codice ma non è nella stessa posizione indicare ciò
con il segno =
• se il numero non è nessuno dei tre da indovinare indicare ciò con il segno –
Se il codice è indovinato deve essere visualizzato il messaggio: COMPLIMENTI HAI
VINTO, altrimenti è visualizzato il messaggio: MI DISPIACE NON HAI VINTO
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
3
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 5
CODIFICATORE
3 9 7
9 2 7
DECODIFICATORE
= - +
Risultato
MI DISPIACE NON HAI VINTO
Esempio Mastermind
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 6
CODIFICATORE
3 9 7
3 9 7
DECODIFICATORE
+ + +
Risultato
COMPLIMENTI HAI VINTO
Esempio Mastermind
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
4
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 7
Analisi e Specifica
Definizione dei dati del problema:
I: i numeri da indovinare generati a caso dal computer, i numeri
indovinati immessi dal decodificatore
Pi: i numeri da indovinare devono essere compresi tra 0 e 9
U: indicazione se ciascun numero indovinato, immesso dal
decodificatore è uguale a quello da indovinare in quella stessa posizione,
messaggio “COMPLIMENTI HAI VINTO” o “MI DISPIACE NON
HAI VINTO”
Pu: i caratteri per indicare se il numero del decodificatore è giusto o
meno sono solo ‘+’, ‘=‘, ‘-’
Esempio Mastermind
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 8
Nome variabile Descrizione Tipo
indovina1 Primo numero da indovinare INT
indovina2 Secondo numero da indovinare INT
indovina3 Terzo numero da indovinare INT
indovinato1 Primo numero indovinato INT
indovinato2 Secondo numero indovinato INT
indovinato3 Terzo numero indovinato INT
Tabella delle variabili di ingresso
Esempio Mastermind
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
5
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 9
Nome variabile Descrizione Tipo
pos1 Risultato confronto coppia numeri in prima posizione CHAR
pos2 Risultato confronto coppia numeri in seconda posizione CHAR
pos3 Risultato confronto coppia numeri in terza posizione CHAR
Tabella delle variabili di uscita
Esempio Mastermind
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 10
Progettazione
Descrizione del metodo di elaborazione:
• sono generati casualmente dal computer i tre numeri formanti il codice da
indovinare
• se ciascuno di essi è compreso tra 0 e 9 si continua altrimenti si visualizza
messaggio di errore e si termina l’esecuzione del programma
• si leggono i tre numeri immessi dal secondo giocatore
• si confronta ciascun numero del secondo giocatore con quelli immessi dal
primo giocatore:
• se un numero del secondo giocatore è uguale a quello nella stessa
posizione immesso dal primo giocatore si pone posi = ‘+’
• se un numero del decodificatore è uguale a quello del codificatore ma
non nella stessa posizione si pone posi = ‘=’
• se un numero del secondo giocatore non è uguale a nessuno di quelli
del secondo giocatore ma non nella stessa posizione si pone posi = ‘-’
Esempio Mastermind
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
6
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 11
• si visualizzano i valori di posi e li si analizza
• se tutti i valori di posi sono uguali a ‘+’ allora si visualizza il messaggio
“COMPLIMENTI HAI VINTO !!! “ altrimenti si visualizza il messaggio
"MI DISPIACE NON HAI VINTO !”
• Si visualizza il codice generato dal computer e quello inserito dal
decodificatore
Esempio Mastermind
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 12
… si usa la funzione rand() della libreria <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
main ()
{int a;
printf ("Generazione random di un numero intero \n");
a = rand() %70; //la funzione rand() genera in modo random un numero
// intero; l’applicazione di %70 fa in modo che il numero
// generato sia modulo 70, ossia compreso tra 0 e 69.
printf ("Numero = %d \n", a);
}
Generazione casuale (random) di un numero intero in C
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
7
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 13
/* Programma per simulare il risultato del lancio di un dado */
#include <stdio.h>
#include <stdlib.h>
main ()
{ int faccia_dado;
faccia_dado = rand() % 6; //genera un numero casuale fra 0 e 5
faccia_dado++; // per ottenere un valore tra 1 e 6
printf(“Faccia_dado = %d\n",faccia_dado);
system("Pause");
}
Generazione casuale (random) di un numero intero in C
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 14
… Se eseguiamo il programma più volte si ottiene sempre lo stesso
risultato!!!
… ciò è dovuto al fatto che rand() genera numeri pseudo-casuali, cioè
numeri che "sembrano" casuali …
Affinchè ogni esecuzione del programma generi un diverso valore deve
essere effettuata la ‘randomizzazione’ della funzione, ovvero inizializzare il
generatore di numeri pseudo-casuali usando un valore che viene detto ‘seme’
La randomizzazione può essere fatta usando la funzione srand(), che
richiede un parametro di input di tipo unsigned (intero senza segno), che
funge da seme.
La funzione time() della libreria time.h è solitamente usata, con parametro
NULL (o zero) , per generare il seme; essa fornisce un valore unsigned
calcolato in base all'ora corrente del giorno, espressa in secondi.
Generazione casuale (random) di un numero intero in C
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
8
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 15
// Programma per simulare il risultato del lancio di un dado - randomizzato
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main ()
{ int lancio1, lancio2;
srand(time(NULL)); //inizializza il generatore di numeri random
// lancia il dado 2 volte e mostra il risultato
lancio1= rand() % 6; //genera un numero casuale fra 0 e 5
lancio1++; // per ottenere un valore tra 1 e 6
lancio2= rand() % 6;
lancio2++;
printf(“Primo Lancio = %d \n Secondo Lancio= %d\n", lancio1, lancio2);
system("Pause");
}
Generazione casuale (random) di un numero intero in C
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 16
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main ()
{
// MasterMind
int indovina1, indovina2, indovina3;
int indovinato1, indovinato2, indovinato3;
char pos1, pos2, pos3;
printf (“CODIFICATORE\n");
srand(time(NULL));
indovina1 = rand() % 10; // genera un numero casuale compreso tra 0 e 9
indovina2 = rand() % 10;
indovina3 = rand() % 10;
printf (“ Il Codificatore ha inserito il codice da indovinare\n");
Esempio Mastermind
- il programma in C
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
9
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 17
printf (“\n DECODIFICATORE \n");
printf ("Immettere TRE numeri compresi tra 0 e 9 \n");
printf (“Immettere il PRIMO numero:\n");
scanf ("%d", &indovinato1);
printf (" Immettere il SECONDO numero:\n");
scanf ("%d", &indovinato2);
printf (" Immettere il TERZO numero:\n");
scanf ("%d", &indovinato3);
if (indovinato1== indovina1)
pos1= '+';
else
if ((indovinato1==indovina2) || (indovinato1==indovina3))
pos1= '=';
else pos1= '-';
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 18
if (indovinato2==indovina2)
pos2= '+';
else
if ((indovinato2==indovina1) || (indovinato2==indovina3))
pos2= '=';
else pos2= '-';
if (indovinato3==indovina3)
pos3= '+';
else
if ((indovinato3==indovina1) || (indovinato3==indovina2))
pos3= '=';
else pos3= '-‘;
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
10
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 19
printf (“Le Indicazioni del Codificatore sono:\n”);
printf ("%c, %c, %c \n", pos1, pos2, pos3);
if ((pos1=='+') && (pos2=='+') && (pos3=='+'))
printf("COMPLIMENTI HAI VINTO !!! \n");
else
printf ("MI DISPIACE NON HAI VINTO !\n");
printf("\nCODICE da Indovinare:");
printf("\nIndovina1 = %d - Indovina2 = %d - Indovina3 = %d\n", indovina1,
indovina2, indovina3);
printf("\nCodice immesso dal CODIFICATORE\n");
printf("\nIndovinato1 = %d - Indovinato2 = %d - Indovinato3 = %d\n",
indovinato1, indovinato2, indovinato3);
}
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 20
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
11
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 21
Esempio Mastermind – nuova versione
Analisi e Specifica
Definizione del problema: Sviluppare un programma per giocare con una versione
semplificata di Mastermind.
Il codificatore è il computer che formula un codice formato da tre numeri interi, ciascuno
compreso tra 0 e 9.
Il decodificatore deve indovinare i tre numeri immessi dal codificatore con la stessa
sequenza di immissione. Il decodificatore ha a disposizione cinque tentativi.
Il risultato deve indicare, per ogni tentativo, quali numeri sono stati indovinati nella giusta
posizione:
• se il numero indovinato è giusto e nella stessa posizione del codice ciò è indicato con il
segno +
• se il numero indovinato appartiene al codice ma non è nella stessa posizione indicare ciò
con il segno =
• se il numero non è nessuno dei tre da indovinare indicare ciò con il segno –
Se il codice è indovinato deve essere visualizzato il messaggio: COMPLIMENTI HAI
VINTO, altrimenti è visualizzato il messaggio: MI DISPIACE NON HAI VINTO
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 22
Analisi e Specifica
Definizione dei dati del problema:
I: i numeri da indovinare generati a caso dal computer, i numeri
indovinati immessi dal decodificatore
Pi: i numeri da indovinare devono essere compresi tra 0 e 9
U: indicazione se ciascun numero indovinato, immesso dal
decodificatore è uguale a quello da indovinare in quella stessa posizione,
messaggio “COMPLIMENTI HAI VINTO” o “MI DISPIACE NON
HAI VINTO”
Pu: i caratteri per indicare se il numero del decodificatore è giusto o
meno sono solo ‘+’, ‘=‘, ‘-’
Esempio Mastermind nuova versione
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
12
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 23
Nome variabile Descrizione Tipo
indovina1 Primo numero da indovinare INT
indovina2 Secondo numero da indovinare INT
indovina3 Terzo numero da indovinare INT
indovinato1 Primo numero indovinato INT
indovinato2 Secondo numero indovinato INT
indovinato3 Terzo numero indovinato INT
Tabella delle variabili di ingresso
Esempio Mastermind nuova versione
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 24
Nome variabile Descrizione Tipo
pos1 Risultato confronto coppia numeri in prima posizione CHAR
pos2 Risultato confronto coppia numeri in seconda posizione CHAR
pos3 Risultato confronto coppia numeri in terza posizione CHAR
Tabella delle variabili di uscita
Esempio Mastermind nuova versione
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
13
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 25
Nome variabile Descrizione Tipo
Trovato il decodificatore ha trovato il codice BOOL
Nrotent Numero tentativi effettuati INT
Tabella delle variabili di algoritmo
Esempio Mastermind nuova versione
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 26
Progettazione
Descrizione del metodo di elaborazione:
1. sono generati casualmente dal computer i tre numeri formanti il codice
da indovinare
2. se ciascuno di essi è compreso tra 0 e 9 si continua altrimenti si
visualizza messaggio di errore e si termina l’esecuzione del programma
3. si inizializza ad uno il numero di tentativi ed a FALSO il valore di
trovato
4. mentre il numero di tentativi è minore o uguale a cinque e trovato è
FALSO ripetere:
5. si leggono i tre numeri immessi dal secondo giocatore
Esempio Mastermind nuova versione
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
14
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 27
5. si confronta ciascun numero del secondo giocatore con quelli immessi
dal primo giocatore:
a) se un numero del secondo giocatore è uguale a quello nella stessa
posizione immesso dal primo giocatore si pone posi = ‘+’
b) se un numero del secondo giocatore è uguale a quello del secondo
giocatore ma non nella stessa posizione si pone posi = ‘=’
c) se un numero del secondo giocatore non è uguale a nessuno di quelli
del secondo giocatore ma non nella stessa posizione si pone posi = ‘-
6. si stampano i valori di posi
7. se tutti i valori di posi sono uguali a ‘+’ allora si pone la variabile
trovato uguale a VERO altrimenti
• si visualizza il messaggio “CODICE NON TROVATO! RIPROVA
CON UN ALTRO TENTATIVO”;
• si incrementa di uno il numero di tentativi e si ripetono le
istruzioni dal punto 4) in poi
Esempio Mastermind nuova versione
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 28
8. All’uscita dal ciclo, se la variabile trovato è uguale a VERO si stampa il
messaggio “COMPLIMENTI HAI VINTO !”, altrimenti il messaggio
“MI DISPISACE NON HAI VINTO !”
9. Si stampano i valori del codice generato dal computer e dell’ultimo
codice immesso dal decodificatore
Esempio Mastermind
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
15
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 29
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main ()
{ // MasterMind
int indovina1, indovina2, indovina3;
int indovinato1, indovinato2, indovinato3;
int pos1, pos2, pos3, risultato;
int nroTentativi, trovato;
printf ("CODIFICATORE\n");
srand(time(NULL));
indovina1 = rand() % 10;
indovina2 = rand() % 10;
indovina3 = rand() % 10;
printf (" Il Codificatore ha inserito il codice da indovinare\n");
Esempio Mastermind
- il programma in C
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 30
printf ("\n DECODIFICATORE \n");
trovato=0;
nroTentativi=1;
while ((nroTentativi <= 5) && (trovato==0))
{
printf("\n\nTentativo n.ro %d :\n", nroTentativi);
printf ("Immettere TRE numeri compresi tra 0 e 9 \n");
printf ("Immetti il PRIMO numero\n");
scanf ("%d", &indovinato1);
printf ("Immetti il SECONDO numero\n");
scanf ("%d", &indovinato2);
printf ("Immetti il TERZO numero\n");
scanf ("%d", &indovinato3);
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
16
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 31
if (indovinato1==indovina1) pos1='+';
else
if ((indovinato1==indovina2) || (indovinato1==indovina3))
pos1='=';
else pos1='-';
if (indovinato2==indovina2) pos2='+';
else
if ((indovinato2==indovina1) || (indovinato2==indovina3))
pos2='=';
else pos2='-';
if (indovinato3==indovina3) pos3='+';
else
if ((indovinato3==indovina1) || (indovinato3==indovina2))
pos3='=';
else pos3='-';
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 32
printf ("Le Indicazioni del Codificatore sono:\n");
printf("%c, %c, %c \n", pos1, pos2, pos3);
if ((pos1=='+') && (pos2=='+') && (pos3=='+'))
trovato=1;
else
{ printf ("CODICE NON TROVATO! \n");
if (nroTentativi < 5)
printf ("\n RIPROVA CON UN ALTRO TENTATIVO\n");
nroTentativi++;
}
} // fine ciclo while
if(trovato==1)
printf("COMPLIMENTI HAI VINTO !!! \n");
else
printf ("MI DISPIACE NON HAI VINTO !\n");
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
17
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 33
printf("\nCODICE da Indovinare:");
printf("\nIndovina1 = %d - Indovina2 = %d - Indovina3 = %d\n", indovina1,
indovina2, indovina3);
printf("\nCodice immesso dal CODIFICATORE\n");
printf("\nIndovinato1 = %d - Indovinato2 = %d - Indovinato3 = %d\n\n",
indovinato1, indovinato2, indovinato3);
system("Pause");
}
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 34
Lo studente modifichi il programma del gioco Master Mind con massimo 5,
o più, tentativi usando un ciclo a condizione finale invece di quello a
condizione iniziale …
… e verificando che siano rispettate le precondizioni sui valori di input del
decodifcatore, facendo ripetere l’input se esse non sono soddisfatte …
Elementi di Informatica a.a. 2016/17 - Prof. G.A. Di Lucca
CdL Ingegneria Energetica – Università del Sannio
18
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 35
…
printf ("Immettere TRE numeri compresi tra 0 e 9 \n");
do
{
printf ("Immetti il PRIMO numero\n");
scanf ("%d", &indovinato1);
}
while ((indovinato1<0) || (indovinato1>9)
…
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 36
Modificare il programma del gioco Master Mind:
• permettendo al decodificatore di effettuare al massimo 5 tentativi
(usando un ciclo a condizione iniziale …)
• verificando che siano rispettate le precondizioni sui valori di input del
decodifcatore, facendo ripetere l’input se esse non sono soddisfatte
• Usando opportuni array per memorizzare:
• I valori del codice
• I valori del decodificatore
• I ‘suggerimenti’ del codificatore (risultati della verifica dei valori
del decodificatore rispetto ai valori del codice
• Strutturando il programma con sottoprogrammi associati a:
• Generazione casuale del codice da parte del codificatore
• lettura dei valori del decodificatore
• Verifica dei valori del decodificatore rispetto al codice
• Stampare i risultati della verifica
Esempio Mastermind
- il programma in C con sottoprogrammi e array -