Secondo Esercizio su Vettore di Code, in Linguaggio C

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