Problema con la struct

di il
25 risposte

Problema con la struct

Salve, ho un problema e vorrei sapere come affrontarlo.
Nel seguente codice:
Devo implementare un archivio di utenti (nome...ecc.), ogni utente deve poter inserire un massaggio( devo usare una stringa e non posso utilizzare fopen/fclose…).
Come noterete nello switch devo anche poter dare la possibilità ad ogni utente di poter visualizzare tutti i messaggi di un utente e di eliminare un massaggio.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 120
#define LEN 100

typedef struct {    
    char nome[MAX];
    char cognome[MAX];
    char sesso[MAX];
    int giorno;
    char mese[MAX];
    int anno;
    } Utente;


typedef struct {
    Utente elementi[LEN];
    int num_utenti;
    }Lista ;

typedef struct {
    char autore[MAX];
    char testo[MAX];
    int mi_piace;
    char destinatario[MAX];
} Messaggio;


int menu();   
Lista Inserimento_Utente ();
void Stampa_Elenco (Lista utent);
Messaggio Inserimento_Messaggio (Lista utent);

int main()
{
    int scelta;
    Lista L;
    while (scelta=menu()){ // Dopo che l'utente fa un'operazione questo permette di far comparire di nuovo il menu
          switch(scelta){
              case 1:
                  system ("CLS");
                  printf("***INSERIMENTO UTENTE***\n\n");
                  L=Inserimento_Utente();
                  printf("\n");
                  Stampa_Elenco(L);
                  system ("PAUSE");
                 break;
              case 2:
                  system ("CLS");
                  printf("***INSERIMENTO MESSAGGIO***\n\n");
                  system ("PAUSE");
                 break;
              case 3:
                  system ("CLS");
                  printf("***VISUALIZZAZIONE MESSAGGIO***\n\n");
                  system ("PAUSE");
                 break;
              case 4:
                  system ("CLS");
                  printf("***ELIMINA MESSAGGIO***\n\n");
                  system ("PAUSE");
                 break;
              case 0:  return 0;
           }
        }
    return 0;
}







int menu(){  //Funzione per il menu
     int scelta;
     printf("***GESTIONE UTENTE***\n");
     printf("[1] Inserisci Utente\n");
     printf("[2] Inserisci Messaggio\n");
     printf("[3] Visualizza Tutti i Messaggi  Utente\n");
     printf("[4] Elimina Messaggio \n");
     printf("[0] Esci\n\n");
     printf(" Scelta: ");
     scanf("%d",&scelta);

     while (scelta<0 || scelta>4){    // controllo scelta
        printf("Scelta non valida\n");
        printf(" Scelta: ");
        scanf("%d",&scelta);
        return scelta;//Rifa l'operazione della scelta
        }
        return scelta;
        system ("PAUSE"); 

}



Lista Inserimento_Utente(){
      Lista utent;
      int i;
      printf("Quanti Utenti vuoi inserire?  ");
      scanf("%d",& utent.num_utenti);
      fflush(stdin); 
      for(i=0;i<utent.num_utenti;i++){
        printf("Inserisci Nome ");
        gets(utent.elementi[i].nome);
        printf("Inserisci Cognome ");
        gets(utent.elementi[i].cognome);
        printf("Inserisci Sesso ");
        gets(utent.elementi[i].sesso);
        printf("Inserisci Giorno ");
        scanf("%d",& utent.elementi[i].giorno);
        fflush(stdin);
        printf("Inserisci Mese ");
        gets(utent.elementi[i].mese);
        printf("Inserisci Anno ");
        scanf("%d",& utent.elementi[i].anno);
        fflush(stdin);
      }
      return utent;
}
void Stampa_Elenco (Lista utent){
    int i;
    for (i=0;i<utent.num_utenti;i++){
        printf("Utente n.%d\n",i+1); //Altrimenti stampa Utente n.0 invece di n.1
        printf("Nome %s\n",utent.elementi[i].nome);
        printf("Cognome %s\n",utent.elementi[i].cognome);
        printf("Sesso %s\n",utent.elementi[i].sesso);
        printf("Giorno %d\n",utent.elementi[i].giorno);
        printf("Mese %s\n",utent.elementi[i].mese);
        printf("Anno %d\n\n",utent.elementi[i].anno);  // Doppio \n\n per stampa ordinata di più utenti
    }
}


