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?