Programma in C

di il
17 risposte

Programma in C

Salve ragazzi,dovrei svolgere questo compito però non ho idea di come fare,ho iniziato creando le strutture,fin qui è giusto?
Questo è il testo:

Vi è stato richiesto di scrivere un’applicazione in C che consenta la gestione di un
cinema multisala. In particolare, l’applicazione è pensata per la gestione delle
prenotazioni dei biglietti.
L’applicazione dovrà soddisfare i seguenti requisiti:
?il cinema è composto da 5 sale (sala A, sala B, sala C, sala D e sala E);
?nome_sala, giorno, orario e titolo dello spettacolo sono riportati in un calendario
definito mensilmente (file spettacoli.txt);
?le prenotazioni vengono gestite rispettando i seguenti criteri:
?le prenotazioni sono riportate nel file prenotazioni.txt;
?le prenotazioni dovranno contenere nome_sala, giorno, orario_di_inizio, posti e
dati_contatto (nome, cognome, cellulare);
?le prenotazioni si riferiscono sempre al mese corrente e non possono essere
accettate richieste per mesi successivi;
?la struttura di ciascuna sala (numero file e posti per fila) è riportata nel file sale.txt.
Per ogni sala, le file verranno identificate da una lettera dell’alfabeto.
Si scriva un programma in C che soddisfi i vincoli indicati. In particolare, si definisca
una struttura dati adeguata (ove possibile, si dia preferenza alle strutture dati
dinamiche) e si doti il programma (almeno) delle seguenti funzioni:
?un menu da cui richiamare le altre funzionalità;
?funzioni in grado di caricare i dati da file (sale.txt, spettacoli.txt, prenotazioni.txt)
?inserisci_prenotazione: funzione che consente ad un’operatore di verificare la
disponibilità dei posti richiesti ed eventualmente effettuare la prenotazione;
?inserisci_prenotazioni_da_file (si supponga di avere un file che contiene un elenco di
richieste -richieste.txt- da scorrere e trasformare in prenotazioni qualora vi siano
ancora posti liberi);
?lista_posti: lista dei posti ancora disponibili (per ogni spettacolo vengono visualizzati
i seguenti dati: nome_sala, data, orario_di_inizio, titolo_del_film, numero_posti).
Alla chiusura del programma, i dati, ove necessario, andranno salvati su file.

E qui c'è il mio esercizio fino alle strutture:
#include <stdio.h>
#include <stdlib.h>

#define max 100

struct spettacoli{
	char nome_sala;
	int giorno;
	char orario[6];
	char titolo[max];
	
	struct spettacoli *next;
};

typedef struct spettacoli spettacoli;
typedef spettacoli *link1;

struct prenotazioni{
	char sala;
	int giorno;
	char inizio[6];
	int posti;
	char nome[max];
	char cognome[max];
	char cellulare[max];
	
	struct prenotazioni *next;
};

typedef struct prenotazioni prenotazioni;
typedef prenotazioni *link2;

struct sale{
	char sala;
	int file;
	int posti;
	
	struct sale *next;
	
};

typedef struct sale sale;
typedef sale *link3;

