elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  duda con recursividad y listas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda con recursividad y listas  (Leído 3,216 veces)
elbuitre86

Desconectado Desconectado

Mensajes: 6


Ver Perfil
duda con recursividad y listas
« en: 3 Julio 2012, 01:30 am »

Hola como andan, estoy haciendo un tp para la facu y tengo un problema.
Primero les cuento mas o menos lo k tengo k hacer:
"Desarrollar  un sistema Help Desk. El sistema contempla la modalidad usuario y la modalidad administrador..

Un servicio de help desk recibe casos durante la noche, y los resuelve durante el dia.
Los usuarios ingresan al sistema en modo usuario para registrar sus casos.
Cada usuario tiene la misma prioridad, y los casos son atendidos por orden de llegada

Una vez terminada la noche, el administrador debe llegar al help desk y activar el proceso de atención de casos, que distribuye los casos a cada agente. Luego de ser resueltos los casos son enviados al historial como resueltos
"

aca les pongo el codigo y ahora explico mi duda.
Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6.  
  7. typedef struct lista
  8. {
  9.    char elem [200];
  10.    int usu;
  11.    int caso;
  12.    struct lista *sig;
  13. } nodo;
  14.  
  15.  
  16. void crear (nodo *pt);
  17.  
  18.  
  19. int main()
  20. {
  21.    nodo *prin;
  22.    int log;
  23.    printf("Ingresar como usuario(1) o como helpdisk(2): ");
  24.    scanf("%d",&log);
  25.    if(log==1)
  26.    {
  27.        prin=(nodo *)malloc(sizeof(nodo));
  28.        crear(prin);
  29.  
  30.  
  31.    }
  32.    return 0;
  33. }
  34.  
  35. void crear (nodo *registro)
  36. {
  37.    int cont=1;
  38.    char pro[200];
  39.    printf("Usuario: Usuario\n");
  40.    printf("Caso numero: %d\n",cont);
  41.    cont++;
  42.    printf("Ingrese el problema (FIN para finalizar): \n");
  43.    scanf(" %[^\n]", pro);
  44.    if (strcmp (pro,"FIN")==0)
  45.       {
  46.            registro->sig=NULL;
  47.            return;
  48.       }
  49.    else
  50.    {
  51.  
  52.        strcpy(registro->elem, pro);
  53.        registro->caso=cont;
  54.        registro->sig=(nodo*)malloc(sizeof(nodo));
  55.        crear (registro->sig);
  56.  
  57.  
  58.    }
  59.  
  60.    return;
  61. }
  62.  

Lo k estoy buscando es, k el contador de casos sea automatico, o autonumero, osea a medida k van ingresado casos este vaya sumando de a 1, el usuario es siempre el mismo.... y bueno dsp estan los casos. Lo k no entiendo es el pork no me anda el contador, lo estoy haciendo recursivamente??? el void crear?
Desde ya muchas gracias
P.D.: espero haber sido claro con la explicacion :D


En línea

elbuitre86

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: duda con recursividad y listas
« Respuesta #1 en: 3 Julio 2012, 02:06 am »

