Problemi ignoti

di il
16 risposte

Problemi ignoti

Ciao a tutti,
sono studente di Ingegneria e mi sto preparando per l'esame di programmazione in C.
diciamo che ho qualche problema con il funzionamento dei programmi che scrivo che fanno uso di puntatori e vettori.

in particolare ecco il programma in questione:

1) Un programma in linguaggio C deve gestire i dati degli studenti di un corso di
laurea. Ogni studente è rappresentato da nome (max 20 caratteri), cognome (max
30 caratteri), matricola (numero intero) e dai voti ricevuti negli esami sostenuti. Il
numero di esami totali che devono essere sostenuti prima della laurea è dato dalla
costante NUMES definita mediante la direttiva #define. Per rappresentare un
voto si utilizza il tipo di dati struct voto, definito come segue:

struct voto{
int cod_esame; // codice esame, strettamente positivo
char voto; // voto conseguito
};

Il codice esame identifica univocamente un corso (es. Informatica e
Programmazione avrà un codice diverso da Chimica).
Per rappresentare l’insieme di studenti di un corso di laurea in un anno
accademico, si utilizza il tipo di dato struct annata, che memorizza l’anno di
corso (es. 2013) e l’insieme degli studenti (fino ad un massimo MAXST, costante
definita mediante la direttiva #define.)

QUESITO 1: si scriva la definizione dei tipi di dato struct studente e struct
annata corrispondenti alla descrizione sopra.

QUESITO 2: si scriva la funzione
void instudente(struct studente *s);
che acquisice da tastiera i dati di uno studente AD ECCEZIONE dei voti ricevuti
negli esami.

QUESITO 3: si scriva la funzione
void inAnnata(struct annata *s);
che acquisice da tastiera i dati degli studenti di una annata (senza i voti ricevuti
negli esami) utilizzando la funzione definita al punto precedente.

QUESITO 4: si sviluppi un programma main che, utilizzando opportune variabili,
acquisisce da tastiera i dati di una annata (senza gli esami sostenuti dagli
studenti).
Successivamente, il programma deve acquisire da tastiera una serie di triple
(matricola, codice, voto) ciascuna delle quali indica che lo studente avente
matricola matricola ha ottenuto la valutazione positiva pari a voto nell’esame
avente codice codice (codice=0 indica la fine della serie): il programma deve
memorizzare i voti ottenuti dagli studenti nella struttura dati di tipo struct
annata. [24]

per il primo punto nessun problema, pensavo così anche per il secondo, dev c++ compila correttamente.
attivandosi la funzione "instudente" va tutto bene fino a quando mi chiede di inserire il numero voti che il programma si blocca.

ecco il testo:

#include <stdio.h>
#include <stdlib.h>

struct voto{
int cod_esame;
char voto;
};

struct studente{
char nome[20];
char cognome[30];
int matricola;
int numerovoti;
int voto[30]; //in realtà definito da una direttiva #define
};

struct annata{
int anno;
struct studente studenti [10]; // in realtà definito da una direttiva #define
};

void instudente(struct studente *s);
void inAnnata(struct annata *s);


int main(int argc, char *argv[])
{
struct studente a;
instudente(&a);



system("PAUSE");
return 0;
}

void instudente (struct studente *s){
printf("inserisci il nome dello studente\n");
scanf("%s",(*s).nome);
printf("inserisci il cognome dello studente\n");
scanf("%s",(*s).cognome);
printf("inserisci il numero di matricola\n");
scanf("%d",(*s).matricola);
printf("inserisci il numero di voti\n");
scanf("%d",(*s).numerovoti);
// scanf("%d",&s->numerovoti); analogo
}

da cosa può essere dato il problema?

più che altro che non penso di aver sbagliato, ho è il compilatore che è matto (lo dubito) o c'è qualche errore...

mi sapreste aiutare?

grazie

16 Risposte

  • Re: Problemi ignoti

    1. non usare dev c++ http://www.iprogrammatori.it/forum-programmazione/cplusplus/dev-ciofeca-t19487.html
    2. non usare scanf() ma usa fgets() appoggiandoti ad un buffer temporaneo
    3. (*s).matricola lo puoi scrivere come s->matricola
  • Re: Problemi ignoti

    Al massimo devi usare la scanf() pssandogli un puntatore
     
    
    scanf("%s",(*s).cognome);
       
    scanf("%d",&s->matricola);
        
    
  • Re: Problemi ignoti

    Più che altro il mio problema nasce nella funzione nell'ultima parte:

    printf("inserisci il numero di voti\n");
    scanf("%d",(*s).numerovoti);
    // scanf("%d",&s->numerovoti); analogo
    }

    tutti gli altri passaggi di puntatore funzionano, quello di numerovoti no...

    ora provo a istallare l'altro programma e vedere se con quello funziona...
  • Re: Problemi ignoti

    Analogo??? cioè?
  • Re: Problemi ignoti

    Quell'analogo voleva dire che aveva lo stesso significato della riga sopra:

    scanf("%d",(*s).numerovoti);
    // scanf("%d",&s->numerovoti);

    però con il nuovo programma istallato e con il tuo suggerimento di mettere &s->matricola ha funzionato, ora va tutto liscio come l'olio.

    più che altro parlando delle due righe in rosso, non hanno lo stesso significato?
    a me quando spiegava il professore mi è parso che avesse detto che erano la medesima cosa...
  • Re: Problemi ignoti

    (*s).numerovoti indica l'elemento
    s->numerovoti indica l'elemento, perchè la "s->" e' analoga a "(*s)."

    &variabile ritorna la zona di memoria della variabile "a", ovvero un puntatore
    --------quindi---------
    &s->numerovoti e' il puntatore di s->numerovoti
    ----come-----
    &(*s).numerovoti e' il puntatore di (*s).numerovoti

    che sono lo stesso elemento



    ps: ovviamente tutto questo quando "s" e' puntatore a struct, come in questo caso, altrimenti usi il "." normalmente
  • Re: Problemi ignoti

    ....

    perchè allora il problema non lo dà anche su:

    void instudente (struct studente *s){
    printf("inserisci il nome dello studente\n");
    scanf("%s",(*s).nome);
    printf("inserisci il cognome dello studente\n");
    scanf("%s",(*s).cognome);


    P.S: ho l'impressione che l'informatica non si conformi alla mia persona...
  • Re: Problemi ignoti

    Perchè "nome" e "cognome" sono puntatori( un'array e' paragonabile a un puntatore) mentre le altre variabili non lo sono( e quindi devi ricavare la loro zona di memoria tramite '&').
    (char)  a[3]
    equivale a
     *(a+3)
    (ovvero "zona di memoria del primo elemento" + "numero dell'elemento" * "dimensione di un'elemento") dato che un'array e' un'insieme di zone di memoria adiacenti, e la prima e' 'a')

    Questo vale anche senza struttura.
  • Re: Problemi ignoti

    Non so se la programmazione sia la tua strada, ma sicuramente all'inizio non e' sempre facile da capire.
    Con il tempo fidati che tutti questi ragionamenti ti verranno automatici
  • Re: Problemi ignoti

    Speriamo che sia così, ora con il tuo ultimo messaggio mi si è chiarita la cosa...

    ora però è saltato fuori un altro problema...
    code block non compila più l'errore:

    "cao - Debug": The compiler's setup (GNU GCC Compiler) is invalid, so Code::Blocks cannot find/run the compiler.
    Probably the toolchain path within the compiler options is not setup correctly?! (Do you have a compiler installed?)
    Goto "Settings->Compiler...->Global compiler settings->GNU GCC Compiler->Toolchain executables" and fix the compiler's setup.
    Skipping...
    Nothing to be done (all items are up-to-date).
  • Re: Problemi ignoti

    Quello deve essere un bug in C::B. non credo centri con il codice. Hai modificato qualcosa?

    Con questo nn posso aiutarti, al massimo prova a smanettare finchè non funziona o reinstallalo
  • Re: Problemi ignoti

    Mi sa che è dovuto al fatto che ho disistallato dev C++
    ed il programma non ha più un compilatore con cui compilare...

    comunque un bel ripristino del sistema e poi ri-istallo code blocks...

    sicuramente tornerà a funzionare.

    grazie mille per le risposte!
  • Re: Problemi ignoti

    Mi riallaccio allo stesso argomento ma con un esercizio diverso:

    #include <stdio.h>
    #include <stdlib.h>

    enum genere{f,m};

    struct atleta{
    char cognome[30];
    enum genere sesso;
    int anno;
    };

    struct nazione{
    char nome[30];
    int numatleti;
    struct atleta atleti[40];
    int ori;
    };

    void inatleta(struct atleta *a);

    int main()
    {
    struct atleta b;
    inatleta(&b);

    printf("%s\n",b.cognome);
    //printf("%d",b.sesso);
    printf("%d\n",b.anno);
    return 0;
    }

    void inatleta(struct atleta *a){

    printf("inserisci il cognome dell'atleta\n");
    scanf("%s",(*a).cognome);
    printf("inserisci il sesso dell'atleta, f se femmina, m se maschio\n");
    scanf("%d",&a.sesso);
    printf("inserisci l'anno di nascita dell'atleta\n");
    scanf("%d",&(*a).anno);
    }


    Con questo programmino vorrei assegnare ad un atleta il cognome, il sesso e l'anno di nascita.
    Il mio problema nasce quando devo assegnare tramite la funzione il sesso.
    Code Blocks compila il programma ma durante l'esecuzione dopo aver inserito il sesso salta l'inserimento dell'anno di nascita...
    Il problema è proprio sull'inserimento dell'enumerazione sesso...
    mi sapreste spiegare come faccio ad assegnare attraverso una funzione con passaggio di puntatore un'enumerazione? (ho sottolineato dove è il problema...)

    grazie
  • Re: Problemi ignoti

    Una enumerazione è comunque rappresentata da numeri interi (anche per questo usi %d nella scanf).
    Quindi non puoi inserire come dato f o m (li puoi usare solo nel codice).

    Dovrai inserire solamente 0 oppure 1 per i due valori.

    P.S. Usa un altro thread per un altro problema con un altro esercizio ...
Devi accedere o registrarti per scrivere nel forum
16 risposte