17 Risposte

  • Re: Programma in C

    Alcune osservazioni.
    • non chiamare una variabile con lo stesso nome del tipo, il compilatore genererà un errore.
    • hai 5 sale, una lista dinamica è anche troppo. So che nel testo c'è scritto di usare 'strutture dinamiche', ma prima farei una versione con un semplice array di sale. Sugli spettacoli potrebbe anche essere necessaria una lista dinamica, ma anche no.
    • La definizione
      typedef struct spettacoli spettacoli;
      è quantomeno bizzarra: se devi usare una lista dinamica, puoi anche usare una struttura allocata in modo statico per indicare l'inizio della lista, ma secondo me ti complichi la vita.
  • Re: Programma in C

    Vediamo se ho capito...quindi dovrei farlo cosi?
    struct spettacoli{
    	char nome_sala;
    	int giorno;
    	char orario[6];
    	char titolo[max];
    	
    	struct spettacoli *next;
    };
    
    
    struct prenotazioni{
    	char sala;
    	int giorno;
    	char inizio[6];
    	int posti;
    	char nome[max];
    	char cognome[max];
    	char cellulare[max];
    	
    	struct prenotazioni *next;
    };
    
    typedef struct prenotazioni prenotazioni;
    typedef prenotazioni *link
    
    e poi le sale le faccio come matrici?
  • Re: Programma in C

    igna97 ha scritto:


    Vediamo se ho capito...quindi dovrei farlo cosi?
    
    typedef struct prenotazioni prenotazioni;
    
    NOOOOOOOOOOOOO! Leggi meglio i commenti!
  • Re: Programma in C

    Scusate ragazzi mi potreste scrivere come fareste voi le strutture perfavore perchè non riesco a capire,ancora sono un po acerbo purtroppo in queste cose.
    Grazie in anticipo
  • Re: Programma in C

    Come hai scritto tu le struct ed i typedef non è sbagliato: è solo un po' prolisso ed eventualmente ambiguo.
    Ognuno ha il suo modo di scrivere le liste concatenate ed i tipi personali, personalmente le faccio così:
    typedef struct _spettacoli {
    	char nome_sala;
    	int giorno;
    	char orario[6];
    	char titolo[max];
    
    	struct _spettacoli *next;
    } Spettacoli;
    
    Spettacoli *link1 = NULL;	/* indica lista vuota */
    Quando aggiungo uno spettacolo:
        Spettacoli *link1_head = NULL;
        if (link1 == NULL){
            link1 = (Spettacoli *)malloc(sizeof(Spettacoli));
            link1->next = NULL;
            link1_head = link1;
        } else {
            Spettacoli *tmp;
            tmp = link1_head;
            while (tmp->next != NULL)
                tmp = tmp->next;
            /* tmp punta all'ultimo record della lista */
            tmp->next = (Spettacoli *)malloc(sizeof(Spettacoli));
            tmp = tmp->next;
            tmp->next = NULL;
        }
    
    La tua definizione
    typedef struct spettacoli spettacoli;
    typedef spettacoli *link1;
    non è sbagliata, ma la seconda definisce il tipo 'link1' come un puntatore a 'spettacoli', che è superflua.
  • Re: Programma in C

    Quindi mi consigli di togliere typedef spettacoli link1?
  • Re: Programma in C

    igna97 ha scritto:


    Quindi mi consigli di togliere typedef spettacoli link1?
    Ancora stai a chiedere? Ti ha già fatto vedere pure l'inserzione, ringrazia e vai avanti che l'esercizio è lungo...
  • Re: Programma in C

    L'esercizio è gigante ahaha
  • Re: Programma in C

    Un altra domanda,ma ci sono esercizi svolti simili a questo su internet?
  • Re: Programma in C

    Cerca gli argomenti sui siti delle università, no?

    Questo il primo trovato con google con liste e file


    Trovare tutto insieme è dura, anche perché esercizi del genere solitamente si fanno in un linguaggio orientato agli oggetti
  • Re: Programma in C

    Ti ringrazio.Un altra cosa,quando creo le tre funzioni per caricare i dati da file,nel main le devo richiamare una dopo l'altra ?
    E soprattutto devo porre una variabile di tipo spettacoli e inizializzarla a NULL?
  • Re: Programma in C

    Nel main dovrai fare uno switch col menu delle azioni, ci sono miliardi di esempi in questo stesso forum. In base a cosa sceglie l'utente fai quello che devi fare.
    Le variabili le dichiari quando ti accorgi che servono. Sicuramente dovrai partire dalle due che ti ha indicato andrea nell'ultimo post (head e tmp)
  • Re: Programma in C

    Io ho lasciato le strutture in quel modo e ho iniziato a fare il programma però ovviamente le strutture sono sbagliate perchè nella struttura spettacoli non posso gestire i posti in sala in quel modo
    struct spettacoli{
    	char nome_sala;
    	int giorno;
    	char orario[6];
    	char titolo[max];
    	int posti_sala[N][N];
    	
    	struct spettacoli *next;
    };
    
    typedef struct spettacoli spettacoli;
    typedef spettacoli *link1;
    
    struct posti{
    	char prenotati[max];
    };
    
    typedef struct posti Posti;
    
    struct prenotazioni{
    	char sala;
    	int giorno;
    	char inizio[6];
    	int posti;
    	char nome[max];
    	char cognome[max];
    	char cellulare[max];
    	Posti prenotati[max];
    	
    	struct prenotazioni *next;
    };
    
    typedef struct prenotazioni prenotazioni;
    typedef prenotazioni *link2;
    
    void menu();
    link1 carica_spettacoli(char*);
    link2 carica_prenotazioni(char*);
    void inserisci_prenotazioni(link2*);
    void inserisci_prenotazioni_da_file(char*,link2*);
    void posti_disponibili(link2*);
    void salva(char*,link2*);
    
    int main(){
    	
    	link1 head=NULL;
    	link2 start=NULL;
    	head=carica_spettacoli("spettacoli.txt");
    	start=carica_prenotazioni("prenotazioni.txt");
    	
    	int scelta;
    	
    	do{
    		menu();
    		printf("Inserisci una scelta: ");
    		scanf("%d",&scelta);
    		
    		switch(scelta){
    			
    			case 1:
    				inserisci_prenotazioni(start);
    				break;
    				
    			case 2:
    				inserisci_prenotazioni_da_file("richieste.txt",start);
    				break;
    				
    			case 3:
    				posti_disponibili(start);
    				break;
    				
    			default:
    				scelta=0;
    				salva("prenotazioni.txt",start);
    				break;
    		}
    		
    	}while(scelta);
    	
    }
    
    void menu(){
    	printf("1  Inserisci prenotazioni\n");
    	printf("2  Inserisci prenotazioni da file\n");
    	printf("3  Lista posti disponibili\n");
    	printf("0  Per terminare e Salvare");
    }
    
    link1 carica_spettacoli(char* NomeFile){
    	
    	FILE *fp;
    	link1 head=NULL;
    	link1 elemento;
    	
    	fp(fopen("spettacoli.txt","r")){
    		while(!feof(fp)){
    			elemento=malloc(sizeof(spettacoli));
    			fscanf(fp,"%s",elemento->nome_sala);
    			fscanf(fp,"%d",&elemento->giorno);
    			fscanf(fp,"%s",elemento->orario);
    			fscanf(fp,"%s",elemento->titolo);
    			fscanf(fp,"%s",elemento->posti_sala);
    			
    			if(head==NULL){
    				head=elemento;
    				head->next=NULL;
    			}
    			else{
    				elemento->next=head;
    				head=elemento;
    			}
    		}
    	}
    	fclose(fp);
    	
    }
    
    	
    
    
    
    
    
    
    Non so se il resto che ho fatto è giusto
  • Re: Programma in C

    Se l'hai impostato così, continua in questa direzione, non vedo controindicazioni macroscopiche.
    Per quanto riguarda le prenotazioni, avere un motore SQL sotto farebbe comodo, ma non ce l'hai e direi che ti conviene creare N liste per ogni sala, con N pari a quanti sono i turni di spettacolo. Ogni record di queste liste rappresenta un posto occupato/prenotato. La mappa dei posti in sala la puoi fare con il metodo che preferisci, ad esempio con una bitmap od una stringa, od anche con una matrice.
    Più o meno dovrebbe andare, l'alternativa è una lista unica con tutte le informazioni dentro (sala, giorno, turno, posto). Ma è un po' complesso fare le 'select'.
    Scegli come mappare i posti in sala, poi scrivi le funzioni che siano in grado di eseguire le operazioni di ricerca posti liberi, occupazione posti, eventuale cancellazione prenotazione (anche se non mi sembra sia richiesta).
Devi accedere o registrarti per scrivere nel forum
17 risposte