[C] Generare un turno di partite

alessandro_2001

Nuovo Utente
3
0
ciao a tutti ho un problema a risolvere questo programma in c datomi dal prof di informatica:
Traccia:
Dato un vettore chiamato Squadre con n elementi (max 10 - caricati dall’utente) contenenti i nomi delle squadre che partecipano ad un torneo calcistico, generare un turno di partite accoppiando casualmente le squadre e associando risultati casuali alle partite.
I risultati casuali vanno espressi in termini di schedina ovvero 1, X o 2.
Stampare l’elenco delle partite con relativo risultato (stampare la partita sulla stessa riga del risultato tipo colonna del totocalcio).

Se sapete darmi una soluzione
Grazie in anticipo
1586263531053.png

questo è dove sono arrivato se qualcuno riesce a dirmi come faccio a generare gli accoppiamenti delle squadre.
grazie
 
Ultima modifica da un moderatore:

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Prime 3 righe del regolamento della sezione Programmazione:

Soluzione dei problemi
La sezione Programmazione e le sue sottosezioni non offrono un servizio di risoluzione compiti scolastici.

E' possibile chiedere aiuto ma allegando il codice scritto o le prove fatte.

Ritenta e sarai più fortunato.
 
  • Mi piace
Reazioni: Mursey

alessandro_2001

Nuovo Utente
3
0
Prime 3 righe del regolamento della sezione Programmazione:

Soluzione dei problemi
La sezione Programmazione e le sue sottosezioni non offrono un servizio di risoluzione compiti scolastici.

E' possibile chiedere aiuto ma allegando il codice scritto o le prove fatte.

Ritenta e sarai più fortunato.
grazie
 

M1n021

Nuovo Utente
143
68
Ciao, ma devi generare una singola giornata o ti servono gli abbinamenti dell'intero "campionato"?
 

nardoz0918

Nuovo Utente
48
8
Posso provarti ad indurre nel ragionamento:
- Ti serve un ciclo per fare le accoppiate, ad esempio puoi provare a sfruttare l'algoritmo della ricerca binaria per fare le combinazioni, ed eventualmente stampare una casella di un altro vettore contenente i possibili risultati 1 - X - 2
- Ogni accoppiata toglie due elementi nella "lista" delle squadre
- L'accoppiata non può verificarsi se l'id squadra è lo stesso.
- Una variabile casuale, che si aggiorni ad ogni ciclo per far uscire un numero compreso tra 0 - 1 - 2 che lo userai come indice per un probabile secondo vettore per far uscire un possibile esito della giocata
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
ragionamento illogico: fare una ricerca (binaria? e chi ti dice che il vettore è ordinato) per accoppiare le squadre,...
scusa ma che ricerca vorresti fare?
il modo più semplice in assoluto è considerare il vettore come se fosse una mazzo di carte:
- generi 2 numeri interi a caso compresi tra 0 e l'ultimo indice buono del vettore (per es. per un vettore da 20 posizioni generi 2 numeri interi compresi tra 0 e 19)
- scambi la posizione delle squadre in base agli indici (in pratica: se genere 3 e 12, scambi di posto le squadre di indice 3 e 12);
- fai un numero ragionevole di questi scambi, per esempio 50 o 100
alla fine degli scambi hai "mischiato" le squadre in modo (pseudo)casuale;
alla fine l'accoppiamento è semplicemente, "le prime 2", "le seconde 2", la terza coppia" (ovvero il turno è squadra[0] contro squadra[1], squadra[2] contro squadra[3]..., squadre[18] contro squadra[19]);
avendo mischiato per bene le squadre all'inizio il turno è completamente casuale e funziona anche se lo stesso numero pseudocasuale è generato molte volte.
Alternativa:
generi 2 numeri pseudocasuali (indici), sposti le squadre generate a fine vettore e le accoppi;
ripeti il procedimento escludendo però dalla generazione casuale i 2 ultimi indici, e così via per tutti gli altri.

Per il risultato invece è più semplice, visto che il renge è limitato a 3 valori e comunque ciascun risultato è indipendente dal precedente
 

