Passaggio by reference di un array di tipo struct

di il
17 risposte

17 Risposte - Pagina 2

  • Re: Passaggio by reference di un array di tipo struct

    Proprio così si fa.
  • Re: Passaggio by reference di un array di tipo struct

    Allora non capisco perchè questo programma non va, praticamente mi stampa giusto soltanto la prima riga.
    L'esercizio consiste nel trovare il puntoggio massimo per qualsiasi prova. esempio
    rossi, 1,4,5,6,7
    bianchi, 3,7,2,1,3
    e dovrebbe stampare per ogni prova chi ha fatto il punteggio piu alto e il punteggio, esempio:
    bianchi 3
    bianchi 7
    rossi 5
    
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define NMAX 10
    #define VERO 1
    #define FALSO 0
    
    struct concorrente 
    {
        char nome[20];
        int punteggi[10];
    };
    struct vincitore
    {
        char nome[20];
        int punteggio;
    };
    
    int cerca_vincitori(char fileconcorso[], struct vincitore v[]);
    void trova_massimi(struct vincitore v[], struct concorrente c[], int dim_vett, int nconcorrenti);
    int massimo (struct concorrente c[], int n, int ngara);
    struct concorrente estrai_dati(char s[], int *nprove);
    
    int main(int argc, char *argv[])
    {
        struct vincitore v[NMAX];
        int nprove;
        int i=0;
        int k=1;
    
        if(argc != 2)
        {
            printf("Inserisci: <fileconcorso>");
            exit(EXIT_FAILURE);
        }
    
        nprove = cerca_vincitori(argv[1], v);
        
        printf("I vincitori sono delle prove sono:\n");
    
        while(i < nprove)
        {
            printf("%2d) %s %5d\n", k++, v[i].nome, v[i].punteggio);
            i++;
        }
    
        return EXIT_SUCCESS;
    }
    int cerca_vincitori(char fileconcorso[], struct vincitore v[])
    {
        FILE *fp;
        struct concorrente c[NMAX];
        char s[128];
        int i=0;
        int nprove;
        int nconcorrenti=0;
    
        if((fp = fopen(fileconcorso, "r")) == NULL)
        {
            printf("Errore apertura del file!!");
            exit(EXIT_FAILURE);
        }
    
        while(fgets(s, 128, fp) != NULL)
        {
            c[nconcorrenti++] = estrai_dati(s, &nprove);
        }
        
        trova_massimi(v, c, nprove, nconcorrenti);
    
        return nprove;
    }
    void trova_massimi(struct vincitore v[], struct concorrente c[], int nprove, int nconcorrenti)
    {
        int i, indice_max;
    
        for(i=0; i<nprove; i++)
        {
            indice_max = massimo(c, nconcorrenti, i);
            
            strcpy(v[i].nome, c[indice_max].nome);
            v[i].punteggio = c[indice_max].punteggi[i];
        }
        return;
    }
    int massimo (struct concorrente c[], int nconcorrenti, int ngara)
    {
        int i, max, inizializzato;
    
        inizializzato = FALSO;
    
        for (i=0; i<nconcorrenti; i++)
        {
            if(!(inizializzato))
            {
                max = i;
                inizializzato = VERO;
            }
            else
            {
                if(c[i].punteggi[ngara] > c[max].punteggi[ngara])
                {
                    max = i;
                }
    
            }
        }
        return max; 
    }
    struct concorrente estrai_dati(char s[], int *nprove)
    {
        struct concorrente c;
        int i, j, k;
        char t[10];
    
        i=0;
        j=0;
        k=0;
    
        while(s[i] != ',' && s[i] != '\0')
        {
            c.nome[j++] = s[i++];
        }
        c.nome[j] = '\0';
    
        while(s[i] == ',' || s[i] == ' ' && s[i] != '\0')
        {
            i++;
        }
    
        j=0;
        while(s[i] != ',' && s[i] != '\0')
        {
            t[j++] = s[i++];
        }
        t[j] = '\0';
        c.punteggi[k++] = atoi(t);
    
        j=0;
        while(s[i] != ',' && s[i] != '\0')
        {
            t[j++] = s[i++];
        }
        t[j] = '\0';
        c.punteggi[k++] = atoi(t);
    
        j=0;
        while(s[i] != ',' && s[i] != '\0')
        {
            t[j++] = s[i++];
        }
        t[j] = '\0';
        c.punteggi[k++] = atoi(t);
    
        j=0;
        while(s[i] != ',' && s[i] != '\0')
        {
            t[j++] = s[i++];
        }
        t[j] = '\0';
        c.punteggi[k++] = atoi(t);
    
        j=0;
        while(s[i] != ',' && s[i] != '\0')
        {
            t[j++] = s[i++];
        }
        t[j] = '\0';
        c.punteggi[k++] = atoi(t);
    
        j=0;
        while(s[i] != ',' && s[i] != '\0')
        {
            t[j++] = s[i++];
        }
        t[j] = '\0';
        c.punteggi[k++] = atoi(t);
    
        j=0;
        while(s[i] != ',' && s[i] != '\0')
        {
            t[j++] = s[i++];
        }
        t[j] = '\0';
        c.punteggi[k++] = atoi(t);
    
        j=0;
        while(s[i] != ',' && s[i] != '\0')
        {
            t[j++] = s[i++];
        }
        t[j] = '\0';
        c.punteggi[k++] = atoi(t);
    
        j=0;
        while(s[i] != ',' && s[i] != '\0')
        {
            t[j++] = s[i++];
        }
        t[j] = '\0';
        c.punteggi[k++] = atoi(t);
    
        j=0;
        while(s[i] != ',' && s[i] != '\0')
        {
            t[j++] = s[i++];
        }
        t[j] = '\0';
        c.punteggi[k++] = atoi(t);
        *nprove = k;
    
        return c;
    }
  • Re: Passaggio by reference di un array di tipo struct

    La funzione 'estrai_dati' è troppo complessa e farraginosa: la puoi semplificare così:
    struct concorrente estrai_dati(char s[], int *nprove)
    {
        struct concorrente c;
        int i, j, k;
        char t[10];
    
        i=0;
        j=0;
        k=0;
        int stato = 0;
        while (s[i] != '\0'){
            switch (stato){
            case 0:
                // Nome concorrente
                if (s[i] == ','){
                    c.nome[j] = '\0';
                    i++;
                    stato = 1;
                    j = 0;
                } else {
                    c.nome[j] = s[i];
                    ++j;
                    ++i;
                }
                break;
            case 1:
                // le prove
                if ((s[i] == ',')||(s[i] == '\0')){
                    t[j] = '\0';
                    c.punteggi[k] = atoi(t);
                    k++;
                    j = 0;
                }else{
                    t[j] = s[i];
                    j++;
                }
                i++;
                break;
            default:
                break;
            }
        }
        // Recupero l'ultimo punteggio
        t[j] = '\0';
        c.punteggi[k] = atoi(t);
        k++;
        *nprove = k;
    
        return c;
    }
    Ti faccio notare che una 'best practice' (almeno, per me) è quella di passare il puntatore della struct e far ritornare un intero come indicatore del buon / cattivo funzionamento della funzione. Esempio:
    int estrai_dati(char *s, struct concorrente *c) { ... }
    Se tutto va bene ritorna un valore > 0; nel caso la stringa s fosse 'illeggibile' ritornerebbe 0 (ad esempio) od un valore negativo.
Devi accedere o registrarti per scrivere nel forum
17 risposte