#include <stdio.h> #include <stdlib.h> #define MAXCLIENTS 50 #define TYPESWINE 4 #define END -1
typedef enum {FALSE, TRUE} bool;
typedef struct { int available [TYPESWINE]; } tAvailability; typedef struct { int requested; int totalDelivered; int totalUnavailable; }tRequest;
typedef struct { int idClient; tRequest typesRequested[TYPESWINE]; int numTypesRequested; bool undelivered; }tClient;
typedef struct { tClient clients[MAXCLIENTS]; int numClients; }tShop;
void readRequest (tClient *client); void saveRequest (tClient client, tShop *clientsShop, tAvailability *wineAvailable); void findClient (tClient client, tShop clientsShop, bool *found, int *index); void insertClient (int idclient, tShop *clientsShop, int index); void actualize (tClient client, tShop *clientsShop, tAvailability *wineAvailable, int index); void showResults (tShop clientsShop);
int main(void) { tShop clientsShop; tAvailability wineAvailable; tClient client; int i; clientsShop.numClients=0; client.numTypesRequested=0; client.undelivered=FALSE; for(i=1;i<=TYPESWINE;i++){ scanf("%d", &wineAvailable.available[i]); } scanf("%d", &client.idClient); while (client.idClient!=END) { readRequest(&client); saveRequest(client,&clientsShop,&wineAvailable); scanf("%d", &client.idClient); } showResults(clientsShop); return 0; } void readRequest (tClient *client) { int i; for(i=1;i<=TYPESWINE;i++){ scanf("%d", &client->typesRequested[i].requested); } } void saveRequest (tClient client, tShop *clientsShop, tAvailability *wineAvailable){ int index; bool found; findClient (client, *clientsShop, &found, &index);
if (!found){ insertClient(client.idClient, clientsShop,index); } actualize(client,clientsShop,wineAvailable,index); } void findClient(tClient client,tShop clientsShop,bool *found, int *index){ *index=1; *found=FALSE; while(!*found && *index<=clientsShop.numClients){ *found=(clientsShop.clients[*index].idClient>=client.idClient); if(!*found){ *index=*index+1; } } if(*found){ *found=(clientsShop.clients[*index].idClient==client.idClient); } } void insertClient(int idclient,tShop *clientsShop, int index){ int i;
for(i=clientsShop->numClients;i<=index;i--){ clientsShop->clients[i]=clientsShop->clients[i]; } clientsShop->clients[index].idClient=idclient; clientsShop->clients[index].numTypesRequested=0; clientsShop->numClients=clientsShop->numClients+1; }
void actualize(tClient client,tShop *clientsShop,tAvailability *wineAvailable, int index){ int i; for(i=1;i<=TYPESWINE;i++){
if((client.typesRequested[i].requested)<=wineAvailable->available[i]){ clientsShop->clients[index].typesRequested[i].totalDelivered = clientsShop->clients[index].typesRequested[i].totalDelivered + client.typesRequested[i].requested; clientsShop->clients[index].typesRequested[i].totalUnavailable=0; } else{ clientsShop->clients[index].typesRequested[i].totalDelivered = clientsShop->clients[index].typesRequested[i].totalDelivered + wineAvailable->available[i]; clientsShop->clients[index].typesRequested[i].totalUnavailable = clientsShop->clients[index].typesRequested[i].totalUnavailable + (client.typesRequested[i].requested-wineAvailable->available[i]); clientsShop->clients[index].undelivered=TRUE; } wineAvailable->available[i] = wineAvailable->available[i]-client.typesRequested[i].requested; if(wineAvailable->available[i]<0){ wineAvailable->available[i]=0; } } } void showResults(tShop clientsShop){ int i,j;
for(i=1;i<=clientsShop.numClients;i++){ if(clientsShop.clients[i].undelivered){ printf("%d ",clientsShop.clients[i].idClient); for(j=1;j<=TYPESWINE;j++){ printf("%d ",clientsShop.clients[i].typesRequested[j].totalUnavailable); } } } }
|