Apuntes ICA0 M03-UF1 - ICA0003-S01, ICA0003-S02 e ICA0003-S03
Apuntes ICA0 M03-UF1 - ICA0003-S01, ICA0003-S02 e ICA0003-S03
Apuntes ICA0 M03-UF1 - ICA0003-S01, ICA0003-S02 e ICA0003-S03
Java es un lenguaje de programación que permite crear aplicaciones para múltiples sistemas
operativos, como Linux, macOS y Windows.
Java usa palabras en inglés de una forma especial, que los ordenadores entienden. Dispone de
una amplia librería de instrucciones y comandos que podemos usar en nuestras aplicaciones.
Ejemplo, System.out.println() indica al ordenador que tiene que mostrar algo en
pantalla. Ese algo puede ser un mensaje de texto, un número…
System.out.println()
La segunda parte, println(), indica al ordenador que ese algo, entre paréntesis, lo tiene que
mostrar en una nueva línea.
A tener en cuenta:
• Todas las instrucciones terminan con ; Todo lo que escriba tras el ; será una nueva
instrucción
En cualquier aplicación Java debe existir una clase, por ejemplo, class Main, que tenga el
método public static void main. Cuando se ejecute la aplicación, se ejecutarán las
instrucciones contenidas en este método, que irán entre llaves { }.
Variables
Los ordenadores usan «cajas temporales» donde guardan información, a las que denominamos
variables. En Java, cada variable tiene un nombre y un valor. A lo largo de una aplicación, el
nombre de una variable no cambia, pero sí que puede cambiar su valor.
Página 1 de 65
Ejemplo de una variable: el nombre de la misma es passengers, y el valor 10.
Los valores de las variables no tienen por qué ser números enteros: también pueden ser
números decimales, letras, texto, valores booleanos…
Eso sí, si creamos una variable para que almacene un determinado tipo de dato, al cambiar su
valor tendrá que ser el mismo tipo de dato.
Página 2 de 65
Habitualmente, en las aplicaciones de Java se trabajan con distintos tipos de datos. Java
dispone de una serie de tipos de datos simples numéricos, que se muestran en las tablas:
Estos tipos de datos permiten representar valores enteros y valores decimales. Cada uno de ellos
tiene una precisión para ajustarse al rango de valores a cubrir, dependiendo de las necesidades.
La regla es usar el tipo de dato que mejor se ajuste al rango de valores, evitando así consumir
memoria innecesariamente, consiguiendo que nuestros programas vayan más rápido.
Página 3 de 65
• int. Se utiliza, como norma general, para números enteros.
• long. Para casos en los que el entero pueda ser muy grande.
• byte y short. Se usarán cuando se tenga un mayor dominio del lenguaje.
• float. Para números decimales con pocas cifras significativas —un máximo de 6—.
• double. Para números decimales que necesiten más precisión.
char se usa para tipos de datos primitivos que van entre comillas simples, como
‘B’. Así, char es un espacio en memoria para un carácter, numero, símbolo, espacio
o letra que va entre comilla simple.
String se usa para cadenas de caracteres que van entre comillas dobles, como
“Buenos días”.
Para declarar una variable de tipo entero en Java escribimos int nombreDeLaVariable;,
como int passengers;. Esta sentencia indica al ordenador que tiene que crear una caja
vacía que podrá almacenar valores enteros y que su nombre será passengers. Por tanto,
int passengers; sirve para declarar la variable passengers.
Página 4 de 65
Seguidamente, hay que asignarle un valor. Antes de que el metro llegue a la primera parada
transportará 0 pasajeros. Por tanto, asignamos a la variable passengers el valor 0.
int passengers;
passengers=0;
También es posible declarar e inicializar —asignar un valor— a una variable en una misma
sentencia:
A medida que le metro realice paradas, el número de pasajeros cambiará. Por tanto, habrá que
actualizar el valor de la variable passengers.
Para actualizar el valor de una variable, escribimos su nombre seguido de = y el nuevo valor que
le queramos asignar. En este caso, es como si se quitara de la caja de la variable el valor 0 y se
insertara el valor 25:
En el siguiente ejemplo se declaran e inicializan una variable isLogin de tipo boolean (valor
lógico true, false), una variable ratio de tipo float (para números decimales con pocas
cifras significativas —un máximo de 6—), una variable budget de tipo double (para números
decimales que necesiten más precisión), una variable letter de tipo char (espacio en
memoria para un carácter, numero, símbolo, espacio o letra que va entre comilla simple ‘ ’) y
Página 5 de 65
una variable greeting de tipo String (cadena de caracteres va entre comillas dobles, como
“Buenos días”).
• La inicialización de una variable de tipo float requiere que se escriba f al final del
número para diferenciarlo con respecto al tipo double.
• La inicialización de una variable de tipo char requiere que insertemos el valor entre
comillas simples ‘ ’.
• La inicialización de una variable de tipo String requiere que insertemos el valor entre
comillas dobles “ ”.
a. char me=‘I’; Variable tipo char con el valor entre comillas simples.
int passengers=0;
System.out.println(passengers);
Nótese que passengers no se pone entre comillas “ ”, puesto que no se quiere printar el
texto passengers, sino el valor de la variable passengers.
Página 6 de 65
A continuación, se declaran e inicializan una serie de variables y se printan sus valores:
• Deben comenzar con una letra minúscula o _ seguido de letras y dígitos sin longitud
máxima.
Página 7 de 65
• No pueden coincidir con aquellas palabras reservadas en Java, que son las siguientes:
boolean isLogin=true;
• Son case sensitive. Por tanto, si se declara la variable productPrice de tipo double
—double productPrice=20.5;— y luego se hace referencia a
productprice, Java dirá que no se encuentra dicha variable.
d. shop
Para diferenciar entre una variable y una constante se usa el modificador final delante de la
declaración de la variable.
double TAX=0.21; → En este caso, a la variable TAX, de tipo double, se le asigna el valor
0.21. Pero, como NO es una constante, TAX podría tener otro valor posteriormente (aunque,
por regla general, el nombre de las constantes se escribe EN MAYÚSCULA).
Página 8 de 65
final double TAX=0.21; → En este caso, TAX es una CONSTANTE de tipo double, lo
que quiere decir que no se le puede asignar otro valor posteriormente, como TAX=0.25;.
Por regla general, el nombre de las constantes se escribe EN MAYÚSCULA. Cuando sea
necesario concatenar palabras se usa el _ (al no poderse aplicar la regla del lowerCamelCase):
Operaciones aritméticas
Una vez que se sabe declarar e inicializar, es hora de ver cómo realizar operaciones aritméticas
con las variables de tipo numérico (int, long, double).
Página 9 de 65
• Primera parada: suben 10 pasajeros y bajan 0.
Para resolverlo, hay que actualizar el valor de la variable passengers. Se hace escribiendo
nombreDeLaVariable=nombreDeLaVariable+incremento;
passengers=5-10; ❌
passengers=10; ❌
Suma
Para realizar operaciones de suma también disponemos del operador ++, que incrementa en 1
unidad el valor de la variable. Java permite dos posibles notaciones (ojo, no son sinónimos, dan
resultados distintos).
int value=2;
value++; //=3
int value=2;
++value; //=3
Página 10 de 65
Diferencia entre la notación postfix y la notación prefix
Para ejemplificarlo, se declara la variable a, de tipo int, con el valor 10, y se printa:
int a=10;
System.out.println(a);
Print output:
10
• Notación postfix:
int a=10;
System.out.println(a);
System.out.println(a++);
System.out.println(a);
Print output:
10
10
11
• Notación prefix:
int a=10;
System.out.println(a);
System.out.println(++a);
System.out.println(a);
Print output:
10
11
11
Página 11 de 65
• Notación postfix:
int decrecimiento=2;
System.out.println(decrecimiento--);
System.out.println(decrecimiento);
Print output:
2
1
• Notación prefix:
int decrecimiento=2;
System.out.println(--decrecimiento);
System.out.println(decrecimiento);
Print output:
1
1
Multiplicación:
3*4; //=12
División:
5/2; //=2
Dividir 5 entre 2 es 2.5, pero Java entiende que dividir un entero entre otro entero es un
entero: por este motivo, del resultado 2.5 se queda con la parte entera, que es 2.
Página 12 de 65
Si se usa una variable de tipo double el resultado se registra con decimales, pero no como
2.5, sino como 2.0 ¿Por qué? Porque Java entiende que el resultado de dividir dos tipos de datos
enteros es un entero. A esto se le conoce como TRUNCAMIENTO, que consiste en eliminar los
dígitos situados a la derecha del punto decimal.
Ahora bien, si escribimos alguno de los miembros de la división como un número decimal,
el resultado cambia. En el siguiente ejemplo, se ha sustituido el divisor entero 2 por el decimal
2.0 y Java, automáticamente, devuelve un tipo decimal con el resultado de la división. En este
caso, 2.5 ¿Por qué? Porque entiende que el resultado de hacer una división con al menos uno
de los operadores decimal da como resultado un valor decimal.
2.5
Resto:
Podemos combinar las operaciones aritméticas según sea necesario. Por ejemplo, para calcular
la propina del camarero. Establecemos que será el 10 % del cambio. Se usará el paréntesis ( )
para indicar el orden en el que han de realizar las operaciones:
Página 13 de 65
public class Main {
public static void main(String[] args){
double precioMenu=23.5;
double pagado=30;
double propina=(pagado-precioMenu)*0.10;
System.out.println(propina);
}
}
Print output:
0.65
1º: Paréntesis.
Ejemplos:
String concatenation
Página 14 de 65
public class Main {
public static void main(String args[]) {
String studentFirstName="John";
String studentLastName="Kennedy";
String studentFullName=studentFirstName+studentLastName;
System.out.println(studentFullName);
}
}
Print output:
JohnKennedy → Se han concatenado las variables, pero no existe espacio entre ellas, debido
a que no se ha añadido un espacio en blanco. Concatenar es esto: juntar el valor de una String
con otra String.
Para que haya espacio entre el nombre y el apellido, la variable studentFullName debe
verse así:
John Kennedy → Hay un espacio entre el nombre y el apellido porque así se ha determinado
en la concatenación; en la variable String studentFullName.
Comentarios
El código de Java ha de tener sentido para otros programadores, porque lo más seguro es que,
cuando uno programa, forme parte de un equipo de desarrolladores. Por esto, hay que
estructurar el código ordenadamente y el nombre de las variables debe ser significativo. Como
ayuda para que el código se entienda mejor, Java permite introducir comentarios entre las
instrucciones. Estos comentarios son ignorados por la máquina que ejecuta el programa.
Página 15 de 65
• Comentario de línea: con dos slashes //
Operadores de asignación
Para que la asignación se produzca, el valor tiene que ser adecuado al tipo de variable:
char letter=‘a’;
boolean access=true;
double area=400.5;
boolean isLogin=4; ❌ → A una variable boolean, que admite solo dos posibles valores, true
o false, se le intenta asignar un número. Esto es incorrecto.
int b=400.5; ❌ →A una variable int se le intenta asignar un número decimal. Esto es
incorrecto.
Página 16 de 65
Java dispone de otros tipos de operadores de asignación, además del símbolo =
30
-10
200
Página 17 de 65
• El operador /= asigna el valor a la variable dividiendo su valor anterior entre la cantidad
que viene a la derecha del operador.
¿Y por qué no 0.5? Porque la división entre dos números enteros es un número
entero, resultado de TRUNCAR la parte decimal.
Hay dos tipos de conversiones: la conversión por ampliación y la conversión por reducción.
Ocurre cuando un valor de un tipo se convierte en un tipo más amplio, uno que se representa
con más bits y, por lo tanto, tiene un rango más amplio de valores.
int a=10;
long b=a;
En este ejemplo se asigna a la
variable b, de tipo long, un
valor int. Esto es una
conversión por ampliación,
puesto que el tipo long
representa un tipo de valores
más amplio que int. Así, el tipo
int lo asignamos a variables de tipo numérico de mayor precisión.
Página 18 de 65
• Es posible asignar tipos de datos byte a cualquier variable de los tipos de más precisión
—short, int, long, float, double—.
• Es posible asignar tipos de datos short a cualquier variable de los tipos de más
precisión —int, long, float, double—.
• Y así sucesivamente.
Página 19 de 65
Conversión por reducción
¿Es posible convertir un tipo de datos de más precisión, por ejemplo, double, a uno de menor
precisión, como float o int?
La respuesta es sí: se trata de la conversión por reducción, puesto que se reduce la precisión al
intentar almacenar en una variable un valor de mayor número de bytes.
En las conversiones por reducción hay que especificar entre paréntesis el tipo de dato en
el cual se reduce la precisión. En este caso, se asigna a una variable de tipo int un valor de tipo
double.
Utilizaremos conversiones por reducción solamente en los casos en los que tengamos muy
claro lo que estamos haciendo. Una situación típica es la que representa el ejemplo anterior:
convertir un tipo decimal, sea double o float, a un tipo entero. En la conversión el
compilador elimina la parte decimal y se queda con la parte entera.
Página 20 de 65
• … Pero sí es posible realizar conversiones entre tipos numéricos y char, porque el
tipo de dato char se almacena en memoria como un número entero sin signo.
El código ASCII surgió en la década de 1960 como evolución de los conjuntos de códigos
utilizados en telegrafía. Casi todos los sistemas informáticos actuales utilizan el código ASCII para
representar textos.
Por ejemplo, el carácter «nueva línea» (line feed), que hace que una impresora avance el papel,
se representa con el valor 10. La tecla Escape se representa con el valor 27. El carácter a, que
hace que se imprima esa letra en la pantalla, se representa con el valor 97. El carácter A se
representa con el valor 65.
Entonces, a cualquier tipo de dato numérico, por ejemplo, int, se le puede asignar un carácter,
como a. Lo que se almacena en la variable es el valor ASCII de este carácter.
Página 21 de 65
int entero=‘a’; //ASCII value: 97
En este caso, la variable entero vale 97, valor ASCII de la letra a.
A → cuyo valor ASCII es 65. Nótese que en el código (letra-32) es (97-32), cuyo resultado
es 65.
/Main.java:4: error: incompatible types: possible lossy conversion from int to char
/Main.java:4: error: tipos incompatibles: posible conversión con pérdidas de int a char
Página 22 de 65
ICA0003-S01-C01-V04 Operadores relacionales y lógicos
(https://lasallefponline.sallenet.org/mod/videofile/view.php?id=100839)
Operadores relacionales
• Equal to == (a==b).
Cada operador relacional devuelve un boolean (tipo de variable que sólo tiene dos valores
posibles: true o false) para indicar si la comparación es true o false.
Por tanto, se puede asignar a una variable de tipo boolean el resultado de la comparación (el
resultado de una operación relacional siempre es un boolean (true/false)):
Página 23 de 65
Los operadores relacionales, al igual que los aritméticos, pueden usarse con variables,
comparando sus valores.
¿Qué valor boolean devuelven las siguientes expresiones dado int x=20?
Operadores lógicos
Los operadores lógicos modifican o combinan valores boolean. Java admite tres operadores
lógicos estándar, que son los siguientes:
• Logical OR || (a||b).
El operador lógico NOT ! convierte el valor boolean que sigue al símbolo ! en su opuesto.
false
En este caso, el boolean value que resulta de evaluar la expresión (3<5) es true, porque
3 es menor que 5, PERO el operador lógico NOT ! lo convierte en false, que es el valor que
registra la variable value.
Página 24 de 65
Logical AND (&&)
El operador lógico AND && combina las dos expresiones booleanas situadas a su izquierda y a su
derecha. El resultado será true cuando ambas expresiones sean true, y false en el resto de casos.
false
¿Por qué? Porque la expresión booleana de la izquierda —3<5— es true, pero la expresión
booleana de la derecha —2>15— es false. Por tanto, el resultado es false.
Logical OR (||)
Página 25 de 65
Un museo ofrece descuento para jóvenes de hasta 15 años y para personas mayores de 60
años. Añade el código necesario para asignar a la variable descuentoMuseo el valor
adecuado según la edad de una persona.
Por tanto, para aplicar un descuento a una persona se tiene que cumplir o que su edad sea
menor o igual a 15, o que su edad sea mayor a 60. Por esto, escribimos la expresión edad<=15
seguida del operador OR || y la expresión edad>60.
true → En este caso, el visitante recibiría un descuento (por tener <= 15 años).
Aunque se combinen, los operadores lógicos AND (&&) y OR (||) continúan operando sobre los
dos valores situados a su izquierda y a su derecha. Por tanto, en el siguiente caso hay tres
expresiones encadenadas:
boolean enteredDosCode=true;
boolean passRetinaScan=false;
boolean hasDoorKey=false;
boolean knowsOverridePassword=true;
boolean
access=enteredDoorCode&passedRetinaScan||hasDoorKey||knowsOverri
dePassword;
Página 26 de 65
¿Qué valor registra la variable access?
Así como Java establece un orden para evaluar los operadores aritméticos —suma, resta,
multiplicación, división y resto—, hace lo mismo para los operadores lógicos. El orden es el
siguiente:
1. Paréntesis.
2. NOT ! (de izquierda a derecha).
3. AND && (de izquierda a derecha).
4. OR || (de izquierda a derecha).
!true||false&&true
Página 27 de 65
b. true&&3>5 → true&&false → false → Es una expresión AND, donde la
expresión 3>5 es false y, por tanto, el resultado es false.
En este video se ven las herramientas necesarias para desarrollar aplicaciones en Java.
Java Tools
IntelliJ
Para programar aplicaciones Java es necesario un entorno de desarrollo como IntelliJ, que
permite crear ágilmente programas, compilarlos y ejecutarlos. Como IntelliJ hay otros muchos
entornos de desarrollo que se pueden usar.
Hay dos versiones de IntelliJ, Community y Ultimate. Hay que descargar Community porque
tiene todas las herramientas que se necesitan y es gratuita.
Actualmente IntelliJ incluye el JDK, por lo que no es necesario nada más. Aunque es preciso
saber que JDK puede descargarse gratuitamente desde la web de Oracle, la organización
propietaria de Java. Existe un JDK para cada tecnología Java.
Existen distintas tecnologías Java según el producto para el que se desarrolla la aplicación. Así,
la tecnología Java EE se usa en aplicaciones de entorno servidor. Java SE se usa en aplicaciones
de escritorio. Java ME en aplicaciones para televisores, móviles, etc.
En este curso se aprende a desarrollar aplicaciones para PC. Por esto, se necesita el Java SE
Development Kit, que está disponible para prácticamente todos los sistemas operativos.
Página 28 de 65
JDK tiene dos herramientas principales:
• Java Runtime Environment (JRE). Contiene el código que hay detrás de todos los tipos
de variables y funciones predefinidas de Java, como println. También contiene una
máquina virtual, conocida como Java Virtual Machine, que permite ejecutar el código
Java en cualquier sistema operativo o plataforma. Algunos PC tienen instalado el JRE
porque se necesita para ejecutar aplicaciones Java que aparecen en páginas web, pero
para desarrollar aplicaciones propias hace falta la segunda herramienta: javac - Java
programming language compiler.
Este Java Bytecode es el que se ejecuta en la máquina virtual de Java y la aplicación se muestra
en la pantalla del PC, sea cual sea su sistema operativo. Por esto se dice que el lenguaje Java es
multiplataforma: Write once, run anywhere (WORA).
Página 29 de 65
Entonces, si tenemos el código Java de una aplicación, por ejemplo, la aplicación que muestra
en pantalla el mensaje Hello World, al compilar el código Java con javac, se obtiene el Java
Bytecode que se ejecuta en la máquina virtual de Java, mostrándose la aplicación en la pantalla.
Cuando se abre IntelliJ por primera vez aparece una pantalla de bienvenida con estas opciones:
Un proyecto es una forma de organizar código. Los proyectos nos ayudan a separar y agrupar
nuestro código de forma que tenga sentido.
Seleccionaremos New Project. IntelliJ abrirá una pregunta donde se pregunta por el JDK que
usará el proyecto. Normalmente, encuentra el JDK correcto automáticamente; de lo contrario,
se puede seleccionar navegando por el sistema de ficheros hasta la ubicación donde se ha
instalado el JDK.
Página 30 de 65
En la misma pantalla IntelliJ también pregunta por librerías y frameworks, que son colecciones
de código Java y funciones que otros desarrolladores han escrito. En el curso se usan funciones
predefinidas de Java, por lo que no se necesita código externo.
En la siguiente pantalla IntelliJ pregunta si se quiere crear un proyecto usando una plantilla.
Diremos que sí y seleccionaremos la plantilla Command Line App (Simple Java application that
includes a class with main() method).
Seguidamente, hay que especificar el nombre del proyecto o aplicación. Es recomendable optar
por un nombre simple lo suficientemente descriptivo. Project location muestra la ubicación del
proyecto. También se muestra el Base package (paquete base), que se denomina por defecto
com.company. Si se está desarrollando una aplicación para ser distribuida en la web o un
dispositivo móvil es obligatorio que tenga un nombre único de paquete, pero para los ejercicios
y ejemplos de este curso puede dejarse com.company.
IntelliJ Environment
• A la izquierda tenemos la estructura del proyecto. Todo proyecto debe tener una
carpeta src, donde se alojará el código fuente de la aplicación. Si expandimos src
veremos que contiene el paquete base (com.company) y dentro de este el fichero Main,
que es una clase. Todo el código que se escriba debe ir dentro de clases.
• Java Runtime Environment (JRE), que especifica la versión que se utiliza; por ejemplo,
Java 11.
Para ejecutar el programa hay dos opciones: botón derecho → Run ‘Main’ o pulsar en el símbolo
de la parte superior derecha.
Si no hay ningún error, se crea el Java Bytecode, que se encuentra en la carpeta out. Además,
aparece en la parte inferior la consola de IntelliJ, donde habrá contenido cuando haya
instrucciones System.out.print.
La aplicación ejecuta las instrucciones existentes dentro del método main una detrás de otra.
Página 31 de 65
están dentro de la carpeta IdeaProjects) y encontrarlo. Si el botón de ejecución Run ‘Main’ está
deshabilitado, hay que ir a Run → Edit Configuration y comprobar las opciones.
Para compartir un proyecto Java hay que comprimir el directorio donde se encuentre.
Debugging: consiste en ejecutar línea por línea el código viendo qué ocurre, qué valores toman
las variables.
Primeramente, hay que añadir un break point, pulsando al inicio de una línea, que sirve para
que el programa se ejecute de forma normal hasta llegar a la línea de código que tiene el break
point. Ahí se detendrá y esperará a que se le diga qué hacer.
Una vez establecido el break point, hay que pulsar el botón Debug ‘Main’, que permite ver el
valor de las variables sosteniendo el ratón sobre ellas, aunque también aparecen al lado de la
instrucción y en la zona inferior. La ejecución se detendrá al llegar al break point. Para que
continúe paso por paso hay que utilizar Step Over, que permite ejecutar la siguiente instrucción.
Cómo permitir que el usuario interactúe con nuestras aplicaciones Java usando la consola de
IntelliJ.
User interaction
Las aplicaciones están hechas para que el usuario interactúe con ellas: introduzca datos,
seleccione opciones, visualice resultados… Por esto, disponen de una interfaz gráfica, un
conjunto de elementos que ofrecen una información al usuario y permiten que actúe sobre ellos
usando dispositivos de entrada como ratón, teclado, pantalla táctil… Más adelante se verá cómo
crear interfaces gráficas para las aplicaciones Java, pero por ahora nos centraremos en una
interacción más simple con la consola de IntelliJ, que permite interactuar con el usuario de forma
básica.
Output
Página 32 de 65
• La instrucción System.out.print(“texto”);
• La instrucción System.out.println(“texto”);
Input
Para aprender cómo leer datos de la consola de IntelliJ usaremos una aplicación que solicita al
usuario que introduzca dos números y muestre el resultado de su suma en pantalla:
import java.util.Scanner;
Página 33 de 65
Análisis del código:
Página 34 de 65
Lectura de tipos de datos decimales desde teclado:
Scanner no dispone de ninguna instrucción que permita leer caracteres simples. Por tanto,
❌ char letter=input.nextChar();❌ no sería válido.
Página 35 de 65
Si nos equivocamos y no introducimos el tipo de dato esperado, por ejemplo, un número decimal
cuando se espera un número entero, el programa se detendrá y aparecerá en pantalla un
mensaje de error; esto es, se genera un error en tiempo de ejecución.
import java.util.Scanner;
Demo
Para leer datos de entrada se necesita la herramienta Scanner. Para ello, hay que declarar la
variable Scanner input=new Scanner(System.in); Como hay que importar la
herramienta, o bien se escribe literalmente la sentencia import java.util.Scanner; o bien
se pulsa sobre la palabra Scanner e IntelliJ dirá la combinación de teclas a utilizar para que
automáticamente se escriba la sentencia.
A continuación, hay que pedir al usuario que introduzca un número entero. Para esto se utiliza
la instrucción System.out.println("Introduce un número entero (y pulsa
Enter)");, seguidamente, hay que utilizar la variable input y dentro de esta la sentencia
nextInt();, que devuelve un valor entero que puede almacenarse en una variable, llamada
num. Quedaría así: int num=input.nextInt();
int num → Variable num de tipo int (tipo de dato entero más empleado). En ella se almacena
el valor entero de nextInt()
Página 36 de 65
Si no, printaríamos en pantalla lo siguiente: System.out.println(“Su doble es
“+(2*num));
import java.util.Scanner;
Si en lugar de introducir un número entero se introduce un decimal —como 2,5— (nótese que
se pone , y no . porque en la consola de IntelliJ los decimales se ponen con , y no con .), el
programa termina produciéndose un error en tiempo de ejecución. El problema estaría en esta
sentencia: int num=input.nextInt();, que hace que se espere un número entero. Si
necesitamos una aplicación que lea tanto números enteros como decimales, hay que cambiar el
tipo de lectura dato a nextFloat o nextDouble, quedando por ejemplo así: double
num=input.nextDouble();
Otra instrucción de lectura: input permite leer también cadenas de texto, no caracteres
simples. Vamos a practicar esta instrucción de lectura, quedando el código así:
import java.util.Scanner;
import java.util.Scanner;
Página 37 de 65
ICA0003-S02-C01-V01 IF statement
(https://lasallefponline.sallenet.org/mod/videofile/view.php?id=100853)
Sentencias condicionales
Es habitual que en un programa se tengan que tomar decisiones en base a unos valores de
entrada para dar unos valores de salida.
Programas que toman decisiones en base a una información dada → Sentencias de control. Los
programas han de tener sentencias de control que hagan que si se da una determinada
condición, entonces se produzca una determinada acción.
IF statement:
La sentencia if tiene la siguiente sintaxis: comienza con la palabra clave if, seguida de una
(condición), que es una variable booleana, y un bloque de código escrito entre llaves { },
que se ejecutará solo si la condición es true. La ejecución del programa continuará con las
sentencias de código que haya después.
Página 38 de 65
Este es el flowchart de una sentencia if. Se utiliza el símbolo decisión, un rombo , para
mostrar los bloques de código que se ejecutarán según el resultado de evaluar la condición.
La ejecución del código continúa después del cierre de llave }, mostrando el mensaje: Have a
Good day!
Página 39 de 65
Print output:
• Si la condición es false se muestra el mensaje It’s not that cold. Wear a t-shirt.
Continuará ejecutándose el código printándose el mensaje: Have a good day!, que está
fuera de las sentencias if else.
Página 40 de 65
Es posible anidar múltiples sentencias else if para considerar más alternativas:
Página 41 de 65
En este ejemplo de else if anidados, se ha añadido una alternativa para considerar
temperaturas altas, superiores a 25 grados:
Página 42 de 65
Variable scope
El ámbito de una variable, delimitado por dos llaves { }, es el bloque de código donde la variable
puede usarse.
Página 43 de 65
En el siguiente caso, la variable humedad se ha declarado dentro de la sentencia if, por lo que
su ámbito es este.
Si tratamos de usar una variable fuera de su ámbito, el programa dará error de compilación.
A tener en cuenta:
• No hay que olvidar las llaves { } en el bloque de código if, sobre todo si en el bloque
if tenemos más de una sentencia.
Página 44 de 65
ICA0003-S02-C01-V03 SWITCH statement
(https://lasallefponline.sallenet.org/mod/videofile/view.php?id=100855)
En Java, la sentencia switch trabaja con los tipos de datos primitivos byte, short, chart, int,
String, pero no admite tipos primitivos decimales, como float y double, ni tipos boolean.
Sentencia switch:
La sentencia switch consiste en múltiples casos. Cada caso comienza con la palabra clave
case, seguida del valor a comparar. Como en las sentencias if, cada case tiene asociado un
bloque de código. La sentencia switch determinará qué bloque de código de sus cláusulas
case se ejecutará. Es como un selector que asigna un código para cada valor posible que hay
que tratar.
Por tanto, switch significa «selecciona entre estas acciones en función de un valor».
Es posible definir un caso por defecto, que comienza con la palabra clave default y siempre
tiene que ser declarado al final, cubriendo todos los valores que no han sido especificados en
las cláusulas case anteriores.
Cada bloque de código asociado a una cláusula case o default debería terminar con la
sentencia break; que significa «rompe, sal de la sentencia switch y continúa ejecutando el
código que haya después». Así, se logra que se ejecute el bloque de código de solo una de las
cláusulas case, la que su valor mejor se acomode a la condición bajo test.
Página 45 de 65
public class Main {
public static void main(String args[]) {
int month=8;
String monthString;
switch (month) {
case 1: monthString="January"; break;
case 2: monthString="February"; break;
case 3: monthString="March"; break;
case 4: monthString="April"; break;
case 5: monthString="May"; break;
case 6: monthString="June"; break;
case 7: monthString="July"; break;
case 8: monthString="August"; break;
case 9: monthString="September"; break;
case 10: monthString="October"; break;
case 11: monthString="Novembre"; break;
case 12: monthString="December"; break;
default: monthString="Invalid month"; break;
}
System.out.println(monthString);
}
}
Print output:
August
En el código superior, se declara una variable month de tipo int cuyo valor representa un mes
del año. En la sentencia switch se evalúa la expresión entre paréntesis; es decir, el valor de la
variable month, que es 8. Inmediatamente, se ejecuta el conjunto de instrucciones asignadas a
este valor entre las diferentes cláusulas case. Se ejecuta el código de la cláusula case 8,
asignando el valor August a la variable monthString. Si no existiera ninguna cláusula case
con este valor, se ejecutaría el código de la cláusula default.
El bloque de código de la cláusula case 8 que se ejecuta se termina con la sentencia break,
que hace que se salga del bloque de código switch continuando con la ejecución del resto de
líneas del programa que, en este caso, permite mostrar el valor de la variable monthString,
que es August.
Página 46 de 65
¿Qué ocurre si se olvida terminar con break alguna de las sentencias case? Que se ejecutarán
los bloques de código de todas las cláusulas case que vayan después de la cláusula case que
cumpla la condición, hasta que se encuentre una sentencia break o se termine la sentencia
switch.
October
En el código superior, la cláusula case 8 es la que cumple con la condición del switch. Por
tanto, se ejecuta su código, asignando a la variable monthString el valor August. Pero al no
encontrar la sentencia break no se sale del bloque switch, ejecutándose el código de la
siguiente cláusula case, que actualiza el valor de monthString a September. Como la
cláusula 9 tampoco contiene la sentencia break, se ejecuta el código de la siguiente cláusula,
case 10, que actualiza nuevamente el valor de monthString a October. Esta cláusula sí
contiene la sentencia break, que hace que se salga del bloque switch y se ejecute el resto
del código del programa, mostrando por consola el valor de monthString, que es October.
En lugar de usar la sentencia switch, es posible usar sentencias if else anidadas. Aunque el
efecto es el mismo, la opción de usar if else anidadas complica la lectura de código.
Página 47 de 65
Entonces, ¿cuándo usar sentencias if o switch? Hay que basarse en facilitar la lectura y
mantenimiento del código y la condición bajo test:
• La sentencia switch permite testear los valores de tipos primitivos byte, short,
int, char y String.
Los bucles while comienzan con la palabra clave while seguida de una (condición).
Mientras la condición sea true, se ejecuta el bloque de código situado entre las llaves { }
una y otra vez. Cada ejecución es una iteración.
Dentro del bloque while se actualiza el valor de la condición, el valor de la variable on, que
hará que se salga del bucle. A esto se le denomina variable de control. En este caso, lo que está
dentro del bloque de código while se ejecuta una y otra vez porque la variable de control on
es true:
Página 48 de 65
En el siguiente código, lo que está dentro del bloque de código while solo se ejecuta una vez
porque la variable de control on es false.
Beep
while va más allá de evitarnos tener que escribir el mismo código N veces. También permite
crear aplicaciones que hagan uso de un contador, como es el caso de una tabla de multiplicar
(multiplica el número por un valor, que en cada paso se incrementa en 1):
1 x 5 = 5
2 x 5 = 10
3 x 5 = 15
4 x 5 = 20
5 x 5 = 25
6 x 5 = 30
[…]
10 x 5 = 50
Página 49 de 65
Flowchart de la aplicación:
Página 50 de 65
Mostrar las letras del abecedario:
Se declara un bucle while cuyo bloque de código tiene por objetivo printar los caracteres del
abecedario en mayúscula —System.out.println(letter);—, aunque previamente es
necesario convertir a char su valor entero —char letter=(char)letterIntValue;—.
¿Cuántas veces se tiene que ejecutar el bucle? Mientras que no se haya llegado a la Z; esto es,
mientras letterInValue sea menor o igual a 90 —while (letterIntValue<=90)—.
letterIntValue es variable de control, que debe actualizarse dentro del bloque de código
del bucle, incrementándose en una unidad en cada iteración —letterIntValue++;—.
Página 51 de 65
Juego: adivinar el número que se esconde en la caja misteriosa con tres intentos
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner input=new Scanner(System.in);
System.out.println("Welcome to: Whats inside the mistery box?");
int mysteryBoxNumber=5;
int count=3;
boolean win=false;
while (count>0&&!win) {
System.out.println("Please enter a number");
int num=input.nextInt();
input.nextLine();
count--;
if (num==mysteryBoxNumber) {
win=true;
}
}
if(win) {
System.out.println("You win");
}
else {
System.out.println("You lose. The value of the mysteriorus box
is "+mysteryBoxNumber);
}
}
}
Página 52 de 65
ICA0003-S03-C01-V03 DO-WHILE Loops
(https://lasallefponline.sallenet.org/mod/videofile/view.php?id=100863)
La sintaxis del bucle do-while comienza con la palabra clave do, seguida de un bloque de
código entre llaves { } y la palabra clave while, seguida de una (condición).
Nótese que primero se ejecuta el bloque de código do situado entre llaves { } antes de evaluar
la condición del bloque. Se continuará ejecutado el bloque de código del bucle mientras la
condición sea true.
Página 53 de 65
Programa que printa la tabla de multiplicar con while y con do-while:
En ambos casos hay una variable contador que se usa como variable de control en la
condición lógica del bucle, actualizando su valor en cada iteración.
Por ejemplo, supongamos un programa que pide al usuario que introduzca un valor entre 1 y
10. Mientras el usuario no respete esta condición, el programa pedirá que se cumpla.
Página 54 de 65
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner input=new Scanner(System.in);
int valorUsuario=0;
do {
System.out.println("Introduce un valor entero entre 1 y
10");
valorUsuario=input.nextInt();
input.nextLine();
} while ((valorUsuario<1)||(valorUsuario>10));
System.out.println("Correcto, has introducido "+valorUsuario);
}
}
Si no se cumple el requisito, porque el valor introducido es menor que 1 o mayor que 10,
la condición del bucle do-while es true, por lo que se itera de nuevo. Por ejemplo:
Página 55 de 65
Si se cumple el requisito, porque el valor introducido es mayor que 1 o menor que 10, la
condición del bucle do-while es false, por lo que se sale del bucle. Por ejemplo:
Página 56 de 65
ICA0003-S03-C01-V04 FOR Loops
(https://lasallefponline.sallenet.org/mod/videofile/view.php?id=100864)
Los bucles while y do-while son muy útiles cuando se quiere repetir un bloque de código
mientras una determinada condición es true. Pero a veces se necesita repetir un bloque de
código un número específico de veces. Por ejemplo, mostrar un mensaje 20 veces.
Pero Java dispone de otro tipo de bucle (for) que permite hacer de forma abreviada lo que
se ha hecho con un bucle while. for se utiliza cuando se tiene que repetir un código un
número de veces específico.
Página 57 de 65
loop counter scope
La variable i (loop counter), que controla cuántas iteraciones tendrá el bucle, puede usarse en
el bloque de código del bucle for. Por ejemplo, para mostrar el número de Beeps en cada
iteración:
El valor de loop counter cambia automáticamente en cada iteración. Pero hay que tener cuidado
de no modificar su valor dentro del código del bucle for. En el ejemplo siguiente, en cada
iteración se incrementa automáticamente el valor de i, pero a la vez se decrementa en el bloque
de código del bucle. Por tanto, es un bucle infinito. Para evitar esto, no hay que actualizar el
valor de la variable loop counter dentro del bucle for.
Página 58 de 65
Print output:
0
0
0
0
0
0
0
0
…
La variable loop counter i puede inicializarse a cualquier valor entero: 0, 1, 15, 200…, según los
requisitos del programa.
loop increment
En los bucles for puede contarse hacia abajo en lugar de hacia arriba.
Página 59 de 65
También puede establecerse otros tipos de incremento/decremento. En el ejemplo inferior, en
cada iteración se suma 2 al valor de la variable loop counter i.
El valor de la variable loop counter también puede variar más allá de la suma/resta. En el
ejemplo inferior, en cada iteración la variable i se incrementa multiplicando su valor por 5.
Página 60 de 65
ICA0003-S03-C01-V05 Nested Loops
(https://lasallefponline.sallenet.org/mod/videofile/view.php?id=100865)
Página 61 de 65
Por tanto, este bucle anidado funciona así:
• Por cada iteración del bucle externo, el bucle interno imprime la instrucción dos veces.
• Así, en la primera iteración del bucle externo, el bucle interno se ejecuta dos veces,
printando dos veces Hello world.
• Seguidamente, se produce la segunda iteración del bucle externo. De nuevo, el bucle
interno se ejecuta dos veces, printando dos veces Hello world.
• Consecuentemente, una vez finalizado el bucle externo, Hello world se ha impreso
cuatro veces.
Normalmente, se necesitan los bucles anidados cuando se requiere repetir varias veces un
bloque de código que ya de por sí precisa de un bucle.
Por ejemplo, un programa que no solo muestre la tabla de multiplicar de un número, sino que
muestre distintas tablas de multiplicar, tantas como indique el usuario. Habrá que repetir N
veces la tarea de mostrar una tabla que a su vez es la repetición de diez multiplicaciones.
El bucle for externo controla la repetición de mostrar las distintas tablas de multiplicar (la tabla
del 1, la tabla del 2, etc.):
Página 62 de 65
Juego de la caja misteriosa: se controla que el número introducido por el usuario esté en un
rango válido, del 1 al 10. Si no es así, se le vuelve a solicitar.
El bucle do-while interno controla que el valor introducido por el usuario esté dentro del
rango válido. Si no, se le vuelve a solicitar que introduzca un número.
Página 63 de 65
ICA0003-S03-C01-V06 BREAK and CONTINUE statements
(https://lasallefponline.sallenet.org/mod/videofile/view.php?id=100866)
Sentencias de control
Java, como otros lenguajes de programación, dispone de sentencias que permiten el control
directo sobre el comportamiento de las iteraciones de un bucle. Son las sentencias break y
continue.
break statement
La sentencia break se usa en la sentencia switch (switch, case, break). Indica salir, terminar.
Así, break interrumpe inmediatamente la iteración en curso del bucle, haciendo que se salga
de él.
Página 64 de 65
Sentencia break en un programa:
continue statement
Página 65 de 65