Anuncio

Colapsar
No hay ningún anuncio todavía.

busca_cadena(texto, texto_buscado)

Colapsar
X
 
  • Filtro
  • Hora
  • Mostrar
Borrar todo
nuevos mensajes

  • Matlab busca_cadena(texto, texto_buscado)

    Buenas. Estoy programando una cosa que ya programé hace unas semanas. Lo deprimente es que en aquel entonces conseguí hacerlo, pero ahora me salta error. Intento buscar una cadena de texto determinada dentro de un texto. Mi programa es así:

    [FONT=Fixedsys]function [r]=BBusca_cadena(texto, texto_b)
    j=1;
    k=1;
    while ( j<=length(texto_b) )
    while ( k<=length(texto) )
    if texto(k)==texto_b(j)
    k=k+1;
    j=j+1;
    if j==2
    enc=k;
    end
    else
    k=k+1;
    enc=-1;
    end
    end
    end
    r=enc;
    end[/FONT]

    El programa debería devolver el valor r=enc, que indica la posición donde comienza la cadena buscada dentro del texto (si es que la encuentra).

    Mi llamada a la función es:

    >> BBusca_cadena('ABCHOLAABC', 'HOLA')

    Y el error que obtengo es:

    [FONT=Fixedsys]??? Attempted to access texto_b(5); index out of bounds because numel(texto_b)=4.

    Error in ==> BBusca_cadena at 6
    if texto(k)==texto_b(j)
    [/FONT]

    Sé que me está diciendo que estoy intentando acceder a una posición que no existe, pero no entiendo por qué; el bucle while debería terminar.

    Por favor, que alguien me ilumine!

    Saludos.

  • #2
    Re: busca_cadena(texto, texto_buscado)

    PD: Si en el segundo "while" pongo la condición siguiente:

    [FONT=Fixedsys]while ( k<=length(texto) && j<=length(texto_b))[/FONT]

    Entonces sí consigo evitar el error; pero me devuelve el valor de enc desplazado 1 posición adelante. Es decir, si mi llamada es:

    >> BBusca_cadena('ABCHOLAABC', 'HOLA')

    El valor de enc deberia ser enc=4 Sin embargo me devuelve enc=5

    Vaya y vaya... ¿Por qué?

    Comentario


    • #3
      Re: busca_cadena(texto, texto_buscado)

      Tu mayor problema es que estás alterando simultáneamente la posición inicial de búsqueda en [FONT=Fixedsys]texto[/FONT] y la posición en [FONT=Fixedsys]texto_b[/FONT].

      Te propongo la siguiente versión, limitándome a lo que has mostrado del lenguaje, pues no se si dispones de bucles for/next, break y/o return. También estoy presumiendo, basado en tu programa, que Mathlab numera los caracteres de las cadenas empezando en 1 en lugar de 0 como otros lenguajes.

      Código:
      [FONT=Fixedsys]function [r]=BBusca_cadena(texto, texto_b)[/FONT]
      [FONT=Fixedsys]enc=0;[/FONT]
      [FONT=Fixedsys]if length(texto_b)<=length(texto)[/FONT]
      [FONT=Fixedsys] k=1;[/FONT]
      [FONT=Fixedsys] while ( k<=(length(texto)-length(texto_b)+1) && enc==0 )[/FONT]
      [FONT=Fixedsys]  j=1;[/FONT]
      [FONT=Fixedsys]  enc=1;[/FONT]
      [FONT=Fixedsys]  while ( j<=length(texto_b) && enc~=0 )[/FONT]
      [FONT=Fixedsys]   if texto(k+j-1)==texto_b(j)[/FONT]
      [FONT=Fixedsys]    enc=k;[/FONT]
      [FONT=Fixedsys]   else[/FONT]
      [FONT=Fixedsys]    enc=0;[/FONT]
      [FONT=Fixedsys]   end;[/FONT]
      [FONT=Fixedsys]   j=j+1;[/FONT]
      [FONT=Fixedsys]  end[/FONT]
      [FONT=Fixedsys]  k=k+1;[/FONT]
      [FONT=Fixedsys] end[/FONT]
      [FONT=Fixedsys]end[/FONT]
      [FONT=Fixedsys][FONT=Fixedsys]r=enc;[/FONT]
      end[/FONT]
      Saludos,

      Al
      Don't wrestle with a pig in the mud. You'll both get dirty, but the pig will enjoy it. - Parafraseando a George Bernard Shaw

      Comentario


      • #4
        Re: busca_cadena(texto, texto_buscado)

        Gracias por tu modificación, pero me cuesta interpretar el programa. ¿Por qué sumas 1 en el primer bucle while, o por qué restas 1 en la segunda condición if?

        ¿Has hecho algún diagrama de flujo?

        Saludos y mil gracias.

        Comentario


        • #5
          Re: busca_cadena(texto, texto_buscado)

          - El primer if se salta todo el procedimiento si lo que estás buscando es mas largo que la cadena fuente.

          - En el primer while se revisa toda la cadena fuente desde su primer caracter hasta el último que sea posible para que quepa la cadena buscada. Por ejemplo, si estás buscando en una cadena de 100 caracteres una cadena de 4 caracteres de longitud, tienes que chequear desde el caracter 1 hasta el 97 (100-4+1), pues es imposible conseguir una coincidencia avanzando mas ya que no hay suficientes caracteres. De paso evitas, y es lo mas importante, intentar accesar posiciones inexistentes.

          - En el segundo while se avanza por toda la cadena a buscar comparando cada caracter (j) con el correspondiente a la cadena fuente a partir de la posición inicial que se revisa (j+k-1). Por ejemplo, si ya has avanzado hasta la posición 15 en la cadena fuente y tu cadena buscada tiene 4 caracteres, compararías el 15 (15+1-1) con el 1, el 16 (15+2-1) con el 2,... el 18 (15+4-1) con el 4.

          En el primer while se asume que la cadena no se ha encontrado y avanza mientras la cadena buscada quepa; en el segundo while se asume que se encontró la cadena y avanza mientras todos los caracteres coincidan.

          El diagrama de flujo siempre lo hago en la cabeza. Siempre fui de esos malos programadores que hacen el programa y después dibujan el diagrama de flujo

          Saludos,

          Al
          Don't wrestle with a pig in the mud. You'll both get dirty, but the pig will enjoy it. - Parafraseando a George Bernard Shaw

          Comentario


          • #6
            Re: busca_cadena(texto, texto_buscado)

            Ojala fuera yo tan mal programador como tú jeje.. Se nota que tienes práctica, cosa que a mi me falta para el examen de mañana. Nunca se me hubiera ocurrido ese procedimiento.

            Por cierto, ahora voy a hacer un programa que checa si un sudoku está bien hecho o no. Los dos sabemos que un sudoku está bien sólo si no se repite ningún número ni en una casilla de 3x3, ni en una fila, ni en una columna. Mi duda es: ¿tienen que cumplirse las 3 condiciones? ¿O es suficiente con que se cumpla solo 2?

            Por ejemplo, ¿podríamos afirmar que un sudoku está bien hecho si no se repite ningún número en cada columna y cada fila? ¿Automáticamente sería cierto que cada casilla de 3x3 está bien completada?

            Saludos y gracias de nuevo!

            Comentario


            • #7
              Re: busca_cadena(texto, texto_buscado)

              Yo trabajé muchos años como programador, hasta que el creciente complejo de ser un limón me llevó a dejarlo.

              Respondiendo a tu pregunta, no, tienes que hacer los tres chequeos. Mi sugerencia sobre la forma mas simple de saber si no hay ningún número repetido: calcula un número que sea la suma de 2 elevado a la potencia del (número en la casilla menos 1) para las nueve casillas. El número resultante debe ser 511 que es el equivalente decimal del número binario 111 111 111

              Saludos,

              Al
              Don't wrestle with a pig in the mud. You'll both get dirty, but the pig will enjoy it. - Parafraseando a George Bernard Shaw

              Comentario


              • #8
                Re: busca_cadena(texto, texto_buscado)

                Gracias por tu respuesta!

                Una preguntita: ¿puedes profundizar un poco más en tu método con un mini ejemplo? Es que dices "calcula un número que sea la suma de 2 elevado a la potencia del (número en la casilla menos 1) para las nueve casillas." pero realmente no lo entendí del todo

                Saludos!

                Comentario


                • #9
                  Re: busca_cadena(texto, texto_buscado)

                  Suponte que los 81 números están en un arreglo cuadrado N(9,9). La suma de la que te hablo, para la fila I, sería

                  Saludos,

                  Al
                  Don't wrestle with a pig in the mud. You'll both get dirty, but the pig will enjoy it. - Parafraseando a George Bernard Shaw

                  Comentario


                  • #10
                    Re: busca_cadena(texto, texto_buscado)

                    Vale, muchas gracias, esa fue una magnífica idea .

                    Saludos y gracias de nuevo por tu tiempo.

                    Comentario

                    Contenido relacionado

                    Colapsar

                    Trabajando...
                    X