Mancata stampa in programma c [RISOLTO]

di il
2 risposte

Mancata stampa in programma c [RISOLTO]

Buongiorno sto completando un esercizio di programmazione.

Ho un vettore di struct che rappresenta il mio cdl.

poi ho una struct che rappresenta il libretto dello studente con nome cognome matricola e la lista degli esami svolti

altra struct per rappresentare l'esame dove l'esame stesso è rappresentato da un indice, che dovrebbe fare le veci del nome esame e da un voto.

stavo facendo alcune prove e quando vado a stampare a video mi esce dal programma. nel dettaglio mi stampa solo ultimo inserito, sia per ciò che riguarda nome cognome e matricola, sia per quanto riguarda voto ed indice dell'esame
#include <stdio.h>
#include <stdlib.h>

/*le strutture sono quelli codificate sotto nel senso che sia un cdl codificato su un vettore dove ogni elemento mi da nome esame
e crediti. Poi abbiamo il libretto dello studente sul quale sono riportate informazione quali : nome, cognome, matricola ed una lista
di esami svolti. nella lista degli esami , ogni esame è rappresntato da un voto ed un indice che identifica l'esame stesso
nella lista degli esami(in questo caso posso o mettere nome o riferimento numerico, vediamo nello sviluppo, in genere è meglio rapprsentare
                        in intero) */

struct esame{
int riferimento;  //char nome_   esame[10];
int cfu;
};
struct list{
int riferimento;
int voto;
struct list *next;
};
struct lib_studente{
char nome[10];
char cognome[10];
int matricola;
struct list *ptr_esami;
struct lib_studente *next;
};
void ins_stud(struct lib_studente **);
void ins_esami(struct list**);
void stampa(struct lib_studente *);
int main()
{
    struct esame cdl[5]; // definisco il cdl con un vettore di 5 esami.

    struct lib_studente *ptr;  // con questa dichiarazione posso creare un array dinamico,
                               //nel senso che posso stabilire in corso d'opera quanti studenti sono iscritti al cdl
    ptr=NULL; // inizializzo il puntatore


    int i,iscritti;

    printf("Definiamo il corso di laurea con esame e cfu\n\n");

    for(i=0;i<5;i++){
            printf("inserisci riferimento del %d esame   ",i);
            scanf("%d",&(cdl[i]).riferimento);
            printf("inserisci cfu del %d esame   ",i);
            scanf("%d",&(cdl[i]).cfu);
           }

    for(i=0;i<5;i++){
        printf("esame con riferimento  %d  ha un credito pari a %d  ",cdl[i].riferimento,cdl[i].cfu);
        printf("\n\n");

          }

    printf("Inseriamo gli studenti\n\n");
    printf("Quanti iscritti?\n");
    printf("Gli studenti iscritti, sono:   ");
    scanf("%d",&iscritti);                        //definisco il numero degli iscritti al cdl
    for(i=0;i<iscritti;i++){

           ins_stud(&ptr);
        }

        printf("stampiamo ora gli studenti iscritti al cdl\n\n");
        stampa(ptr);
    return 0;
}

void ins_stud(struct lib_studente **ptrptr){
    struct lib_studente *tmp;
    int num_esami,i;
    tmp=*ptrptr;
    *ptrptr=(struct lib_studente*)malloc(sizeof(struct lib_studente));
    printf("\n\ninseriamo i dati degli studenti che abbiamo deciso\n\n");
    scanf("%s",(*ptrptr)->nome);
    scanf("%s",(*ptrptr)->cognome);
    scanf("%d",&(*ptrptr)->matricola);
    (*ptrptr)->next=tmp;
    printf("Quanti esami ha fatto lo studente con matr:  %d  ",(*ptrptr)->matricola);
    scanf("%d",&num_esami);
    for(i=0;i<num_esami;i++)
        ins_esami(&((*ptrptr)->ptr_esami));

}
void ins_esami(struct list** ptrptr){
struct list *tmp;
tmp=*ptrptr;
*ptrptr=(struct list *)malloc(sizeof(struct list));
printf("inseriamo gli esami dello studente\n");
scanf("%d",&(*ptrptr)->riferimento);
scanf("%d",&(*ptrptr)->voto);
(*ptrptr)->next=tmp;
}

void stampa(struct lib_studente *ptr){

    while(ptr!=NULL){
        printf("nome:  %s     \n",ptr->nome);
        printf("cognome:  %s     \n",ptr->cognome);
        printf("matricola:  %d     \n",ptr->matricola);
        while(ptr->ptr_esami!=NULL){
            printf("riferimento esame: %d ",ptr->ptr_esami->riferimento);
            printf("voto esame: %d ",ptr->ptr_esami->voto);
            ptr->ptr_esami=ptr->ptr_esami->next;
                                 }
        ptr=ptr->next;

          }



}
questo qua sopra è il codice completo.

Ha iniziato a generare questo errore da quando ho inserito la stampa sezione degli esami per studente iscritto:

quindi in questa funzione
void stampa(struct lib_studente *ptr){

    while(ptr!=NULL){
        printf("nome:  %s     \n",ptr->nome);
        printf("cognome:  %s     \n",ptr->cognome);
        printf("matricola:  %d     \n",ptr->matricola);
        while(ptr->ptr_esami!=NULL){
            printf("riferimento esame: %d ",ptr->ptr_esami->riferimento);
            printf("voto esame: %d ",ptr->ptr_esami->voto);
            ptr->ptr_esami=ptr->ptr_esami->next;
                                 }
        ptr=ptr->next;

          }
ho aggiunto questa parte di codice
while(ptr->ptr_esami!=NULL){
            printf("riferimento esame: %d ",ptr->ptr_esami->riferimento);
            printf("voto esame: %d ",ptr->ptr_esami->voto);
            ptr->ptr_esami=ptr->ptr_esami->next;
                                 }
e da qui in poi mi genera errore.


Cosa potrebbe essere?

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte