Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Programma in c con l'utilizzo delle liste

    ciao a tutti necessitavo una mano per questo codice.
    Il mazzo deve essere mescolato spostando la prima carta in una posizione casuale. (ogni nodo rappresenta una carta). questa operazione va ripetuta x volte...dove x è il parametro di ingresso num_mescolate. Qualcuno mi sa aiutare?


    il codice è il seguente:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    
    typedef enum {CUORI=0,QUADRI,FIORI,PICCHE} TipoSeme;
    typedef enum {DUE=2,TRE,QUATTRO,CINQUE,SEI,SETTE,OTTO,NOVE,DIECI,FANTE,DONNA,RE,ASSO} TipoValore;
    typedef struct
    {
        TipoSeme seme;
        TipoValore valore;
    } TipoInfo;
    typedef struct carta
    {
        TipoInfo info;
        struct carta* next;
    
    
    } TipoCarta;
    typedef TipoCarta* TipoMazzo;
    
    
    void InserisciCartaInTesta(TipoMazzo* indirizzo_mazzo, TipoCarta* indirizzo_carta);
    TipoMazzo creaMazzo();
    void stampaCarte(TipoMazzo mazzo);
    void mescolaMazzo(TipoMazzo* indirizzo_mazzo, int num_mescolate);
    
    
    int main()
    {
        TipoMazzo mazzo = NULL;
    
    
        mazzo = creaMazzo();
        printf("Mazzo appena creato:\n");
        stampaCarte(mazzo);
        mescolaMazzo(&mazzo,100);
        printf("\n\nMazzo dopo essere stato mescolato:\n");
        stampaCarte(mazzo);
    
    
        return 0;
    }
    
    
    void InserisciCartaInTesta(TipoMazzo* indirizzo_mazzo, TipoCarta* indirizzo_carta)
    {
        indirizzo_carta->next = *indirizzo_mazzo;
        *indirizzo_mazzo = indirizzo_carta;
    }
    
    
    TipoMazzo creaMazzo()
    {
        TipoMazzo nuovo_mazzo = NULL;
        int i=0, j=0;
        for (i=0; i < 4; i++)
        {
            for (j=0; j < 13; j++)
            {
                TipoCarta* carta = (TipoCarta*)malloc(sizeof(TipoCarta));
                carta->info.seme = i;
                carta->info.valore = j+2;
                InserisciCartaInTesta(&nuovo_mazzo,carta);
            }
        }
        return nuovo_mazzo;
    }
    
    
    void stampaCarte(TipoMazzo mazzo)
    {
        TipoCarta* carta = mazzo;
        while (carta != NULL)
        {
            switch(carta->info.valore)
            {
            case FANTE:
                printf("J ");
                break;
            case DONNA:
                printf("Q ");
                break;
            case RE:
                printf("K ");
                break;
            case ASSO:
                printf("A ");
                break;
            default:
                printf("%d ",carta->info.valore);
            }
            switch(carta->info.seme)
            {
            case QUADRI:
                printf("QUADRI, ");
                break;
            case CUORI:
                printf("CUORI, ");
                break;
            case PICCHE:
                printf("PICCHE, ");
                break;
            case FIORI:
                printf("FIORI, ");
            }
            carta = carta->next;
        }
    }
    
    
    void mescolaMazzo(TipoMazzo* indirizzo_mazzo, int num_mescolate)
    {
    
    
    }

    grazie anticipatamente
    Ultima modifica di MItaly; 26-11-2013 a 18:27 Motivo: tag CODE

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    Be vedo che sei perfettamente in grado di implementare la funzione Mescolamazzo() , forse ti manca l'idea ??

    Per mescolare
    1 in un ciclo FOR si genera un numero casuale da 0 a numero carte
    2 in un puntatore temporaneo si fa puntare al primo nodo della lista
    3 il puntatore lista , si fa puntare al secondo nodo ,"quello che era il primo elemento della lista ora è raggiungibile solo col puntatore temporaneo "
    4 si scorre la lista , fino a raggiungere il nodo in posizione data dal numero casuale -1
    5 si salva il puntatore NEXT in un puntatore temporaneo es: tempnext
    6 si fa puntare a next , l'indirizzo del puntatore che contiene quello che era il primo nodo "abbiamo inserito la carta"
    7 si fa puntare a , next->next =tempnext , collegando cosi gli altri nodi della lista



    P.S. il numero casuale deve essere superiore a 0 , uno sarebbe inutile cambiare il primo elemento con se stesso , secondo genererebbe un errore , quando tenterai di inserire valori al nodo che lo precede , non esistendo
    Ultima modifica di torn24; 27-11-2013 a 10:09
    Tecnologia

  3. #3
    Quote Originariamente inviata da torn24 Visualizza il messaggio
    Be vedo che sei perfettamente in grado di implementare la funzione Mescolamazzo() , forse ti manca l'idea ??

    Per mescolare
    1 in un ciclo FOR si genera un numero casuale da 0 a numero carte
    2 in un puntatore temporaneo si fa puntare al primo nodo della lista
    3 il puntatore lista , si fa puntare al secondo nodo ,"quello che era il primo elemento della lista ora è raggiungibile solo col puntatore temporaneo "
    4 si scorre la lista , fino a raggiungere il nodo in posizione data dal numero casuale -1
    5 si salva il puntatore NEXT in un puntatore temporaneo es: tempnext
    6 si fa puntare a next , l'indirizzo del puntatore che contiene quello che era il primo nodo "abbiamo inserito la carta"
    7 si fa puntare a , next->next =tempnext , collegando cosi gli altri nodi della lista



    P.S. il numero casuale deve essere superiore a 0 , uno sarebbe inutile cambiare il primo elemento con se stesso , secondo genererebbe un errore , quando tenterai di inserire valori al nodo che lo precede , non esistendo

    scusami ma tradotto in codice sarebbe???

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Ciao

    Mi sembrava molto chiaro , praticamente è l'algoritmo che ti serviva

    Ho usato il passaggio del puntatore per valore nella funzione mescolamazzo, visto che non ho mai usato il passaggio per indirizzo !

    Intendevo qualcosa del genere
    codice:
    #include <time.h>
    #include<stdio.h>
    
    
    typedef enum {CUORI=0,QUADRI,FIORI,PICCHE} TipoSeme;
    typedef enum {DUE=2,TRE,QUATTRO,CINQUE,SEI,SETTE,OTTO,NOVE,DIECI,FANTE,DONNA,RE,ASSO} TipoValore;
    typedef struct
    {
        TipoSeme seme;
        TipoValore valore;
    } TipoInfo;
    typedef struct carta
    {
        TipoInfo info;
        struct carta* next;
    
    
    
    
    } TipoCarta;
    typedef TipoCarta* TipoMazzo;
    
    
    
    
    void InserisciCartaInTesta(TipoMazzo* indirizzo_mazzo, TipoCarta* indirizzo_carta);
    TipoMazzo creaMazzo();
    void stampaCarte(TipoMazzo mazzo);
    TipoMazzo mescolaMazzo(TipoMazzo indirizzo_mazzo, int num_mescolate);
    
    
    
    
    int main()
    {
        TipoMazzo mazzo = NULL;
    
    
    
    
        mazzo = creaMazzo();
        printf("Mazzo appena creato:\n");
        stampaCarte(mazzo);
        mazzo=mescolaMazzo(mazzo,100);
        printf("\n\nMazzo dopo essere stato mescolato:\n");
        stampaCarte(mazzo);
        system("pause");
    
    
        return 0;
    }
    
    
    
    
    void InserisciCartaInTesta(TipoMazzo* indirizzo_mazzo, TipoCarta* indirizzo_carta)
    {
        indirizzo_carta->next = *indirizzo_mazzo;
        *indirizzo_mazzo = indirizzo_carta;
    }
    
    
    
    
    TipoMazzo creaMazzo()
    {
        TipoMazzo nuovo_mazzo = NULL;
        int i=0, j=0;
        for (i=0; i < 4; i++)
        {
            for (j=0; j < 13; j++)
            {
                TipoCarta* carta = (TipoCarta*)malloc(sizeof(TipoCarta));
                carta->info.seme = i;
                carta->info.valore = j+2;
                InserisciCartaInTesta(&nuovo_mazzo,carta);
            }
        }
        return nuovo_mazzo;
    }
    
    
    
    
    void stampaCarte(TipoMazzo mazzo)
    {
        TipoCarta* carta = mazzo;
        while (carta != NULL)
        {
            switch(carta->info.valore)
            {
            case FANTE:
                printf("J ");
                break;
            case DONNA:
                printf("Q ");
                break;
            case RE:
                printf("K ");
                break;
            case ASSO:
                printf("A ");
                break;
            default:
                printf("%d ",carta->info.valore);
            }
            switch(carta->info.seme)
            {
            case QUADRI:
                printf("QUADRI, ");
                break;
            case CUORI:
                printf("CUORI, ");
                break;
            case PICCHE:
                printf("PICCHE, ");
                break;
            case FIORI:
                printf("FIORI, ");
            }
            carta = carta->next;
        }
    }
    
    
    
    
    TipoMazzo mescolaMazzo(TipoMazzo indirizzo_mazzo, int num_mescolate)
    {
        /*
           1 in un ciclo FOR si genera un numero casuale da 0 a numero carte 
           2 in un puntatore temporaneo si fa puntare al primo nodo della lista 
           3 il puntatore lista , si fa puntare al secondo nodo ,"quello che era il primo elemento della lista          ora è raggiungibile solo col puntatore temporaneo "
           4 si scorre la lista , fino a raggiungere il nodo in posizione data dal numero casuale -1
           5 si salva il puntatore NEXT in un puntatore temporaneo es: tempnext
           6 si fa puntare a next , l'indirizzo del puntatore che contiene quello che era il primo nodo                "abbiamo inserito la carta"
           7 si fa puntare a , next->next =tempnext , collegando cosi gli altri nodi della lista
    	*/
        int i=0,j=0, rnd=1;
        TipoCarta *PrimoNodo ,*Tmpnext,*TmpLista;
        srand(time(NULL));
        for(i=0;i<num_mescolate;i++)
        {
            
            
            rnd = rand() % 52 + 1;
            if(rnd==0)rnd=1;
            
            PrimoNodo= indirizzo_mazzo;
            TmpLista=indirizzo_mazzo;
            indirizzo_mazzo=TmpLista->next;
            
            for(j=0;j<rnd && TmpLista->next!=NULL;j++)
            {
                
    			TmpLista=TmpLista->next;
                
                
            }
               
            Tmpnext=TmpLista->next;
            TmpLista->next=PrimoNodo;
            TmpLista->next->next=  Tmpnext;
             
            
                
        }    
        return indirizzo_mazzo;
    }
    Tecnologia

  5. #5
    Quote Originariamente inviata da torn24 Visualizza il messaggio
    Mi sembrava molto chiaro , praticamente è l'algoritmo che ti serviva

    Ho usato il passaggio del puntatore per valore nella funzione mescolamazzo, visto che non ho mai usato il passaggio per indirizzo !

    Intendevo qualcosa del genere
    codice:
    #include <time.h>
    #include<stdio.h>
    
    
    typedef enum {CUORI=0,QUADRI,FIORI,PICCHE} TipoSeme;
    typedef enum {DUE=2,TRE,QUATTRO,CINQUE,SEI,SETTE,OTTO,NOVE,DIECI,FANTE,DONNA,RE,ASSO} TipoValore;
    typedef struct
    {
        TipoSeme seme;
        TipoValore valore;
    } TipoInfo;
    typedef struct carta
    {
        TipoInfo info;
        struct carta* next;
    
    
    
    
    } TipoCarta;
    typedef TipoCarta* TipoMazzo;
    
    
    
    
    void InserisciCartaInTesta(TipoMazzo* indirizzo_mazzo, TipoCarta* indirizzo_carta);
    TipoMazzo creaMazzo();
    void stampaCarte(TipoMazzo mazzo);
    TipoMazzo mescolaMazzo(TipoMazzo indirizzo_mazzo, int num_mescolate);
    
    
    
    
    int main()
    {
        TipoMazzo mazzo = NULL;
    
    
    
    
        mazzo = creaMazzo();
        printf("Mazzo appena creato:\n");
        stampaCarte(mazzo);
        mazzo=mescolaMazzo(mazzo,100);
        printf("\n\nMazzo dopo essere stato mescolato:\n");
        stampaCarte(mazzo);
        system("pause");
    
    
        return 0;
    }
    
    
    
    
    void InserisciCartaInTesta(TipoMazzo* indirizzo_mazzo, TipoCarta* indirizzo_carta)
    {
        indirizzo_carta->next = *indirizzo_mazzo;
        *indirizzo_mazzo = indirizzo_carta;
    }
    
    
    
    
    TipoMazzo creaMazzo()
    {
        TipoMazzo nuovo_mazzo = NULL;
        int i=0, j=0;
        for (i=0; i < 4; i++)
        {
            for (j=0; j < 13; j++)
            {
                TipoCarta* carta = (TipoCarta*)malloc(sizeof(TipoCarta));
                carta->info.seme = i;
                carta->info.valore = j+2;
                InserisciCartaInTesta(&nuovo_mazzo,carta);
            }
        }
        return nuovo_mazzo;
    }
    
    
    
    
    void stampaCarte(TipoMazzo mazzo)
    {
        TipoCarta* carta = mazzo;
        while (carta != NULL)
        {
            switch(carta->info.valore)
            {
            case FANTE:
                printf("J ");
                break;
            case DONNA:
                printf("Q ");
                break;
            case RE:
                printf("K ");
                break;
            case ASSO:
                printf("A ");
                break;
            default:
                printf("%d ",carta->info.valore);
            }
            switch(carta->info.seme)
            {
            case QUADRI:
                printf("QUADRI, ");
                break;
            case CUORI:
                printf("CUORI, ");
                break;
            case PICCHE:
                printf("PICCHE, ");
                break;
            case FIORI:
                printf("FIORI, ");
            }
            carta = carta->next;
        }
    }
    
    
    
    
    TipoMazzo mescolaMazzo(TipoMazzo indirizzo_mazzo, int num_mescolate)
    {
        /*
           1 in un ciclo FOR si genera un numero casuale da 0 a numero carte 
           2 in un puntatore temporaneo si fa puntare al primo nodo della lista 
           3 il puntatore lista , si fa puntare al secondo nodo ,"quello che era il primo elemento della lista          ora è raggiungibile solo col puntatore temporaneo "
           4 si scorre la lista , fino a raggiungere il nodo in posizione data dal numero casuale -1
           5 si salva il puntatore NEXT in un puntatore temporaneo es: tempnext
           6 si fa puntare a next , l'indirizzo del puntatore che contiene quello che era il primo nodo                "abbiamo inserito la carta"
           7 si fa puntare a , next->next =tempnext , collegando cosi gli altri nodi della lista
        */
        int i=0,j=0, rnd=1;
        TipoCarta *PrimoNodo ,*Tmpnext,*TmpLista;
        srand(time(NULL));
        for(i=0;i<num_mescolate;i++)
        {
            
            
            rnd = rand() % 52 + 1;
            if(rnd==0)rnd=1;
            
            PrimoNodo= indirizzo_mazzo;
            TmpLista=indirizzo_mazzo;
            indirizzo_mazzo=TmpLista->next;
            
            for(j=0;j<rnd && TmpLista->next!=NULL;j++)
            {
                
                TmpLista=TmpLista->next;
                
                
            }
               
            Tmpnext=TmpLista->next;
            TmpLista->next=PrimoNodo;
            TmpLista->next->next=  Tmpnext;
             
            
                
        }    
        return indirizzo_mazzo;
    }

    perfetto...gentilissimo. Grazie mille

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.