Bueno, creo haberlo resulto, lo k hice fue mandar el contador dsd el main, de esta manera no se inicializa cada vez k se repite la funcion, les pego el codigo
Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6.  
  7. typedef struct lista
  8. {
  9.    char elem [200];
  10.    int caso,esta;
  11.    struct lista *sig;
  12. } nodo;
  13.  
  14.  
  15. void crear (nodo *registro,int cont);
  16. void mostrar (nodo *registro);
  17.  
  18.  
  19. int main()
  20. {
  21.    nodo *prin;
  22.    int log,cont=0;
  23.    printf("Ingresar como usuario(1) o como helpdisk(2): ");
  24.    scanf("%d",&log);
  25.    if(log==1)
  26.    {
  27.        printf("Estados de casos: 1 Nuevo, 2 Pendiente, 3 Revisado, 4 Resuelto \n");
  28.        prin=(nodo *)malloc(sizeof(nodo));
  29.        crear(prin,cont);
  30.  
  31.  
  32.    }
  33.    mostrar(prin);
  34.    return 0;
  35. }
  36.  
  37. void crear (nodo *registro, int cont)
  38. {
  39.  
  40.    char pro[200];
  41.    printf("\nUsuario: Usuario\n");
  42.    cont++;
  43.    printf("Caso numero: %d\n",cont);
  44.    registro->esta=1;
  45.    printf("Estado del caso: %d\n",registro->esta);
  46.    printf("Ingrese el problema (FIN para finalizar): \n");
  47.    scanf(" %[^\n]", pro);
  48.    if (strcmp (pro,"FIN")==0)
  49.       {
  50.            registro->sig=NULL;
  51.            return;
  52.       }
  53.    else
  54.    {
  55.  
  56.        strcpy(registro->elem, pro);
  57.        registro->caso=cont;
  58.        registro->sig=(nodo*)malloc(sizeof(nodo));
  59.        crear (registro->sig,cont);
  60.  
  61.  
  62.    }
  63.  
  64.    return;
  65. }
  66.  
  67.  
  68. void mostrar (nodo *registro)
  69. {
  70. if (registro->sig !=NULL)
  71. {
  72. printf("\nNumero de caso:%d\n",registro->caso);
  73.    printf("Estado:%d\n",registro->esta);
  74. printf ("Caso:%s\n",registro->elem);
  75. mostrar (registro->sig);
  76. }
  77. return;
  78. }
  79.  

Muchas gracias, igual les pido a los mod´s k no cierren este theard, preferira dejarlo abierto hasta k termine el tp, k es para el jueves, GRACIAS!


En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: duda con recursividad y listas
« Respuesta #2 en: 3 Julio 2012, 02:57 am »

¡Buenas!

En el primer post que has enviado, el contador se crea en la pila como parametro, inicializado a uno, en cada llamada a la funcion recursiva. Si quieres que todas las llamadas a la funcion recursiva compartan una variable tendras que declararla estatica.

¡Saludos!

PD: Si declaras la variable estatica, como consecuencia de que todas las llamadas a la funcion la comparten, cualquier modificacion en alguna de las llamadas hara que el nuevo valor sea compartido por todas la copias.
« Última modificación: 3 Julio 2012, 02:59 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
elbuitre86

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: duda con recursividad y listas
« Respuesta #3 en: 3 Julio 2012, 05:47 am »

a k llamas declarar la variable estatica??
osea, k si yo uso el contador en otra variable, esta va a tomar el valor de la ultima funcion? por ejemplo
si en la funcion crear el cont termina en 7, la proxima vez k lo use va a arrancar de 7?

