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

RedGrizzly01

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

RedGrizzly01

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

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

_Achille

Utente Èlite
3,009
694
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
Windows 10 Pro
  • Mi piace
Reactions: RedGrizzly01

Eduadie

Utente Attivo
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
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,009
694
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
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
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
3,657
2,450
Hardware Utente
È 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 automaticamente unito:

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

Entra

oppure Accedi utilizzando