• Jueves 14 de Noviembre de 2024, 04:39

Autor Tema:  Programa no se codificar la modificación.  (Leído 1159 veces)

nicksynm

  • Visitante
Programa no se codificar la modificación.
« en: Jueves 25 de Junio de 2009, 19:57 »
0
Hola, como les va?

Tengo un problema y queria ver si me pueden ayudar, hice este trabajo practico para un materia, y ahora me piden que en vez de estructuras utilice listas dobles, y la verdad que no se nada sobre listas y no tengo el tiempo suficiente para aprenderlo antes de la entrega del tp:


Pense en no cambiar las funciones sino el vector de estructura por nodos de la lista enlazada doble. Pero no tengo idea de como codificarlo, si me pudieran ayudar les agradeceria.

tmedicamento medicamentos[MAX]; (cambiar cada subindice seria un nodo el siguiente apunta a [i+1] y asi )

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define ALTA 1
#define LISTADO_NO_VENCIDOS 2
#define LISTADO_VENCIDOS 3
#define ELIMINAR_VENCIDOS 4
#define SALIDA 5
#define MAX 50
#define MAX_COD 6
#define MAX_GEN 40
#define MAX_ACCION_TER 15
#define MAX_PRESENTACION 40
#define MAX_LOTE 5
#define MAX_NOMBRE 40
#define FIN_DE_INGRESOS 9


typedef struct
{
   char lote[MAX_LOTE];
   char codigo[MAX_COD];
   char nombre[MAX_NOMBRE];
   char generico[MAX_GEN];
   char terap_accion[MAX_ACCION_TER];
   char presentacion[MAX_PRESENTACION];
   float costo;
   struct
   {
      int mes;
      int anio;
   } fechavenc;
}tmedicamento;

int menu(void);
int alta(tmedicamento medicamentos[], int cant);
int eliminar_vencidos(tmedicamento medicamentos[], int cant);
void leer_cadena(char s[], int l, char mens[]);
float leer_numero(char mens[]);
void ordenar_por_codigo(tmedicamento medicamentos[], int cant);
void listar_med_novencidos(tmedicamento medicamentos[],int cant);
void ordenar_por_codigo_lote(tmedicamento medicamentos[],int cant);
void listar_med_avencer(tmedicamento medicamentos[]);
int leer_anio(char mens[]);
int leer_mes(char mens[]);
int leer_registro(tmedicamento *aux);



int main(void){
   
   tmedicamento medicamentos[MAX];
   int opc;
   int cant = 0;

   while((opc = menu())!= SALIDA){
      switch(opc){
      case ALTA:
         cant = alta(medicamentos,cant);
         break;
      case LISTADO_NO_VENCIDOS:
         ordenar_por_codigo(medicamentos, cant);
         listar_med_novencidos(medicamentos,cant);
         break;
      case LISTADO_VENCIDOS:
         ordenar_por_codigo_lote(medicamentos,cant);
         listar_med_avencer(medicamentos);
         break;
      case ELIMINAR_VENCIDOS:
         cant = eliminar_vencidos(medicamentos, cant);
         break;

      }
   }
   return 0;
}

/*Presenta el menu*/
int menu(void){
   int opc, r;
   printf("nntMENUnn");
   printf("1 - Almacenamiento de productos fabricado.n");
   printf("2 - Listado de medicamentos no vencidos.n");
   printf("3 - Listado de medicamentos a vencer en el mes.n");
   printf("4 - Eliminacion de los productos vencidos.nn");

   do{
      printf("opcion: ");
      r = scanf("%d",&opc);

      //Limpio la consola
      while(fgetc(stdin)!= 'n');
   }while(r!=1 ||(opc< ALTA || opc > SALIDA));

   return opc;

}

/*Da de alta medicamentos*/
int alta(tmedicamento medicamentos[], int cant){
   
   tmedicamento aux;
   tmedicamento *ptr_aux = &aux;
   
   printf("Ingrese los datos del medicamento o codigo -1 para terminar:n");
   if(!leer_registro(ptr_aux)){
      return cant;
   }
   if(cant < MAX){
      medicamentos[cant] = aux;
      cant++;
   }
   
   while(leer_registro(ptr_aux ) && cant < MAX){
      medicamentos[cant] = aux;
      cant++;
   }
   if(cant == MAX){
      printf("No se pueden ingresar mas medicamentos");
   }
         
   return cant;
}

