+34 622 433 623 info@manolohidalgo.com

Apuntes Java – Iniciación

Buenos días, buenas tardes, buenas noches… sea la hora que sea, bienvenido a este pequeño blog donde voy a realizar un repaso de las actividades llevadas a cabo durante el curso 2019/2020 en la clase de programación de 1º DAW del I.E.S. Gran Capitán de Córdoba.

En nuestro caso, utilizamos además de Java como lenguaje de aprendizaje Python, aunque en este apartado me voy a centrar en la parte de Java, impartida por Rafael del Castillo y siguiendo como guía principal el libro Aprende Java con Ejercicios de Luis José Sánchez, el cual recomiendo desde aquí para todo aquel que quiera aprender desde 0 en la programación con Java.

En este blog no vas a encontrar un desarrollo completo para poder aprender a programar desde cero, pero sí intentaré añadir los conceptos que a mi parecer son más importantes y aquellos que me han creado algunas dudas y creo que también pueden ser de interés para ti.

En este primer apartado, encontrarás la información necesaria para realizar los que llamaremos Ejercicios Secuenciales.

Conceptos básicos

  1. El fichero debe tener el mismo nombre que la clase principal seguido por .java
  2. Los comentarios de varias líneas se realizan con /* …… */
  3. Los comentarios de línea se indican incluyendo al principio del comentario //
  4. Mostrar información por pantalla en el terminal se realiza con las siguientes instrucciones:
    1. System.out.println("texto"); incluye un salto de línea al final.
    2. System.out.print("texto"); no incluye salto de línea al final.
  5. Todas las sentencias deben terminar con ;

Formato de texto

Colores

En ocasiones interesa que en pantalla salga el texto de un determinado color, bien para representar un estado (por ejemplo: activo en blanco, inactivo en rojo) o por motivos estéticos.

