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

Función recursiva + string

Estas en el tema de Función recursiva + string en el foro de C/C++ en Foros del Web. ¡Saludos! Necesito una idea para un ejercicio, no creo que sea demasiado complicado pero no logro dar con la tecla. El ejercicio es el siguiente: ...
  #1 (permalink)  
Antiguo 01/12/2012, 23:08
Avatar de 1333nvz  
Fecha de Ingreso: julio-2012
Mensajes: 20
Antigüedad: 11 años, 9 meses
Puntos: 1
Función recursiva + string

¡Saludos!
Necesito una idea para un ejercicio, no creo que sea demasiado complicado pero no logro dar con la tecla.

El ejercicio es el siguiente:

Dada una cadena del tipo abcdef, ingrese un carácter inicial y uno final cualesquiera, se devolverá la cantidad de caracteres intermedios.
Ejemplo: cadena abcdef, carácter inicial: b, carácter final d, cantidad de caracteres intermedios 1.


A continuación dejo el código en su versión iterativa:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4.  
  5.  
  6. int contar(char cad[20], char ci, char cf);
  7.  
  8.  
  9. void main()
  10. {
  11.  char cad[20];
  12.  char ci;
  13.  char cf;
  14.  int caracs;
  15.  
  16.  printf("Ingrese una cadena \n");
  17.  gets(cad);
  18.  fflush(stdin);
  19.  printf("Ingrese el caracter inicial \n");
  20.   scanf("%c", &ci);
  21.   fflush(stdin);
  22.  printf("Ingrese el caracter final \n");
  23.   scanf("%c", &cf);
  24.   fflush(stdin);
  25.  
  26.  
  27. caracs = contar(cad, ci, cf);
  28.  
  29. printf("LA CANT DE CARAC, ES %d", caracs);
  30.  
  31.  
  32. }
  33.  
  34. int  contar(char cad[20], char ci, char cf)
  35. {
  36.  int i = 0;
  37.  int bandera = 0;
  38.  int contador = 0;
  39.  while(cad[i] != cf )
  40.   {
  41.  
  42.    if(bandera == 1)
  43.     {
  44.  
  45.      contador = contador + 1;
  46.  
  47.  
  48.     }
  49.  
  50.  
  51.    if(cad[i] == ci)
  52.     {
  53.  
  54.      bandera = 1;
  55.  
  56.     }
  57.  
  58.  
  59.  
  60.    i++;
  61.  
  62.   }
  63.  
  64.  
  65.  return(contador);
  66.  
  67. }

¿Alguna idea para hacer esto mismo, pero sin usar una bandera y hacerlo mediante una función recursiva?
  #2 (permalink)  
Antiguo 02/12/2012, 07:21
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Función recursiva + string

Si la idea es contar los caraceres puedes solucionarlo con un strchr y strrchr

Código:
char bff[] = "abcdefg";
char *ci = strchr(bff, 'b');
char *cf = strrchr(bff, 'f');
int t = (cf-bff)-(ci-bff+1);
Si la idea es practicar la recursividad, tendras que usar un flag de estado (bandera) para saber que ya estas dentro del rango objetivo; este flag deberá ser accesible y continuo deste todas las ejecuciones: o se envia como argumento o se deja como estatica global; ademas tendras que intercambiar posiciones de lectura: otro argumento con un incremental que indica la posicion de lectura, o si quieres ahorrarte este argumento deberas modificar el texto evaluado (tal como hace strtok). Te dejo un simple ejemplo:

Código:
int contar(char *bff, char ci, char cf, char inrange, int rp) {
    int t = 0;
    
    if(rp >= strlen(bff)) {
        return -1;
    }
    
    if(!inrange) {
        if(bff[rp] == ci) {
            inrange = 1;
        }
    }
    else {
        if(bff[rp] == cf) {
            inrange = 0;
        }
    }
    
    t += (inrange + contar(bff, ci, cf, inrange, ++rp));
    
    return t;
}

//la llamada se hace inicializando los flags de estado
int caracs = contar(buffer, 'b', 'd', 0, 0);
Tal como ves no puedes ahorrarte los flags de estado porque tendrias que evaluar todo el texto en cada ejecucion (no tendria sentido usar recursividad para escanear todo el texto en cada vuelta). Ten en cuenta que hay mas formas de plantear la solucion, esto es solo una idea rapida.

Saludos
vosk

Etiquetas: recursividad, string
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 18:12.