Funzioni con strutture in c

di il
43 risposte

Funzioni con strutture in c

Ciao a tutti, sono due giorni che ho problemi su questo esercizio soprattutto con l'implementazione delle due funzioni,c'è qualcuno che sappia scrivere il codice delle due funzioni?? grazie mille!


Si scriva una struct che possa memorizzare i seguenti dati relativi a una rilevazione di una centralina per il controllo climatico. La centralina e' identificata da una stringa di al piu' 5 caratteri, e i dati sono relativi a temperatura, umidita', microgrammi/mc polveri sottili. I dati sono anche associati a una data di rilevamento, che viene letta formato giorno, mese, anno, giorno della settimana dove giorno e' un numero, mese e anno sono numeri e il giorno della settimana e' una stringa, in inglese, che va memorizzata nella struct come enum.

Si scriva una funzione leggiDati che legge questi dati da terminale, separati da spazi, e ritorna la struct.

Si scriva una funzione stampaDati che stampa una struct di questo tipo. In particolare, il giorno della settimana deve essere stampato come stringa, in italiano.

Esempio.
Leggendo

Cent1 21.0 67.2 57.2 24 10 2017 Thursday

Si deve stampare

Data: Giovedi' 24/10/2017
Centralina: Cent1
Temperatura: 21.0 C
Umidita': 67.2
Polveri sottili: 57.2 ug/m3

Si definisca infine un programma princpale che chiama 10 volte la funzione leggiDati e stampa i relativi dati letti.

