Gioco del Superenalotto

di il
5 risposte

Gioco del Superenalotto

Ciao ragazzi sono nuovo in questo forum e mi presento sono nanni....
sono un novellino in programmazione ma mi affascina talmente tanto che voglio esercitarmi ed imparare....
Io ho scritto in C++ un programmino in cui da input riceve i 6 numeri della schedina, dopodiché io genero continuamente una serie di 6 numeri uno diverso dall'altro e li confronto con i dati da input, ripetendo questo procedimento con un do-while finchè le sestine non siano uguali, in più alla fine do in output quante giocate sono state fatte .
Il programmino funziona, però siccome le mie conoscenze in questo campo sono poche diciamo che è un pò lento ci impiega qualche giorno per riuscire a fare tutto ciò....
Ora vi scrivo il codice e se volete dare qualche suggerimento vi sarei grato

#include<iostream.h>
#include<stdlib.h>
int A[6],I,J,C,P,B[6],G,Z,C1=0,C2=0,V1=0;
int main()
{
 srand(time(NULL));
 for(I=0;I<6;I++)
    {
     cout<<"Inserisci 6 valori compresi tra 1 e 90 IN ORDINE CRESCENTE"<<endl;
     cin>>A[I];
    } 
    do
       { 
        do
          {
           P=0;
           for(I=0;I<6;I++)
               B[I]=rand()%90+1;
           for(J=0;J<6;J++)
              {
               for(I=0;I<6;I++)
                   if(B[J]<B[I])
                     {
                      G=B[J];
                      B[J]=B[I];
                      B[I]=G;
                     }
              }
           for(I=0;I<6;I++)
               for(J=0;J<6;J++)
                   if((I!=J)&&(B[I]!=B[J]))
                      P=P+1;
          }while(P!=30);
        Z=0;
        for(J=0;J<6;J++)
            for(I=0;I<6;I++)
               {
                if(B[J]==A[I])
                   Z=Z+1; 
               }
 
        if(Z==6)
           V1=V1+1;
        C++;
        
        if(C==1000000000) 
          {
           C=0;
           C1++;
          }
       }while(V1!=1);
  cout<<"C : "<<C<<endl;
  cout<<"C1 : "<<C1<<endl;   
 system("PAUSE");
 return 0;
}

5 Risposte

  • Re: Gioco del Superenalotto

    Primo consiglio: dai alle variabili un nome che aiuti a capire il loro utilizzo.
    Secondo: non hai fatto un controllo sui numeri generati, il tuo ciclo genera anche sestine con numeri doppi esempio 22 25 51 61 61 70 può essere generata!
    Dovresti al posto del for fare un
    For (i=0;i<6;i++){
    DO
    X=Genera_numero
    WHILE (n1!=X && n2!=X && n3!=X && n4!=X && n5!=X && n0!=X)
    N=X;
    }

    Ps: chiedo scusa per il codice scritto male e in pseudo codice ma sono dal cellulare! Se un moderatore vuole mettere a posto il post altrimenti ci penso domani in mattina... Spero di averti aiutato


    Sent from my iPhone using Tapatalk
  • Re: Gioco del Superenalotto

    Ok capito per quanto riguarda il nome delle variabili, ma per quanto riguarda la creazione della sestina non so se ho capito bene perché questo è un pezzo di codice del do-while in cui creo una sestina precisamente è la parte finale e in pratica mi confronta tutti i valori del vettore con 2 cicli for escludendo quelli con stesso I e J..... e dico che se sono diversi devono incrementare di uno una variabile (P) dopodiché dico al ciclo do-while che fin quando P non è 30 di riprovare di nuovo.. (30 perché 2 cicli for 6*6=36 - 6(I=J)=30) quindi penso sia giusto ma magari sbaglio grazie....
    for(I=0;I<6;I++)
                   for(J=0;J<6;J++)
                       if((I!=J)&&(B[I]!=B[J]))
                          P=P+1;
              }while(P!=30);
  • Re: Gioco del Superenalotto

    Il problema è che così fai calcoli inutili e soprattutto lo obblighi ad arrivare a 30 iterazione, mentre spesso ne bastano molto meno poiché il ciclo che ti ho scritto verrà iterato sei volte più una per ogni doppione che estrae (che su 90 numeri è già difficile succeda spesso)... Inoltre non ho ben capito il tuo ultimo ciclo quello che va fino a 1000000 perché lo fai??


    Sent from my iPhone using Tapatalk
  • Re: Gioco del Superenalotto

    Cioè cambia proprio questo
    
    do {
                P=0;
                for(I=0;I<6;I++)
                    B[I]=rand()%90+1;
                for(J=0;J<6;J++) {
                   for(I=0;I<6;I++)
                       if(B[J]<B[I])
                         {
                          G=B[J];
                          B[J]=B[I];
                          B[I]=G;
                         }
                  }
               for(I=0;I<6;I++)
                   for(J=0;J<6;J++)
                       if((I!=J)&&(B[I]!=B[J]))
                          P=P+1;
              }while(P!=30);
    
    con questo
    
    for(I=0;I<6;I++) //toglie residui della sestina precedente
      B[I]=0;
    for(I=0;I<6;I++) {
      do //estrae un numero non ancora estratto
        P=rand()%90+1;
      while (B[0]!=P && B[1]!=P && B[2]!=P && B[3]!=P && B[4]!=P && B[5]!=P)
      B[I]=P; //lo mette nel vettore
    }
    for(I=0;I<5;I++) //ordina vettore
      for(J=I+1;J<6;J++)
        if(B[I]>B[J]) {
          G=B[J];
          B[J]=B[I];
          B[I]=G;
        }
    
  • Re: Gioco del Superenalotto

    Ok il pezzo in cui creare la sestina lo capito e ti ringrazio è effettivamente più veloce in questo modo, ma ieri sera si vede per la stanchezza non riuscivo a farlo funzionare difatti ho dovuto scriverlo cosi per farlo funzionare
    for(I=0;I<6;I++)
                B[I]=0;        
            for(I=0;I<6;I++) 
               {
                do
                 { 
                  C2=0;
                  P=rand()%90+1;
                  if(B[0]!=P && B[1]!=P && B[2]!=P && B[3]!=P && B[4]!=P && B[5]!=P) 
                     C2=1;
                 }while(C2!=1);// invece di scrivere la condizione direttamente qua ho dovuto fare un if
                B[I]=P; 
               }
    e non capisco il perché ma vabhe

    Ora te non capisci questo pezzo giusto ?
    
         C++;
         if(C==1000000000) 
              {
               C=0;
               C1++;
              }
    Siccome io alla fine del programma voglio sapere dopo quante giocate si ha vinto, cè il problema dell'overflow..... cosi io quando il mio contatore arriva ad un miliardo lo azzero e incremento un nuovo contatore C1++ ogni volta che C=1miliardo alla fine do in output C1 che so che è per 10 alla nona e C.... è una stupidata lo so ma non sapevo come poterlo fare ahahaha
Devi accedere o registrarti per scrivere nel forum
5 risposte