/
Inicio :: Foros

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

ayuda con cadena de caracteres en una lista doble...

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



Registrado: 11 Jul 2005
Mensajes: 112

MensajePublicado: 29/09/2005 11:43 am
Título: ayuda con cadena de caracteres en una lista doble...

Pues bien estoy haciendo un programa en turboc++v3.0 en el que simulo una base de datos de alumnos inscritos en varios cursos utilizando listas simples y dobles;la idea general para llevar a cabo todos los procesos necesarios ya la tengo concebida,pero estoy atascado en la parte de llenar la lista que guardará la informacion de los alumnos,lo que pasa es que la CLAVE que tengo que utilizar para recorrer y ORDENAR la lista debe de ser la CEDULA DE IDENTIDAD del alumno,el DETALLE está en que este numero de identidad no es en realidad un número como tal sino una cadena de caracteres puesto que en Venezuela las cedulas son de tipo: V15XXXXXX ; donde la letra que esta al principio significa si es V=venezolano y si es una E=extranjero.Entonces para poder ordenar la lista en forma ascendente es necesario obviar la LETRA(V ó E) y comparar la parte de la cadena que representa el número de identidad Y ES ESTA PARTE LA QUE ME ESTÁ DANDO EL PROBLEMA porque no estoy seguro de como hacerlo. Aqui va lo que he hecho hasta ahora:

Esta es la estructura que utilizo para guardar la informacion de los participantes:
Código:

struct parti
{
       char cedula[9];
       char tlf_habitacion[20];
       char tlf_celular[20];
       char nombre[50];
       int edad;
       char direccion[50];
       struct parti *sig;
       struct parti *ant;
}*CAB_D=NULL,*AUX_D=NULL,*P_D=NULL;

Esta es la función que se encarga de la inserción y ordenación(o al menos deberia hacerlo) en forma ascendente:
Código:

void insert_participante(void)
{
    char cadena[9];
    int result;

    AUX_D=(struct parti *)malloc(sizeof(struct parti));


    reintentar:
    printf("\nIntroduzca c‚dula del participante:");
    gets(cadena);
    if(cadena[0]!='v' && cadena[0]!='e')
    {
    printf("\n La cedula debe ir precedida por un caracter indicativo de\n su condicion de venezolano(v) o extranjero(e).");
    getch();
    clrscr();
    goto reintentar;
    }
    else
    strcpy(AUX_D->cedula,cadena);

    printf("\nIntroduzca nombre:");
    gets(AUX_D->nombre);


    printf("\nIntroduzca direcci¢n del participante:");
    gets(AUX_D->direccion);

    printf("\nIntroduzca edad:");
    scanf("%d",&AUX_D->edad);
                fflush(stdin);
    printf("\nIntroduzca tel‚fono de habitaci¢n:");
    gets(AUX_D->tlf_habitacion);
              fflush(stdin);
    printf("\nIntroduzca tel‚fono celular:");
    gets(AUX_D->tlf_celular);


    if(CAB_D) while(CAB_D->ant) CAB_D = CAB_D->ant;
                  /*>*/
    if(!CAB_D || (result=comparar(CAB_D->cedula,AUX_D->cedula))==1)
    {

      AUX_D->sig = CAB_D;
      AUX_D->ant = NULL;
      if(CAB_D) CAB_D->ant = AUX_D;
       /*if(!*lista) *lista = nuevo; */
      CAB_D=AUX_D;
   }
   else {
      /* Avanzamos hasta el último elemento o hasta que el siguiente tenga
    un valor mayor que v */                    /* <=*/
      while(CAB_D->sig && (result=comparar(CAB_D->cedula,AUX_D->cedula))==2)
    CAB_D = CAB_D->sig;
      /* Insertamos el nuevo nodo después del nodo anterior */
      AUX_D->sig = CAB_D->sig;
      CAB_D->sig = AUX_D;
      AUX_D->ant = CAB_D;
      if(AUX_D->sig) AUX_D->sig->ant = AUX_D;
   }


} //fin funcion insert_participante().

Y esta es la función comparar() a la que llama la función insert_participante() y que se debe de encargar de comparar las partes de las cadenas de caracteres que representan los numeros de identidad de los participantes:
Código:

