PDA

View Full Version : [C] calcolo del numero di gol segnati da ogni squadra


_maxp_
27-01-2010, 10:27
salve a tutti, vi spiego il mio problema:

ho un vettore calciatori di tipo marcatore, che sarebbe una struttura che contiene i dati di un calciatore (nome, cognome, squadra di appartenenza, numero di gol segnati).
Devo scrivere una procedura che calcoli e stampi a video il numero totale dei gol segnati da ogni squadra.
Per il momento mi è venuto in mente solo questo:
for (i=0; i<n; i++)
{
gol=calciatori[i].gol;
for (j=0; j<n; j++)
if (i != j && strcmp(calciatori[i].squadra, calciatori[j].squadra) == 0)
gol=gol+calciatori[j].gol;
printf("La squadra %s ha segnato %d gol.", calciatori[j].squadra, gol);
}
In questo modo però effettua tutti i confronti possibili, anche quelli che non servono, ed inoltre stampa a video il numero di gol segnati da una squadra tante volte quanto è il numero di giocatori di quella squadra. :doh:

Qualcuno mi sa dire come evitare questi inconvenienti? :help:

Tommy
27-01-2010, 10:35
Potresti ordinare il vettore di calciatori per squadra e utilizzare l'algoritmo di "rottura di codice" :)

yorkeiser
27-01-2010, 12:43
Secondo me una modifica "furba" alle tue strutture dati sarebbe assegnare ad ogni squadra un id numerico, mettendole in un array di stringhe.
Ad esempio, l'array squadre:
squadre[0]="Milan"
squadre[1]="Juventus"
...
In questa maniera, un problema del genere lo potresti risolvere con il for innestato (su squadre[] e giocatori[], non un prodotto cartesiano su giocatori [] come hai fatto tu; tra l'altro ne guadagneresti in velocità di computazione visto che l'array delle squadre dovrebbe essere piuttosto piccolo, rispetto a quello dei giocatori). Va da sè che quindi giocatore[].squadra diventa un int (puoi risalire al nome della squadra in cui milita il giocatore i-esimo con un semplice squadre[giocatore[i].squadra]).

_maxp_
27-01-2010, 14:01
Potresti ordinare il vettore di calciatori per squadra e utilizzare l'algoritmo di "rottura di codice" :)

non conosco l'algoritmo di rottura codice, quindi sono andato ad intuito ed ho fatto così (dopo aver ordinato il vettore per squadra):
for (i=0; i<n; i++)
{
gol=calciatori[i].gol;
while (strcmp(calciatori[i].squadra, calciatori[i+1].squadra)==0 && i<n-1)
{
gol=gol+calciatori[i+1].gol;
i++;
}
printf("La squadra %s ha segnato %d gol\n", calciatori[i].squadra, gol);
}
così funziona perfettamente:cool:
Secondo me una modifica "furba" alle tue strutture dati sarebbe assegnare ad ogni squadra un id numerico, mettendole in un array di stringhe.
Ad esempio, l'array squadre:
squadre[0]="Milan"
squadre[1]="Juventus"
...
In questa maniera, un problema del genere lo potresti risolvere con il for innestato (su squadre[] e giocatori[], non un prodotto cartesiano su giocatori [] come hai fatto tu; tra l'altro ne guadagneresti in velocità di computazione visto che l'array delle squadre dovrebbe essere piuttosto piccolo, rispetto a quello dei giocatori). Va da sè che quindi giocatore[].squadra diventa un int (puoi risalire al nome della squadra in cui milita il giocatore i-esimo con un semplice squadre[giocatore[i].squadra]).
usare il tuo metodo mi risulta un po' problematico visto che il vettore calciatori viene letto interamente da tastiera
grazie comunque :)