PDA

View Full Version : [C++] Esercizio gestione pasticceria


mistergks
01-04-2011, 18:29
Non riesco a risolvere questo esercizio:
Il nostro amico Ciccio Pasticcio e la sua dolce mogliettina Renata Limbranata hanno preso in gestione una pasticceria. Renata prepara i dolci, mentre Ciccio si occupa di prendere le ordinazioni dei clienti e fare la spesa necessaria a Renata per realizzare il dolce così come indicato sul suo libro di ricette.
Tuttavia, Ciccio come al solito fa molti pasticci, sbaglia nel prendere le ordinazioni segnando un dolce per un altro e dimentica sempre di comprare qualche ingrediente. Renata, disperata poiché per colpa di Ciccio finora non è riuscita a soddisfare nessun cliente, ci chiede aiuto. A tale scopo si scriva in C++ un programma completo opportunamente modularizzato in funzioni che 1) mostri al cliente l’elenco dei dolci tra cui può scegliere, e ne prenda l’ordinazione; 2) cerchi nel libro di ricette di Renata la ricetta corrispondente al dolce scelto e 3) compili la lista della spesa evitando di aggiungere alla lista ingredienti già presenti nella dispensa. Il libro di ricette è un elenco di stringhe ognuna delle quali ha il seguente formato:

Nome della Ricetta. Ingredienti: ingrediente1, ingrediente2, …,ingredienteN.
Preparazione: istruzione1, istruzione2, …, istruzioneK.

Esempio: un cliente entra nella pasticceria e Ciccio mostra il seguente menù:
1) Torta Al Cioccolato e Panna
2) Tiramisù
3) Bavarese alle Fragole
...
Supponiamo che il cliente scelga il Tiramisù. Allora il programma accede nel libro delle ricette alla posizione corrispondente al Tiramisù ed, esaminando la stringa ivi contenuta, ad esempio

Tiramisù. Ingredienti: zucchero, uova, biscotti, mascarpone, caffè. Preparazione: unire le uova con lo zucchero, aggiungere il mascarpone, etc.

recupera gli ingredienti zucchero, uova, biscotti, mascarpone, caffè, controlla nella dispensa quale di questi è già presente e aggiunge i mancanti nella lista della spesa. Supponendo che nella dispensa siano presenti uova, cioccolato, mascarpone, farina, lievito la lista della spesa dovrà contenere zucchero, biscotti e caffè.



Ho provato ad implementare qualcosa e per ora sono riuscito a fare soltanto una funzione che mostri il menu al cliente.. può andare?! sono indeciso su cosa usare per fare questo libro delle ricette... all'inizio avevo pensato ad un array di char ma poi ho dovuto farla diventare una matrice...altrimenti non potevo stampare solo i nomi delle ricette...

Poi avrei pensato di fare un'altra funzione che prende in input la scelta(ordinazione) del cliente e che mi dia gli ingredienti di quella determinata ordinazione da inserire poi magari con un altra funzione in un nuovo array di char chiamato "lista della spesa". Fatto questo, penso che bisogna assumere che esista già un array in cui sono inseriti gli ingredienti già in dispensa(almeno credo!) e quindi mi serve una funzione che verifichi se la "listadellaspesa" contiene ingredienti uguali alla "listadelladispensa". Se li contiene dovrebbe eliminarli da "listadellaspesa"...




void menu(char ricette[][], int dim) {
for(int i=0; ricette[i][j]!= '\0'; i++)
for(int j=0; ricette[i][j]!='.'; i++)

cout<<"menu: "<< ricette[i][j];

}

mistergks
02-04-2011, 16:39
up

Roran
02-04-2011, 17:10
Scusa ma non ti conviene creare una classe dolce e dentro la organizzi con una stringa per il nome del dolce,un array di stringhe per gli ingredienti (o direttamente una stringa con un separatore tra gli ingredienti),una stringa per le istruzioni,dopodichè ti basta creare un array di dolce ed è fatta.

mistergks
02-04-2011, 17:17
eh magari :muro:
"Purtroppo" sto preparando un esame di FONDAMENTI di c++ ..quindi ancora niente classi!
Il programma comprende: costrutti principali del c++, funzioni, array, puntatori..

Roran
02-04-2011, 18:05
nemmeno le struct del C puoi utilizzare?

tomminno
02-04-2011, 19:02
A tale scopo si scriva in C++ un programma completo opportunamente modularizzato in funzioni

"Purtroppo" sto preparando un esame di FONDAMENTI di c++ ..quindi ancora niente classi!


Ci sarebbe da prendere il tizio che tiene questo corso e cacciarlo a pedate dall'università.
Un corso di fondamenti di C++ che non insegna le classi equivale a un corso di C.

