[C] corso di laurea RISOLTO, ma ancora una domanda

di il
5 risposte

[C] corso di laurea RISOLTO, ma ancora una domanda

Ciao a tutti sono alle prese con un'altro quesito.

Il programma da svolgere è il seguente:

Dato un vettore di corsi (ad esempio di laurea) debbo creare una funzione con determinate funzionalità(non spiego attualmente cosa deve fare questa funzione dato che il problema mi si genera prima)

Qua sotto metto il codice completo, dove dato un vettore di tipo struct, immetto da utente i dati.

In sostanza vi è una struttura informazioni per i corsi e una struttura informazioni per le lezioni di ciascun corso


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

#define X 50

void crea_corso(struct corso V[]);

struct lezione * lista_lezioni(void);

struct lezione{   //struttura lezioni, per semplicità sono dichiarati tutti int
int giorno;
int ora;
int aula;
struct lezione *next;

};


struct corso{
char nome[X];
struct lezione *ptr_lezione;

};



void main()

{

struct corso V[2]; //definisco un vettore di 3 elementi
int i;

for(i=0;i<=2;i++)
    V[i].ptr_lezione=NULL; // inizializzo il puntatore alla lista delle lezioni di ciascun corso


    printf("CORSI PREVISTI\n");

    crea_corso(V);




}



void crea_corso(struct corso V[]){

int i;

for(i=0;i<=2;i++){
   printf("Corso [%d]:   ",i+1);
   scanf("%s",V[i].nome);
   V[i].ptr_lezione=lista_lezioni();  //in questa maniera ciascun puntatore alla testa dellalista di esami di ogni corso viene aggiornato.

}
}


struct lezione* lista_lezioni(void){  // in questa maniera ritorna il puntatore alla lista lezioni

struct lezione *a,*b;
int num_lezioni,i;
printf("Quante lezioni sono previste per il corso?\n");
scanf("%d",&num_lezioni);

if(num_lezioni==0)
    a=NULL;
else {
    a=(struct lezione *)malloc(sizeof(struct lezione));
    printf("La prima lezione si svolgerà con i seguenti ");
    printf("Aula:");
    scanf("%d",&a.aula);
    printf("Giorno: ");
    scanf("%d",&a.data);
    printf("Ora:   ");
    scanf("%d",&a.ora);
    b=a;

    //creazione elementi successivi
    for(i=2;i<=num_lezioni;i++){

        b->next=(struct lezione *)malloc(sizeof(struct lezione));
        b=b->next;

        printf("Lezione[%d]",i);

        printf("Aula:");
        scanf("&d",&b.aula);
        printf("Giorno: ");
        scanf("%d",&b.data);
        printf("Ora:   ");
        scanf("%d",&b.ora);

    }

    b->next=NULL;
    }
    return a;



}


In pratica prima di inserire altro codice per esempio per stampare a video ciò che l'utente ha inserito, provo a far girare il codice finora inserito, per mio scrupolo personale.

Accade questo:

mi genera ad esempio errore su ciò

void crea_corso(struct corso V[]);
dicendomi array type has incomplete element type.

Perchè???


Il passaggio dei parametri e la dichiarazione7definizioni delle funzioni a me sembra corretta, ho inoltre provato a passare il tutto come se fosse un puntatore, che da teoria è cosa lecita



void crea_corso(struct corso *);

.......

......

void main(){
....
 crea_corso(V);
.....
}


void crea_corso(struct corso *){
.....

}

ma mi genera sempre errore, come mai?
Cosa non riesco a capire?

Inoltre mi genera errore anche qua:

......
 a=(struct lezione *)malloc(sizeof(struct lezione));
    printf("La prima lezione si svolgerà con i seguenti ");
    printf("Aula:");
    scanf("%d",&a.aula);
    printf("Giorno: ");
    scanf("%d",&a.data);
    printf("Ora:   ");
    scanf("%d",&a.ora);
......



DICENDOMI

error:request for member 'data' in something not a structure or union


questo errore lo genera sia per il membro data, giorno, ora, sia per il primo elemento della lista sia per i successivi.

Non riesco proprio a capire il perchè di ciò.

Chiedo pertanto un aiuto per capire tutto ciò, grazie!

