|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 96
|
[C] Efficienza Algoritmo
Salve, sto cercando un modo per scrivere il seguente codice in meno righe.
Devo stilare un tabellone (stile Mondiali Ora il problema sta qua: Codice:
if ( (valoresquadra[0]* numerocasuale) > (valoresquadra[1]* numerocasuale) )
{
printf("valoresquadra prima di giocare 0 = %d e 1=%d \n",valoresquadra[0],valoresquadra[1]);
printf("ha vinto la squadra 0 \n");
if ((valoresquadra[2]* numerocasuale) > (valoresquadra[3]* numerocasuale) )
{
printf("valoresquadra prima di giocare 2 = %d e 3=%d \n",valoresquadra[2],valoresquadra[3]);
printf("ha vinto la squadra 0 e poi la 2 \n");
if ((valoresquadra[4]* numerocasuale) > (valoresquadra[5]* numerocasuale) )
{
printf("valoresquadra prima di giocare 4 = %d e 5=%d \n",valoresquadra[4],valoresquadra[5]);
printf("ha vinto la squadra 0 , poi la 2, poi la 4 \n");
if ((valoresquadra[6]* numerocasuale) > (valoresquadra[7]* numerocasuale) )
{
printf("valoresquadra prima di giocare 6 = %d e 7=%d \n",valoresquadra[6],valoresquadra[7]);
printf("ha vinto la squadra 0 , poi la 2, poi la 4, poi la 6 \n");
}
else
{
printf("valoresquadra prima di giocare 6 = %d e 7=%d \n",valoresquadra[6],valoresquadra[7]);
printf("ha vinto la squadra 0 , poi la 2, poi la 4, poi la 7 \n");
}
}
else
{
printf("valoresquadra prima di giocare 4 = %d e 5=%d \n",valoresquadra[4],valoresquadra[5]);
printf("ha vinto la squadra 0 , poi la 2, poi la 5");
}
}
else {
printf("valoresquadra prima di giocare 2 = %d e 3=%d \n",valoresquadra[2],valoresquadra[3]);
printf("ha vinto la squadra 0 e poi la 3");}
}
else {
printf("valoresquadra prima di giocare 0 = %d e 1=%d \n",valoresquadra[0],valoresquadra[1]);
printf("ha vinto la squadra 1 \n");
si scontrerà con la squadra vincitrice di un’altra partita fino ad arrivare ad una singola squadra vincitrice) . C'è modo di evitare tutte queste righe di codice? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Innanzitutto, se moltiplichi ogni valore per "numerocasuale" e poi confronti, è lo stesso che confrontare i valori originali non moltiplicati.
Cioè, se hai: Codice:
k·x < k·y Codice:
x < y Poi magari puoi ricorrere a roba di questo tipo: http://it.wikipedia.org/wiki/Albero_del_torneo
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Jul 2006
Messaggi: 96
|
Quote:
io devo aggiungere una riga di codice che mi riporti il conteggio delle vittorie fatte da una squadra Codice:
if ( (valoresquadra[0]* rand()%2) > (valoresquadra[1]* rand()%2) )
{
printf("valoresquadra prima di giocare 0 = %d e 1=%d \n",valoresquadra[0],valoresquadra[1]);
printf("ha vinto la squadra 0 \n");
punteggiosquadra[0]++;
punteggiosquadra[1]=0;
Una partita viene vinta da una squadra secondo la seguente regola · la somma dei pesi di una squadra moltiplicata per un numero casuale nell’intervallo [0, 1] è maggiore della corrispondente operazione sull’altra squadra · il processo si ripete finché non si ottiene un vincitore Simulare 100 volte il torneo e ritornare l’elenco completo delle squadre in ordine decrescente di vincite Sarò costretto a fare un infinità di nidificazioni di IF |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
No, non accetto che si possa fare un codice con decine di if annidati.
Fammi capire meglio: con che criterio una squadra sfida l'altra? Cioè, è sempre vero che inizialmente la prima squadra sfida la seconda, e poi la terza sfida la quarta, etc..., e poi si ripete così per i vincitori?
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: Jul 2006
Messaggi: 96
|
Quote:
Allora il testo per il criterio di vittoria te l'ho riportato : la somma dei pesi di una squadra moltiplicata per un numero casuale nell’intervallo [0, 1] è maggiore della corrispondente operazione sull’altra squadra · il processo si ripete finché non si ottiene un vincitore Per pesi di una squadra si intende il valore dei singoli giocatori sommato, che ho poi inserito in valoresquadra [] un array di 8 come le squadre. Ma il problema non si presenta qui , il problema sta qua : -ritornare l’elenco completo delle squadre in ordine decrescente di vincite- Questo vuol dire che io devo ad ogni scontro tra squadre che avviene per 2 alla volta devo segnarmi in una variabile il numero delle vittorie effettuate dalla stessa. Quindi non è un semplice ottavi di finale (sarebbero soltanto 4 incontri da disputare) io devo valutare ogni caso. Ti faccio un esempio Se la prima faccio scontrare SQUADRA 0 vs SQUADRA 1 e vince la 1 aumento il valore di Codice:
punteggiosquadra[0]++; punteggiosquadra[1]=0; si scontrerà con la squadra vincitrice di un’altra partita fino ad arrivare ad una singola squadra vincitrice" Spero di essere stato chiaro e grazie mille per l'interessamento |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Ok, quindi la situazione è che tu in un'array hai sommato i valori di tutti i giocatori di ogni squadra e li hai salvati nelle corrispondenti posizioni di indici [0 ... 7].
Io quello che cercavo di capire nell'ultimo post è proprio il come scegliere gli scontri da fare: ovvero, se il criterio è "squadra0 contro squadra1", poi "squadra2 contro squadra3", etc..., o se ci fossero particolari disposizioni a riguardo. Da quanto ho capito, gli scontri diretti sono ad eliminazione, quindi la squadra che perde uno scontro non avrà modo di procedere oltre? Darò per assunto questo punto, e ti propongo quindi di fare una cosa del tipo: conserva un'array di interi, che saranno corrispondenti ai punteggi finali delle squadre. Poi prepara un'array di struct in cui ogni posizione conterrà almeno due informazioni: il numero della squadra (quindi l'indice in cui recuperare il punteggio nel primo array) ed il suo valore. Partendo da quest'array, che inizialmente avrà 8 elementi, ti basterà fare un ciclo nel quale prendi a due a due le squadre, le fai scontrare tra di loro, e ricopi la vincitrice nella prima metà dell'array, nella posizione corrispondente all'indice dello scontro appena effettuato, e ne incrementerai il punteggio di conseguenza. Alla fine così avrai un array di dimensione dimezzata, e potrai andare avanti così finché non resterà un'unica squadra. Ti faccio un esempio di ciò che intendo in pseudocodice: Codice:
struct _squadra_s {
int numero;
int valore;
};
typedef struct _squadra_s Squadra;
#define N_SQUADRE 8
int main()
{
unsigned int dimensione = N_SQUADRE;
Squadra squadre[N_SQUADRE] = { ... }; /* qui riempi l'array iniziale con le squadre */
int punteggi[N_SQUADRE] = { 0 }; /* array dei punteggi */
while (dimensione != 1) {
for (int i = 0; i < dimensione; i += 2) {
Squadra vincitore;
Squadra s1 = squadre[i + 0];
Squadra s2 = squadre[i + 1];
/* fai scontrare s1 ed s2 e trova il vincitore */
vincitore = (...vince squadra1...) ? s1 : s2;
squadre[i / 2] = vincitore;
++(punteggi[vincitore.numero]);
}
dimensione = (dimensione / 2);
}
/* et cetera */
return 0;
}
Se non ho capito male i requisiti, una cosa del genere potrebbe bastare. ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 96
|
Sei stato veramente di grande aiuto, non ci sarei mai arrivato da solo ...
solo una cosa non ho capito Questo è quanto ho scritto Codice:
struct _squadra
{
int player[11]; /* sono gli 11 giocatori della squadra
int valore[8]; /* il punteggio della squadra
int numero[8]; /* per indicare l'indice della squadra
};
typedef struct _squadra Squadra;
typedef struct _squdra Squadra
int main()
{
Squadra arraysquadre[8] = {0,1,2,3,4,5,6,7};
int dimensione = 8;
int numvittoriesquadra[8]={0};
int q=0;
/* Inserisco gli indici delle squadre nel array squadra
for (i=0;i<8;i++)
{
array_squadra.numero[i]=q;
q++;
}
while (dimensione != 1) {
for (i = 0; i < dimensione; i += 2) {
Squadra vincitore;
Squadra s1 = array_squadra[i + 0];
Squadra s2 = array_squadra[i + 1];
if ((s1.valore[0]* rand()%2 ) > (s2.valore[1]* rand()%2)
{
vincitore = s1;
numvittoriesquadra[vincitore.numero]++ ;
}
else
{
vincitore = s2;
numvittoriesquadra[vincitore.numero]++ ;
array_squadra[i/2]=vincitore;
}
}
dimensione = (dimensione / 2);
}
array subscript is not an integer C'è qualche problema con vincitore.numero infatti se lo cambi con un valore numerico passa tranquillamente al compilatore |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 533
|
■
Ultima modifica di rеpne scasb : 18-06-2012 alle 17:05. |
|
|
|
|
|
#9 | ||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
||
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 96
|
Si...passa anche se ora che mi fai notare andrebbe inizializzato in questo modo:
Codice:
Squadra arraysquadre[8] = {{50,0}{30,1} etc. ... }
Codice:
for (w=0;w<8;w++)
{
for (r=0;r<11;r++)
{
array_squadra[w].valore += array_giocatori[array_squadra[w].player[r]].valore;
}
rеpne scasb anche quello tuo andrebbe bene infatti la ricorsione è un argomento di studio che ho incontrato , però tu non hai usato dei tipi Strutturati si possono passare valori di questo tipo : Codice:
squadra.valore |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Guarda, non so che compilatore stai usando, ma dovrebbe darti decine di errori.
![]() Attiva tutti i warning e dagli ascolto.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: Jul 2006
Messaggi: 96
|
Quote:
Ecco com'è l'output del .exe : Mi trovo solo in difficoltà con i numeri delle squadre perchè io al momento ho usato il contatore "i" come numero squadra che visualizzo a schermo e quindi al secondo ciclo il numero squadra riparte da 0 ...
Ultima modifica di Vincenzoflaminio : 15-06-2010 alle 01:12. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:06.





















