Funzioni con strutture in c

di Anonimizzato22572 il
43 risposte

43 Risposte - Pagina 2

  • Il main andava scritto così
    int main (int argc, char** argv)
    {   int i;
        centralina centr[NSERIE];
        
        for(i=0;i<NSERIE;i++)
    	    leggidati(&centr[i]);
    	    
        for(i=0;i<NSERIE;i++)
        	stampadati(&centr[i]);
        
        return 0;
    }
    Provalo, poi prosegui impostando temporaneamente NSERIE a 1 per evitare perdite di tempo ad ogni prova.
    Ora, il passo successivo è aggiungere gli altri parametri della centralina, tutti tranne il giorno della settimana, che aggiungerai solo alla fine, all'ultimo passo.
  • 
    #include<stdio.h>
    #include<string.h>
    #define NSERIE 2
     struct strcentralina{char centr[6];
                          float temperatura;
                          float umidita;
                          float polveri_sottili;
                          int giorno;
                          int mese;
                          int anno;};
    typedef struct strcentralina centralina;
    
    void leggidati(centralina *dati)
    {
    printf("inserire dati rilevazione:");
    scanf("%s %f %f %f %d %d %d",&(dati->centr),&(dati->umidita),&(dati->temperatura),&(dati->polveri_sottili),&(dati->giorno),&(dati->mese),&(dati->anno));
    }
    void stampadati(centralina *dati)
    {
        printf("la data della rilevazione e': %d %d %d\n",dati->giorno,dati->mese,dati->anno);
        printf("la centralina e': %s\n",dati->centr);
        printf("umidita' e temperatura valgono %f e %f C\n",dati->umidita,dati->temperatura);
        printf("concentrazione polveri sottili: %f ug/m3\n",dati->polveri_sottili);
    
    }
    int main (int argc, char** argv)
    {   int i;
        centralina centr1[NSERIE];
        for(i=0;i<NSERIE;i++){
        leggidati(&centr1[i]);}
        for(i=0;i<NSERIE;i++){
        stampadati(&centr1[i]);}
        return 0;
    }
    
    fatto! in effetti il main scritto così è molto più funzionale
  • Ora ti rimane solo il problema del giorno della settimana ma hai già fatto il 90% dell'esercizio.
    Qui devi riflettere su come vuoi far inserire la stringa (dal testo dell'esercizio sembra che tu lo debba inserire come stringa, in inglese), come lo vuoi salvare nella struttura (suggerisco un intero o una enum, ma puoi anche salvare la stringa che ti viene data in input) e poi come lo devi stampare (dal testo sembra una stringa, in italiano).
    Anche in questo caso devi ragionare a passi: prima leggo e lo salvo nella struttura, se è un intero poi stampo l'intero (se è una stringa stampo una stringa); se questo funziona, al passo successivo mi occupo di stampare una stringa in italiano al posto dell'intero (o enum o stringa).
  • Ho un dubbio:
    
    typedef enum{monday,tuesday,wednesday,thurday,friday,saturday,sunday}tipogiorno;
     struct strcentralina{char centr[6];
                          float temperatura;
                          float umidita;
                          float polveri_sottili;
                          int giorno;
                          int mese;
                          int anno;
                          tipogiorno giorno_della_settimana;};
    typedef struct strcentralina centralina;
    
    se nella struct ho un enum come faccio a leggere una stringa e salvarla nel giorno della settimana?
  • Suggerimento: leggi la stringa e con una serie di if confronti se é "Sunday" allora ... se é "Monday" allora ...
  • 
    #include<stdio.h>
    #include<string.h>
    #define NSERIE 2
    typedef enum{monday,tuesday,wednesday,thurday,friday,saturday,sunday}tipogiorno;
     struct strcentralina{char centr[6];
                          float temperatura;
                          float umidita;
                          float polveri_sottili;
                          int giorno;
                          int mese;
                          int anno;
                          char tipogiorno[15];};
    typedef struct strcentralina centralina;
    
    void leggidati(centralina *dati)
    {
    printf("inserire dati rilevazione:");
    scanf("%s %f %f %f  %d %d %d %s",&(dati->centr),&(dati->umidita),&(dati->temperatura),&(dati->polveri_sottili),&(dati->giorno),&(dati->mese),&(dati->anno),&(dati->tipogiorno));
    }
    void stampadati(centralina *dati)
    {
        printf("la data della rilevazione e':%s %d %d %d\n",dati->tipogiorno,dati->giorno,dati->mese,dati->anno);
        printf("la centralina e': %s\n",dati->centr);
        printf("umidita' e temperatura valgono %f e %f C\n",dati->umidita,dati->temperatura);
        printf("concentrazione polveri sottili: %f ug/m3\n",dati->polveri_sottili);
    
    }
    int main (int argc, char** argv)
    {   int i;
        centralina centr1[NSERIE];
        for(i=0;i<NSERIE;i++){
        leggidati(&centr1[i]);}
        for(i=0;i<NSERIE;i++){
        stampadati(&centr1[i]);}
        return 0;
    }
     
    per salvare la stringa mi viene in mente solo di definre una stringa nella struttura...l'if mi serve per cambiarla da inglese ad italiano no?
  • Supponi di voler mettere nella struttura un int che vale 1 per Sunday, 2 per Monday ...
  • Non capisco...ma l'enum in sè non è già un int in cui i valori all'interno sono monday=1, tuesday=2 etc...?
  • Lascia stare la enum, supponi di scrivere un int nella struct. A seconda della stringa inserita setto tale intero a 1 se la stringa inserita é "Sunday" , 2 se la stringa inserita é "Monday"...
    Ti ho dato già troppi suggerimenti; rileggi tutto e rifletti!
  • Niente non ci arrivo perchè in primis non capisco dove e come inserire la stringa e secondo non so come spostarla nella struttura tramite un int...e la prima volta che provo a compilare un programma con delle funzioni e strutture da solo certi meccanismi non ce li ho...
  • Nella struct devo salvare per forza un enum ho provato ad usare la funzione strcmp nella funzione leggi dati e uno switch case nella funzione stampa dati per convertire da inglese ad italiano ma qualcosa non va anche se il compilatore non segnala errori...
    
    #include<stdio.h>
    #include<string.h>
    #define NSERIE 10
    typedef enum{monday,tuesday,wednesday,thursday,friday,saturday,sunday}tipogiorno;
     struct strcentralina{char centr[6];
                          float temperatura;
                          float umidita;
                          float polveri_sottili;
                          int giorno;
                          int mese;
                          int anno;
                          tipogiorno giornosettimana;};
    typedef struct strcentralina centralina;
    
    void leggidati(centralina *dati)
    { tipogiorno gdg;
    char stringa1[15];
    printf("inserire dati rilevazione ovvero giorno della settimana,centralina,umidita',temperatura,polveri e data:\n");
    scanf("%s",);
    scanf("%s %f %f %f  %d %d %d ",&(dati->centr),&(dati->umidita),&(dati->temperatura),&(dati->polveri_sottili),&(dati->giorno),&(dati->mese),&(dati->anno));
    
    if (strcmp(stringa1,"monday"))
    gdg=monday;
    else if(strcmp(stringa1,"tuesday"))
    gdg=tuesday;
    else if(strcmp(stringa1,"wednesday"))
    gdg=wednesday;
    else if(strcmp(stringa1,"thursday"))
    gdg=thursday;
    else if(strcmp(stringa1,"friday"))
    gdg=friday;
    else if(strcmp(stringa1,"saturday"))
    gdg=saturday;
    else if(strcmp(stringa1,"monday"))
    gdg=monday;
    }
    void stampadati(centralina *dati)
    { tipogiorno giornosettimana=monday;
        printf("la data della rilevazione e':%d %d %d %d\n",dati->giornosettimana,dati->giorno,dati->mese,dati->anno);
        switch(giornosettimana)
        {
            case monday: printf("lunedi'",dati->giornosettimana);break;
            case tuesday: printf("martedi'",dati->giornosettimana);break;
            case wednesday: printf("mercoledi'",dati->giornosettimana);break;
            case thursday: printf("giovedi'",dati->giornosettimana);break;
            case friday: printf("venerdi'",dati->giornosettimana);break;
            case saturday: printf("sabato",dati->giornosettimana);break;
            case sunday:printf("domenica",dati->giornosettimana);break;
        }
        printf("la centralina e': %s\n",dati->centr);
        printf("umidita' e temperatura valgono %f e %f C\n",dati->umidita,dati->temperatura);
        printf("concentrazione polveri sottili: %f ug/m3\n",dati->polveri_sottili);
    
    }
    int main (int argc, char** argv)
    {   int i;
        centralina centr1[NSERIE];
        for(i=0;i<NSERIE;i++){
        leggidati(&centr1[i]);}
        for(i=0;i<NSERIE;i++){
        stampadati(&centr1[i]);}
        return 0;
    }
    
    secondo me il problema sta nel legare la stringa con l'enum ma non so come fare, dovrei fare una specie di casting?
  • Cosa succede in esrcuzione? stampa sempre lunedì? Hai controllato bene cosa restituiscecla funzione strcmp?
  • In esecuzione mi fa inserire i primi dati tramite la printf e poi non succede nulla mi fa andare a capo senza altre richieste...l'errore è nella strcmp?
  • Facci un esempio di input e mostraci il relativo output. Comunque strcmp ritorna 0 se le due stringhe uguali pertanto i test che hai scritto sono errati.
  • Ma in questa

    scanf("%s",);

    non manca qualcosa?

    E queste

    printf("lunedi'", dati->giornosettimana);

    che senso hanno? Dovrebbero essere

    printf("lunedi'");

    E soprattutto, che senso ha fare questo confronto

    if (strcmp(stringa1, "monday"))

    ??
Devi accedere o registrarti per scrivere nel forum
43 risposte