Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- #include "main.h"
- // Mai eliminare i file .dat,servono per il corretto funzionamento del programma
- Globale* piatto;
- Scontrino tavolo[15];
- int numpiatti = 0;
- int main()
- {
- int i, scelta=10;
- // Carica dal file num.dat il numero di piatti presente in list.dat
- FILE* numeropiatti;
- numeropiatti = fopen("num.dat", "rb");
- if (!numeropiatti) {
- printf("Errore: impossibile aprire il file num.dat.");
- exit(-1);
- }
- fread(&numpiatti, sizeof(int), 1, numeropiatti);
- fclose(numeropiatti);
- //printf("numpiatti %d", numpiatti); // per vedere se carica correttamente
- piatto = calloc(numpiatti, sizeof(Globale));
- // Carica dal file binario list.dat un numero di piatti pari a numpiatti, ricavato precedentemente
- FILE* lista_piatti;
- lista_piatti = fopen("list.dat", "rb");
- if (!lista_piatti) {
- printf("Errore: impossibile aprire il file list.dat.");
- exit(-1);
- }
- fread(piatto, sizeof(Globale), numpiatti, lista_piatti);
- fclose(lista_piatti);
- //printf(" %s", piatto[1].nome); // per vedere se carica correttamente
- // Inizializzo l'array degli scontrini con un valore neutro usato per triggerare operazioni future
- for (i=0;i<15;i++) tavolo[i].ID = 16;
- do {
- pulisci_schermata();
- printf("Benvenuto nel programma di gestione del ristorante.\n\n");
- printf("- Gestione menu' -\n\n");
- printf("(1) Aggiungi un nuovo piatto\n");
- printf("(2) Modifica un piatto esistente\n");
- printf("(3) Elimina un piatto esistente\n");
- printf("(4) Visualizza l'elenco dei piatti\n");
- printf("(5) Cerca nell'elenco dei piatti\n");
- printf("\n- Gestione cassa -\n\n");
- printf("(6) Crea un nuovo scontrino al tavolo\n");
- printf("(7) Aggiungi un ordine al tavolo\n");
- printf("(8) Stampa scontrino\n");
- printf("\n- Altre opzioni -\n\n");
- printf("(9) Esci dal programma\n\n");
- printf("Digita a schermo il numero dell'operazione da eseguire: ");
- scanf("%d", &scelta);
- if (scelta == 1) {aggiungi_piatto(); scelta=10;}
- if (scelta == 2) {modifica_piatto(); scelta=10;}
- if (scelta == 3) {elimina_piatto(); scelta=10;}
- if (scelta == 4) {visualizza_elenco(); scelta=10;}
- if (scelta == 5) {cerca_in_elenco(); scelta=10;}
- if (scelta == 6) {crea_nuovo_scontrino(); scelta=10;}
- if (scelta == 7) {aggiungi_ordine(); scelta=10;}
- if (scelta == 8) {stampa_scontrino(); scelta=10;}
- if (scelta == 9) {
- printf("\n--------------------------------------------------------\n");
- printf("\nGrazie per aver utilizzato il programma, buona giornata!\n");
- printf("\n--------------------------------------------------------\n");
- free(piatto);
- return 0;
- }
- }while (scelta<1 || scelta>9);
- return 0;
- }
- /* Portabilità. La funzione pulisce lo schermosia in winzozz che linux */
- void pulisci_schermata() {
- #ifdef _WIN32
- system("cls");
- #endif
- #ifdef linux
- system("clear");
- #endif
- }
- /* Carica la lista dei piatti precedentemente salvata,si occupa quindi di aggiungerne uno alla fine della lista,salvando poi i file*/
- void aggiungi_piatto() {
- piatto = realloc(piatto, (numpiatti+1) * sizeof(Globale)); // Preparo la memoria necessaria al nuovo piatto
- int i, tipopiatto, esiste=0; // Variabili di trigger varie
- printf("\n--------------------------------------------------------\n");
- printf("\n- INSERIMENTO NUOVO PIATTO -\n\n");
- piatto[numpiatti].ID = numpiatti;
- while (esiste == 0) {
- printf("Inserisci il nome del piatto: ");
- scanf("%s", piatto[numpiatti].nome);
- esiste = 1;
- for (i=0;i<numpiatti;i++)
- esiste *= strcmp(piatto[i].nome, piatto[numpiatti].nome);
- while (scelta<1 || scelta>9) /* Come funziona il for alla riga di codice precedente:
- strcmp(s1, s2) compara le stringhe restituendo un valore numerico intero.
- Questo intero è positivo o negativo se le stringhe sono diverse tra loro.
- La funzione restituisce zero se queste due stringhe sono uguali tra loro.
- Moltiplicare una variabile intera per l'intero restituito dalla funzione
- ci farà avere come risultato zero solo nel caso che vengano scoperte due
- stringhe uguali tra loro tra tutte quelle dell'elenco. Non succederà mai
- che capiti più di una moltiplicazione per zero poiché dovrebbero esserci
- più di due occorrenze dello stesso nome, il che è impossibile. */
- if (esiste == 0) printf("Il nome inserito e' gia' presente all'interno dell'elenco dei piatti.\n");
- }
- printf("Inserisci la tipologia, seguendo le istruzioni.\n");
- printf("Scrivi 0 per antipasto.\nScrivi 1 per primo.\nScrivi 2 per secondo.\nScrivi 3 per contorno.\nScrivi 4 per dessert.\n");
- printf("Inserisci ora la tipologia scelta: ");
- scanf("%d", &tipopiatto);
- if (tipopiatto == 0) piatto[numpiatti].tipologia = antipasto;
- if (tipopiatto == 1) piatto[numpiatti].tipologia = primo;
- if (tipopiatto == 2) piatto[numpiatti].tipologia = secondo;
- if (tipopiatto == 3) piatto[numpiatti].tipologia = contorno;
- if (tipopiatto == 4) piatto[numpiatti].tipologia = dessert;
- printf("Inserisci il primo ingrediente del piatto: ");
- scanf("%s", piatto[numpiatti].ingredienti[0]);
- printf("Inserisci il secondo ingrediente: ");
- scanf("%s", piatto[numpiatti].ingredienti[1]);
- printf("Inserisci il terzo: ");
- scanf("%s", piatto[numpiatti].ingredienti[2]);
- printf("Inserisci il prezzo, scrivendolo in formato numerico usando il punto e due cifre decimali (esempio: 2.00): ");
- scanf("%f", &piatto[numpiatti].prezzo);
- numpiatti++;
- FILE* totpiatti;
- totpiatti = fopen("num.dat", "wb");
- if (!totpiatti) exit(-1);
- fwrite(&numpiatti, sizeof(int), 1, totpiatti);
- fclose(totpiatti);
- FILE* listapiatti;
- listapiatti = fopen("list.dat", "wb");
- if (!listapiatti) exit(-1);
- fwrite(piatto, sizeof(Globale), numpiatti, listapiatti);
- fclose(listapiatti);
- printf("Inserimento completato.\n");
- printf("-----------------------\n");
- printf("Premi Invio per tornare al menu'.");
- fflush(stdin);
- getchar();
- /* fflush() pulisce il buffer per far sì che getchar() richieda effettivamente un carattere,
- anziché accontentarsi del \n posto automaticamente dal sistema per via dell'ultimo scanf. */
- }
- /* La funzione di modifica chiede all'utente di inserire il numero (l'ID) del piatto da modificare e
- dopo aver controllato il valore permette la modifica di tutti i campi del piatto. Il piatto viene
- salvato solo a modifica conclusa, poiché il file binario viene trascritto solo dopo l'inserimento. */
- void modifica_piatto() {
- int i, visualizza=2, modifica, tipopiatto;
- printf("\n--------------------------------------------------------\n");
- printf("\n- MODIFICA PIATTO ESISTENTE -\n\n");
- while (visualizza != 0 && visualizza != 1) {
- printf("Per modificare un piatto hai bisogno di conoscere il suo numero identificativo.\nPrima di proseguire, vuoi visualizzare l'elenco dei piatti?\nScrivi 1 per accettare, oppure 0 per proseguire: ");
- scanf("%d", &visualizza);
- }
- if (visualizza == 1) {
- for (i=0;i<numpiatti;i++) printf("- Piatto numero %d - Nome: %s\n", piatto[i].ID, piatto[i].nome);
- }
- printf("\nInserisci il numero identificativo del piatto da modificare: ");
- scanf("%d", &modifica);
- if (modifica > 0 && modifica < numpiatti) {// Il valore inserito è un piatto effettivo in elenco, si può proseguire
- // INIZIO BLOCCO DI CODICE PRINCIPALE
- printf("Inserisci il nuovo nome del piatto: ");
- scanf("%s", piatto[modifica].nome);
- printf("Inserisci la nuova tipologia, secondo lo schema seguente.\n");
- printf("Scrivi 0 per antipasto.\nScrivi 1 per primo.\nScrivi 2 per secondo.\nScrivi 3 per contorno.\nScrivi 4 per dessert.\n");
- printf("Inserisci ora la nuova tipologia scelta: ");
- scanf("%d", &tipopiatto);
- if (tipopiatto == 0) piatto[modifica].tipologia = antipasto;
- if (tipopiatto == 1) piatto[modifica].tipologia = primo;
- if (tipopiatto == 2) piatto[modifica].tipologia = secondo;
- if (tipopiatto == 3) piatto[modifica].tipologia = contorno;
- if (tipopiatto == 4) piatto[modifica].tipologia = dessert;
- printf("Inserisci il nuovo primo ingrediente del piatto: ");
- scanf("%s", piatto[modifica].ingredienti[0]);
- printf("Inserisci il nuovo secondo ingrediente: ");
- scanf("%s", piatto[modifica].ingredienti[1]);
- printf("Inserisci il nuovo terzo: ");
- scanf("%s", piatto[modifica].ingredienti[2]);
- printf("Inserisci il nuovo prezzo, scrivendolo in formato numerico usando il punto e due cifre decimali (esempio: 2.00): ");
- scanf("%f", &piatto[modifica].prezzo);
- // Salvo l'intero vettore nel file binario, una volta terminata la sua modifica
- FILE* listapiatti;
- listapiatti = fopen("list.dat", "wb");
- if (!listapiatti) exit(-1);
- fwrite(piatto, sizeof(Globale), numpiatti, listapiatti);
- fclose(listapiatti);
- printf("Modifica completata.\n");
- // FINE BLOCCO DI CODICE PRINCIPALE
- }
- else printf("Il numero di piatto inserito non e' presente in elenco. Ricomincia il procedimento.\n");
- printf("-----------------------\n");
- printf("Premi Invio per tornare al menu'.");
- fflush(stdin);
- getchar();
- /* fflush() pulisce il buffer per far sì che getchar() richieda effettivamente un carattere,
- anziché accontentarsi del \n posto automaticamente dal sistema per via dell'ultimo scanf. */
- }
- /* La funzione elimina un piatto dall'elenco (fornito all'utente), in base al suo ID.
- Eliminato il piatto gli indici del vettore shiftano di 1 dal punto eliminato fino
- all'ultimo membro del vettore, la memoria dinamica viene diminuita e alla fine si
- salva nuovamente l'intera lista tutta assieme nel file binario. */
- void elimina_piatto() {
- int i, visualizza=2, elimina;
- printf("\n--------------------------------------------------------\n");
- printf("\n- ELIMINAZIONE PIATTO ESISTENTE -\n\n");
- while (visualizza != 0 && visualizza != 1) {
- printf("Per eliminare un piatto hai bisogno di conoscere il suo numero identificativo.\nPrima di proseguire, vuoi visualizzare l'elenco dei piatti?\nScrivi 1 per accettare, oppure un altro numero per proseguire: ");
- scanf("%d", &visualizza);
- }
- if (visualizza == 1) {
- for (i=0;i<numpiatti;i++) printf("- Piatto numero %d - Nome: %s\n", piatto[i].ID, piatto[i].nome);
- }
- printf("\nInserisci il numero identificativo del piatto da eliminare: ");
- scanf("%d", &elimina);
- if (elimina > 0 && elimina < numpiatti) { // Il valore inserito è compreso nell'intervallo dei piatti, si può proseguire
- // INIZIO BLOCCO DI CODICE PRINCIPALE
- for (i=elimina;i<numpiatti;i++) {
- piatto[i] = piatto[i+1];
- piatto[i].ID--;
- }
- numpiatti--;
- piatto = realloc(piatto, (numpiatti) * sizeof(Globale));
- FILE* totpiatti;
- totpiatti = fopen("num.dat", "wb");
- if (!totpiatti) exit(-1);
- fwrite(&numpiatti, sizeof(int), 1, totpiatti);
- fclose(totpiatti);
- FILE* listapiatti;
- listapiatti = fopen("list.dat", "wb");
- if (!listapiatti) exit(-1);
- fwrite(piatto, sizeof(Globale), numpiatti, listapiatti);
- fclose(listapiatti);
- printf("Eliminazione completata.\n");
- // FINE BLOCCO DI CODICE PRINCIPALE
- }
- printf("-----------------------\n");
- printf("Premi Invio per tornare al menu'.");
- fflush(stdin);
- getchar();
- /* fflush() pulisce il buffer per far sì che getchar() richieda effettivamente un carattere,
- anziché accontentarsi del \n posto automaticamente dal sistema per via dell'ultimo scanf. */
- }
- /* La funzione più semplice di tutte. Selezionare il quarto
- comando fa visualizzare l'elenco completo dei piatti con
- tutti i dati per ogni singolo. */
- void visualizza_elenco() {
- int i;
- printf("\n--------------------------------------------------------\n");
- printf("\n- VISUALIZZAZIONE ELENCO -\n\n");
- for (i=0;i<numpiatti;i++) {
- printf("-----------------------\n");
- printf("- Piatto numero %d\n", piatto[i].ID);
- printf("Nome: %s\n", piatto[i].nome);
- printf("Tipologia: ");
- switch (piatto[i].tipologia) {
- case antipasto:
- printf("Antipasto\n");
- break;
- case primo:
- printf("Primo\n");
- break;
- case secondo:
- printf("Secondo\n");
- break;
- case contorno:
- printf("Contorno\n");
- break;
- case dessert:
- printf("Dessert\n");
- }
- printf("Ingrediente 1: %s\n", piatto[i].ingredienti[0]);
- // Stampa gli ingredienti 2 e 3 solo se non sono stringhe vuote
- if (strlen(piatto[i].ingredienti[1]) != 0) printf("Ingrediente 2: %s\n", piatto[i].ingredienti[1]);
- if (strlen(piatto[i].ingredienti[2]) != 0) printf("Ingrediente 3: %s\n", piatto[i].ingredienti[2]);
- printf("Prezzo: %.2f euro\n", piatto[i].prezzo);
- }
- printf("Stampa elenco completata.\n");
- printf("-----------------------\n");
- printf("Premi Invio per tornare al menu'.");
- fflush(stdin);
- getchar();
- /* fflush() pulisce il buffer per far sì che getchar() richieda effettivamente un carattere,
- anziché accontentarsi del \n posto automaticamente dal sistema per via dell'ultimo scanf. */
- }
- /* cerca_in_elenco() è simile alla funzione di semplice visualizzazione dei piatti
- poiché sfrutta bene o male lo stesso codice, con la differenza che la lista dei
- piatti viene ricavata in base ad una comparazione tra la stringa fatta inserire
- dall'utente e l'elenco degli ingredienti dei piatti. */
- void cerca_in_elenco() {
- int i, numtrovati=0, *trovati=NULL;
- char cerca[100];
- trovati = (int *) calloc(numtrovati, sizeof(int));
- printf("\n--------------------------------------------------------\n");
- printf("\n- RICERCA IN ELENCO TRAMITE INGREDIENTE -\n\n");
- printf("\nInserisci il nome dell'ingrediente da cercare (minuscole e maiuscole fanno differenza): ");
- scanf("%s", cerca);
- for (i=0;i<numpiatti;i++) {
- if (strcmp(cerca, piatto[i].ingredienti[0]) == 0 ||
- strcmp(cerca, piatto[i].ingredienti[1]) == 0 ||
- strcmp(cerca, piatto[i].ingredienti[2]) == 0) {
- numtrovati++;
- trovati = (int *) realloc(trovati, (numtrovati) * sizeof(int));
- trovati[numtrovati-1] = piatto[i].ID;
- }
- }
- if (numtrovati == 0) printf("\nNessun risultato trovato.\n");
- else {
- printf("\nStampa dell'elenco dei risultati trovati (hai cercato '%s'): ", cerca);
- for (i=0;i<numtrovati;i++) {
- printf("-----------------------\n");
- printf("- Piatto numero %d\n", piatto[trovati[i]].ID);
- printf("Nome: %s\n", piatto[trovati[i]].nome);
- printf("Tipologia: ");
- switch (piatto[trovati[i]].tipologia) {
- case antipasto:
- printf("Antipasto\n");
- break;
- case primo:
- printf("Primo\n");
- break;
- case secondo:
- printf("Secondo\n");
- break;
- case contorno:
- printf("Contorno\n");
- break;
- case dessert:
- printf("Dessert\n");
- }
- printf("Ingrediente 1: %s\n", piatto[trovati[i]].ingredienti[0]);
- if (strlen(piatto[trovati[i]].ingredienti[1]) != 0) printf("Ingrediente 2: %s\n", piatto[trovati[i]].ingredienti[1]);
- if (strlen(piatto[trovati[i]].ingredienti[2]) != 0) printf("Ingrediente 3: %s\n", piatto[trovati[i]].ingredienti[2]);
- printf("Prezzo: %.2f euro\n", piatto[trovati[i]].prezzo);
- }
- }
- printf("Stampa elenco risultati completata.\n");
- free(trovati);
- printf("-----------------------\n");
- printf("Premi Invio per tornare al menu'.");
- fflush(stdin);
- getchar();
- /* fflush() pulisce il buffer per far sì che getchar() richieda effettivamente un carattere,
- anziché accontentarsi del \n posto automaticamente dal sistema per via dell'ultimo scanf. */
- }
- /* Svolti i controlli sul numero (se esiste almeno un tavolo libero, se non è già
- stato aperto il tavolo, se il tavolo inserito supera l'intervallo) la funzione
- si preoccupa di predisporre un valore del vettore tavolo[] (con indice - 1 per
- via degli indici del vettore poiché vanno da 0 a max - 1) in modo che abbia la
- possibilità di accettare degli ordini al suo interno. */
- void crea_nuovo_scontrino() {
- int i, numscontrino, liberi=0, esiste=0;
- printf("\n--------------------------------------------------------\n");
- printf("\n- CREAZIONE NUOVO SCONTRINO AL TAVOLO -\n\n");
- // Cerca un tavolo libero (dove libero = valore 16 pre-impostato)
- for (i=0;i<15;i++) if (tavolo[i].ID == 16) liberi++;
- if (liberi > 0) { // Esiste almeno un tavolo accessibile, l'esecuzione può proseguire
- printf("\nInserisci il numero del tavolo di cui creare il nuovo scontrino: ");
- scanf("%d", &numscontrino);
- // Controlla che il tavolo non sia già stato aperto
- for (i=0;i<15;i++) if (tavolo[i].ID == numscontrino) esiste=1;
- if (numscontrino > 0 && numscontrino < 16) {
- if (esiste == 0) { // Se il tavolo non è già stato aperto, si può proseguire
- // INIZIO BLOCCO DI CODICE PRINCIPALE
- // Il tavolo numero 1 avrà ID = 0, il tavolo 15 avrà ID = 14.
- tavolo[numscontrino-1].ID = numscontrino;
- // Inizializzo l'array degli ordini usando un valore predefinito che userò in seguito come trigger.
- for (i=0;i<100;i++) tavolo[numscontrino-1].ordini[i] = 200;
- printf("\nCreazione nuovo scontrino completata.\nUtilizza la funzione 7 per aggiungere ordini allo scontrino.\n");
- // FINE DEL BLOCCO DI CODICE PRINCIPALE
- }
- else printf("\nIl tavolo da te inserito possiede gia' uno scontrino aperto. Chiudilo prima di aprirne uno nuovo.\n");
- }
- else printf("\nIl numero da te inserito supera l'intervallo 1-15, non esiste un tavolo relativo a quel valore.\n");
- }
- else printf("\nTutti gli scontrini disponibili sono stati aperti. Prima di aprirne uno nuovo, chiudine il precedente.\n");
- printf("-----------------------\n");
- printf("Premi Invio per tornare al menu'.");
- fflush(stdin);
- getchar();
- /* fflush() pulisce il buffer per far sì che getchar() richieda effettivamente un carattere,
- anziché accontentarsi del \n posto automaticamente dal sistema per via dell'ultimo scanf. */
- }
- /* Svolti i dovuti controlli (se almeno un tavolo è accessibile, se il tavolo scelto
- è aperto, se il patto scelto per l'ordine esiste) la funzione aggiunge alla lista
- del tavolo scelto l'ordine inserito dall'utente in base al suo ID. */
- void aggiungi_ordine() {
- int aperti=0, esiste=0, esistepiatto=0, i, j, numtavolo, numordine, indice=100, visualizza;
- printf("\n--------------------------------------------------------\n");
- printf("\n- AGGIUNTA ORDINE AL TAVOLO -\n\n");
- // Cerca un tavolo aperto
- for (i=0;i<15;i++) if (tavolo[i].ID != 16) aperti++;
- if (aperti > 0) { // Esiste almeno un tavolo aperto, posso proseguire
- printf("Inserisci il numero del tavolo a cui aggiungere un ordine: ");
- scanf("%d", &numtavolo);
- // Cerco il tavolo scelto dall'utente nella lista
- for (i=0;i<15;i++) if (tavolo[i].ID == numtavolo) esiste=1;
- if (esiste == 1) { // Il tavolo scelto e' stato gia' aperto, posso proseguire
- // Le tre righe successive stampano a scelta dell'utente la lista dei piatti
- printf("Per aggiungere un ordine hai bisogno di conoscere il suo numero identificativo.\nPrima di proseguire, vuoi visualizzare l'elenco dei piatti?\nScrivi 1 per accettare, oppure un altro numero per proseguire: ");
- scanf("%d", &visualizza);
- if (visualizza == 1) for (i=0;i<numpiatti;i++) printf("- Piatto numero %d - Nome: %s\n", piatto[i].ID, piatto[i].nome);
- printf("Inserisci il numero del piatto da aggiungere come ordine: ");
- scanf("%d", &numordine);
- // Cerco il piatto inserito nella lista dei piatti
- for (i=0;i<numpiatti;i++) if (piatto[i].ID == numordine) esistepiatto=1;
- if (esistepiatto == 1) { // Il piatto inserito esiste, si può proseguire
- // INIZIO BLOCCO DI CODICE PRINCIPALE
- for (i=0;i<numpiatti;i++) {
- if (piatto[i].ID == numordine) {
- // Trovato il piatto, ed allora lo aggiungo al primo indice libero più piccolo
- for (j=99;j>=0;j--) if (tavolo[numtavolo-1].ordini[j] == 200) indice--;
- // printf("l'indice e' %d", indice);
- tavolo[numtavolo-1].ordini[indice] = numordine;
- // Ora il tavolo contiene l'ID dell'ordine, cioé del piatto
- }
- }
- printf("\nAggiunta nuovo ordine completata.\nUtilizza la funzione 8 per stampare lo scontrino o la 7 per aggiungere un altro piatto.\n");
- // FINE BLOCCO DI CODICE PRINCIPALE
- }
- else printf("\nIl numero di piatto inserito non e' presente nella lista. Ricominciare il processo di aggiunta.\n");
- }
- else printf("\nPer il tavolo selezionato non e' ancora stato aperto uno scontrino. Aprine uno prima di proseguire.\n");
- }
- else printf("\nPer nessun tavolo e' stato ancora aperto uno scontrino. Aprine uno prima di proseguire.\n");
- printf("-----------------------\n");
- printf("Premi Invio per tornare al menu'.");
- fflush(stdin);
- getchar();
- /* fflush() pulisce il buffer per far sì che getchar() richieda effettivamente un carattere,
- anziché accontentarsi del \n posto automaticamente dal sistema per via dell'ultimo scanf. */
- }
- /* La funzione più complessa, si preoccupa, una volta fatti i dovuti controlli (se esistono scontrini
- aperti e se lo scontrino scelto dall'utente è aperto) recupera la lista di ordini e, dopo che l'ha
- organizzata nel vettore struttura per contare le occorrenze, restituisce la stampa dello scontrino
- sia su console che sui due files di testo. Al termine dell'operazione, resetta lo scontrino. */
- void stampa_scontrino() {
- // occtipologia[5] si basa sullo stesso ordine dell'enumerazione
- int aperti=0, esiste=0, occorrenzetot=0, i, j, k, numscontrino, occtipologia[5]={0,0,0,0,0};
- Numerordine* occorrenze;
- float totale=0;
- occorrenze = calloc(numpiatti, sizeof(Numerordine));
- printf("\n--------------------------------------------------------\n");
- printf("\n- STAMPA E CHIUSURA SCONTRINO -\n");
- for (i=0;i<15;i++) if (tavolo[i].ID != 16) aperti++;
- if (aperti > 0) { // Almeno uno scontrino è già stato aperto, posso proseguire
- printf("\nInserisci il numero del tavolo di cui stampare a schermo lo scontrino: ");
- scanf("%d", &numscontrino);
- for (i=0;i<15;i++) if (tavolo[i].ID == numscontrino) esiste=1;
- if (esiste == 1) { // Il numero di tavolo inserito possiede uno scontrino aperto, posso proseguire
- // Resetto le occorrenze per la stampa dello scontrino
- for (i=0;i<numpiatti;i++) occorrenze[i].ID = piatto[i].ID;
- // TODO: I VARI CONTROLLI
- // INIZIO BLOCCO DI CODICE PRINCIPALE
- for (i=0;i<100;i++) {
- if (tavolo[numscontrino-1].ordini[i] != 200) {
- // Faccio un controllo al quadrato per verificare le occorrenze degli ordini e nel caso cerco l'ID da incrementare
- for (j=0;j<100;j++) {
- if (tavolo[numscontrino-1].ordini[i] == tavolo[numscontrino-1].ordini[j]) {
- for (k=0;k<numpiatti;k++) {
- if (occorrenze[k].ID == tavolo[numscontrino-1].ordini[i]) {
- occorrenze[k].occorrenze++;
- occorrenzetot++;
- // printf("Aggiunta occorrenza del piatto con ID %d\n", tavolo[numscontrino-1].ordini[i]);
- }
- }
- }
- }
- }
- }
- if (occorrenzetot > 0) { // Esiste almeno un ordine nello scontrino, si può proseguire
- /* Dato che il numero delle occorrenze esce sempre al quadrato, mi basta ricavarne la radice.
- In aggiunta, controllo le occorrenze trovate ed aumento il numero delle tipologie trovate.*/
- for (k=0;k<numpiatti;k++) if (occorrenze[k].occorrenze != 0) {
- occorrenze[k].occorrenze = sqrt(occorrenze[k].occorrenze);
- switch (piatto[occorrenze[k].ID].tipologia) {
- case antipasto:
- occtipologia[0]++;
- break;
- case primo:
- occtipologia[1]++;
- break;
- case secondo:
- occtipologia[2]++;
- break;
- case contorno:
- occtipologia[3]++;
- break;
- case dessert:
- occtipologia[4]++;
- break;
- }
- }
- /* for (j=0;j<numpiatti;j++) printf("Il piatto con ID %d e' stato ordinato %d volte\n", occorrenze[j].ID, occorrenze[j].occorrenze); */
- // Comincio la stampa sui due files
- FILE* scontrino = NULL;
- scontrino = fopen("scontrino.txt", "w");
- FILE* registro = NULL;
- registro = fopen("registro.txt", "a");
- fprintf(scontrino, "\nTavolo: %d\n\n", numscontrino);
- fprintf(registro, "\nTavolo: %d\n\n", numscontrino);
- printf("\nTavolo: %d\n\n", numscontrino);
- if (occtipologia[0] > 0) {
- fprintf(scontrino, "Antipasti: \n");
- fprintf(registro, "Antipasti: \n");
- printf("Antipasti: \n");
- for (k=0;k<numpiatti;k++) {
- if (piatto[occorrenze[k].ID].tipologia == antipasto && occorrenze[k].occorrenze > 0) {
- fprintf(scontrino, "- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- fprintf(registro, "- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- printf("- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- }
- }
- }
- if (occtipologia[1] > 0) {
- fprintf(scontrino, "Primi: \n");
- fprintf(registro, "Primi: \n");
- printf("Primi: \n");
- for (k=0;k<numpiatti;k++) {
- if (piatto[occorrenze[k].ID].tipologia == primo && occorrenze[k].occorrenze > 0) {
- fprintf(scontrino, "- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- fprintf(registro, "- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- printf("- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- }
- }
- }
- if (occtipologia[2] > 0) {
- fprintf(scontrino, "Secondi: \n");
- fprintf(registro, "Secondi: \n");
- printf("Secondi: \n");
- for (k=0;k<numpiatti;k++) {
- if (piatto[occorrenze[k].ID].tipologia == secondo && occorrenze[k].occorrenze > 0) {
- fprintf(scontrino, "- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- fprintf(registro, "- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- printf("- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- }
- }
- }
- if (occtipologia[3] > 0) {
- fprintf(scontrino, "Contorni: \n");
- fprintf(registro, "Contorni: \n");
- printf("Contorni: \n");
- for (k=0;k<numpiatti;k++) {
- if (piatto[occorrenze[k].ID].tipologia == contorno && occorrenze[k].occorrenze > 0) {
- fprintf(scontrino, "- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- fprintf(registro, "- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- printf("- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- }
- }
- }
- if (occtipologia[4] > 0) {
- fprintf(scontrino, "Desserts: \n");
- fprintf(registro, "Desserts: \n");
- printf("Desserts: \n");
- for (k=0;k<numpiatti;k++) {
- if (piatto[occorrenze[k].ID].tipologia == dessert && occorrenze[k].occorrenze > 0) {
- fprintf(scontrino, "- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- fprintf(registro, "- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- printf("- %d x %s - euro %.2f\n", occorrenze[k].occorrenze, piatto[occorrenze[k].ID].nome, piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze);
- }
- }
- }
- for (k=0;k<numpiatti;k++) if (occorrenze[k].occorrenze != 0) totale += piatto[occorrenze[k].ID].prezzo*occorrenze[k].occorrenze;
- fprintf(scontrino, "\nImporto parziale: %.2f\n", totale);
- fprintf(registro, "\nImporto parziale: %.2f\n", totale);
- printf("\nImporto parziale: %.2f\n", totale);
- if (totale > 40.00) {
- fprintf(scontrino, "Valore sconto (10%%): %.2f\n", totale*0.10);
- fprintf(scontrino, "Importo totale: %.2f\n", totale*0.90);
- fprintf(registro, "Valore sconto (10%%): %.2f\n", totale*0.10);
- fprintf(registro, "Importo totale: %.2f\n", totale*0.90);
- printf("Valore sconto (10%%): %.2f\n", totale*0.10);
- printf("Importo totale: %.2f\n", totale*0.90);
- }
- fprintf(registro, "-----------------------\n\n");
- fclose(scontrino);
- fclose(registro);
- free(occorrenze);
- // Resetto l'ID del tavolo
- tavolo[numscontrino-1].ID = 16;
- // Re-imposto i valori dell'array in modo che non compaiano come nuovi ordini
- for (i=0;i<100;i++) tavolo[numscontrino-1].ordini[i] = 200;
- printf("Stampa dello scontrino completata.\nControlla i files scontrino.txt e registro.txt.\n\n");
- // FINE BLOCCO DI CODICE PRINCIPALE
- }
- else printf("\nNello scontrino non e' presente alcun ordine. Inserire un ordine prima di proseguire.\n");
- }
- else printf("\nIl tavolo inserito non ha ancora uno scontrino aperto. Aprirne uno prima di proseguire.\n");
- }
- else printf("\nPer nessun tavolo e' stato ancora aperto uno scontrino. Aprirne uno prima di proseguire.\n");
- printf("-----------------------\n");
- printf("Premi Invio per tornare al menu'.");
- fflush(stdin);
- getchar();
- /* fflush() pulisce il buffer per far sì che getchar() richieda effettivamente un carattere,
- anziché accontentarsi del \n posto automaticamente dal sistema per via dell'ultimo scanf. */
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement