Tombola sbagliata con estrazioni doppie e triple

Una tombola “sbagliata” dove estraiamo a caso una serie di numeri. Ad ogni estrazione si deve verificare se il numero estratto fa ambo con uno dei numeri già estratti precedentemente, ovvero se è un doppione. In caso un numero viene estratto tre volte il gioco si arresta.

Le variabili

Il gioco non è difficile ma richiede un po’ di ragionamento. Ho bisogno di un vettore dove inserire i numeri che estraggo e un vettore dove registrare i numeri che sono estratti per la seconda volta. Sono vettori che devono essere incrementati a richiesta quindi ci deve essere un indice che viene aumentato all’occorrenza. Abbiamo bisogno di tre variabili booleane, due per controllare i rispettivi vettori dei doppioni e non ed uno per gestire il caso di una tripla estrazione.

L’algoritmo

La logica è semplice quanto lunghetta:

  • Estraggo il numero casuale
  • Scorro il vettore dei numeri estratti e cerco se il numero è presente
  • Se non è presente, lo inserisco nel vettore dei numeri estratti
  • Se il numero è presente devo fare due cose:
  • Scorro il vettore dei doppioni e cerco se il numero sia presente anche li
  • Se il numero non è presente nel vettore dei doppioni lo inserisco (è la seconda volta che estraggo quel numero)
  • Se il numero estratto è presente anche nel vettore dei doppioni vuol dire che è la terza volta che lo estraggo e devo uscire dal programma

Listato del codice

#include <iostream>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>

using namespace std;

int main() 
{
  bool presentenellacartella=0;
  bool presenteneidoppioni=0;
  int num; //numero estratto
  int indicecartella=0;  //indice dinamico per i numeri estratti una volta
  int indicedoppioni=0;  //indice dinamico per i numeri doppioni
  int cartella[90];  // il vettore dove inserisco i numeri alla prima estrazione
  int doppioni[90];  // ci inserisco i numeri estratti due volte
  bool trovato=0;  // se vero ho estratto un numero tre volte
  
  srand(time(NULL));
  while(!trovato)
  {
    presentenellacartella=0;
    presenteneidoppioni=0;
      
    num=rand()%90+1;
    cout<<"Estraggo il numero: "<<num<<endl;
    
    //controllo se il numero estratto sia presente
    //tra quelli estratti, scorro tutto il vettore
    for(int i=0; i<indicecartella; i++)
    {
      if (cartella[i]==num)
      {
        presentenellacartella=true;          
      }
    }

    if (presentenellacartella==0)
    {
      cout<<"Inserisco il numero nella cartella"<<endl;
      cartella[indicecartella]=num;
      indicecartella++;
    }
    else
    {
      cout << "Ho trovato doppione"<<endl;
      //devo controllare se già presente tra i doppioni,
      //ovvero è la terza volta che lo estraggo
      //oppure è la primo doppione
      //riscorro il vettore dei doppioni
      for(int i=0; i<indicedoppioni; i++)
      {
        if (doppioni[i] == num)
        {
          presenteneidoppioni=true;          
        }  
      }
          
      if (presenteneidoppioni)
      {
        trovato=1;
        cout << "Estratto per la terza volta - ESCO"<<endl;
      } 
      else 
      {
        cout<<"Inserisco il numero tra i doppioni" <<endl;
        doppioni[indicedoppioni]=num;
        indicedoppioni++;
      }
    }
    
    sleep(1); //dormo 1 secondo
    cout<< "----------------------------------" <<endl;
  }

Listato

Lo trovate su github

Ultima modifica 17 Novembre 2022