Il supermercato AlgoLunga vende prodotti di tutti i tipi. Ciascun prodotto è identificata da un identificativo, e ogni prodotto ha una descrizione e un prezzo. Tali informazioni possono cambiare nel tempo.
Dovete scrivere un programma che gestisce i dati relativi ai prodotti mediante un dizionario, e usarlo in particolare per calcolare la somma dei prezzi di una serie di prodotti.
Completate/adattate il programma che trovate in calce, che contiene un'implementazione del dizionario con una tabella di hash.
Il programma deve leggere una sequenza di comandi, tra i seguenti:
+ id descrizione prezzo
: legge e memorizza i dettagli relativi al prodotto identificato da id;
se è già stato inserito un prodotto identificato da id, aggiorna le informazioni relative.! id
: stampa il prezzo del prodotto identificato da id
; se non esistono prodotti identificati da id
, stampa un messaggio su standard outputn id1 id2 ... idn
, dove n
è un numero intero: stampa la somma dei prezzi degli n
prodotti identificati da id1
, id2
, ..., idn
; se qualche id è inesistente nel dizionario, stampa un messaggio su standard output e prosegue ignorando l'id inesistente.p
: stampa, uno per riga, i prodotti con id, descrizione e prezzo.f
: termina il programma.Potete assumere che:
Eseguendo
./soluzione
avendo nel flusso di ingresso:
+ 1Abc formaggio 10+ qqZ vino 20+ asd fragole 11! fragole! asd4 1Abc 1Abc qqZ asd10 1Abc qqZ asd AAA b c d e f gpf
il programma emette sul flusso di uscita:
Non esiste il prodotto <fragole>Il prezzo di <asd> e' 11Il totale è 51 per 4 prodottiNon esiste il prodotto <AAA>Non esiste il prodotto <b>Non esiste il prodotto <c>Non esiste il prodotto <d>Non esiste il prodotto <e>Non esiste il prodotto <f>Non esiste il prodotto <g>Il totale è 41 per 3 prodottikey: 1Abc, descrizione: formaggio, prezzo: 10key: qqZ, descrizione: vino, prezzo: 20key: asd, descrizione: fragole, prezzo: 11
// PRODOTTItypedef struct prodotto*Item;Itemvoid// ELEMENTO DI LISTAstruct element;// LISTA DI COLLISIONEtypedef struct element *List;Item ;List ; // crea nuovo elemento, lo inserisce in testa alla catena e restituisce l'indirizzo della nuova testavoid ;// DIZIONARIO IMPLEMENTATO CON HASHTABLEtypedef struct ht*Dict;Dict ;void ;Item ; // Restituisce l'Item con chiave key, oppure NULL se key non è nel dizionariovoid ; // aggiunge l'item p nel dizionariounsigned long ; // funzione di hash/* MAIN**************/int/* FUNZIONI DI GESTIONE DELLA CHAIN (lista)*******************************************/// Inserisce in testa e restituisce la nuova testa.List/* Cerca un item con chiave key nella list c. Se lo trova ne restituisce l'indirizzo, altrimenti restituisce NULL. */Item/* Stampa gli elementi della Lista di trabocco */void/* FUNZIONI DI GESTIONE DELLA HASHTABLE*******************************************/// Crea una hastable di con HASHSIZE bucketsDict// funzione di hashunsigned long// cerca l'item con chiave keyItem// inserisce l'item nel dizionariovoid// inserisce l'item nel dizionariovoid