Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problemas de programacion recursiva

Estas en el tema de Problemas de programacion recursiva en el foro de C/C++ en Foros del Web. Hola tengo este codigo que no se que tiene mal, el tema exacto es que al caso base, osea cuando version == NULL nunk entra, ...
  #1 (permalink)  
Antiguo 11/05/2009, 13:12
Avatar de nem_sys  
Fecha de Ingreso: mayo-2009
Mensajes: 15
Antigüedad: 15 años
Puntos: 0
Exclamación Problemas de programacion recursiva

Hola tengo este codigo que no se que tiene mal, el tema exacto es que al caso base, osea cuando version == NULL nunk entra, pero no teng ni idea de por que, porfa alguien que me ayude.

El codigo se supone que lo que hace es retornar un numero de version menor al que se le pasa osea si pasamos 1.2 debe retornar 1.1

Cualquier intento de ayuda viene bien gracias!!!

typedef char* String;

String versionAnterior(String version){
String token = strtok_s(NULL, ".", &version);
if(version == NULL){
return token - 49;
}
else{
return versionAnterior(version);
}
}

void main( void ){
String a = "1.2";
a = versionAnterior(a);
cout<<a;
system("PAUSE");
}
  #2 (permalink)  
Antiguo 12/05/2009, 06:36
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problemas de programacion recursiva

Tenes que comparar *version, es decir, una cadena vacia y no un puntero nulo. Ademas si queres restar uno al primer caracter de version (justamente *version) tenes que hacerlo decrementando (siempre que no sea 0 ...) y no restando 49 (numero ASCII de 1, aunque en tu caso estas restando al puntero ...).

Código:
String versionAnterior(String version)
{
  String token = strtok_s(NULL, ".", &version);
  if (!*version)
  {
    (*token)--;
    return token;
  }
  else
  {
    return versionAnterior(version);
  }
}
Seguramente con String a = "1.2"; te dara una excepcion al intentar poner el 0 en a debido a que de esa manera declaras un puntero a una cadena que sera alojada en la seccion de datos de solo lectura. De esta manera podes hacer que la cadena sea alojada en la pila - usando un array - y a siga siendo un puntero a cadena con el mismo contenido:

Código:
char b[] = "1.2";
String a = (String)&b;
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 12/05/2009, 13:29
Avatar de nem_sys  
Fecha de Ingreso: mayo-2009
Mensajes: 15
Antigüedad: 15 años
Puntos: 0
Respuesta: Problemas de programacion recursiva

Gracias por la ayuda primero que nada, ahora tengo una duda y un problema, la duda es como se lee el if del negado del puntero, osea "si no puntero version hacer" eso es lo que no comprendo, y el problema es que al probar tu codigo descubri que no me solucionaba el problema exacto entonces lo retoque y tengo otros errores mas grabes jeje.

String versionAnterior(String version){
String token = strtok_s(NULL, ".", &version);
if (!*version){
(*token)--;
return token;
}
else{
String al = versionAnterior(version);
strcat_s(token ,1 , ".");
strcat_s(token ,strlen(al) ,al);
return token;
}
}


a y si podes explicame como enmarcas el texto del codigo en el foro para que tenga las tabulaciones. gracias
  #4 (permalink)  
Antiguo 12/05/2009, 13:52
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problemas de programacion recursiva

Ese if se cumple cuando el primer caracter de la cadena version (*version) es 0 (!), de otra manera el not (!) no se cumple, es decir cuando la cadena esta vacia.

Tampoco podes concatenar asi como asi en cualquier lado ... y esta concatenacion en particular (si le dieras un valor correcto al segundo parametro de strcat_s que es el numero de caracteres de la cadena de DESTINO) justamente borraria el numero que mas te interesa (el decrementado) ya que la cadena queda asi en memoria antes de eso si por ejemplo pasaste "1.8":
'1' 0 '7'

Donde 1 y 7 son caracteres y 0 un byte, al concatenar el '.' pone el find e cadena en lugar del 7 y lo perdes ...

La verdad es que no entiendo para que tanta complicacion, con esto tendrias el 90% hecho (faltarian un par de comprobaciones nada mas):

Código:
version[strlen(version) - 1]--;
return version;

Para mostrar el codigo ponelo entre etiquetas code (ejemplo, cambiar por CODE): [ETIQUETA]codigo aca[/ETIQUETA].
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 12/05/2009, 15:23
Avatar de nem_sys  
Fecha de Ingreso: mayo-2009
Mensajes: 15
Antigüedad: 15 años
Puntos: 0
Respuesta: Problemas de programacion recursiva

el problema con el metodo que me propones es que no funciona para cuando tiene 2 digitos como 1.10, por eso me complique un poco mas, aparte necesito practicar mucho la recursion.
Ya entendi en lo que le estaba errando, pero no entiendo por que le agrega osea ejecuta el primer strcat sin problemas y al terminar la ejecucion del mismo el contenido de la variable "al" se borro
  #6 (permalink)  
Antiguo 12/05/2009, 15:34
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problemas de programacion recursiva

No hay problema con dos digitos, si es 0 lo cambias por 9 y le restas al anterior ...

Lo pone a 0 para terminar la cadena como debe ser, fijate los bytes, vos tenes esto:
'1' 0 '7'

Ahi la cadena es esta "1", entonces le concatenas un '.', que hace que pase a ser esto:
'1' '.' 0

Y la cadena "1.", el problema es que tenias las dos cadenas una al lado de la otra.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 12/05/2009, 15:48
Avatar de nem_sys  
Fecha de Ingreso: mayo-2009
Mensajes: 15
Antigüedad: 15 años
Puntos: 0
Respuesta: Problemas de programacion recursiva

Che gracias lo arregle creando una nueva variable entonces no se superponen los espacios de memoria al concatenar, fuiste de gran ayuda. saludos
  #8 (permalink)  
Antiguo 12/05/2009, 15:55
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problemas de programacion recursiva

De nadas
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:26.