martes, 27 de junio de 2017

Estructuras de almacenamiento (Arrays)


¿Qué es un arrays?

Un array es una estructura de datos que nos permite almacenar una gran cantidad de datos de un mismo tipo. El tamaño de los arrays se declara en un primer momento y no puede cambiar en tiempo de ejecución como puede producirse en otros lenguajes.

Arrays en java
Java proporciona una estructura de almacenamiento denominada array que permite almacenar muchos objetos de la misma clase e identificarlos con el mismo nombre.

La declaración de un array tiene la siguiente sintaxis:
tipo-o-clase[] identificador-array;
                      o
tipo-o-clase identificador-array[];

Por ejemplo, un array de números enteros se puede declarar de dos
formas:
int[] numeros;
          o
int numeros[];

Ambas declaraciones son equivalentes, el tipo base del array es int y el nombre del array es numeros. Todos los elementos de la estructura numeros[] almacenan un int. La primera declaración define un array de objetos de tipo primitivo int con identificador numeros. La segunda declaración dice que cada elemento de la forma numeros[] es de tipo int.

Ejemplos de declaraciones de arrays:
int[] numerosEnteros; // array de tipo int
double[] numerosReales; // array de tipo double
String[] nombres; // array de tipo String
Object[] objetos; // array de la clase Object
Autos[] auto; // array de la clase auto

Se denomina tipo base del array al tipo que se declara para sus elementos.

Este tipo base puede ser un tipo primitivo de Java, un objeto o una clase definida. En los ejemplos anteriores se han utilizado tipos primitivos y clases como tipo base. El array numerosEnteros almacena objetos del primitivo int. El array nombres almacena objetos de la clase String. El array objetos almacena referencias a instancias de la clase Object de
Java. El array auto almacena objetos de la clase Autos.
Además de declarar un array es necesario indicar el número de elementos que va a almacenar. Un array es un objeto y como cualquier objeto de un programa Java, su valor inicial es null. Antes de hacer referencia a los elementos del array es necesario instanciar el objeto.

Cuando se instancia un objeto array se asigna un espacio de memoria para almacenar los elementos del array. Para esto es necesario saber el número total de elementos que va a almacenar.

La instanciación de un objeto array se hace de la siguiente forma:
nombres = new String[100];
auto= new Autos[50];

En este ejemplo, el array nombres tiene capacidad para almacenar hasta
100 objetos de tipo String. El array auto puede almacenar hasta 50 objetos de la clase Autos.
Cuando se crea un array se inicializa el valor de todos sus elementos al valor por defecto del tipo base del array: cero para los números, false para los boolean, para los caracteres y null para las referencias a objetos.

De forma similar al resto de objetos de Java, un array se puede inicializar al momento de la declaración. En este caso se inicializa al valor por defecto del tipo del array.

int[] numerosEnteros = new int[10];
String[] nombres = new String[100];
Autos [] auto = new Autos[50];


Por ejemplo, el array notas almacena 5 números enteros.-
La declaración del array:



int[] notas = {4, 9, 7, 5, 10};

El primer elemento del array se almacena en la posición 0 y el último en la posición 4, que equivale a su tamaño menos 1. El atributo length almacena el tamaño de un array. En este ejemplo, la última posición del array es notas.length – 1.
Este arrray notas almacena 5 calificaciones, notas[0] es el primer elemento del array y notas[4] el último. Para mostrar las calificaciones almacenadas en el array, se puede utilizar un for con una variable deVcontrol que vaya de cero hasta la longitud del array menos 1.

for (int i=0; i<=notas.length - 1; i++)
System.out.println("notas[" + i + "] es " +
notas[i]);

La salida por la consola:

notas[0] es 4
notas[1] es 9
notas[2] es 7
notas[3] es 5
notas[4] es 10

El siguiente for es equivalente al anterior. En vez de definir el límite de la variable de control menor o igual a notas.length–1, se hace estrictamente menor que notas.length.

for (int i=0; i<notas.length; i++)
System.out.println("notas[" + i + "] es " +
notas[i]);

El atributo length de un array almacena un valor numérico que se puedeVconsultar pero no se puede modificar. Es una buena práctica de programación utilizar el atributo length para hacer referencia al tamaño de un array.

Otra forma de mostrar los valores almacenados en un array es utilizando un for “para todo”, donde la variable de control del for, con identificador nota, toma el valor de todos los elementos de la estructura de almacenamiento, en este caso, el array notas.

for (int nota : notas)
System.out.println(nota);

La variable nota del for “para todo” toma los valores nota[0], nota[1],nota[2], nota[3] nota[4] y nota[5] en cada iteración. Cuando se utiliza un for “para todo” no hace falta indicar los límites de la variable de control del for, basta que esta variable sea del tipo almacenado en el array. En este ejemplo nota es de tipo int.

La salida por la consola:
4
9
7
5
10

Ejemplo de "diasTrabajo"-
Un array también se puede inicializar indicando la lista de valores que va almacenar:
String[] diasTrabajo = {"Lunes",
"Martes",
"Miércoles",
"Jueves",
"Viernes"
“Sábado”;

int[] enteros = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11};

El array diasTrabajo almacena 6 objetos de tipo String con los nombres de los días laborables de la semana. El array enteros almacena 12 números enteros con valores de 0 a 11.

Para hacer referencia a cada elemento de un array es necesario indicar la posición que ocupa en la estructura de almacenamiento. Esta posición se denomina índice. El primer elemento de un array se almacena en la posición cero y el último elemento en la posición n-1, donde n es el tamaño del array.

El array diasTrabajo almacena los nombres de los días laborables de la semana.-
La declaración del array:


String[]diasTrabajo = {"Lunes",
"Martes",
"Miércoles",
"Jueves",
"Viernes"
“Sábado”};

De nuevo, se utiliza un for “para todo” para mostrar el contenido del array
diasTrabajo que almacena objetos de tipo String.

for (String dia: diasTrabajo)
System.out.println(dia);

La variable dia del for “para todo” es de tipo String y toma los valores
diasTrabajo [0]diasTrabajo [1]diasTrabajo [2],
diasTrabajo [3], diasTrabajo [4] y diasTrabajo [5]  en cada iteración.

La salida por consola:
Lunes
Martes
Miércoles
Jueves
Viernes
Sábado

La estructura de un programa en Java


En este ejemplo de programa se pueden identificar los siguientes elementos del lenguaje Java: comentarios, definiciones de clase, definiciones de método y sentencias.
Comentario: El programa comienza con un comentario. El delimitador de inicio de un comentario es /* y el delimitador de fin de comentario es */. El texto del primer comentario de este ejemplo sería: ‘Este programa escribe el texto “Hola Mundo” en la consola utilizando el método System.out.println()'. Los comentarios son ignorados por el compilador y solo son útiles para el programador. Los comentarios ayudan a explicar aspectos relevantes de un programa y lo hacen más legible. En un comentario se puede escribir todo lo que se desee, el texto puede ser de una o más líneas.

Definición de clase: La primera línea del programa, después del primer comentario. Define una clase que se llama HolaMundo. La definición de la clase comienza por el carácter {y termina con el carácter}. El nombre de la clase lo define el programador.

Definición de método: Después de la definición de clase se escribe la definición del método main(). Todos los programas Java deben incluir un método main(). Este método indica las sentencias a realizar cuando se ejecuta un programa. Un método es una secuencia de sentencias ejecutables. Las sentencias de un método quedan delimitadas por los caracteres { y } que indican el inicio y el fin del método, respectivamente.

Sentencia:Dentro del método main() se incluye una sentencia para mostrar un texto por la consola. Los textos siempre se escriben entre comillas dobles para diferenciarlos de otros elementos del lenguaje. Todas las sentencias de un programa Java deben terminar con el símbolo punto y coma. Este símbolo indica al compilador que ha finalizado una sentencia.

Una vez que el programa se ha editado, es necesario compilarlo y ejecutarlo para comprobar si es correcto. Al finalizar el proceso de compilación, el compilador indica si hay errores en el código Java, dónde se encuentran y el tipo de error que ha detectado: léxico, sintáctico o semántico.

/* Este programa calcula el perímetro de una circunferencia */
public class PerimetroCircunferencia {
public static void main (String[] args) {
// declaración de PI y la variables radio y perimetro
final double PI = 3.1415926536;
double radio = 25.0, perimetro;
perimetro = 2.0*PI*radio;
System.out.print("El perimetro de la circunferencia de radio ");
System.out.print(radio);
System.out.print(" es ");
System.out.print(perimetro);
}
}

En un programa Java las sentencias se ejecutan secuencialmente, una detrás de otra en el orden en que están escritas.

En este ejemplo se puede ver que dentro del método main() se incluye un comentario de una sola línea que comienza con //. Después se declaran las variables PI, radio y perimetro, todas ellas de tipo doublé porque almacenan números reales. PI representa un valor constante, por lo que es necesario utilizar el delimitador final y asignarle el valor 3.1415926536 correspondiente al número pi.

Después de las declaraciones, se asigna el valor 25.0 a la variable radio y se calcula el perímetro. Finalmente, se muestra el resultado del cálculo del perímetro para una circunferencia de radio 25.

En este ejemplo se utilizan variables numéricas de tipo double. Cada variable almacena un número real. La parte entera del número se separa de los decimales con un punto, no con una coma. Esta es una característica de Java que se debe tener en cuenta, de lo contrario, el compilador no entiende que se trata de un número real.

El valor 25.0 almacenado en la variable radio es una magnitud para la que no se indican sus unidades. El programador es responsable de que los cálculos se realicen correctamente y de realizar la conversión de unidades cuando sea necesario.

Para escribir un mensaje por la consola se utilizan los métodos System.out.print() y System.out.println(). Para escribir un mensaje sin saltar a la línea siguiente se utiliza System.out.print(), System.out.println() escribe un mensaje y da un salto de línea.

¿Qué hace el siguiente código Java?
System.out.print("Hola");
System.out.print(" ");
System.out.print("Mundo");

En este ejemplo se escribe el texto “Hola Mundo” en la consola.
Hola Mundo

¿Qué pasaría si se omitiera la segunda línea de código?
System.out.print("Hola");
System.out.print("Mundo");

En este caso se escribiría “HolaMundo” sin el espacio de separación entre las dos palabras.
HolaMundo

Si en vez de utilizar el método System.out.print() se utiliza el método System.out.println(), entonces el mensaje se escribe en dos líneas distintas.
System.out.println("Hola");
System.out.println("Mundo");

En este ejemplo, se escribiría “Hola” y “Mundo” en dos líneas.
Hola
Mundo

Combinando el uso de los métodos System.out.print() y System.out.println() se puede escribir cualquier mensaje en la consola saltando de línea cuando sea necesario. Además, ambos métodos permiten utilizar el operador + para concatenar textos.

El siguiente código Java escribe “Hola Mundo” en la consola.
System.out.print("Hola");
System.out.print(" ");
System.out.print("Mundo");

En este caso se ejecutan tres métodos System.out.print(). Este código se puede simplificar utilizando un solo método System.out.print() y el operador + para concatenar los textos “Hola”, “ ” y “Mundo”.
System.out.print("Hola" + " " + "Mundo");

También se puede escribir directamente el mensaje “Hola Mundo”. El resultado es el mismo y el código es más claro.
System.out.print("Hola Mundo");

Para mostrar por la consola un texto seguido del valor almacenado de una variable se puede ejecutar dos veces el método System.out.print():

