Aiuto per codice - acquisire dei nomi e media

di il
32 risposte

32 Risposte - Pagina 2

  • Re: Aiuto per codice - acquisire dei nomi e media

    Piccolo problemino, quando faccio build e avvio il programma, le stringhe mi si vedono tagliate! In pratica, solo durante il primo passaggio mi si vede la stringa intera, poi tutte tagliate a 4 caratteri. Ora vi condivido lo spezzone di codice in questione.
    Proprio lì nell'inserimento temperature, al primo passaggio del ciclo il nome del comune si vede interamente.
    Da quando inserisco la seconda temperatura il comune si taglia a sole 4 lettere. Come faccio?
    
    void caricamento (comuni comuni[])//caricamento dei nomi delle città.
    {
        
        int i=0;
        for (i=0;i<5;i++)
        {
            cout << "inserisci il comune numero "<<i+1<<endl;
            cin >> gets(&comuni[i].nome);
        }
        
    }
    
    void inserimentotemperature(int Vet[],comuni comuni[])
    {
        int i=0;
        int j=0;
        double mediacomunitotale=0;
        int contasu=0;
        int contagiu=0;
    
        double mediagiornaliera=0;
        for(i=0;i<5;i++){
            for(j=0;j<7;j++){
            
               
        
           
                                    cout <<"inserire temp numero \t"<<j+1<<"\t di"<<"\t"<<(&comuni[i].nome);
                                    cin >> comuni[j].temperatura;
                                    mediagiornaliera=(mediagiornaliera+comuni[j].temperatura); //media delle temperature del comune in 7 giorni, da sommare alla fine del while alla media TOTALE di tutti i 5 comuni.
                                  
                                        
    
                            }
                                  
  • Re: Aiuto per codice - acquisire dei nomi e media

    Ma hai cambiato il tipo del membro nome nella struttura?

    Perché non posti il codice completo?

    Te lo hanno detto che non si usa più la gets(), perché la usi ancora? Avevi detto che avresti seguito i consigli...
  • Re: Aiuto per codice - acquisire dei nomi e media

    Sono su xcode, funziona ancora gets

    ho aggiunto il puntatore e adesso funziona tutto alla perfezione, ho cambiato anche la media modificando alcune cose che mi erano sfuggite (però da solo)

    quindi mi sa proprio che i consigli li ho seguiti
  • Re: Aiuto per codice - acquisire dei nomi e media

    Non ho postato il codice intero poiché mi sembrava inutile dato che questa è la parte interessata riguardo la stampa, adesso il mio unico problema è che la stringa al primo passaggio si vede e dal secondo è tagliata...
  • Re: Aiuto per codice - acquisire dei nomi e media

    Ripropongo il codice aggiornato funzionante.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int N;
    int NN;
    
    //creare un programma in cui viene calcolata la temperatura media di 5 comuni in una settimana ,
    //indicare QUANTI comuni sono sotto la media e QUANTI sono sopra la media
    //utilizzare caricamento, calcolo e stampa
    
    struct _comuni
    {
        char nome[50];
        float temperatura;
    };
    void Inserimento(struct _comuni [][NN]);
    void Stampa(struct _comuni [][NN]);
    float Media(struct _comuni [][NN]);
    void UpAndDown(struct _comuni [][NN],float *);
    int main()
    {
        printf("Inserisci quanti comuni analizzare : ");
        scanf("%d",&N);
        printf("Inserisci quanti giorni analizzare : ");
        scanf("%d",&NN);
        struct _comuni comuni[N][NN];
        float media,*puntatore_media=&media;
        Inserimento(comuni);
        Stampa(comuni);
        *puntatore_media=Media(comuni);
        UpAndDown(comuni,puntatore_media);
    
        return 0;
    }
    void Inserimento(struct _comuni comuni[][NN])
    {
        for (int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                if(j==0)
                {
                    printf("Inserisci nome comune %d  : ",i+1);
                    scanf("%s",&comuni[i][0].nome);
                    for(int k=1;k<NN;k++)
                    {
                        strcpy(comuni[i][k].nome,comuni[i][0].nome);
                    }
    
                }
                printf("Inserisci temperatura %d del giorno %d al comune %s : ",i+1,j+1,comuni[i][j].nome);
                scanf("%f",&comuni[i][j].temperatura);
            }
        }
    }
    void Stampa(struct _comuni comuni[][NN])
    {
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                printf("Nome comune %d : %s\t\ttemperatura : %.2f\t\tnel giorno %d\n",i+1,comuni[i][j].nome,comuni[i][j].temperatura,j+1);
            }
        }
    }
    float Media(struct _comuni comuni[][NN])
    {
        float media=0;
        float a=0;
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
            media=media + comuni[i][j].temperatura;
            }
        }
        for (int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                a++;
            }
        }
        media =media/a;
        return media;
    }
    void UpAndDown(struct _comuni comuni[][NN],float *media)
    {
        int differenza_positiva=0,differenza_negativa=0;
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                if(comuni[i][j].temperatura >= *media)
                {
                    differenza_positiva++;
                    printf("Il comune %d: %s\t\tcon temperatura : %.2f\t\te' superiore alla media : %.2f\t\tnel giorno %d\n",i+1,comuni[i][j].nome,comuni[i][j].temperatura,*media,j+1);
                }
                else
                {
                    differenza_negativa++;
                    printf("Il comune %d: %s\t\tcon temperatura : %.2f\t\te' inferiore alla media : %.2f\t\tnel giorno %d\n",i+1,comuni[i][j].nome,comuni[i][j].temperatura,*media,j+1);
                }
            }
        }
        printf("I comuni superiori alla media sono : %d\ngli inferiori alla media sono : %d\n",differenza_positiva,differenza_negativa);
    }
    
    Funzione per inserire una volta il nome del comune in una matrice:
    strcpy serve per copiare un variabile stringa su un altra variabile, l'assegnamento classico da errore.
    void Inserimento(struct _comuni comuni[][NN])
    {
        for (int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                if(j==0)
                {
                    printf("Inserisci nome comune %d  : ",i+1);
                    scanf("%s",&comuni[i][0].nome);
                    for(int k=1;k<NN;k++)
                    {
                        strcpy(comuni[i][k].nome,comuni[i][0].nome);
                    }
    
                }
                printf("Inserisci temperatura %d del giorno %d al comune %s : ",i+1,j+1,comuni[i][j].nome);
                scanf("%f",&comuni[i][j].temperatura);
            }
        }
    }
    Media della matrice
    float Media(struct _comuni comuni[][NN])
    {
        float media=0;
        float a=0;
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
            media=media + comuni[i][j].temperatura;
            }
        }
        for (int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                a++;
            }
        }
        media =media/a;
        return media;
    }
    funzione per controllare se maggiore o minore della matrice
    void UpAndDown(struct _comuni comuni[][NN],float *media)
    {
        int differenza_positiva=0,differenza_negativa=0;
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                if(comuni[i][j].temperatura >= *media)
                {
                    differenza_positiva++;
                    printf("Il comune %d: %s\t\tcon temperatura : %.2f\t\te' superiore alla media : %f\t\tnel giorno %d\n",i+1,comuni[i][j].nome,comuni[i][j].temperatura,*media,j+1);
                }
                else
                {
                    differenza_negativa++;
                    printf("Il comune %d: %s\t\tcon temperatura : %.2f\t\te' inferiore alla media : %f\t\tnel giorno %d\n",i+1,comuni[i][j].nome,comuni[i][j].temperatura,*media,j+1);
                }
            }
        }
        printf("I comuni superiori alla media sono : %d\ngli inferiori alla media sono : %d\n",differenza_positiva,differenza_negativa);
    
    }
    La soluzione al tuo problema e' una matrice con cicli nidificati.
    Con questo codice non puoi inserire spazzi nel nome del comune, siccome gets non funziona, e devo ancora aggiornarmi al c11 per fgets e testare se funziona sulla struttura.
    Spero di esserti d'aiuto.
    volevo utilizzare il puntatore anche per la struttura, ma ho avuto non pochi problemi con la matrice che non era utilizzabile.
  • Re: Aiuto per codice - acquisire dei nomi e media

    Ok grazie, prenderò spunto e vedrò se il problema della visibilità della stringa si risolve (non devo inserire spazi tra i comuni).
    Non c'è alcun errore di programmazione suppongo, forse devo solo renderlo meno "grezzo" e "spartano".
  • Re: Aiuto per codice - acquisire dei nomi e media

    StandardOil ha scritto:


    Ma hai cambiato il tipo del membro nome nella struttura?
    A questo non hai risposto
  • Re: Aiuto per codice - acquisire dei nomi e media

    Scusami non ho afferrato la domanda
  • Re: Aiuto per codice - acquisire dei nomi e media

    TheorLaw ha scritto:


    Ripropongo il codice aggiornato funzionante.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int N;
    int NN;
    
    //creare un programma in cui viene calcolata la temperatura media di 5 comuni in una settimana ,
    //indicare QUANTI comuni sono sotto la media e QUANTI sono sopra la media
    //utilizzare caricamento, calcolo e stampa
    
    struct _comuni
    {
        char nome[50];
        float temperatura;
    };
    void Inserimento(struct _comuni [][NN]);
    void Stampa(struct _comuni [][NN]);
    float Media(struct _comuni [][NN]);
    void UpAndDown(struct _comuni [][NN],float *);
    int main()
    {
        printf("Inserisci quanti comuni analizzare : ");
        scanf("%d",&N);
        printf("Inserisci quanti giorni analizzare : ");
        scanf("%d",&NN);
        struct _comuni comuni[N][NN];
        float media,*puntatore_media=&media;
        Inserimento(comuni);
        Stampa(comuni);
        *puntatore_media=Media(comuni);
        UpAndDown(comuni,puntatore_media);
    
        return 0;
    }
    void Inserimento(struct _comuni comuni[][NN])
    {
        for (int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                if(j==0)
                {
                    printf("Inserisci nome comune %d  : ",i+1);
                    scanf("%s",&comuni[i][0].nome);
                    for(int k=1;k<NN;k++)
                    {
                        strcpy(comuni[i][k].nome,comuni[i][0].nome);
                    }
    
                }
                printf("Inserisci temperatura %d del giorno %d al comune %s : ",i+1,j+1,comuni[i][j].nome);
                scanf("%f",&comuni[i][j].temperatura);
            }
        }
    }
    void Stampa(struct _comuni comuni[][NN])
    {
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                printf("Nome comune %d : %s\t\ttemperatura : %.2f\t\tnel giorno %d\n",i+1,comuni[i][j].nome,comuni[i][j].temperatura,j+1);
            }
        }
    }
    float Media(struct _comuni comuni[][NN])
    {
        float media=0;
        float a=0;
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
            media=media + comuni[i][j].temperatura;
            }
        }
        for (int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                a++;
            }
        }
        media =media/a;
        return media;
    }
    void UpAndDown(struct _comuni comuni[][NN],float *media)
    {
        int differenza_positiva=0,differenza_negativa=0;
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                if(comuni[i][j].temperatura >= *media)
                {
                    differenza_positiva++;
                    printf("Il comune %d: %s\t\tcon temperatura : %.2f\t\te' superiore alla media : %.2f\t\tnel giorno %d\n",i+1,comuni[i][j].nome,comuni[i][j].temperatura,*media,j+1);
                }
                else
                {
                    differenza_negativa++;
                    printf("Il comune %d: %s\t\tcon temperatura : %.2f\t\te' inferiore alla media : %.2f\t\tnel giorno %d\n",i+1,comuni[i][j].nome,comuni[i][j].temperatura,*media,j+1);
                }
            }
        }
        printf("I comuni superiori alla media sono : %d\ngli inferiori alla media sono : %d\n",differenza_positiva,differenza_negativa);
    
    }
    
    
    Funzione per inserire una volta il nome del comune in una matrice:
    strcpy serve per copiare un variabile stringa su un altra variabile, l'assegnamento classico da errore.
    void Inserimento(struct _comuni comuni[][NN])
    {
        for (int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                if(j==0)
                {
                    printf("Inserisci nome comune %d  : ",i+1);
                    scanf("%s",&comuni[i][0].nome);
                    for(int k=1;k<NN;k++)
                    {
                        strcpy(comuni[i][k].nome,comuni[i][0].nome);
                    }
    
                }
                printf("Inserisci temperatura %d del giorno %d al comune %s : ",i+1,j+1,comuni[i][j].nome);
                scanf("%f",&comuni[i][j].temperatura);
            }
        }
    }
    Media della matrice
    float Media(struct _comuni comuni[][NN])
    {
        float media=0;
        float a=0;
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
            media=media + comuni[i][j].temperatura;
            }
        }
        for (int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                a++;
            }
        }
        media =media/a;
        return media;
    }
    funzione per controllare se maggiore o minore della matrice
    void UpAndDown(struct _comuni comuni[][NN],float *media)
    {
        int differenza_positiva=0,differenza_negativa=0;
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<NN;j++)
            {
                if(comuni[i][j].temperatura >= *media)
                {
                    differenza_positiva++;
                    printf("Il comune %d: %s\t\tcon temperatura : %.2f\t\te' superiore alla media : %f\t\tnel giorno %d\n",i+1,comuni[i][j].nome,comuni[i][j].temperatura,*media,j+1);
                }
                else
                {
                    differenza_negativa++;
                    printf("Il comune %d: %s\t\tcon temperatura : %.2f\t\te' inferiore alla media : %f\t\tnel giorno %d\n",i+1,comuni[i][j].nome,comuni[i][j].temperatura,*media,j+1);
                }
            }
        }
        printf("I comuni superiori alla media sono : %d\ngli inferiori alla media sono : %d\n",differenza_positiva,differenza_negativa);
    
    }
    La soluzione al tuo problema e' una matrice con cicli nidificati.
    Con questo codice non puoi inserire spazzi nel nome del comune, siccome gets non funziona, e devo ancora aggiornarmi al c11 per fgets e testare se funziona sulla struttura.
    Spero di esserti d'aiuto.
    volevo utilizzare il puntatore anche per la struttura, ma ho avuto non pochi problemi con la matrice che non era utilizzabile.
  • Re: Aiuto per codice - acquisire dei nomi e media

    Se non hai cambiato il tipo del membro della struttura non riservi spazio per il nome del comune

    E se passi un puntatore a carattere sembra, sembra solo, che vada
    in realtà vai a sovrascrivere in zone già impegnate della memoria

    La confusione è originata dal fatto che un array di caratteri viene passato sotto forma di puntatore a carattere, anche lui


    Ma la differenza è che a 'quel' puntatore a carattere corrisponde uno spazio riservato in memoria

    Se non è chiaro domanda,
    Ma prima rispondi:
    Hai cambiato il tipo del membro 'nome' della struttura, da char a char[] ? Non char *
  • Re: Aiuto per codice - acquisire dei nomi e media

    Ho fatto un casino, ho riquotato il messaggio, scusatemi, comunque volevo dire che c'era un errore e l'ho sistemato.
  • Re: Aiuto per codice - acquisire dei nomi e media

    StandardOil ha scritto:


    Se non hai cambiato il tipo del membro della struttura non riservi spazio per il nome del comune

    E se passi un puntatore a carattere sembra, sembra solo, che vada
    in realtà vai a sovrascrivere in zone già impegnate della memoria

    La confusione è originata dal fatto che un array di caratteri viene passato sotto forma di puntatore a carattere, anche lui


    Ma la differenza è che a 'quel' puntatore a carattere corrisponde uno spazio riservato in memoria

    Se non è chiaro domanda,
    Ma prima rispondi:
    Hai cambiato il tipo del membro 'nome' della struttura, da char a char[] ? Non char *
    No, mi sembra che "comuni comuni[]" sia stato sempre quello se ricordo bene
  • Re: Aiuto per codice - acquisire dei nomi e media

    StandardOil ha scritto:


    Se non hai cambiato il tipo del membro della struttura non riservi spazio per il nome del comune

    E se passi un puntatore a carattere sembra, sembra solo, che vada
    in realtà vai a sovrascrivere in zone già impegnate della memoria

    La confusione è originata dal fatto che un array di caratteri viene passato sotto forma di puntatore a carattere, anche lui


    Ma la differenza è che a 'quel' puntatore a carattere corrisponde uno spazio riservato in memoria

    Se non è chiaro domanda,
    Ma prima rispondi:
    Hai cambiato il tipo del membro 'nome' della struttura, da char a char[] ? Non char *
    Infatti non ho capito, però ho risposto sopra, riguardo il membro "nome" della struct comuni (che sarebbe comuni anch'esso) no, non l'ho cambiato e mi pare sia rimasto sempre comuni[]
  • Re: Aiuto per codice - acquisire dei nomi e media

    frekkzz ha scritto:


    No, mi sembra che "comuni comuni[]" sia stato sempre quello se ricordo bene
    Per riassumere, adesso, il codice che usi lo puoi mostrare completamente? E dirci quali problemi hai ancora?
  • Re: Aiuto per codice - acquisire dei nomi e media

    oregon ha scritto:


    frekkzz ha scritto:


    No, mi sembra che "comuni comuni[]" sia stato sempre quello se ricordo bene
    Per riassumere, adesso, il codice che usi lo puoi mostrare completamente? E dirci quali problemi hai ancora?
    Eccolo qui
    #include <iostream>
    #include <string>
    
    
    //creare un programma in cui viene calcolata la temperatura media di 5 comuni in una settimana ,
    //indicare QUANTI comuni sono sotto la media e QUANTI sono sopra la media
    //utilizzare caricamento, calcolo e stampa
    using namespace std;
    
    
    
    
    typedef struct comuni{
        char nome;
        float temperatura;
        
    }comuni;//definizione della struttura contenente nome e temperatura.
    
    void caricamento (comuni comuni[])//caricamento dei nomi delle città.
    {
        
        int i=0;
        for (i=0;i<5;i++)
        {
            cout << "inserisci il comune numero "<<i+1<<endl;
            cin >> gets(&comuni[i].nome);
        }
        
    }
    
    void inserimentotemperature(int Vet[],comuni comuni[])
    {
        int i=0;
        int j=0;
        double mediacomunitotale=0;
        int contasu=0;
        int contagiu=0;
    
        double mediagiornaliera=0;
        for(i=0;i<5;i++){
            for(j=0;j<7;j++){
            
               
        
           
                                    cout <<"inserire temp numero \t"<<j+1<<"\t di"<<"\t"<<(&comuni[i].nome);
                                    cin >> comuni[j].temperatura;
                                    mediagiornaliera=(mediagiornaliera+comuni[j].temperatura); //media delle temperature del comune in 7 giorni, da sommare alla fine del while alla media TOTALE di tutti i 5 comuni.
                                  
                                        
    
                            }
            mediagiornaliera=mediagiornaliera/7;
            if(mediagiornaliera>mediacomunitotale)
                contasu=contasu+1;
                    else  (contagiu=contagiu+1);
          
            
            
            mediacomunitotale=(mediacomunitotale+mediagiornaliera);
            
          
        
        }
        mediacomunitotale=mediacomunitotale/5;
        cout << "media totale "<<mediacomunitotale<<"quanti sopra:"<<contasu<<"quanti sotto:"<<contagiu<<endl;
       
    }
    
    
    
    
    
    int main()
    {
        comuni comuni[5];
        caricamento(comuni); //vengono caricati i nomi dei 5 comuni.
        int temperature[100];
        inserimentotemperature(temperature,comuni);
        
    }
    
    Il problema che riscontro è che nelle stringhe vengono visualizzati solo 4 caratteri, praticamente nella linea "inserisci la temperatura x del comune x" in output
Devi accedere o registrarti per scrivere nel forum
32 risposte