Tag Archive for lenguajes

Una introducción a Automatas finitos deterministicos (Maquinas de estado)

Screen Shot 2013-07-10 at 18.37.07

En este tutorial haremos una pequeña introducción a los automatas finitos deterministicos, esto quiere decir que hablamos de maquinas de estado donde los estados siguientes a un estado actual estan predeterminados sin equivocación alguna. Para ello he preparado el siguiente video que espero les pueda servir para comprenderlo de una manera sencilla.

Codigo fuente (ejemplo de automata finito):

Implementación del siguiente automata para evaluar cadenas de numeros binarios (1 y 0 ).

Screen Shot 2013-07-10 at 18.37.07
El siguiente codigo esta en Java, sin embargo el concepto deberia ser valido para implementarse en otros lenguajes.

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		int[] input = {1,0,0,0,0};
		int inicio = 1;
		int finalizar = 1;
		int actual = inicio;

		boolean fin = false;

		int contador = 0;
		while(fin==false)
		{
			if(contador > input.length-1)
			{
				fin = true;
				break;
			}
			if(actual==1)
			{
				if(input[contador]==1)
				{
					actual=1;
				}
				if(input[contador]==0)
				{
					actual=2;
				}
				contador++;
				continue;
			}
			if(actual==2)
			{
				if(input[contador]==1)
				{
					actual=2;
				}
				if(input[contador]==0)
				{
					actual=1;
				}
				contador++;
				continue;
			}
		}

		if(actual==finalizar)
		{
			System.out.println("La cadena es correcta");
		}
		else
		{
			System.out.println("La cadena es incorrecta");
		}

	}

}

 

Ciclo While en Ruby

Una vez nos hemos adentrado en los ciclos no podemos olvidarnos de uno de los más utilizados, el ciclo While, de nuevo, si no has programado antes, necesitas saber que ésta es una especie de ciclo que se repite mientras una condición se cumple.

La sintaxis del ciclo while en Ruby es bastante parecida a la de otros lenguajes, veamos el ejemplo:

it = 1
while i < 10
   puts it
   it += 1
end

El ciclo anterior irá de 1 a 9, cómo verás, entra al ciclo siempre y cuando la condición que se encuentra al lado de la palabra while se cumple, en este caso i<10.

Bastante sencillo ¿no? Lo interesante será combinarlo con valores que el usuario ingrese, ya que generalmente, éste ciclo se utiliza cuando no sabemos cuántas veces se necesitará repetir un bloque de código.

Cabe recalcar que las palabras que modifican un ciclo for también aplican para el ciclo while, éstas son redobreaknext, si necesitas saber más al respecto revisa el artículo anterior de éste curso.

Por ahora todo ha sido muy común, cosa extraña pensando que Ruby es uno de los lenguajes con sintaxis más peculiar, éste artículo también presenta una variante interesante del ciclo while, peculiar de Ruby, y es el ciclo until.

Until, se trata del inverso de while, es decir, un ciclo que se ejecuta siempre y cuando la condición sea FALSA, veamos el ejemplo anterior pero usando ahora until:

it = 1
until i > 9
   puts it
   it += 1
end

De nuevo el ciclo iterará de 1 a 9, nota cómo cambiamos el operador < por el >, es decir el inverso, de modo que el ciclo se itera siempre y cuando i no sea mayor que 9.

Algunos conocedores se estarán preguntando, qué pasa con la variante do… while, en Ruby no hay algo como tal, pero bien se puede hacer uno basado en el poder de los bloques, veamos el ejemplo:

it = 1
begin
   puts it
   it += 1
end while i < 10

En el caso anterior, el bloque encerrado por las palabras reservadas begin end, se ejecuta una vez, posteriormente evalúa la condición y decide si debe repetirse de nuevo.

Bien, con esto terminamos el análisis de los ciclos, en el siguiente artículo veremos entrada y salida de datos con Ruby.

Expresiones booleanas y operadores lógicos

Como en todos los lenguajes, Ruby tiene variables booleanas y operadores lógicos para el manejo de instrucciones de control, como el if, el switch y los ciclos. En realidad, en Ruby existen los objetos booleanos, es decir incluso este tipo de dato es un objeto en Ruby. Déjame explicarte esto claramente porque puede ser un poco confuso, en Ruby existen dos clases peculiares TrueClass y FalseClass, son clases muy peculiares porque tú no puedes crear objetos a partir de esas clases, de hecho, en el lenguaje sólo hay un objeto de la clase TrueClass y es el objeto True, del mismo modo la clase FalseClass sólo es la instancia de un objeto, False. Lo anterior puede parecer un poco confuso, ya que en lenguajes como JAVA true y false son palabras reservadas del lenguaje, y no objetos, como en Ruby, sin embargo su uso es similiar, así que no te preocupes por eso. Veamos a través de un ejemplo cómo es que funcionan los objetos True y False de Ruby.

  if True 
    puts "Esto siempre se ejecuta porque True siempre adopta el valor verdadero de un booleano"
  end
  if False
    puts "Esto nunca se ejecutara porque False siempre adopta el valor falso de un booleano"
  end

El ejemplo, creo expresa el funcionamiento de cada uno de ellos, aunque en realidad no es práctico. Antes de pasar a las expresiones lógicas, cabe mencionar que sólo dos clases son falsas en Ruby, es decir, cumplen un valor falso en un boolean, éstas son FalseClass y NilClass, hablaremos del objeto Nil más adelante en el curso. Operadores Lógicos. Si has programado en cualquier lenguaje, seguro estás familiarizado con las operaciones lógicas, que básicamente son expresiones que sólo pueden retornar un valor booleano verdadero cuando se cumple una condición, o un valor booleano falso cuando no se cumple la condición, en el caso particular de Ruby, sería retornar el objeto True y el objeto False respectivamente. Cabe apuntar que la condición a evaluar está dada por ciertos operadores, en este tutorial veremos los siguientes.

  • “< ” Menor que, evalúa si el objeto de la derecha es menor que el de la izquierda. Ejemplo:
     if 2<3 puts "2 es menor que 3"
  • “> ” Mayor que, evalúa si el objeto de la derecha es mayor que el de la izquierda. Ejemplo:
     if 3>2 puts "3 es mayor que 2"
  • “and/&& ” Se puede usar “&&” y “and”, ambos cumplen la función de retornar True cuando dos condiciones son True.
     if 2<3 and 3>2 puts "Retorna True :)"
  • “or/&& ” Se puede usar “||” y “or”, ambos cumplen la función de retornar True cuando una de dos condiciones es True, o ambas son True.
     if 2<3 or 3>2 puts "Alguna de las dos condiciones se cumplio"

Como anotación en los operadores and y or, te recomiendo usar las palabras en lugar de los símbolos || y &&. Como ves son los operadores básicos, no tomamos en cuenta el operador de negación porque en el siguiente artículo conocerás la contraparte de la instrucción if. En general estas operaciones, como te mencionaba, se usan para controlar el flujo de la aplicación, pero puede usarse para asignación de valores, ejecutar excepciones y más. Por ahora lo dejaremos en lo básico y comenzaremos usándolas con instrucciones de control en los siguientes tutoriales.