Portada arrow Artículos arrow Entrada de datos con centinela
Entrada de datos con centinela
martes, 02 de enero de 2007

ImageLa entrada de datos con centinela consiste en utilizar un valor especial de datos que indica que ya no se deben introducir más datos. A ese valor se le denomina centinela.

Programando nos encontramos este caso en multitud de ocasiones. Por ejemplo, en el típico ejercicio de clase donde se nos pide que obtengamos una serie de cadenas hasta que se introduce la palabra "fin" o algo similar.... o que obtengamos enteros hasta que se introduzca uno negativo....

Esta estructura de obtener datos de un canal de entrada (en los problemas más básicos será el teclado, pero puede extrapolarse fácilmente a ficheros, tuberías, conexiones de red, etc...) hasta que un dato cumpla una determinada condición es la entrada con centinela.

En general, será necesario utilizar un bucle. Tal como describíamos en el artículo Un bucle para cada cosa, debemos escoger con cuidado el bucle a utilizar.

Parémonos a pensar un momento:

-El bucle for se repite un número determinado de veces. Si tengo que leer datos hasta que aparezca el centinela, no sé a priori cuándo va a aparecer, con lo que éste bucle no es útil aquí.

-El bucle while se repite un número indeterminado de veces. Podría ser más adecuado... pero no lo es. En la entrada de datos con centinela siempre es necesario obtener al menos un valor, para poder determinar si es o no el centinela. El bucle while sirve para iteraciones que se repiten 0 o más veces.... y necesitamos al menos una.

El bucle que siempre se ejecuta al menos una vez es el do...while (o repeat...until, según el lenguaje que utilicemos). Éste es el más adecuado.

La estructura más básica de una entrada de datos con centinela es algo de éste estilo:

   hacer
     leer dato;
     Si dato no es centinela
         procesar dato
     fin si
   mientras dato no es centinela
 

Un pequeño ejemplo en C#... Este código pide cadenas por el teclado, hasta que se introduce la palabra fin.

String entrada;
String centinela="fin";
Console.WriteLine("Introduce cadenas. Se termina con 'fin'");
do
{
   Console.Write("-->");
   entrada = Console.ReadLine();
   if (entrada != centinela)
   {
      //procesar un elemento
      Console.WriteLine("ENCONTRADO DATO: " + entrada);
   }
} while (entrada != centinela);
Console.WriteLine("ENCONTRADO CENTINELA.");
 

Por último, comentar que es un error frecuente (y poco elegante, aunque funcione), utilizar un bucle while para este tipo de entrada de datos. El error reside en que utilizar un while obliga a duplicar parte del código. Cuando digo duplicar, quiero decir un miserable cortar y pegar. Eso puede parecer poco importante cuando se trata de un simple ejemplo, como los comentados en este caso, pero en una aplicación real tiene implicaciones más importantes: si se produjera cualquier tipo de problema en las líneas duplicadas, su corrección debe producirse en dos sitios distintos; además, si fuera necesario introducir modificaciones, también deberían hacerse en dos sitios distintos, sin olvidarse de ninguno de ellos.

Por ejemplo, observa este código.  Hemos utilizado ahora el bucle while. Esto nos obliga a repetir fuera del bucle las líneas que realizan la obtención de un dato. Imagina que queremos substituir la flechita que hemos puesto "-->" por otro mensaje, por ejemplo "Introduce dato: ". Estamos obligados o realizar la modificación en dos sitios. Hemos aumentado innecesariamente la dificultad de introducir modificaciones, y las posibilidades de introducir un error.

//Este código NO ES CORRECTO.
String entrada;
String centinela="fin";
Console.WriteLine("Introduce cadenas. Se termina con 'fin'");
//-------------------
//estas dos líneas se repiten
Console.Write("-->");
entrada = Console.ReadLine();
//-------------------
while (entrada!=centinela)
{
   if (entrada != centinela)
   {
      //procesar un elemento
      Console.WriteLine("ENCONTRADO DATO: " + entrada);
   }
   Console.Write("-->");
   entrada = Console.ReadLine();
}
Console.WriteLine("ENCONTRADO CENTINELA.");
 

 
←Artículo anterior   Artículo siguiente→

Categorías

  • Ingeniería del software  ( 3 artículos )

    Acerca de la ingeniería del software y el ciclo de vida del software.

  • El programador elegante  ( 12 artículos )
    Una serie de artículos dedicados a buenas prácticas en programación
  • Opinión  ( 7 artículos )

    Artículos de opinión, no necesariamente fundamentada.

  • Básico  ( 12 artículos )

    Artículos básicos sobre temas básicos.

     

Suscríbete

RSS feed Sindicación RSS

(¿Qué es la sindicación RSS?)


Suscribir por e-mail

¿Dónde estoy?

Estás en La tecla de ESCAPE, un sitio web personal en el que nos gusta hablar de algoritmos, informática, tecnología, ciencia, ingeniería, internet... y cualquier tontería que se nos ocurra. El punto de vista de nuestros artículos técnicos suele ser muy básico, así que a menudo adoptamos grandes simplificaciones. (Más...-Términos de uso)