int comparar(char *actual,char *nuevo)
{
    char actu[9],nuev[9],*cero="0",*cero1="0";
    int resultado;

    strcpy(actu,actual+1);
    strcpy(nuev,nuevo+1);

   if(strlen(actu)<8)//esto es en caso de la cedula sea menor de 10000000
    {
     strcat(cero,actu);
     strcpy(actu,cero);
    }
    if(strlen(nuev)<8)
    {
     strcat(cero1,nuev);
     strcpy(nuev,cero);
    }

    if(strcmp(actu,nuev) > 0)

       resultado=1;

    else if(strcmp(actu,nuev) <= 0)
       resultado=2;


    return(resultado);

} //fin funcion comparar().


Como pueden ver en mi busqueda por intetar resolver este problema he terminado por complicar más de lo necesario el código(por que se que debe haber una manera sencilla de hacerlo PERO NO LA ENCUENTRO...).

Además aqui les pongo la función que se encarga de mostrar los registros guardados en la lista:
Código:

void MostrarLista(void)
{
   //pNodo nodo = lista;

   if(!CAB_D) printf("Lista vacía");

   P_D = CAB_D;

      while(P_D->ant) P_D = P_D->ant;

      while(P_D) {
    printf("\ncedula:%s ", P_D->cedula);
    printf("\nnombre:%s",P_D->nombre);
     printf("\ndirecci¢n:%s",P_D->direccion);
   printf("\nedad:%d",P_D->edad);
          fflush(stdout);
   printf("\ntel‚fono de habitaci¢n:%s",P_D->tlf_habitacion);
   printf("\ntel‚fono celular:%s",P_D->tlf_celular);

    P_D = P_D->sig;
      }

   printf("\n");
   getch();
} //fin fncion mostrarlista()


Y por último coloco la función principal para poner a prueba las funciones creadas. La hice asi de sencilla solo para poner a prueba los resultados; como ven solo la hice para que se introdujeran dos registros:
Código:

void main()
{
    int i;
    clrscr();
   for(i=0;i<2;i++)
     insert_participante();

    MostrarLista();

}


El problema con este planteamiento creo que esta en los apuntadores y en el paso de los argumentos a las funciones.Pero lo coloque no tanto para que me ayudaran a arreglarlo(aunque si esposible hacerlo de esta manera pues tambien me sirve) sino para que vieran que en realidad le he dedicado tiempo y esfuerzo a intentar resolverlo pero como último recurso(COMO DEBE DE SER luego de intentarlo uno mismo) recurro a ustedes para ver si se les ocurre una manera más sencilla de hacer la ORDENACIÓN de la lista mediante la comparacion de los números de identidad.

Porfavor ayudenme a resolver este problema que tengo lo más pronto posible porque después de hacerlo podré pasar a terminar el resto del programa... Exclamation

Aqui estare esperando su pronta respuesta mientras me dedico a hacer otras varias actividades para mi instituto...GRACIAS DE ANTEMANO GENTE...
Volver arriba
Alejandro_



Registrado: 26 Mar 2005
Mensajes: 252
Ubicación: Buenos Aires

MensajePublicado: 29/09/2005 10:12 pm
Título:

Hola;

Quizá, para facilitar la ordenación y búsqueda, podrías separar cada cédula en sus elementos constituyentes, guardando la letra 'v' o 'e' en un char y el número en un int:

Código:
struct parti
{
       char letra;           /* sólo aceptará una 'v' o una 'e' */
       int numero;
       char tlf_habitacion[20];
       char tlf_celular[20];
       char nombre[50];
       int edad;
       char direccion[50];
       struct parti *sig;
       struct parti *ant;
};

Alejandro
Volver arriba
fralex



Registrado: 11 Jul 2005
Mensajes: 112

MensajePublicado: 30/09/2005 3:09 pm
Título: Respuesta...

Hey Alejandro como te va gracias por responder! y disculpen que sea hasta ahora que responda es que estaba full ocupado con mi instituto.