mistergks
02-04-2011, 19:40
ma no dai! per le classi c'è un altro corso..dopo fondamenti...c'è programmazione ad oggetti che va dalle classi in poi... poi ancora c'è algoritmi e strutture dati che va piu' nello specifico..
Ma possibile che non ci sia nessun modo per rappresentare questo "LIBRO DELLE RICETTE" senza usare le classi o struct?

Roran
02-04-2011, 20:38
ma no dai! per le classi c'è un altro corso..dopo fondamenti...c'è programmazione ad oggetti che va dalle classi in poi... poi ancora c'è algoritmi e strutture dati che va piu' nello specifico..
Ma possibile che non ci sia nessun modo per rappresentare questo "LIBRO DELLE RICETTE" senza usare le classi o struct?così è un po' difficile,potresti usare un vettore di stringhe e riservare 3 indici per volta,uno per il nome,uno per gli ingredienti e uno per le istruzioni (grandezza vettore 3x numero di dolci),potrebbe andare?

mistergks
03-04-2011, 00:24
Non so... tu dici di usare una matrice?E poi come faccio a fare le verifiche?
Cioè come faccio a prendere solo gli ingredienti e metterli in un nuovo array per creare la "lista della spesa"?
vi prego... leggete bene e aiutatemiii...sono nei guai e ho poco tempo:mc:

goldorak
03-04-2011, 07:45
Non so... tu dici di usare una matrice?E poi come faccio a fare le verifiche?
Cioè come faccio a prendere solo gli ingredienti e metterli in un nuovo array per creare la "lista della spesa"?
vi prego... leggete bene e aiutatemiii...sono nei guai e ho poco tempo:mc:




Ti serve (una tra le possibili soluzioni)


un array indicizzato sulle ricette che ti restituisce la lista degli ingredienti
una lista della spesa (implementata con puntatori)
una lista che ti rappresenta la dispensa.

mistergks
03-04-2011, 11:10
Intendi le liste come strutture dati?? se si non posso usare come detto prima.. posso usare solo array come strutture dati.
Per array indicizzati cosa intendi? E per array con puntatori? questo? char *lista="lista......";

Mi servirebbe qualcosa per inserire un elenco di quel formato:
Nome della Ricetta. Ingredienti: ingrediente1, ingrediente2, …,ingredienteN.
Preparazione: istruzione1, istruzione2, …, istruzioneK.
Sicuramente non ce ne sarà una sola...ma saranno tante frasi del genere per ogni "Nome della Ricetta". cioè ci sarà il tiramisu', la torta ecc...quindi serve un array immenso..boh..:muro:

goldorak
03-04-2011, 12:23
eh magari :muro:
"Purtroppo" sto preparando un esame di FONDAMENTI di c++ ..quindi ancora niente classi!
Il programma comprende: costrutti principali del c++, funzioni, array, puntatori..

Intendi le liste come strutture dati?? se si non posso usare come detto prima.. posso usare solo array come strutture dati.
Per array indicizzati cosa intendi? E per array con puntatori? questo? char *lista="lista......";

Mi servirebbe qualcosa per inserire un elenco di quel formato:
Nome della Ricetta. Ingredienti: ingrediente1, ingrediente2, …,ingredienteN.
Preparazione: istruzione1, istruzione2, …, istruzioneK.
Sicuramente non ce ne sarà una sola...ma saranno tante frasi del genere per ogni "Nome della Ricetta". cioè ci sarà il tiramisu', la torta ecc...quindi serve un array immenso..boh..:muro:

L'hai detto tu stesso che il programma di fondamenti di c++ tocca l'uso dei puntatori. Io ti ho solo dato un consiglio, usare delle liste come strutture dati (facilmente implementabili medianti puntatori). Oppure puoi usare la libreria standard del C++ ma non credo che sia questo quello che il docente vuole. :sofico:

