viernes, 24 de julio de 2009

JC4 - Estructuras de Control en Java y C#

Estructuras de Control en Java y C#

Breve introduccion

Antes de escribir un programa que de solucion a un problema, es necesario tener una idea detallada del problema, asi como la comprensión de los bloques para la construcción de diagramas de flujo.

Cualquier problema de computación puede resolverse ejecutando una serie de acciones en un orden especifico, a esto se le conoce con el nombre de algoritmo y depende de dos cosas principales:

1.- Las acciones a ejecutar

2.- El orden en el que se ejecutan las acciones.

Definicion de Pseudocodigo: Es un lenguaje informal que ayuda a los programadores a desarrollar algoritmos sin tener que preocuparse por los estrictos detalles de la sintaxis de un lenguaje de programación. El pseudocódigo es semejante al lenguaje cotidiano, es amigable con el usuario y ayuda a organizar un programa.


Estructuras de Control

Por lo general, en un programa las instrucciones se ejecutan una después de otra en el orden en que están escritas, este proceso se conoce como ejecución secuencial. Varias instrucciones en Java y C# permiten al programador especificar que la siguiente instrucción a ejecutarse tal vez no sea la siguiente secuencia. Esto se conoce como transferencia de control.


Java tiene solo tres estructuras de control: la secuencia de estructura, la estructura de selección (tres tipos) y la estructura de repetición (tres tipos), en C# tenemos la estructura de selección (tres tipos) y la estructura de repetición (cuatro tipos). Cada programa se forma combinando tantas estructuras de secuencia, selección y repetición como sea apropiado para el algoritmo que implemente el programa.


Estructura de Selección if Simple

Esta intruccion sirve para elegir entre entre los cursos alternativos de acción, por ejemplo:

Supongamos el siguiente pseudocódigo:

Si la edad de un individuo es mayor a 18

Imprimir “Mayor de edad”

Codigo en Java

if (edad > 18 )

System.out.println(“Mayor de edad”);


Codigo en C#

if (edad > 18)

Console.WriteLine(“Mayor de edad”);


Estructura de Selección if… else…

La estructura de selección if… else permite al programador especificar una acción cuando la condición es verdadera y otra cuando la condición es falsa, como en el siguiente pseudocodigo:

Si edad de una persona es mayor a 18

Imprimir “Mayor de Edad”

De lo contrario

Imprimir “Menor de Edad”


Codigo en Java

if (edad > 18)

System.out.println(“Mayor de Edad”);

else

System.out.println(“Menor de Edad”);

Codigo C#

if (edad > 18)

Console.WriteLine (“Mayor de Edad”);

else

Console.WriteLine (“Menor de Edad”);


Instrucciones if… else Anidadas

Un programa puede evaluar varios caso colocando if… else… anidados, por ejemplo el siguiente pseudocódigo:

Si la calificación del estudiante es mayor o igual a 90

Imprimir “Excelente”

De lo contrario

Si la calificación es mayor o igual a 70

Imprimir “Aceptable”

De lo contrario

Imprimir “Reprobado”


Codigo Java

if ( calificación >= 90 )

System.out.println(“Excelente”);

else

if (calificación >= 70 )

System.out.println(“Aceptable”);

else

System.out.println(“Reprobado”);


Codigo C#

if ( calificación >= 90 )

Console.WriteLine(“Excelente”);

else

if (calificación >= 70 )

Console.WriteLine (“Aceptable”);

else

Console.WriteLine (“Reprobado”);


Hay que tener cuidado de no caer en el error de no adidar correctamente el else, en Java y C# el ultimo else es asociado con el if que precede inmediatamente. Por ejemplo el siguiente código en Java.

if ( x > 5 )

if( y > 5 )

System.out.println(“x e y son > 5”);

else

System.out.println(“x es >= 5”);


En realidad el compilador lo interpreta de la siguiente manera:

if ( x > 5 )

if( y > 5 )

System.out.println(“x e y son > 5”);

else

System.out.println(“x es >= 5”);

Para lograr que la instruccion se ejecute como se pensaba en un principio se utiliza las {} para indicar que la intruccion else se ejecuta con la primer sentencia if.

if ( x > 5 ){

if( y > 5 )

System.out.println(“x e y son > 5”);

}

else

System.out.println(“x es >= 5”);


Tambien es forzoso usar las {} cuando se ejecutan mas de una instruccion dentro de cada if… else

Por ejemplo:

if (edad > 18){

Console.WriteLine(“Ya eres mayor de edad”);

Console.WriteLine(“Y puedes sacar tu licencia de manejo”);


}

else{

Console.WriteLine(“Aun eres menor de edad”);

Console.WriteLine(“No puedes sacar tu licencia de manejo hasta después de los 18 anios”);

}

NOTA: Cuando no ponga los dos ejemplos para Java y C# quiere decir que la sintaxis es parecida en este caso lo único que diferencia es System.out.println y Console.WriteLine, ya que tienen el mismo fin.


