duda con recursividad y listas

Iniciado por elbuitre86, 3 Julio 2012, 01:30 AM

0 Miembros y 1 Visitante están viendo este tema.

elbuitre86

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 (cpp) [Seleccionar]
#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 :D

elbuitre86

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 (cpp) [Seleccionar]
#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!

do-while

#2
¡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.
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

elbuitre86

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 (cpp) [Seleccionar]
#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!

durasno

Hola! mira como llamas a generar:

generar() (registro->sigu);


Saludos
Ahorrate una pregunta, lee el man

elbuitre86

gracias por la correcion! :D igualmente el error sigue :(

durasno

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
Ahorrate una pregunta, lee el man

do-while

#7
Cita de: elbuitre86 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?

Si.

Prueba con esto:

void recursion(void)
{
   static int c=0;

   if(c==10)
       return;

   c++;

    printf("%d\n",c);

   recursion();

   printf("%d\n",c);
}

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

elbuitre86

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 (cpp) [Seleccionar]
registro->sigu=(nodou *)malloc(sizeof(nodou);
y lo solucione asi
Código (cpp) [Seleccionar]
registro->sigu=(nodou *)malloc(sizeof(nodou));
y ahora anda! :D
el tema es k yo lo estoy haciendo asi
Código (cpp) [Seleccionar]
#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
Código (cpp) [Seleccionar]
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!!!!!!! :D