M1n021

Nuovo Utente
143
68
Quello di mischiare l'array e considerare le coppie successive risultanti credo sia la strada migliore.
Per quanto riguarda invece il mescolamento utilizzerei un approccio più semplice e allo stesso tempo caratterizzato da una distribuzione delle probabilità uniforme. Ossia andremo a scambiare, partendo dalla fine e avanzando verso sinistra, l'elemento corrente con un elemento preso a caso da un gruppo contenente gli elementi precedenti e l'elemento corrente.
 

nardoz0918

Nuovo Utente
48
8
ragionamento illogico: fare una ricerca (binaria? e chi ti dice che il vettore è ordinato) per accoppiare le squadre,...
scusa ma che ricerca vorresti fare?
il modo più semplice in assoluto è considerare il vettore come se fosse una mazzo di carte:
- generi 2 numeri interi a caso compresi tra 0 e l'ultimo indice buono del vettore (per es. per un vettore da 20 posizioni generi 2 numeri interi compresi tra 0 e 19)
- scambi la posizione delle squadre in base agli indici (in pratica: se genere 3 e 12, scambi di posto le squadre di indice 3 e 12);
- fai un numero ragionevole di questi scambi, per esempio 50 o 100
alla fine degli scambi hai "mischiato" le squadre in modo (pseudo)casuale;
alla fine l'accoppiamento è semplicemente, "le prime 2", "le seconde 2", la terza coppia" (ovvero il turno è squadra[0] contro squadra[1], squadra[2] contro squadra[3]..., squadre[18] contro squadra[19]);
avendo mischiato per bene le squadre all'inizio il turno è completamente casuale e funziona anche se lo stesso numero pseudocasuale è generato molte volte.
Alternativa:
generi 2 numeri pseudocasuali (indici), sposti le squadre generate a fine vettore e le accoppi;
ripeti il procedimento escludendo però dalla generazione casuale i 2 ultimi indici, e così via per tutti gli altri.

Per il risultato invece è più semplice, visto che il renge è limitato a 3 valori e comunque ciascun risultato è indipendente dal precedente

Tutto questo per un semplice compito?

Quello che intendevo, è di applicare più o meno la base che c'è di fondo dell'algoritmo della ricerca binaria. Dimezzi la dimensione dell'array e " ti ritrovi 5 squadre da una parte e 5 dall'altra". Poi ti diverti a giocare con gli indici, magari cambiando solo quelli della seconda fascia e ti fai una combinazione pseudocasuale. Non modifichi l'array ti limiti a stampare a schermo le combinazioni con i risultati. Meno righe di codice, eludi la traccia e fai vedere a schermo il risultato che il professore ha chiesto.

Stiamo pur parlando di un turno di campionato formato da 10 squadre, non di un programma per organizzare la serie A. Il ragazzo si è fermato all'inserimento dei dati in un array dubito possa completare al meglio ciò che hai scritto. (Senza offesa).
Mi sono espresso male, bye.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Meno righe di codice,
Non ci metti meno righe...
Per codificare l'algoritmo (per quanto semplice) di ciò che ho scritto servono 4 righe di pseudocodice, che si tradurrano in 6 riche di codice reale a causa delle 3 necessarie ad uno scambio
1. per k che va da 0 a 50 ripeti i punti 2-3-4 (ciclo FOR)
2. p1 = genera intero casuale (con funzione incorporata nel linguaggio ovviamente)
3. p2 = genera intero casuale
4. scambia squadra[p1] con squadra[p2]


procedendo come suggerisci (circa la stessa cosa di @M1n021) non si rispettano le specifiche del problema:
se hai un array da 10 elementi e lo dividi in 2 gruppi di 5 squadre, poi gli accoppiamenti, anche se casuali, li fai solo tra una squadra del primo gruppo ed una del secondo gruppo.
Il che significa che impedisci a squadre dello stesso gruppo di giocare tra di loro, quindi il turno non è affatto casuale.
Inoltre, ben che ti vada, non è neanche possibile che ci metti meno righe!
Infine, nota che la bontà di un metodo/algoritmo non si misura con chi scrive meno righe, ma con il fatto che esso sia corretto (cioò che funzioni) e completo (cioè che includa tutti i possibili casi del problema in esame).
 
Ultima modifica:

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Mah... se si tratta di generare un solo turno con risultati casuali degli incontri e senza alcun tipo di vincolo, direi che il problema posto è estremamente banale, quindi non vedo motivo alcuno per complicarlo.

L'associazione può avvenire semplicemente di un elemento del vettore con il successivo percorrendolo su tutti gli indici dispari, ad ogni associazione aggiungere un valore casuale (range int 0..2) quale risultato.
Se si vuole rendere non controllabile l'associazione con l'inserimento manuale delle squadre allora serve (come dice @BAT00cent ) dare qualche mescolata al contenuto del vettore prima di fare l'associazione.

Inserire -> mescolare -> e infine, associare il tutto in un vettore che contiene le due squadre dell'incontro e il risultato della partita!

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
  • Mi piace
Reazioni: BAT

nardoz0918

Nuovo Utente
48
8
Boh per me esercizietti stupidi richiedono un metodo risolutivo stupido. Non stiamo parlando di una lista esagerata di squadre ma di 10 squadre non ha importanza se fai una combinazione con le prime 5 e lee altre 5 casualmente. Così l'ho interpretata io la traccia.

Poi per favore non possiamo minimamente parlare della "bontà" di un algoritmo per quest'esempio.(Sono d'accordissimo con te)
 

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Boh per me esercizietti stupidi richiedono un metodo risolutivo stupido. Non stiamo parlando di una lista esagerata di squadre ma di 10 squadre non ha importanza se fai una combinazione con le prime 5 e lee altre 5 casualmente. Così l'ho interpretata io la traccia.

Poi per favore non possiamo minimamente parlare della "bontà" di un algoritmo per quest'esempio.(Sono d'accordissimo con te)
Non sono d'accordo. La bontà dell'algoritmo deve esserci sempre e non si tratta di un esercizio "stupido" ma bensì di un esercizio molto semplice.
Parlando di "algoritmo", il fatto che ci possa essere 1 milione di elementi nel vettore non rende l'esercizio più difficile, ma fa apprezzare proprio il fatto che un algoritmo dovrebbe essere sempre ottimizzato.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
  • Mi piace
Reazioni: fabio93

nardoz0918

Nuovo Utente
48
8
Non sono d'accordo. La bontà dell'algoritmo deve esserci sempre e non si tratta di un esercizio "stupido" ma bensì di un esercizio molto semplice.
Parlando di "algoritmo", il fatto che ci possa essere 1 milione di elementi nel vettore non rende l'esercizio più difficile, ma fa apprezzare proprio il fatto che un algoritmo dovrebbe essere sempre ottimizzato.

Inviato dal mio Nexus 6P utilizzando Tapatalk

Sto solamente affermando il fatto che per un vettore di 10 elementi è superfluo parlare di bontà. Poi credo siano punti di vista.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Non è una questione di 10, 20 o 1000 elementi. La stesura di qualsiasi algoritmo, , è che sia, per quanto possibile, corretto e completo; inoltre, dovrebbe essere efficiente.
Corretto = deve fare esattamente ciò che il problema richiede;
completo = deve essere applicabile a qualunque ISTANZA del problema (indipendente, nei limiti del possibile, alla dimensione dell'input);
efficiente = deve risolvere il problema nel minor tempo possibile.
Se non applichi questi principi ai problemi facili, diventi un cattivo programmatore, ti perdi i casi particolari, trascuri le dimensioni, trascuri l'ottimizzazione.
A maggior ragione, anche se un esercizio è banale, non bisogna risolverlo per forza in modo banale. Sforzarsi di fare meglio sugli esercizi facili ti dà la forma mentis per farlo anche su quelli complicati. E' un invito a pensare "posso fare meglio!". E se puoi farlo meglio, DEVI farlo meglio!
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!