Instrucción de Selección Multiple switch

La instrucción switch permite tomar una decisión en base a los posibles valores de una variable o expresión, cada acción se asocia con un valor integral constante (es decir un valor de tipo byte, short, int o char pero no long) que la variable o expresión pueda asumir.

Por ejemplo pedir la orden de un menú en base a lista formada por los menus 1, 2, 3

Codigo Java

switch (myOpcion) { //inicio de switch

case 1:

System.out.println(“-Sopa de letras \n –Pechuga empanizada\n –Gelatina \n -Agua de fruta”);

break;

case 2:

System.out.println(“-Crema de zanahoria \n –Costillas en salsa roja\n –Helado \n -Agua de fruta”);

break;

case 3:

System.out.println(“-Torta de Milaneza \n –Papas a la francesa\n –Refresco de cola”);

break;

default:

System.out.println(“Debe de elegir un menú de la lista”);

} //fin de switch


Codigo C#

switch opcion (myOpcion) { //inicio de switch

case 1:

Console.WriteLine(“-Sopa de letras \n –Pechuga empanizada\n –Gelatina \n -Agua de fruta”);

break;

case 2:

Console.WriteLine (“-Crema de zanahoria \n –Costillas en salsa roja\n –Helado \n -Agua de fruta”);

break;

case 3:

Console.WriteLine (“-Torta de Milaneza \n –Papas a la francesa\n –Refresco de cola”);

break;

default:

Console.WriteLine (“Debe de elegir un menú de la lista”);

} //fin de switch


Nota: Para Java no se pone la instruccion break despues de default, en C# si.


Estructura de Repeticion while

Una estructura de repetición (también llamada estructura ciclo) permite al programador especificar que un programa debe repetir una acción mientras cierta condición sea verdadera. Por ejemplo el siguiente pseudocódigo para una persona que sale de compras:

Mientras existan mas artículos en mi lista de compras

Comprar el siguiente articulo y quitarlo de mi lista


Ahora veamos un ejemplo:

Encontrar la primera potencia que sea mayor a 1000, suponiendo que la variable la inicializamos en 2.

int producto = 2;

while( producto <= 1000 )

producto = 2 * producto;

//Java

System.out.println(producto);

//C#

Console.WriteLine(producto);


Instrucción de Repeticion do… while

Es similar a la instrucción while, y la única diferencia es que en la istruccion while la condición se evalua al principio, por lo que si la condición es falsa el ciclo no se ejecuta y en la condición do…while por lo menos se ejecuta una vez el ciclo ya que la condición se evalua al final. Cuando termina una estructura do… while el programa continua inmediatamente después de la instrucción while.

El siguiente ejemplo imprime de el numero 0 al 9, notemos como si inicializamos la variable en 10 el ciclo se ejecuta por lo menos una vez.

int myVariable = 0;

do {

System.out.println(myVariable);

//C#

//Console.WriteLine(myVariable);

myVariable++;

} (while myVariable < 10);

Notemos que debemos de terminar con punto y coma (;) al finalizar la condición del while.


Instrucción for

La instrucción for es la instrucción de iteración mas potente. El código de control de la instrucción for se divide en tres partes:



  1. Un indicador. Que fija las condiciones iniciales de la instrucción de bucle for.

  2. Una condición que especifica la expresión booleana que mantiene ejecutándose la instrucción for.

  3. Un iterador que especifica las instrucciones que se ejecutan al final de cada paso por las instrucciones incrustadas


A continuación vemos un ejemplo que imprime también los números del 0 al 9:

int myVariable;

For(myVariable = 0; myVariable < 10; myVariable++)

{

System.out.println(myVariable);

//C#

//Console.WriteLine(myVariable);

}

El iniciador, la condicion y el iterador de un bucle for son opcionales. Si prefiere no usar alguna de estas partes, simplemente escriba un punto y coma sin especificar la instrucción. Por ejemplo:

int myVariable = 0;

For(; myVariable < 10; myVariable++)

{

Console.WriteLine(myVariable);

//Java

//System.out.println(myVariable);

}

//------------------------

//O también

int intVaribale;

For (myVariable = 0; ; myVariable++ )

{

Console.WriteLine(myVariable);

//Java

//System.out.println(myVariable);


myVariable++;

}

Hay que tener cuidado cuando se omita la parte de la condición en un bucle for. El siguiente código es un ejemplo de los problemas que pueden surgir.

for(int myVariable = 0; ; myVariable++)

{

Console.WriteLine(myVariable);

}

Este código se ejecuta hasta que myVariable provoca un error porque contiene un numero demasiado largo para ser almacenado.


