PROBLEMA problema con l'utilizzo dello struct con i relativi puntatori [linguaggio C].

Pubblicità

RedGrizzly01

Nuovo Utente
Messaggi
17
Reazioni
1
Punteggio
22
codice:
C:
/*TRACCIA: Realizzare un vettore di record che memorizzi e stampi a schermo il nome,il cognome e l'età e il sesso.

determinare l'età media degli alunni e il numero di donne e maschi presenti */


#include<stdio.h>

#include<stdlib.h>

struct table

{

char nome[40];

char cognome[40];

char sesso[1];

int age;

};typedef struct table record; //creo il tipo di variabile RECORD che fa capo alla struttura struct table


int main()

{

int contatoreF=0;

int contatoreM=0;

int alunni;

printf("Inserisci il numero di alunni della classe: ");

scanf("%d",&alunni);

record tabella[alunni]; //creò un array di record.

int somma;

int sommaM;

for(int f=0;f<alunni;f++)

  {

    printf("\ninserisci il nome dell'alunno: ");

    scanf("%s",&tabella[f].nome);

    printf("\ninserisci il cognome dell'alunno: ");

    scanf("%s",&tabella[f].cognome);

    printf("Inserisci il sesso[M o F]: ");

    scanf("%s",&tabella[f].sesso);

    if(*tabella[f].sesso==*"M")

    {

       ++contatoreM;            //faccio contare il numero di persone maschie

    }

    else if(*tabella[f].sesso==*"F")

    {

       ++contatoreF;           //faccio contare il numero di persone femmine

    }

    printf("inserisci l'eta del allunno: ");

    scanf("%d",&tabella[f].age);

    fflush(stdin);

    somma=tabella[f].age+somma;

 

  }

  printf("**SCHEDE RAGAZZI**");

  for(int i=0;i<alunni;i++)

    {

      printf("\n nome:%s,",tabella.nome);

      printf("\n congnome:%s",tabella.cognome);

      printf("\n eta:%d",tabella.age);

      printf("\n sesso:%s",tabella.sesso);

      printf("\n \n");

    }

    printf("\n %d",somma);

    printf("il numero di persone maschie sono:%d \ntre il numero di persone femmine sono:%d",contatoreM,contatoreF);

}



il problema principale si pone quando tento di fare la somma delle varie età degli alunni. come risultato mi viene restituito un numero esageratamente grande: 6990992031. cosa ho sbagliato ? grazie in aticipo e buon lavoro! ovviamente devo implementare alcuni controlli marginali
 
sarebbe una buona idea inizializzazre la somma a ZERO... :look:
 
Come ti hanno già suggerito inizializza la somma a 0, inoltre nei controlli maschi femmina non c'è bisogno di utilizzare i puntatori.
 
Come ti hanno già suggerito inizializza la somma a 0, inoltre nei controlli maschi femmina non c'è bisogno di utilizzare i puntatori.
Ma senza i puntatori mi fa risultare l'espressione falsa. P.s uso code blocks per compilare


Inviato da Redmi Note 4 tramite App ufficiale di Tom\'s Hardware Italia Forum
--- i due messaggi sono stati uniti ---
vi ringrazio entrambi ma inizializzando la somma a zero il risultato e lo stesso:
Cattura.webp
 
Ultima modifica:
C:
/*TRACCIA: Realizzare un vettore di record che memorizzi e stampi a schermo il nome,il cognome e l'età e il sesso.

determinare l'età media degli alunni e il numero di donne e maschi presenti */


#include<stdio.h>

#include<stdlib.h>

struct table

{

char nome[40];

char cognome[40];

char sesso[1];

int age;

};typedef struct table record; //creo il tipo di variabile RECORD che fa capo alla struttura struct table


int main()

{

int contatoreF=0;

int contatoreM=0;

int alunni;

printf("Inserisci il numero di alunni della classe: ");

scanf("%d",&alunni);

record tabella[alunni]; //creò un array di record.

int somma = 0;

int sommaM;

for(int f=0;f<alunni;f++)

  {

    printf("\ninserisci il nome dell'alunno: ");

    scanf("%s",&tabella[f].nome);

    printf("\ninserisci il cognome dell'alunno: ");

    scanf("%s",&tabella[f].cognome);

    printf("Inserisci il sesso[M o F]: ");

    scanf("%s",&tabella[f].sesso);

    if(tabella[f].sesso=="M")

    {

       ++contatoreM;            //faccio contare il numero di persone maschie

    }

    else if(tabella[f].sesso=="F")

    {

       ++contatoreF;           //faccio contare il numero di persone femmine

    }

    printf("inserisci l'eta del allunno: ");

    scanf("%d",&tabella[f].age);

    fflush(stdin);

    somma=tabella[f].age+somma;



  }

  printf("**SCHEDE RAGAZZI**");

  for(int i=0;i<alunni;i++)

    {

      printf("\n nome:%s,",tabella[i].nome);

      printf("\n congnome:%s",tabella[i].cognome);

      printf("\n eta:%d",tabella[i].age);

      printf("\n sesso:%s",tabella[i].sesso);

      printf("\n \n");

    }

    printf("\n %d",somma);

    printf("il numero di persone maschie sono:%d \ntre il numero di persone femmine sono:%d",contatoreM,contatoreF);

}