Puoi usare un tipo enumerativo per elecare tutte le ricette (questo e' un dato di input del problema), e poi usi questi valori come indice per accedere alla voce corrispondente nel array delle ricette da cui recuperi la lista degi ingredienti. Una volta che hai questa lista, prendi ingredient1, ingrediente2, etc... come chiavi di ricerca nella dispensa per verificare se siano o meno presenti. Se ingrediente_k non e' presente nella dispensa la inserisci nella lista della spesa, altrimenti no (visto che e' gia' presente nella dispensa).

mistergks
03-04-2011, 14:32
Puoi usare un tipo enumerativo per elecare tutte le ricette (questo e' un dato di input del problema), e poi usi questi valori come indice per accedere alla voce corrispondente nel array delle ricette da cui recuperi la lista degi ingredienti.

Quindi devo fare un enumerazione enum ricetta={torta al cioccolato=1; tiramisu=2; ecc..}??? e poi metto questi numeri all'interno di un array di int?come recupero la lista degli ingredienti?

Roran
03-04-2011, 15:02
Non so... tu dici di usare una matrice?E poi come faccio a fare le verifiche?
Cioè come faccio a prendere solo gli ingredienti e metterli in un nuovo array per creare la "lista della spesa"?
vi prego... leggete bene e aiutatemiii...sono nei guai e ho poco tempo:mc:Io dicevo di usare una matrice con 3 colonne per riga dove gli indici colonna sono utilizzati così: uno per il nome,uno per gli ingredienti,uno per le istruzioni (ovviamente una matrice di stringhe).Successivamente puoi usare un array per la dispensa e uno per la lista della spesa,per fare le verifiche fai un controllo carattere per carattere sulla stringa degli ingredienti di un dolce confrontando ogni parola (delimitata da un separatore,per esempio una semplice virgola) con la parola (questa volta singola stringa,solo un ingrediente) nell'indice dell'array dispensa,se non ci sono occorrenze aggiungi l'ingrediente all'array della lista della spesa (ovviamente ti conviene dargli una dimensione fissa).Che ne pensi?

mistergks
04-04-2011, 22:03
ma così facendo non si perde il formato richiesto dalla traccia?
Essa dice:

Il libro di ricette è un elenco di stringhe ognuna delle quali ha il seguente formato:
Nome della Ricetta. Ingredienti: ingrediente1, ingrediente2, …,ingredienteN.
Preparazione: istruzione1, istruzione2, …, istruzioneK.


Forse vogliono la stringa in un unico array?

Roran
06-04-2011, 09:23
ma così facendo non si perde il formato richiesto dalla traccia?
Essa dice:

Il libro di ricette è un elenco di stringhe ognuna delle quali ha il seguente formato:
Nome della Ricetta. Ingredienti: ingrediente1, ingrediente2, …,ingredienteN.
Preparazione: istruzione1, istruzione2, …, istruzioneK.


Forse vogliono la stringa in un unico array?no,assolutamente,con le 3 colonne per riga ci gestisci le 3 stringhe per ogni dolce,ti basta associare l'indice riga/colonna d'interesse alla stringa

mistergks
06-04-2011, 17:33
ho provato a buttare giù il codice completo..naturalmente non compila e ho parecchi dubbi:
inizio con quello sulla matrice di puntatori char *ricette[][]..va messo un solo asterisco? va allocata dinamicamente?

ecco il codice.. Non finirò mai di ringraziare chi mi risolverà la questione :)


#include <iostream>
using namespace std;


void menu(char *ricette[][], int m, int n); //stampa il menu
int posizione_ricetta(char *[][], int); //stampa posizione ricetta in base all'ordinazione
void compilaspesa(char *[][], int, char*[],int); //compila lista della spesa

int main(){
const int m=100, n=3, dim_disp=50;

char *ricette[m][n]={{"tiramisu","zucchero-uova-biscotti-mascarpone-caffè.","unire uova con zucchero,aggiungere mascarpone"},
{"torta al cioccolato", "zucchero-uova-panna-cacao.","unire uova,aggiungere panna"}
{"bavarese", "zucchero-uova-cacao.","unire uova,aggiungere cacao"}};
char *dispensa[dim_disp]={"uova","zucchero","panna","cacao"};

cout<<"salve, ecco il menu dei dolci"<<endl;
menu(ricette,m,n);

compilalistaspesa(ricette,m,n,dispensa,dim_disp);

return 0;
}

void menu(char *ricette[][], int m, int n){
char ordinazione[20];
for(int i=0; i<m; i++)
cout<<ricette[i][0];
cout<<"cosa si desidera ordinare?"<<endl; cin>>ordinazione;
}


int posizione_ricetta(char *[][], int){
int posizione_ricetta=0;
for(int i=0; i<m; i++){
if(ordinazione==ricette[i][0])
posizione_ricetta=i;
}
return posizione_ricetta;
}


void compilaspesa(char *[][], int, char*[],int){
char *listaspesa[50];
posizione_ricetta(ricette, m);
while(ricette[posizione_ricetta][1] != '.'){//ho usato un terminatore punto per gli ingredienti
for(int i=0; ricette[posizione_ricetta][1]!= '-'; i++){
if(ricette[posizione_ricetta][1] != dispensa[i])
listaspesa[i]=ricette[posizione_ricetta][1];
}//for
}//while
}