Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21

Discussione: [C] Lista azioni

  1. #1

    [C] Lista azioni

    Salve Programmatori!

    Sto sviluppando un codice per un piccolo giochino chiamato Sandwich e vorrei salvare le azioni di ogni utente (o meglio le parole che ogni utente gioca).
    Le regole del gioco sono poche e semplicissime:
    Innanzitutto si stabilisce l'ordine di gioco.
    Il primo giocatore scrive una parola di 10 lettere su un foglio e lo passa al secondo giocatore.
    Il secondo giocatore deve scrivere una parola della medesima lunghezza e che inizi e termini con le stesse
    lettere con le quali inizia la parola passatagli dal primo giocatore.
    Se il secondo giocatore riesce a scrivere la parola secondo quanto detto, non segna alcun punto di penalità.
    Se invece trova una parola con le stesse lettere alle estremità ma di lunghezza diversa da 10, il giocatore
    segna tanti punti di penalità quante sono le lettere della parola che mancano (o eccedono) per ottenere la
    lunghezza giusta.
    In ogni caso il secondo giocatore, scritta la propria parola e segnati gli eventuali punti di penalità, passa il
    foglio al terzo giocatore.
    Esempio:
    Primo giocatore: CONCLUDERE
    Possibili parole del secondo giocatore:
    CACCIATORE (10 lettere: nessun punto di penalità)
    CAMELIE (7 lettere: 3 punti di penalità)
    CANCELLATURE (12 lettere: 2 punti di penalità)
    I giocatori che via via raggiungono o superano un certo numero prefissato di punti di penalità vengono
    eliminati.
    Di seguito incollerò il mio codice. Ho già provato a creare una funzione apposita per il listaggio delle parole usate da ogni giocatore ma quando eseguo il programma, nel momento in cui si dovrebbero visualizzare le liste di parole, il programma crasha.
    Ecco un taglio del codice in questione:

    codice:
    struct Mossa
    {
        char giocata;
        struct Mossa *next;
    };
    
    struct Account
    {
        char nome[15];
        int penalita;
        int contatore;
        struct Account *next;
        struct Mossa *p_gioc;
    };
    
    struct Best
    {
        float tempo;
        struct Account *p_nome;
        struct Best *next;
    };
    
    typedef struct Mossa mossa;
    typedef struct Account account;
    typedef struct Best best;
    typedef enum{false, true} boolean;
    
    void risultati(account *cursore, int cont);
    
    int main()
    {
        for(i=0; i<n_gioc; i++)
        {
            printf("Parole inserite da %s:", (nuovo+i)->nome);
            risultati((nuovo+i), (nuovo+i)->contatore);
            printf("\n\n");
        }
    }
    
    void risultati(account *cursore, int cont)
    {
        int i;
    
        for(i=0; i<cont; i++)
        {
            printf("\n%da parola utilizzata: %s", (cont+1), cursore->p_gioc->giocata);
            cursore = cursore->next;
        }
    }
    E questo è il codice completo:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    struct Mossa
    {
        char giocata;
        struct Mossa *next;
    };
    
    struct Account
    {
        char nome[15];
        int penalita;
        int contatore;
        struct Account *next;
        struct Mossa *p_gioc;
    };
    
    struct Best
    {
        float tempo;
        struct Account *p_nome;
        struct Best *next;
    };
    
    typedef struct Mossa mossa;
    typedef struct Account account;
    typedef struct Best best;
    typedef enum{false, true} boolean;
    
    account* inserisci(int giocatori);
    void sandwich(account *nuovo, char par[20]);
    boolean esistente(mossa *paroledb, char scritta[20]);
    void classifica(best **b, account *nick, float tot, best **ultimo);
    void risultati(account *cursore, int cont);
    void stampaclassifica(best *b);
    void liberaclassifica(best **cursore);
    
    int main()
    {
        int turno = 0, n_gioc, fine = 0, i, gioc_rimasti, uscita = 0;
        char parola[20], parola2[20], eliminati[n_gioc], vincitore, scelta;
        account *nuovo = NULL, *a = NULL;
        best *b = NULL, *ultimo = NULL;
    
        clock_t start = 0;
        clock_t end = 0;
    
        for(i=0; i<20; i++)
        {
            parola[i] = '\0';
        }
    
        do
        {
            printf("Inserire il numero dei giocatori [0 per uscire]: ");
            scanf("%d", &n_gioc);
            if(n_gioc == 0)
            {
                exit(0);
            }
    
            nuovo = inserisci(n_gioc);
            gioc_rimasti = n_gioc;
            eliminati[n_gioc];
    
            system("cls");
    
            for(i=0; i<n_gioc; i++)
            {
                printf("Inserire il nome del giocatore %d [0 per uscire]: ", i+1);
                scanf("%s", (nuovo+i)->nome);
                if((nuovo+i)->nome[0] == '0')
                {
                    exit(0);
                }
            }
    
            do
            {
                for(i=0; i<n_gioc; i++)
                {
                    system("cls");
                    if((nuovo+i)->penalita >= 10)
                    {
                        if((nuovo+i)->nome[15] != eliminati[i+1])
                        {
                            eliminati[i+1] = (nuovo+i)->nome[15];
                            printf("%s, hai superato il limite di penalita'!\nSfortunatamente non puoi piu' giocare.", (nuovo+i));
                            gioc_rimasti--;
                        }
                        else
                        {
                            printf("%s, sei stato eliminato.\n\n", (nuovo+i));
                        }
                    }
                    else
                    {
                        if(gioc_rimasti == 1)
                        {
                            printf("%s HAI VINTO LA PARTITA CON SOLE %d PENALITA'!\n\n", (nuovo+i), (nuovo+i)->penalita);
                            uscita = 1;
                            vincitore = (nuovo+i)->nome[15];
                            system("pause");
                        }
                        else
                        {
                            printf("Tocca a %s con %d penalita'!\n", (nuovo+i)->nome, (nuovo+i)->penalita);
    
                            if(parola[0] == '\0')
                            {
                                while(parola[0] == '\0')
                                {
                                    printf("Inserisci una parola di 10 lettere [X per uscire]: ");
                                    scanf("%s", parola);
                                    if((parola[0] == 'X') || (parola[0] == 'x'))
                                    {
                                        exit(0);
                                    }
                                    else
                                    {
                                        if(strlen(parola) != 10)
                                        {
                                            printf("ATTENZIONE: la parola \"%s\" non contiene 10 lettere.\n", parola);
                                            parola[0] = '\0';
                                        }
                                    }
                                }
                            }
                            else
                            {
                                start = clock();
                                sandwich((nuovo+i), parola);
                                end = clock();
                                classifica(&b, (nuovo+i), ((double)(end - start)), &ultimo);
                                start = 0;
                            }
                        }
                    }
                }
            }while(uscita == 0);
    
            system("cls");
            for(i=0; i<n_gioc; i++)
            {
                printf("Parole inserite da %s:", (nuovo+i)->nome);
                risultati((nuovo+i), (nuovo+i)->contatore);
                printf("\n\n");
            }
    
            system("pause");
            system("cls");
    
            stampaclassifica(b);
            printf("\n\nIl record di lentezza va a %s con %.2f secondi!", ultimo->p_nome->nome, ultimo->tempo);
            liberaclassifica(&b);
    
            printf("\n\nPremi un tasto qualsiasi per continuare [X per uscire]: ");
            scelta = getch();
    
        }while(scelta != 'x');
    
        system("pause");
        return 0;
    }
    
    account* inserisci(int giocatori)
    {
        int i;
        account *nuovo = NULL;
        nuovo = (account*)malloc(giocatori*sizeof(account));
    
        for(i=0; i<giocatori; i++)
        {
            nuovo[i].p_gioc = NULL;
        }
    
        return nuovo;
    }
    
    void sandwich(account *nuovo, char par[20])
    {
        int i, esiste = 0, lunghezza;
        char par2[20];
    
        mossa *nuovamossa = NULL;
        nuovamossa = (mossa*)malloc(sizeof(mossa));
    
        if(nuovo->p_gioc == NULL)
        {
            nuovamossa->next = NULL;
        }
        else
        {
            nuovamossa->next = nuovo->p_gioc;
            nuovo->p_gioc = nuovamossa;
        }
    
        do
        {
            printf("Inserisci una parola, possibilmente di 10 lettere, che inizi con\nla lettera \"%c\" e finisca con la lettera \"%c\" [X per uscire]: ", par[0], par[9]);
            scanf("%s", par2);
            if((par[0] == 'X') || (par[0] == 'x'))
            {
                exit(0);
            }
    
            if(esistente(nuovo->p_gioc, par2) == true)
            {
                printf("ATTENZIONE: la parola \"%s\" è gia' stata inserita.\n", par2);
                esiste = 1;
            }
    
            esiste = 0;
            lunghezza = strlen(par2);
    
            if((par2[0] == par[0]) && (par2[lunghezza-1] == par[9]))
            {
                (nuovamossa)->giocata = par2[20];
                (nuovo)->contatore = (nuovo)->contatore + 1;
    
                if(lunghezza <= 10)
                {
                    (nuovo)->penalita += (10 - lunghezza);
                }
                else
                {
                    (nuovo)->penalita += (lunghezza - 10);
                }
            }
            else
            {
                esiste = 1;
                if(par2[0] != par[0])
                {
                    printf("ATTENZIONE: la parola \"%s\" non inizia con la lettera \"%c\".\n", par2, par[0]);
                }
                else
                {
                    printf("ATTENZIONE: la parola \"%s\" non termina con la lettera \"%c\".\n", par2, par[9]);
                }
            }
        }while(esiste == 1);
    }
    
    boolean esistente(mossa *paroledb, char scritta[20])
    {
        while(paroledb != NULL)
        {
            if(paroledb->giocata == scritta[20])
            {
                return true;
            }
            paroledb = paroledb->next;
        }
        return false;
    }
    
    void classifica(best **b, account *nick, float tot, best **ultimo)
    {
        best *tempi, *prec, *temp;
        tempi = (best*)malloc(sizeof(best));
    
        if (tempi == NULL)
        {
            exit(0);
        }
    
        tempi->tempo = tot;
        tempi->p_nome = nick;
        tempi->next = NULL;
    
        if(*b == NULL)
        {
            *b = tempi;
            *ultimo = *b;
            return;
        }
    
        prec = NULL;
        temp = *b;
    
        while(temp != NULL)
        {
            if(tempi->tempo < temp->tempo)
            {
                tempi->next = temp;
    
                if(prec == NULL)
                {
                    *b = tempi;
                }
                else
                {
                    prec->next = tempi;
                }
                return;
            }
            prec = temp;
            temp = temp->next;
        }
        prec->next = tempi;
        *ultimo = tempi;
        return;
    }
    
    void risultati(account *cursore, int cont)
    {
        int i;
    
        for(i=0; i<cont; i++)
        {
            printf("\n%da parola utilizzata: %s", (cont+1), cursore->p_gioc->giocata);
            cursore = cursore->next;
        }
    }
    
    void stampaclassifica(best *b)
    {
        int cont = 1;
    
        printf("Classifica dei record di velocita':\n");
        while((b != NULL) && (cont <= 5))
        {
            printf("\n%do posto: %s con %.2f secondi.", cont, b->p_nome->nome, b->tempo);
            b = b->next;
            cont++;
        }
    }
    
    void liberaclassifica(best **cursore)
    {
        best *temp;
    
        while(cursore != NULL)
        {
            temp = *cursore;
            *cursore = (*cursore)->next;
            free(temp);
        }
    }
    Sapete gentilmente dirmi cosa/dove sbaglio e come fare per sistemarlo?
    P.S. Sono alle prime armi con la programmazione... :master:

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quando si cerca di sistemare un errore, e' fondamentale dare il maggior numero di indicazioni e indicazioni precise ...

    Parli di una funzione in cui si genera l'errore .... e' cosi'? Di quale funzione parli?

    E, secondo quello che sai tu del tuo codice, intorno a quali linee si verifica l'errore?

    Se costringi a copiare compilare ed eseguire il codice, probabilmente nessuno ti dara' una mano ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Originariamente inviato da oregon
    Quando si cerca di sistemare un errore, e' fondamentale dare il maggior numero di indicazioni e indicazioni precise ...

    Parli di una funzione in cui si genera l'errore .... e' cosi'? Di quale funzione parli?

    E, secondo quello che sai tu del tuo codice, intorno a quali linee si verifica l'errore?

    Se costringi a copiare compilare ed eseguire il codice, probabilmente nessuno ti dara' una mano ...
    Ciao Oregone, grazie per l'attenzione.

    Nel primo riquadro "code" ho incollato solo la parte del codice essenziale per capire dove sta l'errore proprio per non farvi perdere tempo a leggere tutte le righe di codice inserite nel secondo riquadro "code".

    La funzione nella quale penso avvenga l'errore, comunque, è risultati().

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Con il debugging (eseguendo il codice passo passo) dovresti individuare la linea dove si manifesta il problema ... ovvero se e' la

    printf("\n%da parola utilizzata: %s", (cont+1), cursore->p_gioc->giocata);

    oppure la

    cursore = cursore->next;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Grazie nuovamente per la risposta, Oregon.

    Ho seguito il tuo consiglio anche se, su CodeBlocks, non sono riuscito a fare partire il debugging passo-passo. Ho copiato il codice sul Dev e, sinceramente, non mi ha segnalato alcun errore! Quando arriva alle righe in questione (quelle all'interno della funzione risultati()), semplicemente si limita a non stamparmi niente!

    Screenshot:


    :master: :master: :master:

  6. #6

    Re: [C] Lista azioni

    Ad una prima veloce occhiata :

    Originariamente inviato da AgentSpam

    codice:
    [...]
    
    int main()
    {
        int turno = 0, n_gioc, fine = 0, i, gioc_rimasti, uscita = 0;
        char parola[20], parola2[20], eliminati[n_gioc], vincitore, scelta;
        \\ Per impostare la dimensione del vettore eliminati[] devi usare una costante
        \\ tu tenti di usare una variabile intera e NON INIZIALIZZATA per giunta !!
        \\ dovresti invece dichiarare eliminati[] come puntatore a char (*eliminati), e allocare la memoria 
        \\ necessaria solo quando alla variabile n_gioc verrà assegnato un valore
        \\ dopo la scanf insomma ;)
        account *nuovo = NULL, *a = NULL;
        best *b = NULL, *ultimo = NULL;
    
        clock_t start = 0;
        clock_t end = 0;
    
        for(i=0; i<20; i++)
        {
            parola[i] = '\0';
        }
    
        do
        {
            printf("Inserire il numero dei giocatori [0 per uscire]: ");
            scanf("%d", &n_gioc);
            if(n_gioc == 0)
            {
                exit(0);
            }
    
            nuovo = inserisci(n_gioc);
            gioc_rimasti = n_gioc;
            eliminati[n_gioc]; \\ ..."Code has no effect in function main" usa la malloc()
    
            system("cls");
    
    [cut]
    Usa l'allocazione dinamica con malloc() per il vettore eliminati[], e risolverai gran parte dei problemi solo apparentemente inspiegabili.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7

    Re: Re: [C] Lista azioni

    Originariamente inviato da Samuele_70
    Ad una prima veloce occhiata:
    \\ ?

  8. #8
    C99
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9

    Re: Re: Re: [C] Lista azioni

    Originariamente inviato da MacApp
    \\ ?
    (a volte il copia e incolla fa più danni di quanto si possa pensare )
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  10. #10
    Originariamente inviato da MItaly
    C99
    Si, ma tu le usi quel genere di 'novità' ?
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.