#include #include #include #include /* abbastanza grande da contenere un piatto */ #define MAX_STR 100 /* file con lista di piatti */ #define PIATTI "piatti_01.txt" /* file con ordinazioni */ #define ORDINAZIONI "ordinazioni_01.txt" typedef struct piatto { char *nome; double prezzo; struct piatto *prox; } piatto_t; void InserisciPiatto(piatto_t **lista, char *nome, double prezzo); double PrezzoPiatto(piatto_t *lista, char *nome); int main(int argc, char *argv[]) { FILE *f; char piatti[30] = PIATTI; char ordinazioni[30] = ORDINAZIONI; piatto_t *lista = NULL, *p; char nome[MAX_STR]; double prezzo, totale, pranzo; int cont, FINE; /* legge la lista dei piatti */ f = fopen(piatti, "rt"); if (f == NULL) { printf("ERRORE: problema apertura in lettura (%s)\n", piatti); return -1; } FINE = 0; while (!feof(f)) { FINE = (fscanf(f, "%s %lf", nome, &prezzo) != 2); if (!FINE && !feof(f)) { InserisciPiatto(&lista, nome, prezzo); /* printf("%s %lf -- %s %lf\n", nome, prezzo, lista->nome, lista->prezzo); */ } } fclose(f); /* debug */ if (0) { piatto_t *p; printf("-----------\n"); p = lista; while (p != NULL) { printf("%s %lf\n", p->nome, p->prezzo); p = p->prox; } printf("-----------\n"); } /* fine debug*/ /* legge la lista delle ordinazioni */ f = fopen(ordinazioni, "rt"); if (f == NULL) { printf("ERRORE: problema apertura in lettura (%s)\n", ordinazioni); return -1; } FINE = 0; totale = 0.0; while (!feof(f)) { /* ogni ordinazione รจ costituita da cinque piatti, coperto, servizio e sconto*/ char piatto[MAX_STR], piatto1[MAX_STR], piatto2[MAX_STR], piatto3[MAX_STR], piatto4[MAX_STR], piatto5[MAX_STR]; double coperto, servizio, sconto; int i; pranzo = 0.0; /* legge 5 piatti e somma il loro prezzo */ for (i=0; i<5; i++) { FINE = (fscanf(f, "%s", piatto) != 1); if (!FINE && !feof(f)) { pranzo += PrezzoPiatto(lista, piatto); /* printf("%d %s\n", i, piatto); */ } } if (!FINE && !feof(f)) { /* attenzione allo spazio prima di "Coperto" */ FINE = (fscanf(f, " Coperto: %lf Servizio: %lf%% Sconto: %lf%%", &coperto, &servizio, &sconto) != 3); if (!FINE && !feof(f)) { pranzo += coperto; pranzo += round((pranzo*(servizio/100.0))*100.0)/100.0; pranzo -= round((pranzo*sconto/100)*100)/100; /* printf("-- %.2lf\n", pranzo); */ totale += pranzo; } } } fclose(f); printf("%.2lf\n", totale); return 0; } void InserisciPiatto(piatto_t **lista, char *nome, double prezzo) { /* inserisce un elemento nella lista */ piatto_t *p; /* inserisce il nuovo valore in testa alla lista */ /* la ricerca sarebbe piu' rapida se l'inserimento fosse ordinato, ma dati i numeri in gioco non ne vale la pena */ p = malloc(sizeof(piatto_t)); if (p == NULL) { printf("Errore allocamento\n"); exit(-1); } p->nome = malloc(sizeof(char)*strlen(nome)+1); if (p->nome == NULL) { printf("Errore allocamento\n"); exit(-1); } strcpy(p->nome, nome); p->prezzo = prezzo; p->prox = *lista; *lista = p; } double PrezzoPiatto(piatto_t *lista, char *nome) { /* cerca un elemento nella lista */ /* restituisce il prezzo se la stringa nome e' presente, 0.0 altrimenti */ piatto_t *p; p = lista; while (p != NULL) { if (strcmp(nome, p->nome) == 0) { return p->prezzo; } p = p->prox; } printf("Piatto non trovato (%s)\n", nome); exit(-1); return 0.0; }