Programma che gestisca la prenotazione dei tavoli in un ristorante

di il
3 risposte

Programma che gestisca la prenotazione dei tavoli in un ristorante

Salve, qualche giorno fa avevo creato un thread che riguardava questo esercizio, ma in maniera molto confusa e soprattutto senza codice. A distanza di giorni ho creato il codice, ma ho diversi dubbi sul suo corretto funzionamento. In parole povere devo gestire un sistema di prenotazioni di un ristorante con cinque sale di cui due riservate solo per la pizzeria. le prenotazioni hanno massima di un ora e per semplicità hanno inizio al minuto 00. ogni prenotazione deve contenere: giorno, ora, numero partecipanti, tipo_pasto (ristorante o pizzeria) e dati_contatto (nome, cognome, cellulare). Ogni sala deve contenere il numero dei tavoli e ogni tavolo il numero dei posti. Le prenotazioni si riferiscono sempre al mese corrente.
Le funzioni da creare sono:
-un menu da cui richiamare le altre funzionalità;
-caricamento dei dati da file (prenotazioni.txt, aperture.txt);
-inserisci_prenotazione (funzione che consente ad un’operatore di verificare la disponibilità di un tavolo ed eventualmente effettuare la prenotazione);
-inserisci_prenotazioni_da_file (si supponga di avere un file che contiene un elenco di richieste di prenotazione -richieste.txt- da scorrere e trasformare in -prenotazioni qualora vi siano ancora tavoli liberi);
-lista_dei_tavoli ancora disponibili (mostrati per data, fascia oraria e sala - es.: 04/06/2019: 21-22 - Sala A)
Per adesso ho creato solo due funzioni, caricamento dei dati e tavoli disponibili, mi sono fermato perché volevo richiamare la funzione che mi ritorna la lista dei tavoli disponibili all'interno delle funzioni che mancano, ma il mio problema è appunto il funzionamento della funzione disponibili che non mi convince.
Mostro il mio codice.

File di header
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define LUN 20
#define MAX 10
#define DIM 5
#define DAY 31
#define HOUR 3
#define NMAX 50

typedef int bool;
#define false 0
#define true 1
typedef int bool;
#define false 0
#define true 1

//Struct prenotazione

struct data{

    int giorno;
    char mese;
    int ora;
    int n_partecipanti;
    int id_tavolo;
    char nome[LUN];
    char cognome[LUN];
    char contatto[MAX];
    bool pizza;


};
typedef struct data tdata;

struct nodo{

    tdata info;
    struct nodo *next;

};
typedef struct nodo prenotazione;

//Struct Sala

struct informazioni{

    char tipo_sala[DIM];
    int n_tavoli[NMAX];
    int id_tavolo[NMAX];
    int n_posti;
    int t_disponibili;
    int t_occupati;

};
typedef struct informazioni tinfo;

struct node{

    tinfo dati;
    struct node *next;

};
typedef struct node sale;


//Struct calendario

struct elementi{

    char mese[MAX];
    char giorno[DAY];
    char fascia_oraria[HOUR];
    bool apertura;

};

typedef struct elementi telementi;

struct membro{

    telementi date;
    struct membro *next;

};

typedef struct membro calendario;

//prototipi di funzioni

prenotazione *inizializza_p(char *, prenotazione *);
calendario *inizializza_c(char *, calendario*);
prenotazione *inserisci_prenotazione(prenotazione *);
prenotazione *inserisci_da_file(char *, prenotazione *);
sale*  disponibili(sale *, calendario *);
Ho creato tre liste likate, una per gestire le prenotazioni, una per gestire sale e tavoli e una per gestirmi il calendario con orari e aperture.

File sorgente main.c

#include "data.h"

int main()
{
    int input;
    prenotazioni *lista = NULL;
    sale *lista2 = NULL;
    calendario *lista3 = NULL;

    do{

        printf("MENU\n");
        printf("-Inserisci 1 per inizializzare le lista delle prenotazioni\n -Inserisci 2 per inizializzare la lista delle aperture\n -Inserisci 3 per fare una prenotazione\n -Inserisci 4 per fare una prenotazione da file\n -Inserisci 5 per visualizzare i tavoli disponibili\n");
        scanf("%d",input);

            switch(input){

                case 1{

                    lista=inizializza("prenotazioni.txt", lista);

                }

                case 2{

                    lista3=inizializza_c("aperture.txt", lista3);

                }

                case 3{

                    lista=inserisci_prenotazione(lista);

                }

                case 4{

                    lista=inserisci_da_file("richieste.txt", lista);

                }

                case 5{

                    lista2=disponibili(lista2,lista3);

                }

            }

        }

    }

File sorgente funzioni.c

#include "data.h"

/*
 * Funzione: inizializza_p
 *
 * - char *nomefile: un puntatore al nome del file che conterrà le prenotazioni
 * - prenotazione *p: un puntatore alla struttura
 *
 *  restituisce una variabile di tipo prenotazioni che conterrà tutte le prenotazioni
 *
 */