43 Risposte

  • Re: Funzioni con strutture in c

    Il mio consiglio è sempre quello di partire da qualcosa di più semplice per poi andare ad aggiungere le parti più complicate.
    In questo caso, secondo me dovresti partire considerando solo questi dati
    da una stringa di al piu' 5 caratteri, e i dati sono relativi a temperatura, umidita', microgrammi/mc polveri sottili.
    Definisci la struttura, crea una funzione che legge i dati caricando una struttura passata e una funzione che stampa tali dati prendendoli sempre da una struttura passata.
    Questo è il primo passo.
  • Re: Funzioni con strutture in c

    La struttuta l'ho defiita come:
    struct centralina{
    char centralina[5];
    float temperatura;
    float umidita;
    float polveri_sottili;
    unsigned int giorno;
    unsigned int mese;
    unsigned int anno;
    char tipogiorno[15];};
    typedef struct centralina CENT;
    il mio problema viene dopo nella prima funzione non capisco cosa devo usare come tipo del ritorno e come parametri...
    e nella seconda non so come cambiare il giorno da inglese ad italiano...
  • Re: Funzioni con strutture in c

    e nella seconda non so come cambiare il giorno da inglese ad italiano...
    Questo problema non affrontarlo ora, come suggerito concentrati sui primi dati:
    struct strcentralina{
       char centralina[6];
       float temperatura;
       float umidita;
       float polveri_sottili;
    };
    typedef struct strcentralina centralina;
    (usa i tag CODE per postare codice) ho modificato il nome della struttura perchè se è tutto in maiuscolo rischia di confondersi con una costante.
    Scrivi la leggiDati, io ti suggerisco il prototipo:
    int leggiDati(centralina *dati);
    Per provare la funzione devi predisporre un main del tipo:
    int main()
    {
        centralina centr1;
        leggiDati(&centr1);
        return 0;
    }
    
    EDIT: la dimensione della stringa centralina deve essere 6 e non 5 perchè deve esserci spazio anche per il terminatore...
  • Re: Funzioni con strutture in c

    Sono riuscito a scrivere il programma lo esegue ma i dati che inserisco sono tutti sballati una volta stampati a video e il giorno della settimana non viene tradotto...ecco il codice:
    <code>
    #include<stdio.h>
    #include<string.h>
    #define SERIE 10
    typedef enum {monday,tuesday,wednesday,thursday,friday,saturday,sunday}tipogiorno;
    typedef struct strcentralina{
    char centr[5];
    float temperatura;
    float umidita;
    float polveri_sottili;
    unsigned int giorno;
    unsigned int mese;
    unsigned int anno;
    char tipogiorno[15];}centralina;
    void leggiDati(struct strcentralina *dati)
    {centralina strcentralina;
    printf("inserire nome centralina:\n");
    scanf("%s",strcentralina.centr);
    printf("inserire temperatura:\n");
    scanf("%f",&strcentralina.temperatura);
    printf("inserire umidita':\n");
    scanf("%f",&strcentralina.umidita);
    printf("inserire polveri sottili:\n");
    scanf("%f",&strcentralina.polveri_sottili);
    printf("inserire giorno:\n");
    scanf("%d",&strcentralina.giorno);
    printf("inserire mese:\n");
    scanf("%d",&strcentralina.mese);
    printf("inserire anno:\n");
    scanf("%d",&strcentralina.anno);
    printf("inserire giorno della settimana:\n");
    scanf("%s",strcentralina.tipogiorno);
    }
    void stampaDati(centralina *dati)
    { centralina strcentralina;
    if(strcentralina.tipogiorno==monday)
    {printf("lunedi'");}
    else if(strcentralina.tipogiorno==tuesday)
    {printf("martedi'");}
    else if(strcentralina.tipogiorno==wednesday)
    {printf("mercoledi'");}
    else if(strcentralina.tipogiorno==thursday)
    {printf("giovedi'");}
    else if(strcentralina.tipogiorno==friday)
    {printf("venerdi'");}
    else if (strcentralina.tipogiorno==saturday)
    {printf("sabato");}
    else if(strcentralina.tipogiorno==sunday)
    {printf("domenica");}
    printf("data: %s %d %d %d\n",strcentralina.tipogiorno,&strcentralina.giorno,&strcentralina.mese,&strcentralina.anno);
    printf("centralina: %s\n",strcentralina.centr);
    printf("temperatura:%f C\n",&strcentralina.temperatura);
    printf("umidita': %f\n",&strcentralina.umidita);
    printf("polveri sottili: %f ug/m3\n",&strcentralina.polveri_sottili);
    }
    int main(int argv, char** argc)
    {
    int i;
    centralina dati;
    for(i=0;i<SERIE;i++)
    {
    leggiDati(&dati);
    stampaDati(&dati);

    }
    return 0;
    }
    </code>
  • Re: Funzioni con strutture in c

    Non so nemmeno usare il tag code scusami...
  • Re: Funzioni con strutture in c

    Non è complicato. Prima del codice scrivi

    [ code ]

    e alla fine scrivi

    [ /code ]

    senza gli spazi che ho messo solo per chiarezza.
    Quindi non con < > ma con [ ]

    Puoi modificare il tuo thread.

    Ti consiglio anche di indentare il codice e mettere qualche linea vuota per capire meglio i vari blocchi ...
  • Re: Funzioni con strutture in c

    
    #include<stdio.h>
    #include<string.h>
    #define SERIE 10
    typedef enum {monday,tuesday,wednesday,thursday,friday,saturday,sunday}tipogiorno;
    
    typedef struct strcentralina{
                       char centr[5];
                       float temperatura;
                       float umidita;
                       float polveri_sottili;
                       unsigned int giorno;
                       unsigned int mese;
                       unsigned int anno;
                       char tipogiorno[15];}centralina;
    
    void leggiDati(struct strcentralina *dati)
     {centralina strcentralina;
         printf("inserire nome centralina:\n");
         scanf("%s",strcentralina.centr);
         printf("inserire temperatura:\n");
         scanf("%f",&strcentralina.temperatura);
         printf("inserire umidita':\n");
         scanf("%f",&strcentralina.umidita);
         printf("inserire polveri sottili:\n");
         scanf("%f",&strcentralina.polveri_sottili);
         printf("inserire giorno:\n");
         scanf("%d",&strcentralina.giorno);
         printf("inserire mese:\n");
         scanf("%d",&strcentralina.mese);
         printf("inserire anno:\n");
         scanf("%d",&strcentralina.anno);
         printf("inserire giorno della settimana:\n");
         scanf("%s",strcentralina.tipogiorno);
     }
    
    void stampaDati(centralina *dati)
    {   centralina strcentralina;
        if(strcentralina.tipogiorno==monday)
        {printf("lunedi'");}
        else if(strcentralina.tipogiorno==tuesday)
        {printf("martedi'");}
        else if(strcentralina.tipogiorno==wednesday)
        {printf("mercoledi'");}
        else if(strcentralina.tipogiorno==thursday)
        {printf("giovedi'");}
        else if(strcentralina.tipogiorno==friday)
        {printf("venerdi'");}
        else if (strcentralina.tipogiorno==saturday)
        {printf("sabato");}
        else if(strcentralina.tipogiorno==sunday)
        {printf("domenica");}
    
    printf("data: %s %d %d %d\n",strcentralina.tipogiorno,&strcentralina.giorno,&strcentralina.mese,&strcentralina.anno);
    
    printf("centralina: %s\n",strcentralina.centr);
    
    printf("temperatura:%f C\n",&strcentralina.temperatura);
    
    printf("umidita': %f\n",&strcentralina.umidita);
    
    printf("polveri sottili: %f ug/m3\n",&strcentralina.polveri_sottili);
    }
    
    int main(int argv, char** argc)
    {
        int i;
        centralina dati;
        for(i=0;i<SERIE;i++)
        {
            leggiDati(&dati);
            stampaDati(&dati);
    
        }
        return 0;
    }
    
    i problemi sono sempre quelli di sopra
  • Re: Funzioni con strutture in c

    Ci sono parecchi errori ... Probabilmente non hai compreso bene come funziona una enum

    Non

    char tipogiorno[15]

    ma

    tipogiorno tg;

    e tg è un numero intero non una stringa.

    Poi nelle printf, non si capisce perché, utilizzi & ma quelli non sono puntatori ...

    Infine, nelle funzioni utilizzi una variabile centralina strcentralina ma dovresti usare l'argomento dati ottenuto dal main ...
  • Re: Funzioni con strutture in c

    Comunque io ti avevo consigliato di svolgere un esercizio semplificato, senza le date (le avremmo affrontate dopo): l'obiettivo era di affrontare un problema alla volta.
    Qui c'è già un primo errore
    void leggiDati(struct strcentralina *dati)
     {
         centralina strcentralina;
         printf("inserire nome centralina:\n");
         scanf("%s",strcentralina.centr);
         //...
    Il compilatore non ti segnala niente?
  • Re: Funzioni con strutture in c

    Mi da dei warning dalla linea 27 alla 47 mi dice 'comparison between pointer and integer'
    e poi altri warning sui tipi che si aspetta il calcolatora dalla riga 49 alla 53...sul tipedef enum lo immaginavo ma non ho capito bene la richiesta in realtà..sulla funzione leggi dati non mi da errori
  • Re: Funzioni con strutture in c

    Programmare non è scrivere un tema. Se il problema è più grande delle nostre capacità dobbiamo suddividerlo per affrontare un problema alla volta.
    Se vuoi arrivare ad un qualcosa di funzionante devi procedere con metodo.
    Per questo direi di farla ancora più semplice: supponiamo di dover gestire solo temperatura ed umidità e che leggiamo e stampiamo una sola centralina.
    Puoi provare a fare SOLO questo?
  • Re: Funzioni con strutture in c

    
    
    #include<stdio.h>
    #include<string.h>
     struct strcentralina{char centr[5];
                          float temperatura;
                          float umidita;};
    typedef struct strcentralina centralina;
    void leggidati(centralina *dati)
    {centralina strcentralina;
    printf("inserire dati rilevazione:");
    scanf("%s %f %f",strcentralina.centr,&strcentralina.temperatura,&strcentralina.umidita);
    }
    void stampadati(centralina *dati)
    {
        centralina strcentralina;
        printf("la centralina e': %s\n",strcentralina.centr);
        printf("umidita' e temperatura valgono %f e %f C",&strcentralina.umidita,&strcentralina.temperatura);
    }
    int main (int argc, char** argv)
    {
        centralina centr1;
        leggidati(&centr1);
        stampadati(&centr1);
        return 0;
    } 
    
    il problema è che non capisco cosa inserire nelle funzioni a livello di variabili...è la prima volta che provo ad implementare funzioni
  • Re: Funzioni con strutture in c

    Vedi miei commenti sotto:
    void leggidati(centralina *dati)
    {
        //centralina strcentralina; NO! devi caricare la struttura che ti viene passata!!!
    printf("inserire dati rilevazione:");
       //scanf("%s %f %f",strcentralina.centr,&strcentralina.temperatura,&strcentralina.umidita); NO vedi sotto
       scanf("%s %f %f",&(dati->centr),&(dati->temperatura),&(dati->umidita));
    }
    void stampadati(centralina *dati)
    {
        //centralina strcentralina; NO! devi caricare la struttura che ti viene passata!!!
        //printf("la centralina e': %s\n",strcentralina.centr); NO, vedi sotto
        printf("la centralina e': %s\n",dati->centr);
        printf("umidita' e temperatura valgono %f e %f C",dati->umidita,dati->temperatura);
    }
    Inoltre per il nome della centralina dagli almeno 6 caratteri per dare spazio anche al terminatore.
    Ora prova a capire queste modifiche, provale, e quindi passa a risolvere un altro punto: nel main definisci un array di 10 di queste strutture, quindi richiama 10 volte la leggiDati() e poi 10 volte la stampadati() (consiglio di impostare una costante NCENTRALINE che imposti a 2 o 3 per provare e alla fine setterai a 10 per la prova finale).
  • Re: Funzioni con strutture in c

    
    #include<stdio.h>
    #include<string.h>
    #define NSERIE 10
     struct strcentralina{char centr[6];
                          float temperatura;
                          float umidita;};
    typedef struct strcentralina centralina;
    void leggidati(centralina *dati)
    {
    printf("inserire dati rilevazione:");
    scanf("%s %f %f",&(dati->centr),&(dati->umidita),&(dati->temperatura));
    }
    void stampadati(centralina *dati)
    {
    
        printf("la centralina e': %s\n",dati->centr);
        printf("umidita' e temperatura valgono %f e %f C\n",dati->umidita,dati->temperatura);
    }
    int main (int argc, char** argv)
    {   int i;
        centralina centr1;
        for(i=0;i<NSERIE;i++){
        leggidati(&centr1);
        stampadati(&centr1);}
        return 0;
    }
    
    grazie mille!! con la printf non devo usare & questo era un errore banale, ma la notazione col punto quindi non va bene?il main è giusto?
Devi accedere o registrarti per scrivere nel forum
43 risposte