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

RedGrizzly01

Nuovo Utente
17
1
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
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,448
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
sarebbe una buona idea inizializzazre la somma a ZERO... :look:
 

Eduadie

Utente Attivo
204
24
Come ti hanno già suggerito inizializza la somma a 0, inoltre nei controlli maschi femmina non c'è bisogno di utilizzare i puntatori.
 

RedGrizzly01

Nuovo Utente
17
1
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
Post unito automaticamente:

vi ringrazio entrambi ma inizializzando la somma a zero il risultato e lo stesso:
Cattura.PNG
 
Ultima modifica:

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
  • Mi piace
Reazioni: RedGrizzly01

Eduadie

Utente Attivo
204
24
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.
 

RedGrizzly01

Nuovo Utente
17
1
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
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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().
 

RedGrizzly01

Nuovo Utente
17
1
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
 

Andretti60

Utente Èlite
6,440
5,091
È 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;
Post unito automaticamente:

...
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 :)
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili