Compito di Fondamenti di Informatica In un magazzino viene utilizzato un archivio informatico, nel quale vengono memorizzate le informazioni relative ai prodotti contenuti nel magazzino e che ne permette la visualizzazione e la vendita. La struttura dati utilizzata è costituita da un vettore di liste. Il vettore ha dimensione n, fissata dall utente all inizio del programma (il vettore è dinamico). Ogni elemento del vettore contiene una lista i cui elementi hanno la seguente struttura: Collocazione nel Magazzino, Intero compreso tra 0 e n-1 Codice Prodotto, Stringa di 5 caratteri Prezzo Unitario, Intero senza segno Numero Pezzi Presenti in Magazzino, Intero senza segno Il campo Numero Pezzi Presenti in Magazzino assume il valore zero quando non sono più presenti pezzi di quel prodotto. Esso viene decrementato per ogni vendita di quel prodotto. Si suppone che ciascun ADT Lista sia realizzato con puntatori e che sia ordinato per Codice Prodotto. Si suppone che il campo Collocazione nel Magazzino sia un numero intero compreso tra 0 e n-1, dove n viene scelto dall utente e, come detto, coincide con la dimensione del vettore. Questo significa che l elemento di indice i del vettore contiene tutti i prodotti che sono posti nello stesso settore del magazzino. Tale settore viene identificato dalla Collocazione nel Magazzino. Codificare in C: le strutture dati utilizzate e le funzioni primitive necessarie al compito. l allocazione di vettore di liste, dopo che l utente ha scelto n. una funzione che permette di inserire un nuovo prodotto e tutti i relativi altri campi nel vettore di liste. una funzione che permette di vendere un determinato prodotto. Se il prodotto cercato esiste, il campo numero pezzi presenti in magazzino deve essere decrementato di quanto specificato dall utente. Se l utente vuole comprare 3 pezzi, allora il campo numero pezzi deve essere decrementato di 3; se il numero di pezzi attuali è inferiore a 3, allora il programma deve avvertire l utente che il numero di pezzi è inferiore e tale numero deve essere posto a 0. Se l utente vuole comprare un certo prodotto e il numero di pezzi è 0, allora il sistema deve avvertire l utente che non è possibile l acquisto. una funzione che visualizza tutti i prodotti situati in un certo settore del magazzino (0,..,n-1). Il Main che alloca il vettore di liste e che richiama le precedenti funzioni Durata: 2h Cognome: Nome: Matricola: 1
#include<stdio.h> #include<stdlib.h> #include<string.h> #define FFLUSH while (getchar()!='\n') void LeggiStringa(char s[], unsigned long dim){ unsigned long i; for (i=0; i<dim-1;i++) if ((s[i]=getchar())=='\n') break; if (i==dim-1) s[i]='\0'; /******************** Funzioni Legate al TipobaseList**********************/ #define STR 6 typedef struct { unsigned int collocazione; char cod_prod[str]; unsigned int prezzo, num_pezzi; tipobaselist; /*Serve nella funzione Locate e Insord*/ int ConfrontaList(tipobaseList a, tipobaselist b){ return strcmp(a.cod_prod,b.cod_prod); /*Serve nella funzione visita */ void VisualizzaElementoLista(tipobaseList x){ printf("\nla collocazione e' %u",x.collocazione); printf("\nil codice del prodotto e' %s ",x.cod_prod); printf("\nil prezzo e' %u ",x.prezzo); printf("\nil numero di pezzi presenti in magazzino e %u ",x.num_pezzi); /******************** LISTA**************************/ #define LISTAVUOTA NULL typedef short boolean; typedef struct nodolist { tipobaselist info; struct nodolist *next; *list; typedef list position; position End(list l){ if (l==listavuota) return(listavuota); while (l->next!=listavuota) l=l->next; return(l); position First(list l) { return(listavuota); 2
void MakeNullList(list *l){ *l=listavuota; boolean EmptyList(list l){ return(l==listavuota); boolean FullList(list l){ struct nodolist *tmp; tmp=(struct nodolist *)malloc(sizeof(struct nodolist)); if (!tmp) return 1; free (tmp); return(0); void InsertList(list *l, position p, tipobaselist x){ struct nodolist * temp; if (!FullList(*l)) { temp=(struct nodolist *) malloc(sizeof(struct nodolist)); temp->info=x; if (p==listavuota) { temp->next=*l; *l=temp; temp->next=p->next; p->next=temp; void DeleteList(list *l, position p){ struct nodolist * tmp; if (!EmptyList(*l)) if (p==listavuota) { tmp=(*l)->next; free (*l); *l=tmp; tmp=p->next; p->next=tmp->next; free (tmp); position Locate(list l, tipobaselist x){ if (!EmptyList(l)) { if (!ConfrontaList(l->info,x)) return(listavuota); while (l->next!=listavuota) { if (!ConfrontaList(l->next->info,x)) return(l); l=l->next; return(l); tipobaselist Retrieve(list l, position p) { if (!EmptyList(l)) if (p==listavuota) return(l->info); else return(p->next->info); 3
position Next(list l, position p) { if (p==listavuota) return(l); else return(p->next); /******************** COMPITO **************************/ void visita(list l){ position p,u; tipobaselist x; p=first(l); u=end(l); while (p!=u) { x=retrieve(l,p); VisualizzaElementoLista(x); p=next(l,p); void insord(list *l, tipobaselist x) { position p,u; tipobaselist tmp; if (EmptyList(*l)) InsertList(l,First(*l),x); p=first(*l); u=end(*l); while (p!=u) { tmp=retrieve(*l,p); if (ConfrontaList(tmp,x)<0) p=next(*l,p); else break; InsertList(l,p,x); void inserimento_prodotto(list *l, tipobaselist x){ position p; if (!EmptyList(*l)) p=locate(*l,x); if ( EmptyList(*l) p==end(*l)) insord(l,x); else printf("\n Prodotto gia' esistente, inserimento impossibile \n"); void vendita_prodotto(list *l, tipobaselist x){ position p; tipobaselist tmp; if (!EmptyList(*l)) p=locate(*l,x); if (EmptyList(*l) p==end(*l)) printf("\nprodotto Inesistente "); tmp=retrieve(*l,p); if (tmp.num_pezzi==0) printf("\nnon ci sono pezzi per questo prodotto "); if (tmp.num_pezzi>=x.num_pezzi) tmp.num_pezzi-=x.num_pezzi; printf("\nnumero di pezzi inferiore alla richiesta "); tmp.num_pezzi=0; DeleteList(l,p); InsertList(l,p,tmp); 4
unsigned int LeggiCollocazione(unsigned int n){ unsigned int x; do { printf("\ninserisci la collocazione in magazzino dell'articolo "); printf("\ncompresa tra 0 e %d ", n-1); scanf("%d",&x); while (x>=n); return x; list *magazzino; main(){ unsigned int n,scelta,i,indice; tipobaselist prodotto; do{ printf("\ninserisci il numero di elementi del vettore: "); scanf("%u",&n); while(n<2); magazzino=(list *)malloc(n*sizeof(list)); for(i=0;i<n;i++) MakeNullList(&magazzino[i]); do{ printf("\n\n--------magazzino----------"); printf("\n1)inserisci un nuovo prodotto "); printf("\n2)vendita di un determinato prodotto"); printf("\n3)visualizza i prodotti di un settore del magazzino "); printf("\n4)esci "); printf("\nla scelta e'... "); scanf("%u",&scelta); switch(scelta){ case 1: indice=leggicollocazione(n); prodotto.collocazione=indice; printf("\n Inserisci il codice del prodotto "); LeggiStringa(prodotto.cod_prod,STR); printf("\n Inserisci il prezzo "); scanf("%u",&prodotto.prezzo); printf("\nnumero di pezzi presenti in magazzino "); scanf("%u",&prodotto.num_pezzi); inserimento_prodotto(&magazzino[indice],prodotto); break; case 2: indice=leggicollocazione(n); printf("\n Inserisci il codice del prodotto "); LeggiStringa(prodotto.cod_prod,STR); printf("\nnumero di pezzi che desideri acquistare "); scanf("%u",&prodotto.num_pezzi); vendita_prodotto(&magazzino[indice],prodotto); 5
case 3: while(scelta<4); break; indice=leggicollocazione(n); visita(magazzino[indice]); 6