miércoles, 7 de septiembre de 2011

7.- Sentencias de Control de Flujo (Parte 2)

Sentencias Iterativas

El lenguaje Java, como la mayoría de los lenguajes, proporciona sentencias que permiten realizar una tarea una y otra vez hasta que se cumpla una determinada condición, dicha tarea viene definida por un conjunto de sentencias ag rupadas en un bloque. Las sentencias iterativas son for, while y do...while

La sentencia for

Esta sentencia se encuentra en la mayoría de los lenguajes de programación. El bucle for se empleará cuando conocemos el número de veces que se ejecutará una sentencia o un bloque de sentencias, tal como se indica en la figura. La forma general que adopta la sentencia for es

for(inicialización; condición; incremento)
          sentencia;



El primer término inicialización, se usa para inicializar una variable índice, que controla el número de veces que se ejecutará el bucle. La condición representa la condición que ha de ser satisfecha para que el bucle
continúe su ejecución.
El incremento representa la cantidad que se incrementa la variable índice en cada repetición.

Ejemplo: Escribir un programa que imprima los primeros 10 primeros números
enteros empezando por el cero.

for (int i = 0; i < 10; i++) {
   System.out.println(i);
}

El resultado será: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Ejemplo: Escribir un programa que imprima los números pare s positivos menores
o iguales que 20

for (int i=2; i <=20; i += 2) {
   System.out.println(i);
}

Ejemplo: Escribir un programa que imprima los números pares positivos menores
o iguales que 20 en orden decreciente

for (int i=20; i >= 2; i -= 2) {
   System.out.println(i);
}

Ejemplo: Escribir un programa que calcule el factorial de un número empleando
la sentencia iterativa for. Guardar el resultado en un número entero de tipo long .
Definición: el factorial de un número n es el resultado del producto 1*2*3* ... *(n-1)*n.

public class TestFactorial {
  public static void main(String[] args) {
     int numero=4;
     long resultado=1;
     for(int i=1; i<=numero; i++){
        resultado*=i;
     }
     System.out.println("El factorial es "+resultado);
   }
}

La sentencia while

A la palabra reservada while le sigue una condición encerrada entre paréntesis. El bloque de sentencias que le siguen se ejecuta siempre que la condición sea verdadera tal como se v e en la figura. La forma general que adopta la sentencia while es:

while (condición)
         sentencia;


Ejemplo: Escribir un programa que imprima los primeros 10 primeros números enteros empezando por el cero, empleando la sentencia iterativa while.

int i=0;
while (i<10) {
           System.out.println(i);
           i++;
}

Ejemplo: escribir un programa que calcule el factorial de un número empleando la sentencia iterativa while

public class TestWhileFactorial {
  public static void main(String[] args) {
     int numero=4;
     long resultado=1;
     while(numero>0){
        resultado*=numero;
        numero--;
     }
     System.out.println("El factorial es "+resultado);
   }
}

La sentencia do...while

Como hemos podido apreciar las sentencias for y while la condición está al principio del bucle, sin embargo, do...while la condición está al final del bucle, por lo que el bucle se ejecuta por lo menos una vez tal como se ve en la figura. do marca el comienzo del bucle y while el final del mismo. La forma general es:

do{
         sentencia;
}while(condición);


Ejemplo: Escribir un programa que imprima los primeros 10 primeros números enteros empezando por el cero, empleando la sentencia iterativa do..while.

int i=0;
do{
          System.out.println(i);
          i++;
}while(i < 10);

El bucle do...while, se usa menos que el bucle while, ya que habitualmente evaluamos la expresión que controla el bucle al comienzo, no al final. La sentencia break
A veces es necesario interrumpir la ejecución de un bucle for, while, o do...while.

for(int i = 0; i < 10; i++){
             if (i == 8) break;
             System.out.println(i);
}

Consideremos de nuevo el ejemplo del bucle for, que imprime los 10 primeros números enteros, se interrumpe la ejecución del bucle cuando se cumple la condición de que la variable contador i valga 8. El código se leerá: "salir del bucle cuando la variable contador i, sea igual a 8".

El código anterior es equivalente a

for(int i = 0; i <=8; i++)
             System.out.println(i);
 
La sentencia continue

