Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Programma in c, con due problemi

    salve a tutti, sono nuova sia sul sito sia con il c.. )
    vi spiego brevemente il mio problema devo fare un programma che organizzi una festa con invitati e rispettivi regali.. gli invitati li memorizza in un file binario
    Vi posto il mio programma e vi segnalo l'errore:

    codice:
    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
     
    #define DIM 10
    #define TRUE 1
    #define FALSE 0
    #define PATH "laurea"
    #define AGE_LIMIT 3
    #define PATH_REGALO "regalo"
     
    // Creo la struttura per contenere i dati
    typedef struct lista_invitati{
            char nome[15];
            char cognome[15];
            char eta[4];
            char sesso[2];
            char tipo_invitato[2];
            int key;
            }invitato;
                  
    //struttura dati di ogni regalo ricevuto
    typedef struct t_regalo {
        char oggetto[30];
        float prezzo;
        int gradimento;
        int key;
        }regalo;
        //controllo sesso
        short int controlla_sesso(char *c)
        {
           int i=0;
           for(i=0; i<=strlen(c); i++)
           c[i]= toupper(c[i]);  
           if((strcmp(c,"M") == 0)  || (strcmp(c,"F")==0))
            return 1;
            
            return 0;
            }
       // controllo età     
       short int controlla_eta(char *c)
       {
          int i=0;
          if(strlen(c)>AGE_LIMIT) // se l'età immessa supera 3 caratteri ritorna 0
          return 0;
          for(i=0;i<=strlen(c)-1;i++) 
          if(!isdigit(c[i]))
          return 0;
          
            return 1; //se supera i controlli precedenti va bene
          }
          // controllo invitato
          short int controlla_invitato(char *c)
        {
           int i=0;
           for(i=0; i<=strlen(c); i++)
           c[i]= toupper(c[i]);  
           if((strcmp(c,"A") == 0)  || (strcmp(c,"P")==0))
            return 1;
            
            return 0;
            }
      //inserisce le informazioni per ogni invitato      
      invitato acquisisci_invitato()
      {
      invitato valore;
      printf("inserisci il nome:\n");
      scanf("%s",valore.nome);
      printf("inserisci il cognome:\n");
      scanf("%s",valore.cognome);
      
      for(;!controlla_eta(valore.eta);){
      printf("inserisci l'eta':\n");
      scanf("%s",valore.eta);
    }
      for(;!controlla_sesso(valore.sesso);){
      printf("inserisci il sesso:\n\t (f=femmina,m=maschio)\n");
      scanf("%s",valore.sesso);
    } 
      for(;!controlla_invitato(valore.tipo_invitato);){
      printf("inserisci il tipo_invitato:\n\t (a=amici, p=parente)\n");
      scanf("%s",valore.tipo_invitato);
    }
      return valore;
      }
      //inserisce i dati del regalo
      regalo acquisisci_regalo()
      {
      regalo v_regalo;
      printf("\t\tInserisci i regali ricevuti\n");
      printf("Inserisci il nome dell'oggetto\n");
      scanf("%s",v_regalo.oggetto);
      printf("inserisci il prezzo dell'oggetto\n");
      scanf("%f",&v_regalo.prezzo);
      printf("inserisci il gradimento da 0 a 10\n\t0 non mi piace affatto\n\t10 si, mi piace molto)\n");
      scanf("%d",&v_regalo.gradimento);
      return v_regalo;
    }
    // funzione che ci consente di memorizzare i dati
       int memorizza( const void* dato,size_t typo, char* percorsofile){
       FILE *progetto;
       progetto=fopen(percorsofile,"a+b");
       if(fwrite(dato,typo,1, progetto)>0){
       printf ("Dati scritti con successo sul file %s!\n",percorsofile);
       fclose(progetto);
       return 1;
       }
       else{
       printf ("Errore nella scrittura dei dati su file\n");
       fclose(progetto); 
       return -1;
       }
       fclose(progetto);
       return -1;
       }
        
        int lista(){
            FILE *progetto;
            progetto=fopen("laurea","rb");
            while(!(feof(progetto))){
            invitato valore;
            fread(&valore, sizeof(invitato),1, progetto);
            printf("NOME\tCOGNOME\t\tETA\tSESSO\tTIPO\n");
            printf("%s\t%s\t\t%s\t%s\t%s\n",
            valore.nome, valore.cognome, valore.eta, valore.sesso, valore.tipo_invitato);}  
            fclose(progetto);
            return 1;
            }
            
       int lista_regalo(){
             FILE *progetto; 
             progetto=fopen("regalo","r+b");
             while(!(feof(progetto))){
             regalo v_regalo;
             fread(&v_regalo, sizeof(invitato),1, progetto);//leggo una struttura e la memorizzo in ato 
             printf("REGALO\tPREZZO\tGRADIMENTO\n");
             printf("%s\t%f\t%d\n",v_regalo.oggetto, v_regalo.prezzo, v_regalo.gradimento);}
             fclose(progetto);
             return 1;
                }
        //controllo parentesi ok
      int Menu();
      main(){int x=1;do{system("color 4d");x=Menu();}while(x!=0);}// colore
      
      int Menu()
      {
        // if(controlla_sesso("Z")){printf("FUNZIONA\n");system("PAUSE");}else{printf("NON FUNZIONA");system("PAUSE");}
          struct lista_invitati valore;
          struct t_regalo v_regalo;
          int fine=0, indice;
          int j, partecipanti;
      printf ("\n\t\t***MENU' PER LA GESTIONE DELLA FESTA DI LAUREA***\n\n");
      printf ("\t1: Inserire dati invitati\n");
      printf ("\t2: Visualizzare lista invitati\n");
      printf ("\t3: Inserire regali ricevuti\n");
     
      printf("Inserisci la tua scelta:    ");
      scanf("%d",&indice);
      
        while(indice<=0 && indice>=4){        qua nel momento che scrivo un numero diverso da 
        printf("SCELTA SBAGLIATA  \n");             1,2,3 non mi dice scelta sbagliata perche???
        printf("Inserisci ora la tua scelta:    ");
        scanf("%d",&indice);
    }
    
    switch(indice) 
    {
    case(1):{
            int p=0;
            printf("\n\nQuanti invitati vuoi inserire? ");
            scanf ("%d",&partecipanti);
            
            while(p!=partecipanti)
            {
            printf("Inserisci l'invitato n.%d:\n",p++);
            invitato valore = acquisisci_invitato(); 
            printf("\n----->%s\n",valore.nome);
            memorizza(&valore,sizeof(invitato),PATH);
         
       }    return;
           break;
       }           
    
    case(2):
             if(PATH==NULL)
             {                                                 vorrei che mi controllasse il mio file se lo trova vuoto mi 
              printf("\t___Lista invitati vuota___\n");    dice LISTA INVITATI VUOTA altrimenti mi ritorna la
              }                                                                lista, ma questo non succede
             else                                              Credo di averlo fatto sintatticamente giusto..
            {
                lista(); }
           return;
           break;
    }
      system("PAUSE");
      return 0;
      }

    scusatemi se l ho postato tutto ma è da un paio di giorni che ci sbatto la testa
    grazie mille in anticipo..spero in una vostra spiegazione
    Ultima modifica di principess89; 10-04-2014 a 12:52 Motivo: Aggiunti i tag CODE

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Quando posti del codice, usa gli appositi tag CODE previsti dal forum, in modo da mantenere indentazione e formattazione del codice, che altrimenti risulta praticamente illeggibile.

    Per usare i tag code:

    1) Clicca sul pulsante giallo "Modalità Avanzata" (in basso a destra) e usa il pulsantino "#"

    oppure

    2) Scrivi direttamente i tag nel corpo del messaggio, includendo all'interno il codice:

    [CODE]
    codice
    [/CODE]


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    scusami non lo sapevo.. pensavo bastasse evidenziare in rosso i miei problemi.. ma non c'è un post di presentazione??? grazie mille per avermi corretto

  4. #4
    PATH==NULL???? Praticamente non succederà mai, visto che PATH viene sostituito dal preprocessore con la stringa laurea.

    Un file vuoto è un file di dimensione zero, quindi basta controllarne la dimensione.

    codice:
    struct stat st;
    stat(filename, &st);
    size = st.st_size;
    Devi includere sys/stat.h.

  5. #5
    Quote Originariamente inviata da paolino_delta_t Visualizza il messaggio
    PATH==NULL???? Praticamente non succederà mai, visto che PATH viene sostituito dal preprocessore con la stringa laurea.

    Un file vuoto è un file di dimensione zero, quindi basta controllarne la dimensione.

    codice:
    struct stat st;
    stat(filename, &st);
    size = st.st_size;
    Devi includere sys/stat.h.

    grazie mille ci provo subito ))

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.