Oppure

Loading
02/09/08 17:16
giocala88
Salve ragazzi, ho un piccolo problema:
Ho implementato un codice che legge in input (da file) delle stringhe (es: 1d, 2c, 10s, che rappresenterebbero le carte napoletane).
Successivamente alla lettura avviene una scrittura su un altro file dove le carte lette in input vengono randomizzate (un po' come quando si mischiano le carte prima di una partita)...
Il problema è il seguente:
Si può randomizzare le 40 carte senza che si ripetano, rispettando il numero 40????....Nel file implementato ho impostato una funzione do-while ma questa non mi fa scrivere su file le carte che dovrebbero essere randomizzate...come mai???...mi rivolgo a voi per un chiarimento...ringrazio anticipatamente....
codice ANSI C

#include <stdio.h>
#include <time.h>

typedef struct
{
    char palo;
    int  numero;

} Carte;


typedef struct
{
    Carte vett_carte[40];
    int num_carte;

} CarteNapoletane;

void leggi_carte(CarteNapoletane *carte);
void scrivi_carte(CarteNapoletane carte);

int main()
{
    CarteNapoletane carte;

    leggi_carte(&carte);
    scrivi_carte(carte);

    return 0;
}

void leggi_carte(CarteNapoletane *carte)
{
    int i,
        carte_lette;
    carte->num_carte = 0;
    FILE *file_carte;


    file_carte = fopen("mazzo_di_carte.txt", "r");

    carte_lette = fscanf(file_carte, "%d%c", &carte->vett_carte[carte->num_carte].numero,
                                             &carte->vett_carte[carte->num_carte].palo);

    while(carte_lette == 2)
    {
        carte->num_carte++;  /* scorrimento di tutte le carte presenti nel file */

        carte_lette = fscanf(file_carte, "%d%c", &carte->vett_carte[carte->num_carte].numero,
                                             &carte->vett_carte[carte->num_carte].palo);
    }

    fclose(file_carte);
}

/* definizione della funzione per scrivere su file voti ordinati */
void scrivi_carte(CarteNapoletane carte)
{
    /* dichiarazioni delle variabili */
    FILE *file_carte_random;    /* lavoro: puntatore al file di output */
    int i;                      /* indice di scorrimento ciclo for */

    /* apri file */
    file_carte_random = fopen("carte.txt", "w");

    srand(time(0));

    /* ciclo per la scrittura su file delle carte */
    for (i = 0; i < carte.num_carte; i++)
    {
        do
        {
            i = rand() % carte.num_carte;

            if(!i)
            {
                /* comunicare su file la scrittura di cognome, matricola e voto */
                fprintf(file_carte_random,"\n%d%c", carte.vett_carte[i].numero,
                                                    carte.vett_carte[i].palo);
            }
        }
        while(!i);
    }


    /* chiudere i file */
    fclose(file_carte_random);

}


Ultima modifica effettuata da pierotofy 03/09/08 18:28
aaa
03/09/08 18:35
pierotofy
A occchio il problema è qui...

        do
        {
            i = rand() % carte.num_carte;

            if(!i)
            {
                /* comunicare su file la scrittura di cognome, matricola e voto */
                fprintf(file_carte_random,"\n%d%c", carte.vett_carte[i].numero,
                                                    carte.vett_carte[i].palo);
            }
        }
        while(!i); 


A meno che rand non ritorni zero alla sua prima chiamata questo ciclo esce alla prima iterazione...

Comunque per mescolare le carte io userei un altro metodo: assegna un numero casuale ad ogni carta (aggiungi un campo nella struttura), ordina l'array di carte in base al numero assegnato e poi scrivilo su file.
Il mio blog: piero.dev