Così a me funziona. Inoltre tu hai dichiarato sesso array di char di dimensione uno, tanto vale dichiararlo solo char e in questo modo puoi fare il confronto come lo fai tu. Altrimenti diventa stringa e devi usare la strcmp.
 
C:
/*TRACCIA: Realizzare un vettore di record che memorizzi e stampi a schermo il nome,il cognome e l'età e il sesso.

determinare l'età media degli alunni e il numero di donne e maschi presenti */


#include

#include

struct table

{

char nome[40];

char cognome[40];

char sesso[1];

int age;

};typedef struct table record; //creo il tipo di variabile RECORD che fa capo alla struttura struct table


int main()

{

int contatoreF=0;

int contatoreM=0;

int alunni;

printf("Inserisci il numero di alunni della classe: ");

scanf("%d",&alunni);

record tabella[alunni]; //creò un array di record.

int somma = 0;

int sommaM;

for(int f=0;f
{

printf("\ninserisci il nome dell'alunno: ");

scanf("%s",&tabella[f].nome);

printf("\ninserisci il cognome dell'alunno: ");

scanf("%s",&tabella[f].cognome);

printf("Inserisci il sesso[M o F]: ");

scanf("%s",&tabella[f].sesso);

if(tabella[f].sesso=="M")

{

++contatoreM; //faccio contare il numero di persone maschie

}

else if(tabella[f].sesso=="F")

{

++contatoreF; //faccio contare il numero di persone femmine

}

printf("inserisci l'eta del allunno: ");

scanf("%d",&tabella[f].age);

fflush(stdin);

somma=tabella[f].age+somma;



}

printf("**SCHEDE RAGAZZI**");

for(int i=0;i
{

printf("\n nome:%s,",tabella[i].nome);

printf("\n congnome:%s",tabella[i].cognome);

printf("\n eta:%d",tabella[i].age);

printf("\n sesso:%s",tabella[i].sesso);

printf("\n \n");

}

printf("\n %d",somma);

printf("il numero di persone maschie sono:%d \ntre il numero di persone femmine sono:%d",contatoreM,contatoreF);

}

Così a me funziona. Inoltre tu hai dichiarato sesso array di char di dimensione uno, tanto vale dichiararlo solo char e in questo modo puoi fare il confronto come lo fai tu. Altrimenti diventa stringa e devi usare la strcmp.
Intanto grazie ! Che IDE usi ? Io uso codeblocks. Potrebbe esse questo il problema ?

Inviato da Redmi Note 4 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
Intanto grazie ! Che IDE usi ? Io uso codeblocks. Potrebbe esse questo il problema ?

Inviato da Redmi Note 4 tramite App ufficiale di Tom\'s Hardware Italia Forum
L’IDE ha solo il compito di formattare e rendere più leggibile ciò che tu scrivi. Il codice passa poi dal compilatore dove possono risultare bug di diversi generi.
Innanzitutto effettua le operazioni di input tutte insieme e aggiungi poi le varie verifiche. Quindi prima chiedi nome, cognome, anni, sesso e poi incrementi, sommi ecc...
Inoltre usa i come contatore per i cicli che è più normale da vedere.

Quello che sinceramente penso è che venga utilizzato un valore di age ancor prima di essere inizializzato dallo scanf().
 
L’IDE ha solo il compito di formattare e rendere più leggibile ciò che tu scrivi. Il codice passa poi dal compilatore dove possono risultare bug di diversi generi.
Innanzitutto effettua le operazioni di input tutte insieme e aggiungi poi le varie verifiche. Quindi prima chiedi nome, cognome, anni, sesso e poi incrementi, sommi ecc...
Inoltre usa i come contatore per i cicli che è più normale da vedere.

Quello che sinceramente penso è che venga utilizzato un valore di age ancor prima di essere inizializzato dallo scanf().
Le cose sul compilatore le sapevo. Comunque domattina provo.

Inviato da Redmi Note 4 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
È differente solo per l'aggiunta di una variabile per giunta dichiarata per errore.

Veramente sono diversi.
Nel codice che hai postato hai la seguente istruzione, che e' corretta (lo sbaglio e' che non inizializzavi somma a zero)
Codice:
    somma = tabella[f].age + somma;
mentre invece nello screenshot si nota il simbolo di indirizzo prima di 'tabella'. Guarda bene.

Inoltre nel tuo codice originale c'e' un serio errore nella stampa dei dati, usi "tabella" come variabile invece che come un vettore (come nella dichiarazione).

Un altro errore, meno serio, e' che non controlli che il sesso sia M o F. Cosa succede se digito G? A te scoprirlo :)

Per completezza, potresti usare l'autoincremento
Codice:
    somma += tabella[f].age;
--- i due messaggi sono stati uniti ---
...
Inoltre usa i come contatore per i cicli che è più normale da vedere.
Pensa invece che io non utilizzo mai la variabile i , poiche' sono miope a volte faccio fatica a distinguerla. Preferisco usare la j o la k. Quindi per me va bene tutto :)
 
Pubblicità
Pubblicità
Indietro
Top