y ahora estoy teniendo otro problema, estoy keriendo usar 2 listas, una k contiene en numero de caso, el estado y el problema en si, y otra k sea de usuarios, pero por alguna razon no me la esta creando y la verdad k nose pork.... aki el codigo

Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6.  
  7. typedef struct lista
  8. {
  9.    char elem [200];
  10.    int caso,esta;
  11.    struct lista *sig;
  12. } nodo;
  13.  
  14. typedef struct usuario
  15. {
  16.    char usu [20];
  17.  
  18.    struct usuario *sigu;
  19. } nodou;
  20.  
  21.  
  22. void crear (nodo *registro,int cont);
  23. void mostrar (nodo *registro);
  24. void generar (nodou *registro);
  25. void mostrar2(nodou *registro);
  26.  
  27.  
  28. int main()
  29. {
  30.    nodo *prin;
  31.    nodou *prin2;
  32.    int log,cont=0;
  33.    prin2=(nodou *)malloc(sizeof(nodou));
  34.    generar(prin2);
  35.    mostrar2(prin2);
  36.    printf("Ingresar como usuario(1), helpdisk(2), modificar usuarios (3): ");
  37.    scanf("%d",&log);
  38.    if(log==1)
  39.    {
  40.        printf("Estados de casos: 1 Nuevo, 2 Pendiente, 3 Revisado, 4 Resuelto \n");
  41.        prin=(nodo *)malloc(sizeof(nodo));
  42.        crear(prin,cont);
  43.    }
  44.    else if (log==3)
  45.    {
  46.  
  47.    }
  48.    mostrar(prin);
  49.    return 0;
  50. }
  51.  
  52. void crear (nodo *registro, int cont)
  53. {
  54.  
  55.    char pro[200];
  56.    printf("\nUsuario: Usuario\n");
  57.    cont++;
  58.    printf("Caso numero: %d\n",cont);
  59.    registro->esta=1;
  60.    printf("Estado del caso: %d\n",registro->esta);
  61.    printf("Ingrese el problema (FIN para finalizar): \n");
  62.    scanf(" %[^\n]", pro);
  63.    if (strcmp (pro,"FIN")==0)
  64.       {
  65.            registro->sig=NULL;
  66.            return;
  67.       }
  68.    else
  69.    {
  70.  
  71.        strcpy(registro->elem, pro);
  72.        registro->caso=cont;
  73.        registro->sig=(nodo*)malloc(sizeof(nodo));
  74.        crear (registro->sig,cont);
  75.  
  76.  
  77.    }
  78.  
  79.    return;
  80. }
  81.  
  82.  
  83. void mostrar (nodo *registro)
  84. {
  85. if (registro->sig !=NULL)
  86. {
  87. printf("\nNumero de caso:%d\n",registro->caso);
  88.    printf("Estado:%d\n",registro->esta);
  89. printf ("Caso:%s\n",registro->elem);
  90. mostrar (registro->sig);
  91. }
  92. return;
  93. }
  94.  
  95.  
  96. void generar (nodou *registro)
  97. {
  98.  /*strcpy(registrou->usu, "Usuario");
  99.   registrou->sigu=(nodou *)malloc(sizeof(nodou);
  100.   strcpy(registrou->usu, "Senior");
  101.   registrou->sigu=(nodou *)malloc(sizeof(nodou);
  102.   strcpy(registrou->usu, "SSR");
  103.   registrou->sigu=(nodou *)malloc(sizeof(nodou);
  104.   strcpy(registrou->usu, "Junior");*/
  105.  printf("Agrear usuairo: \n");
  106.  scanf("%s",registro->usu);
  107. if (strcmp (registro->usu,"FIN")==0)
  108. registro->sigu=NULL;
  109. else
  110. {
  111.  
  112.  
  113.    registro->sigu=(nodou *)malloc(sizeof(nodou); //<- creo k aca esta el ERROR!
  114. generar() (registro->sigu);
  115.    }
  116. return;
  117. }
  118.  
  119.  
  120. void mostrar2(nodou *registro)
  121. {
  122.    if (registro->sigu !=NULL)
  123. {
  124. printf ("%s\n",registro->usu);
  125. mostrar2 (registro->sigu);
  126. }
  127. return;
  128. }
  129.  

desde ya muchas gracias!
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: duda con recursividad y listas
« Respuesta #4 en: 3 Julio 2012, 06:38 am »

Hola! mira como llamas a generar:

Código
  1. generar() (registro->sigu);


Saludos
En línea

Ahorrate una pregunta, lee el man
elbuitre86

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: duda con recursividad y listas
« Respuesta #5 en: 3 Julio 2012, 07:00 am »

gracias por la correcion! :D igualmente el error sigue :(
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: duda con recursividad y listas
« Respuesta #6 en: 3 Julio 2012, 07:55 am »

xDD sabia que ese no era el problema, es que no tenia ganas de analizar :P.... finalmente lo compile y me anduvo bien, cual es tu problema?? detalla mejor el problema y da un ejemplo, xq a mi me anda


Saludos
En línea

Ahorrate una pregunta, lee el man
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: duda con recursividad y listas
« Respuesta #7 en: 3 Julio 2012, 16:07 pm »

a k llamas declarar la variable estatica??
osea, k si yo uso el contador en otra variable, esta va a tomar el valor de la ultima funcion? por ejemplo
si en la funcion crear el cont termina en 7, la proxima vez k lo use va a arrancar de 7?

Si.

Prueba con esto:
Código
  1. void recursion(void)
  2. {
  3.    static int c=0;
  4.  
  5.    if(c==10)
  6.        return;
  7.  
  8.    c++;
  9.  
  10.    printf("%d\n",c);
  11.  
  12.    recursion();
  13.  
  14.    printf("%d\n",c);
  15. }
  16.  
¡Saludos!
« Última modificación: 3 Julio 2012, 16:30 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
elbuitre86

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: duda con recursividad y listas
« Respuesta #8 en: 3 Julio 2012, 18:35 pm »

gracias durasno!!! me re sirvio!!! uso el contador dentro de la "sub funcion" asi k kedo de 10!! ademas tengo k usar unos 3 o 4 contadores, asi k me viene genial!
el problema k tenia era k me faltaba un parentesis por eso no me compilaba!! y la verdad k no me di cuenta hasta hoy a la mañana
asi estaba
Código
  1. registro->sigu=(nodou *)malloc(sizeof(nodou);
y lo solucione asi
Código
  1. registro->sigu=(nodou *)malloc(sizeof(nodou));
y ahora anda! :D
el tema es k yo lo estoy haciendo asi
Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6.  
  7. typedef struct lista
  8. {
  9.    char elem [200];
  10.    int caso,esta;
  11.    struct lista *sig;
  12. } nodo;
  13.  
  14. typedef struct usuario
  15. {
  16.    char usu [20];
  17.    int nusu;
  18.    struct usuario *sigu;
  19. } nodou;
  20.  
  21.  
  22. void crear (nodo *registro);
  23. void mostrar (nodo *registro);
  24. void generar (nodou *registro);
  25. void mostrar2(nodou *registro);
  26. int inicio(int log);
  27.  
  28.  
  29.  
  30. int main()
  31. {
  32.    nodo *prin;
  33.    nodou *prin2;
  34.    int l,log,log2;
  35.    prin=(nodo *)malloc(sizeof(nodo));
  36.    prin2=(nodou *)malloc(sizeof(nodou));
  37.    generar(prin2);
  38.    mostrar2(prin2);
  39.    do
  40.    {
  41.        printf("Ingresar como usuario(1), helpdisk(2), modificar usuarios (3): FIN: (4)");
  42.        scanf("%d",&log);
  43.        l=inicio(log);
  44.  
  45.        switch(l)
  46.        {
  47.        case 1:
  48.            printf("Estados de casos: 1 Nuevo, 2 Pendiente, 3 Revisado, 4 Resuelto \n");
  49.            crear(prin);
  50.            mostrar(prin);
  51.            continue;
  52.  
  53.        case 2:
  54.  
  55.            printf("Modificar caso: 1 Eliminar Caso: 2 Insertar Caso: 3 Principio: 4");
  56.            scanf("%d",&log2);
  57.            l=inicio(log2);
  58.            /*do
  59.             {
  60.                 op=menu();
  61.                 switch(op)
  62.                 {
  63.                 case 1:
  64.                     printf("ingrese un valor: ");
  65.                     scanf("%d", &valor);
  66.                     agregar(&cabeza, &fin, valor);
  67.                     printf("\n");
  68.                     mostrar(cabeza);
  69.                     continue;
  70.                 case 2:
  71.                     if (cabeza == NULL)
  72.                         printf("\n VACIA!\n");
  73.                     else
  74.                     {
  75.                         x=sacar(&cabeza, &fin);
  76.                         printf("\n el valor eliminado es %d\n", x);
  77.                     }
  78.                     mostrar(cabeza);
  79.                     continue;
  80.                 case 3:
  81.                     printf("\nFin proceso\n");
  82.                     continue;
  83.                 }
  84.  
  85.                 while (op != 3);
  86.             }*/
  87.            continue;
  88.        case 4:
  89.            printf("\nFin proceso\n");
  90.            continue;
  91.  
  92.        }
  93.    }
  94.    while (l!=4);
  95.    return 0;
  96. }
  97.  
  98.  
  99.  
  100. int inicio(int log)
  101. {
  102.  
  103.  
  104.    do
  105.    {
  106.  
  107.  
  108.        if (log<1 || log>4)
  109.            printf("ERROR!\n");
  110.    }
  111.    while (log<1 || log>4);
  112.    return log;
  113. }
  114.  
  115.  
  116. void crear (nodo *registro)
  117. {
  118.  
  119.    char pro[200];
  120.    static int cont=0;
  121.    printf("\nUsuario: Usuario\n");
  122.    cont++;
  123.    printf("Caso numero: %d\n",cont);
  124.    registro->esta=1;
  125.    printf("Estado del caso: %d\n",registro->esta);
  126.    printf("Ingrese el problema (FIN para finalizar): \n");
  127.    scanf(" %[^\n]", pro);
  128.    if (strcmp (pro,"FIN")==0)
  129.    {
  130.        registro->sig=NULL;
  131.        return;
  132.    }
  133.    else
  134.    {
  135.  
  136.        strcpy(registro->elem, pro);
  137.        registro->caso=cont;
  138.        registro->sig=(nodo*)malloc(sizeof(nodo));
  139.        crear (registro->sig);
  140.  
  141.  
  142.    }
  143.  
  144.    return;
  145. }
  146.  
  147.  
  148. void mostrar (nodo *registro)
  149. {
  150.    if (registro->sig !=NULL)
  151.    {
  152.        printf("\nNumero de caso:%d\n",registro->caso);
  153.        printf("Estado:%d\n",registro->esta);
  154.        printf ("Caso:%s\n",registro->elem);
  155.        mostrar (registro->sig);
  156.    }
  157.    return;
  158. }
  159.  
  160.  
  161. void generar (nodou *registro)
  162. {
  163.    /*strcpy(registro->usu, "Usuario");
  164.     registro->sigu=(nodou *)malloc(sizeof(nodou));
  165.     generar(registro->sigu);
  166.     strcpy(registro->usu, "Senior");
  167.     registro->sigu=(nodou *)malloc(sizeof(nodou));
  168.     generar(registro->sigu);
  169.     strcpy(registro->usu, "SSR");
  170.     registro->sigu=(nodou *)malloc(sizeof(nodou));
  171.     generar(registro->sigu);
  172.     strcpy(registro->usu, "Junior");*/
  173.    printf("Agrear usuairo: \n");
  174.    scanf("%s",registro->usu);
  175.    if (strcmp (registro->usu,"FIN")==0)
  176.        registro->sigu=NULL;
  177.   else
  178.    {
  179.        registro->sigu=(nodou *)malloc(sizeof(nodou));
  180.        generar(registro->sigu);
  181.   }
  182.                                   return;
  183. }
  184.  
  185.  
  186. void mostrar2(nodou *registro)
  187. {
  188.    if (registro->sigu !=NULL)
  189.    {
  190.        printf ("%s\n",registro->usu);
  191.        mostrar2 (registro->sigu);
  192.    }
  193.    return;
  194. }
  195.  
  196.  
  197.  

yo lo k quiero k esta lista
Código
  1. typedef struct usuario
  2. {
  3.    char usu [20];
  4.    int nusu;
  5.    struct usuario *sigu;
  6. } nodou;
  7.  

ya este cargada con datos, en el programa lo estoy haciendo " a mano" y lo k quiero es k esos usuarios ya esten pre cargados.
Mi fin con esta lista es despues poder modificarla, agregar usuarios o eliminarlos, pero quiero k haya pre cargados ya usaurios.
GRACIAS!!!!!!! :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda Acerca De Listas y Listas Circulares (Revienta Memoria :S)
Programación C/C++
Gerik 0 5,973 Último mensaje 12 Septiembre 2010, 01:49 am
por Gerik
Duda de principiante sobre recursividad
Programación C/C++
bananakatana 2 3,087 Último mensaje 13 Diciembre 2010, 04:04 am
por negux
Duda con recursividad, punteros y parametros por dirección
Programación C/C++
jmrivas 3 2,670 Último mensaje 7 Julio 2014, 17:40 pm
por eferion
Listas + recursividad
Programación C/C++
Persephone 2 2,116 Último mensaje 3 Noviembre 2019, 08:08 am
por Persephone
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines