miércoles, 2 de octubre de 2013

Sentencias en C# - Parte 2

Tabla de Contenido

0. Introducción
1. Sentencias
2. Sentencias de Declaración
3. Sentencias en Forma de Expresión
4. Sentencias de Selección
5. Sentencias de Iteración
6. Sentencias de Salto
7. Conclusiones
8. Glosario
9. Referencias

0. Introducción

Es el momento de hablar de las sentencias en el lenguaje de programación C#. Las sentencias son otros de los elementos de construcción individuales que describen pasa-a-paso el cómo debe llevar a cabo un proceso que estemos programando, es decir, la descripción imperativa de lo que nuestro programa debe hacer.

4. Sentencias de Selección

Las sentencias de selección alteran el flujo de control o de ejecución del programa. En C# existen diferentes construcciones que permiten llevar a cabo esta tarea. Se clasifican en:
  • Sentencias de selección:
    • if
    • switch
  • Operador condicional ternario (condicion ? caso_verdadero : caso_falso)
  • Sentencias de iteración o de ciclo:
    • while
    • do..while
    • for
    • foreach

4.1 La sentencia if

La sentencia if ejecuta el bloque de sentencias que parte de su construcción sí y sólo sí la evaluación de la expresión booleana del encabezado da como resultado true.

Por ejemplo en,

if (Math.PI > Math.E)
Console.WriteLine ("Math.PI es mayor que Math.E");

la segunda sentencia se ejecuta siempre y cuando la evaluación de Math.PI > Math.E dé como resultado lógico booleano true. De lo contrario se continua con la siguiente sentencia inmediata.

Esta sentencia puede contener una o más sentencias dentro de un bloque de llaves de apertura ({) y de cierre (}). Así:

if ( Math.PI > Math.E )
{
Console.WriteLine ("Math.PI es mayor que Math.E");
Console.WriteLine ("Otra sentencia más");
}

4.2 La cláusula else

La cláusula else es el camino alterno que se toma en caso que la evaluación de la expresión de la sentencia if dé como resultado false.


if ( Math.PI > Math.E )
{
Console.WriteLine ("Math.PI es mayor que Math.E");
Console.WriteLine ("Otra sentencia más");
}
else
{
Console.WriteLine ("Math.E es menor que Math.PI");
}

Debido a la flexbilidad del lenguaje, es posible anidar una sentencia if dentro de otra, o dentro de una clásula else.

Se recomienda el uso de identación y el uso de llaves de cierre y apertura para organizar el código y hacerlo más legible. De lo contrario caemos en el problema del «else suelto»:


if (codigo == 201166771)
if ( promedio == 4.7 )
Console.WriteLine ("Se ha ganado un bono de 0.1");
else
Console.WriteLine ("El código ingresado no se ha encontrado.");
Este problema empieza por la falta de organización del código fuente. La cláusula else no hace parte del cuerpo del if externo -if (codigo == 201166771)- sino del anidado -if (promedio == 4.7)-. Para evitar este inconveniente, la recomendación es usar las llevas de apertura y cierre; así:


if (codigo == 201166771)
{
if ( promedio == 4.7 )
Console.WriteLine ("Se ha ganado un bono de 0.1");
}
else
Console.WriteLine ("El código ingresado no se ha encontrado.");

A pesar de que Microsoft Visual Studio [2] automáticamente se encarga de indentar el código fuente según la sentencia que estemos utilizando, es buena práctica hacer el uso de llaves, sobretodo cuando estemos usando un procesador de texto plano que no tiene opciones avanzadas de formato del código, por ejemplo, el bloc de notas de Windows.

Más acerca de esta sentencia en [3].

4.2 La sentencia switch

Con la sentencia switch se selecciona uno o varios casos de varios casos candidatos con base en la evaluación del valor de control.

Pasemos a ver el siguiente ejemplo para que quede demostrada su utilidad práctica:


static void MostrarCarta(int numeroDeCarta)
{
switch (numeroDeCarta)
{
case 13:
Console.WriteLine ("Rey");
break;
case 12:
Console.WriteLine ("Reina");
break;
case 11:
Console.WriteLine ("Jack");
break;
default:
Console.WriteLine (numeroDeCarta);
}
}
Observemos que switch (numeroDeCarta) se evalúa lleva al caso correspondiente de los 3 disponibles (1312, y 11); aunque también se ha especificado que en caso de no darse ninguno de los anteriores, default  es el caso por defecto.

La sentencia switch acepta expresiones que se evalúen a valores de tipos de datos boolenum, y string.

Adicionalmente, en cada cado candidato, se puede especificar sentencias de salto, como son las siguientes:
  • break: finaliza la ejecución de la sentencia switch.
  • goto case x (redirecciona al caso seleccionado).
  • goto default (salta al caso por defecto).
  • Entre otras: returnthrowcontinue, y goto label.
Dado que una implementación requiera que varios casos (en se conocen como: switch sections) contengan el mismo código, éstos se deben enlistar de manera secuencial, y poner la pieza de código común al final junto con la sentencia de salto break. Ejemplo:


switch(numeroDeCarta)
{
case 13:
case 12:
case 11:
Console.WriteLine ("Figuras");
break;
default:
Console.WriteLine ("Carta Numeral");
break;
}
Nota: La sentencia de salto break en el caso final o en la sentencia default, es opcional.

Más acerca de esta sentencia en [4].

5. Sentencias de Iteración

Las sentencias de iteración son útiles para evitar la escritura de sentencias que requieren ser ejecutadas múltiples veces. C# a través de las sentencias de iteración whiledo-whilefor, y foreach logra llevar a cabo este cometido.

5.1 Ciclos while y do-while

El ciclo while repite un conjunto de sentencias un número determinado de veces (a veces requerida, infinitamente) mientras que la expresión booleana del encabezado sea true. Antes de entrar al cuerpo de la sentencia while, se prueba que la expresión booleana sea verdadera. Pasemos al siguiente ejemplo:


class PruebaWhile
{
static void Main()
{
int n = 1;
while (n <= 5)
{
Console.WriteLine ("Valor actual de n es {0}", n);
++n;
}
}
}
Prueba de ejecución.

Ahora, la sentencia iterativa 
do-while difiere sutilmente de la sentencia while en que la primera realiza la evaluación al final de la ejecución del cuerpo de sentencias repetitivas; es decir, que por lo menos el grupo anterior se ejecuta una vez.

Archivo C# PruebaDoWhile.cs [enlace alternativo]:
La sentencia while ( opcion != 5 ); es ejecutada al final del bloque de código (líneas 7 a 13). Sin embargo, el grupo anterior se ejecuta por lo menos una vez.

5.2 Sentencia repetitiva for

Las sentencias for y while son equivalentes funcionalmente, su diferencia radica en el especificación del encabezado: el ciclo while requiere de una expresión booleana, por su lado, el ciclo for tiene un encabezado que consiste en:

for ( inicialización; condición-continuación-ciclo; clásula-iterativa )
    sentencia-o-bloque-de-sentencias

Detalles del encabezado:
  • Inicialiación: se refiere a la cláusula que se ejecuta antes de que el ciclo empiece a iterar. Se usa, como su nombre lo indica, para inicializar una o más variables de iteración.
  • Condición de continuación de ciclo: Expresión booleana, que mientras genere un valor verdadero, el ciclo continuará iterando.
  • Clásula Iterativa: Esta cláusula se ejecuta después de cada iteración del bloque de sentencias. Por lo general, se utiliza para actualizar el valor de las variables de iteración.
Con la serie Fibonacci [5] se ejemplifica [1] el uso de este ciclo:

for (int i = 0, fibonacciPrevio = 1, fibonacciActual = 1; i < 10; ++i)
{
Console.WriteLine (fibonacciPrevio);
int nuevoFibonacci = fibonacciPrevio + fibonacciActual;
fibonacciPrevio = fibonacciActual;
fibonacciActual = nuevoFibonacci;
}
Cualquiera de las partes del encabezado de la sentencia repetitiva for puede ser omitido. Así:


int i = 0, fibonacciPrevio = 1, fibonacciActual = 1;
for (; i < 10;)
{
Console.WriteLine (fibonacciPrevio);
int nuevoFibonacci = fibonacciPrevio + fibonacciActual;
fibonacciPrevio = fibonacciActual;
fibonacciActual = nuevoFibonacci;
++i;
}
Este código generará los mismos resultados que el anterior (de arriba).

Más acerca de la sentencia for en [6].

5.3 Sentencia foreach

Esta sentencia es útil para recorrer (equivalente a iterar) arreglos y colecciones (clases que implementen las interfaces System.Collections.IEnumerable [8] o System.Collections.Generic.IEnumerable [9]). Su utilidad reside, repito, en la lectura de los contenidos de arreglos y colecciones, no, para la modificación (edición o eliminación) de los contenidos de objetos de los tipos anteriores.

Archivo C# PruebaForeach.cs [enlace alternativo]:
Más acerca de esta sentencia en [7].

7. Conclusiones

Ha quedado claro el concepto de sentencia: unidad de construcción básica para especificar declaración de variables y de constantes, expresiones de asignación, ciclos repetitivos, sentencias de selección, como además, otras que nos permite alterar el flujo de ejecución (las sentencias de salto).

8. Glosario

  • goto
  • Instrucción
  • Sentencia
  • Token

9. Referencias

[1]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[2]: Microsoft Visual Studio - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Microsoft_Visual_Studio
[5]: Fibonacci number - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Fibonacci_number
[7]: foreach, in (C# Reference) - http://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx
[8]: IEnumerable Interface (System.Collections) - http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx
[9]: IEnumerable(T) Interface (System.Collections.Generic) - http://msdn.microsoft.com/en-us/library/9eekhta0.aspx



O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.