En este caso, se ha de introducir el código antes del texto que se quiere en ese color. El código a incluir sería el siguiente \033[XX donde XX será intercambiado por el código numérico, aquí dejo una lista con algunos de ellos:

30 – negro
31 – rojo
32 – verde
33 – amarillo
34 – azul
35 – morado
36 – cyan
37 – blanco

90 – negro claro
91 – rojo claro
92 – verde claro
93 – amarillo claro
94 – azul claro
95 – morado claro
96 – cyan claro
97 – blanco claro

Ejemplo: System.out.println("\033[31 Esto se verá rojo");
Nota: si tras el código se deja un espacio como en el ejemplo anterior, este será mostrado en pantalla como tal, si no se desea que haya espacio deberá escribirse el código y a continuación, sin espacio el texto que se desea mostrar.

Salida formateada

Si queremos que el texto salga mediante un formato determinado también podemos incorporarlo en nuestro código para su presentación por pantalla.
Para ello, debemos utilizar la instrucción System.out.printf() en vez de las habituales System.out.println() o System.out.print();

Ejemplo:
System.out.printf("En este ejemplo mostramos el número %d", 5);

Como vemos, en este caso, la expresión printf dispone de dos partes entre los paréntesis, en la primera, que es lo que mostrará por pantalla, vemos que aparecen los caracteres %d que serán sustituidos al mostrarse por lo que incluyamos en la segunda parte de la expresión.

SímboloIndica que se va a introducir:
%dcarácter numérico entero
%fcarácter numérico decimal
%scadena de texto
/nsalto de línea
%.3fespecifica que se deben mostrar 3 decimales
%-10sreserva 10 caracteres para la cadena, si es más pequeña se rellena con espacios en blanco, alinea a la izquierda.
%10sreserva 10 caracteres para la cadena, si es más pequeña se rellena con espacios en blanco, alinea a la derecha.
%8.2freserva 8 caracteres para el número completo, incluyendo la coma decimal y dos serán decimales.
/tinserta una tabulación

Variables

Una variable es un contenedor de información, es decir, es referenciada con un nombre y almacenará la información que nosotros le indiquemos, pudiendo modificarla u operar con ella a lo largo de nuestro programa.

Se recomienda, para dar una mayor legibilidad al programa utilizar variables con nombres significativos.

En nuestro caso, nos hemos habituado a utilizar el formato lowerCamelCase, según el cual, deben empezar los nombres de variable por minúscula y las demás palabras se añadirán a continuación, sin separación, comenzando por mayúscula para ser reconocidas.
Ej: precioTotal

Tipos primitivos de datos

Los datos pueden ser de diferente tipo según la información que vayan a contener, en Java, los datos primitivos son los siguientes:

TipoValor almacenado
booleantrue o false
bytenúmero entero
charcarácter
shortnúmero entero
intnúmero entero
longnúmero entero
floatnúmero decimal
doublenúmero decimal

Para la realización de nuestros ejercicios hemos trabajado habitualmente con boolean, char, int y double.

Operadores aritméticos

OperadorNombreEjemploDescripción
+suma10 + xsuma dos números
restaa – bresta de dos números
*multiplicación3 * 7multiplica dos números
/división4 / adivide dos números
%resto (módulo)5 % 2resto de la división entera
++incrementoa++incrementa el valor de la variable en 1
decrementoa–decrementa el valor de la variable en 1

En el caso de los operadores ++ y — hemos de tener en cuenta su forma de uso, ya que varía la forma en que se muestra en pantalla.

Por ejemplo, si a = 5 obtendremos los siguientes resultados:

System.out.println(a++);

Mostraría en pantalla el valor 5, y guardaría el valor de la variable a sumando uno, a=6.

System.out.println(++a);

En este caso, el valor de la variable se modificaría con antelación a mostrarse en pantalla, por lo que a pasaría a almacenar el valor 6, y por tanto mostraría en pantalla 6.

Asignación de valores a las variables

La asignación de una variable se realiza mediante el símbolo =, la misma se declara indicando el tipo de dato que albergará y se le puede indicar el valor en ese momento, o posteriormente a lo largo del programa.

Ej: int precioTotal;
En este caso, sólo realizamos la declaración de la variable, en la que indicamos que albergará un valor entero.
La asignación del valor se hará en otro momento de nuestro programa, por ejemplo tras realizar la suma de varios artículos:
Ej: precioTotal = articulo1 + articulo2;

Ej: double precioTotal = 9.99;
En este ejemplo, se realiza la declaración de la variable, se indica el tipo y además se le asigna un valor.

Cuando se crea una variable es importante tener en cuenta el valor que se almacenará en la misma, por ejemplo, podemos querer saber cual es la edad media de una clase, con lo que los diferentes campos de edad serán enteros, sin embargo la media resultante puede interesarnos saberla con los decimales pertinentes. En esta caso edadMedia debería ser double, y para realizar la operación pertinente es importante llevar a cabo un casting, el cual explicaré en el siguiente punto.

Conversión de tipos (casting)

Castear una variable es el proceso de realizar una conversión del tipo de una variable a otro para un uso puntual de la misma.

Siguiendo el apartado anterior, vamos a realizar un ejemplo del casting.

Ejemplo:
int edad1 = 20;
int edad2 = 30;
int edad3 = 26;
double edadMedia;

Si partimos de esta premisa, la edad media que obtendremos será de 25,33 años. Pero para obtener este resultado, la siguiente operación no sería correcta:

Ej: edadMedia = (edad1 + edad2 + edad3) / 3;

De este modo, aunque edadMedia sea double, el resultado que obtendríamos sería 25, ¿por qué?

El motivo es muy sencillo, Java realiza las operaciones de forma inicial sobre datos de tipo int, por tanto, cuando realizamos la división descarta los decimales y se queda sólo con la parte entera, devolviendo así un valor del tipo con el que está trabajando. ¿Cómo podemos solucionarlo?

Para obtener el resultado correcto, debemos realizar un casting, el cual consiste tan sólo en poner entre paréntesis, antes del dato el tipo al que lo queremos convertir, de forma que quedaría así:

Ej: edadMedia = (double) (edad1 + edad2 + edad3) / 3;

Tal y como lo hemos escrito ahora, el resultado que nos aparecería sería el correcto. En este caso, ten en cuenta que estamos trabajando con el resultado de la suma de las edades como si fuese un número double, y aunque el número 3, sería un int, el resultado de la operación será double, ya que es el formato más genérico de la operación.

Lectura de datos desde teclado

Para llevar a cabo el proceso de lectura de datos hay varias opciones, tras la realización del curso hemos optado por la creación de una clase teclado, que nos permite la recepción de los datos y captura posible excepciones por la introducción de datos erróneos. Sin embargo, vamos a explicar aquí también las otras opciones, tanto con System.console().readline() como con la clase Scanner.

System.console().readline()

Lectura de texto

Para la lectura de información desde teclado podemos utilizar la función System.console().readline(), con ella, el programa queda a la espera de que introduzcamos datos hasta que pulsemos la tecla INTRO.

Ejemplo:
String capital;
System.out.println("Introduce el nombre de la capital de España");
capital = System.console().readline();
System.out.println("La capital de España es " + capital);

En este ejemplo se nos pide la capital de España, introduciremos el nombre que creemos correcto y posteriormente aparecerá en pantalla la afirmación de que ese nombre es la capital de España. (Más adelante veremos como hacer que el programa compruebe si el valor introducido es correcto y varíe su respuesta según el caso).

Lectura de números

La realización de lectura de números sigue el mismo procedimiento que el texto, pero una vez almacenado, debemos convertir el resultado al tipo que deseamos. Lo que llevamos a cabo con la función tipo.parseTipo()

Ejemplo:
Integer.parseInt()
Double.parseDouble()

Veamos un ejemplo de la parte de código que correspondería al código para capturar un número entero:

Ejemplo:
int alumnos;
String auxiliar;
System.out.println("Número de alumnos en clase: ");
auxiliar = System.console().readline();

alumnos = Integer.parseInt(auxiliar);
System.out.println("La clase tiene " + alumnos + " alumnos.");

En este caso, vemos cómo primero utilizamos una variable auxiliar para capturar la respuesta introducida por teclado y en la siguiente línea la convertimos a entero para asignarle el valor numérico a alumnos.

También se puede realizar, como sería más habitual, en un único paso, omitiendo la variable auxiliar e incluyendo toda su expresión entre paréntesis, quedando así:

Ejemplo:
int alumnos;
System.out.println("Número de alumnos en clase: ");
alumnos = Integer.parseInt(System.console().readline());
System.out.println("La clase tiene " + alumnos + " alumnos.");

Este sistema funciona bien en una consola (terminal), pero en ocasiones puede provocar problemas al trabajar con los diferentes IDEs como Eclipse, NetBeans, Visualstudio Code… por este motivo, personalmente prefiero utilizar la clase Scanner o la propia clase Teclado.

Clase Scanner

Para utilizar la clase Scanner tenemos que importar el paquete java.util.Scanner, para ello, al inicio del documento incluiremos el import correspondiente:

import java.util.Scanner;

Más abajo, una vez pasado el public static void main(Sting[] args) {

Debemos incluir la siguiente línea:

Scanner scanner = new Scanner (System.in);

Con ella hemos creado un objeto de la clase Scanner con el mismo nombre, mediante el cual podremos hacer uso de sus funciones para capturar el texto.

Lectura de texto:
scanner.nextLine();
Lo utilizaríamos de forma equivalente a System.console().readline() y se podría convertir del mismo modo, pero para ello, la clase Scanner tiene otras funciones específicas.

Lectura de números:
scanner.nextInt();
Este caso se utilizaría para capturar el valor de datos numéricos enteros.

scanner.nextDouble();
Este caso se utilizaría para capturar el valor de datos numéricos con decimales.

Clase Teclado

Para el desarrollo de nuestros ejercicios, finalmente hemos desarrollado una clase Teclado, esta se sirve de la clase Scanner pero realiza un control de los datos que recibimos por parte del usuario para comprobar que son correctos (si son enteros, decimales, caracteres…) y en caso de no serlo, gestiona una nueva petición.

Dejo el enlace a la clase Teclado desarrollada en mi cuenta de GitHub aquí.