Bién ya había pensado en lo que planteas y creo que no es una mala idea pero es que estoy algo obsesionado con lo de lograrlo con cadenas de caracteres y más ahora que ya dejó de ser una asignación para mi universidad(porque ya se me venció el tiempo de entrega) y pasa ahora a ser un proyecto personal; de todos modos pondré a prueba tu consejo y veré que tal resulta; luego buscaré como hacerlo con caracteres.

En lo que lo termine lo publicaré aqui.

Gracias y se aceptan más sugerencias...
Exclamation
Volver arriba
fralex



Registrado: 11 Jul 2005
Mensajes: 112

MensajePublicado: 01/10/2005 11:17 pm
Título: leyendito lo encontre...

Pues resulta que leyendo por los foros encontre la solución a mi dilema,y resulta ser la san atoi() Laughing , si la san atoi() por que de ahora en adelante va a ser santo de mi devoción, y es que ya me pude sacar la espinita.

Resulta que la función atoi() de la ibreria stdlib.h hace exactamente lo que necesitaba en mi programa,bueno casi,solo habia que agregarle un detallito.

aqui les dejo la parte del código ya arreglado:
Código:

void insert_participante(void)
{
    char cadena[9];
    int cab_ced,aux_ced;

    AUX_D=(struct parti *)malloc(sizeof(struct parti));


    reintentar:
    printf("\nIntroduzca c‚dula del participante:");
    gets(cadena);
    if(cadena[0]!='v' && cadena[0]!='e')
    {
    printf("\n La cedula debe ir precedida por un caracter indicativo de\n su condicion de venezolano(v) o extranjero(e).");
    getch();
    clrscr();
    goto reintentar;
    }
    else
    strcpy(AUX_D->cedula,cadena);

    printf("\nIntroduzca nombre:");
    gets(AUX_D->nombre);


    printf("\nIntroduzca direcci¢n del participante:");
    gets(AUX_D->direccion);

    printf("\nIntroduzca edad:");
    scanf("%d",&AUX_D->edad);
                fflush(stdin);
    printf("\nIntroduzca tel‚fono de habitaci¢n:");
    gets(AUX_D->tlf_habitacion);
              fflush(stdin);
    printf("\nIntroduzca tel‚fono celular:");
    gets(AUX_D->tlf_celular);


    if(CAB_D) while(CAB_D->ant) CAB_D = CAB_D->ant;

    if(!CAB_D || (cab_ced=atoi(CAB_D->cedula+1))>(aux_ced=atoi(AUX_D->cedula+1)))
    {/*el...+1 es para que se tome en cuenta solamente la parte de la cadena que epresenta el número de cedula*/

      AUX_D->sig = CAB_D;
      AUX_D->ant = NULL;
      if(CAB_D) CAB_D->ant = AUX_D;
       /*if(!*lista) *lista = nuevo; */
      CAB_D=AUX_D;
   }
   else {
      /* Avanzamos hasta el último elemento o hasta que el siguiente tenga
    un valor mayor que v */                    /* <=*/
      while(CAB_D->sig && (cab_ced=atoi(CAB_D->cedula+1))<=(aux_ced=atoi(AUX_D->cedula+1)))
    CAB_D = CAB_D->sig;
      /* Insertamos el nuevo nodo después del nodo anterior */
      AUX_D->sig = CAB_D->sig;
      CAB_D->sig = AUX_D;
      AUX_D->ant = CAB_D;
      if(AUX_D->sig) AUX_D->sig->ant = AUX_D;
   }


} //fin funcion insert_participante().


Ya la función comparar() no va,todo lo demás queda igual.

Si me sobra algo de tiempo en estos dias terminare el código y lo publicare junto con el planteamiento para que vean bien de que se trataba, Exclamation Eso claro si me sobra tiempo por que estoy en epoca de fin de semestre en la universidad y me están atacando desde todos los flancos,no se preocupen yo puedo con ellos Laughing .
Y ALEJANDRO_ igual gracias por tu consejo que tambien fue bueno.

Por cierto que buena esa adición que le hicieron a la parte de publicar comentarios,me refiero al recuadro adicional de nombre Revisar tema que pusieron debajo del recuadro en que se editan los comentarios, ya estaba cansao de ir hacia atras y regresar para revisar los temas cada vez que escribia un comentario...MUY BUENA ESA gente del rincon del c...mis felicitaciones al webmaster.
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