5 Risposte

  • Re: [C] corso di laurea RISOLTO, ma ancora una domanda

    Ciao,
    ho fatto qualche correzione al codice (te lo posto).
    I punti principali sono:
    - dichiaravi un array con [2] e ti aspettavi che ci stessero 3 elementi. Se vuoi che l'array abbia capienza 3 allora devi mettere [3]
    - c'era una variabile con nome sbagliato: la dichiaravi "giorno" e poi la chiamavi "data"
    - nel prototipo di una funzione mettevi struct corso PRIMA di aver dichiarato cosa fosse struct corso
    - se vuoi accedere ai campi di una struttura e utilizzi un puntatore, allora devi mettere la FRECCIA (cioè ->) e non il punto.

    Ora il codice compila, comunque verificane il funzionamento.
    
    
    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    
    #define X 50
    
    struct lezione    //struttura lezioni, per semplicità sono dichiarati tutti int
    {
        int giorno;
        int ora;
        int aula;
        struct lezione * next;
    
    };
    
    
    struct corso
    {
        char nome[X];
        struct lezione * ptr_lezione;
    
    };
    
    void crea_corso(struct corso V[]);
    struct lezione * lista_lezioni(void);
    
    
    
    int main(int argc, char * argv[])
    {
        struct corso V[3]; //definisco un vettore di 3 elementi
        /* SE CI METTI 2 ALLORA GLI ELEMENTI SONO 2, NON 3!! */
        int i;
    
        for(i=0; i<=2; i++)
            V[i].ptr_lezione=NULL; // inizializzo il puntatore alla lista delle lezioni di ciascun corso
    
    
        printf("CORSI PREVISTI\n");
    
        crea_corso(V);
    
        return 0;
    }
    
    
    
    void crea_corso(struct corso V[])
    {
        int i;
        for(i=0; i<=2; i++)
        {
            printf("Corso [%d]:   ",i+1);
            scanf("%s",V[i].nome);
            V[i].ptr_lezione=lista_lezioni();  //in questa maniera ciascun puntatore alla testa dellalista di esami di ogni corso viene aggiornato.
    
        }
    }
    
    
    struct lezione* lista_lezioni(void)   // in questa maniera ritorna il puntatore alla lista lezioni
    {
        struct lezione *a,*b;
        int num_lezioni,i;
        printf("Quante lezioni sono previste per il corso?\n");
        scanf("%d",&num_lezioni);
    
        if(num_lezioni==0)
            a=NULL;
        else
        {
            a=(struct lezione *)malloc(sizeof(struct lezione));
            printf("La prima lezione si svolgerà con i seguenti ");
            printf("Aula:");
            scanf("%d",&a->aula);
            printf("Giorno: ");
            scanf("%d",&a->giorno);
            printf("Ora:   ");
            scanf("%d",&a->ora);
            b=a;
    
            //creazione elementi successivi
            for(i=2; i<=num_lezioni; i++)
            {
    
                b->next=(struct lezione *)malloc(sizeof(struct lezione));
                b=b->next;
    
                printf("Lezione[%d]",i);
    
                printf("Aula:");
                scanf("%d",&b->aula);
                printf("Giorno: ");
                scanf("%d",&b->giorno);
                printf("Ora:   ");
                scanf("%d",&b->ora);
    
            }
    
            b->next=NULL;
        }
        return a;
    
    
    
    }
    
  • Re: [C] corso di laurea RISOLTO, ma ancora una domanda

    Intanto grazie mille, il codice per il momento gira, appena lo completo, lo posto sul forum in modo tale che sia di riferimento anche ad altri.

    - dichiaravi un array con [2] e ti aspettavi che ci stessero 3 elementi. Se vuoi che l'array abbia capienza 3 allora devi mettere [3]
    Questo non mi torna tantissimo.
    Nel senso che un vettore non ha bisogno di un elemento aggiuntivo come per le stringa dato che l'elemento finale è "\0"
    Quindi se dichiaro un vettore di 3 elementi ad esempio V[2], se conto l'elemento 0 cioè V[0] e poi V[1] e poi V[2], non ottengo tre elementi? Tutti dipende dal punto di riferimento. Quindi è questo che non mi torna tanto.

    Per il resto è giustissimo, mia incuria forse dettata dalla poca pratica.

    Grazie ancora, e spero di migliorare ancora.
  • Re: [C] corso di laurea RISOLTO, ma ancora una domanda

    Ciao,
    attenzione: se dichiari un vettore con
    int v[N];
    quel vettore conterrà N elementi, numerati da 0 a N-1.
    Quindi se vuoi un vettore di tre elementi lo devi dichiarare come
    int v[3];
    e i suoi elementi saranno numerati da 0 a 2. Infatti se vuoi scorrere il l'array con un ciclo for, la tua condizione di permanenza nel ciclo qual è? i < 3 giusto? Quindi questo ti fa capire che gli elementi sono numerati fino al 2.

    Per altri dubbi siamo qui.
  • Re: [C] corso di laurea RISOLTO, ma ancora una domanda

    Corretto, chissà perchè mi ero fissato sull'indice di scorrimento e pertanto non tenevp conto della dichiarazione del vettore fatta a priori con un 'N' fissato.

    Bene, direi, più che soddisfatto, Grazie Mille.

    Alla prossima, e buon fine settimana a tutti!

  • Re: [C] corso di laurea RISOLTO, ma ancora una domanda

    A rieccomi

    Posto il codice funzionante, apparte, credo una piccola imprecisione, che al momento non riesco a visualizzare.

    In pratica quando mando in stampa cioè in questo spezzone di codice:
    
    ....
     printf("STAMPA PROGRAMMI DEI CORSI\n\n\n");
        for(i=0;i<2;i++){
            printf("Il corso %s presenta le seguenti lezioni: ",V[i].nome);
                   j=0;
                   while(V[i].ptr_lezione!=NULL){
    
                    printf("lezione[%d] prevista il giorno %d nell'aula %d alle ore %d\n\n",j+1,(V[i].ptr_lezione)->data,(V[i].ptr_lezione)->aula,(V[i].ptr_lezione)->ora);
                    V[i].ptr_lezione=(V[i].ptr_lezione)->next;
                    j++;
                   }
    .....
    
    A video vedo tutto corretto, tranne la parte dell'aula che me lo stampa a video come indirizzo(almeno credo) e non come valore assegnato dall'utente alla variabile in questione.

    Perchè, dove sbaglio?


    Qua metto il codice completo
    
    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    
    #define X 50
    
    
    struct lezione{
    int data;
    int ora;
    int aula;
    struct lezione *next;
    
    };
    
    
    struct corso{
    char nome[X];
    struct lezione *ptr_lezione;
    
    };
    
    void crea_corso(struct corso V[]);
    
    struct lezione * lista_lezioni(void);
    
    
    void main()
    
    {
    
    struct corso V[2]; //definisco un vettore di 3 elementi
    int i,j;
    
    for(i=0;i<2;i++)
        V[i].ptr_lezione=NULL; // inizializzo il puntatore alla lista delle lezioni di ciascun corso
    
    
        printf("CORSI PREVISTI\n");
    
        crea_corso(V);
    
        printf("STAMPA PROGRAMMI DEI CORSI\n\n\n");
        for(i=0;i<2;i++){
            printf("Il corso %s presenta le seguenti lezioni: ",V[i].nome);
                   j=0;
                   while(V[i].ptr_lezione!=NULL){
    
                    printf("lezione[%d] prevista il giorno %d nell'aula %d alle ore %d\n\n",j+1,(V[i].ptr_lezione)->data,(V[i].ptr_lezione)->aula,(V[i].ptr_lezione)->ora);
                    V[i].ptr_lezione=(V[i].ptr_lezione)->next;
                    j++;
                   }
    
    
    
        }
    
    
    
    
    }
    
    
    
    P.S. nei cicli di iterazione ho messo il comando fflush(stdin) altrimenti al nuovo ciclo, diciamo che mi saltavo una 'riga' con conseguente omissione di un dato.

    La mia domanda è, dove dovrei inserire il comando fflush(stdin) in un ciclo di iterazione.
    Io ho semplicimente provato per tentativi a far girare il codice, e mano a mano impostavo i miglioramenti, ma invece di andare a tentativi, c'è una spiegazione precisa del perchè viene messo tale comando e dove va inserito?
Devi accedere o registrarti per scrivere nel forum
5 risposte