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.