Compito di Fondamenti di Informatica 08 Settembre 2014 In un Call Center viene utilizzato un archivio informatico, in cui vengono memorizzate le informazioni relative ai clienti che telefonano e che vengono messe in attesa di parlare con un operatore del Call Center. Si assume che ogni operatore viene contraddistinto da un codice rappresentato da un numero intero compreso tra 0 e N-1. Il sistema informatico utilizza un vettore di code; ogni coda è associata ad un operatore. Ogni coda contiene le informazioni dei clienti in attesa al telefono di poter parlare con quel determinato operatore. Dunque per esempio l’elemento del vettore di indice i (i=0, ..., N-1) corrisponde alla coda degli utenti che stanno attendendo di poter parlare con l’operatore numero i. Le informazioni memorizzate nelle code per ciascun cliente sono: Cognome, Nome, Telefono Il vettore di code ha N elementi, dove N è il numero di operatori presenti. Si suppone che tale numero sia inserito all’inizio dell’esecuzione del programma e che il vettore di code sia allocato in modo dinamico sempre all’inizio del programma e sia di dimensione N. Ciascuna delle code del vettore, è realizzata tramite puntatori. Il programma fa uso di una particolare variabile che deve essere inizializzata a 0 all’inizio dell’esecuzione del programma. Tale variabile, chiamata operatore, viene incrementata ad ogni inserimento effettuato in una qualunque delle code. L’incremento deve essere fatto modulo N, ossia si deve applicare la seguente formula di incremento: operatore =(operatore + 1) % N Codificare in C: La struttura dati ADT Coda utilizzata e l’implementazione del tipobase richiesto dal compito, includendo tutte le funzioni astratte necessarie allo svolgimento del compito. una funzione di inserimento di un nuovo cliente. Il cliente deve essere inserito nella coda del vettore di indice operatore. Una volta fatto l’inserimento, la variabile operatore DEVE ESSERE INCREMENTATA come spiegato prima (ossia modulo N). una funzione che riceve in ingresso un indice compreso tra 0 e N-1 e fornisce il primo cliente in coda per quell’indice del vettore, eliminando tale cliente dall’archivio. Un main che richiama le precedenti funzioni (preferibilmente con un menu). Nome: Cognome: Matricola: 1 #include<stdio.h> #include<stdlib.h> #define FFLUSH while(getchar()!='\n') #define S 50 #define T 15 typedef struct{ char cognome[S], nome[S], telefono[T]; } tipobaseQueue; /*Sezione dell'ADT CODA */ #define CODAVUOTA NULL typedef short boolean; struct nodoQueue { tipobaseQueue info; struct nodoQueue *next; }; typedef struct { struct nodoQueue * front, * rear; } queue; void MakeNullQueue(queue *q) { q->front=q->rear=CODAVUOTA; } boolean EmptyQueue(queue q) { return(q.front==CODAVUOTA); } boolean FullQueue(queue q) { struct nodoQueue *tmp; tmp=(struct nodoQueue *)malloc(sizeof(struct nodoQueue)); if(tmp==NULL) return 1; free(tmp); return 0; } void EnQueue(queue *q, tipobaseQueue x) { struct nodoQueue * temp; if (!FullQueue(*q)) { temp=(struct nodoQueue *)malloc(sizeof(struct nodoQueue)); temp->info=x; temp->next=CODAVUOTA; if (EmptyQueue(*q)) q->front=q->rear=temp; else { q->rear->next=temp; q->rear=temp; } } } void DeQueue(queue *q) { struct nodoQueue * temp; if (!EmptyQueue(*q)) { temp=q->front->next; free (q->front); q->front=temp; 2 if (q->front==CODAVUOTA) q->rear=CODAVUOTA; } } tipobaseQueue Front(queue q) { if (!EmptyQueue(q)) return(q.front->info); } /*FINE ADT CODA */ /*INIZIO COMPITO */ 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) FFLUSH; s[i]='\0'; } void inserimento(queue *q, tipobaseQueue x){ if (!FullQueue(*q)) EnQueue(q,x); else printf("\nCoda Piena"); } void visualizza_estrai(queue *q){ tipobaseQueue tmp; if (!EmptyQueue(*q)){ tmp=Front(*q); printf("\nCognome = %s ",tmp.cognome); printf("\nNome = %s ",tmp.nome); printf("\nTelefono = %s ",tmp.telefono); DeQueue(q); printf("\nElemento Cancellato \n\n"); } else printf("\nCoda Vuota "); } unsigned int N, operatore; queue * vettore; main(){ unsigned int scelta,i; tipobaseQueue elemento; operatore=0; do { printf("\nInserisci la dimensione del vettore”); printf("\nOssia il numero di operatori "); scanf("%u",&N); FFLUSH; } while (N<2); vettore=(queue *)malloc(N*sizeof(queue)); for (i=0;i<N;i++) MakeNullQueue(&vettore[i]); do { printf("\n0-Inserimento "); printf("\n1-Visualizzazione + Estrazione "); printf("\n2-FINE "); printf("\nInserisci la tua scelta -> "); scanf("%u",&scelta); FFLUSH; switch(scelta) { case 0: printf("\n\nInserisci i dati del cliente "); printf("\nInserisci il Cognome "); 3 LeggiStringa(elemento.cognome,S); printf("\nInserisci il Nome "); LeggiStringa(elemento.nome,S); printf("\nInserisci il Telefono "); LeggiStringa(elemento.telefono,T); inserimento(&vettore[operatore],elemento); operatore=(operatore+1)%N; break; case 1: do { printf("\n\nInserisci il codice dell'operatore "); printf("\nDeve essere compreso tra 0 e %u ",N-1); scanf("%u",&i); FFLUSH; } while (i>=N); visualizza_estrai(&vettore[i]); } } while (scelta<2); } 4
© Copyright 2024 ExpyDoc