jueves, 29 de diciembre de 2011

Etiquetas en Java

Para los que conocen algo de lenguaje ensamblador, les será familiar encontrar etiquetas en el lenguaje Java, esta forma de controlar la ejecución puede resultar útil en la optimización de ciertos códigos, y su utilización solo se justifica cuando se realiza justo antes de un ciclo que a su vez tenga otro ciclo y/o un switch anidado.

Las etiquetas en java trabajan con las palabras reservadas "break" y "continue".
Teniendo en cuenta que se deben utilizar en ciclos(for, while o do-while ), un ejemplo de su utilización podría ser el improvisado siguiente código en donde se quiere imprimir por separado cada palabra de una frase dada:


String  frase = "Empezando con Java desde cero";
int i=-1; 
 
otraPalabra: //etiqueta


  // aqui no es conveniente colocar código.


while(true)
{
  
  i++; 
  
  System.out.print("\n palabra: ");
  
     for( int a = i ; a < frase.length() ; a++ )
     {
      
        char caracter=frase.charAt(a); 
   
        if(caracter == ' ')
        {
            i = a; 
      
            continue otraPalabra;  
        }
     
        System.out.print(caracter);
   
     }
     
  break otraPalabra;
     
} 




En el código anterior:

La instrucción "otraPalabra:" que se encuentra antes del while, es la etiqueta e indica un punto especifico en la ejecución.

La instrucción "continue otraPalabra;" que se encuentra dentro del if, provocará que la ejecución continué en la etiqueta "otraPalabra", es decir por fuera del ciclo while y ademas que vuelva a entrar a dicho while.

La instrucción "break otraPalabra;" provocará que la ejecución continué en la etiqueta "otraPalabra", pero sin entrar de nuevo al while, lo que finalmente evita un ciclo infinito así como lo huviera evitado un simple "break;", el cual no se utilizo para poder ver el comportamiento de las etiquetas con el break.

El código anterior imprimirá:

palabra: Empezando
palabra: con
palabra: Java
palabra: desde
palabra: cero


viernes, 23 de diciembre de 2011

break y continue en java



Estas dos palabras reservadas se utilizan para salir de ciclos o de una parte de el. También para saltarse alguna porción de código.

break



Se puede ver la utilización del "break" en la estructura switch en donde se utiliza para saltar los casos que se encuentran debajo del que se ejecuta:



La utilización del "break" también es muy común en los ciclos (For y while), este se utiliza cuando queremos salir por algún motivo del ciclo sin importar el resto de vueltas que falten.

En el siguiente ejemplo se quiere imprimir por pantalla si la frase dada tiene alguna letra "t":


String  frase = "Anita lava la tina";
		
for( int i = 0 ; i < frase.length() ; i++ )
   {
			
	char caracter=frase.charAt(i);
			
	if( caracter == 't' )
	{
				
		System.out.println("Si hay t");
		break;
	}
			
   }



Como se puede observar, cuando el código anterior encuentra la primera "t" e imprime el respectivo aviso, no tiene sentido seguir buscando en el resto de frase pues ya se ha logrado el objetivo.
Por ello se coloca el "break", este termina el ciclo "for" y sin duda ahorra tiempo en la ejecución del programa al impedir vueltas innecesarias en este.

De igual manera funciona con el while:


	String  frase = "Anita lava la tina";
		
	int i=0;
	 
	while( i < frase.length() )
	{
			
		char caracter=frase.charAt(i);
			
			if( caracter == 't' )
			{
				
			System.out.println("Si hay t");
			break;
			}
		
		i++;
			
	}





Continue



Un ejemplo de la utilización del "continue", podría ser el siguiente, en donde se quiere imprimir los caracteres de una frase dada, pero omitiendo las letras "a" y "A":

String  frase = "Anita lava la tina";
		
for( int i = 0 ; i < frase.length() ; i++ )
   {
			
	char caracter=frase.charAt(i);
			
			
	if( (caracter == 'a') ||  (caracter == 'A') )
        {
	      continue;	
        }
				
	System.out.print(caracter);
   }



Después de su ejecutar el código anterior se habrá imprimido: nit lv l tin
y esto ocurre por que cuando se ejecuta el "continue" las instrucciones que se encuentran debajo de este, no se ejecutan, y la ejecución continua pero con la siguiente vuelta del ciclo.
En el caso del ejemplo anterior la instrucción que no se ejecuta debido a la ejecución del "continue" es: System.out.print(caracter), y a su vez el "continue" solo se ejecuta cuando la letra actual es "a" o "A".;

domingo, 18 de diciembre de 2011

Estructuras básicas de programación: for

La estructura "For" especifica instrucciones para que estas se ejecuten varias veces; El proceso de ejecutar varias veces es mejor conocido como ciclo. Se dice que el ciclo a dado una vuelta cada vez que se ejecuta el código especificado.

La estructura "for", tiene la siguiente sintaxis:

for( Declaración y/o inicialización de variable ; Condición para permanecer en el ciclo  ; Cambio de valor de variable )
{//llave que abre

 // instrucciones que se ejecutarán varias veces. 
 
}//llave que cierra


Las llaves que se encuentran debajo del "for", agrupan el código que se repetirá. A continuación se explican las tres partes que se encuentran dentro del paréntesis:

Declaración y/o inicialización de variable: En esta parte irá una variable que puede ser de cualquier tipo, y de la cual se puede especificar su declaración e inicialización:
int variable=0;
o simplemente la inicialización de una variable ya existente:
variable=0;
esta variable servirá para controlar cuantas vueltas va a dar el ciclo.

Cambio de valor de variable: Acá irá la instrucción que se encarga de cambiarle el valor a la variable que inicialmente se especificó, y esto lo hace por cada vuelta del ciclo.

Condición para permanecer en el ciclo: En esta parte irá la condición para que el ciclo de vueltas; Cuando la misma deje de cumplirse, el programa seguirá con la ejecución de lo que esta después de la llave que cierra. Dicha condición debe ser una instrucción que devuelva un valor booleano.

En otras palabras, en esta parte se le pone condición al valor de la variable que ya hemos mencionado anteriormente, y todo eso con el fin de colocar un límite a la cantidad de vueltas que dará el ciclo.

Ejemplo:

int A = 1;
int i;

for( i=0; i<5 ; i++ )
{

   A = A + 5;

}




En el ejemplo anterior  el ciclo ejecutará varias veces el código especificado: A=A+5, y lo hará mientras la variable "i" sea menor que 5; Teniendo en cuenta que esta variable se inicializa en cero, y que por cada vuelta se incrementa en uno, entonces el código especificado se ejecutará cinco veces y al terminar la ejecución la variable "A" tendrá el valor de 26. También se puede apreciar que la variable "i" utilizada dentro del "for" ya había sido declarada.

Otro ejemplo:

int A = 1;

for(int i=0; i<5 ; i++ )
{

   A = A + i;

}



Después de ejecutar el código anterior la variable "A" tendrá el valor de 11. Se puede apreciar también que la variable "i" se declara dentro del "for", esta forma de trabajar limita a solo poder utilizar la variable "i" dentro de ese mismo"for".

Otro ejemplo, esta vez utilizando una variable de tipo char:

int A = 1;

for(char i='a'; i<='z' ; i++)
{
    if(i < 'd')
    {

    A++;

    }
}



En el código anterior la variable A se incrementa bajo una condición(if) .
También se aprecia el recorrido del ciclo por todo el abecedario, esto es posible porque cuando se incrementa una variable "char" en realidad se incrementa un número el cual es un código ascii equivalente al mismo.

Ahora otro ejemplo mas realista en donde se suman todos los dígitos de un número dado:

int numero=1254;
  
int sumaDigitos;
  
for(sumaDigitos=0 ; numero != 0 ; numero=numero/10)
{
    sumaDigitos = sumaDigitos + (numero % 10);
}
  
System.out.println(sumaDigitos);


El código anterior imprimirá 12.

En el siguiente ejemplo se simula un cajero automático, el cual tiene que devolver la cantidad de billetes correspondientes a una cantidad pedida:

int cantidadPedida=379000;// 379000 pesos colombianos
int i,cantidadBilletes=0;
System.out.print("Billetes de 50000 pesos: ");

for(i=cantidadPedida ; i>=50000 ; i-=50000)
{
 cantidadBilletes++;
}


System.out.print(cantidadBilletes+"\n");
cantidadPedida=i;
cantidadBilletes=0;
System.out.print("Billetes de 20000 pesos: ");

for(i=cantidadPedida ; i>=20000 ; i-=20000)
{
 cantidadBilletes++;
}

System.out.print(cantidadBilletes+"\n");
cantidadPedida=i;
cantidadBilletes=0;
System.out.print("Billetes de 10000 pesos: ");

for(i=cantidadPedida ; i>=10000 ; i-=10000)
{
 cantidadBilletes++;
}

System.out.print(cantidadBilletes+"\n");
cantidadPedida=i;
cantidadBilletes=0;
System.out.print("Billetes de 5000 pesos: ");

for(i=cantidadPedida ; i>=5000 ; i-=5000)
{
 cantidadBilletes++;
}

System.out.print(cantidadBilletes+"\n");
cantidadPedida=i;
cantidadBilletes=0;
System.out.print("Billetes de 2000 pesos: ");

for(i=cantidadPedida ; i>=2000 ; i-=2000)
{
 cantidadBilletes++;
}

System.out.print(cantidadBilletes+"\n");
cantidadPedida=i;
cantidadBilletes=0;
System.out.print("Billetes de 1000 pesos: ");

for(i=cantidadPedida ; i>=1000 ; i-=1000)
{
 cantidadBilletes++;
}

System.out.print(cantidadBilletes+"\n");



después de ejecutar el código anterior, se habrá impreso:

Billetes de 50000 pesos: 7
Billetes de 20000 pesos: 1
Billetes de 10000 pesos: 0
Billetes de 5000 pesos: 1
Billetes de 2000 pesos: 2
Billetes de 1000 pesos: 0

Por ultimo vamos a ver un ejemplo con "for" anidados, el código imprime los números del 2 al 20 y menciona si son o no números primos:

for(int a=2 ; a<20 ; a++)
{
   
 String salida=" es primo";
   
 for(int b=a-1 ; b>1 ; b--)
 {
    
   if( a % b == 0 )
   {
    salida=" no es primo";
    break;
   }
  
 }
    
 System.out.println("el número "+a+salida);
}




En el código anterior se utiliza la palabra reservada "break" para salir del "for" actual, sin importar que falten vueltas.
Por otro lado la salida que resulta después de la ejecución de este código es:

el número 2 es primo
el número 3 es primo
el número 4 no es primo
el número 5 es primo
el número 6 no es primo
el número 7 es primo
el número 8 no es primo
el número 9 no es primo
el número 10 no es primo
el número 11 es primo
el número 12 no es primo
el número 13 es primo
el número 14 no es primo
el número 15 no es primo
el número 16 no es primo
el número 17 es primo
el número 18 no es primo
el número 19 es primo
el número 20 no es primo

miércoles, 14 de diciembre de 2011

Estructuras básicas de programación: switch

La estructura "switch", esta hecha para propósitos similares al del "if", mas no iguales. Esta estructura se utiliza para especificar varios casos, en los cuales habrá diferentes instrucciones. Solo se ejecutarán las instrucciones del caso que se cumpla.

La estructura "switch", esta constituida por las siguientes lineas de código o sentencias:

switch(v)
{
    case 1:
    //código que se ejecuta si el valor de "v" es 1
    break; 
    case 2:
    //código que se ejecuta si el valor de "v" es 2
    break;  
    case 3:
    //código que se ejecuta si el valor de "v" es 3
    break; 
    default:
    //código que se ejecuta si el valor de "v" no es ninguno de las anteriores casos.
    break; 
}
En donde "v" puede ser cualquier variable que devuelva un valor de cualquier tipo numérico o "char" y ahora desde Java 7 también se puede agregar valores o variables de tipo "String".

Las llaves que se encuentran debajo del "switch", agrupan todos los casos.

la palabra reservada "break" se coloca para dar la orden de que se salte el resto de casos, pues de lo contrario se ejecutarían también los casos que están debajo del que se ejecuto inicialmente.

La palabra reservada "default", se utiliza para especificar lo que se ejecutará si los casos anteriores no suceden. Dicho de otra manera en "default" esta contemplado todo lo que se ejecuta con el resto de casos posibles. ejemplo:

int variable=3;
int variable2;

switch(variable)
{

    case 1:
    variable2=5;   
    break;
    case 2:
    variable2=20;
    break;
    case 3:
    variable2=30;
    break;
    case 4:
    variable2=10;
    break;
    default:
    variable2=100;
    break; 

}


Después de ejecutar el código anterior, la variable "variable2" tendrá el valor de 30.

Cabe resaltar que mientras el "if" puede ejecutar instrucciones bajo una condición que en muchos casos involucra un rango completo de valores, el "switch" especifica la ejecución de código bajo la condición de que se de un valor en concreto, y no el de un rango completo.

Lo anterior es esencial para entender cuando debemos usar el "switch" en vez de el "if".

Otro ejemplo de utilización de "switch", esta vez con una variable "char":

char variable='a';

int variable2;

switch(variable){

    case 'c':
    variable2=5;   
    break;
    case 'a':
    variable2=20;
  
    case 'v':
    variable2=30;
   
    case 'k':
    variable2=10;
    break;
    default:
    variable2=100;
    break; 

}


En el código anterior, la variable "variable2" queda con el valor de 10, y no con 20, pues se ha olvidado colocar el "break", del "caso a" y del "caso v".
Omitir el "break", puede ser beneficio, todo depente de la lógica del problema a solucionar, un ejemplo de esto puede ser el código que encontré en laurel.datsi.fi.upm.es, el cual consiste en imprimir el nombre de una vocal dada. Adecuado a Java ese código podría quedar de la siguiente manera:


String nombreVocal="";
char letra='e';

switch(letra)
{
        case 'a': 
        case 'A': 
                nombreVocal="Es la vocal a";
                break;
        case 'e': 
        case 'E': 
                nombreVocal="Es la vocal e";
                break;
        case 'i': 
        case 'I':  
                nombreVocal="Es la vocal i";
                break;
        case 'o': 
        case 'O': 
                nombreVocal="Es la vocal o";
                break;
        case 'u': 
        case 'U': 
                nombreVocal="Es la vocal u";
                break;
        default: 
               
                nombreVocal="No es ninguna vocal"; 
}


En el código anterior se ve como la ausencia del "break", le permite al "switch", colocar en la variable "nombreVocal", el correspondiente resultado, sin importar si la vocal esta en mayúscula o minúscula.

También se aprecia la ausencia del "break" después de las instrucciones de "default", algo que se puede hacer sin ningún problema, debido a que si se coloca la instrucción "break", no tendría casos para saltar u omitir.

También es posible anidar "switch", ejemplo:


String nombre="";
char letra='e';

switch(letra)
{
        case 'a': 
        case 'A': 
                nombre="Es la vocal a";
                break;
        case 'e': 
        case 'E': 
                nombre="Es la vocal e";
                break;
        case 'i': 
        case 'I':  
                nombre="Es la vocal i";
                break;
        case 'o': 
        case 'O': 
                nombre="Es la vocal o";
                break;
        case 'u': 
        case 'U': 
                nombre="Es la vocal u";
                break;
        default: 
               
                switch(letra)
                {
                 case 'a':
                         nombre="Es la consonante a";
                         break;
                 case 'b':
                         nombre="Es la consonante b";
                         break;      
                 case 'c':  
                         nombre="Es la consonante c";
                                  
                }
                 
}


En el código anterior se aprecia que aparte de poderse anidar, también se puede prescindir de "default". Otro ejemplo, ahora con un String, en donde obligatoriamente tenemos que estar trabajando con Java 7:


int variable2=0;
String palabra="casa";

switch(palabra)
{
        case "casa": 
                    variable2 = 6; 
                    break; 
        case "carro": 
                    variable2 = 5; 
                    break;        
        case "TV":
                    variable2 = 4; 
                    break; 
}


Después de ejecutar el código anterior, la variable "variable2" quedará con el valor 6.

Un ejemplo sencillo puede ser el siguiente, en donde se quiere colocar exigencias a un nombre dado, y priorizar en algunas de estas exigencias, para luego entrar a validar otras de manera segura:

String nombre="maria";

  switch(nombre.length())//obtengo la cantidad de caracteres con ayuda de el método .length()
  {
                    case 1:
                        System.out.println("debe especificar un nombre mas largo"); 
                        break;
                    case 0:
                        System.out.println("debe especificar un nombre"); 
                        break;    
                    default:
     //obtengo el caracter de la posicion especificada con ayuda de el método .charAt()
     // si se ejecuta a .charAt() sobre una cadena vacía, se generará un error, pero el primer "switch" se encarga 
     // de que eso no suceda.
                        switch(nombre.charAt(0))
                        {
                            case '#':
                            System.out.println("el nombre no puede comenzar por #");
                            break;
                            case '0':
                            System.out.println("el nombre no puede comenzar por 0");
                            break;    
                            default:
                                 switch(nombre.charAt(nombre.length()-1))
                                {
                                 case '#':
                                System.out.println("el nombre no puede terminar por #");
                                break;
                                case '&':
                                System.out.println("el nombre no puede terminar por &");
                                break;    
                                default:
                                   System.out.println("el nombre cumple con las exijencias !");   
                                }
                                
                        }
                        
                        
  }

Estructuras básicas de programación: If

Cuando se halla asimilado el comportamiento y por ende la utilidad de las estructuras básicas de programación, podremos esta seguros de que nos irá muy buen en todo esto proceso de aprendizaje sin importar el lenguaje que estemos aprendiendo.

A pesar de que esta explicación va a hacer con lenguaje Java, dichas estructuras son similares en muchos lenguajes de programación.

La estructura "if", se utiliza para especificar instrucciones que solo se ejecutarán si se cumple una condición. Opcionalmente se puede especificar instrucciones que solo se ejecutarán si no se cumple esta condición.

La estructura "if", esta constituida por las siguientes lineas de código o sentencias:

 

if(condición)
{
    // ejecutar este código si se cumple la condición
}
else
{
    // ejecutar este código si No se cumple la condición
}
En donde "condición" puede ser cualquier instrucción que devuelva un valor booleano, es decir "true o false" que en español son verdadero o falso .
Las llaves que se encuentran debajo del "if", agrupan el código que se ejecutará si la condición devuelve "true", a su vez las llaves que se encuentran debajo de "else", agrupan el código que se ejecutará si la condición devuelve "false" o en otras palabras si la condición no se cumple. ejemplo:

int variable=6;
int variable2;

if(5 < variable)
{
    variable2=4;
}
else
{
    variable2=3;
}

Después de ejecutar el código anterior, la variable "variable2" tendrá el valor de 4. Como se ha dicho, la parte del "else" solo es opcional:
int variable=6;
int variable2;

if(5 < variable)
{
    variable2=4;
}



Después de ejecutar el código anterior, la variable "variable2" también quedará con el valor de 4. También es posible anidarlos, ejemplo:

int variable=1;

int variable2;

if(0 < variable)
{

   if(variable > 2)
   {
       variable2=8;
   }
   else
   {
       variable2=7;
   }
    
}



Después de ejecutar el código anterior, la variable "variable2" quedará con el valor de 7. Otro ejemplo:
int variable=1;

int variable2;

if(5 < variable)
{

   if(variable > 2)
   {
       variable2=8;
   }
   else
   {
       variable2=7;
   }
    
}
else
{

   variable2=6;

}



Después de ejecutar el código anterior, la variable "variable2" quedará con el valor de 6.

Un ejemplo sencillo pero mas realista de la utilidad de los "if", es el siguiente, en donde se quiere almacenar en una variable el tipo de triangulo, teniendo como información las medidas de sus tres lados:
lado1=1;
lado2=5;
lado3=4:

String tipoTriangulo="";

if( (lado1 == lado2) && (lado2 == lado3) )
{

   tipoTriangulo="equilátero";
    
}
else
{

   if( (lado1 != lado2) && (lado2 != lado3) && (lado3 != lado1) )
   {
      tipoTriangulo="escaleno";
   }
   else
   {
      tipoTriangulo="isósceles"; 
   }

}