Autor
|
Tema: duda con recursividad y listas (Leído 3,216 veces)
|
elbuitre86
Desconectado
Mensajes: 6
|
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. #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> typedef struct lista { char elem [200]; int usu; int caso; struct lista *sig; } nodo; void crear (nodo *pt); int main() { nodo *prin; int log; printf("Ingresar como usuario(1) o como helpdisk(2): "); scanf("%d",&log); if(log==1) { prin=(nodo *)malloc(sizeof(nodo)); crear(prin); } return 0; } void crear (nodo *registro) { int cont=1; char pro[200]; printf("Usuario: Usuario\n"); printf("Caso numero: %d\n",cont); cont++; printf("Ingrese el problema (FIN para finalizar): \n"); scanf(" %[^\n]", pro); if (strcmp (pro,"FIN")==0) { registro->sig=NULL; return; } else { strcpy(registro->elem, pro); registro->caso=cont; registro->sig=(nodo*)malloc(sizeof(nodo)); crear (registro->sig); } return; }
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
|
|
|
En línea
|
|
|
|
elbuitre86
Desconectado
Mensajes: 6
|
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 #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> typedef struct lista { char elem [200]; int caso,esta; struct lista *sig; } nodo; void crear (nodo *registro,int cont); void mostrar (nodo *registro); int main() { nodo *prin; int log,cont=0; printf("Ingresar como usuario(1) o como helpdisk(2): "); scanf("%d",&log); if(log==1) { printf("Estados de casos: 1 Nuevo, 2 Pendiente, 3 Revisado, 4 Resuelto \n"); prin=(nodo *)malloc(sizeof(nodo)); crear(prin,cont); } mostrar(prin); return 0; } void crear (nodo *registro, int cont) { char pro[200]; printf("\nUsuario: Usuario\n"); cont++; printf("Caso numero: %d\n",cont); registro->esta=1; printf("Estado del caso: %d\n",registro->esta); printf("Ingrese el problema (FIN para finalizar): \n"); scanf(" %[^\n]", pro); if (strcmp (pro,"FIN")==0) { registro->sig=NULL; return; } else { strcpy(registro->elem, pro); registro->caso=cont; registro->sig=(nodo*)malloc(sizeof(nodo)); crear (registro->sig,cont); } return; } void mostrar (nodo *registro) { if (registro->sig !=NULL) { printf("\nNumero de caso:%d\n",registro->caso); printf("Estado:%d\n",registro->esta); printf ("Caso:%s\n",registro->elem); mostrar (registro->sig); } return; }
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
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡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
Mensajes: 6
|
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 #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> typedef struct lista { char elem [200]; int caso,esta; struct lista *sig; } nodo; typedef struct usuario { char usu [20]; struct usuario *sigu; } nodou; void crear (nodo *registro,int cont); void mostrar (nodo *registro); void generar (nodou *registro); void mostrar2(nodou *registro); int main() { nodo *prin; nodou *prin2; int log,cont=0; prin2=(nodou *)malloc(sizeof(nodou)); generar(prin2); mostrar2(prin2); printf("Ingresar como usuario(1), helpdisk(2), modificar usuarios (3): "); scanf("%d",&log); if(log==1) { printf("Estados de casos: 1 Nuevo, 2 Pendiente, 3 Revisado, 4 Resuelto \n"); prin=(nodo *)malloc(sizeof(nodo)); crear(prin,cont); } else if (log==3) { } mostrar(prin); return 0; } void crear (nodo *registro, int cont) { char pro[200]; printf("\nUsuario: Usuario\n"); cont++; printf("Caso numero: %d\n",cont); registro->esta=1; printf("Estado del caso: %d\n",registro->esta); printf("Ingrese el problema (FIN para finalizar): \n"); scanf(" %[^\n]", pro); if (strcmp (pro,"FIN")==0) { registro->sig=NULL; return; } else { strcpy(registro->elem, pro); registro->caso=cont; registro->sig=(nodo*)malloc(sizeof(nodo)); crear (registro->sig,cont); } return; } void mostrar (nodo *registro) { if (registro->sig !=NULL) { printf("\nNumero de caso:%d\n",registro->caso); printf("Estado:%d\n",registro->esta); printf ("Caso:%s\n",registro->elem); mostrar (registro->sig); } return; } void generar (nodou *registro) { /*strcpy(registrou->usu, "Usuario"); registrou->sigu=(nodou *)malloc(sizeof(nodou); strcpy(registrou->usu, "Senior"); registrou->sigu=(nodou *)malloc(sizeof(nodou); strcpy(registrou->usu, "SSR"); registrou->sigu=(nodou *)malloc(sizeof(nodou); strcpy(registrou->usu, "Junior");*/ printf("Agrear usuairo: \n"); scanf("%s",registro->usu); if (strcmp (registro->usu,"FIN")==0) registro->sigu=NULL; else { registro->sigu=(nodou *)malloc(sizeof(nodou); //<- creo k aca esta el ERROR! generar() (registro->sigu); } return; } void mostrar2(nodou *registro) { if (registro->sigu !=NULL) { printf ("%s\n",registro->usu); mostrar2 (registro->sigu); } return; }
desde ya muchas gracias!
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
Hola! mira como llamas a generar: generar() (registro->sigu);
Saludos
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
elbuitre86
Desconectado
Mensajes: 6
|
gracias por la correcion! igualmente el error sigue
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
xDD sabia que ese no era el problema, es que no tenia ganas de analizar .... 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
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
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: void recursion(void) { static int c=0; if(c==10) return; c++; recursion(); }
¡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
Mensajes: 6
|
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 registro->sigu=(nodou *)malloc(sizeof(nodou);
y lo solucione asi registro->sigu=(nodou *)malloc(sizeof(nodou));
y ahora anda! el tema es k yo lo estoy haciendo asi #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> typedef struct lista { char elem [200]; int caso,esta; struct lista *sig; } nodo; typedef struct usuario { char usu [20]; int nusu; struct usuario *sigu; } nodou; void crear (nodo *registro); void mostrar (nodo *registro); void generar (nodou *registro); void mostrar2(nodou *registro); int inicio(int log); int main() { nodo *prin; nodou *prin2; int l,log,log2; prin=(nodo *)malloc(sizeof(nodo)); prin2=(nodou *)malloc(sizeof(nodou)); generar(prin2); mostrar2(prin2); do { printf("Ingresar como usuario(1), helpdisk(2), modificar usuarios (3): FIN: (4)"); scanf("%d",&log); l=inicio(log); switch(l) { case 1: printf("Estados de casos: 1 Nuevo, 2 Pendiente, 3 Revisado, 4 Resuelto \n"); crear(prin); mostrar(prin); continue; case 2: printf("Modificar caso: 1 Eliminar Caso: 2 Insertar Caso: 3 Principio: 4"); scanf("%d",&log2); l=inicio(log2); /*do { op=menu(); switch(op) { case 1: printf("ingrese un valor: "); scanf("%d", &valor); agregar(&cabeza, &fin, valor); printf("\n"); mostrar(cabeza); continue; case 2: if (cabeza == NULL) printf("\n VACIA!\n"); else { x=sacar(&cabeza, &fin); printf("\n el valor eliminado es %d\n", x); } mostrar(cabeza); continue; case 3: printf("\nFin proceso\n"); continue; } while (op != 3); }*/ continue; case 4: printf("\nFin proceso\n"); continue; } } while (l!=4); return 0; } int inicio(int log) { do { if (log<1 || log>4) printf("ERROR!\n"); } while (log<1 || log>4); return log; } void crear (nodo *registro) { char pro[200]; static int cont=0; printf("\nUsuario: Usuario\n"); cont++; printf("Caso numero: %d\n",cont); registro->esta=1; printf("Estado del caso: %d\n",registro->esta); printf("Ingrese el problema (FIN para finalizar): \n"); scanf(" %[^\n]", pro); if (strcmp (pro,"FIN")==0) { registro->sig=NULL; return; } else { strcpy(registro->elem, pro); registro->caso=cont; registro->sig=(nodo*)malloc(sizeof(nodo)); crear (registro->sig); } return; } void mostrar (nodo *registro) { if (registro->sig !=NULL) { printf("\nNumero de caso:%d\n",registro->caso); printf("Estado:%d\n",registro->esta); printf ("Caso:%s\n",registro->elem); mostrar (registro->sig); } return; } void generar (nodou *registro) { /*strcpy(registro->usu, "Usuario"); registro->sigu=(nodou *)malloc(sizeof(nodou)); generar(registro->sigu); strcpy(registro->usu, "Senior"); registro->sigu=(nodou *)malloc(sizeof(nodou)); generar(registro->sigu); strcpy(registro->usu, "SSR"); registro->sigu=(nodou *)malloc(sizeof(nodou)); generar(registro->sigu); strcpy(registro->usu, "Junior");*/ printf("Agrear usuairo: \n"); scanf("%s",registro->usu); if (strcmp (registro->usu,"FIN")==0) registro->sigu=NULL; else { registro->sigu=(nodou *)malloc(sizeof(nodou)); generar(registro->sigu); } return; } void mostrar2(nodou *registro) { if (registro->sigu !=NULL) { printf ("%s\n",registro->usu); mostrar2 (registro->sigu); } return; }
yo lo k quiero k esta lista typedef struct usuario { char usu [20]; int nusu; struct usuario *sigu; } nodou;
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!!!!!!!
|
|
|
En línea
|
|
|
|
|
|