La sentencia continue, fuerza al bucle a comenzar la siguiente iteración desde e l
principio. En la siguiente porción de código, se imprimen todos los números del 0
al 9 excepto el número 8.

for(int i = 0; i < 10; i++){
             if (i == 8) continue;
             System.out.println(i);
}

6 .- Sentencias de Control de Flujo (Parte 1)

Sentencias Condicionales

Del mismo modo que en la vida diaria, en un programa es necesario tomar decisiones basadas en ciertos hechos y actuar en consecuencia. El lenguaje Java tiene una sentencia básica denominada if (si condicional) que realiza un test y permite responder de acuerdo al resultado. 

La Sentencia IF

Si la condición es verdadera, la sentencia se ejecuta, de otro modo, se salta
dicha sentencia, continuando la ejecución de l programa saltando a otras
sentencias . La forma general de la sentencia if es: 





Si el resultado del test es verdadero ( true) se ejecuta la sentencia que sigue a continuación de if, en caso contrario, falso ( false), se salta dicha sentencia, tal como se indica en la figura. La sentencia puede consistir a su vez, en un conjunto de sentencias agrupadas en un bloque.

if (condición){ 
sentencias; 

En el siguiente ejemplo, si el número del boleto que hemos adquirido coincide con el número aparecido en el sorteo, nos dicen que hemos obtenido un premio.

if(numeroBoleto==numeroSorteo)
          System.out.println("has obtenido un premio");


La sentencia if...else 

La sentencia if...else completa la sentencia if, para realizar una acción alternativa

if (condición)
          sentencia1;
else
          sentencia2;


Las dos primeras líneas indican que si la condición es verdadera se ejecuta la sentencia 1. La palabra clave else, significa que si la condición no es verdadera se ejecuta la sentencia 2, tal como se ve en la figura..
Dado que las sentencias pueden ser simples o compuestas la forma general de

if...else es

if (condición){
sentencia1;
sentencia2;
}else{
          sentencia3
          sentencia4;
          sentencia5;
}
Existe una forma abreviada de escribir una sentencia condicional if...else como la
siguiente:
if (numeroBoleto==numeroSor teo)
          premio=1000;
else
          premio=0;
en una sola línea

premio=(numeroBoleto==numeroSoreteo) ? 1000 : 0;

La sentencia switch


A veces, es necesario, elegir entre varias alternativas, como se muestra en la siguiente figura




Considerando la siguiente serie de sentencias if...else 

if(expresion==valor1) 
sentencia1; 
else if(expresion==valor2) 
sentencia2; 
else if(expresion==valor3) 
sentencia3; 
else 
sentencia4; 

El código resultante puede ser difícil de seguir . El lenguaje Java proporciona una solución elegante a este problema mediante la sentencia condicional switch para agrupar a un conjunto de sentencias if...else. 


switch(expresion){ 
case valor1: 
                sentencia1; 
                break; //sale de switch 
         case valor2: 
                sentencia2; 
                break; //sale switch 

        case valor3: 
               sentencia3; 
               break; //sale de switch 

         default: 
               sentencia4; 

En la sentencia switch, se compara el valor de una variable o el resultado de evaluar una expresión, con un conjunto de números enteros valor1, valor2, valor3, ...o con un conjunto de caracteres, cuando coinciden se ejecuta el bloque de sentencias que están asociadas con dicho número o carácter constante. Dicho bloque de sentencias no está entre llaves sino que empieza en la palabra reservada case y termina en su asociado break.

Si el compilador no encuentra coincidencia, se ejecuta la sentencia default, si es
que está presente en el código.
Veamos ahora un ejemplo sencillo: dado el número que identif ica al mes (del 1 al 12) imprimir el nombre del mes.

public class TestSwitch{
  public static void main(String[] args) {
     int mes=3;
     switch (mes) {
        case 1: System.out.println("Enero"); break;
        case 2: System.out. println("Febrero"); break;
        case 3: System.out.println("Marzo"); break;
        case 4: System.out.println("Abril"); break;
        case 5: System.out.println("Mayo"); break;
        case 6: System.out.println("Junio"); break;
        case 7: System.out.println("Julio"); break;
        case 8: System.out.println("Agosto"); break;
        case 9: System.out.println("Septiembre"); break;
        case 10: System.out.println("Octubre"); break;
        case 11: S ystem.out.println("Noviembre"); break;
        case 12: System.out.println("Diciembre"); break;
        default: System.out.println("Este mes no existe"); break;
     }
  }
}

Ahora un ejemplo más complicado, un programa que calcule el número de días
de un mes determinado cuando se da el año.
Anotar primero, los meses que tienen 31 días y los que tienen 30 días. El mes de
Febrero (2º mes) es el más complicado ya que tiene 28 días excepto en los años
que son bisiestos que tiene 29. Son bisiestos los años múltiplos de cuatro, que no
sean múltiplos de 100, pero si son bisiestos los múltiplos de 400.

public class TestSwitch2 {
   public static void main(String[] args) {
     int mes=2;
     int año=1992;
     int numDias=30;
     switch (mes) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
           numDias = 31;
           break;
        case 4:
        case 6:
        case 9:
        case 11:
           numDias = 30;
           break;
        case 2:
           if ( ((año % 4 == 0) && !(año % 100 == 0)) || (año % 400 == 0) )
               numDias = 29;
           else
               numDias = 28;
           break;
        default:
           System.out.println("Este mes no existe");
           break;
     }
     System.out.println("El mes "+mes+" del año "+año+" tiene "+numDias+"
días");
   }
}


martes, 30 de agosto de 2011

APUNTES

Chicos aca les dejo el apunte de Java. Y muy pronto estare subiendo otro apunte mas completo.

Bajar Apunte de Java Didactico


miércoles, 29 de junio de 2011

5.- Operadores

Operadores

Los operadores aritméticos
Concatenación de strings
La precedencia de operadores
La conversión automática y promoción
Los operadores unarios



Todos los lenguajes de programación permiten realizar operaciones entre los tipos de datos básicos: suma, resta, producto, cociente, etc., de dos números. Otros lenguajes como el BASIC y Java permiten "sumar", concatenar cadenas de caracteres.
En la página titulada "La primera aplicación", hemos aprendido a crear un poyecto nuevo, y la clase que describe la aplicación mínima que contiene la función estática main. Luego, le hemos añadido código para dar cierta funcionalidad a la aplicación, que ha consistido en imprimir un mensaje en la consola o mostrarlo en la ventana denominada Execution Log.
Recordaremos que la imagen del disquette significa un proyecto nuevo cuyo nombre aparece en letra negrita, y cuyos componentes son archivos código fuente en el que se guardan las clases.

Los operadores aritméticos

Java tiene cinco operadores aritméticos cuyo significado se muestra en la tabla adjunta

OperadorNombreEjemplo
+Suma3+4
-Diferencia3-4
*Producto3*4
/Cociente20/7
%Módulo20%7

El cociente entre dos enteros da como resultado un entero. Por ejemplo, al dividir 20 entre 7 nos da como resultado 2.
El operador módulo da como resultado el resto de la división entera. Por ejemplo 20%7 da como resultado 6 que es el resto de la división entre 20 y 7.
El operador módulo también se puede emplear con números reales. Por ejemplo, el cociente entre 7.5 y 3.0 es 2.5 y el resto es cero, es decir, 7.5=3.0 x 2.5+ 0. El operador módulo, funciona de la siguiente forma 7.5=3.0 x 2+1.5, calcula la diferencia entre el dividendo (7.5)  y el producto del divisor (3.0) por la parte entera (2) del cociente, devolviendo 1.5. Así pues, la operación 7.5%3.0 da como resultado 1.5.

El operador asignación

Nos habremos dado cuenta que el operador más importante y más frecuentemente usado es el operador asignación =, que hemos empleado para la inicialización de las variables. Así,

int numero;
 numero=20;
la primera sentencia declara una variable entera de tipo int y le da un nombre (numero). La segunda sentencia usa el operador asignación para inicializar la variable con el número 20.
Consideremos ahora, la siguiente sentencia.

a=b;
que asigna a a el valor de b. A la izquierda siempre tendremos una variable tal como a, que recibe valores, a la derecha otra variable b, o expresión que tiene un valor. Por tanto, tienen sentido las expresiones

a=1234;
 double area=calculaArea(radio);
 superficie=ancho*alto;
Sin embargo, no tienen sentido las expresiones

1234=a;
 calculaArea(radio)=area;
Las asignaciones múltiples son también posibles. Por ejemplo, es válida la sentencia
c=a=b;   //equivalente a c=(a=b);
la cual puede ser empleada para inicializar en la misma línea varias variables
c=a=b=321;  //asigna 321 a a, b y c
El operador asignación se puede combinar con los operadores aritméticos

ExpresiónSignificado
x+=yx=x+y
x-=yx=x-y
x*=yx=x*y
x/=yx=x/y
Así, la sentencia
x=x+23;
evalúa la expresión x+23, que es asignada de nuevo a x. El compilador lee primero el contenido de la porción de memoria nombrada x, realiza la suma, y guarda el resultado en la misma porción de memoria. Se puede escribir la sentencia anterior de una forma equivalente más simple
x+=23;

Concatenación de strings

En Java se usa el operador + para concatenar cadenas de carcateres o strings. Veremos en el siguiente apartado una sentencia como la siguiente:
System.out.println("la temperatura centígrada es "+tC);
El operador + cuando se utiliza con strings y otros objetos, crea un solo string que contiene la concatenación de todos sus operandos. Si alguno de los operandos no es una cadena, se convierte automáticamente en una cadena. Por ejemplo, en la sentencia anterior el número del tipo double que guarda la variable tC se convierte en un string que se añade al string "la temperatura centígrada es ".
Como veremos más adelante, un objeto se convierte automáticamente en un string si su clase redefine la función miembro toString de la clase base Object.
Como vemos en el listado, para mostrar un resultado de una operación, por ejemplo, la suma de dos números enteros, escribimos
iSuma=ia+ib;
        System.out.println("El resultado de la suma es "+iSuma);
Concatena una cadena de caracteres con un tipo básico de dato, que convierte automáticamente en un string.
El operador += también funciona con cadenas.

String nombre="Juan ";
 nombre+="García";
 System.out.println(nombre);

public class OperadorAp {
    public static void main(String[] args) {
        System.out.println("Operaciones con enteros");
        int ia=7, ib=3;
        int iSuma, iResto;
        iSuma=ia+ib;
        System.out.println("El resultado de la suma es "+iSuma);
        int iProducto=ia*ib;
        System.out.println("El resultado del producto es "+iProducto);
        System.out.println("El resultado del cociente es "+(ia/ib));
        iResto=ia%ib;
        System.out.println("El resto de la división entera es "+iResto);

        System.out.println("**********************************");
        System.out.println("Operaciones con números decimales");
        double da=7.5, db=3.0;
        double dSuma=da+db;
        System.out.println("El resultado de la suma es "+dSuma);
        double dProducto=da*db;
        System.out.println("El resultado del producto es "+dProducto);
        double dCociente=da/db;
        System.out.println("El resultado del cociente es "+dCociente);
        double dResto=da%db;
        System.out.println("El resto de la división es "+dResto);
   }
}

La precedencia de operadores

El lector conocerá que los operadores aritméticos tienen distinta precedencia, así la expresión
a+b*c 
es equivalente a

a+(b*c)
ya que el producto y el cociente tienen mayor precedencia que la suma o la resta. Por tanto, en la segunda expresión el paréntesis no es necesario. Sin embargo, si queremos que se efectúe antes la suma que la multiplicación tenemos de emplear los paréntesis

(a+b)*c
Para realizar la operación  escribiremos

a/(b*c);
o bien,

a/b/c;
En la mayoría de los casos, la precedencia de las operaciones es evidente, sin embargo, en otros que no lo son tanto, se aconseja emplear paréntesis. Como ejemplo, estudiemos un programa que nos permite convertir una temperatura en grados Fahrenheit en su equivalente en la escala Celsius. La fórmula de conversión es


cuya codificación es
tC=(tF-32)*5/9;
Las operaciones se realizan como suponemos, ya que si primero se realizase el cociente 5/9, el resultado de la división entera sería cero, y el producto por el resultado de evaluar el paréntesis sería también cero. Si tenemos dudas sobre la precedencia de operadores podemos escribir
tC=((tF-32)*5)/9;
public class PrecedeApp {
    public static void main(String[] args) {
        int tF=80;
        System.out.println("la temperatura Fahrenheit es "+tF);
        int tC=(tF-32)*5/9;
        System.out.println("la temperatura centígrada es "+tC);
    }
}

La conversión automática y promoción (casting)

Cuando se realiza una operación, si un operando es entero (int) y el otro es de coma flotante (double) el resultado es en coma flotante (double).
int a=5;
 double b=3.2;
 double suma=a+b;
Cuando se declaran dos variables una de tipo int y otra de tipo double.
int entero;
 double real=3.20567;
¿qué ocurrirá cuando asignamos a la variable entero el número guardado en la variable real?. Como hemos visto se trata de dos tipos de variables distintos cuyo tamaño en memoria es de 32 y 64 bits respectivamente. Por tanto, la sentencia

entero=real;
convierte el número real en un número entero eliminando los decimales. La variable entero guardará el número 3.

Se ha de tener cuidado, ya que la conversión de un tipo de dato en otro es una fuente frecuente de error entre los programadores principiantes. Ahora bien, supongamos que deseamos calcular la división 7/3, como hemos visto, el resultado de la división entera es 2, aún en el caso de que tratemos de guardar el resultado en una variable del tipo double, como lo prueba la siguiente porción de código.

int ia=7;
 int ib=3;
 double dc=ia/ib;
Si queremos obtener una aproximación decimal del número 7/3, hemos de promocionar el entero ia a un número en coma flotante, mediante un procedimiento denominado promoción o casting.

int ia=7;
 int ib=3;
 double dc=(double)ia/ib;
Como aplicación, consideremos el cálculo del valor medio de dos o más números enteros

int edad1=10;
 int edad2=15;
 double media=(double)(edad1+edad2)/2;
El valor medio de 10 y 15 es 12.5, sin la promoción se obtendría el valor erróneo 12.
Imaginemos ahora, una función que devuelve un entero int y queremos guardarlo en una variable de tipo float. Escribiremos
float resultado=(float)retornaInt();
Existen también conversiones implícitas realizadas por el compilador, por ejemplo cuando pasamos un entero int a una función cuyo único parámetro es de tipo long.

Los operadores unarios

Los operadores unarios son:
  • ++ Incremento
  • -- Decremento
actúan sobre un único operando. Se trata de uno de los aspecto más confusos para el programador, ya que el resultado de la operación depende de que el operador esté a la derecha i++ o a la izquierda ++i.
Conoceremos, primero el significado de estos dos operadores a partir de las sentencias equivalentes:

i=i+1;  //añadir 1 a i
 i++;  
Del mismo modo, lo son

i=i-1;  //restar 1 a i
 i--;  
Examinemos ahora, la posición del operador respecto del operando. Consideremos en primer lugar que el operador unario ++ está a la derecha del operando. La sentencia

j=i++;
asigna a j, el valor que tenía i. Por ejemplo, si i valía 3, después de ejecutar la sentencia, j toma el valor de 3 e i el valor de 4. Lo que es equivalente a las dos sentencias

j=i;
 i++;
Un resultado distinto se obtiene si el operador ++ está a la izquierda del operando

j=++i;
asigna a j el valor incrementado de i. Por ejemplo, si i valía 3, después de ejecutar la sentencia j e i toman el valor de 4. Lo que es equivalente a las dos sentencias

++i;
 j=i;
public class UnarioApp {
    public static void main(String[] args) {
        int i=8;
        int a, b, c;
        System.out.println("\tantes\tdurante\tdespués");
        i=8; a=i; b=i++; c=i;
        System.out.println("i++\t"+a+'\t'+b+'\t'+c);
        i=8; a=i; b=i--; c=i;
        System.out.println("i--\t"+a+'\t'+b+'\t'+c);

        i=8; a=i; b=++i; c=i;
        System.out.println("++i\t"+a+'\t'+b+'\t'+c);
        i=8; a=i; b=--i; c=i;
        System.out.println("--i\t"+a+'\t'+b+'\t'+c);

    }
}

La salida del programa es, la siguiente

antes          durante      después
i++  8  8  9
i--  8  8  7
++i  8  9  9
--i  8  7  7

La primera columna (antes) muestra el valor inicial de i, la segunda columna (durante) muestra el valor de la expresión, y la última columna (después) muestra el valor final de i, después de evaluarse la expresión.
Se deberá de tener siempre el cuidado de inicializar la variable, antes de utilizar los operadores unarios con dicha variable.