[C] Simulatore torneo di calcetto

di il
5 risposte

[C] Simulatore torneo di calcetto

Salve ragazzi dovrei sviluppare il seguente progetto come esame di PROGRAMMAZIONE I :
Si supponga di gestire un torneo di calcio tra 8 squadre. Inizialmente vengono
considerati 88 giocatori identificati dal Cognome e Nome (anche solo lettere casuali). Si
suppone che ogni giocatore possa assumere qualsiasi ruolo in campo. Ad ogni giocatore
viene assegnato un numero casuale nell’intervallo [0,10]. In maniera casuale vengono
create 8 squadre.
Il torneo viene simulato facendo scontrare due squadre alla volta. Ogni squadra vincitrice
si scontrerà con la squadra vincitrice di un’altra partita fino ad arrivare ad una singola
squadra vincitrice.
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

Ho iniziato in questo modo:
struct _giocatore 
{
char cognome;
char nome;
int valore;
}
typedef struct _giocatore Giocatore;

Giocatore array_giocatori[88]; [color=#00BF00]*/definisco un array di tipo GIOCATORE da 88 */[/color]  
char nomi[21]={a,b,c,d,e,f,g,h,i,l,m,n,o,p,q,r,s,t,u,v,z};
char cognomi[21]={a,b,c,d,e,f,g,h,i,l,m,n,o,p,q,r,s,t,u,v,z};

for (i=0;i<88;i++)
{ 
    Giocatore[i].valore=rand()%11 */ assegno un numero casuale da 1a10 
    Giocatore[i].nome = ???? 
}
ho messo dei punti interrogativi dove trovo problemi... non so come dare casualemente questi valori visto che sono CHAR e non interi e che poi penso non debbano ripetersi (o forse non importa ai fini del programma nn l'ho ancora capito)

5 Risposte

  • Re: [C] Simulatore torneo di calcetto

    La generazione di caratteri può esser fatta sfruttando la codifica delle tabelle ASCII.
    Ogni carattere è indicizzato da 0 a 255 con codifica a 8 bit e da 0 a 127 con codifica a 7 bit.
    I caratteri stampabili vanno da 32(spazio) a 126(tilde).
    I caratteri maiuscoli vanno da 65 (A) a 90 (Z), quelli minuscoli da 97 (a) a 122 (z)

    Detto questo, usando la funzione rand modulo 26 (numero carattere alfabeto USA +1) puoi costruire i tuoi nomi casuali.
    Esempio:
    
    void rand_name (char *name,int len)
    {
      int i;
      char *pname=name;
    
      for (i=0;i<len;i++)
        *pname++=(char)65+(rand()%26);
        
    }
    

    Saluti,
    Max
  • Re: [C] Simulatore torneo di calcetto

    [quote="ixamit"]La generazione di caratteri può esser fatta sfruttando la codifica delle tabelle ASCII.
    Ogni carattere è indicizzato da 0 a 255 con codifica a 8 bit e da 0 a 127 con codifica a 7 bit.
    I caratteri stampabili vanno da 32(spazio) a 126(tilde).
    I caratteri maiuscoli vanno da 65 (A) a 90 (Z), quelli minuscoli da 97 (a) a 122 (z)

    Detto questo, usando la funzione rand modulo 26 (numero carattere alfabeto USA +1) puoi costruire i tuoi nomi casuali.
    Esempio:
    
    void rand_name (char *name,int len)
    {
      int i;
      char *pname=name;
    
      for (i=0;i<len;i++)
        *pname++=(char)65+(rand()%26);
        
    }
    
    Perdona la mia ignoranza . ma non ho ben capito...allora gli argomenti della funzione sono un char e un numero nel mio caso 88.
    poi perchè introduci una nuova char *pname=name; che tra l'altro escludi dal ciclo for.. cosi facendo si assegna soltanto l'ultimo carattere che esce dal ciclo almeno credo. Magari se mi fai un esempio con le mie variabili capisco meglio : io devo assegnare 88 caratteri al valore array_giocatori.nome
  • Re: [C] Simulatore torneo di calcetto

    vincenzoflaminio ha scritto:


    Perdona la mia ignoranza . ma non ho ben capito...allora gli argomenti della funzione sono un char e un numero nel mio caso 88.
    1)L'argomento non è char ma puntatore di char
    2)Len è la rappresenzazione della lunghezza di riempimento che non è 88

    vincenzoflaminio ha scritto:


    poi perchè introduci una nuova char *pname=name; che tra l'altro escludi dal ciclo for.. cosi facendo si assegna soltanto l'ultimo carattere che esce dal ciclo almeno credo.
    Mi sembra di capire che tu non abbia le idee chiare e che il linguaggio non lo conosci affatto.
    Partiamo dalla tua dichiarazione di struttura. Cosa mi rappresenterebbe 'char cognome' e 'char nome'? Intendi metterci un solo char o intendi allocare staticamente un array di char o allocarlo dinamicamente ed usare un pointer char?
    Se vuoi allocare staticamente l'array - la definizione corretta sarà: char cognome[MAX_LEN_NAME] - dove MAX_LEN_NAME è una costante ben definita.
    Bene, se volessi modificare il mio array di char, all'interno di una funzione, per metterci MAX_LEN_NAME caratteri causali avrei bisogno di un puntatore che mi punti al primo elemento.
    Ecco che: rand_name(s_giocatori[giocatori].cognome,MAX_LEN_NAME); farà questo

    La struttura generale può esser rappresentata in modo semplice quì sotto. L'esercizio si scrive in 1/2h e 1/2h di debug
    Al massimo 1h è finito.
    
    #define MAX_LEN_NAME       16
    #define MAX_SQUADRE         8
    #define MAX_PLAYERxSQUADRA 11
    
    struct _giocatore
    {                
      int valore;    
      char cognome[MAX_LEN_NAME+1];
      char    nome[MAX_LEN_NAME+1];
                                   
    };                             
    
    struct _squadra
    {              
      int     giocatori[MAX_PLAYERxSQUADRA];
      char    nome[MAX_LEN_NAME+1];         
    };                                      
    
    struct _giocatore s_giocatori[MAX_PLAYERxSQUADRA*MAX_SQUADRE];
    struct _squadra   s_squadre  [MAX_SQUADRE];                   
    int squadre_in_gioco=MAX_SQUADRE;                             
    
    Saluti,
    Max
  • Re: [C] Simulatore torneo di calcetto

    ixamit ha scritto:


    1)L'argomento non è char ma puntatore di char
    2)Len è la rappresenzazione della lunghezza di riempimento che non è 88

    Mi sembra di capire che tu non abbia le idee chiare e che il linguaggio non lo conosci affatto.
    Partiamo dalla tua dichiarazione di struttura. Cosa mi rappresenterebbe 'char cognome' e 'char nome'? Intendi metterci un solo char o intendi allocare staticamente un array di char o allocarlo dinamicamente ed usare un pointer char?
    Se vuoi allocare staticamente l'array - la definizione corretta sarà: char cognome[MAX_LEN_NAME] - dove MAX_LEN_NAME è una costante ben definita.
    Bene, se volessi modificare il mio array di char, all'interno di una funzione, per metterci MAX_LEN_NAME caratteri causali avrei bisogno di un puntatore che mi punti al primo elemento.
    Ecco che: rand_name(s_giocatori[giocatori].cognome,MAX_LEN_NAME); farà questo
    Allora non so cosa significhi allocare dinamicamente , ma so come farlo staticamente... sono al 1° semestre di programmazione il linguaggio C è nuovo per me se avessi avuto le idee chiare non avrei chiesto aiuto.
    Per quanto riguarda la mia dichiarazione char cognome non ho bisogno del MAX_LEN_Name xke avevo intenzione di fare lettere casuali 1 lettere per nome e 1 per cognome , non credo serva ai fini del programma usarne di piu. Quanto vorrei vedere non è tanto la struct e le dichiarazioni ma l'algoritmo della funzione : void rand_name con l'uso delle tue variabili
    int valore;
    char cognome[MAX_LEN_NAME+1];
    char nome[MAX_LEN_NAME+1];
  • Re: [C] Simulatore torneo di calcetto

    
    #include <stdio.h>
    
    #define randomize srand((unsigned)time(NULL))
    int main ()
    {
      char c;
      
      randomize;
    
      c=(char) 65+(rand()%26);
    
      printf ("lettera casuale :\'%c\'\n",c);
    
      return 0;
    }
    
    Saluti,
    Max
Devi accedere o registrarti per scrivere nel forum
5 risposte