System.out.print("El perímetro es ");
System.out.print(perimetro);

Este código se puede simplificar utilizando el operador + para concatenar el texto “El perímetro es ” con el valor almacenado en la variable perimetro.
System.out.print("El perímetro es " + perimetro);

En ambos casos el resultado es el mismo. Por ejemplo, si el valor almacenado en la variable perimetro fuera 157.08 la salida por la consola sería:

El perímetro es 157.08

La plataforma de Java


Los programas Java se compilan a un lenguaje intermedio, denominado Bytecode. Este código es interpretado por la máquina virtual de Java del entorno de ejecución (JRE) y así se consigue la portabilidad en distintas plataformas. El JRE es una pieza intermedia entre el código Bytecode y los distintos sistemas operativos existentes en el mercado. Un programa Java compilado en Bytecode se puede ejecutar en sistemas operativos como Windows, Linux, Mac Os, Solaris, BlackBerry OS, iOs o Android utilizando el entorno de ejecución de Java (JRE) apropiado.
Una de las características más importantes de los lenguajes de programación modernos es la portabilidad. Como se ha comentado antes, un programa es portable cuando es independiente de la plataforma y puede ejecutarse en cualquier sistema operativo y dispositivo físico. Los programas Java son portables porque se ejecutan en cualquier plataforma. Sucede algo parecido con las fotografías o los ficheros PDF. Las fotografías con formato JPEG son portables porque un archivo JPEG lo podemos visualizar con distintos visores de fotos y en dispositivos como ordenadores, tabletas o celulares. El formato JPEG es un estándar para almacenar archivos de imagen. Todas las imágenes JPEG tienen el mismo formato y los visores de fotos están diseñados para mostrar las imágenes con este formato. De forma similar, los archivos PDF (Portable Document Format) son portables. El formato PDF fue desarrollado por Adobe Systems con la idea de que estos archivos se puedan ver en cualquier dispositivo que tenga instalado Adobe Acrobat Reader, el software de visualización de documentos PDF.

La portabilidad de Java ha contribuido a que muchas organizaciones hayan desarrollado sus sistemas de comercio electrónico y sus sistemas de información en Internet con Java. El proceso de desarrollo y de mantenimiento de los sistemas resulta menos costoso y las aplicaciones son compatibles con distintos sistemas operativos.

La evolución del lenguaje de programación Java ha sido muy rápida. La plataforma de desarrollo de Java, denominada Java Development Kit (JDK), se ha ido ampliando y cada vez incorpora a un número mayor de programadores en todo el mundo. En realidad Java no solo es un lenguaje de programación. Java es un lenguaje, una plataforma de desarrollo, un entorno de ejecución y un conjunto de librerías para desarrollo de programas sofisticados. Las librerías para desarrollo se denominan Java Application Programming Interface (Java API).


El siguiente imagen muestra los elementos de la plataforma Java, desde el código fuente, el compilador, el API de Java, los programas compilados en Bytecode y el entorno de ejecución de Java. Este entorno de ejecución (JRE) y la computadora virtual (JVM) permiten que un programa compilado Java se ejecute en distintos sistemas operativos.


Estructuras de programación


Las estructuras de programación o también llamadas estructuras de control permiten implementar procesos, tomar decisiones y realizar procesos con varias repeticiones.

Sentencias
Una expresión es un conjunto de variables unidas por operadores.
Equivalen a instrucciones que el computador interpreta para realizar un proceso determinado. Una sentencia es una expresión que tiene al final punto y coma (;).Es posible incluir varias sentencia en línea, sin embargo, se considera una buena práctica utilizar una línea para cada sentencia. Las siguientes líneas son ejemplos de sentencias en un programa.

int a;
int b;
int c;
b=30;
c=60;
a=b+c;

Comentarios
Existen dos formas diferentes de introducir comentarios entre el código de la aplicación. Los comentarios son útiles para documentar el código implementado.
Los comentarios se realizan de dos formas. La primera consiste en colocar el símbolo “//” en una línea de código y en seguida el texto del comentario. La segunda consiste en incluir el símbolo “/*” al inicio del comentario y el símbolo “*/ al final del comentario. Esta segunda forma permite hacer comentarios en varias líneas de código.

//Este es un comentario en una línea de código
/*
Este es un comentario
En diferentes líneas de código
*/


Estructura de condición if
La estructura de condición “if” se compone de una condición la cual siempre debe arrojar un valor booleano, es decir, verdadero o falso. Esta condición debe encontrarse entre paréntesis. Esta permite ejecutar un conjunto de instrucciones si se cumple la condición establecida. Este conjunto de instrucciones debe estar incluido entre los símbolos “{” y “}”. Sin embargo, si solo se desea ejecutar una instrucción no es necesario incluir los símbolos “{” y “}”.

La sintaxis de esta sentencia es:

if(condición){
instrucción 1;
instrucción 2;
..
instrucción n;
}
O también:
if(condición)
instrucción;

Ejemplo:
/* Imprime en pantalla el mensaje entre paréntesis en la
instrucción System.out.println() */
if(n==5){
System.out.println(“El valor de n es cinco”);

}

Estructura de condición if else
La estructura de condición “if” “else” se compone de una condición, la cual siempre debe arrojar un valor booleano, es decir, verdadero o falso. Esta condición debe encontrarse entre paréntesis. Esta permite ejecutar un conjunto de instrucciones si se cumple la condición establecida y permite ejecutar otro conjunto de instrucciones diferentes si no se cumple la condición establecida. Este conjunto de instrucciones debe estar incluido entre los símbolos “{” y “}”. 
La sintaxis de esta sentencia es:

if(condición){
instrucción 1.1;
instrucción 1.2;
..
instrucción 1.n;
}else{
instrucción 2.1;
instrucción 2.2;
..
instrucción 2.n;
}

Ejemplo:
if(n==5){
System.out.println(“El valor de n es cinco”);
}else{
System.out.println(“El valor de n es diferente de cinco”);
}

La estructura de condición “if ” “else”, se puede implementar con una
Sintaxis avanzada que permita la codificación en una sola línea. Esta sintaxis se debe aplicar si y solo si, se cuenta con un solo proceso enel “if ” y el “else” y tienen el mismo comportamiento.

La sintaxis de esta sentencia es:

(condición) ?
 instrucción 1 :
instrucción 2;

Ejemplo:
System.out.println((n==5) ? “El valor de n es cinco”: “El valor de n es diferente de cinco”);



Estructura de condición if else if
La estructura de condición “if” “else if” se compone de múltiples condiciones, las cuales siempre deben arrojar un valor booleano, es decir, verdadero o falso. Estas condiciones deben encontrarse entre paréntesis. Esta permite ejecutar un conjunto de instrucciones si se cumple la condición establecida y permite ejecutar otro conjunto de instrucciones diferentes, si se cumple la otra condición establecida y así sucesivamente. Este conjunto de instrucciones debe estar incluido entre los símbolos “{” y “}”. Esta estructura permite tener opcionalmente, al final una estructura  else, la cual se ejecuta si ninguna de las condiciones fueron verdaderas. Si una condiciónes verdadera se ejecutan las instrucciones correspondientes y no consulta las siguientes condiciones. 

La sintaxis de esta sentencia es:

if(condición 1){
instrucción 1.1;
instrucción 1.2;
..
instrucción 1.n;
}else if(condición 2){
instrucción 2.1;
instrucción 2.2;
..
instrucción 2.n;
}else if(condición 3){
instrucción 3.1;
instrucción 3.2;
..
instrucción 3.n;
}

Ejemplo:
if(n==1){
System.out.println(“El valor de n es uno”);
}else if(n==2){
System.out.println(“El valor de n es dos”);
}else if(n==3){
System.out.println(“El valor de n es tres”);
}else{
System.out.println(“El valor de n es mayor que tres”);
}