prenotazione *inizializza_p(char *nomefile, prenotazione *p){
    tdata elem;
    prenotazione *newElem;
    FILE *fp;

            if((fp=fopen(nomefile, "r"))!=NULL){
                while(fscanf(fp,"%d%c%d%d%d%s%s%s%[^\n]\n" , elem.giorno, elem.mese, elem.ora, elem.n_partecipanti, elem.id_tavolo, elem.nome, elem.cognome elem.contatto, elem.pizza)!=EOF){
                    newElem = (prenotazione*) malloc (sizeof(prenotazione));
                    newElem->info = elem;
                    newElem->next = p;
                    p = newElem;
                    }
                }else{
                    printf("Errore nell'apertura del file.");
            }
            fclose(fp);
        return p;
    }


  /*
 * Funzione: inizializza_c
 *
 * - char *nomefile: un puntatore al nome del file che conterrà le un calendario con orari di apertura e chiusura, i giorni del mese e una una variabile 1 oppure 0 (variabile booleana che
 *   sta a signigicare 1 che il ristorante in quel giorno è aperto, 0 che invece è chiuso
 * - prenotazione *p: un puntatore alla struttura
 *
 *  restituisce una variabile di tipo calendario che conterrà i giorni di apertura e chiusura del mese corrente con i rispettivi orari di apertura e chiusura
 *
 */

    calendario* inizializza_c(char *nomefile2, calendario *p){
        telementi elemento;
        calendario *nuovo;
        FILE *fp;

            if (fp=fopen(nomefile2, "r")!=NULL){
                while(fscanf(fp,"%s%s%d%d%[^\n]\n", elemento.mese, elemento.giorno, elemento.fascia_oraria, elemento.apertura) !=EOF){
                    nuovo=(calendario*) malloc (sizeof(calendario));
                    nuovo->date = elemento;
                    nuovo->next = p;
                    p = nuovo;
                }

            }else{
                printf("Errore nell'apertura del file.\n");
            }
            fclose(fp);
        return p;
    }


/*
* - prenotazione *p: un puntatore alla struttura
*
*
*
*
* - restituisce una variabile di tipo prenotazione che conterrà la lista
*
*/

sale* disponibili(sale *p, calendario *p2){
    int cont=0;
    if (p->dati.id_tavolo==NMAX){
        printf("La sala è piena.");
        for (int i=0;i<NMAX;i++){
            if (p->dati.id_tavolo[i]>cont){
                p->dati.t_occupati++;
                p->dati.t_disponibili--;
                cont++;
                p=p->next;
                }
                return disponibili;
                }
                }
                    if (p->dati.t_disponibili==0){
                        printf("La sala è piena.");
                    }else{
                        printf("%d%s%d",p2->date.giorno, p2->date.mese, p2->date.fascia_oraria, "Disponibili: %d",p->dati.t_disponibili);
                    }

                }

Spero di essere stato abbastanza chiaro e preciso.

3 Risposte

  • Re: Programma che gestisca la prenotazione dei tavoli in un ristorante

    Esattamente il problema qual è?
  • Re: Programma che gestisca la prenotazione dei tavoli in un ristorante

    oregon ha scritto:


    Esattamente il problema qual è?
    che quando lo compilo e inserisco come scelta 1 il il compilatore dice "killed" dopo un paio di secondi
    Avevo dimenticato di mostrare i file txt dove attingo i dati

    il file prenotazioni.txt è fatto cosí:
    Lunedí 20 MAGGIO 20 7 A Giorgio Aveni 3466007498 1
    Mercoledi 22 MAGGIO 21 4 D Mario Rossi 3934135971 5
    Venerdí 24 MAGGIO 19 2 C Riccardo Lanuzza 3275698125 3

    il file aperture.txt è fatto in questa maniera:
    MAGGIO
    1 17 23 1
    2 18 24 1
    3 19 01 1
    4 20 02 1
    5 20 03 1
    6 21 02 1
    7 00 00 0
    8 17 23 1
    9 18 24 1
    10 19 01 1
    11 20 02 1
    12 20 03 1
    13 21 02 1
    14 00 00 0
    15 17 23 1
    16 18 24 1
    17 19 01 1
    18 20 02 1
    19 20 03 1
    20 21 02 1
    21 00 00 0
    22 17 23 1
    23 18 24 1
    24 19 01 1
    25 20 02 1
    26 20 03 1
    27 21 02 1
    28 00 00 0
    29 17 23 1
    30 18 24 1
    31 19 01 1
  • Re: Programma che gestisca la prenotazione dei tavoli in un ristorante

    I campi della fscanf non mggi pare abbiggano senso...
    Inizi con %d e dovresti leggere Lunedí ?
    Poi usi un %c per il mese ?
    E così via... controlla cosa leggi con una printf
Devi accedere o registrarti per scrivere nel forum
3 risposte