Instrucción foreach (Solo C#)

Se puede usar la instrucción foreach para repetir varias veces los elementos de una colección. Las matrices de C# admiten la instrucción for each y pueden usarse para trabajar fácilmente con cada elemento de la matriz.

La sintaxis es la siguiente:

Foreach (tipoDato nombreVariable in Colleccion)

{

}

Por ejemplo:

int[] myArray;

myArray[0] = 0;

myArray[1] = 1;

myArray[2] = 2;

myArray[3] = 3;

myArray[4] = 4;


foreach( int ArrayElement in myArray)

{

Console.WriteLine(ArrayElement);

}


Instrucciones de salto para moverse por el código

Hago mención de estas instrucciones ya que por lo regular se utilizan en estructuras de ciclos o repetición.

La instrucción break

Como ya vimos en la estructura switch la instrucción break sirve para salir de un bloque de instrucciones en el que se encuentre.

int myVariable = 0;

while(myVariable < 10)

{

Console.WriteLine(myVariable);

//Java

//System.out.println(myVariable);

if( myVariable == 5 )

break;

myVariable++;

}

El código anterior se sale cuando myVariable = 5, Imprime en pantalla del 0 al 4

La instrucción break suele usarse con bloques de instrucciones switch, while, do… while, for y foreach(solo C#).


La Instrucción continue

La instrucción continue devuelve el control a la expresión booleana que controla una instrucción de iteración, por ejemplo:

int myVariable;

For (myVariable = 0; myVariable < 10; myVariable++ )

{

if (myVariable == 5)

continue;

Console.WriteLine(myVariable);

//Java

//System.out.println(myVariable);

}

El codigo anterior imprime del 0 al 9, excepto el 5, es decir “Si el valor de myVariable es 5”, continua con la siguiente iteración sin ejecutar ninguna instrucción después del continue”. Al igual que break, continue se usa en instrucciones switch, while, do… while, for y foreach(solo C#).


Instrucción goto (C#)

La instrucción goto transfiere sin condiciones el control a una instrucción etiquetada. Puede etiquetarse cualquier instrucción de C#. Las etiquetas de instrucción son identificadores que preceden a una instrucción. Despues de una etiqueta se colocan dos puntos(:). Un identificador de etiqueta sigue a la palabra clave goto y la instrucción goto transfiere el control a la instrucción designada por el identificador de etiqueta. Por ejemplo:

int myVariable = 0;

while(myVariable < 10 )

{

Console.WriteLine(myVariable);

if ( myVariable == 5 )

goto done;

myVariable++;

}

done: Console.WriteLine(“Fuera del ciclo”);

El código anterior escribe del 0 al 4 y a continuación la leyenda “Fuera del ciclo”


break etiquetado(Java)


En Java tambien tenemos una opcion para poder hacer lo que se hace con goto de C#. A continuacion muestro un ejemplo:


String salida = "";

alto: { //bloque etiquetado

// contar 10 filas

for ( int fila = 1; fila <=10; fila++){

for ( int columna = 1; columna <= 5; columna++) {

if ( fila == 5 ) // si la fila es 5.

break alto; //saltar al final del bloque alto

salida += "* ";

} // fin de for interno

salida += "\n";

} // fin de for externo

// la siguiente linea se evita

salida += "\nLos ciclos terminaron normalmente";

} // fin del bloque etiquetado

// en el codigo anterior cuando fila es 5 se ejecuta break de la etiqueta y termina tanto el bloque interno del for como el externo, el for externo nunca se completa


Instruccion foreach (Java)
Hago una correccion a peticion de un amigo Tonat , que como bien es cierto desde la version 1.5 del jdk incorporo una estructura de control en Java que tiene la misma funcion que el ciclo foreach de C#, y a continuacion muestro un ejemplo sencillo y la sintaxis que maneja.
Sintaxis:
for (TipoBase variable: ArrayDeTiposBase)
{..}
Ejemplo:

List list = new ArrayList();

// Añadimos elementos
list.add("Primitivo");
list.add("Roman");
list.add("Montero");

for (String nombre: list)
System.out.println(nombre);

Pues como podemos ver la sintaxis de Java y C# para estructuras de control es muy parecida, a excepcion del ciclo foreach. Y de antemano agradezco sus comentarios y tambien si alguien quisiera que publicara algo en especifico me haga sus comentarios de lo que les parece este blog, Y el motivo de no incluirlo es debido a que actualmente desarrollo en C# y VB 2005, y como comentaba en la introduccion de esta serie de blogs dedicados a Java y C#. Que es solo una guia para no olvidarnos de la sitaxis de cada lenguaje ya que la vida nos lleva por rumbos distintos, pero tambien no hay que olvidarnos de lo que sabemos...

2 comentarios:

Tonat dijo...

Existe en java (desde Java2 1.5 me parece) un equivalente al foreach de C# :

for(Tipo varname : Collection)

xhunkita dijo...

Hola
pues he leido tu articulo sobre virus y es muy interesante.
yo ahora tengo un problema
mi unidad C , no aparece con el icono que debe aparecer, en lugar del icono me aparece una carpeta.
sabes algo sobre esto???
se puede eliminar el virus sin formatear...

ahh ayuda...

hasta pronto


bye..