Sempre Tombola, generazione delle tabelle

di il
54 risposte

54 Risposte - Pagina 3

  • Re: Sempre Tombola, generazione delle tabelle

    Nooo non ci credo, era una cosa così banale!! xD
    E perchè non me l'ha segnalata come errore? o.o
    Comunque... ora funziona, ci sono i 15 numeri. Li devo ordinare per colonna, ora, prima di poterli copiare. Mi aiutate? Senza che creo un nuovo topic...
    Le mie domande sono queste:
    1. Come faccio ad invertire i numeri in modo che siano disposti in ordine crescente? (Dico invertire e non ordinare perchè lì dove c'è 0, deve restare lo 0.. altrimenti mi ritroverei con la prima riga sempre vuota e la seconda e terza tutte piene, annullerebbe parte del codice fatto!
    2. Posso copiare gli array direttamente? Tipo
    CB[][] = G1[][]
    Invece del ciclo for... si può fare?


    PS: Non voglio che pensiate che sto facendo fare a voi l'esercizio.. io intanto ci sto lavorando, però domando così se a me non riesce (come probabilmente succederà) ho già il vostro supporto.. purtroppo ho il tempo che mi corre dietro.
  • Re: Sempre Tombola, generazione delle tabelle

    Allora Joy, ti dico che ho trovato il problema
    ecco qui il codice:
    
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int rnd , CB[4][9],pos_riga;
    
    int massimo_per_riga() {  // funzione che controlla se nella riga ci sono 5 valori , in caso positivo restituisce true , altrimenti false
        int i , cont=0;
        for ( i = 0 ; i < 9 ; i++ ) {
            if ( CB[pos_riga][i] != 0 ) cont++;
        }
        if ( cont == 5 ) return 1;
        else return 0;
    }
    
    int pieno(int appoggio) {     // Se ci sono due valori diversi da 0 nella colonna appoggio allora restituisce true alrimenti false
        int i, cont=0;
        for (i = 0; i<3; i++) {
            if ( CB[i][appoggio] != 0 ) cont++;
        }
        if ( cont == 2 ) return 1;
        else return 0;
    }
    
    int inserisci (int appoggio) {
        int i;
        int continuo=1;
        if (pieno(appoggio))  // se nella colonna ci sono già due valori allora false diretto
            return 0;
        else {
            for ( i = 0 ; i < 3 ; i ++ ) {    // controllo se esiste il valore nella colonna indicata da appoggio
                if ( CB[i][appoggio] == rnd )
                    return 0;
            }   // se finisce il for significa che non esiste il valore rnd nella colonna appoggio
            while (continuo) {   // va a prendere la posizione della riga in cui non c'è già un valore nella colonna
                pos_riga = rand()%3;   // la riga deve essere casuale , almeno così è dall' immagine che mi hai dato
                if ( CB[pos_riga][appoggio] == 0 ) // <---------------------------------- se non c'è il valore abbiamo trovato la riga
                    break;
            }
            if ( !massimo_per_riga() ) return 1;
            else return 0;
        }
    }
    
    
    void stampa();
    
    int main () {
        //printf("%d",true);
        int i , j , appoggio;
        for ( i = 0 ; i < 3 ; i ++ )
            for ( j = 0 ; j < 9 ; j++ )
                CB[i][j]=0;
        srand(time(NULL));
        for ( i = 0 ; i < 15 ; i ++ )  {  // 15 sta per quanti numeri devono essere inseriti nella matrice
            rnd = 1+ (rand()%90);   // genera da 1 a 90
            appoggio = (rnd-1)/10;  // indicherà la colonna
            if ( appoggio == 9 ) appoggio = 8 ; // se il numero è 90 deve stare nella colonna 8
            if ( !inserisci( appoggio) ) i--;  // se non è stato inserito ripeti il ciclo
            else {
                CB[pos_riga][appoggio] = rnd;
                printf("%4d",rnd);
            }
        }
        stampa();
        getch();
        return 0 ;
        }
    
    
    void stampa()
    {
        int i,j;
        printf("\nCartella base:\n");
        for (i=0; i<3; i++){
            printf("\n\n");
            for (j=0; j<9; j++){
               if (CB[i][j] == 0) printf("\t");
               else printf("%d\t",CB[i][j]);
            }
        }
    }
    
    Ho evidenziato con <----------------- nel codice il punto che ho modificato. Busognava solo eliminare il punto e virgola! Sembra una sciocchezza ma alla fine sono questi 'piccoli' imprevisti che fanno perdere la testa a noi poveri studenti . Lieto di essere stato d'aiuto.
  • Re: Sempre Tombola, generazione delle tabelle

    Scusa AlessandroS, mentre scrivevo la risposta non eri ancora intervenuto!. Almeno abbiamo buon occhio .
  • Re: Sempre Tombola, generazione delle tabelle

    Eheh beati voi xD
    Giusto per curiosità.. vi dico che in GML il punto e virgola si può mettere o non mettere, fa lo stesso.. (tanto che a volte me lo dimentico!).. non sarei mai riuscito a notare da solo quella cosa xD
  • Re: Sempre Tombola, generazione delle tabelle

    Figurati Vins ^^.
    Comunque joy non da errore perchè sintatticamente era corretto nel senso che break non si trovava nell' if ma fuori e quindi il ciclo while in realtà faceva solo un ciclo e basta .
    Per l' ordinamente vediti l' ordinamento del Bubble sort ( è un tipico algoritmo ) , cerca di scrivere qualcosa , il nostro appoggio lo avrai sempre
  • Re: Sempre Tombola, generazione delle tabelle

    Io in realtà volevo usare il sort con la ricerca per maggiore... però anche il Bubble va bene xD
    Il mio problema è che deve ordinare le colonne e non tutto l'array... e senza contare gli zero.
    Ho steso su carta del codice ma non l'ho neanche scritto al computer perchè si vede che non va..
  • Re: Sempre Tombola, generazione delle tabelle

    Scusate ragazzi... credo di conoscere già la risposta (che mi fa paura, spero non sia come penso io..), ma ho un problema...
    Ho lasciato perdere l'ordinamento tanto la traccia non me lo chiede e il software alla fine funziona uguale.. il mio problema è questo:
    La generazione, che prima avveniva nel main, ora avviene in una function chiamata appunto genera.
    Nel main invece ho questo:
    1. Esegui la function genera
    2. Stampa "Giocatore 1: "
    3. Copia l'array CB nell'array G1
    4. Stampa l'array G1
    5. Esegui la function genera
    6. Stampa "Giocatore 2: "
    7. Copia l'array CB nell'array G2
    8. Stampa l'array G2
    ...ecc, fino alla stampa dell'array G5 (il quinto giocatore).
    Però il risultato non è quello desiderato.
    Tutte le cartelle sono uguali alla prima.
    Praticamente è come se CB non venisse azzerato (viene azzerato all'inizio della function genera) ne sovrascritto da nuovi numeri... o meglio, è come se la function genera() non venisse eseguita.
    Come mai? Il codice:
        #include <stdio.h>
        #include <stdlib.h>
        #include <time.h>
    
        int rnd ,pos_riga;
        int CB[4][9],G1[4][9],G2[4][9],G3[4][9],G4[4][9],G5[4][9];
    
        int massimo_per_riga() {  // funzione che controlla se nella riga ci sono 5 valori , in caso positivo restituisce true , altrimenti false
            int i, cont=0;
            for (i=0; i<9; i++) {
                if (CB[pos_riga][i] != 0) cont++;
            }
            if (cont == 5) return 1;
            else return 0;
        }
    
        int pieno(int appoggio) {     // Se ci sono due valori diversi da 0 nella colonna appoggio allora restituisce true alrimenti false
            int i, cont=0;
            for (i = 0; i<3; i++) {
                if (CB[i][appoggio] != 0) cont++;
            }
            if (cont == 2) return 1;
            else return 0;
        }
    
        int inserisci (int appoggio) {
            int i;
            int continuo=1;
            if (pieno(appoggio))  // se nella colonna ci sono già due valori allora false diretto
                return 0;
            else {
                for (i = 0; i<3; i++) {    // controllo se esiste il valore nella colonna indicata da appoggio
                    if (CB[i][appoggio] == rnd)
                        return 0;
                }   // se finisce il for significa che non esiste il valore rnd nella colonna appoggio
                while (continuo) {   // va a prendere la posizione della riga in cui non c'è già un valore nella colonna
                    pos_riga = rand()%3;   // la riga deve essere casuale , almeno così è dall' immagine che mi hai dato
                    if (CB[pos_riga][appoggio] == 0)
                      break;
                }
                if (!massimo_per_riga()) return 1;
                else return 0;
            }
        }
    
    
        int genera()  {
         int i, j, appoggio;
            for (i=0; i<3; i++) {
                for (j=0; j<9; j++) {
                    CB[i][j]=0;}}
            srand(time(NULL));
            for (i=0; i<15; i++)  {  // 15 sta per quanti numeri devono essere inseriti nella matrice
                rnd = 1+(rand()%90);   // genera da 1 a 90
                appoggio = (rnd-1)/10;  // indicherà la colonna
                if (appoggio == 9) appoggio = 8; // se il numero è 90 deve stare nella colonna 8
                if (!inserisci(appoggio)) i--;  // se non è stato inserito ripeti il ciclo
                else {
                    CB[pos_riga][appoggio] = rnd;
                }
            }
           // stampa();
        }
    
        int main () {
            int i,j;
            genera();
            printf("\nGiocatore 1:\n");
            for (i=0; i<3; i++){ for (j=0; j<9; j++){G1[i][j] = CB[i][j]; }}
            for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G1[i][j] == 0) printf("\t"); else printf("%d\t",G1[i][j]); }}
            genera();
            printf("\nGiocatore 2:\n");
            for (i=0; i<3; i++){ for (j=0; j<9; j++){G2[i][j] = CB[i][j]; }}
            for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G2[i][j] == 0) printf("\t"); else printf("%d\t",G2[i][j]); }}
            genera();
            printf("\nGiocatore 3:\n");
            for (i=0; i<3; i++){ for (j=0; j<9; j++){G3[i][j] = CB[i][j]; }}
            for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G3[i][j] == 0) printf("\t"); else printf("%d\t",G3[i][j]); }}
            genera();
            printf("\nGiocatore 4:\n");
            for (i=0; i<3; i++){ for (j=0; j<9; j++){G4[i][j] = CB[i][j]; }}
            for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G4[i][j] == 0) printf("\t"); else printf("%d\t",G4[i][j]); }}
            genera();
            printf("\nGiocatore 5:\n");
            for (i=0; i<3; i++){ for (j=0; j<9; j++){G5[i][j] = CB[i][j]; }}
            for (i=0; i<3; i++){ printf("\n\n"); for (j=0; j<9; j++){if (G5[i][j] == 0) printf("\t"); else printf("%d\t",G5[i][j]); }}
            getch();
            return 0 ;
            }
    
    
        void stampa()
        {
            int i,j;
            printf("\nCartella base:\n");
            for (i=0; i<3; i++){
                printf("\n\n");
                for (j=0; j<9; j++){
                   if (CB[i][j] == 0) printf("\t");
                   else printf("%d\t",CB[i][j]);
                }
            }
        }
    
    Tutte a me capitano? Mi sembra una cosa così banale, dal punto di vista logico.. perchè in C non deve funzionarmi mai niente??
  • Re: Sempre Tombola, generazione delle tabelle

    Chiamala void la funzione genera() , non ti restituisce nessun valore è inutile metterla int.

    E genera il seme nel main e non nella funzione genera() altrimenti ogni volta che la chiami genera il seme e produrrà sempre la stessa sequenza di numeri .
    Ricordo che la funzione rand() è una funzione che produce numeri pseudo-casuali non è possibile produrre la casualità naturale ^^
  • Re: Sempre Tombola, generazione delle tabelle

    Lo so, l'ho messa int per vedere se cambiava qualcosa ma non è cambiato niente xD
    Ecco il risultato:
  • Re: Sempre Tombola, generazione delle tabelle

    Non volevo creare un altro post ma mi hai anticipato , comunque leggi la modifica che ho fatto al mio post ^^

    Joysurrender io ti sto aiutando molto , ti ho quasi fatto tutto l' algoritmo secondo la tua preparazione in questo linguaggio ma spero che hai capito tutto quello che ho fatto , ho cercato di spiegarlo nei suoi concetti fondamentali , se c'è una sola riga che non capisci dimmelo , preferisco che capisci
  • Re: Sempre Tombola, generazione delle tabelle

    Allora, da una prima occhiata l'unica cosa che potrei dire è sostituire nella funzione 'genera()' il tipo di ritorno da 'int' a 'void'. Inoltre vorrei suggerire alcune modifiche: dato che ogni volta che chiami 'genera()' usi la 'srand(time(NULL))' per inizializzare la random. L'unico problema è che se la srand() viene inizializzata, anche in tempi diversi, con uno STESSO valore, i numeri generati saranno identici. Ora dato che la time() ritorna un valore che rappresenta il numero di secondo trascorsi dal 1 gennaio 1970, il suo valore non cambia nell'arco del secondo, quindi anche se chiami più volte genera(), la time() ritornerà sempre lo stesso valore e quindi la rand() genererà sempre la stessa sequenza di valori. Un approccio per far generare numeri casuali diversi ad ogni chiamata della funzione genera(), potrebbere essere quella di usare la _sleep(sec) per 'bloccare' l'esecuzione del programma per un tempo di 'sec' millisecondi, oppure usare una variabile statica nella funzione genera() che ogni volta che entri nella funzione cambi il suo valore, per poi usarlo come seme della srand().
  • Re: Sempre Tombola, generazione delle tabelle

    Accidenti AlessandroS, abbiamo sempre le stesse idee . Scusami ancora, ma interagisci sempre quando sto scrivendo il post!
  • Re: Sempre Tombola, generazione delle tabelle

    Ahahah concordo Vins ^^ siamo in sintonia ^_-
  • Re: Sempre Tombola, generazione delle tabelle

    E' quello che avevo appena fatto praticamente XD
    Funziona ora, grazie mille!!
  • Re: Sempre Tombola, generazione delle tabelle

    Edit: Ho risolto, in parte... vi riscrivo il problema che ho adesso.
    Sono passato al controllo, però... non fa un bel niente. Dove sbaglio?
        void controllo()
        {
            int i,j;
            for (i=0; i<3; i++) {
            for (j=0; j<9; j++) {
            if (G1[i][j] == estratto) { G1[i][9] += 1; }
            if (G2[i][j] == estratto) { G2[i][9] += 1; }
            if (G3[i][j] == estratto) { G3[i][9] += 1; }
            if (G4[i][j] == estratto) { G4[i][9] += 1; }
            if (G5[i][j] == estratto) { G5[i][9] += 1; }
            }
            }
            //Controllo ambo
            if (ambo==0) {
                    for (i=0; i<3; i++) {
            if (G1[i][9] == 2) {printf("\nIl giocatore 1 ha fatto ambo!\n");}
            if (G2[i][9] == 2) {printf("\nIl giocatore 2 ha fatto ambo!\n");}
            if (G3[i][9] == 2) {printf("\nIl giocatore 3 ha fatto ambo!\n");}
            if (G4[i][9] == 2) {printf("\nIl giocatore 4 ha fatto ambo!\n");}
            if (G5[i][9] == 2) {printf("\nIl giocatore 5 ha fatto ambo!\n");}
            if (G1[i][9] || G2[i][9] || G3[i][9] || G4[i][9] || G5[i][9] == 2) {ambo = 1;}
            }
            }
            //Controllo terno
            if (ambo == 1 && terno==0) {
                    for (i=0; i<3; i++) {
            if (G1[i][9] == 3) {printf("\nIl giocatore 1 ha fatto terno!\n");}
            if (G2[i][9] == 3) {printf("\nIl giocatore 2 ha fatto terno!\n");}
            if (G3[i][9] == 3) {printf("\nIl giocatore 3 ha fatto terno!\n");}
            if (G4[i][9] == 3) {printf("\nIl giocatore 4 ha fatto terno!\n");}
            if (G5[i][9] == 3) {printf("\nIl giocatore 5 ha fatto terno!\n");}
            if (G1[i][9] || G2[i][9] || G3[i][9] || G4[i][9] || G5[i][9] == 3) {terno = 1;}
            }
            }
            //Controllo quaterna
            if (terno == 1 && quaterna==0) {
                    for (i=0; i<3; i++) {
            if (G1[i][9] == 4) {printf("\nIl giocatore 1 ha fatto quaterna!\n");}
            if (G2[i][9] == 4) {printf("\nIl giocatore 2 ha fatto quaterna!\n");}
            if (G3[i][9] == 4) {printf("\nIl giocatore 3 ha fatto quaterna!\n");}
            if (G4[i][9] == 4) {printf("\nIl giocatore 4 ha fatto quaterna!\n");}
            if (G5[i][9] == 4) {printf("\nIl giocatore 5 ha fatto quaterna!\n");}
            if (G1[i][9] || G2[i][9] || G3[i][9] || G4[i][9] || G5[i][9] == 4) {quaterna = 1;}
            }
            }
            //Controllo quintina
            if (quaterna == 1 && quintina == 0) {
                    for (i=0; i<3; i++) {
            if (G1[i][9] == 5) {printf("\nIl giocatore 1 ha fatto quintina!\n");}
            if (G2[i][9] == 5) {printf("\nIl giocatore 2 ha fatto quintina!\n");}
            if (G3[i][9] == 5) {printf("\nIl giocatore 3 ha fatto quintina!\n");}
            if (G4[i][9] == 5) {printf("\nIl giocatore 4 ha fatto quintina!\n");}
            if (G5[i][9] == 5) {printf("\nIl giocatore 5 ha fatto quintina!\n");}
            if (G1[i][9] || G2[i][9] || G3[i][9] || G4[i][9] || G5[i][9] == 5) {quintina = 1;}
            }
            }
        }
Devi accedere o registrarti per scrivere nel forum
54 risposte