/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ayuda con lectura de secuencia en array

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
sur58



Registrado: 05 Abr 2014
Mensajes: 3

MensajePublicado: 04/05/2014 12:22 am
Título: Ayuda con lectura de secuencia en array

Hola,

Al leer la secuencia <1 2 3 4 123 2 3 4 5> el código que adjunto, debería retornar <123 1 1 1 1>, Sin embargo, retorna <123 1 1 1 0>; analizando el código me he dado cuenta que en la primera parte de la secuencia, se salta el 4 (marcado en rojo) y pasa directamente al 123. No entiendo porqué está haciendo eso.. Alguien podría explicarme porqué pasa? Muchas gracias.

Código:

 
#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);
            }
         }
      }
   
   }   
   
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7516
Ubicación: Mexico

MensajePublicado: 04/05/2014 7:34 am
Título:

Errores en el programa me temo hay bastantes.

* En C los indices validos van de 0 hasta N-1 pero tu utilizas 1 .. N, todos los bucles similares a este:
Código:
for (i = 1; i <= TYPESWINE; i++) {
   scanf("%d", &wineAvailable.available[i]);
}

Hay que cambiarlos a:
Código:
for (i = 0; i < TYPESWINE; i++)
   scanf("%d", &wineAvailable.available[i]);


* La función "readRequest" solo lee el pedido, a continuación se guarda el pedido con la función "saveRequest", esta primero busca al cliente mediante su id pero el problema es que este nunca fue leído o asignado.

----

Ademas deberias utilizar nombres mas cortos, por ejemplo en la función "actualize" tienes la sentencia:
Código:
wineAvailable->available[i] = wineAvailable->available[i] - client.typesRequested[i].requested;

Si el parámetro "wineAvailable" lo renombras a solo "wine" es mas fácil de leer:
Código:
wine->available[i] = wine->available[i] - client.typesRequested[i].requested;

/* O mejor todavia: */
wine->available[i] -= client.typesRequested[i].requested;


Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
sur58



Registrado: 05 Abr 2014
Mensajes: 3

MensajePublicado: 04/05/2014 12:01 pm
Título:

Muchísimas gracias por tu ayuda. Errores de principiante..!!

Voy a intentar pulirlo un poco más que me está dando otro tipo de errores, a ver si puedo por mi cuenta..!

Repito, muchísimas gracias por tu ayuda.

Un saludo,

rir3760 escribió:
Errores en el programa me temo hay bastantes.

* En C los indices validos van de 0 hasta N-1 pero tu utilizas 1 .. N, todos los bucles similares a este:
Código:
for (i = 1; i <= TYPESWINE; i++) {
   scanf("%d", &wineAvailable.available[i]);
}

Hay que cambiarlos a:
Código:
for (i = 0; i < TYPESWINE; i++)
   scanf("%d", &wineAvailable.available[i]);


* La función "readRequest" solo lee el pedido, a continuación se guarda el pedido con la función "saveRequest", esta primero busca al cliente mediante su id pero el problema es que este nunca fue leído o asignado.

----

Ademas deberias utilizar nombres mas cortos, por ejemplo en la función "actualize" tienes la sentencia:
Código:
wineAvailable->available[i] = wineAvailable->available[i] - client.typesRequested[i].requested;

Si el parámetro "wineAvailable" lo renombras a solo "wine" es mas fácil de leer:
Código:
wine->available[i] = wine->available[i] - client.typesRequested[i].requested;

/* O mejor todavia: */
wine->available[i] -= client.typesRequested[i].requested;


Un saludo
[/code]
Código:
Código:
Código:
Código:
Código:
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com