Estructura de condición switch case
La estructura de condición “switch” “case” se compone de múltiples condiciones sobre una misma variable, las cuales siempre deben arrojar un valor booleano, es decir, verdadero o falso. La variable sujeto de la condición debe encontrarse entre paréntesis, posterior a la sentencia “swich”. Los valores de la variable deben estar posterior a la sentencia “case” seguida de “:”. Posterior a cada “case” se implementan las instrucciones del proceso correspondiente. Al finalizar las  instrucciones se debe colocar la sentencia“break” con el fin de salir del proceso. En caso de que no se coloque la sentencia “break” en un proceso, se ejecutará el proceso del siguiente “case” hasta que se encuentre la sentencia “break”. Opcionalmente, el último caso puede contener la sentencia “default”, la cual ejecutaría el correspondiente conjunto de instrucciones si ninguno de los anteriores es verdadero. Por otro lado, la variable de la sentencia “switch” solo puede ser de tipo int o tipo char.

La sintaxis de esta sentencia es:

switch(n){
case 1:
instrucción 1.1;
instrucción 1.2;
..
instrucción 1.n;
break;
case valor 2:
instrucción 2.1;
instrucción 2.2;
..
instrucción 2.n;
break;
default:
instrucción 3.1;
instrucción 3.2;
..
instrucción 3.n;
break;
}

Ejemplo:
switch(variable){
case 1:
System.out.println(“El valor de n es uno”);
break;
case 2:
System.out.println(“El valor de n es dos”);
break;
case 3:
System.out.println(“El valor de n es tres”);
break;
default:
System.out.println(“El valor de n es mayor que tres”);
break;
}



Estructura de repetición while
La estructura de repetición “while define un proceso iterativo es decir, un proceso que se repetirá mientras que una condición tenga el valor verdadero. 

La sintaxis de esta sentencia es:

while(condición) {
instrucción 1;
instrucción 2;
..
instrucción n;
}

Ejemplo:
int i=1;
while(i<=5) {
System.out.println(i); //imprime los números del 1 al 5.
i++;
}

Nota: es posible abortar el proceso iterativo mediante la sentencia “break”;

Ejemplo:
int i=1;
while(i>0) {
System.out.println(i);
if(i==10){
break;
}
i++;
}


Estructura de repetición for
La estructura de repetición “for define un proceso iterativo.
La estructura “for” se compone de inicialización, condición e incremento. La inicialización debe incluir al menos una variable y un valor, la condición debe involucrar la variable de la inicialización con el fin de tener un mecanismo de terminar el proceso iterativo y el incremento debe también, involucrar la variable de la inicialización.
En la inicialización es posible declarar la variable correspondiente.

La sintaxis de esta sentencia es:

for(inicialización; condición; incremento) {
instrucción 1;
instrucción 2;
..
instrucción n;
}

Ejemplo:
for(i=1; i<=5; i++) {
System.out.println(i); //imprime los números del 1 al 5.
}

Ejemplo con declaración:
for(int i=1; i<=5; i++) {
System.out.println(i); //imprime los números del 1 al 5.
}

Nota: es posible abortar el proceso iterativo mediante la sentencia “break”;

Estructura de repetición do while
La estructura de repetición “do” “while” define el proceso iterativo.
Contiene una diferencia con respecto a la estructura “while” que consiste en que el “do” “while” primero ejecuta y luego consulta, mientras que el “while” primero consulta y luego ejecuta.

La sintaxis de esta sentencia es:

do{
instrucción 1;
instrucción 2;
..
instrucción n;
}while(condición);


Ejemplo:
int i=1
do {
System.out.println(i); //imprime los números del 1 al 5.
i++;
}while(i<=5);

Nota: es posible abortar el proceso iterativo mediante la sentencia “break”;