Messaggio Inserimento_Messaggio (Lista utent){
    int i;
    int esito;
    printf("Vuoi inserire un messaggio? Digitare 1 per affermazione/ 0 per negazione \n");
    scanf("%d",&esito);
    if(esito==1){
        printf("inserisci messaggio\n");
    }


}


Sono bloccato al case 2 dello switch , vorrei implementare la funzione: Messaggio Inserimento_Messaggio (Lista utent).
Ho messo all'interno Lista utent per poter interagire con la lista utenti che sono stati inseriti.

Detto questo vorrei sapere come devo procedere per poter dare l'opportunità a ogni utente di poter inserire un messaggio, quindi suppongo che dovrei interagire sia con la struct messaggio che con la struct utente, purtroppo non ho trovato esempi simili e quindi non saprei come procedere.
Ci tengo a dire che il programma non è allo stato ottimale, però richiedo l'assistenza per il case 2.

Grazie a chi mi aiuterà e spero di aver esposto il problema nel miglior modo possibile. Attendo risposta.

25 Risposte

  • Re: Problema con la struct

    Ma cosa dovrebbe fare il tuo programma?

    A prima vista, mi sa che dovresti usare delle liste collegate e non degli array.
  • Re: Problema con la struct

    Devo fare un algoritmo per la ricerca di un post (tipo Facebook), dove ho un archivio di utenti, ogni utente ha un identificativo (con i campi della struct Utente) e ogni utente ha la possibilità di scrivere messaggi sulla propria pagina e sulle pagine degli altri utenti, ogni messaggio deve avere i campi della struct Messaggio e infine l'utente ha la possibilità di: - inserire un nuovo post, - ricercare e visualizzare tutti i post di un utente, - eliminare un post. Fine.

    Io ho iniziato a implementarlo cosi, perché ho anche visto che si poteva fare anche creando un puntatore a FILE…. ma nel corso non lo abbiamo fatto.
  • Re: Problema con la struct

    E le pagine degli utenti?
  • Re: Problema con la struct

    Ci ho fatto caso anche io a questa cosa, però nel corso che ho fatto non ci stavano esercizi simili, quindi ho modificato la traccia reale pensando a una Lista, inserisco utenti all'interno e interagendo con la lista permetto di inserire un messaggio, ma se mi parli di pagine di inserire pagine degli utenti non so nemmeno da dove partire perché nelle slide del corso non ci stava niente che spiegava qualcosa di simile a questo. Per questo lo modifico perché il mio obbiettivo primario è fare il programma che mi permette di fare quelle operazioni corrette, poi in seguito se il tempo lo permette vorrei vedere se riesco ad ottimizzarlo.
  • Re: Problema con la struct

    Non ho capito. Se devi inserire un tuo messaggio nella "tua" pagina o nella "pagina di un altro utente", cosa fai effettivamente?
  • Re: Problema con la struct

    Salve, ho aggiunto la funzione per l'inserimento del messaggio e adesso il codice si presenta cosi:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 120
    #define LEN 100
    
    typedef struct { // struct per inserimento utente
        char nome[MAX];
        char cognome[MAX];
        char sesso[MAX];
        int giorno;
        char mese[MAX];
        int anno;
        } Utente;
    
        typedef struct {
        char autore[MAX];
        char testo[MAX];
        int mi_piace;
        char destinatario[MAX];
    } Messaggio;
    
    
    typedef struct {
        Utente elementi[LEN];
        Messaggio elemento[LEN];
        int num_utenti;
        }Lista ;
    
    
    int menu();    //Scelta per l'utente (funcion)
    Lista Inserimento_Utente ();
    void Stampa_Elenco (Lista utent);
    Messaggio Inserimento_Messaggio (Lista utent);
    
    int main()
    {
        int scelta;
        Lista L;
        while (scelta=menu()){ // Dopo che l'utente fa un'operazione questo permette di far comparire di nuovo il menu
              switch(scelta){
                  case 1:
                      system ("CLS");
                      printf("***INSERIMENTO UTENTE***\n\n");
                      L=Inserimento_Utente();
                      printf("\n");
                      Stampa_Elenco(L);
                      system ("PAUSE");
                     break;
                  case 2:
                      system ("CLS");
                      printf("***INSERIMENTO MESSAGGIO***\n\n");
                      Messaggio Inserimento_Messaggio (L);
                      system ("PAUSE");
                     break;
                  case 3:
                      system ("CLS");
                      printf("***VISUALIZZAZIONE MESSAGGIO***\n\n");
                      system ("PAUSE");
                     break;
                  case 4:
                      system ("CLS");
                      printf("***ELIMINA MESSAGGIO***\n\n");
                      system ("PAUSE");
                     break;
                  case 0:  return 0;
               }
            }
        return 0;
    }
    
    
    
    
    
    
    
    int menu(){  //Funzione per il menu
         int scelta;
         printf("***GESTIONE UTENTE***\n");
         printf("[1] Inserisci Utente\n");
         printf("[2] Inserisci Messaggio\n");
         printf("[3] Visualizza Tutti i Messaggi  Utente\n");
         printf("[4] Elimina Messaggio \n");
         printf("[0] Esci\n\n");
         printf(" Scelta: ");
         scanf("%d",&scelta);
    
         while (scelta<0 || scelta>4){    // controllo scelta
            printf("Scelta non valida\n");
            printf(" Scelta: ");
            scanf("%d",&scelta);
            return scelta;//Rifa il l'operazione della scelta
            }
            return scelta;
            system ("PAUSE"); //codeblocks lo mette in automatico
    
    }
    
    
    
    Lista Inserimento_Utente(){
          Lista utent;
          int i;
          printf("Quanti Utenti vuoi inserire?  ");
          scanf("%d",& utent.num_utenti);
          fflush(stdin); //Svuota il buffer, la tastiera e senza di esso a causa di caratteri che rimangono potrebbe saltare inserimento nome e portarci direttamente a cognome
          for(i=0;i<utent.num_utenti;i++){
            printf("Inserisci Nome ");
            gets(utent.elementi[i].nome);
            printf("Inserisci Cognome ");
            gets(utent.elementi[i].cognome);
            printf("Inserisci Sesso ");
            gets(utent.elementi[i].sesso);
            printf("Inserisci Giorno ");
            scanf("%d",& utent.elementi[i].giorno);
            fflush(stdin);
            printf("Inserisci Mese ");
            gets(utent.elementi[i].mese);
            printf("Inserisci Anno ");
            scanf("%d",& utent.elementi[i].anno);
            fflush(stdin);
          }
          return utent;
    }
    void Stampa_Elenco (Lista utent){
        int i;
        for (i=0;i<utent.num_utenti;i++){
            printf("Utente n.%d\n",i+1); //Altrimenti stampa Utente n.0 invece di n.1
            printf("Nome %s\n",utent.elementi[i].nome);
            printf("Cognome %s\n",utent.elementi[i].cognome);
            printf("Sesso %s\n",utent.elementi[i].sesso);
            printf("Giorno %d\n",utent.elementi[i].giorno);
            printf("Mese %s\n",utent.elementi[i].mese);
            printf("Anno %d\n\n",utent.elementi[i].anno);  // Doppio \n\n per stampa ordinata di più utenti
        }
    }
    
    
    Messaggio Inserimento_Messaggio (Lista utent){
        int i;
        char inse;
        for (i=0;i<utent.num_utenti;i++){
            printf("Vuoi inserire un messaggio? \n");
            scanf("%c",&inse);
            if(inse=='s'||inse=='S'){
                printf("Inserisci Autore ");
                gets(utent.elemento[i].autore);
                printf("Inserisci Testo ");
                gets(utent.elemento[i].testo);
                printf("Inserisci Mi_piace ");
                scanf("%d",&utent.elemento[i].mi_piace);
                printf("Inserisci Destinatario ");
                gets(utent.elemento[i].destinatario);
            }
        }
    }
    Il programma al momento della compilazione mi registra 2 warnings. Al momento dell'esecuzione mi fa aggiungere gli utenti (CASE 1) ma quando digito il CASE 2 non riesco ad interagire con la funzione Inserimento_messaggio. Vorrei avere un input su come affrontare questo problema,Grazie.
  • Re: Problema con la struct

    Messaggio Inserimento_Messaggio (Lista utent)

    vuol dire che la funzione restituisce una struttura di tipo Messaggio. Ma la funzione non lo fa. E la chiamata è comunque sbagliata perché manca una variabile di tipo Messaggio e un =

    Ma l'architettura che hai impostato è il vero problema. Non ha molto senso in tanti punti. Non vorrei demoralizzarti ma ci sarebbe tanto da rivedere.
    Dovrebbero essere usate molto le Liste semplici e i puntatori ma il fatto che tu non sappia usare ancora le chiamate a funzioni mi fa pensare che la questione sia un po' oltre le tue possibilità attuali. Poi dipende anche da quanto è "elastico" il tuo prof nella correzione ...
  • Re: Problema con la struct

    Bhè mi hai demoralizzato in verità…., non hai un link dove potrei studiarmi un esempio simile al mio programma per poter capire meglio come strutturarlo?
    Perché ho controllato anche sulle slide dell'università ma il materiale fornito sui record è pochissimo.
  • Re: Problema con la struct

    Ma le liste semplici le avete trattate?
  • Re: Problema con la struct

    No, ho appena visto su internet cosa sono, ma sulle slide dell'università non ci sta niente. Di struct ci sta solo l'introduzione iniziale i campi, come strutturarle, ma di liste con le struct non ci sta niente.
  • Re: Problema con la struct

    Che dirti ... quello è un esercizio che necessita delle liste semplici e dell'allocazione dinamica. Non capisco perché farvi fare un esercizio così senza avere gli strumenti adatti.

    Per le pagine, ad esempio, la struttura poteva essere (semplificando)
    
    struct pagina {
       int idUtente;
       Messaggio *listaMessaggi;
    }
    
    con un id che poteva riferirsi all'utente e un puntatore ad una lista semplice di messaggi pubblicati sulla pagina dell'utente.

    In questo modo era possibile gestire le pagine.
  • Re: Problema con la struct

    Ciao, grazie per avermelo detto, sono andato a vedere i video del professore e verso gli ultimi minuti del corso ho trovato, qualcosa di simile alle liste semplici ma che ha chiamato puntatori a variabili di tipo struct e ci stava questo esempio:
    
    struct punto_2D *ppunto
                            mio_punto={10.3,20.1}; // ascissa e ordinata
    Carta *pcarta mia_carta = {1,cuori};
    ppunto=& mio_punto;
    pcarta= & mia_carta;
    
    poi ci stava un piccolo esempio su come trovare l'ascissa:
    
    (* mio_punto).ascissa  // (* mio_punto) si può anche scrivere ppunto ->
    
    1)Vorrei sapere se questo esempio basta per poter fare questo esercizio.
    2) Se si, il programma complessivo che ho postato deve essere completamente modificato? Intendo la parte dell'inserimento Utente va bene?
    Grazie ancora per la disponibilità.
  • Re: Problema con la struct

    Non basta ma è una parte propedeutica necessaria. Avete allocato dinamicamente le strutture con malloc?

    Con i puntatori e l'allocazione dinamica, puoi implementare le liste e il programma va modificato in maniera sostanziale.
  • Re: Problema con la struct

    Ho visto sia sulle slide che sui video ma un esempio con questa tipologia di struct + malloc non ci sta, perché nel video il professore comunque annuncia che verranno riprese in programmazione 2 e io devo dare programmazione 1.

    Della libreria malloc qualche accenno è stato fatto, niente di che solo a cosa serve.

    Quindi è una cosa fattibile?
Devi accedere o registrarti per scrivere nel forum
25 risposte