/* Lee un registro.
*   Devuelve
*   - 1 si todos los campos del registro fueron ingresados
*   - 0 si alguno de los campos del registro no fue ingresado
*/
int leer_registro(tmedicamento *aux){

   leer_cadena(aux->codigo,MAX_COD,"Codigo:");
   if(atoi(aux->codigo) == -1){
      return 0;
   }
   leer_cadena(aux->terap_accion,MAX_ACCION_TER,"Accion Terapeutica:");
   if(atoi(aux->terap_accion) == -1){
      return 0;
   }
   leer_cadena(aux->generico,MAX_GEN,"Generico:");
   if(atoi(aux->generico) == -1){
      return 0;
   }
   leer_cadena(aux->lote,MAX_LOTE,"Lote:");
   if(atoi(aux->lote)==-1){
      return 0;
   }
   leer_cadena(aux->presentacion,MAX_PRESENTACION,"Presentacion:");
   if(atoi(aux->presentacion)==-1){
      return 0;
   }
   leer_cadena(aux->nombre,MAX_NOMBRE,"Nombre:");
   if(atoi(aux->nombre)==-1){
      return 0;
   }

   aux->costo = leer_numero("Costo:");
   if(aux->costo == -1){
      return 0;
   }
   aux->fechavenc.anio = leer_anio("Anio de vencimiento: ");
   if(aux->fechavenc.anio == -1){
      return 0;
   }
   aux->fechavenc.mes = leer_mes("Mes de vencimiento: ");
   if(aux->fechavenc.mes == -1){
      return 0;
   }

   return 1;

}

/*Lee una cadena de la consola*/
void leer_cadena(char s[], int l, char mens[]){
   printf("n%s ", mens);
   fgets(s,l,stdin);
   fflush(stdin);
}

/*Lee un float de la consola*/
float leer_numero(char mens[]){
   char float_str[10];
   
   printf("n%s",mens);
   fgets(float_str,10, stdin);
   fflush(stdin);
   if(atof(float_str) == -1){
      return -1;
   }

   return (float)atof(float_str);
   
}

int leer_anio(char mens[]){
   char entero_str[5];
   
   printf("n%s",mens);
   fgets(entero_str,5,stdin);
   fflush(stdin);
   if(atoi(entero_str) == -1){
      return -1;
   }

   while(atoi(entero_str) < 1900){
      printf("El anio ingresado no es valido ingreselo nuevamente: ");
      fgets(entero_str,4,stdin);
      fflush(stdin);
      if(atoi(entero_str) == -1){
         return -1;
      }
   }
   return atoi(entero_str);
   
}

int leer_mes(char mens[]){
   char entero_str[3];
   
   printf("n%s",mens);
   fgets(entero_str,3,stdin);
   fflush(stdin);
   if(atoi(entero_str) == -1){
      return -1;
   }
   while(atoi(entero_str) > 12 && atoi(entero_str) < 0){
      printf("El mes ingresado no es valido ingreselo nuevamente: ");
      fgets(entero_str,2,stdin);
      fflush(stdin);
      if(atoi(entero_str) == -1){
         return -1;
      }
   }
   return atoi(entero_str);
   
}

/*Ordena el array por codigo*/
void ordenar_por_codigo(tmedicamento medicamentos[],int cant){
   int pasadas,i;
   tmedicamento temp;

   /*Ciclo para controlar numero de pasos*/
   for( pasadas = 1; pasadas < cant - 1; pasadas++){
      /*Ciclo para controlar el numero de comparaciones por pasada*/
      for(i = 0; i < cant -1; i++){
         /*compara los elementos adyacentes y los intercambia si el primero es mayor que el segundo*/
         if(strcmp(medicamentos.codigo,medicamentos[i+1].codigo) > 0){
            temp = medicamentos;
            medicamentos = medicamentos[i+1];
            medicamentos[i+1] = temp;
         }
      }
   }
}

/*Ordena el array por codigo y lote*/
void ordenar_por_codigo_lote(tmedicamento medicamentos[],int cant){
   int pasadas,i;
   tmedicamento temp;

   /*Ciclo para controlar numero de pasos*/
   for( pasadas = 1; pasadas < cant - 1; pasadas++){
      /*Ciclo para controlar el numero de comparaciones por pasada*/
      for(i = 0; i < cant -1; i++){
         /*compara los elementos adyacentes y los intercambia si el primero es mayor que el segundo*/
         if(strcmp(medicamentos.codigo,medicamentos[i+1].codigo) > 0 ||
               (strcmp(medicamentos.codigo,medicamentos[i+1].codigo) == 0
                  && strcmp(medicamentos.lote,medicamentos[i+1].lote) >0)){
            
            temp = medicamentos;
            medicamentos = medicamentos[i+1];
            medicamentos[i+1] = temp;

         }
      }
   }
}

void listar_med_novencidos(tmedicamento medicamentos[],int cant)
{
   int cantidad;
   int i;
   i=0;
   cantidad=cant;
   struct tm *OurT = NULL;
   time_t Tval = 0;
   Tval = time(NULL);
   OurT = localtime(&Tval);
   while(i!=cant)
         {
            if(medicamentos.fechavenc.anio >= (1900 + OurT->tm_year)
            {

               if(medicamentos.fechavenc.mes >= OurT->tm_mon))
               {
                  printf("Nombre: %sn Codigo:%sn Lote:%sn Generico:%sn Accion Terapeurica:%sn Presentaciòn:%sn Costo:%f",medicamentos.nombre,medicamentos.codigo,
                     medicamentos.lote,medicamentos.generico,medicamentos.terap_accion,medicamentos.presentacion,
                     medicamentos.costo);
                     i++;
               }
               if(medicamentos.fechavenc.anio > (1900 + OurT->tm_year && medicamentos.fechavenc.mes >= OurT->tm_mon))
               {
                  printf("Nombre: %sn Codigo:%sn Lote:%sn Generico:%sn Accion Terapeurica:%sn Presentaciòn:%sn Costo:%f",medicamentos.nombre,medicamentos.codigo,
                     medicamentos.lote,medicamentos.generico,medicamentos.terap_accion,medicamentos.presentacion,
                     medicamentos.costo);
                     i++;
               }

               else
               {
                  i++;
               }
         
   
            }
            else
            {
               i++;
            }
         }
}


void listar_med_avencer(tmedicamento medicamentos[]){
   int cantidad;
   int i;
   i=0;
   cantidad=cant;
   struct tm *OurT = NULL;
   time_t Tval = 0;
   Tval = time(NULL);
   OurT = localtime(&Tval);
   while(i!=cant)
         {
            if(medicamentos.fechavenc.anio <= (1900 + OurT->tm_year)
            {

               if(medicamentos.fechavenc.mes < OurT->tm_mon))
               {
                  printf("Nombre: %sn Codigo:%sn Lote:%sn Generico:%sn Accion Terapeurica:%sn Presentaciòn:%sn Costo:%fn",medicamentos.nombre,medicamentos.codigo,
                     medicamentos.lote,medicamentos.generico,medicamentos.terap_accion,medicamentos.presentacion,
                     medicamentos.costo);
                     i++;
               }
               if(medicamentos.fechavenc.anio < (1900 + OurT->tm_year && medicamentos.fechavenc.mes <= OurT->tm_mon))
               {
                  printf("Nombre: %sn Codigo:%sn Lote:%sn Generico:%sn Accion Terapeurica:%sn Presentaciòn:%sn Costo:%fn",medicamentos.nombre,medicamentos.codigo,
                     medicamentos.lote,medicamentos.generico,medicamentos.terap_accion,medicamentos.presentacion,
                     medicamentos.costo);
                     i++;
               }
               else
               {
                  i++;
               }
         
   
            }
            else
            {
               i++;
            }
         }

}

/*Elimina los medicamentos vencidos*/
int eliminar_vencidos(tmedicamento medicamentos[], int cant){
   int i,j;
   i=0,
   j=0,
   struct tm *OurT = NULL;
   time_t Tval = 0;
   Tval = time(NULL);
   OurT = localtime(&Tval);
   for(i = 0; i < cant; i++){
      if(medicamentos.fechavenc.anio <= (1900 + OurT->tm_year)
            && (medicamentos.fechavenc.mes < OurT->tm_mon)){
         for(j=i; j < cant - 1; j++){
            medicamentos[j] = medicamentos[j+1];
         }
         cant--;
      }
   }
   i=0,
   j=0,
   for(i = 0; i < cant; i++){
      if(medicamentos.fechavenc.anio < (1900 + OurT->tm_year)
            && (medicamentos.fechavenc.mes <= OurT->tm_mon)){
         for(j=i; j < cant - 1; j++){
            medicamentos[j] = medicamentos[j+1];
         }
         cant--;
      }
   }
   return cant;
}

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programa no se codificar la modificación.
« Respuesta #1 en: Jueves 25 de Junio de 2009, 23:03 »
0
Hombre, yo te puedo ayudar a comprender las listas doblemente enlazadas, pero la modificación la haces tú  :P

nicksynm

  • Visitante
Re: Programa no se codificar la modificación.
« Respuesta #2 en: Viernes 26 de Junio de 2009, 00:54 »
0
Te agradesco ya logre que me corrieran la fecha, asi que ahora tengo tiempo para aprenderlo. Saludos!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Programa no se codificar la modificación.
« Respuesta #3 en: Viernes 26 de Junio de 2009, 10:18 »
0
Perfecto  ^_^

Te aconsejo que uses las etiquetas de código para que tu código quede legible y no ocupe tanto espacio en el post ;)

Supongo que te refieres a sustituír tmedicamento medicamentos[MAX] por una lista, ¿verdad?

Una lista doblemente enlazada es una estructura de datos dinámica, esto es, que usa la memoria necesaria en cada momento y no malgasta reservando futura posible memoria (como es tu caso ahora haciendo uso de un vector con MAX). Pero tiene el inconveniente de ser más lenta que un vector.

Una lista es un puntero. Éste apunta al primer elemento de la lista, y éste a su vez al siguiente, y el siguiente al siguiente, etc... En las doblemente enlazadas también se apunta al elemento anterior. Así pues, la estructura de datos para un nodo de la lista sería:

Código: C
  1. struct tNodoLista
  2. {
  3.     tmedicamento medicamento;
  4.     tNodoLista *sig;
  5.     tNodoLista *ant;
  6. };
  7.  
Y la lista en sí, que sería simplemente un puntero a al primer elemento de la lista:

Código: C
  1. tNodoLista *lista_medicamentos;
  2.  
Ahora bien, lo más "complicado" (aunque tampoco es difícil) es implementar las funciones de inserción, extracción, etc...

Dale un poco a ver qué tal, ya me cuentas.

Saludos