Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - problema con do-while
Forum - C/C++ - problema con do-while

Avatar
giocala88 (Normal User)
Expert


Messaggi: 248
Iscritto: 23/04/2008

Segnala al moderatore
Postato alle 19:16
Martedì, 02/09/2008
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

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <time.h>
  3.  
  4. typedef struct
  5. {
  6.     char palo;
  7.     int  numero;
  8.  
  9. } Carte;
  10.  
  11.  
  12. typedef struct
  13. {
  14.     Carte vett_carte[40];
  15.     int num_carte;
  16.  
  17. } CarteNapoletane;
  18.  
  19. void leggi_carte(CarteNapoletane *carte);
  20. void scrivi_carte(CarteNapoletane carte);
  21.  
  22. int main()
  23. {
  24.     CarteNapoletane carte;
  25.  
  26.     leggi_carte(&carte);
  27.     scrivi_carte(carte);
  28.  
  29.     return 0;
  30. }
  31.  
  32. void leggi_carte(CarteNapoletane *carte)
  33. {
  34.     int i,
  35.         carte_lette;
  36.     carte->num_carte = 0;
  37.     FILE *file_carte;
  38.  
  39.  
  40.     file_carte = fopen("mazzo_di_carte.txt", "r");
  41.  
  42.     carte_lette = fscanf(file_carte, "%d%c", &carte->vett_carte[carte->num_carte].numero,
  43.                                              &carte->vett_carte[carte->num_carte].palo);
  44.  
  45.     while(carte_lette == 2)
  46.     {
  47.         carte->num_carte++;  /* scorrimento di tutte le carte presenti nel file */
  48.  
  49.         carte_lette = fscanf(file_carte, "%d%c", &carte->vett_carte[carte->num_carte].numero,
  50.                                              &carte->vett_carte[carte->num_carte].palo);
  51.     }
  52.  
  53.     fclose(file_carte);
  54. }
  55.  
  56. /* definizione della funzione per scrivere su file voti ordinati */
  57. void scrivi_carte(CarteNapoletane carte)
  58. {
  59.     /* dichiarazioni delle variabili */
  60.     FILE *file_carte_random;    /* lavoro: puntatore al file di output */
  61.     int i;                      /* indice di scorrimento ciclo for */
  62.  
  63.     /* apri file */
  64.     file_carte_random = fopen("carte.txt", "w");
  65.  
  66.     srand(time(0));
  67.  
  68.     /* ciclo per la scrittura su file delle carte */
  69.     for (i = 0; i < carte.num_carte; i++)
  70.     {
  71.         do
  72.         {
  73.             i = rand() % carte.num_carte;
  74.  
  75.             if(!i)
  76.             {
  77.                 /* comunicare su file la scrittura di cognome, matricola e voto */
  78.                 fprintf(file_carte_random,"\n%d%c", carte.vett_carte[i].numero,
  79.                                                     carte.vett_carte[i].palo);
  80.             }
  81.         }
  82.         while(!i);
  83.     }
  84.  
  85.  
  86.     /* chiudere i file */
  87.     fclose(file_carte_random);
  88.  
  89. }




Ultima modifica effettuata da pierotofy il 03/09/2008 alle 20:28
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:35
Mercoledì, 03/09/2008
A occchio il problema è qui...

Codice sorgente - presumibilmente C/C++

  1. do
  2.         {
  3.             i = rand() % carte.num_carte;
  4.  
  5.             if(!i)
  6.             {
  7.                 /* comunicare su file la scrittura di cognome, matricola e voto */
  8.                 fprintf(file_carte_random,"\n%d%c", carte.vett_carte[i].numero,
  9.                                                     carte.vett_carte[i].palo);
  10.             }
  11.         }
  12.         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: https://piero.dev
PM Quote