FullStack EGG 21 Guia Completa Del Curso

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 426

CURSO DE PROGRAMACIÓN FULL STACK

PROGRAMACIÓN. EGG +
GOBIERNO MENDOZA
TEMARIO:
PSEINT

Guía 1 • Saber que es concatenar, los tipos de datos, asignar valores a variables,
usar la funcionalidad leer y escribir

Guía 2 • Saber usar si, sino, si anidados y según


• Saber usar el bucle para, hacer mientras y repetir. Que reconozcan las
diferencias entre cada bucle

Guía 3 • Poder crear funciones o subprocesos y que poder llamarlos desde el


algoritmo principal
• Diferenciar entre pasaje por valor y referencia

Guía 4 • Crear y recorrer un arreglo


• Crear y recorrer una matriz
• Pasar un arreglo o matriz a una función o subproceso

JAVA
Java Intro • Conocer tipos de datos en java, diferencia entre dato primitivo y objeto,
conocer la clase Math y la clase String, funciones en java.

POO • Ser capaces de crear un Objeto con sus getter y setter


• Ser capaces de crear una clase destinada a la lógica, donde procesas
objetos

Colecciones • Aprender a usar ArrayList, pudiendo meter y sacar objetos.

Relaciones • Aprender a relacionar una clase con otra clase.


• Aprender a relacionar una clase con una lista de objetos.

Herencia e • Entender el concepto de herencia.


Interfaces

Excepciones • Saber atrapar errores con try and catch.

Integrador

MYSQL
Guia 1 • Aprender a hacer consultas con WHERE, ORDER BY y JOIN

JAVA + MYSQL

Guia JDBC • Entender el concepto de que hace JDBC


• Poder hacer la conexión desde NetBeans
• Cargar un dato desde java
• Realizar al menos una consulta

Guia JPA • Entender cómo opera el ORM (creación de tablas desde las Entities)
• Crear una entidad
• Poder guardar y consultar a la base de datos

GIT

Git • Poder crear, compartir un proyecto


• Saber usar Pull, Fetch y Push
• Saber mergear desde la página web de git

HTML

HTML • Conocer las etiquetas básicas de HTML

CSS • Saber dar estilos desde un archivo externo

Bootstrap • Saber usar e implementar en los proyectos bootstrap

SPRING

Guía Spring • Conocer lo que hace el POM


• Conocer lo que hace application.yml o properties
• Saber que es una Entidad
• Saber qué hace un ORM
• Conocer las relaciones OneToOne, OneToMany, ManyToOne y
ManyToMany
• Saber configurar un Login
• Saber hacer un Controller, Service y Repository
• Saber usar Thymeleaf para traer o poner un dato en el template.
Examen Final
CURSO DE PROGRAMACIÓN FULL STACK

Introducción a la
Programación con
PSeInt
Guía de Programación con PSeInt
Programación
La programación es el acto de programar, es decir, organizar una secuencia de pasos
ordenados a seguir para hacer cierta cosa. Este término puede utilizarse en
muchos contextos. Por ejemplo, programar una salida con amigos, organizar unas
vacaciones, etc.
En la informática el termino programación se refiere a la acción de crear programas y
programar es la serie de instrucciones, que le vamos a dar a nuestra maquina, para lograr
lo que nuestro programa necesite para funcionar.
Las partes que componen a nuestro programa son el lenguaje de programación y los
algoritmos.

Lenguaje de Programación
Es un lenguaje formal que, mediante una serie de instrucciones, le permite a un programador
escribir un conjunto de órdenes, acciones consecutivas, datos y algoritmos para, de esa
forma, resolver problemas para crear programas que controlen el comportamiento físico y
lógico de una máquina.
Las instrucciones que sigue la computadora para la creación de programas están escritas
en un lenguaje de programación y luego son traducidas a un lenguaje de máquina que
puede ser interpretado y ejecutado por el hardware del equipo.

Hay distintos tipos de lenguajes de programación:

• Lenguaje maquina: Es el más primitivo de los lenguajes y es una colección de dígitos


binarios o bits (0 y 1) que la computadora lee e interpreta y son los únicos idiomas
que las computadoras entienden. Ejemplo: 10110000 01100001

• Lenguajes de alto nivel: Tienen como objetivo facilitar el trabajo del programador, ya
que utilizan unas instrucciones más fáciles de entender.
Además, el lenguaje de alto nivel permite escribir códigos mediante idiomas que
conocemos (español, inglés, etc.) y luego, para ser ejecutados, se traduce al lenguaje
máquina mediante traductores o compiladores.

Algoritmo
Entonces, los lenguajes de programación son nuestro puente para poder comunicarnos con
la maquina. Y de esa forma darle instrucciones claras, para poder solucionar los problemas
que puede presentar la creacion de un programa.

1
Estas instrucciones que le vamos a dar un nuestro programa, se conocen como algoritmos.
Un algoritmo es un método para darle instrucciones a nuestro programa y resolver un
problema.

Este consiste en la realización de un conjunto de pasos lógicamente ordenados tal que,


partiendo de información que le demos, permite obtener ciertos resultados que conforman
la solución del problema.

Los algoritmos son independientes tanto del lenguaje de programación en que se expresan
como de la computadora que los ejecuta. En cada problema el algoritmo se puede expresar
en un lenguaje diferente de programación y ejecutarse en una computadora distinta; sin
embargo, el algoritmo será siempre el mismo. Así, por ejemplo, en una analogía con la vida
diaria, una receta de un plato de cocina se puede expresar en español, inglés o francés, pero
cualquiera que sea el lenguaje, los pasos para la elaboración del plato se realizarán sin
importar el idioma del cocinero.

Los algoritmos son más importantes que los lenguajes de programación o las
computadoras. Un lenguaje de programación es tan sólo un medio para expresar un
algoritmo y una computadora es sólo un procesador para ejecutarlo. Tanto el lenguaje de
programación como la computadora son los medios para obtener un fin: conseguir que el
algoritmo se ejecute y se efectúe el proceso correspondiente.

CARACTERÍSTICAS DE LOS ALGORITMOS


Las características fundamentales que debe cumplir todo algoritmo son:

• Un algoritmo debe ser preciso e indicar el orden de realización de cada paso.

• Un algoritmo debe estar específicamente definido. Es decir, si se ejecuta un mismo


algoritmo dos veces, con los mismos datos de entrada, se debe obtener el mismo
resultado cada vez.

• Un algoritmo debe ser finito. Si se sigue un algoritmo, se debe terminar en algún


momento; o sea, debe tener un número finito de pasos. Debe tener un inicio y un final.

• Un algoritmo debe ser correcto: el resultado del algoritmo debe ser el resultado
esperado.

• Un algoritmo es independiente tanto del lenguaje de programación en el que se expresa


como de la computadora que lo ejecuta.

El programador debe constantemente resolver problemas de manera algorítmica, lo que


significa plantear el problema de forma tal que queden indicados los pasos necesarios para
obtener los resultados pedidos, a partir de los datos conocidos. Lo anterior implica que un
algoritmo básicamente consta de tres elementos: Datos de Entrada o Información de
entrada, Procesos y la Información de Salida.

2
Estructura de un Programa: Datos de entrada, proceso y Salida.

Programa
Entonces para resumir, un programa no es mas que una serie de algoritmos escritos en
algún lenguaje de programación de computadoras. Un programa es, por lo tanto, un
conjunto de instrucciones —órdenes dadas a la computadora— que producirán la ejecución
de una determinada tarea. En esencia, un programa es un medio para conseguir un fin. El fin
será probablemente definido como la información necesaria para solucionar un problema.

IDE
Nuestro programa va a ser escrito en un IDE (.Entorno de Desarrolllo Integrado). Un ide es
una aplicación informatica, como es el word, en donde vamos a poder escribir algoritmos y
crear programas con un lenguaje de programacion. Este ide, va a proveernos de muchas
faciliades para lograr nuestro cometido, desde ayudas, hasta correcciones de codigo para
evitar errores.

Entonces, basicamente, el ide es la herramienta que vamos a utilizar para escribir nuestro
programa, con el que nos vamos a comunicar con la computadora, además, el ide va a
cambiar dependiendo del lenguaje con el que querramos trabajar.

DISEÑO DEL PROGRAMA


Se puede utilizar algunas de las herramientas de representación de algoritmos, también
conocidos como lenguajes de programación, para definir la secuencia de pasos que se
deben llevar a cabo para conseguir el resultado que necesitamos. El lenguaje de
programación que utilizaremos en esta parte de curso, para representar nuestros algoritmos
es el pseudocódigo.

El pseudocódigo es una herramienta de programación en la que las instrucciones se


escriben en palabras similares al inglés o español, que facilitan tanto la escritura como la
lectura de programas. En esencia, el pseudocódigo se puede definir como un lenguaje de
especificaciones de algoritmos. El uso de tal lenguaje hace el paso de codificación final
(esto es, la traducción a un lenguaje de programación) relativamente fácil. El pseudocódigo
se considera un primer borrador, dado que tiene que traducirse posteriormente a un
lenguaje de programación.

3
ESPECIFICACIONES DE UN PROGRAMA
Tras la decisión de desarrollar un programa, el programador debe establecer el conjunto de
especificaciones que debe contener el programa: entrada, salida y algoritmos de resolución,
que incluirán las técnicas para obtener las salidas a partir de las entradas.

Un programa puede ser lineal (secuencial) o no lineal. Un programa es lineal si las


instrucciones (acciones) se ejecutan secuencialmente como los ejercicios propuestos en
esta guía, es decir, sin bifurcaciones, decisión ni comparaciones.

Estructura de un programa secuencial

CODIFICACIÓN
Una vez que tenemos las especificaciones de un programa pasaremos a la codificación del
programa. La codificación es la operación de escribir la solución del problema (de acuerdo
a la lógica del pseudocódigo), en una serie de instrucciones detalladas, en un código
reconocible por la computadora. La serie de instrucciones detalladas se conoce como
código fuente, el cual se escribe en un lenguaje de programación o lenguaje de alto nivel.

PRUEBA Y DEPURACIÓN
Hay veces que necesitamos comprobar si nuestro algoritmo realiza lo necesario, para esto
usaremos la prueba de escritorio. Se denomina prueba de escritorio a la comprobación que
se hace de un algoritmo para saber si está bien realizado. Esta prueba consiste en tomar
datos específicos como datos de entrada y durante la codificación, seguir la secuencia
indicada en el algoritmo hasta obtener un resultado, el análisis de estos resultados indicara
si el algoritmo esta correcto o si por el contrario hay necesidad de corregirlo o hacerle
ajustes.

4
Escritura de Algoritmos/Programas
Ya sabemos que es un programa, el diseño de un programa, las especificaciones de un
programa, su codificación y su depuración. Ahora vamos a ver como es la escritura de estos
algoritmos / programas. Un algoritmo constará de dos componentes: una cabecera de
programa y un bloque algoritmo. La cabecera de programa es una acción simple que
comienza con la palabra algoritmo. Esta palabra estará seguida por el nombre asignado al
programa completo.

El bloque algoritmo es el resto del programa y consta de dos componentes o secciones: las
acciones de declaración y las acciones ejecutables.

Las declaraciones definen o declaran las variables que tengan nombres. Las acciones
ejecutables son las acciones que posteriormente deberá realizar la computación cuando el
algoritmo convertido en programa se ejecute.

algoritmo
cabecera del programa
sección de declaración
sección de acciones

CABECERA DEL PROGRAMA


Todos los algoritmos y programas deben comenzar con una cabecera en la que se exprese
el identificador o nombre correspondiente con la palabra reservada que señale el lenguaje.
En PSeInt, la palabra reservada es Algoritmo.

Algoritmo sin_titulo
<Acciones>
FinAlgoritmo

Donde la palabra sin_titulo debe ser reemplazada por el nombre del algoritmo.

Tipos de Instrucciones
Las instrucciones —acciones— básicas que se pueden implementar de modo general en un
algoritmo y que esencialmente soportan todos los lenguajes son las siguientes:

✓ Instrucciones de inicio/fin, son utilizadas para delimitar bloques de código.

✓ Instrucciones de asignación, se utilizan para asignar el resultado de la evaluación de una


expresión a una variable. El valor (dato) que se obtiene al evaluar la expresión es
almacenado en la variable que se indique.
<nombre de la variable> ← <expresión>
expresión es igual a una expresión matemática o lógica, a una variable o constante.

5
✓ Instrucciones de lectura, se utilizan para leer datos de un dispositivo de entrada y se
asignan a las variables.

✓ Instrucciones de escritura, se utilizan para escribir o mostrar mensajes o contenidos de


las variables en un dispositivo de salida.

✓ Instrucciones de bifurcación, mediante estas instrucciones el desarrollo lineal de un


programa se interrumpe. Las bifurcaciones o al flujo de un programa puede ser según el
punto del programa en el que se ejecuta la instrucción hacia adelante o hacia atrás.

Elementos de un programa
Los elementos de un programa, son básicamente, los componentes que conforman las
instrucciones previamente mencionadas, para crear nuestro programa y resolver sus
problemas. Estos elementos siempre estarán dentro de un algoritmo.
Los elementos de un programa son: identificadores, variables, constantes, operadores,
palabras reservadas.

Palabras reservadas
Palabras que dentro del lenguaje significan la ejecución de una instrucción determinada, por
lo que no pueden ser utilizadas con otro fin. En Pseudocodigo, las palabras reservas
aparecen de color azul. Por ejemplo la palabra Algoritmo y FinAlgoritmo.

Identificadores
Un identificador es un conjunto de caracteres alfanuméricos de cualquier longitud que sirve
para identificar las entidades del programa (nombre del programa, nombres de variables,
constantes, subprogramas, etc.). En PseInt los identificadores deben constar sólo de letras,
números y/o guión_bajo (_), comenzando siempre con una letra y se suelen escribir siempre
en minúsculas. Estos tampoco pueden contar de tildes, ni de la letra Ñ, ya que generaría
errores.

Variables y Constantes
Los programas de computadora necesitan información para la resolución de problemas.
Está información puede ser un numero, un nombre, etc. Para nosotros poder guardar esta
información en algún lugar y que no este “suelta”, para no perderla o poder acceder a ella
cuando lo necesitemos es crucial. Para solucionar esto, vamos a guardar la información en
algo llamado, variables y constantes. Las variables y constantes vendrían a ser como
pequeñas cajas, que guardan algo en su interior, en este caso información. Estas, van a
contar como previamente habíamos mencionado, con un identificador, un nombre que
facilitara distinguir unas de otras y nos ayudara a saber que variable o constante es la
contiene la información que necesitamos.

6
Dentro de toda la información que vamos a manejar, a veces, necesitaremos información
que no cambie. Tales valores son las constantes. De igual forma, existen otros valores que
necesitaremos que cambien durante la ejecución del programa; esas van a ser nuestras
variables.

Una variable es un objeto o tipo de datos cuyo valor puede cambiar durante el desarrollo
del algoritmo o ejecución del programa. Dependiendo del lenguaje, hay diferentes tipos de
variables, tales como enteras, reales, carácter, lógicas y de cadena. Una variable que es de
un cierto tipo puede tomar únicamente valores de ese tipo. Una variable de carácter, por
ejemplo, puede tomar como valor sólo caracteres, mientras que una variable entera puede
tomar sólo valores enteros. Ejemplo: una variable que guardará el resultado de un calculo,
ese valor puede cambiar, en alguna parte de nuestro programa.

Una constante es un dato, que al igual que la variable, puede ser de diferentes tipos como
enteras, reales, carácter, lógicas y de cadena. Estas, también guardan solo valores de ese
tipo, pero, permanecen sin cambios durante todo el desarrollo del algoritmo o durante la
ejecución del programa. Ejemplo: el valor de Pi

TIPOS DE DATOS EN PSEINT


Las variables y constantes como previamente habíamos mencionado, van a guardar
información dependiendo del tipo de dato que le digamos que guarde ese variable. Por
ejemplo, si digo que mi variable va a guardar números enteros, significa que el tipo de dato
de esa variable es entero.

Los tipos de datos que podemos usar son:

✓ Entero: solo números enteros.

✓ Real: números con cifras decimales. Para separar decimales se utiliza el punto. Ejemplo:
3.14

✓ Carácter: cuando queremos guardar un carácter. Caracteres se encierran entre comillas


simples. un carácter (unidimensional): ‘a’, 'A'.

✓ Lógico: cuando necesitamos guardar una expresión lógica (verdadero o falso)

✓ Cadena: cuando queremos guardar cadenas de caracteres. Cadenas se encierran entre


comillas dobles. una cadena (multidimensional): “esto es una cadena”, "hola mundo"

Notas:

✓ Cadena y Carácter son términos equivalentes, no genera error que las escribamos
indistintamente.

✓ El plural de Carácter es Caracteres o Cadena

7
CREACION DE VARIABLES
A la hora de crear nuestra variable, vamos a tener que darle un identificador y el tipo de dato
que necesitamos que guarde. Para esto vamos a utilizar la palabra reservada Definir. La
instrucción definir permite explicitar el tipo de una o más variables. Después de la palabra
Definir, va el nombre de la variable y por el ultimo el tipo de dato de la variable. Normalmente
los identificadores de las variables y de las constantes con nombre deben ser declaradas
en los programas antes de ser utilizadas. Entonces, la sintaxis de la declaración de una
variable suele ser:

Definir <nombre_variable> como <tipo_de_dato>

Ejemplo de declaración de variables:

Si queremos declarar una variable de tipo entero se escribe:

Definir varNumero Como Entero


varNumero se convierte en una variable de tipo entero.

SECCIÓN DE ACCIONES
En esta sección se describe paso a paso cada una de las instrucciones que llevará a cabo
el algoritmo/programa para obtener una solución a un determinado problema.
Recordemos que los tipos de instrucciones eran: Instrucciones de inicio/fin - Instrucciones
de asignación - Instrucciones de lectura - Instrucciones de escritura

PRIMITIVAS SECUENCIALES (COMANDOS DE ENTRADA, PROCESO Y SALIDA)


✓ Asignación (Proceso).
✓ Lectura (Entrada).
✓ Escritura (Salida).

Asignación o proceso
La instrucción de asignación permite almacenar un valor en una variable (previamente
definida). Esta es nuestra manera de guardar información en una variable, para utilizar ese
valor en otro momento. Se puede realizar de dos maneras:

<variable> <- <expresión>


<variable> = <expresión>

Al ejecutarse la asignación, primero se evalúa la expresión de la derecha y luego se asigna


el resultado a la variable de la izquierda. El tipo de la variable y el de la expresión deben
coincidir.

8
Ejemplo de asignación:

En este ejemplo estamos definiendo una variable como entero y después asignándole un
valor, en este caso el numero 4.

Entrada y Salida de Información


Los cálculos que realizan las computadoras requieren, para ser útiles la entrada de los datos
necesarios para ejecutar las operaciones que posteriormente se convertirán en resultados,
es decir, salida.

Las operaciones de entrada permiten leer determinados valores y asignarlos a


determinadas variables.

Esta entrada se conoce como operación de lectura (leer). Los datos de entrada se
introducen al procesador mediante dispositivos de entrada (teclado, tarjetas perforadas,
unidades de disco, etc.). La salida puede aparecer en un dispositivo de salida (pantalla,
impresora, etc.). La operación de salida se denomina escritura (escribir). En la escritura de
algoritmos las acciones de lectura y escritura se representan por los formatos siguientes:

leer (lista de variables de entrada)


escribir (lista de variables de salida)

Lectura o entrada
La instrucción Leer permite ingresar información por teclado al usuario a través de la interfaz
grafica o ambiente de Pseint. Que se mostrará al correr nuestro algoritmo

Leer <variablel>, <variable2>, ..., <variableN>

Esta instrucción lee los N valores que escribamos por teclado, desde la interfaz grafica o
ambiente, y los asigna a las N variables mencionadas. Pueden incluirse una o más variables,
por lo tanto, el comando leerá uno o más valores.

Ejemplo de Leer en Pseint. A la izquierda está el algoritmo y a la derecha la interfaz grafica:

9
En este ejemplo definimos una variable de tipo entero llamada num y le asignamos un valor
a través de la instrucción Leer.

Escritura o salida
La instrucción Escribir permite mostrar información y valores de variables en la interfaz
grafica o ambiente.

Escribir <exprl> , <expr2> , ... , <exprN>

Esta instrucción imprime en la interfaz grafica o ambiente (en este caso en la pantalla) los
valores obtenidos de evaluar N expresiones, el valor de un variable o de un mensaje. Dado
que puede incluir una o más expresiones, mostrará uno o más valores.

Ejemplo de Escribir. A la izquierda está el algoritmo y a la derecha la interfaz grafica:

En este ejemplo de escribir, vemos que nuestro primer escribir muestra un mensaje o
cadena, que va entre comillas dobles, después nuestro segundo escribir muestra el
resultado de una suma de dos números y nuestro último escribir, muestra el valor de una
variable de tipo entero a la que se le asignó un valor previo.
Con el escribir también podemos mostrar variables o valores con un mensaje previo, para
esto vamos a concatenar nuestra variable, usando una coma o un espacio en blanco, con un
mensaje entre comillas.

Ejemplo:

Escribir “Mensaje entre comillas” variable


Escribir “La suma de los números es:” suma

10
OPERADORES
Este pseudolenguaje dispone de un conjunto básico de operadores que pueden ser
utilizados para la construcción de expresiones más o menos complejas.

OPERADORES RELACIONALES
Los operadores relacionales son símbolos que se usan para comparar dos valores. Si el
resultado de la comparación es correcto la expresión considerada es verdadera, en caso
contrario es falsa.

Operador Significado Ejemplo


Relacionales
> Mayor que 3 > 2 // verdadero
< Menor que 1 < 5 // verdadero
= Igual que 4 = 4 // verdadero
>= Mayor o igual que 4 >= 5 // falso
<= Menor o igual que ‘a’ <= ‘b’ // verdadero
<> Distinto que 10 <> 8 // verdadero

Operadores Lógicos

Estos se utilizan cuando necesitamos las expresiones lógicas con múltiples variantes y nos
proporcionan un resultado a partir de que se cumpla o no una cierta condición, estos
producen un resultado lógico, y sus operadores son también valores lógicos o asimilables
a ellos.

Operador Significado Ejemplo


Lógicos
Y Conjunción (2 < 4 Y 3 > 5) // falso
O Disyunción (7 <= 8 O 10 >= 9) // verdadero
NO / no Negación no(1 = 1) // falso

Operador Y

Devuelve un valor lógico verdadero si ambas expresiones son verdaderas. En caso


contrario el resultado es falso.

11
Operador O

Este operador devuelve verdadero si alguno de las expresiones es verdadera. En caso


contrario devuelve falso.

Operador NO

Este operador cambia la devolución de un expresión, al caso contrario. Si es verdadero lo


hace falso y si es falso lo hace verdadero.

A la hora de trabajar con operadores lógicos, para saber si una expresión lógica nos
devuelve como resultado Verdadero o Falso, debemos observar la siguiente tabla de la
verdad:

Operadores Algebraicos

Los operadores algebraicos o también conocidos como operadores aritméticos. Realizan


operaciones aritméticas básicas: suma, resta, multiplicación, división, potenciación y
modulo para datos de tipo numérico tanto enteros como reales. Estas operaciones son
binarias porque admiten dos operandos.

12
Operador Significado Resultado
Algebraicos
+ Suma suma = 2 + 2
- Resta resta = 10 - 4
* Multiplicación multiplicación = 10 * 2
/ División división = 9 / 3
^ Potenciación potencia = 10 ^ 2
Módulo (resto de la división
% o MOD resto = 4 % 2
entera)

Reglas de prioridad:

Las expresiones que tienen dos o más operadores requieren unas reglas matemáticas que
permitan determinar el orden de las operaciones, se denominan reglas de prioridad y son:

1. Las operaciones que están encerradas entre paréntesis se evalúan primero. Si existen
diferentes paréntesis anidados (interiores unos a otros), las expresiones más internas se
evalúan primero.

2. Las operaciones aritméticas dentro de una expresión suelen seguir el siguiente orden
de prioridad:

✓ operador ( )
✓ operadores unitarios (potenciación),
✓ operadores *, /, % (producto, división, módulo) ✓ operadores +, – (suma y resta).

3. Las operaciones lógicas dentro de una expresión suelen seguir el siguiente orden de
prioridad:

✓ operador ( )
✓ operador negación NO
✓ operador conjunción Y
✓ operador disyunción O

En caso de coincidir varios operadores de igual prioridad en una expresión o sub


expresión encerrada entre paréntesis, el orden de prioridad en este caso es de izquierda a
derecha, y a esta propiedad se denomina asociatividad.

13
Preguntas de Aprendizaje
1) Los dispositivos de entrada permiten:
a) Guardar datos en la computadora
b) Desplegar información almacenada en el equipo
c) Ingresar datos a la computadora
d) Ninguna de las anteriores

2) Los dispositivos de salida permiten:


a) Guardar datos en la computadora
b) Desplegar información almacenada en el equipo
c) Ingresar datos a la computadora
d) Ninguna de las anteriores

3) ¿Qué es un algoritmo?
a) Un conjunto de instrucciones o reglas bien definidas, ordenadas y finitas que
permiten realizar una actividad mediante pasos sucesivos que no generen dudas a
quien deba realizar dicha actividad
b) Es una igualdad entre dos expresiones algebraicas, denominadas miembros, en las
que aparecen valores conocidos o datos, y desconocidos o incógnitas, relacionados
mediante operaciones
c) Es una relación de variables que pueden ser cuantificadas para calcular el valor de
otras de muy difícil o imposible cálculo y que suministra una solución para un
problema
d) Ninguna de las anteriores

4) La prueba de escritorio se usa para:


a) Programar órdenes
b) Verificar si el algoritmo es correcto
c) Eliminar virus informáticos
d) Todas las anteriores

5) Una variable es
a) Un lugar de almacenamiento, cuyo contenido podrá variar durante el proceso y
finalmente se obtendrán los resultados con los datos contenidos en ellas
b) Un lugar de almacenamiento, cuyo contenido no varía durante el proceso y
finalmente se obtendrán los resultados con los datos contenidos en ellas
c) Una palabra reservada del lenguaje de programación
d) Ninguna de las anteriores

14
6) La ejecución de la siguiente sentencia de asignación: A = “4.5”
a) A debe ser una variable de tipo real
b) A debe ser una variable de tipo entero
c) A debe ser una variable de tipo cadena
d) A puede ser tanto una variable de tipo real como de tipo cadena

7) Entero, carácter, lógico y real son:


a) Funciones de acceso a datos
b) Instrucciones de acceso a datos
c) Sentencias de control
d) Tipos de datos

8) Un operador es
a) Un lugar de almacenamiento de datos
b) Un símbolo especial que indica al compilador que se debe realizar una operación
matemática o lógica
c) Una variable
d) Ninguna de las anteriores

9) Los operadores relacionales se usan en:


a) Operaciones de comparación
b) Operaciones de suma y resta
c) Operaciones de multiplicación y división
d) Ninguna de las anteriores

10) Una estructura secuencial es aquella que ejecuta:


a) Una evaluación de una expresión y, dependiendo del resultado, se decide la
siguiente sentencia a ejecutar
b) Una sentencia detrás de otra
c) Una repetición de un bloque de sentencias mientras sea verdadera una determinada
condición
d) Ninguna de las anteriores

11) La instrucción leer base,altura permite:


a) Almacenar los datos ingresados por el usuario en algún lugar de la computadora
b) Almacenar los datos ingresados por el teclado en las variables base y altura
c) Almacenar tres datos ingresados por teclado en las variables leer, base y altura
d) Ninguna de las anteriores

15
12) La instrucción escribir "Ingrese 25 números enteros" permite:
a) Visualizar en pantalla el mensaje entre comillas
b) Guardar en la variable pantalla los datos ingresados por teclado
c) Verificar si el algoritmo está bien hecho
d) Ninguna de las anteriores

13) Seleccione la expresión que da como resultado el valor lógico falso.


a) (4 >= 40 y 8 <= 10) o (2 < 20 o 10 > 100)
b) (8 >= 10 o 4 <= 8) y (3 <> 10 y 10 >= 4)
c) (8 >= 4 y 8 >= 10) o (5 = 5 y 4 < 8)
d) (4 > 4 o 10 >= 8) y (2 > 5 o 8 < 4)

14) Seleccione la expresión que da como resultado el valor lógico verdadero.


a) (50 > 49 y 7 = 5) o (15 <= 14 o 10 > 100)
b) (6 <> 6 o 4 = 5) y (10 > 9 y 20 <= 20)
c) no(no(10 >= 8) y 1 > 3) o (2 <> 3 y 2 < 8)
d) (4 > 2 o 7 > 6) y no(3 < 6 o 2 > 0)

15) Si a = verdadero y b = falso, la expresión no (no (a o b) y no (a)) toma el mismo


resultado que:
a) a y b
b) no (a o no b)
c) b o (a y b)
d) no (no a o b) o no b

16
Ejercicios de aprendizaje
Primero tenemos que tener descargado Pseint, para descargalo haga click aquí:
http://pseint.sourceforge.net/?page=descargas.php.

PSeInt permite personalizar algunos aspectos del lenguaje a través de la configuración de


diferentes perfiles. En este curso utilizaremos el perfil “Perfil_EggTech_PseInt” que se
encuentra en el Drive. Para agregar el perfil se debe ingresar al menú “Configurar-
>Opciones del Lenguaje (Perfiles)” y seleccionar la opción “Personalizar”. Esta opción abrirá
una nueva ventana a través de la cual en la parte inferior (ícono de una carpeta) podrá
seleccionar el archivo y cargarlo en PSeInt. Una vez cargado el perfil se selecciona la
opción “Aceptar” y posteriormente ya se podrá comenzar a programar.

Pero antes de empezar, recomendamos leer este breve inciso sobre como encararemos la
resolución de los siguientes ejercicios / programas.

PASOS PARA LA CONSTRUCCIÓN DE UN PROGRAMA

El proceso de programación es un proceso de solución de problemas en el cual deben


llevarse a cabo los pasos descritos a continuación.

¿ CÓMO VAMOS A ENCARAR ESTOS PROBLEMAS ?

Para poder resolver problemas vamos a tener que ejecutar una serie de pasos que nos van
a ayudar a resolver el problema sin importar que tan grande o chico sea.

Los pasos serían:

1. Lectura

Leer el problema o la consigna dos veces, la primera para entender de manera general lo
que debemos hacer y una segunda vez para entender el problema de manera más
concreta y evitar saltarnos algún dato importante.

2. Papel y lapiz

Una vez que tenemos una idea clara de lo que debemos hacer, vamos a dejarlo por
escrito, para esto lo mejor es usar papel y lápiz. Vamos a dejar por escrito que debemos
realizar. Utilizamos la misma noción que cuando lo leímos, escribimos un esbozo general y
luego un esbozo particular.

3. Subproblemas

Cuando estemos haciendo el esbozo particular, pensamos en el concepto divide y


vencerás. Pensamos el problema que tenemos y lo dividimos en subproblemas. Un
ejemplo sería hacer pan. Hacer pan es un problema que lo podemos dividir en
subproblemas. Mezclar la harina con la levadura, amasar el pan, dejarlo levar, etc.

17
Básicamente, tomamos un problema grande y general para convertirlo en pequeños
problemas más concretos y fáciles de afrontar.

4. Herramientas del codigo

En el siguiente paso, empezamos a pensar en código, antes estábamos tomando un


problema de programación y resolviendolo como si fuera un problema como hacer pan.
Ahora vamos a tener que tomar esos subproblemas que habíamos creado y ver que
herramientas de programación vamos a necesitar. Esto puede ser variables, constantes,
bucles, condicionales, expresiones lógicas o matemáticas, etc. Cualquier herramienta que
creamos necesaria para lograr nuestro cometido.

5. Pasaje a codigo

Y por último, tomando todo lo que hicimos, lo pasaremos a código. Es importante que
cuando empecemos a escribir el código y empecemos a trasladar los subproblemas a
código, ir probando que cada subproblema funcione, o cumpla con el resultado esperado.
Para facilitar este proceso Pseint, nos presenta la herramienta de ejecutar el código Paso a
Paso y la prueba de escritorio.

EJEMPLO DE RESOLUCIÓN DE PROBLEMAS

Teniendo en cuenta que ya leimos el problema y lo pasamos a papel y lapiz. Lo que


hariamos con el siguiente problema seria esto:

Leer el radio de un circunferencia y calcular e imprimir su superficie y su circunferencia.

Se puede dividir en tres subproblemas más sencillos:

• Leer Radio
• Calcular Superficie : PI * radio ^ 2
• Calcular Longitud : 2 * PI * radio
• Escribir resultados

Herramientas necesarias para hacer estos subproblemas:

• Variables: radio, superficie, longitud.


• Constantes: PI
• Funciones: Leer – Escribir - Definir
• Expresiones: Multiplicar - Potencia

Traslado de los subproblemas a codigo:

• Definir radio, superficie, longitud como entero


• Leer radio
• superficie = PI * radio ^ 2
• longitud = 2 * PI * radio
• Escribir radio, longitud, superficie

18
¿ ME BLOQUEE EN CUANTO A CODIGO ?

• Si hay errores rojos!!! Leer la descripción del error y la línea donde esta el error.
• Indentar el código, para tenerlo bien ordenado. Para identar, tenemos que
seleccionar todo el codigo, hacer click derecho y click izquierdo en identar.
• El código hace lo que quiero que haga? En caso que no, correr el código paso a
paso y hacer prueba de escritorio.

NO PUEDO EMPEZAR EL EJERCICIO E HICE TODO LO ANTERIOR

• Primero consulto a mis compañeros como ellos encararon el ejercicio. Les pido
que me expliquen en vez de mostrarme lo que hicieron.
• También puedes orientarte en cómo ir resolviendo los subproblemas en internet, es
muy difícil encontrar la solución puntual, pero puedes orientarte en buscar parte de
la solución
• Si no lo saben tus compañeros ni lo encontraste en internet, consultale al o la profe
de como se debería encarar la solución. El o la profe te dará las herramientas
necesarias para resolverlo. En el caso de que después de la explicación del profe,
seguis sin entender, plantea que parte no entendiste.

Reglas de oro:

• Preguntar TODO. No tengamos miedo a preguntar, pensar que los demas tambien
se benefician de nuestra duda y que el otro va a estar dispuesto a ayudarnos.

• Leer TODA la teoría.

• Ver TODOS los videos.

• Participar en TODOS los debates.

• Tener paciencia y entender que con el tiempo y con practica, iremos aprendiendo
que necesitamos para resolver estos problemas de manera más sencilla.

• Divertirse, ver los problemas como un desafio y no como algo que si no lo


podemos lograr, nos haces más o menos inteligentes. Recordemos que esto es un
proceso de aprendizaje y que no todos aprendemos al mismo tiempo.

VER VIDEO: Mi Primer Programa

1. Escribir un algoritmo en el cual se consulte al usuario que ingrese ¿cómo está el día de
hoy? (soleado, nublado, lloviendo). A continuación, mostrar por pantalla un mensaje que
indique “El día de hoy está …”, completando el mensaje con el dato que ingresó el
usuario.

19
VER VIDEO: Trabajando con Datos

2. Conocido el número en matemática PI π, pedir al usuario que ingrese el valor del radio
de una circunferencia y calcular y mostrar por pantalla el área y perímetro. Recuerde que
para calcular el área y el perímetro se utilizan las siguientes fórmulas:

area = PI * radio2
perimetro = 2 * PI * radio

3. Escribir un programa que calcule el precio promedio de un producto. El precio promedio


se debe calcular a partir del precio del mismo producto en tres establecimientos
distintos.

4. A partir de una conocida cantidad de metros que el usuario ingresa a través del teclado
se debe obtener su equivalente en centímetros, en milímetros y en pulgadas.
Ayuda: 1 pulgada equivale a 2.54 centímetros.

5. Escribir un programa que calcule cuántos litros de combustible consumió un automóvil.


El usuario ingresase una cantidad de litros de combustible cargados en la estación y
una cantidad de kilómetros recorridos, después, el programa calculará el consumo
(km/lt) y se lo mostrará al usuario.

6. Escriba un programa que permita al usuario ingresar el valor de dos variables numéricas
de tipo entero. Posteriormente, el programa debe intercambiar los valores de ambas
variables y mostrar el resultado final por pantalla.
Por ejemplo, si el usuario ingresa los valores num1 = 9 y num2 = 3, la salida a del
programa deberá mostrar: num1 = 3 y num2 = 9

Ayuda: Para intercambiar los valores de dos variables se debe utilizar una variable
auxiliar.

7. Escriba un programa que lea dos números enteros y realice el cálculo de la suma, resta,
multiplicación y división entre ambos valores. Los resultados deben mostrarse por
pantalla.

20
Material Extra
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos pueden
realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que venimos
trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas, podes
continuar con estos ejercicios extra, recordando siempre que no es necesario que los
termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es ayudar
a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es que puedas
explicar el ejercicio con la intención de que tu compañero lo comprenda, y no sólo mostrarlo.
¡Muchas gracias!

1. Un colegio desea saber qué porcentaje de niños y qué porcentaje de niñas hay en el
curso actual. Diseñar un algoritmo para este propósito. Recuerda que para calcular el
porcentaje puedes hacer una regla de 3 simple. El programa debe solicitar al usuario que
ingrese la cantidad total de niños, y la cantidad total de niñas que hay en el curso.

2. Solicitar al usuario que ingrese la base y altura de un rectángulo, y calcular y mostrar por
pantalla el área y perímetro del mismo

area = base * altura


perimetro = 2 * altura + 2 * base.

3. Escribir un programa que calcule el volumen de un cilindro. Para ello se deberá solicitar
al usuario que ingrese el radio y la altura. Mostrar el resultado por pantalla.

volumen = π * radio2 * altura

4. A partir de una conocida cantidad de días que el usuario ingresa a través del teclado,
escriba un programa para convertir los días en horas, en minutos y en segundos. Por
ejemplo

1 día = 24 horas = 1440 minutos = 86400 segundos

5. Crear un programa que solicite al usuario que ingrese el precio de un producto al inicio
del año, y el precio del mismo producto al finalizar el año. El programa debe calcular cuál
fue el porcentaje de aumento que tuvo ese producto en el año y mostrarlo por pantalla.

21
CURSO DE PROGRAMACIÓN FULL STACK

ESTRUCTURAS DE
CONTROL CON
PSEINT
SECUENCIALES Y SELECTIVAS
GUÍA DE ESTRUCTURAS DE CONTROL
Hasta ahora nuestros algoritmos han consistido en simples secuencias de instrucciones
unas depues de otra. Pero en nuestro programas existen tareas más complejas que no
pueden ser resueltas así, quizás necesitamos repetir una misma instrucción, realizar
acciones diferentes en función del valor de una expresión, etc. Para esto existen las
estructuras de control.

ESTRUCTURAS DE CONTROL
Las Estructuras de Control determinan el orden en que deben ejecutarse las instrucciones
de un algoritmo, es decir, si serán recorridas una después de la otra (estructuras
secuenciales), si habrá que tomar decisiones sobre si ejecutar o no alguna acción
(estructuras selectivas o de decisión) o si habrá que realizar repeticiones (estructuras
repetitivas). Esto significa que una estructura de control permite que se realicen unas
instrucciones y omitir otras, de acuerdo a la evaluación de una condición.

ESTRUCTURA SECUENCIAL
Es la estructura en donde una acción (instrucción) sigue a otra de manera secuencial. Las
tareas se dan de tal forma que la salida de una es la entrada de la que sigue y así en lo
sucesivo hasta cumplir con todo el proceso. Esta estructura de control es la más simple,
permite que las instrucciones que la constituyen se ejecuten una tras otra en el orden en
que se listan.

ESTRUCTURAS SELECTIVAS
Estas estructuras de control son de gran utilidad para cuando el algoritmo a desarrollar
requiera una descripción más complicada que una lista sencilla de instrucciones. Este es el
caso cuando existe un número de posibles alternativas que resultan de la evaluación de una
determinada condición. Este tipo de estructuras son utilizadas para tomar decisiones
lógicas, es por esto que también se denominan estructuras de decisión o selectivas.

En estas estructuras, se realiza una evaluación de una condición y de acuerdo al resultado,


el algoritmo realiza una determinada acción. Las condiciones son especificadas utilizando
expresiones lógicas.

1
Las estructuras selectivas/alternativas pueden ser:

• Simples: Si
• Doble: Si- SiNo
• Múltiples: Según – Si Anidado

CONDICIÓN SIMPLE
La estructura alternativa simple si-entonces lleva a cabo una acción siempre y cuando se
cumpla una determinada condición.

La selección si-entonces evalúa la condición y luego:

• Si la condición es verdadera, ejecuta el bloque de acciones


• Si la condición es falsa, no ejecuta nada.

Pseudocódigo en PSeInt:

Si expresión lógica Entonces


acciones
Fin Si

CONDICIÓN DOBLE
La estructura anterior es muy limitada y normalmente se necesitará una estructura que
permita elegir entre dos opciones o alternativas posibles, en función del cumplimiento o no
de una determinada condición. Si la condición es verdadera, se ejecuta la acción S1 y, si es
falsa, se ejecuta la acción S2.

2
Pseudocódigo en PSeInt:

Si expresión lógica Entonces


acciones_por_verdadero
Sino
acciones_por_falso
Fin Si

CONDICIÓN MÚLTIPLE
Muchas veces vamos a tener más de dos alternativas para elegir, o una variable que puede
tomar varios valores. Para solucionar esto, usamos la condición multiple. En esta estructura,
se evalúa una condición o expresión que puede tomar n valores. Según el valor que la
expresión tenga en cada momento se ejecutan las acciones correspondientes al valor.
La estructura de decisión múltiple evaluará una expresión que podrá tomar n valores
distintos, 1, 2, 3, 4, ..., n. Según el valor que elija en la condición, se realizará una de las n
acciones, o lo que es igual, el flujo del algoritmo seguirá un determinado camino entre los n
posibles. Por ejemplo, si tenemos un sistema de notas, donde 6 es desaprobado, 7 es
aprobado, 9 es sobresaliente y 10 es excelente. Al tener un valor que puede dar distintas
alternativas, usamos la condición múltiple.

Pseudocódigo en PSeInt:

Segun variable_numerica Hacer


opcion_1:
secuencia_de_acciones_1
opcion_2:
secuencia_de_acciones_2
opcion_3:
secuencia_de_acciones_3
De Otro Modo:
secuencia_de_acciones_dom
Fin Según

NOTA:
Cuando el valor de la variable que se evalúa no coincide con ninguno de los valores que se
evalúa, entonces se ejecutan las acciones dentro del bloque “De Otro Modo”
(secuencia_de_acciones_dom), el cual equivale a realizar un “Sino” dentro de las estructuras
condicionales.

3
Este problema, se podría resolver por estructuras alternativas simples o dobles, anidadas o
en cascada; sin embargo, este método si el número de alternativas es grande puede
plantear serios problemas de escritura del algoritmo y naturalmente de legibilidad.

CONDICIONALES ANIDADOS O EN CASCADA


Es posible también utilizar la instrucción Si para diseñar estructuras de selección que
contengan más de dos alternativas. Por ejemplo, una estructura Si-entonces puede
contener otra estructura Si-entonces, y esta estructura Si-entonces puede contener otra, y
así sucesivamente cualquier número de veces; a su vez, dentro de cada estructura pueden
existir diferentes acciones, a esto se le llama condiciónales anidados o en cascada.

Pseudocódigo en PSeInt:

Si expresion_logica1 Entonces
acciones_por_verdadero1
Sino
Si expresion_logica2 Entonces
acciones_por_verdadero2
Sino
Si expresion_logica4 Entonces
acciones_por_verdadero3
Sino
acciones_por_falso
Fin Si
Fin Si
Fin Si

4
FUNCIONES PSEINT
Además de empezar a implementar las estructuras de control, vamos a empezar a utilizar
las funciones de Pseint. Las funciones, son herramientas que nos proporciona Pseint y
cumplen el propósito de ayudarnos a resolver ciertos problemas. Supongamos que
tenemos que calcular la raíz cuadrada de un numero, Pseint cuenta con una función que
pasándole un numero, nos devuelve el resultado de su raíz cuadrada. Ese resultado que
devuelve, se lo podemos asignar a una variable o lo podemos concatenar con un escribir
para mostrar el resultado sin la necesidad de una variable.
También, las funciones se pueden utilizar dentro de cualquier expresión, de cualquier
estructura, y cuando se evalúe la misma, se reemplazará por el resultado correspondiente.

Tenemos dos tipos de funciones, funciones matemáticas y funciones de cadenas de texto.


Las funciones matemáticas, reciben un sólo parámetro de tipo numérico y devolverán un
solo valor de tipo numérico. Las funciones de cadenas, en cambio, reciben un solo
parámetro de tipo cadena, pero pueden devolver un valor de tipo cadena o de tipo
numérico según la función que se use.

Funciones Matemáticas

Función Significado
RC(número) Devuelve la raíz cuadrada del número.
ABS(número) Devuelve el valor absoluto del número
LN(número) Devuelve el logaritmo natural del número
EXP(número) Devuelve la función exponencial del número.
SEN(número) Devuelve el seno de número.
COS(número) Devuelve el coseno de número.
TAN(número) Devuelve la tangente de número.
ASEN(número) Devuelve el arcoseno de numero.
ACOS(número) Arcocoseno de x
ATAN(número) Arcotangante de x
Devuelve el módulo (resto de la división
MOD
entera).
TRUNC(número) Trunca el valor x (parte entera de x)
REDOND(número) Redondea al valor más cercano a x
AZAR(número) Entero aleatorio entre 0 y x -1
ALEATORIO(min,max) Entero aleatorio entre valor mínimo y máximo

Ejemplos:

Escribir "Raíz cuadrada de 9: " rc(9)


Escribir “Resto de 4/2: ” 4 MOD 2
Escribir "Valor absoluto de -3: " abs(-3)
Escribir "Seno de 90 grados: " sen(90 * PI / 180)
Escribir "Truncamos 3.7: " trunc(3.7)
Escribir "Redondeamos 2.7: " redon(2.7)
Escribir "Un número al azar del 0 al 9: " azar(10)
Escribir "Un número al azar entre 10 y 20: " aleatorio(10,20)

5
Del codigo anterior los resultados serían:

Raíz cuadrada de 9: 3
Resto e 4/2: 0
Valor absoluto de -3: 3
Seno de 90 grados: 1
Truncamos 3.7: 3
Redondeamos 2.7: 3
Un número al azar del 0 al 9: 6
Un número al azar entre 10 y 20: 14

Funciones Cadenas de Texto


Algunas funciones de cadenas de texto, utilizan las posiciones de cada letra de una
cadena. Esto significa que, si tengo la palabra Hola, la cadena tendrá 4 posiciones, en
Pseint las posiciones de las letras arrancan en 0. Entonces para la cadena Hola, nuestras
posiciones serían: 0: H, 1: o, 2: l y 3: a.

Función Significado
Devuelve la cantidad de letras que compone la
Longitud(cadena)
cadena.
Devuelve una copia de la cadena con todas sus
Mayusculas(cadena)
letras en mayúsculas.
Devuelve una copia de la cadena con todas sus
Minusculas(cadena)
letras en minúsculas.
Devuelve una nueva cadena que consiste en la
Subcadena(cadena,
parte de la cadena que va desde la
posición_inicial, posición_final)
posición pos_inicial hasta la posición pos_final.
Devuelve una nueva cadena que resulta de unir
Concatenar(cadena, cadena2)
las cadenas cadena1 y cadena2.
Recibe una cadena compuesta de numeros y
ConvertirANumero(cadena)
devuelve la cadena como una variable numerica.
Recibe un numero y devuelve una variable
ConvertirACadena(cadena)
cadena de caracteres de dicho numero.

Ejemplos:

Definir cadena1,cadena2,cadena3 como cadena


cadena1 = "programacion
cadena2 = “EGG”
Escribir "La longitud de cadena1 es " longitud(cadena1)
Escribir "El primer carácter de cadena1 es " subcadena(cadena1,0,0)
Escribir "La cadena1 en mayúsculas es " mayusculas(cadena1)
Escribir "La cadena2 en minusculas es " minusculas (cadena2)
cadena3 = concatenar(cadena1," es muy interesante")
Escribir “La cadena convertida a numero queda:” convertirANumero("10")
Escribir “El numero convertido a cadena queda:” convertirATexto(20)

6
Del codigo anterior los resultados serían:

La longitud de cadena1 es 12
El primer carácter de cadena1 es p
La cadena1 en mayúsculas es PROGRAMACION
La cadena2 en minúsculas es egg
programacion es muy interesante
La cadena convertida a numero queda: 10
El numero convertido a cadena queda: 20

7
CURSO DE PROGRAMACIÓN FULL STACK

ESTRUCTURAS DE
CONTROL CON
PSEINT
SECUENCIALES Y SELECTIVAS
EJERCICIOS DE APRENDIZAJE
Para cada uno de los siguientes ejercicios realizar el análisis del problema e indicar cuáles
son los datos de entrada y cuáles son los datos de salida. Escribir luego el programa en
PSeInt.

Condicional Simple

1. Escriba un programa en donde se pida la edad del usuario. Si el usuario es mayor de


edad se debe mostrar un mensaje por pantalla indicándolo.

2. Un hombre desea saber si su sueldo es mayor al sueldo mínimo, el programa le pedirá


al usuario su sueldo actual y el sueldo mínimo. Si el sueldo es mayor al mínimo se debe
mostrar un mensaje por pantalla indicándolo.

Condicional Doble

3. Realizar un programa que pida un número al usuario. Si el número es mayor que 100 se
deberá de imprimir en pantalla “Es Mayor”, y en caso contrario se deberá imprimir “Es
Menor”.

4. Realiza un programa que sólo permita introducir los caracteres ‘S’ y ‘N’. Si el usuario
ingresa alguno de esos dos caracteres se deberá de imprimir un mensaje por pantalla
que diga “CORRECTO”, en caso contrario, se deberá imprimir “INCORRECTO”.

5. Realizar un programa que pida un numero y determine si ese numero es par o impar.
Mostrar en pantalla un mensaje que indique si el numero es par o impar. (para que un
número sea par, se debe dividir entre dos y su resto debe ser igual a 0). Nota: investigar
la función mod de Pseint.

6. Realizar un programa que pida introducir solo frases o palabras de 6 caracteres. Si el


usuario ingresa una frase o palabra de 6 caracteres se deberá de imprimir un mensaje
por pantalla que diga “CORRECTO”, en caso contrario, se deberá imprimir
“INCORRECTO”. Nota: investigar la función Longitud() de Pseint.

7. Realizar un programa que pida una frase o palabra y si la frase o palabra es de 4


caracteres de largo, el programa le concatenara un signo de exclamación al final, y si no
es de 4 caracteres el programa le concatenara un signo de interrogación al final. El
programa mostrará después la frase final. Nota: investigar la función Longitud() y
Concatenar() de Pseint.

8. Escriba un programa que pida 3 notas y valide si esas notas están entre 1 y 10. Si están
entre esos parámetros se debe poner en verdadero una variable de tipo lógico y si no
ponerla en falso. Al final el programa debe decir si las 3 notas son correctas usando la
variable de tipo lógico.

8
9. Escriba un programa que pida una frase o palabra y valide si la primera letra de esa frase
es una ‘A’. Si la primera letra es una ‘A’, se deberá de imprimir un mensaje por pantalla
que diga “CORRECTO”, en caso contrario, se deberá imprimir “INCORRECTO”. Nota:
investigar la función Subcadena de Pseint.

10. Continuando el ejercicio anterior, ahora se pedirá una frase o palabra y se validara si la
primera letra de la frase es igual a la ultima letra de la frase. Se deberá de imprimir un
mensaje por pantalla que diga “CORRECTO”, en caso contrario, se deberá imprimir
“INCORRECTO”.

Condicional Múltiple

11. Construir un programa que simule un menú de opciones para realizar las cuatro
operaciones aritméticas básicas (suma, resta, multiplicación y división) con dos valores
numéricos enteros. El usuario, además, debe especificar la operación con el primer
carácter de la operación que desea realizar: ‘S' o ‘s’ para la suma, ‘R’ o ‘r’ para la resta, ‘M’
o ‘m’ para la multiplicación y ‘D’ o ‘d’ para la división.

Condicionales Anidados

12. Realizar un programa que, dado un número entero, visualice en pantalla si es par o impar.
En caso de que el valor ingresado sea 0, se debe mostrar “el número no es par ni impar”.
Nota: investigar la función mod de PSeInt

13. Escriba un programa para obtener el grado de eficiencia de un operario de una fábrica
de tornillos, de acuerdo a las siguientes dos condiciones que se le imponen para un
período de prueba:

▪ Producir menos de 200 tornillos defectuosos.


▪ Producir más de 10000 tornillos sin defectos.
El grado de eficiencia se determina de la siguiente manera:
▪ Si no cumple ninguna de las condiciones, grado 5.
▪ Si sólo cumple la primera condición, grado 6.
▪ Si sólo cumple la segunda condición, grado 7.
▪ Si cumple las dos condiciones, grado 8

Nota: para trabajar este ejercicio de manera prolija, ir probando cada inciso que pide el
ejercicio. No hacer todos al mismo tiempo y después probar.

9
EJERCICIOS DE APRENDIZAJE EXTRA
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos pueden
realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que venimos
trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas, podes
continuar con estos ejercicios extra, recordando siempre que no es necesario que los
termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es ayudar
a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es que puedas
explicar el ejercicio con la intención de que tu compañero lo comprenda, y no sólo mostrarlo.
¡Muchas gracias!
Condicional Doble

1. Realizar un programa que pida tres notas y determine si un alumno aprueba o reprueba
un curso, sabiendo que aprobará el curso si su promedio de tres calificaciones es mayor
o igual a 70; y reprueba en caso contrario.

2. Una tienda ofrece para los meses de septiembre, octubre y noviembre un descuento del
10% sobre el total de la compra que realiza un cliente. Solicitar al usuario que ingrese un
mes y el importe de la compra. El programa debe calcular cuál es el monto total que se
debe cobrar al cliente e imprimirlo por pantalla.

3. Solicitar al usuario que ingrese dos números enteros y determinar si ambos son pares o
impares. Mostrar en pantalla un mensaje que indique “Ambos números son pares”
siempre y cuando cumplan con la condición. En caso contrario se deberá imprimir el
siguiente mensaje “Los números no son pares, o uno de ellos no es par”.
Nota: investigar la función mod de Pseint.

4. La empresa “Te llevo a todos lados” está destinada al alquiler de autos y tiene un sistema
de tarifa que consiste en cobrar el alquiler por hora. Si el cliente devuelve el auto dentro
de las 2 horas de uso el valor que corresponde pagar es de $400 pesos y la nafta va de
regalo. Cuando el cliente regresa a la empresa pasadas las 2 horas, se ingresan la
cantidad de litros de nafta gastados y el tiempo transcurrido en horas. Luego, se le cobra
40 pesos por litro de nafta gastado, y la hora se fracciona en minutos, cobrando un total
de $5,20 el minuto de uso. Realice un programa que permita registrar esa información y
el total a pagar por el cliente.

Condicional Multiple

5. Solicitar al usuario que ingrese un valor entre 1 y 7. EL programa debe mostrar por
pantalla un mensaje que indique a qué día de la semana corresponde. Considere que el
número 1 corresponde al día “Lunes”, y así sucesivamente.

6. Leer tres números que denoten una fecha (día, mes, año) y comprobar que sea una fecha
válida. Si la fecha no es válida escribir un mensaje de error por pantalla. Si la fecha es
válida se debe imprimir la fecha cambiando el número que representa el mes por su
nombre. Por ejemplo: si se introduce 1 2 2006, se deberá imprimir “1 de febrero de 2006”.

7. Hacer un algoritmo que lea un número por el teclado y determine si tiene tres dígitos.

10
Condicionales Anidados

8. Si se compran menos de cinco llantas el precio es de $3000 cada una, si se compran


entre 5 y 10 el precio es de $2500, y si se compran más de 10 el precio es $2000. Obtener
la cantidad de dinero que una persona tiene que pagar por cada una de las llantas que
compra, y el monto total que tiene que pagar por el total de la compra.

9. Realice un programa que, dado un año, nos diga si es bisiesto o no. Un año es bisiesto
bajo las siguientes condiciones: Un año divisible por 4 es bisiesto y no debe ser divisible
por 100. Si un año es divisible por 100 y además es divisible por 400, también resulta
bisiesto. Nota: recuerde la función mod de PSeInt

10. Una verdulería ofrece las manzanas con descuento según la siguiente tabla:

Nº DE KILOS
% DESCUENTO
COMPRADOS
0–2 0%
2.01 – 5 10%
5.01 – 10 15%
10.01 en adelante 20%

Determinar cuánto pagará una persona que compre manzanas en esa verdulería.

11. El promedio de los trabajos prácticos de un curso se calcula en base a cuatro notas de
las cuales se elimina la nota menor y se promedian las tres notas más altas. Escriba un
programa que determine cuál es la nota eliminada y el promedio de los trabajos
prácticos de un estudiante.

12. Una empresa tiene personal de distintas áreas con distintas condiciones de
contratación y formas de pago. El departamento de contabilidad necesita calcular los
sueldos semanales (lunes a viernes) en base a las 3 modalidades de sueldo:

a) comisión
b) salario fijo + comisión, y
c) salario fijo.

a) Para la modalidad salario por comisión se debe ingresar el monto total de las ventas
realizadas en la semana, y el 40% de ese monto total corresponde al salario del
empleado.
b) Para la condición de salario fijo + comisión, se debe ingresar el valor que se paga por
hora, la cantidad de horas trabajadas semanalmente y el monto total de las ventas en
esa semana. En este tipo de contrato las horas extras no están contempladas y se fija
como máximo 40 horas por semana. La comisión por las ventas se calcula como 25%
del valor de venta total.
c) Finalmente, para la modalidad de salario fijo se debe ingresar el valor que se paga por
hora y la cantidad de horas trabajadas en la semana. En el caso de exceder las 40
horas semanales, las horas extras se deben pagar con un extra del 50% del valor de
la hora. Realizar un menú de opciones para poder elegir el tipo de contrato que tiene
un empleado.

11
CURSO DE PROGRAMACIÓN FULL STACK

SUBPROGRAMAS
CON PSEINT
PROCEDIMIENTOS
GUÍA DE SUBPROGRAMAS
En la guía anterior sobre los subprogramas hicimos hincapié en los distintos tipos de
subprogramas, pero solo vimos funciones. Ahora vamos a ver otro tipo de subprograma
llamado procedimiento.

PROCEDIMIENTOS
Aunque las funciones son herramientas de programación muy útiles para la resolución de
problemas, con frecuencia se requieren subprogramas que no retornen ninguna
información o se encarguen de imprimir información. En estas situaciones la función no es
apropiada y se necesita disponer del otro tipo de subprograma: el procedimiento.
Un procedimiento es un subprograma que ejecuta un proceso específico. Ningún valor
está asociado con el nombre del procedimiento; por consiguiente, no puede ocurrir en una
expresión. Un procedimiento se llama escribiendo su nombre. Cuando se invoca el
procedimiento, los pasos que lo definen se ejecutan y a continuación se devuelve el
control al programa que le llamó.

SINTAXIS
SubProceso Nombre (parámetros)

<acciones>

FinSubProceso

Los parámetros tienen el mismo significado que en las funciones.

Invocación a un Subprograma
Un procedimiento puede ser llamado de la siguiente forma:

nombre(argumentos)

• nombre_procedimiento: procedimiento que se va a llamar.


• argumentos: constantes, variables, expresiones.

Ámbito: Variables Locales y Globales


Las variables utilizadas en los programas principales y subprogramas se clasifican en dos
tipos: variables locales y variables globales.
Una variable local es aquella que está declarada y definida dentro de un subprograma, en
el sentido de que está dentro de ese subprograma, es distinta de las variables con el
mismo nombre declaradas en cualquier parte del programa principal y son variables a las
que el algoritmo principal no puede acceder de manera directa.
El significado de una variable se confina al procedimiento en el que está declarada.
Cuando otro subprograma utiliza el mismo nombre se refiere a una posición diferente en
memoria. Se dice que tales variables son locales al subprograma en el que están
declaradas.

1
Una variable global es aquella que está declarada en el programa o algoritmo principal, del
que dependen todos los subprogramas y a las que pueden acceder los subprogramas, a
través del paso de argumento. La parte del programa/algoritmo en que una variable se
define se conoce como ámbito o alcance (scope, en inglés).
El uso de variables locales tiene muchas ventajas. En particular, hace a los subprogramas
independientes, siendo solo la comunicación entre el programa principal y los
subprogramas a través de la lista de parámetros.
Una variable local a un subprograma no tiene ningún significado en otros subprogramas. Si
un subprograma asigna un valor a una de sus variables locales, este valor no es accesible a
otros programas, es decir, no pueden utilizar este valor. A veces, también es necesario que
una variable tenga el mismo nombre en diferentes subprogramas. Por el contrario, las
variables globales tienen la ventaja de compartir información de diferentes subprogramas
sin la necesidad de ser pasados como argumento

Comunicación con Subprogramas: Paso de Argumentos


Cuando un programa llama a un subprograma, la información se comunica a través de la
lista de parámetros y se establece una correspondencia automática entre los parámetros y
los argumentos. Los parámetros son “sustituidos” o “utilizados” en lugar de los argumentos.

La declaración del subprograma se hace con:

Subproceso nombre (PA1, PA2, ...,PAn)


<acciones>
FinSubproceso

y la llamada al subprograma con:

nombre (AR1, ARG2,…, ARGn)

donde PA1, PA2, ..., PAn son los parámetros y ARG1, ARG2, ..., ARGn son los argumentos.

Cuando nosotros decidimos los parámetros que va a necesitar nuestro subprograma,


también podemos decidir cual va a ser el comportamiento de los argumentos en nuestro
subprograma cuando lo invoquemos y se los pasemos por paréntesis. Esto va a afectar
directamente a los argumentos y no al resultado final del subprograma.
Para esto existen dos tipos más empleados para realizar el paso de argumentos, el paso
por valor y el paso por referencia.

Paso por Valor


Los argumentos se tratan como variables locales y los valores de dichos argumentos
se proporcionan copiando los valores de los argumentos originales. Los parámetros
(locales a la función o procedimiento) reciben como valores iniciales una copia de los
valores de los argumentos y con ello se ejecutan las acciones descritas en el
subprograma.
Aunque el paso por valor es sencillo, tiene una limitación acusada: no existe ninguna otra
conexión con los parámetros, y entonces los cambios que se produzcan dentro del
subprograma no producen cambios en los argumentos originales y, por consiguiente, no
se pueden poner argumentos como valores de retorno. El argumento actual no puede
modificarse por el subprograma.

2
En PSeInt todas las variables que pasemos como argumentos pasan por defecto
“Por Valor” sino se especifica lo contrario explícitamente.

Paso por Referencia


En numerosas ocasiones se requiere que ciertos argumentos sirvan como argumentos de
salida, es decir, se devuelvan los resultados al programa que llama. Este método se
denomina paso por referencia o también de llamada por dirección o variable. El programa
que llama pasa al subprograma la dirección del argumento actual (que está en el programa
que llama). Una referencia al correspondiente argumento se trata como una referencia a la
posición de memoria, cuya dirección se ha pasado. Entonces una variable pasada como
argumento real es compartida, es decir, se puede modificar directamente por el
subprograma.
La característica de este método se debe a su simplicidad y su analogía directa con la idea
de que las variables tienen una posición de memoria asignada desde la cual se pueden
obtener o actualizar sus valores. El área de almacenamiento (direcciones de memoria) se
utiliza para pasar información de entrada y/o salida; en ambas direcciones.
En este método los argumentos son de entrada/salida y los argumentos se denominan
argumentos variables.

3
CURSO DE PROGRAMACIÓN FULL STACK

SUBPROGRAMAS
CON PSEINT
PROCEDIMIENTOS
EJERCICIOS DE APRENDIZAJE
Para cada uno de los siguientes ejercicios realizar el análisis del problema e indicar cuáles
son los datos de entrada y cuáles son los datos de salida. Escribir luego el programa en
PSeInt utilizando procedimientos.

Subprogramas: Procedimientos

1. Realizar un procedimiento que permita intercambiar el valor de dos variables de tipo


entero. La variable A, debe terminar con el valor de la variable B.

2. Crear una procedimiento que calcule la temperatura media de un día a partir de la


temperatura máxima y mínima. Crear un programa principal, que utilizando un
procedimiento, vaya pidiendo la temperatura máxima y mínima de n días y vaya
mostrando la media de cada día. El programa pedirá el número de días que se van a
introducir.

3. Realizar un procedimiento que permita realizar la división entre dos números y muestre
el cociente y el resto utilizando el método de restas sucesivas.
El método de división por restas sucesivas consiste en restar el dividendo con el
divisor hasta obtener un resultado menor que el divisor, este resultado es el residuo, y
el número de restas realizadas es el cociente. Por ejemplo: 50 / 13:

50 – 13 = 37 una resta realizada


37 – 13 = 24 dos restas realizadas
24 – 13 = 11 tres restas realizadas
dado que 11 es menor que 13, entonces: el residuo es 11 y el cociente es 3.

4. Escribir un programa que procese una secuencia de caracteres ingresada por teclado
y terminada en punto, y luego codifique la palabra o frase ingresada de la siguiente
manera: cada vocal se reemplaza por el carácter que se indica en la tabla y el resto de
los caracteres (incluyendo a las vocales acentuadas) se mantienen sin cambios.

a e i o u

@ # $ % *

Realice un subprograma que reciba una secuencia de caracteres y retorne la


codificación correspondiente. Utilice la estructura “según” para la transformación.

Por ejemplo, si el usuario ingresa: Ayer, lunes, salimos a las once y 10.
La salida del programa debería ser: @y#r, l*n#s, s@l$m%s @ l@s %nc# y 10.

NOTA: investigue el uso de la función concatenar de PSeInt para armar la palabra/frase.

4
EJERCICIOS DE APRENDIZAJE EXTRA
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos
pueden realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que
venimos trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas,
podes continuar con estos ejercicios extra, recordando siempre que no es necesario que
los termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es
ayudar a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es
que puedas explicar el ejercicio con la intención de que tu compañero lo comprenda, y no
sólo mostrarlo. ¡Muchas gracias!

Procedimientos

1. Crea un procedimiento “convertirEspaciado”, que reciba como argumento un texto y


muestra una cadena con un espacio adicional tras cada letra.
Por ejemplo, “Hola, tú” devolverá “H o l a , t ú “. Crea un programa principal donde se
use dicho procedimiento.

2. Realizar un subproceso que reciba una letra y muestre un mensaje si esa letra esta
entre las letras “M” y “T”. Recordar que Pseint le da un valor numérico a cada letra a
través del Código Ascii.

3. Crear un programa que dibuje una escalera de números, donde cada línea de números
comience en uno y termine en el número de la línea. Solicitar la altura de la escalera al
usuario al comenzar. Ejemplo: si se ingresa el número 3:

1
12
123

4. Realice un algoritmo que solicite al usuario una fecha y muestre por pantalla la fecha
anterior. Para ello se deberá utilizar un procedimiento llamado diaAnterior que reciba
una fecha representada a través de tres enteros dia, mes y anio, y retorne la fecha
anterior. Puede asumir que dia, mes y anio representan una fecha válida. Realice
pruebas de escritorio para los valores dia=5, mes=10, anio=2012 y para dia=1, mes=3,
anio=2004.

5. Diseñar un procedimiento que reciba una frase, y el programa remueva todas las
vocales repetidas. Al final el procedimiento mostrará la frase final.

5
CURSO DE PROGRAMACIÓN FULL STACK

ARREGLOS CON
PSEINT
VECTORES
GUÍA DE ARREGLOS

ARREGLOS
En guías previas la manera de manipular datos era a través de variables, las variables nos
dejan manejar de a un dato a la vez, pero si necesitáramos manejar varios datos juntos en un
mismo lugar, usaríamos los arreglos.
Un array o arreglo (matriz o vector) es un conjunto finito y ordenado de elementos
homogéneos. La propiedad “ordenado” significa que el elemento primero, segundo,
tercero, ..., enésimo de un arreglo puede ser identificado. Los elementos de un arreglo son
homogéneos, es decir, del mismo tipo de datos. Un arreglo puede estar compuesto de todos
sus elementos de tipo cadena, otro puede tener todos sus elementos de tipo entero, etc,
pero no puede ser de datos distintos. Los arreglos también pueden utilizarse en expresiones
lógicas si necesitásemos comprobar varios elementos a la vez, o si necesitásemos saber si
un elemento de nuestro arreglo, existe dentro del arreglo.

ARREGLOS UNIDIMENSIONALES: VECTORES


El tipo más simple de arreglo es el arreglo unidimensional o vector. Un vector es un arreglo
de n elementos, uno detrás de otro, que posee las siguientes características:

• Se identifica por un único nombre de variable.


• Sus elementos se almacenan en posiciones del vector y cada a posición le
corresponde un subíndice.
• Se puede acceder a cada uno de sus elementos a través del subíndice de forma
ordenada o en forma aleatoria.
• Su tamaño es finito, esto significa que una vez definido su tamaño, este no puede
cambiar. El tamaño es la cantidad de elementos que puede guardar nuestro vector.

SUBÍNDICE
• El subíndice es el número entero que identifica cada elemento dentro del vector, sin
importar el tipo de dato que posea.
• Un vector de tamaño N posee N subíndices que se suceden de forma creciente y
monótona. Ejemplo: 0 – 1 – 2 – 3 - 4 - 5 – 6 – N

1
• El valor inicial del primer subíndice depende del lenguaje; la mayoría de los
modernos inician con el cero, por lo tanto, en PSeInt comenzarán en cero y los
posibles valores de los subíndices irán desde 0 hasta N-1.

DECLARACIÓN
Definir nombre_vector como Tipo_de_Dato
Dimension nombre_vector(tamaño)

Donde Tipo_De_Dato se corresponde con cualquiera de los tipos de datos simples vistos
previamente: entero, real, cadena, lógico.
La declaración Dimension nos sirve para darle el tamaño a nuestro vector, que recordemos,
no puede cambiar una vez declarado. El tamaño va a ser siempre un numero entero o una
variable entera, el tamaño no puede ser un numero con decimales.
El tamaño nos sirve para declarar cuantos elementos va a poder guardar nuestro vector. Si
decimos que nuestro vector va a guardar 5 elementos, no puede guardar 6 o nos producirá
un error.

ASIGNAR ELEMENTOS A UN ARREGLO


Cuando queremos ingresar un elemento en nuestro arreglo vamos a tener que elegir el
subíndice en el que lo queremos guardar. Una vez que tenemos el subíndice decidido
tenemos que invocar nuestro vector por su nombre y entre paréntesis el subíndice en el que
lo queremos guardar. Después, pondremos el signo de igual (que es el operador de
asignación) seguido del elemento a guardar.
El elemento a guardar debe coincidir con el tipo de dato de nuestro arreglo, si nuestro arreglo
es de tipo entero, solo podemos guardar números enteros. También sucede algo parecido
con el subíndice, no podemos llamar un subíndice que no existe, recordemos que los
subíndices dependen del tamaño de nuestro arreglo. Entonces si tenemos un arreglo de
tamaño 5, no podemos llamar el subíndice 6 porque no existe.

Ejemplo:

nombre_arreglo(0) = 4

Esta forma de asignación implica asignar todos los valores de nuestro arreglo de uno en uno,
esto va a conllevar un trabajo bastante grande dependiendo del tamaño de nuestro arreglo.
Entonces, para poder asignar varios valores a nuestro arreglo y no hacerlo de uno en uno
usamos un bucle Para. El bucle Para, al poder asignarle un valor inicial y un valor final a una
variable, podemos adaptarlo fácilmente a nuestros arreglos. Ya que, pondríamos el valor
inicial de nuestro arreglo y su valor final en las respectivas partes del Para. Nosotros,
usaríamos la variable creada en el Para, y la pasaríamos a nuestro arreglo para representar
todos los subíndices del arreglo, de esa manera, recorriendo todas las posiciones de nuestro
arreglo, asignándole a cada posición un elemento.

Para i<-0 Hasta 4 Con Paso 1 Hacer


nombre_arreglo(i) = 4
Fin Para

2
Nuestra variable i pasara por todos los subíndices de nuestro arreglo, ya que ira desde 0
hasta 4. Recordemos que los arreglos arrancan de 0, entonces, debemos calcular que, si el
tamaño que le definimos al arreglo es de 5, necesitamos que nuestro Para vaya de 0 a 4

MOSTRAR O TRAER ELEMENTOS DE UN ARREGLO


A la hora de querer mostrar o traer algún elemento de nuestro arreglo, lo único que tenemos
que hacer es escribir el nombre de nuestro arreglo y entre llaves o paréntesis pasarle un
subíndice de ese arreglo para que traiga el elemento que se encuentra en ese subíndice,

Escribir nombre_arreglo(0)

Variable = nombre_arreglo(0)

Si quisiéramos mostrar todos los elementos de nuestro arreglo, deberíamos usar una
estructura Para, que recorrerá todos los subíndices de nuestro arreglo y así poder mostrarlos
todos.

Para i<-0 Hasta 4 Con Paso 1 Hacer


Escribir nombre_arreglo[i]
Fin Para

Nuestra variable i pasara por todos los subíndices de nuestro arreglo, ya que ira desde 0
hasta 4. Esto es porque como los arreglos arrancan de 0, debemos calcular que, si el tamaño
que le definimos al arreglo es de 5, necesitamos que nuestro Para vaya de 0 a 4

USO EN SUBPROGRAMAS
Los arreglos se pueden pasar como parámetros a un subprograma (función o procedimiento)
del mismo modo que las variables escalares. Sin embargo, hay que tener en cuenta que los
arreglos, a diferencia de los tipos de datos simples, pasan siempre como parámetro “Por
Referencia”, ya que usualmente en nuestros subprogramas usamos los arreglos para rellenar,
mostrar nuestros arreglos, etc.

Funcion variable_de_retorno <- Nombre (vector por referencia)


Definir variable_de_retorno como Tipo de Dato
<acciones>
Fin Funcion

3
CURSO DE PROGRAMACIÓN FULL STACK

ARREGLOS CON
PSEINT
VECTORES
EJERCICIOS DE APRENDIZAJE
Para cada uno de los siguientes ejercicios realizar el análisis del problema e indicar cuáles
son los datos de entrada y cuáles son los datos de salida. Escribir luego el algoritmo en
PSeInt haciendo uso de funciones y/o procedimientos según corresponda en cada caso.

1. Realizar un programa que rellene un vector con 5 valores ingresados por el usuario y los
muestre por pantalla.

2. Realizar un programa que lea 10 números reales por teclado, los almacene en un arreglo
y muestre por pantalla la suma, resta y multiplicación de todos los números ingresados
al arreglo.

3. Realizar un programa que rellene un vector de tamaño N, con valores ingresados por el
usuario. A continuación, se debe buscar un elemento dentro del arreglo (el número a
buscar también debe ser ingresado por el usuario). El programa debe indicar la posición
donde se encuentra el valor. En caso que el número se encuentre repetido dentro del
arreglo se deben imprimir todas las posiciones donde se encuentra ese valor.
Finalmente, en caso que el número a buscar no está adentro del arreglo se debe mostrar
un mensaje.

4. Realizar un programa que rellene un vector de tamaño N, con valores ingresados por el
usuario. A continuación, se deberá crear una función que reciba el vector y devuelva el
valor más grande del vector.

5. Realizar un programa con el siguiente menú y le pregunte al usuario que quiere hacer
hasta que ingrese la opción Salir:

a. Llenar Vector A. Este vector es de tamaño N y se debe llenar de manera


aleatoria usando la función Aleatorio(valorMin, valorMax) de PseInt.
b. Llenar Vector B. Este vector también es de tamaño N y se llena de manera
aleatoria.
c. Llenar Vector C con la suma de los vectores A y B. La suma se debe realizar
elemento a elemento. Ejemplo: C = A + B
d. Llenar Vector C con la resta de los vectores B y A. La resta se debe realizar
elemento a elemento. Ejemplo: C = B - A
e. Mostrar. Esta opción debe permitir al usuario decidir qué vector quiere mostrar:
Vector A, B, o C.
f. Salir.

NOTA: El rango de los números aleatorios para los Vectores será de [-100 a 100]. La
longitud para todos los vectores debe ser la misma, por lo tanto, esa información sólo se
solicitará una vez.

4
6. Disponemos de un vector unidimensional de 20 elementos de tipo carácter. Se pide
desarrollar un programa que:

a. Pida una frase al usuario y luego ingrese la frase dentro del arreglo letra por
letra. Ayuda: utilizar la función Subcadena de PSeInt.

b. Una vez completado lo anterior, pedirle al usuario un carácter cualquiera y una


posición dentro del arreglo, y el programa debe intentar ingresar el carácter
en la posición indicada, si es que hay lugar (es decir la posición está vacía o
es un espacio en blanco). De ser posible debe mostrar el vector con la frase y
el carácter ingresado, de lo contrario debe darle un mensaje al usuario de que
esa posición estaba ocupada.

Por ejemplo, suponiendo la siguiente frase y los subíndices del vector:

H o l a m u n d o c r u e l !

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Si se desea ingresar el carácter “%” en la posición 10, entonces el resultado sería:

H o l a m u n d o % c r u e l !

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

7. Crear un subproceso que rellene dos arreglos de tamaño n, con números aleatorios.
Después, hacer una función que reciba los dos arreglos y diga si todos sus valores son
iguales o no. La función debe devolver el resultado de está validación, para mostrar el
mensaje en el algoritmo. Nota: recordar el uso de las variables de tipo lógico.

5
EJERCICIOS DE APRENDIZAJE EXTRA
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos pueden
realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que venimos
trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas, podes
continuar con estos ejercicios extra, recordando siempre que no es necesario que los
termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es ayudar
a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es que puedas
explicar el ejercicio con la intención de que tu compañero lo comprenda, y no sólo mostrarlo.
¡Muchas gracias!

1. Realizar un programa que rellene dos vectores al mismo tiempo, con 5 valores aleatorios
y los muestre por pantalla.

2. Realizar un programa que rellene un vector de tamaño N, con valores ingresados por el
usuario y muestre por pantalla el promedio de la suma de todos los valores ingresados.

3. Crear dos vectores que tengan el mismo tamaño (el tamaño se pedirá por teclado) y
almacenar en uno de ellos nombres de personas como cadenas. En el segundo vector
se debe almacenar la longitud de cada uno de los nombres (para ello puedes usar la
función Longitud() de PseInt). Mostrar por pantalla cada uno de los nombres junto con su
longitud.

4. Crear un vector que contenga 100 notas de 100 supuestos estudiantes, con valores entre
0 y 20 generadas aleatoriamente mediante el uso de la función azar() o aleatorio() de
PseInt. Luego, de acuerdo a las notas contenidas, el programa debe indicar cuántos
estudiantes son:

a) Deficientes 0-5
b) Regulares 6-10
c) Buenos 11-15
d) Excelentes 16-20

5. Tomando en cuenta el ejercicio 6, mejore el mecanismo de inserción del carácter,


facilitando un potencial reordenamiento del vector. Digamos que se pide ingresar el
carácter en la posición X y la misma está ocupada, entonces de existir un espacio en
cualquier posición X-n o X+n, desplazar los caracteres hacia la izq o hacia la derecha para
poder ingresar el carácter en cuestión en el lugar deseado. El procedimiento de
reordenamiento debe ubicar el espacio más cercano.

Por ejemplo, suponiendo la siguiente frase y los subíndices del vector:

H o l a m u n d o c r u e l !

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Si se desea ingresar el carácter “%” en la posición 8, entonces el resultado con


desplazamiento sería:

6
h o l a m u n % d o c r u e l !

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Notar que el desplazamiento se hizo hacia la izquierda porque el espacio de la posición


10 estaba más cerca de la posición 8 que el espacio de la posición 4.

6. Crear una función que devuelva la diferencia que hay entre el valor más chico de un
arreglo y su valor más grande.

7. Crear un programa que ordene un vector lleno de números enteros aleatorios, de menor
a mayor. Nota: investigar el ordenamiento burbuja en el siguiente link: Ordenamiento
Burbuja.

8. Programe una función recursiva que calcule la suma de un arreglo de números enteros.

9. Programe una función que calcule el producto de un arreglo de números enteros. Para
esto imagine, por ejemplo, que para un vector V de tamaño 4, el producto de todos los
valores es igual a (V[1]*V[2]*V[3]*V[4]).

7
CURSO DE PROGRAMACIÓN FULL STACK

Introducción
a JAVA
FUNDAMENTOS DEL LENGUAJE
Introducción a Java
Hasta el momento hemos aprendido los diferentes tipos de estructuras de control
comunes a todos los lenguajes de programación, dentro del paradigma de programación
imperativa, haciendo uso del pseudo intérprete PSeInt. A partir de esta guía
comenzaremos a introducir cada uno de los conceptos vistos hasta el momento, pero
haciendo uso de un lenguaje de programación de propósito general como lo es Java.

JAVA
Java es un tipo de lenguaje de programación y una plataforma informática, creada y
comercializada por Sun Microsystems en el año 1995 y desde entonces se ha vuelto muy
popular, gracias a su fácil portabilidad a todos los sistemas operativos existentes.
Java es un lenguaje de programación de alto nivel, estos, permiten escribir código
mediante idiomas que conocemos (ingles, español, etc.) y luego, para ser ejecutados, se
traduce al lenguaje de máquina mediante traductores o compiladores. Java es un lenguaje
de alto nivel donde sus palabras reservadas están en ingles.

COMPILADOR EN JAVA
Permite traducir todo un programa de una sola vez, haciendo una ejecución más rápida y
puede almacenarse para usarse luego sin volver a hacer la traducción. Los programas de
Java se compilan a un lenguaje intermedio, denominado ByteCode. Este código es
interpretado por la maquina virtual de Java (JVM) del entorno de ejecución (JRE) y así se
consigue la portabilidad en distintas plataformas.

EJECUCIÓN DE UNA APLICACIÓN


En Java, todo el código fuente se escribe en archivos de texto plano cuya extensión
es .java, en el ejemplo: MyProgram.java. Posteriormente, al compilar el código fuente, el
compilador (javac) realiza un análisis de sintaxis del código escrito en los archivos fuente
de Java (con extensión *.java). Si no encuentra errores en el código genera los archivos
compilados con extensión .class. En caso de encontrar errores muestra la línea o líneas
erróneas en el código. Los archivos .class no contienen código nativo del procesador, sino
que contienen un conjunto de instrucciones que se denominan bytecodes, el lenguaje
máquina de la JVM. Las instrucciones en bytecodes son independientes del tipo de
computadora. Luego, el lanzador de aplicaciones java corre su aplicación con una
instancia de la JVM en una computadora específica (Windows, Unix, MacOS, etc).

1
ARCHIVO FUENTE EN JAVA
Un archivo fuente de la tecnología Java tiene la siguiente forma:

[<declaración_paquete>]
<declaración_importacion>*
<modificador>* <declaración_clase>{
<atributos>*
<constructores>*
<metodos>*
}

El orden de estos puntos es importante. Cualquier sentencia de importación debe


preceder todas las declaraciones de clases. Si usa una declaración de paquetes, el mismo
debe preceder tanto a las clases como a las importaciones. El nombre del archivo fuente
tiene que ser el mismo que el nombre de la declaración de la clase pública en ese archivo.
Un archivo fuente puede incluir más de una declaración de clase, pero sólo una puede ser
declarada pública. Si un archivo fuente no contiene clases públicas declaradas, el nombre
del archivo fuente no está restringido. Sin embargo, es una buena práctica tener un archivo
fuente para cada clase declarada y que el nombre del archivo sea idéntico al nombre de la
clase.

ESTRUCTURA DE UN PROGRAMA JAVA


Un programa describe cómo un ordenador debe interpretar las ordenes del programador
para que ejecute y realice las instrucciones dadas tal como están escritas. Un programador
utiliza los elementos que ofrece un lenguaje de programación para diseñar programas que
resuelvan problemas concretos o realicen acciones bien definidas.

El siguiente programa Java muestra un mensaje en la consola con el texto “Hola Mundo”.

/*
* Este programa escribe el texto "Hola Mundo" en la consola * utilizando
el método System.out.println()
*/

package primerprograma;

public class HolaMundo {

public static void main (String[] args) { System.out.println("Hola


Mundo");

En este programa se pueden identificar los siguientes elementos del lenguaje Java:
comentarios, paquete, definiciones de clase, definiciones de método y sentencias.

2
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 seria: ‘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.

PAQUETES
Después del comentario viene está escrito el nombre del paquete. Los paquetes son
contenedores de clases y su función es la de organizar la distribución de las clases. Los
paquetes y las clases son análogos a las carpetas y archivos utilizadas por el sistema
operativo, respectivamente.
El lenguaje de programación de la tecnología Java le provee la sentencia package como la
forma de agrupar clases relacionadas. La sentencia package tiene la siguiente forma:

package <nombre_paq_sup>[.<nombre_sub_paq>]*;

La declaración package, en caso de existir, debe estar al principio del archivo fuente y sólo
la declaración de un paquete está permitida. Los nombres de los paquetes los pondrá el
programador al crear el programa y son jerárquicos (al igual que una organización de
directorios en disco) además, están separados por puntos. Es usual que sean escritos
completamente en minúscula.

CLASES
La primera línea del programa, después del package. Define una clase que se llama
HolaMundo. En el mundo de orientación a objetos, todos los programas se definen en
término de objetos y sus relaciones. Las clases sirven para modelar los objetos que serán
utilizados por nuestros programas. Los objetos, las clases y los paquetes son conceptos
que serán abordados con profundidad más adelante en el curso.
Una clase está formada por una parte correspondiente a la declaración de la clase, y otra
correspondiente al cuerpo de la misma:

Declaración de clase {
Cuerpo de clase
}

En la plantilla de ejemplo se ha simplificado el aspecto de la Declaración de clase, pero sí


que puede asegurarse que la misma contendrá, como mínimo, la palabra reservada class y
el nombre que recibe la clase. La definición de la clase o cuerpo de las comienza con una
llave abierta ({) y termina con una llave cerrada (}). El nombre de la clase lo define el
programador

3
MÉTODOS
Después de la definición de clase se escribe la definición del método main(). Pero que es
un método?. Dentro del cuerpo de la clase se declaran los atributos y los métodos de la
clase. 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. Si bien es un tema sobre el que se profundizará más adelante en el curso,
los métodos son de vital importancia para los objetos y las clases. En un principio, para dar
los primeros pasos en Java nos alcanza con esta definición.

MÉTODO MAIN()
Ahora sabemos lo que es un método, pero en el ejemplo podemos ver el método main(). El
main() sirve para que un programa se pueda ejecutar, este método, vendría a representar el
Algoritmo / FinAlgoritmo de pseint y tiene la siguiente declaración:

public static void main(String[] args){

A continuación describirnos cada uno de los modificadores y componentes que se utilizan


siempre en la declaración del método main():

public: es un tipo de acceso que indica que el método main() es público y, por tanto, puede
ser llamado desde otras clases. Todo método main() debe ser público para poder
ejecutarse desde el intérprete Java (JVM).

static: es un modificador el cual indica que la clase no necesita ser instanciada para poder
utilizar el método. También indica que el método es el mismo para todas las instancias que
pudieran crearse.

void: indica que la función o método main() no devuelve ningún valor.

El método main() debe aceptar siempre, como parámetro, un vector de strings, que
contendrá los posibles argumentos que se le pasen al programa en la línea de comandos,
aunque como es nuestro caso, no se utilice.

Luego, al indicarle a la máquina virtual que ejecute una aplicación el primer método que
ejecutará es el método main() . Si indicamos a la máquina virtual que corra una clase que no
contiene este método, se lanzará un mensaje advirtiendo que la clase que se quiere
ejecutar no contiene un método main() , es decir que dicha clase no es ejecutable.

Si no se han comprendido hasta el momento muy bien todos estos conceptos, los mismos
se irán comprendiendo a lo largo del curso.

SENTENCIA
Son las unidades ejecutable más pequeña de un programa, en otras palabras una línea de
código escrita es una sentencia. Especifican y controlan el flujo y orden de ejecución del
programa. Una sentencia consta de palabras clave o reservadas como expresiones,
declaraciones de variables, o llamadas a funciones.
En nuestro ejemplo, 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.

4
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, donde se encuentran y el tipo de error que ha detectado: léxico,
sintáctico o semántico.

ELEMENTOS DE UN PROGRAMA
Los conceptos vistos previamente, son la estructura de un programa, pero también existen
los elementos de un programa. Estos son, básicamente, los componentes que van a
conformar las sentencias que podamos escribir en nuestro programa. Recordemos que
toda sentencia en nuestro programa debe terminar con el símbolo punto y coma Nos van a
ayudar para crear nuestro programa y resolver sus problemas. Estos elementos siempre
estarán dentro de un programa/algoritmo.
Los elementos de un programa son: identificadores, variables, constantes, operadores,
palabras reservadas.

PALABRAS RESERVADAS
Palabras que dentro del lenguaje significan la ejecución de una instrucción determinada,
por lo que no pueden ser utilizadas con otro fin. En Java, al ser un lenguaje que está creado
en ingles, todas nuestra palabras reservadas van a estar en ese idioma.

IDENTIFICADOR
Los identificadores son los nombres que se usan para identificar cada uno de los
elementos del lenguaje, como ser, los nombres de las variables, nombres de las clases,
interfaces, atributos y métodos de un programa. Si bien Java permite nombres de
identificadores tan largos que se desee, es aconsejable crearlos de forma que tengan
sentido y faciliten su interpretación. El nombre ideal para un identificador es aquel que no
se excede en longitud (lo más corto posible) y que califique claramente el concepto que
intenta representar en el contexto del problema que se está resolviendo.

VARIABLES Y CONSTANTES
Recordemos que en Pseint dijimos que los programas de computadora necesitan
información para la resolución de problemas. Está información puede ser un numero, un
nombre, etc. Para utilizar la información, vamos a guardarla en algo llamado, variables y
constantes. Las variables y constantes vendrían a ser como pequeñas cajas, que guardan
algo en su interior, en este caso información. Estas, van a contar como previamente
habíamos mencionado, con un identificador, un nombre que facilitara distinguir unas de
otras y nos ayudara a saber que variable o constante es la contiene la información que
necesitamos.

Dentro de toda la información que vamos a manejar, a veces, necesitaremos información


que no cambie. Tales valores son las constantes. De igual forma, existen otros valores que
necesitaremos que cambien durante la ejecución del programa; esas van a ser nuestras
variables.

5
DECLARACIÓN DE VARIABLES EN JAVA
Normalmente los identificadores de las variables y de las constantes con nombre deben
ser declaradas en los programas antes de ser utilizadas. La sintaxis de la declaración de
una variable en java suele ser:

<tipo_de_dato> <nombre_variable>;

TIPOS DE DATO EN JAVA


Java es un lenguaje de tipado estático, esto significa que todas las variables deben ser
declaradas antes que ellas puedan ser utilizadas y que no podemos cambiar el tipo de
dato de una variable, a menos que, sea a traves de una conversión.

TIPOS DE DATOS PRIMITIVOS


Primitivos: Son predefinidos por el lenguaje. La biblioteca Java proporciona clases
asociadas a estos tipos que proporcionan métodos que facilitan su manejo.

Byte Es un entero con signo de 8 bits, el mínimo valor que se puede almacenar es -
128 y el máximo valor es de 127 (inclusive).

Short Es un entero con signo de 16 bits. El valor mínimo es -32,768 y el valor máximo
32,767 (inclusive).

Integer Es un entero con signo de 32 bits. El valor mínimo es -2,147,483,648 y el valor


máximo es 2,147,483,64 (inclusive). Generalmente es la opción por defecto.

Long Es un entero con signo de 64 bits, el valor mínimo que puede almacenar este
tipo de dato es -9,223,372,036,854,775,808 y el máximo valor es
9,223,372,036,854,775,807 (inclusive).

Float Es un número decimal de precisión simple de 32 bits (IEEE 754 Punto


Flotante).

Double Es un número decimal de precisión doble de 64 bits (IEEE 754 Punto Flotante).

Boolean Este tipo de dato sólo soporta dos posibles valores: verdadero o falso y el dato
es representado con tan solo un bit de información.

6
Character El tipo de dato carácter es un simple carácter unicode de 16 bits. Su valor
mínimo es de '\u0000' (En entero es 0) y su valor máximo es de '\uffff' (En
entero es 65,535). Nota: un dato de tipo carácter se puede escribir entre
comillas simples, por ejemplo 'a', o también indicando su valor Unicode, por
ejemplo '\u0061'.

String Además de los tipos de datos primitivos el lenguaje de programación Java


provee también un soporte especial para cadena de caracteres a través de la
clase String.

Encerrando la cadena de caracteres con comillas dobles se creará de manera


automática una nueva instancia de un objeto tipo String.

String cadena = “Sebastián”;

Los objetos String son inmutables, esto significa que una vez creados, sus
valores no pueden ser cambiados. Si bien esta clase no es técnicamente un
tipo de dato primitivo, el lenguaje le da un soporte especial y hace parecer
como si lo fuera.

VALORES POR DEFECTO


En Java no siempre es necesario asignar valores cuando nuevos atributos son declarados.
Cuando los atributos son declarados, pero no inicializados, el compilador les asignará un
valor por defecto. A grandes rasgos el valor por defecto será cero o null dependiendo del
tipo de dato. La siguiente tabla resume los valores por defecto dependiendo del tipo de
dato.

byte 0

short 0

int 0

long 0

float 0.0

7
double 0.0

boolean false

char '\u0000'

String null

Objetos null

Las variables locales son ligeramente diferentes; el compilador no asigna un valor


predeterminado a una variable local no inicializada. Las variables locales son aquellas que
se declaran dentro de un método. Si una variable local no se inicializa al momento de
declararla, se debe asignar un valor antes de intentar usarla. El acceso a una variable local
no inicializada dará lugar a un error en tiempo de compilación.

OPERADORES
Los operadores son símbolos especiales de la plataforma que permiten especificar
operaciones en uno, dos o tres operandos y retornar un resultado. También aprenderemos
qué operadores poseen mayor orden de precedencia. Los operadores con mayor orden de
precedencia se evalúan siempre primero.

Primeramente, proceden los operadores unarios, luego los aritméticos, después los de bits,
posteriormente los relacionales, detrás vienen los booleanos y por último el operador de
asignación. La regla de precedencia establece que los operadores de mayor nivel se
ejecuten primero. Cuando dos operadores poseen el mismo nivel de prioridad los mismos
se evalúan de izquierda a derecha.

OPERADOR DE ASIGNACIÓN

= Operador de Asignación Simple

8
OPERADORES ARITMÉTICOS

+ Operador de Suma

- Operador de Resta

* Operador de Multiplicación

/ Operador de División

% Operador de Módulo

OPERADORES UNARIOS

+ Operador Unario de Suma; indica que el valor es positivo.

- Operador Unario de Resta; indica que el valor es negativo.

++ Operador de Incremento.

-- Operador de Decremento.

! Operador Lógico de Negación.

Operadores de Igualdad y Relación

== Igual

!= Distinto

> Mayor que

9
>= Mayor o igual que

< Menor que

<= Menor o igual que

Operadores Condicionales

&& AND

|| OR

?: Ternario

OPERADOR DE COMPARACIÓN DE TIPO

instanceof Compara un objeto con un tipo específico

TIPOS DE INSTRUCCIONES
Además de los elementos de un programa/algoritmo, tenemos las instrucciones que
pueden componer un programa. Las instrucciones —acciones— básicas que se pueden
implementar de modo general en un algoritmo y que esencialmente soportan todos los
lenguajes son las siguientes:

✓ Instrucciones de inicio/fin, son utilizadas para delimitar bloques de código.

✓ Instrucciones de asignación, se utilizan para asignar el resultado de la evaluación de


una expresión a una variable. El valor (dato) que se obtiene al evaluar la expresión es
almacenado en la variable que se indique.
<nombre de la variable> ← <expresión>

expresión es igual a una expresión matemática o lógica, a una variable o constante.


✓ Instrucciones de lectura, se utilizan para leer datos de un dispositivo de entrada y se
asignan a las variables.

10
✓ Instrucciones de escritura, se utilizan para escribir o mostrar mensajes o contenidos de
las variables en un dispositivo de salida.

✓ Instrucciones de bifurcación, mediante estas instrucciones el desarrollo lineal de un


programa se interrumpe. Las bifurcaciones o al flujo de un programa puede ser según
el punto del programa en el que se ejecuta la instrucción hacia adelante o hacia atrás.

INSTRUCCIONES PRIMITIVAS
Dentro de las instrucciones previamente vistas, existe un subdivisión que son las
instrucciones primitivas, las instrucciones primitivas van a ser las instrucciones de
asignación, lectura y escritura.

ASIGNACIÓN
La instrucción de asignación permite almacenar un valor en una variable (previamente
definida). Esta es nuestra manera de guardar información en una variable, para utilizar ese
valor en otro momento.

<variable> = <expresión>

En Java, podemos definir una variable y al mismo tiempo podemos asignarle un valor a
diferencia de Pseint:

<tipo_de_dato> <nombre_variable> = expresion;

Al ejecutarse la asignación, primero se evalúa la expresión de la derecha y luego se asigna


el resultado a la variable de la izquierda. El tipo de la variable y el de la expresión deben
coincidir.

ENTRADA Y SALIDA DE INFORMACIÓN


Los cálculos que realizan las computadoras requieren, para ser útiles la entrada de los
datos necesarios para ejecutar las operaciones que posteriormente se convertirán en
resultados, es decir, salida.
Las operaciones de entrada permiten leer determinados valores y asignarlos a
determinadas variables y las operaciones de salida permiten escribir o mostrar resultados
de determinadas variables y las operaciones, o simplemente mostrar mensajes.

ESCRITURA EN JAVA
En nuestro ejemplo de más arriba usábamos la instrucción System.out.println() para
mostrar el mensaje Hola Mundo. Esta instrucción permite mostrar valores en el Output, que
es la interfaz grafica de Java. Todo lo que quisiéramos mostrar en nuestra interfaz grafica,
deberá ir entre comillas dobles y dentro del paréntesis.

System.out.println(“Hola Mundo”);

Si quisiéramos que concatenar un mensaje y la impresión de una variable deberíamos usar


el símbolo más para poder lograrlo.

11
System.out.println(“La variable tiene el valor de: ” + variable);

Y si quisieramos escribir sin que haya saltos de linea, deberiamos quitarle el ln a nuestro
System.out.println.

System.out.print(“Hola”);

System.out.print(“Mundo”);

LECTURA O ENTRADA EN JAVA


En Java hay muchas maneras de ingresar información en el Output por teclado en nuestro
programa Java, en el curso vamos a usar la clase Scanner.
Scanner es una clase en el paquete java.util utilizada para obtener la entrada de los tipos
primitivos como int, double etc. y también String. Es la forma más fácil de leer datos en un
programa Java.

Ejemplo definición clase Scanner:

Scanner leer = new Scanner(System.in);

• Este objeto Scanner vamos a tener que importarlo para poder usarlo, ya que es una
herramienta que nos provee Java. Para importarlo vamos a utilizar la palabra clave
import, seguido de la declaración de la librería donde se encuentra el Scanner. Esta
sentencia, va debajo de la sentencia package. La sentencia se ve así: import
java.util.Scanner;
• Para crear un objeto de clase Scanner, normalmente pasamos el objeto
predefinido System.in, que representa el flujo de entrada estándar.
• Se le puso el nombre leer, pero se le puede el nombre que nosotros quisiéramos.
• Para utilizar las funciones del objeto Scanner, vamos a utilizar el nombre que le hemos
asignado y después del nombre ponemos un punto(.), de esa manera podremos llamar
a las funciones del Scanner.
• Para leer valores numéricos de un determinado tipo de datos, la función que se utilizará
es nextT(). Por ejemplo, para leer un valor de tipo int (entero), podemos usar nextInt(),
para leer un valor de tipo double(real), usamos nextDouble() y etc. Para leer un
String (cadenas), usamos nextLine().

Podemos usarlo cuando definimos la variable:

int numero = leer.nextInt();

Podemos usarlo con una variable pre definida:

int numero;

numero = leer.nextInt();

Proyecto con ejemplo de Lectura y Entrada en Java

12
INSTRUCCIONES DE BIFURCACIÓN
Mediante estas instrucciones el desarrollo lineal de un programa se interrumpe. Las
bifurcaciones o al flujo de un programa puede ser según el punto del programa en el que
se ejecuta la instrucción hacia adelante o hacia atrás. De esto se encargan las estructuras
de control.

ESTRUCTURAS DE CONTROL
Las estructuras de control son construcciones hechas a partir de palabras reservadas del
lenguaje que permiten modificar el flujo de ejecución de un programa. De este modo,
pueden crearse construcciones de alternativas mediante sentencias condicionales y
bucles de repetición de bloques de instrucciones. Hay que señalar que un bloque de
instrucciones se encontrará encerrado mediante llaves {……..} si existe más de una
instrucción.

ESTRUCTURAS CONDICIONALES
Los condicionales son estructuras de control que cambian el flujo de ejecución de un
programa de acuerdo a si se cumple o no una condición. Cuando el flujo de control del
programa llega al condicional, el programa evalúa la condición y determina el camino a
seguir. Existen dos tipos de estructuras condicionales, las estructuras if / else y la estructura
switch.

If/Else

La estructura if es la más básica de las estructuras de control de flujo. Esta estructura le


indica al programa que ejecute cierta parte del código sólo si la condición evaluada es
verdadera («true»). La forma más simple de esta estructura es la siguiente:

if(<condición>){
<sentencias>
}

En donde, <condición> es una expresión condicional cuyo resultado luego de la evaluación


es un dato booleano(lógico) verdadero o falso. El bloque de instrucciones <sentencias> se
ejecuta si, y sólo si, la expresión (que debe ser lógica) se evalúa a true, es decir, se cumple
la condición.

Luego, en caso de que la condición no se cumpla y se quiera ejecutar otro bloque de


código, otra forma de expresar esta estructura es la siguiente:

if(<condición>){
<sentencias A>
} else {
<sentencias B>
}

El flujo de control del programa funciona de la misma manera, cuando se ejecuta la


estructura if, se evalúa la expresión condicional, si el resultado de la condición es
verdadero se ejecutan las sentencias que se encuentran contenidas dentro del bloque de
código if (<sentencias A>). Contrariamente, se ejecutan las sentencias contenidas dentro
del bloque else (<sentencias B>).

13
En muchas ocasiones, se anidan estructuras alternativas if-else, de forma que se pregunte
por una condición si anteriormente no se ha cumplido otra y así sucesivamente.

if (<condicion1>) {
<sentencias A>
} else if(<condicion2>){
<sentencias B>
} else {
<sentencias C>
}

Al contrario de la estructura if / else, la estructura switch permite cualquier cantidad de


rutas de ejecución posibles. Un switch funciona con los datos primitivos byte, short, char e
int. También funciona con Enumeraciones, tema que se verá más adelante en el curso, y
con unas cuantas clases especiales que «envuelven» a ciertos tipos primitivos: Character,
Byte, Short e Integer (tema que trataremos cuando se profundice en Orientación a
Objetos).

Switch

El bloque switch evalúa qué valor tiene la variable, y de acuerdo al valor que posee ejecuta
las sentencias del bloque case correspondiente, es decir, del bloque case que cumpla con
el valor de la variable que se está evaluando dentro del switch.

switch(<variable>) {
case <valor1>:
<sentencias1>
break;
case <valor2>:
<sentencias2>
break;
default:
<sentencias3>
}

El uso de la sentencia break que va detrás de cada case termina la sentencia switch que la
envuelve, es decir que el control de flujo del programa continúa con la primera sentencia
que se encuentra a continuación del cierre del bloque switch. Si el programa comprueba
que se cumple el primer valor (valor1) se ejecutará el bloque de instrucciones
<sentencias1>, pero si no se encuentra inmediatamente la sentencia break también se
ejecutarían las instrucciones <sentencias2>, y así sucesivamente hasta encontrarse con la
palabra reservada break o llegar al final de la estructura.

Las instrucciones dentro del bloque default se ejecutan cuando la variable que se está
evaluando no coincide con ninguno de los valores case. Esta sentencia equivale al else de
la estructura if-else.

Proyecto con ejemplos de las estructuras secuenciales

14
ESTRUCTURAS REPETITIVAS
Durante el proceso de creación de programas, es muy común, encontrarse con que una
operación o conjunto de operaciones deben repetirse muchas veces. Para ello es
importante conocer las estructuras de algoritmos que permiten repetir una o varias
acciones, un número determinado de veces.
Las estructuras que repiten una secuencia de instrucciones un número determinado de
veces se denominan bucles, y se denomina iteración al hecho de repetir la ejecución de
una secuencia de acciones.
Todo bucle tiene que llevar asociada una condición, que es la que va a determinar cuándo
se repite el bucle y cuando deja de repetirse.

While

La estructura while ejecuta un bloque de instrucciones mientras se cumple una condición.


La condición se comprueba antes de empezar a ejecutar por primera vez el bucle, por lo
tanto, si la condición se evalúa a «false» en la primera iteración, entonces el bloque de
instrucciones no se ejecutará ninguna vez.

while (<condición>) {
<sentencias>
}

Do / While

En este tipo de bucle, el bloque instrucciones se ejecuta siempre al menos una vez. El
bloque de instrucciones se ejecutará mientras la condición se evalúe a «true». Por lo tanto,
entre las instrucciones que se repiten deberá existir alguna que, en algún momento, haga
que la condición se evalúe a «false», de lo contrario el bucle será infinito.

do {
<sentencias>
} while (<condición>);

La diferencia entre do-while y while es que do-while evalúa su condición al final del bloque
en lugar de hacerlo al inicio. Por lo tanto, el bloque de sentencia después del “do” siempre
se ejecutan al menos una vez.

For

La estructura for proporciona una forma compacta de recorrer un rango de valores cuando
la cantidad de veces que se deber iterar un bloque de código es conocida. La forma
general de la estructura for se puede expresar del siguiente modo:

for (<inicialización>; <terminación>; <incremento>) {


<sentencias>
}

15
La expresión <inicialización> inicializa el bucle y se ejecuta una sola vez al iniciar el bucle.
El bucle termina cuando al evaluar la expresión <terminación> el resultado que se obtiene
es false. La expresión <incremento> se invoca después de cada iteración que realiza el
bucle; esta expresión incrementa o decrementa un valor hasta que se cumpla la condición
de <terminación> del bucle.

La estructura for también ha sido mejorada para iterar de manera más compacta las
colecciones y los arreglos, tema que se verá más adelante en este curso. Esta versión
mejorada se conoce como for-each.

Como regla general puede decirse que se utilizará el bucle for cuando se conozca de
antemano el número exacto de veces que ha de repetirse un determinado bloque de
instrucciones. Se utilizará el bucle do-while cuando no se conoce exactamente el número
de veces que se ejecutará el 3bucle, pero se sabe que por lo menos se ha de ejecutar una.
Se utilizará el bucle while cuando es posible que no deba ejecutarse ninguna vez.

Proyecto con ejemplos de estructuras repetitvas

Sentencias de Salto

En Java existen dos formas de realizar un salto incondicional en el flujo “normal” de un


programa. A saber, las instrucciones break y continue.

Break

La instrucción break sirve para abandonar una estructura de control, tanto de las
condicionales (if-else y switch) como de las repetitivas (for, do-while y while). En el
momento que se ejecuta la instrucción break, el control del programa sale de la estructura
en la que se encuentra contenida y continua con el programa.

Continue

La sentencia continue corta la iteración en donde se encuentra el continue, pero en lugar


de salir del bucle, continúa con la siguiente iteración. La instrucción continue transfiere el
control del programa desde la instrucción continue directamente a la cabecera del bucle
(for, do-while o while) donde se encuentra.

Proyecto con ejemplos de sentencias de salto

SUBPROGRAMAS
Un método muy útil para solucionar un problema complejo es dividirlo en subproblemas —
problemas más sencillos— y a continuación dividir estos subproblemas en otros más
simples, hasta que los problemas más pequeños sean fáciles de resolver. Esta técnica de
dividir el problema principal en subproblemas se suele denominar “divide y vencerás”.

16
El problema principal se soluciona por el correspondiente programa o algoritmo principal,
mientras que la solución de los subproblemas será a través de subprogramas, conocidos
como procedimientos o funciones. Un subprograma es un como un mini algoritmo, que
recibe los datos, necesarios para realizar una tarea, desde el programa y devuelve los
resultados de esa tarea.

FUNCIONES
Las funciones o métodos son un conjunto de líneas de código (instrucciones),
encapsulados en un bloque, usualmente según los parámetros definidos en la función,
esta recibe argumentos, cuyos valores se utilizan para efectuar operaciones y
adicionalmente retornan un valor. En otras palabras, una función según sus parámetros,
puede recibir argumentos (algunas no reciben nada), hace uso de dichos valores
recibidos como sea necesario y retorna un valor usando la instrucción return, si no
retorna es otro tipo de función. Los tipos que pueden usarse en la función son: int, doble,
long, boolean, String y char.
A estas funciones les vamos a asignar un tipo de acceso y un modificador. Estos dos
conceptos los vamos a ver mejor más adelante, pero por ahora siempre vamos a crear
las funciones con el acceso public y el modificador static. Para saber más sobre estos
dos temas, leer la explicación del método main.

[acceso][modificador][tipo] nombreFuncion([tipo] nombreArgumento, …….){

/*
* Bloque de instrucciones
*/

return valor;
}

PROCEDIMIENTOS (Funciones sin retorno)


Los procedimientos son básicamente un conjunto de instrucciones que se ejecutan sin
retornar ningún valor, hay quienes dicen que un procedimiento no recibe valores o
argumentos, sin embargo, en la definición no hay nada que se lo impida. En el contexto de
Java un procedimiento es básicamente una función cuyo tipo de retorno es void, los que
indica que devuelven ningún resultado.

[acceso][modificador] void nombreFuncion([tipo] nombreArgumento.){

/*
* Bloque de instrucciones
*/

Acerca de los argumentos o parámetros:

Hay algunos detalles respecto a los argumentos de un método, veamos:


* Una función, un método o un procedimiento pueden tener una cantidad infinita de
parámetros, es decir pueden tener cero, uno, tres, diez, cien o más parámetros. Aunque
habitualmente no suelen tener más de 4 o 5.

17
* Si una función tiene más de un parámetro cada uno de ellos debe ir separado por una
coma.
* Los argumentos de una función también tienen un tipo y un nombre que los identifica. El
tipo del argumento puede ser cualquiera y no tiene relación con el tipo del método.
* Al recibir un argumento nada nos obliga a hacer uso de éste al interior del método, sin
embargo, para que recibirlo si no lo vamos a usar.
* En java los argumentos que sean variables de tipos primitivos (int, double, char, etc.) se
van a pasar por valor, mientras que los objetos (String, Integer, etc.) y los arreglos se van a
pasar por referencia. Nota: el concepto de objetos lo vamos a ver más adelante.

Consejos acerca de return:

* Cualquier instrucción que se encuentre después de la ejecución de return NO


será ejecutada. Es común encontrar funciones con múltiples sentencias return al
interior de condicionales, pero una vez que el código ejecuta una sentencia return lo que
haya de allí hacia abajo no se ejecutará.
* El tipo de valor que se retorna en una función debe coincidir con el del tipo declarado a
la función, es decir si se declara int, el valor retornado debe ser un número entero.
* En el caso de los procedimientos (void) podemos usar la sentencia return pero sin
ningún tipo de valor, sólo la usaríamos como una manera de terminar la
ejecución del procedimiento.

ARREGLOS: VECTORES Y MATRICES


Un arreglo es un contenedor de objetos que tiene un número fijo de valores del mismo tipo.
El tamaño del arreglo es establecido cuando el arreglo es creado y luego de su creación su
tamaño es fijo, esto significa que no puede cambiar. Cada una de los espacios de un
arreglo es llamada elemento y cada elemento puede ser accedido por un índice numérico
que arranca desde 0 hasta el tamaño menos uno. Por ejemplo, si tenemos un vector de 5
elementos mis índices serian: 0-1-2-3-4

Al igual que la declaración de otros tipos de variables, la declaración de un arreglo tiene


dos componentes: el tipo de dato del arreglo y su nombre. El tipo de dato del arreglo se
escribe como tipo[] , en donde, tipo es el tipo de dato de cada elemento contenido en él.
Los corchetes sirven para indicar que esa variable va a ser un arreglo. El tamaño del arreglo
no es parte de su tipo (es por esto que los corchetes están vacíos).

Una vez declarado un arreglo hay que crearlo/dimensionarlo, es decir, hay que asignar al
arreglo un tamaño para almacenar los valores. La creación de un arreglo se hace con el
operador new . Recordemos que las matrices son bidimensionales por lo que tienen dos
tamaños, uno para las filas y otro para las columnas de la matriz.

Declaración y creación de un Vector

tipo[] arregloV = new tipo[Tamaño];

Declaración y creación de una Matriz

tipo[][] arregloM = new tipo[Filas][Columnas];

18
ASIGNAR ELEMENTOS A UN ARREGLO
Cuando queremos ingresar un elemento en nuestro arreglo vamos a tener que elegir el
subíndice en el que lo queremos guardar.
Una vez que tenemos el subíndice decidido tenemos que invocar nuestro vector por su
nombre y entre corchetes el subíndice en el que lo queremos guardar. Después,
pondremos el signo de igual (que es el operador de asignación) seguido del elemento a
guardar.
En las matrices vamos a necesitar dos subíndices y dos corchetes para representar la
posición de la fila y la columna donde queremos guardar el elemento.

Asignación de un Vector

vector[0] = 5;

Asignación de una Matriz

matriz[0][0] = 6;

Esta forma de asignación implica asignar todos los valores de nuestro arreglo de uno en
uno, esto va a conllevar un trabajo bastante grande dependiendo del tamaño de nuestro
arreglo.
Entonces, para poder asignar varios valores a nuestro arreglo y no hacerlo de uno en uno
usamos un bucle Para. El bucle Para, al poder asignarle un valor inicial y un valor final a una
variable, podemos adaptarlo fácilmente a nuestros arreglos. Ya que, pondríamos el valor
inicial de nuestro arreglo y su valor final en las respectivas partes del Para. Nosotros,
usaríamos la variable creada en el Para, y la pasaríamos a nuestro arreglo para representar
todos los subíndices del arreglo, de esa manera, recorriendo todas las posiciones y
asignándole a cada posición un elemento.
Para poder asignar varios elementos a nuestra matriz, usaríamos dos bucles Para anidados.,
ya que un Para recorrerá las filas (variable i) y otro las columnas (variable j).

Asignación de un Vector

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

vector[i] = 5;

Asignación de una Matriz

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

for (int j = 0; j < 3; j++) {

matriz[i][j] = 6;

Proyecto con ejemplos de vectores y matrices

19
VECTORES Y MATRICES EN SUBPROGRAMAS
Los arreglos se pueden pasar como parámetros a un subprograma (función o
procedimiento) del mismo modo que pasamos variables, poniendo el tipo de dato delante
del nombre del vector o matriz, pero deberemos sumarle las llaves para representar que es
un vector o matriz. Sin embargo, hay que tener en cuenta que la diferencia entre los
arreglos y las variables, es que como dijimos previamente los arreglos siempre se pasan
por referencia.

public static void llenarVector(int[] vector){

}
public static void mostrarMatriz(int[][] matriz){

A diferencia de Pseint, en Java si podemos devolver un vector o una matriz en una función
para usarla en otro momento. Lo que hacemos es poner como tipo de dato de la función, el
tipo de dato que tendra el vector y asi poder devolverlo.

public static int devolverVector(){

int[] vector = new int[5];

return vector;

20
CLASES DE UTILIDAD
Dentro del API de Java existe una gran colección de clases que son muy utilizadas en el
desarrollo de aplicaciones. Las clases de utilidad son clases que definen un conjunto de
métodos que realizan funciones, normalmente muy reutilizadas. Estas nos van a ayudar
junto con las estructuras de control, a lograr resolver problemas de manera más sencilla.

Entre las clases de utilidad de Java más utilizadas y conocidas están las siguientes: Arrays,
String, Integer, Math, Date, Calendar y GregorianCalendar. En esta guía solo vamos a ver la
Math, String para hacer algunos ejercicios y después veremos el resto en mayor
profundidad.

CLASE STRING
La clase String está orientada al manejo de cadenas de caracteres y pertenece al paquete
java.lang del API de Java. Los objetos que son instancias de la clase String, se pueden
crear a partir de cadenas constantes también llamadas literales, las cuales deben estar
contenidas entre comillas dobles. Una instancia de la clase String es inmutable, es decir,
una vez que se ha creado y se le ha asignado un valor, éste no puede modificarse
(añadiendo, eliminando o cambiando caracteres).

Al ser un objeto, una instancia de la clase String no sigue las normas de manipulación de
los datos de tipo primitivo con excepción del operador concatenación. El operador +
realiza una concatenación cuando, al menos, un operando es un String. El otro operando
puede ser de un tipo primitivo. El resultado es una nueva instancia de tipo String.

Método Descripción.

charAt(int index) Retorna el carácter especificado en la posición index

equals(String str) Sirve para comparar si dos cadenas son iguales.


Devuelve true si son iguales y false si no.

equalsIgnoreCase(String str) Sirve para comparar si dos cadenas son iguales,


ignorando la grafía de la palabra. Devuelve true si son
iguales y false si no.

compareTo(String otraCadena) Compara dos cadenas de caracteres alfabéticamente.


Retorna 0 si son iguales, entero negativo si la primera es
menor o entero positivo si la primera es mayor.

21
concat(String str) Concatena la cadena del parámetro al final de la
primera cadena.

contains(CharSequence s) Retorna true si la cadena contiene la secuencia tipo


char del parámetro.

endsWith(String suffix) Retorna verdadero si la cadena es igual al objeto del


parámetro

indexOf(String str) Retorna el índice de la primera ocurrencia de la cadena


del parámetro

isEmpty() Retorna verdadero si la longitud de la cadena es 0

length() Retorna la longitud de la cadena

replace(char oldChar, char newChar) Retorna una nueva cadena reemplazando los
caracteres del primer parámetro con el carácter del
segundo parámetro

split(String regex) Retorna un arreglo de cadenas separadas por la cadena


del parámetro

startsWith(String prefix) Retorna verdadero si el comienzo de la cadena es igual


al prefijo del parámetro

substring(int beginIndex) Retorna la sub cadena desde el carácter del parámetro

substring(int beginIndex, int endIndex) Retorna la sub cadena desde el carácter del primer
parámetro hasta el carácter del segundo parámetro

toCharArray() Retorna el conjunto de caracteres de la cadena

toLowerCase() Retorna la cadena en minúsculas

22
toUpperCase() Retorna la cadena en mayúsculas

Java al ser un lenguaje de tipado estático, requiere que para pasar una variable de un tipo
de dato a otro necesitemos usar un conversor. Por lo que, para convertir cualquier tipo de
dato a un String, utilicemos la función valueOf(n).

Ejemplo:

int numEntero = 4;
String numCadena= String.valueOf(numEntero);

Si quisieramos hacerlo al revés, de String a int se usa el método de la clase Integer,


parseInt().

Ejemplo:

String numCadena = "1";

int numEntero = Integer.parseInt(numCadena);

CLASE MATH
En ocasiones nos vemos en la necesidad de incluir cálculos, operaciones
matemáticas, estadísticas, etc en nuestros programas java. Es cierto que muchos cálculos
se pueden hacer simplemente utilizando los operadores aritméticos que java pone a
nuestra disposición, pero existe una opción mucho más sencilla de utilizar, sobre todo
para cálculos complicados. Esta opción es la clase Math del paquete java.lang.

La clase Math nos ofrece numerosos y valiosos métodos y constantes estáticos, que
podemos utilizar tan sólo anteponiendo el nombre de la clase.

Método. Descripción.

abs(double a) Devuelve el valor absoluto de un valor double introducido como


parámetro.

abs(int a) Devuelve el valor absoluto de un valor Entero introducido como


parámetro.

abs(long a) Devuelve el valor absoluto de un valor long introducido como


parámetro.

23
max(double a, double b) Devuelve el mayor de dos valores double

max(int a, int b) Devuelve el mayor de dos valores Enteros.

max(long a, long b) Devuelve el mayor de dos valores long.

min(double a, double b) Devuelve el menor de dos valores double.

min(int a, int b) Devuelve el menor de dos valores enteros.

min(long a, long b) Devuelve el menor de dos valores long.

pow(double a, double b) Devuelve el valor del primer argumento elevado a la potencia del
segundo argumento.

random() Devuelve un double con un signo positivo, mayor o igual que 0.0 y
menor que 1.0.

round(double a) Devuelve el long redondeado más cercano al double introducido.

sqrt(double a) Devuelve la raíz cuadrada positiva correctamente redondeada de


un double.

floor(double a) Devuelve el entero más cercano por debajo.

Método random() de la clase Math


El método random podemos utilizarlo para generar números al azar. El rango o margen con
el que trabaja el método random oscila entre 0.0 y 1.0 (Este último no incluido)

Por lo tanto, para generar un número entero entre 0 y 9, hay que escribir la siguiente
sentencia:

int numero = (int) (Math.random() * 10);

Proyecto con ejemplos de las funciones de la clase String y Math

24
PREGUNTAS DE APRENDIZAJE
1) El archivo de un programa en Java debe terminar con la extensión de archivo:
a) .class
b) .java
c) .jar
d) Ninguna de las anteriores

2) Cuando se compila un programa en Java, el archivo producido por el compilador


termina con la extensión:
a) .class
b) .java
c) .jar
d) Ninguna de las anteriores

3) ¿Qué es el bytecode en Java?


a) El formato de intercambio de datos
b) El formato que obtenemos tras compilar un código fuente .java
c) Un tipo de variable
d) Un depurador de código

4) Una aplicación ejecutable que representa un procesador genérico sobre el cual se


ejecutan los bytecodes de Java es:
a) La máquina virtual de Java (JVM)
b) Ambiente de ejecución de Java
c) Librerías de clases Java
d) Ninguna de las anteriores

5) ¿Con qué se comienza la ejecución de un programa Java?


a) Con package
b) Con códigos
c) Con el programa o método main()
d) Todas las anteriores

6) Teniendo en cuenta que los paquetes y las clases son análogos a las carpetas y
archivos utilizados por el sistema operativo, ¿el nombre de la clase debe ser
diferente al del paquete?
a) Siempre
b) Nunca
c) No importa
d) Ninguna de las anteriores

7) ¿El llamado a una librería se hace haciendo uso de la sentencia:


a) String
b) Continue
c) Package
d) Import

25
8) El double se aplica para datos tipo:
a) Entero
b) Decimal
c) Carácter
d) Ninguno de los anteriores

9) Para mostrar mensajes por pantalla se usa:


a) System.out.printer()
b) System.out.prin()
c) System.out.println()
d) Ninguna de las anteriores

10) ¿Cuáles son las sentencias de iteración?


a) El Bucle for, while y do/while
b) Bucle for e if/else
c) Bucle while y switch
d) Ninguna de las anteriores

11) ¿Cuáles son las sentencias de salto?


a) Try y break
b) Break y continue
c) Continue y switch
d) While y break

12) ¿Qué diferencia hay entre un bucle while y un bucle for?


a) El bucle for puede llegar a ejecutarse nunca pero el while siempre se ejecuta al
menos una vez.
b) El bucle for se ejecuta un número determinado de veces y el while un número
indeterminado de veces
c) El bucle for no puede convertirse en un bucle while, pero sí al contrario.
d) El bucle while permite su inicialización, pero el bucle for no lo permite.

PREGUNTAS EXTRA:
Investigar la documentación de la clase System y responder:

• ¿Que representa la clase System?


• ¿Para qué sirve el atributo out de la clase System?
• ¿Para qué sirve el atributo in de la clase System?
• ¿Para qué sirve el atributo err de la clase System?

26
EJERCICIOS DE APRENDIZAJE

PRIMEROS PASOS
1. Instalando Java: La primera tarea que tenemos que llevar adelante es la instalación
del entorno de desarrollo.

Kit de Desarrollo Java

Lo primero que haremos será instalar Java en nuestras computadoras. Para ello debemos
descargarlo a través del siguiente link:

Java SE Development Kit 8 Downloads

Una vez instalado vamos a corroborar de que el entorno ha sido instalado de manera
correcta. En la consola ejecutaremos el siguiente comando:

java -version

Si todo se instaló correctamente deberíamos obtener una respuesta como esta:

java version "1.8.0_211"


Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

ENTORNOS DE DESARROLLO

Una vez instalado Java procedemos a instalar un entorno de desarrollo que proporciona
una serie de servicios y herramientas integrales que tienen como fin facilitar las tareas de
desarrollo, testing e implementación de software. Para llevar adelante el curso
recomendamos instalar NetBeans, pero se puede utilizar cualquiera de los siguientes IDEs:

NetBeans IDE

27
A partir de ahora comenzaremos a aprender cómo los mismos algoritmos que diseñamos
en PSeInt podemos escribirlos también en Java, simplemente haciendo una traducción de
cada una de las estructuras de control vistas en PSeInt a Java.

Si bien en esta guía se proponen nuevos problemas, se sugiere que los mismos ejercicios
ya implementados en PSeInt sean traducidos al lenguaje de programación Java.

VER VIDEO: Primer programa en Java con Netbeans

Para la realización cada uno de los siguientes ejercicios se debe definir una clase y colocar
toda la implementación dentro del método main() de dicha clase, tal cual se indica en el
video.

Dificultad Baja Dificultad Media Dificultad Alta

2. Escribir un programa que pida dos números enteros por teclado y calcule la suma
de los dos. El programa deberá después mostrar el resultado de la suma

3. Escribir un programa que pida tu nombre, lo guarde en una variable y lo muestre


por pantalla.

4. Escribir un programa que pida una frase y la muestre toda en mayúsculas y


después toda en minúsculas. Nota: investigar la función toUpperCase() y
toLowerCase() en Java.

5. Dada una cantidad de grados centígrados se debe mostrar su equivalente en


grados Fahrenheit. La fórmula correspondiente es: F = 32 + (9 * C / 5).

6. Escribir un programa que lea un número entero por teclado y muestre por pantalla
el doble, el triple y la raíz cuadrada de ese número. Nota: investigar la función
Math.sqrt().

VER VIDEO: Condicionales en Java

7. Implementar un programa que dado dos números enteros determine cuál es el


mayor y lo muestre por pantalla.

8. Crear un programa que dado un numero determine si es par o impar.

9. Crear un programa que pida una frase y si esa frase es igual a “eureka” el programa
pondrá un mensaje de Correcto, sino mostrará un mensaje de Incorrecto. Nota:
investigar la función equals() en Java.

10. Realizar un programa que solo permita introducir solo frases o palabras de 8 de
largo. Si el usuario ingresa una frase o palabra de 8 de largo se deberá de imprimir
un mensaje por pantalla que diga “CORRECTO”, en caso contrario, se deberá
imprimir “INCORRECTO”. Nota: investigar la función Lenght() en Java.

28
11. Escriba un programa que pida una frase o palabra y valide si la primera letra de esa
frase es una ‘A’. Si la primera letra es una ‘A’, se deberá de imprimir un mensaje por
pantalla que diga “CORRECTO”, en caso contrario, se deberá imprimir
“INCORRECTO”. Nota: investigar la función Substring y equals() de Java.

12. Considera que estás desarrollando una web para una empresa que fabrica motores
(suponemos que se trata del tipo de motor de una bomba para mover fluidos).
Definir una variable tipoMotor y permitir que el usuario ingrese un valor entre 1 y 4.
El programa debe mostrar lo siguiente:

o Si el tipo de motor es 1, mostrar un mensaje indicando “La bomba es una


bomba de agua”.
o Si el tipo de motor es 2, mostrar un mensaje indicando “La bomba es una
bomba de gasolina”.
o Si el tipo de motor es 3, mostrar un mensaje indicando “La bomba es una
bomba de hormigón”.
o Si el tipo de motor es 4, mostrar un mensaje indicando “La bomba es una
bomba de pasta alimenticia”.
o Si no se cumple ninguno de los valores anteriores mostrar el mensaje “No
existe un valor válido para tipo de bomba”

VER VIDEO: Bucles y sentencias de salto break y continue

13. Escriba un programa que valide si una nota está entre 0 y 10, sino está entre 0 y 10
la nota se pedirá de nuevo hasta que la nota sea correcta.

14. Escriba un programa en el cual se ingrese un valor límite positivo, y a continuación


solicite números al usuario hasta que la suma de los números introducidos supere
el límite inicial.

15. Realizar un programa que pida dos números enteros positivos por teclado y
muestre por pantalla el siguiente menú:

MENU
1. Sumar
2. Restar
3. Multiplicar
4. Dividir
5. Salir
Elija opción:

El usuario deberá elegir una opción y el programa deberá mostrar el resultado por
pantalla y luego volver al menú. El programa deberá ejecutarse hasta que se elija la
opción 5. Tener en cuenta que, si el usuario selecciona la opción 5, en vez de salir
del programa directamente, se debe mostrar el siguiente mensaje de confirmación:
¿Está seguro que desea salir del programa (S/N)? Si el usuario selecciona el
carácter ‘S’ se sale del programa, caso contrario se vuelve a mostrar el menú.

29
16. Escriba un programa que lea 20 números. Si el número leído es igual a cero se debe
salir del bucle y mostrar el mensaje "Se capturó el numero cero". El programa
deberá calcular y mostrar el resultado de la suma de los números leídos, pero si el
número es negativo no debe sumarse. Nota: recordar el uso de la sentencia break.

17. Realizar un programa que simule el funcionamiento de un dispositivo RS232, este


tipo de dispositivo lee cadenas enviadas por el usuario. Las cadenas deben llegar
con un formato fijo: tienen que ser de un máximo de 5 caracteres de largo, el primer
carácter tiene que ser X y el último tiene que ser una O.
Las secuencias leídas que respeten el formato se consideran correctas, la
secuencia especial “&&&&&” marca el final de los envíos (llamémosla FDE), y toda
secuencia distinta de FDE, que no respete el formato se considera incorrecta.
Al finalizar el proceso, se imprime un informe indicando la cantidad de lecturas
correctas e incorrectas recibidas. Para resolver el ejercicio deberá investigar cómo
se utilizan las siguientes funciones de Java Substring(), Length(), equals().

18. Necesitamos mostrar un contador con 3 dígitos (X-X-X), que muestre los números
del 0-0-0 al 9-9-9, con la particularidad que cada vez que aparezca un 3 lo sustituya
por una E. Ejemplo:

0-0-0
0-0-1
0-0-2
0-0-E
0-0-4
.
.
0-1-2
0-1-E

Nota: investigar función equals() y como convertir números a String.

19. Dibujar un cuadrado de N elementos por lado utilizando el carácter “*”. Por ejemplo,
si el cuadrado tiene 4 elementos por lado se deberá dibujar lo siguiente:

****
* *
* *
****

20. Realizar un programa que lea 4 números (comprendidos entre 1 y 20) e imprima el
número ingresado seguido de tantos asteriscos como indique su valor. Por ejemplo:

5 *****
3 ***
11 ***********
2 **

30
21. Crea una aplicación que a través de una función nos convierta una cantidad de
euros introducida por teclado a otra moneda, estas pueden ser a dólares, yenes o
libras. La función tendrá como parámetros, la cantidad de euros y la moneda a
converir que será una cadena, este no devolverá ningún valor y mostrará un
mensaje indicando el cambio (void).

El cambio de divisas es:


* 0.86 libras es un 1 €
* 1.28611 $ es un 1 €
* 129.852 yenes es un 1 €

VER VIDEO: Vectores y Matrices en Java

22. Realizar un algoritmo que rellene un vector con los 100 primeros números enteros y
los muestre por pantalla en orden descendente.

23. Realizar un algoritmo que rellene un vector de tamaño N con valores aleatorios y le
pida al usuario un numero a buscar en el vector. El programa mostrará donde se
encuentra el numero y si se encuentra repetido

24. Recorrer un vector de N enteros contabilizando cuántos números son de 1 dígito,


cuántos de 2 dígitos, etcétera (hasta 5 dígitos).

25. Realizar un programa que rellene un matriz de 4 x 4 de valores aleatorios y


muestre traspuesta. ¿Que es una matriz traspuesta?

26. Realice un programa que compruebe si una matriz dada es anti simétrica. Se dice
que una matriz A es anti simétrica cuando ésta es igual a su propia traspuesta, pero
cambiada de signo. Es decir, A es anti simétrica si A = -AT. La matriz traspuesta de
una matriz A se denota por AT y se obtiene cambiando sus filas por columnas (o
viceversa).

Ejemplo:

En este caso la matriz es anti simétrica.

31
27. Un cuadrado mágico 3 x 3 es una matriz 3 x 3 formada por números del 1 al 9
donde la suma de sus filas, sus columnas y sus diagonales son idénticas. Crear un
programa que permita introducir un cuadrado por teclado y determine si este
cuadrado es mágico o no. El programa deberá comprobar que los números
introducidos son correctos, es decir, están entre el 1 y el 9.

28. Dadas dos matrices cuadradas de números enteros, la matriz M de 10x10 y la matriz
P de 3x3, se solicita escribir un programa en el cual se compruebe si la matriz P está
contenida dentro de la matriz M. Para ello se debe verificar si entre todas las
submatrices de 3x3 que se pueden formar en la matriz M, desplazándose por filas o
columnas, existe al menos una que coincida con la matriz P. En ese caso, el
programa debe indicar la fila y la columna de la matriz M en la cual empieza el
primer elemento de la submatriz P.

Ejemplo:

Como podemos observar nuestra submatriz P se encuentra en la matriz M en los


índices: 4,4 - 4,5 - 4,6 - 5,4 - 5,5 - 5,6 - 6,4 - 6,5 - 6,6.

32
EJERCICIOS DE APRENDIZAJE EXTRA
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos
pueden realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que
venimos trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas,
podes continuar con estos ejercicios extra, recordando siempre que no es necesario que
los termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es
ayudar a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es
que puedas explicar el ejercicio con la intención de que tu compañero lo comprenda, y no
sólo mostrarlo. ¡Muchas gracias!

1. Dado un tiempo en minutos, calcular su equivalente en días y horas. Por ejemplo, si


el usuario ingresa 1600 minutos, el sistema debe calcular su equivalente: 1 día, 2
horas.

2. Declarar cuatro variables de tipo entero A, B, C y D y asignarle un valor diferente a


cada una. A continuación, realizar las instrucciones necesarias para que: B tome el
valor de C, C tome el valor de A, A tome el valor de D y D tome el valor de B.
Mostrar los valores iniciales y los valores finales de cada variable. Utilizar sólo una
variable auxiliar.

3. Elaborar un algoritmo en el cuál se ingrese una letra y se detecte si se trata de una


vocal. Caso contrario mostrar un mensaje. Nota: investigar la función equals() de la
clase String.

4. Elaborar un algoritmo en el cuál se ingrese un número entre 1 y 10 y se muestre su


equivalente en romano.

¿No te acordás los números romanos? Consultalos acá.

5. Una obra social tiene tres clases de socios:

o Los socios tipo ‘A’ abonan una cuota mayor, pero tienen un 50% de
descuento en todos los tipos de tratamientos.
o Los socios tipo ‘B’ abonan una cuota moderada y tienen un 35% de
descuento para los mismos tratamientos que los socios del tipo A.
o Los socios que menos aportan, los de tipo ‘C’, no reciben descuentos sobre
dichos tratamientos.

Solicite una letra (carácter) que representa la clase de un socio, y luego un valor real
que represente el costo del tratamiento (previo al descuento) y determine el importe
en efectivo a pagar por dicho socio.

6. Leer la altura de N personas y determinar el promedio de estaturas que se


encuentran por debajo de 1.60 mts. y el promedio de estaturas en general.

33
7. Realice un programa que calcule y visualice el valor máximo, el valor mínimo y el
promedio de n números (n>0). El valor de n se solicitará al principio del programa y
los números serán introducidos por el usuario. Realice dos versiones del programa,
una usando el bucle “while” y otra con el bucle “do - while”.

8. Escriba un programa que lea números enteros. Si el número es múltiplo de cinco


debe detener la lectura y mostrar la cantidad de números leídos, la cantidad de
números pares y la cantidad de números impares. Al igual que en el ejercicio
anterior los números negativos no deben sumarse. Nota: recordar el uso de la
sentencia break.

9. Simular la división usando solamente restas. Dados dos números enteros mayores
que uno, realizar un algoritmo que calcule el cociente y el residuo usando sólo
restas. Método: Restar el dividendo del divisor hasta obtener un resultado menor
que el divisor, este resultado es el residuo, y el número de restas realizadas es el
cociente. Por ejemplo: 50 / 13:

50 – 13 = 37 una resta realizada


37 – 13 = 24 dos restas realizadas
24 – 13 = 11 tres restas realizadas
dado que 11 es menor que 13, entonces: el residuo es 11 y el cociente es 3.

¿Aún no lo entendiste? Consultá acá.

10. Realice un programa para que el usuario adivine el resultado de una multiplicación
entre dos números generados aleatoriamente entre 0 y 10. El programa debe
indicar al usuario si su respuesta es o no correcta. En caso que la respuesta sea
incorrecta se debe permitir al usuario ingresar su respuesta nuevamente. Para
realizar este ejercicio investigue como utilizar la función Math.random() de Java.

11. Escribir un programa que lea un número entero y devuelva el número de dígitos
que componen ese número. Por ejemplo, si introducimos el número 12345, el
programa deberá devolver 5. Calcular la cantidad de dígitos matemáticamente
utilizando el operador de división. Nota: recordar que las variables de tipo entero
truncan los números o resultados.

12. Crear un programa que dibuje una escalera de números, donde cada línea de
números comience en uno y termine en el número de la línea. Solicitar la altura de
la escalera al usuario al comenzar. Ejemplo: si se ingresa el número 3:

1
12
123

13. Se dispone de un conjunto de N familias, cada una de las cuales tiene una M
cantidad de hijos. Escriba un programa que pida la cantidad de familias y para
cada familia la cantidad de hijos para averiguar la media de edad de los hijos de
todas las familias.

34
14. Crea una aplicación que le pida dos números al usuario y este pueda elegir entre
sumar, restar, multiplicar y dividir. La aplicación debe tener una función para cada
operación matemática y deben devolver sus resultados para imprimirlos en el main.

15. Diseñe una función que pida el nombre y la edad de N personas e imprima los
datos de las personas ingresadas por teclado e indique si son mayores o menores
de edad. Después de cada persona, el programa debe preguntarle al usuario si
quiere seguir mostrando personas y frenar cuando el usuario ingrese la palabra
“No”.

16. Crea una aplicación que nos pida un número por teclado y con una función se lo
pasamos por parámetro para que nos indique si es o no un número primo, debe
devolver true si es primo, sino false.
Un número primo es aquel solo puede dividirse entre 1 y si mismo. Por ejemplo: 25
no es primo, ya que 25 es divisible entre 5, sin embargo, 17 si es primo.

¿Qué son los números primos?

17. Realizar un algoritmo que calcule la suma de todos los elementos de un vector de
tamaño N, con los valores ingresados por el usuario.

18. Escriba un programa que averigüe si dos vectores de N enteros son iguales (la
comparación deberá detenerse en cuanto se detecte alguna diferencia entre los
elementos).

19. Crear una función rellene un vector con números aleatorios, pasándole un arreglo
por parámetro. Después haremos otra función o procedimiento que imprima el
vector.

20. Los profesores del curso de programación de Egg necesitan llevar un registro de
las notas adquiridas por sus 10 alumnos para luego obtener una cantidad de
aprobados y desaprobados. Durante el periodo de cursado cada alumno obtiene 4
notas, 2 por trabajos prácticos evaluativos y 2 por parciales. Las ponderaciones de
cada nota son:

Primer trabajo práctico evaluativo 10%

Segundo trabajo práctico evaluativo 15%

Primer Integrador 25%

Segundo integrador 50%

Una vez cargadas las notas, se calcula el promedio y se guarda en el arreglo. Al final
del programa los profesores necesitan obtener por pantalla la cantidad de
aprobados y desaprobados, teniendo en cuenta que solo aprueban los alumnos
con promedio mayor o igual al 7 de sus notas del curso.

21. Realizar un programa que rellene una matriz de tamaño NxM con valores aleatorios
y muestre la suma de sus elementos.

35
22. Construya un programa que lea 5 palabras de mínimo 3 y hasta 5 caracteres y, a
medida que el usuario las va ingresando, construya una “sopa de letras para niños”
de tamaño de 20 x 20 caracteres. Las palabras se ubicarán todas en orden
horizontal en una fila que será seleccionada de manera aleatoria. Una vez
concluida la ubicación de las palabras, rellene los espacios no utilizados con un
número aleatorio del 0 al 9. Finalmente imprima por pantalla la sopa de letras
creada.

Nota: Para resolver el ejercicio deberá investigar cómo se utilizan las siguientes
funciones de Java substring(), Length() y Math.random().

23. Realizar un programa que complete un vector con los N primeros números de la
sucesión de Fibonacci. Recordar que la sucesión de Fibonacci es la sucesión de
los siguientes números:

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

Donde cada uno de los números se calcula sumando los dos anteriores a él. Por
ejemplo:
La sucesión del número 2 se calcula sumando (1+1)
Análogamente, la sucesión del número 3 es (1+2),
Y la del 5 es (2+3),
Y así sucesivamente…
La sucesión de Fibonacci se puede formalizar de acuerdo a la siguiente fórmula:

Fibonaccin = Fibonaccin-1 + Fibonaccin-2 para todo n>1


Fibonaccin = 1 para todo n<=1

Por lo tanto, si queremos calcular el término “n” debemos escribir una función que
reciba como parámetro el valor de “n” y que calcule la serie hasta llegar a ese valor.

Para conocer más acerca de la serie de Fibonacci consultar el siguiente link:


https://quantdare.com/numeros-de-fibonacci/

36
CURSO DE PROGRAMACIÓN FULL STACK

PROGRAMACIÓN
ORIENTADA A
OBJETOS
PARADIGMA ORIENTADO A OBJETOS
GUÍA DE PARADIGMA ORIENTADO A
OBJETOS
PARADIGMAS DE PROGRAMACIÓN
Un paradigma de programación es una manera o estilo de programación. Existen
diferentes formas de diseñar un programa y varios modos de trabajar para obtener los
resultados que necesitan los programadores. Por lo que un paradigma de programación se
trata de un conjunto de métodos sistemáticos aplicables en todos los niveles del diseño de
programas para resolver problemas.

PROGRAMACIÓN ORIENTADA A OBJETOS


La Programación Orientada a Objetos (POO) es un paradigma de programación, es decir,
un modelo o un estilo de programación que se basa en el concepto de clases y objetos.
Este tipo de programación se utiliza para estructurar un programa de software en piezas
simples y reutilizables de código (clases) para crear instancias individuales de objetos.

Con el paradigma de Programación Orientado a Objetos lo que buscamos es dejar de


centrarnos en la lógica pura de los programas, para empezar a pensar en objetos, lo que
constituye la base de este paradigma.

La programación orientada a objetos se enfoca en los objetos, sus atributos y las


interacciones que se producen entre ellos para diseñar programas.
Un programa orientado a objetos es, esencialmente, un conjunto de objetos que se crean,
interaccionan entre si y dejan de existir cuando ya no son útiles durante la ejecución de un
programa. Un programa puede llegar a ser muy complejo. La complejidad es más
manejable cuando se descompone y se organiza en partes pequeñas y simples, los
objetos.

¿POR QUÉ POO?


La Programación Orientada a objetos permite que el código sea reutilizable, organizado y
fácil de mantener. Sigue el principio de desarrollo de software utilizado por muchos
programadores DRY (Don’t Repeat Yourself), para evitar duplicar el código y crear de esta
manera programas eficientes. Además, evita el acceso no deseado a los datos o la
exposición de código propietario mediante la encapsulación y la abstracción, de la que
hablaremos en detalle más adelante.

CLASES Y OBJETOS
Una clase es un molde para crear múltiples objetos que encapsula datos y comportamiento.
Una clase es una combinación específica de atributos y métodos y puede considerarse un
tipo de dato de cualquier tipo no primitivo. Así, una clase es una especie de plantilla o
prototipo de objetos: define los atributos que componen ese tipo de objetos y los métodos
que pueden emplearse para trabajar con esos objetos. En su forma más simple, una clase
se define por la palabra reservada class seguida del nombre de la clase. El nombre de la
clase debe empezar por mayúscula.

1
Si el nombre es compuesto, entonces cada palabra debe empezar por mayúscula. La
definición de la clase se pone entre las llaves de apertura y cierre.

public class NombreClase {

// atributos

// constructores

// metodos

Una vez que se ha declarado una clase, se pueden crear objetos a partir de ella. A la creación
de un objeto se le denomina instanciación. Por esta razón que se dice que un objeto es una
instancia de una clase y el término instancia y objeto se utilizan indistintamente. Para crear
objetos, basta con declarar una variable de alguno de los tipos de las clases definidas.

NombreClase nombreObjeto;

Para crear el objeto y asignar un espacio de memoria es necesario realizar la instanciación


con el operador new. El operador new instancia el objeto y reserva espacio en memoria para
los atributos y devuelve una referencia que se guarda en la variable.

nombreObjeto = new nombreClase();

Tanto la declaración de un objeto como la asignación del espacio de memoria se pueden


realizar en un solo paso:

NombreClase nombreObjeto = new NombreClase();

A partir de este momento los objetos ya pueden ser referenciados por su nombre.

ACCESO A LOS ATRIBUTOS


Desde un objeto se puede acceder a los atributos mediante la siguiente sintaxis:

nombreObjeto.atributo;

ESTADO Y COMPORTAMIENTO
En términos más generales, un objeto es una abstracción conceptual del mundo real que se
puede traducir a un lenguaje de programación orientado a objetos. Los objetos del mundo
real comparten dos características: Todos poseen estado y comportamiento. Por ejemplo, el
perro tiene estado (color, nombre, raza, edad) y el comportamiento (ladrar, caminar, comer,
acostarse, mover la cola). Por lo tanto, un estado permite informar cuáles son las
características del objeto y lo que este representa, y el comportamiento, consiste en decir lo
que sabe hacer.

El estado de un objeto es una lista de variables conocidas como sus atributos, cuyos valores
representan el estado que caracteriza al objeto.

El comportamiento es una lista de métodos, procedimientos, funciones u operaciones que


un objeto puede ejecutar a solicitud de otros objetos. Los objetos también se conocen como
instancias.

2
ELEMENTOS DE UNA CLASE
Una clase describe un tipo de objetos con características comunes. Es necesario definir la
información que almacena el objeto y su comportamiento.

ATRIBUTOS
El estado o información de un objeto se almacena en atributos. Los atributos pueden ser de
tipos primitivos de Java (descriptos en la guía Intro Java) o del tipo de otros objetos. La
declaración de un atributo de un objeto tiene la siguiente forma:

<modificador>* <tipo> <nombre> [ = <valor inicial> ];

• <nombre>: puede ser cualquier identificador válido y denomina el atributo que está
siendo declarado.
• <modificador>: si bien hay varios valores posibles para el <modificador>, por el momento
solo usaremos modificadores de visibilidad: public, protected, private.
• <tipo>: indica la clase a la que pertenece el atributo definido.
• <valor inicial>: esta sentencia es opcional y se usa para inicializar el atributo del objeto
con un valor particular.

Estos atributos irán al principio de la clase.

CONSTRUCTORES
Además de definir los atributos de un objeto, es necesario definir los métodos que
determinan su comportamiento. Toda clase debe definir un método especial denominado
constructor para instanciar los objetos de la clase. Este método tiene el mismo nombre de
la clase. La declaración básica toma la siguiente forma:

[<modificador>] <nombre de clase> ( <argumento>* ) {

<sentencia>*

• <nombre de clase>: El nombre del constructor debe ser siempre el mismo que el de la
clase.
• <modificador>: Actualmente, los únicos modificadores válidos para los constructores son
public, protected y private.
• <argumentos>: es una lista de parámetros que tiene la misma función que en los métodos.

El método constructor se ejecuta cada vez que se instancia un objeto de la clase. Este
método se utiliza para inicializar los atributos del objeto que se instancia.

Para diferenciar entre los atributos del objeto y los identificadores de los parámetros del
método constructor, se utiliza la palabra this. De esta forma, los parámetros del método
pueden tener el mismo nombre que los atributos de la clase.

La instanciación de un objeto consiste en asignar un espacio de memoria al que se hace


referencia con el nombre del objeto. Los identificadores de los objetos permiten acceder a
los valores almacenados en cada objeto.

3
El Constructor por Defecto
Cada clase tiene al menos un constructor. Si no se escribe un constructor, el lenguaje de
programación Java le provee uno por defecto. Este constructor no posee argumentos y tiene
un cuerpo vacío. Si se define un constructor que no sea vacío, el constructor por defecto se
pierde, salvo que creemos un nuevo constructor vacio.

MÉTODOS
Los métodos son funciones que determinan el comportamiento de los objetos. Un objeto se
comporta de una u otra forma dependiendo de los métodos de la clase a la que pertenece.
Todos los objetos de una misma clase tienen los mismos métodos y el mismo
comportamiento. Para definir los métodos, el lenguaje de programación Java toma la
siguiente forma básica:

<modificador>* <tipo de retorno> <nombre> ( <argumento>>* ) {

<sentencias>*

return valorRetorno;

• <nombre>: puede ser cualquier identificador válido, con algunas restricciones basadas
en los nombres que ya están en uso.
• <modificador>: el segmento es opcional y puede contener varios modificadores
diferentes incluyendo a public, protected y private. Aunque no está limitado a estos.
• <tipo de retorno>: el tipo de retorno indica el tipo de valor devuelto por el método. Si el
método no devuelve un valor, debe ser declarado void. La tecnología Java es rigurosa
acerca de los valores de retorno. Si el tipo de retorno en la declaración del método es
un int, por ejemplo, el método debe devolver un valor int desde todos los posibles
caminos de retorno (y puede ser invocado solamente en contextos que esperan un int
para ser devuelto). Se usa la sentencia return dentro de un método para devolver un
valor.
• <argumento>: permite que los valores de los argumentos sean pasados hacia el método.
Los elementos de la lista están separados por comas y cada elemento consiste en un
tipo y un identificador.

Existen tres tipos de métodos: métodos de consulta, métodos de consulta y operaciones Los
métodos de consulta sirven para extraer información de los objetos, los métodos
modificadores sirven para modificar el valor de los atributos del objeto y las operaciones
definen el comportamiento de un objeto.

Para acceder a los atributos de un objeto se definen los métodos get y set. Los métodos get
se utilizan para consultar el estado de un objeto y los métodos set para modificar su estado.
Un método get se declara public y a continuación se indica el tipo de dato que devuelve. Es
un método de consulta. La lista de parámetros de un método get queda vacía. En el cuerpo
del método se utiliza return para devolver el valor correspondiente al atributo que se quiere
devolver, y al cual se hace referencia como this.nombreAtributo.

Por otra parte, un método set se declara public y devuelve void. La lista de parámetros de un
método set incluye el tipo y el valor a modificar. Es un método modificador. El cuerpo de un
método set asigna al atributo del objeto el parámetro de la declaración.

4
Por último, un método de tipo operación es aquel que realiza un cálculo o modifica el estado
de un objeto. Este tipo de métodos pueden incluir una lista de parámetros y puede devolver
un valor o no. Si el método no devuelve un valor, se declara void.

Invocación de métodos
Un método se puede invocar dentro o fuera de la clase donde se ha declarado. Si el método
se invoca dentro de la clase, basta con indicar su nombre. Si el método se invoca fuera de la
clase entonces se debe indicar el nombre del objeto y el nombre del método. Cuando se
invoca a un método ocurre lo siguiente:

• En la línea de código del programa donde se invoca al método se calculan los valores de
los argumentos.
• Los parámetros se inicializan con los valores de los argumentos.
• Se ejecuta el bloque código del método hasta que se alcanza return o se llega al final del
bloque.
• Si el método devuelve un valor, se sustituye la invocación por el valor devuelto.
• La ejecución del programa continúa en la siguiente instrucción donde se invocó el
método.

Parámetros y argumentos
Los parámetros de un método definen la cantidad y el tipo de dato de los valores que recibe
un método para su ejecución. Los argumentos son los valores que se pasan a un método
durante su invocación. El método recibe los argumentos correspondientes a los parámetros
con los que ha sido declarado. Un método puede tener tantos parámetros como sea
necesario. La lista de parámetros de la cabecera de un método se define con la siguiente
sintaxis:

tipo nombre [tipo nombre,]

Durante la invocación de un método es necesario que el número y el tipo de argumentos


coincidan con el número y el tipo de parámetros declarados en la cabecera del método.
Durante el proceso de compilación se comprueba que durante la invocación de un método
se pasan tantos argumentos como parámetros tiene declarados y que además coinciden
los tipos. Esta es una característica de los lenguajes que se denominan “strongly typed” o
“fuertemente tipados”.

Paso de parámetros
Cuando se invoca un método se hace una copia de los valores de los argumentos en los
parámetros. Esto quiere decir que, si el método modifica el valor de un parámetro, nunca se
modifica el valor original del argumento.

Cuando se pasa una referencia a un objeto se crea un nuevo alias sobre el objeto, de manera
que esta nueva referencia utiliza el mismo espacio de memoria del objeto original y esto
permite acceder al objeto original.

El valor de retorno
Un método puede devolver un valor. Los métodos que no devuelven un valor se declaran
void, mientras que los métodos que devuelven un valor indican el tipo que devuelven: int,
double, char, String o un tipo de objeto.

5
Sobrecarga de métodos
La sobrecarga de métodos es útil para que el mismo método opere con parámetros de
distinto tipo o que un mismo método reciba una lista de parámetros diferente. Esto quiere
decir que puede haber dos métodos con el mismo nombre que realicen dos funciones
distintas. La diferencia entre los métodos sobrecargados está en su declaración, y más
específicamente, en la cantidad y tipos de datos que reciben.

ABSTRACCIÓN Y ENCAPSULAMIENTO
La abstracción es la habilidad de ignorar los detalles de las partes para enfocar la atención
en un nivel más alto de un problema. El encapsulamiento sucede cuando algo es envuelto
en una capa protectora. Cuando el encapsulamiento se aplica a los objetos, significa que los
datos del objeto están protegidos, “ocultos” dentro del objeto. Con los datos ocultos, ¿cómo
puede el resto del programa acceder a ellos? (El acceso a los datos de un objeto se refiere
a leerlos o modificarlos.) El resto del programa no puede acceder de manera directa a los
datos de un objeto; lo tiene que hacer con ayuda de los métodos del objeto. Al hecho de
proteger los datos o atributos con los métodos se denomina encapsulamiento.

ABSTRACCIÓN
La abstracción es la propiedad que considera los aspectos más significativos o notables de
un problema y expresa una solución en esos términos. La abstracción posee diversos grados
o niveles de abstracción, los cuales ayudan a estructurar la complejidad intrínseca que
poseen los sistemas del mundo real. La abstracción encarada desde el punto de vista de la
programación orientada a objetos es el mecanismo por el cual se proveen los límites
conceptuales de los objetos y se expresan sus características esenciales, dejando de lado
sus características no esenciales. Si un objeto tiene más características de las necesarias
los mismos resultan difíciles de usar, modificar, construir y comprender. En el análisis hay
que concentrarse en ¿Qué hace? y no en ¿Cómo lo hace?

ENCAPSULAMIENTO
La encapsulación o encapsulamiento significa reunir en una cierta estructura a todos los
elementos que a un cierto nivel de abstracción se pueden considerar pertenecientes a una
misma entidad, y es el proceso de agrupamiento de datos y operaciones relacionadas bajo
una misma unidad de programación, lo que permite aumentar la cohesión de los
componentes del sistema.

El encapsulamiento oculta lo que hace un objeto de lo que hacen otros objetos y del mundo
exterior por lo que se denomina también ocultación de datos. Un objeto tiene que presentar
“una cara” al mundo exterior de modo que se puedan iniciar sus operaciones.
Los métodos operan sobre el estado interno de un objeto y sirven como el mecanismo
primario de comunicación entre objetos. Ocultar el estado interno y hacer que toda
interacción sea a través de los métodos del objeto es un mecanismo conocido como
encapsulación de datos.

6
MODIFICADORES DE ACCESO
Para lograr el uso correcto del encapsulamiento vamos utilizar los modificadores de acceso,
estos, van a dejarnos elegir como se accede a los datos y a través de que se accede a dichos
datos. Todas las clases poseen diferentes niveles de acceso en función del modificador de
acceso (visibilidad). A continuación, se detallan los niveles de acceso con sus símbolos
correspondientes:

• Public: Este modificador permite a acceder a los elementos desde cualquier clase,
independientemente de que esta pertenezca o no al paquete en que se encuentra el
elemento.

• Private: Es el modificador más restrictivo y especifica que los elementos que lo utilizan
sólo pueden ser accedidos desde la clase en la que se encuentran. Este modificador
sólo puede utilizarse sobre los atributos de una clase y sobre interfaces y clases internas,
no sobre clases o interfaces de primer nivel, dado que esto no tendría sentido. Es
importante destacar también que el modificador private convierte los elementos en
privados para otras clases, no para otras instancias de la clase. Es decir, un objeto de una
determinada clase puede acceder a los atributos privados de otro objeto de la misma
clase.

• Protected: Este modificador indica que los elementos sólo pueden ser accedidos desde
su mismo paquete y desde cualquier clase que extienda la clase en que se encuentra,
independientemente de si esta se encuentra en el mismo paquete o no. Este
modificador, como private, no tiene sentido a nivel de clases o interfaces no internas.

Si no especificamos ningún modificador de acceso se utiliza el nivel de acceso por defecto


(Default), que consiste en que el elemento puede ser accedido sólo desde las clases que
pertenezcan al mismo paquete. Los distintos modificadores de acceso quedan resumidos
en la siguiente tabla

Visibilidad Public Private Protected Default

Desde la misma Clase SI SI SI SI


Desde cualquier Clase del SI NO SI SI
mismo Paquete

Desde una Subclase del SI NO SI SI


mismo Paquete

Desde una Subclase fuera del SI NO SI, a través de NO


mismo Paquete la herencia

Desde cualquier Clase fuera SI NO NO NO


del Paquete

7
ATRIBUTOS Y METODOS ESTÁTICOS
Un atributo o un método de una clase se puede modificar con la palabra reservada static
para indicar que este atributo o método no pertenece a las instancias de la clase si no a la
propia clase.

Se dice que son atributos de clase si se usa la palabra clave static: en ese caso la variable es
única para todas las instancias (objetos) de la clase (ocupa un único lugar en memoria), es
decir que, si se poseen múltiples instancias de una clase, cada una de ellas no tendrán una
copia propia de este atributo, si no que todas estas instancias compartirán una misma copia
del atributo. A veces a las variables de clase se les llama variables estáticas. Si no se usa
static, el sistema crea un lugar nuevo para esa variable con cada instancia (la variable es
diferente para cada objeto).

En el caso de una constante no tiene sentido crear un nuevo lugar de memoria por cada
objeto de una clase que se cree. Por ello es adecuado el uso de la palabra clave static.
Cuando usamos “static final” se dice que creamos una constante de clase, un atributo común
a todos los objetos de esa clase.

public class Cuenta {

private static String saldo;

ATRIBUTOS FINALES
En este contexto indica que una variable es de tipo constante: no admitirá cambios después
de su declaración y asignación de valor. La palabra reservada final determina que un atributo
no puede ser sobrescrito o redefinido, es decir, no funcionará como una variable
“tradicional”, sino como una constante. Toda constante declarada con final ha de ser
inicializada en el mismo momento de declararla. El modificador final también se usa como
palabra clave en otro contexto: una clase final es aquella que no puede tener clases que la
hereden. Lo veremos más adelante cuando hablemos sobre herencia.

Cuando se declaran constantes es muy frecuente que los programadores usen letras
mayúsculas (como práctica habitual que permite una mayor claridad en el código), aunque
no es obligatorio.

Public class Perro {

private final int edad;

EN RESUMEN
Antes de POO, la técnica estándar de programación era la programación procedural. Se
denomina programación procedural porque en ella se destacan los procedimientos o
tareas que resuelven un problema. Se piensa primero en lo que se quiere hacer: los
procedimientos.
En contraste, el paradigma POO invita a pensar en lo que se desea que represente el
programa. Normalmente se responde esta invitación identificando algunas cosas en el
mundo que se desea que el programa modele.

8
Estas cosas podrían ser entidades físicas o conceptuales, por ejemplo, un libro. Una vez
identificadas las cosas que se quiere modelar, se identifican sus propiedades/atributos
básicos. Estos se pueden agrupar todos juntos en una estructura coherente llamada objeto
que creamos a través de las clases.

Proyecto con ejemplos de POO


El ejemplo está pensado para una pagina que va a administrar perros en su pagina web,
muestra las distintas maneras de llenar y de mostrar un objeto.

Link: Programación Orientada a Objetos

9
CLASES DE UTILIDAD PARTE 2
Recordemos que las clases de utilidad son clases dentro del API de Java que son muy
utilizadas en el desarrollo de aplicaciones. Las clases de utilidad son clases que definen un
conjunto de métodos que realizan funciones, normalmente muy reutilizadas. Estas nos van
a ayudar junto con las estructuras de control, a lograr resolver problemas de manera más
sencilla.

Entre las clases de utilidad de Java más utilizadas y conocidas están las siguientes: Arrays,
String, Integer, Math, Date, Calendar y GregorianCalendar. En la guía anterior vimos solo
las clases Math y String. Ahora vamos a ver el resto de las clases.

CLASE ARRAYS
La clase Arrays es una clase de utilidad que posee una gran cantidad de métodos para
manipular arreglos.

Método Descripción.

Arrays.equals(arreglo1, arreglo2) Retorna true o false, si dos arreglos del mismo tipo de dato
son iguales.

Arrays.fill(arreglo, variable) Este método lo que hace es inicializar todo el arreglo con la
variable o valor que pasamos como argumento. Este método
Arrays.fill(arreglo, int desde, int
se puede usar con cualquier tipo de dato y le podemos decir
hasta, variable)
desde y hasta que índice queremos que llene con ese valor.

Arrays.sort(arreglo) Este método sirve para ordenar un arreglo de manera


ascendente. A este método también le podemos decir
Arrays.sort(arreglo, int desde, int
desde y hasta que índice queremos que ordene.
hasta)

Arrays.binarySearch(arreglo,valor) Este método sirve para buscar un elemento determinado en


un arreglo. El método devuelve la posición en la cual se
encuentra el elemento. La implementación del algoritmo de
búsqueda utilizado es el de búsqueda binaria, por lo tanto,
antes de utilizar este método debemos asegurarnos que el
arreglo se encuentre ordenado.

10
Arrays.toString(arreglo) Este método imprime el arreglo como una cadena, la
cadena consiste en una lista de los elementos del arreglo
encerrados entre corchetes ("[]"). Los elementos adyacentes
están separados por comas (",").

CLASE INTEGER
La clase Integer permite convertir un tipo primitivo de dato int a objeto Integer. La clase
Integer pertenece al paquete java.lang del API de Java y hereda de la clase
java.lang.Number.

Método Descripción.

Integer(String s) Constructor que inicializa un objeto con una cadena de


caracteres. Esta cadena debe contener un número entero.

Compara dos objetos Integer numéricamente. Retorna 0 si


compareTo(entero, otroEntero) son iguales, entero negativo si el primer numero es menor
o entero positivo si el primer numero es mayor.

doubleValue() Retorna el valor del Integer en tipo primitivo double

Compara el Integer con el objeto del parámetro. Devuelve


equals(Object obj)
true si son iguales y false si no.

Convierte la cadena de caracteres numérica del parámetro


parseInt(String s)
en tipo primitivo int.

toString() Retorna el valor del Integer en una cadena de caracteres.

11
CLASE DATE
La clase Date modela objetos o variables de tipo fecha. La clase Date representa un
instante de tiempo específico con una precisión en milisegundos y permite el uso del
formato Universal Coordinated Time (UTC). Por otro lado, muchas computadoras están
definidas en términos de Greenwich Mean Time (GMT) que es equivalente a Universal Time
(UT). GMT es el nombre estándar y UT es el nombre científico del estándar. La diferencia
entre UT y UTC es que UTC está basado en un reloj atómico y UT está basado en un reloj
astronómico.

Las fechas en Java, comienzan en el valor standar based time llamado “epoch” que hace
referencia al 1 de Enero de 1970, 0 horas 0 minutos 0 segundos GMT.

La clase Date posee métodos que permiten la manipulación de fechas. La clase Date
pertenece al paquete java.util del API de Java.

Método Descripción.

Date() Constructor que inicializa la fecha en el milisegundo más


cercano a la fecha del sistema.

Date(int dia, int mes, int año) Constructor que inicializa la fecha sumándole 1900 al año.

Retorna verdadero si la fecha esta después de la fecha del


after(Date fecha2)
parámetro

Retorna verdadero si la fecha esta antes de la fecha del


before(Date fecha2)
parámetro

Compara la fecha con la del parámetro. Retorna 0 si son


compareTo(Date fecha) iguales, entero negativo si el primer numero es menor
o entero positivo si el primer numero es mayor.

Compara el Date con el objeto del parámetro. Devuelve true


equals(Object obj)
si son iguales y false si no.

Retorna el valor del día de la semana de la fecha. Ejemplo: si


getDay() es lunes devuelve 0, martes 1, miércoles 2, jueves 3, viernes
4, sábado 5 y domingo 6.

getDate() Retorna el numero del día de la fecha.

12
getMonth() Retorna el mes de la fecha.

getYear() Retorna el año de la fecha.

getTime() Retorna la fecha en milisegundos a partir del “epoch”.

setDate(int dia) Asigna un día a la fecha.

setMonth(int mes) Asigna un mes a la fecha.

setYear(int anio) Asigna un año a la fecha.

setTime(long time) Asigna la fecha en milisegundos a partir del “epoch”.

toString() Retorna la fecha en una cadena de caracteres.

Proyecto con ejemplos de Clase Utilidad


En este proyecto hay un Main con todas las clases de utilidad previamente vistas.

Link: Clases de Utilidad

13
PREGUNTAS DE APRENDIZAJE
1) Responda Verdadero (V) o Falso (F)

Cuando se coloca la palabra final precediendo la declaración de una ( ) ( )


variable la misma se transforma en una constante

Una variable local no puede ser declarada en cualquier lugar del ( ) ( )


cuerpo de una clase o método

El método constructor de una clase puede tener cualquier nombre ( ) ( )

Cuando un método no devuelve ningún valor se utiliza la palabra ( ) ( )


reservada void para indicar que no devuelve nada

La palabra reservada final determina que un atributo no puede ser ( ) ( )


redefinido

La devolución de un valor a través de un método se hace con la ( ) ( )


sentencia restore

2) ¿Cuál es la descripción que crees que define mejor el concepto clase en la


programación orientada a objetos?
a) Es un concepto similar al de array
b) Es un tipo particular de variable
c) Es un modelo o plantilla a partir de la cual creamos objetos
d) Es una categoría de datos ordenada secuencialmente

3) ¿Qué elementos crees que definen a un objeto?

a) Su cardinalidad y su tipo
b) Sus atributos y sus métodos
c) La forma en que establece comunicación e intercambia mensajes
d) Su interfaz y los eventos asociados

4) Una clase es:


a) Un molde para crear múltiples objetos
b) Un tipo de variable
c) Un tipo de modificador de acceso
d) Ninguna de las anteriores

5) El modificador de acceso private, hace que los datos puedan ser accedidos por
a) Cualquier clase
b) La clase donde se encuentran
c) El método main
d) Ninguna de las anteriores

14
6) ¿Qué significa instanciar una clase?

a) Duplicar una clase


b) Eliminar una clase
c) Crear un objeto a partir de la clase
d) Conectar dos clases entre sí

7) Queremos crear una clase Java con atributos que puedan ser accedidos, ¿qué opción
elegirías como la mejor?
a) Atributos públicos
b) Atributos static
c) Atributos privados con getters y setters
d) Ninguna de las anteriores

8) Se crean anteponiendo la palabra static a su declaración:

a) Atributos de objeto
b) Atributos de clase estáticos
c) Variables finales
d) Ninguna de las anteriores

9) No puede cambiar su valor durante la ejecución del programa:

a) Atributos de objeto
b) Atributos de clase
c) Variables finales
d) Todas las anteriores

15
EJERCICIOS DE APRENDIZAJE
Antes de comenzar con esta guía, les damos algunas recomendaciones:

Este módulo es uno de los más divertidos ya que vamos a comenzar a modelar los objetos
del mundo real con el lenguaje de programación Java. Es importante tener en cuenta que
entender la programación orientada a objetos lleva tiempo y sobre todo PRÁCTICA, así que,
a no desesperarse, con cada ejercicio vamos a ir entendiendo un poco más cómo aplicar
este paradigma.

A partir de esta guía todos los ejemplos de los videos serán desarrollados siguiendo el
ejemplo de un Tinder de Mascotas. A continuación, se presenta el contexto del problema
para entender los objetos del mundo real que vamos a modelar.

VER VIDEOS:

A. Introducción
B. Del Problema al Código

Realizar los siguientes ejercicios:

VER VIDEOS:

A. Mis Primeros Objetos


B. Constructor
C. Encapsulamiento Set
D. Encapsulamiento Get
E. Encapsulamiento Funciones del Objeto

1. Crear una clase llamada Libro que contenga los siguientes atributos: ISBN, Título,
Autor, Número de páginas, y un constructor con todos los atributos pasados por
parámetro y un constructor vacío. Crear un método para cargar un libro pidiendo los
datos al usuario y luego informar mediante otro método el número de ISBN, el título,
el autor del libro y el numero de páginas.

2. Declarar una clase llamada Circunferencia que tenga como atributo privado el radio
de tipo real. A continuación, se deben crear los siguientes métodos:

a) Método constructor que inicialice el radio pasado como parámetro.


b) Métodos get y set para el atributo radio de la clase Circunferencia.
c) Método para crearCircunferencia(): que le pide el radio y lo guarda en el atributo
del objeto.
d) Método area(): para calcular el área de la circunferencia (Area = π ∗ radio! ).
e) Método perimetro(): para calcular el perímetro (Perimetro = 2 ∗ π ∗ radio).

3. Crear una clase llamada Operacion que tenga como atributos privados numero1 y
numero2. A continuación, se deben crear los siguientes métodos:

a) Método constructor con todos los atributos pasados por parámetro.


b) Metodo constructor sin los atributos pasados por parámetro.
c) Métodos get y set.

16
d) Método para crearOperacion(): que le pide al usuario los dos números y los
guarda en los atributos del objeto.
e) Método sumar(): calcular la suma de los números y devolver el resultado al main.
f) Método restar(): calcular la resta de los números y devolver el resultado al main
g) Método multiplicar(): primero valida que no se haga una multiplicación por cero,
si fuera a multiplicar por cero, el método devuelve 0 y se le informa al usuario el
error. Si no, se hace la multiplicación y se devuelve el resultado al main
h) Método dividir(): primero valida que no se haga una división por cero, si fuera a
pasar una división por cero, el método devuelve 0 y se le informa al usuario el
error se le informa al usuario. Si no, se hace la división y se devuelve el resultado
al main.

4. Crear una clase Rectángulo que modele rectángulos por medio de un atributo
privado base y un atributo privado altura. La clase incluirá un método para crear el
rectángulo con los datos del Rectángulo dados por el usuario. También incluirá un
método para calcular la superficie del rectángulo y un método para calcular el
perímetro del rectángulo. Por último, tendremos un método que dibujará el
rectángulo mediante asteriscos usando la base y la altura. Se deberán además definir
los métodos getters, setters y constructores correspondientes.

Superficie = base * altura / Perímetro = (base + altura) * 2.

VER VIDEOS:

A. Entidad y Control
B. Pasaje por Referencia y por Valor en Java

5. Realizar una clase llamada Cuenta (bancaria) que debe tener como mínimo los
atributos: numeroCuenta (entero), el DNI del cliente (entero largo), el saldo actual. Las
operaciones asociadas a dicha clase son:

• Constructor por defecto y constructor con DNI, saldo, número de cuenta e interés.
• Agregar los métodos getters y setters correspondientes
• Metodo para crear un objeto Cuenta, pidiéndole los datos al usuario.
• Método ingresar(double ingreso): el método recibe una cantidad de dinero a
ingresar y se la sumara a saldo actual.
• Método retirar(double retiro): el método recibe una cantidad de dinero a retirar y
se la restará al saldo actual. Si la cuenta no tiene la cantidad de dinero a retirar, se
pondrá el saldo actual en 0.
• Método extraccionRapida(): le permitirá sacar solo un 20% de su saldo. Validar
que el usuario no saque más del 20%.
• Método consultarSaldo(): permitirá consultar el saldo disponible en la cuenta.
• Método consultarDatos(): permitirá mostrar todos los datos de la cuenta

6. Programa Nespresso. Desarrolle una clase Cafetera con los atributos


capacidadMaxima (la cantidad máxima de café que puede contener la cafetera) y
cantidadActual (la cantidad actual de café que hay en la cafetera). Implemente, al
menos, los siguientes métodos:

17
• Constructor predeterminado o vacío
• Constructor con la capacidad máxima y la cantidad actual
• Métodos getters y setters.
• Método llenarCafetera(): hace que la cantidad actual sea igual a la capacidad
máxima.
• Método servirTaza(int): se pide el tamaño de una taza vacía, el método recibe el
tamaño de la taza y simula la acción de servir la taza con la capacidad indicada. Si la
cantidad actual de café “no alcanza” para llenar la taza, se sirve lo que quede. El
método le informará al usuario si se llenó o no la taza, y de no haberse llenado en
cuanto quedó la taza.
• Método vaciarCafetera(): pone la cantidad de café actual en cero.
• Método agregarCafe(int): se le pide al usuario una cantidad de café, el método lo
recibe y se añade a la cafetera la cantidad de café indicada.

7. Realizar una clase llamada Persona que tenga los siguientes atributos: nombre, edad,
sexo ('H' hombre, 'M' mujer, 'O' otro), peso y altura. Si el alumno desea añadir algún
otro atributo, puede hacerlo. Los métodos que se implementarán son:

• Un constructor por defecto.


• Un constructor con todos los atributos como parámetro.
• Métodos getters y setters de cada atributo.
• Metodo crearPersona(): el método crear persona, le pide los valores de los atributos
al usuario y después se le asignan a sus respectivos atributos para llenar el objeto
Persona. Además, comprueba que el sexo introducido sea correcto, es decir, H, M o
O. Si no es correcto se deberá mostrar un mensaje
• Método calcularIMC(): calculara si la persona está en su peso ideal (peso en
kg/(altura^2 en mt2)). Si esta fórmula da por resultado un valor menor que 20, la
función devuelve un -1. Si la fórmula da por resultado un número entre 20 y 25
(incluidos), significa que el peso está por debajo de su peso ideal y la función
devuelve un 0. Finalmente, si el resultado de la fórmula es un valor mayor que 25
significa que la persona tiene sobrepeso, y la función devuelve un 1. Se recomienda
hacer uso de constantes para devolver estos valores.
• Método esMayorDeEdad(): indica si la persona es mayor de edad. La función
devuelve un booleano.

A continuación, en la clase main hacer lo siguiente:

Crear 4 objetos de tipo Persona con distintos valores, a continuación, llamaremos todos
los métodos para cada objeto, deberá comprobar si la persona está en su peso ideal,
tiene sobrepeso o está por debajo de su peso ideal e indicar para cada objeto si la
persona es mayor de edad.

Por último, guardaremos los resultados de los métodos calcularIMC y esMayorDeEdad


en distintas variables, para después en el main, calcular un porcentaje de esas 4
personas cuantas están por debajo de su peso, cuantas en su peso ideal y cuantos, por
encima, y también calcularemos un porcentaje de cuantos son mayores de edad y
cuantos menores.

18
CLASES DE UTILIDAD EN JAVA
Los métodos disponibles para las clases de utilidad Integer, Arrays y Date están en esta
guía. Recordar que la clase String y Math están explicadas en la guía anterior de Intro
Java.

VER VIDEO: Clases String e Integer

Ver más acerca de la clase String

Ver más acerca de la clase Integer

8. Realizar una clase llamada Cadena que tenga como atributos una frase (de tipo de
String) y su longitud. En el main se creará el objeto y se le pedirá al usuario que ingrese
una frase que puede ser una palabra o varias palabras separadas por un espacio en
blanco y a través de los métodos set, se guardará la frase y la longitud de manera
automática según la longitud de la frase ingresada. Deberá además implementar los
siguientes métodos:

• Método mostrarVocales(), deberá contabilizar la cantidad de vocales que tiene la


frase ingresada.
• Método invertirFrase(), deberá invertir la frase ingresada y mostrar la frase invertida
por pantalla. Por ejemplo: Entrada: "casa blanca", Salida: "acnalb asac".
• Método vecesRepetido(String letra), deberá recibir por parámetro un carácter
ingresado por el usuario y contabilizar cuántas veces se repite el carácter en la
frase, por ejemplo:
Entrada: frase = "casa blanca". Salida: El carácter 'a' se repite 4 veces.
• Método compararLongitud(String frase), deberá comparar la longitud de la frase
que compone la clase con otra nueva frase ingresada por el usuario.
• Método unirFrases(String frase), deberá unir la frase contenida en la clase Cadena
con una nueva frase ingresada por el usuario y mostrar la frase resultante.
• Método reemplazar(String letra), deberá reemplazar todas las letras “a” que se
encuentren en la frase, por algún otro carácter seleccionado por el usuario y
mostrar la frase resultante.
• Método contiene(String letra), deberá comprobar si la frase contiene una letra que
ingresa el usuario y devuelve verdadero si la contiene y falso si no.

VER VIDEO: Método Static y Clase Math

9. Realizar una clase llamada Matemática que tenga como atributos dos números reales
con los cuales se realizarán diferentes operaciones matemáticas. La clase deber tener
un constructor vacío, parametrizado y get y set. En el main se creará el objeto y se
usará el Math.random para generar los dos números y se guardaran en el objeto con
su respectivos set. Deberá además implementar los siguientes métodos:

• Método devolverMayor() para retornar cuál de los dos atributos tiene el mayor
valor

19
• Método calcularPotencia() para calcular la potencia del mayor valor de la clase
elevado al menor número. Previamente se deben redondear ambos valores.
• Método calculaRaiz(), para calcular la raíz cuadrada del menor de los dos valores.
Antes de calcular la raíz cuadrada se debe obtener el valor absoluto del número.

VER VIDEO: Clase Arrays

Ver más acerca de la clase Arrays

10. Realizar un programa en Java donde se creen dos arreglos: el primero será un arreglo
A de 50 números reales, y el segundo B, un arreglo de 20 números, también reales. El
programa deberá inicializar el arreglo A con números aleatorios y mostrarlo por
pantalla. Luego, el arreglo A se debe ordenar de menor a mayor y copiar los primeros
10 números ordenados al arreglo B de 20 elementos, y rellenar los 10 últimos
elementos con el valor 0.5. Mostrar los dos arreglos resultantes: el ordenado de 50
elementos y el combinado de 20.

VER VIDEOS:

Clase Date

Ver más acerca de la clase Date

11. Pongamos de lado un momento el concepto de POO, ahora vamos a trabajar solo con
la clase Date. En este ejercicio deberemos instanciar en el main, una fecha usando la
clase Date, para esto vamos a tener que crear 3 variables, dia, mes y anio que se le
pedirán al usuario para poner el constructor del objeto Date. Una vez creada la fecha
de tipo Date, deberemos mostrarla y mostrar cuantos años hay entre esa fecha y la
fecha actual, que se puede conseguir instanciando un objeto Date con constructor
vacío.

Ejemplo fecha: Date fecha = new Date(anio, mes, dia);

Ejemplo fecha actual: Date fechaActual = new Date();

Si necesiten acá tienen más información en clase Date: Documentación Oracle

12. Implemente la clase Persona. Una persona tiene un nombre y una fecha de
nacimiento (Tipo Date), constructor vacío, constructor parametrizado, get y set. Y los
siguientes métodos:

Ejemplo Date como atributo: DateAtributo

• Agregar un método de creación del objeto que respete la siguiente firma:


crearPersona(). Este método rellena el objeto mediante un Scanner y le pregunta
al usuario el nombre y la fecha de nacimiento de la persona a crear, recordemos
que la fecha de nacimiento debe guardarse en un Date y los guarda en el objeto.

20
• Escribir un método calcularEdad() a partir de la fecha de nacimiento ingresada.
Tener en cuenta que para conocer la edad de la persona también se debe
conocer la fecha actual.
• Agregar a la clase el método menorQue(int edad) que recibe como parámetro
otra edad y retorna true en caso de que el receptor tenga menor edad que la
persona que se recibe como parámetro, o false en caso contrario.
• Metodo mostrarPersona(): este método muestra la persona creada en el método
anterior.

21
EJERCICIOS DE APRENDIZAJE EXTRA
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos pueden
realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que venimos
trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas, podes
continuar con estos ejercicios extra, recordando siempre que no es necesario que los
termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es ayudar
a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es que puedas
explicar el ejercicio con la intención de que tu compañero lo comprenda, y no sólo mostrarlo.
¡Muchas gracias!

1. Desarrollar una clase Cancion con los siguientes atributos: titulo y autor. Se deberá́
definir además dos constructores: uno vacío que inicializa el titulo y el autor a cadenas
vacías y otro que reciba como parámetros el titulo y el autor de la canción. Se deberán
además definir los métodos getters y setters correspondientes.

2. Definir una clase llamada Puntos que contendrá las coordenadas de dos puntos, sus
atributos serán, x1, y1, x2, y2, siendo cada x e y un punto. Generar un objeto puntos
usando un método crearPuntos() que le pide al usuario los dos números y los ingresa
en los atributos del objeto. Después, a través de otro método calcular y devolver la
distancia que existe entre los dos puntos que existen en la clase Puntos. Para conocer
como calcular la distancia entre dos puntos consulte el siguiente link:
http://www.matematicatuya.com/GRAFICAecuaciones/S1a.html.

3. Vamos a realizar una clase llamada Raices, donde representaremos los valores de una
ecuación de 2o grado. Tendremos los 3 coeficientes como atributos, llamémosles a, b
y c. Hay que insertar estos 3 valores para construir el objeto a través de un método
constructor. Luego, las operaciones que se podrán realizar son las siguientes:

• Método getDiscriminante(): devuelve el valor del discriminante (double). El


discriminante tiene la siguiente formula: (b^2)-4*a*c
• Método tieneRaices(): devuelve un booleano indicando si tiene dos soluciones, para
que esto ocurra, el discriminante debe ser mayor o igual que 0.
• Método tieneRaiz(): devuelve un booleano indicando si tiene una única solución,
para que esto ocurra, el discriminante debe ser igual que 0.
• Método obtenerRaices(): llama a tieneRaíces() y si devolvió́ true, imprime las 2
posibles soluciones.
• Método obtenerRaiz(): llama a tieneRaiz() y si devolvió́ true imprime una única raíz.
Es en el caso en que se tenga una única solución posible.
• Método calcular(): esté método llamará tieneRaices() y a tieneRaíz(), y mostrará por
pantalla las posibles soluciones que tiene nuestra ecuación con los métodos
obtenerRaices() o obtenerRaiz(), según lo que devuelvan nuestros métodos y en
caso de no existir solución, se mostrará un mensaje.

Nota: Formula ecuación 2o grado: (-b±√((b^2)-(4*a*c)))/(2*a) Solo varia el signo


delante de -b

22
4. Dígito Verificador. Crear una clase NIF que se usará para mantener DNIs con su
correspondiente letra (NIF). Los atributos serán el número de DNI (entero largo) y la
letra (String o char) que le corresponde. Dispondrá de los siguientes métodos:

• Métodos getters y setters para el número de DNI y la letra.


• Método crearNif(): le pide al usuario el DNI y con ese DNI calcula la letra que le
corresponderá. Una vez calculado, le asigna la letra que le corresponde según el
resultado del calculo.
• Método mostrar(): que nos permita mostrar el NIF (ocho dígitos, un guion y la letra
en mayúscula; por ejemplo: 00395469-F).

La letra correspondiente al dígito verificador se calculará a traves de un método que


funciona de la siguiente manera: Para calcular la letra se toma el resto de dividir el
número de DNI por 23 (el resultado debe ser un número entre 0 y 22). El método debe
buscar en un array (vector) de caracteres la posición que corresponda al resto de la
división para obtener la letra correspondiente. La tabla de caracteres es la siguiente:

POSICIÓN LETRA

0 T

1 R

2 W

3 A

4 G

5 M

6 Y

7 F

8 P

9 D

10 X

11 B

12 N

13 J

14 Z

15 S

16 Q

17 V

18 H

19 L

20 C

21 K

22 E

23
5. Crea una clase en Java donde declares una variable de tipo array de Strings que
contenga los doce meses del año, en minúsculas. A continuación declara una variable
mesSecreto de tipo String, y hazla igual a un elemento del array (por ejemplo
mesSecreto = mes[9]. El programa debe pedir al usuario que adivine el mes secreto.
Si el usuario acierta mostrar un mensaje, y si no lo hace, pedir que vuelva a intentar
adivinar el mes secreto. Un ejemplo de ejecución del programa podría ser este:

Adivine el mes secreto. Introduzca el nombre del mes en minúsculas: febrero

No ha acertado. Intente adivinarlo introduciendo otro mes: agosto

No ha acertado. Intente adivinarlo introduciendo otro mes: octubre

¡Ha acertado!

6. Juego Ahorcado: Crear una clase Ahorcado (como el juego), la cual deberá contener
como atributos, un vector con la palabra a buscar, la cantidad de letras encontradas y
la cantidad jugadas máximas que puede realizar el usuario. Definir los siguientes
métodos con los parámetros que sean necesarios:

• Constructores, tanto el vacío como el parametrizado.


• Metodo crearJuego(): le pide la palabra al usuario y cantidad de jugadas máxima.
Con la palabra del usuario, pone la longitud de la palabra, como la longitud del vector.
Después ingresa la palabra en el vector, letra por letra, quedando cada letra de la
palabra en un índice del vector. Y también, guarda en cantidad de jugadas máximas,
el valor que ingresó el usuario y encontradas en 0.
• Método longitud(): muestra la longitud de la palabra que se debe encontrar. Nota:
buscar como se usa el vector.length.
• Método buscar(letra): este método recibe una letra dada por el usuario y busca sila
letra ingresada es parte de la palabra o no. También informará si la letra estaba o no.
• Método encontradas(letra): que reciba una letra ingresada por el usuario y muestre
cuantas letras han sido encontradas y cuantas le faltan. Este método además deberá
devolver true si la letra estaba y false si la letra no estaba, ya que, cada vez que se
busque una letra que no esté, se le restará uno a sus oportunidades.
• Método intentos(): para mostrar cuantas oportunidades le queda al jugador.
• Método juego(): el método juego se encargará de llamar todos los métodos
previamente mencionados e informará cuando el usuario descubra toda la palabra o
se quede sin intentos. Este método se llamará en el main.

Ejemplo vector como atributo: VectorAtributo

Un ejemplo de salida puede ser así:

Ingrese una letra:


a
Longitud de la palabra: 6
Mensaje: La letra pertenece a la palabra
Número de letras (encontradas, faltantes): (3,4)
Número de oportunidades restantes: 4

24
----------------------------------------------

Ingrese una letra:


z
Longitud de la palabra: 6
Mensaje: La letra no pertenece a la palabra
Número de letras (encontradas, faltantes): (3,4)
Número de oportunidades restantes: 3
---------------------------------------------

Ingrese una letra:


b
Longitud de la palabra: 6
Mensaje: La letra no pertenece a la palabra
Número de letras (encontradas, faltantes): (4,3)
Número de oportunidades restantes: 2

----------------------------------------------

Ingrese una letra:


u
Longitud de la palabra: 6
Mensaje: La letra no pertenece a la palabra
Número de letras (encontradas, faltantes): (4,3)
Número de oportunidades restantes: 1

----------------------------------------------

Ingrese una letra:


q
Longitud de la palabra: 6
Mensaje: La letra no pertenece a la palabra
Mensaje: Lo sentimos, no hay más oportunidades

25
Bibliografía
Información sacada de libros:

-Fundamentos de Programación de Luis Joyanes Aguilar

-Fundamentos de Programación Java de Jorge Martínez Ladrón de Guevara en conjunto


con la Facultad de Informática (Universidad Complutense de Madrid).

-Introducción a la programación Java de John S. Dean y Raymond H. Dean

Información sacada de las paginas:

- https://profile.es/blog/que-son-los-paradigmas-de-programacion/

- https://profile.es/blog/que-es-la-programacion-orientada-a-objetos/

26
CURSO DE PROGRAMACIÓN FULL STACK

COLECCIONES
PARADIGMA ORIENTADO A OBJETOS
GUÍA DE COLECCIONES

COLECCIONES
Previo a esta guía nosotros manejábamos nuestros objetos de uno en uno, no teníamos
manera de manejar varios objetos a la vez, para esto existen las colecciones.
Una colección representa un grupo de objetos. Esto objetos son conocidos como
elementos. Cuando queremos trabajar con un conjunto de elementos, necesitamos un
almacén donde poder guardarlos. Las colecciones nos dan la opción de almacenar
cualquier tipo de objeto, esto incluye los objetos de tipo de datos. Por lo que, para crear una
colección de un tipo de dato, no podremos usar los datos primitivos de los tipos de datos,
sino sus objetos. Por ejemplo: en vez de int, hay que utilizar Integer.
Las colecciones nos proveen con una serie de métodos comunes, para trabajar con los
elementos de la colección, como, por ejemplo: agregar y eliminar elementos o obtener el
tamaño de la colección, etc. Las colecciones son una especie de arrays de tamaño dinámico.
Estas son para del Java Collections Framework dentro del paquete java.util. El Collections
Framework es una arquitectura compuesta de interfaces y clases. Dentro de este framework
están las colecciones que vamos a trabajar, las listas, conjuntos y mapas. Nota: el concepto
de interfaces lo vamos a explicar más adelante.

¿QUÉ ES UN FRAMEWORK?
Un framework es un marco de trabajo el cual contiene un conjunto estandarizado de
conceptos, prácticas y criterios para hacer frente a un tipo de problemática particular y
resolver nuevos problemas de índole similar.

1
LISTAS
Las listas modelan una colección de objetos ordenados por posición. La principal diferencia
entre las listas y los arreglos tradicionales, es que la lista crece de manera dinámica a medida
que se van agregando objetos. No necesitamos saber de antemano la cantidad de
elementos con la que vamos a trabajar. El framework trae varias implementaciones de
distintos tipos de listas tales como ArrayList, LinkedList.

• ArrayList: se implementa como un arreglo de tamaño variable. A medida que se agregan


más elementos, su tamaño aumenta dinámicamente. Es el tipo más común.
Ejemplo de un ArrayList de numeros:

ArrayList<Integer> numeros = new ArrayList();

• LinkedList: se implementa como una lista de doble enlace. Su rendimiento al agregar y


quitar es mejor que Arraylist, pero peor en los métodos set y get.

Ejemplo de una LinkedList de numeros:

LinkedList<Integer> numeros = new LinkedList();

CONJUNTOS
Los conjuntos modelan una colección de objetos de una misma clase donde cada elemento
aparece sólo una vez, no puede tener duplicados, a diferencia de una lista donde los
elementos podían repetirse. El framework trae varias implementaciones de distintos tipos
de conjuntos:

• HashSet, se implementa utilizando una tabla hash para darle un valor único a cada
elemento y de esa manera evitar los duplicados. Los métodos de agregar y eliminar
tienen una complejidad de tiempo constante por lo que tienen mejor performance que
el Treeset.

Ejemplo de un HashSet de cadenas:

HashSet<String> nombres = new HashSet();

• TreeSet se implementa utilizando una estructura de árbol (árbol rojo-negro en el libro de


algoritmos). La gran diferencia entre el HashSet y el TreeSet, es que el TreeSet mantiene
todos sus elementos de manera ordenada(forma ascendente), pero los métodos de
agregar, eliminar son más lentos que el HashSet ya que cada vez que le entra un
elemento debe posicionarlo para que quede ordenado.

Ejemplo de un TreeSet de numeros:

TreeSet<Integer> numeros = new TreeSet();

• LinkedHashSet está entre HashSet y TreeSet. Se implementa como una tabla hash con
una lista vinculada que se ejecuta a través de ella, por lo que proporciona el orden de
inserción.

2
Ejemplo de un LinkedHashSet de cadenas:

LinkedHashSet<String> frases = new LinkedHashSet();

MAPAS
Los mapas modelan un objeto a través de una llave y un valor. Esto significa que cada valor
de nuestro mapa, va a tener una llave única para representar dicho valor. Las llaves de
nuestro mapa no pueden repetirse, pero los valores sí. Un ejemplo seria una persona que
tiene su dni/rut (llave única) y como valor puede ser su nombre completo, puede haber dos
personas con el mismo nombre, pero distinto dni/rut.
A la hora de crear un mapa tenemos que pensar que el primer tipo dato será el valor de la
llave y el segundo el valor del valor (valga la redundancia).
Son una de las estructuras de datos importantes del Framework de Collections. Las
implementaciones de mapas son HashMap, TreeMap, LinkedHashMap y HashTable.

• HashMap es un mapa implementado a través de una tabla hash, las llaves se almacenan
utilizando un algoritmo de hash para las llaves y evitar que se repitan.

Ejemplo de un HashMap de personas:

HashMap<Integer,String> personas = new HashMap();


• TreeMap es un mapa que ordena los elementos de manera ascendente a través de las
llaves.

Ejemplo de un TreeMap de personas:

TreeMap<Integer,String> personas = new TreeMap();

• LinkedHashMap es un HashMap que conserva el orden de inserción.

Ejemplo de un TreeMap de personas:

LinkedHashMap<Integer,String> personas = new LinkedHashMap();

AÑADIR UN ELEMENTO A UNA COLECCIÓN


Las colecciones constan con funciones para realizar distintas operaciones, en este caso si
queremos añadir un elemento a las listas o sets vamos a tener que utilizar la función add(T),
pero para los mapas vamos a utilizar la función put(llave,valor).

Listas:

ArrayList<Integer> numeros = new ArrayList();

int num = 20;

numeros.add(num);

3
Conjuntos:

HashSet<Integer> numeros = new HashSet();

int num = 20;

numeros.add(20);

Mapas:

HashMap<Integer, String> alumnos = new HashMap();

int dni = 34576189;

String nombreAlumno = “Pepe”

alumnos.put(dni, nombreAlumno);

RECORRER UNA COLECCIÓN


Si quisiéramos mostrar todos los elementos que le hemos agregado y que componen
nuestra colección vamos a tener que recorrerla.
Para recorrer una colección, vamos a tener que utilizar el bucle forEach. El bucle comienza
con la palabra clave for al igual que un bucle for normal. En lugar de declarar e inicializar
una variable contador del bucle, declara una variable vacia que es del mismo tipo que la
colección, seguido de dos puntos y seguido del nombre de la colección. La variable recibe
en cada iteración un elemento de la colección, de esa manera si nosotros mostramos esa
variable, podemos mostrar todos los elementos de nuestra colección.

Para recorrer mapas vamos a tener que usar el objeto Map.Entry en el for each. A traves de
el entry vamos a traer los valores y las llaves, si no podemos tener un for each para cada
parte de nuestro mapa sin utlilizar el objeto Map.Entry.

Para saber más sobre la clase Map y el objeto Entry: Map.Entry

For Each:

for ( Tipo de dato variable : Colección){

Listas:

ArrayList<String> lista = new ArrayList();

for (String cadena : lista) {

System.out.println(cadena); // mostramos los elementos a traves de la variable

4
Conjuntos:

HashSet<Integer> numerosSet = new HashSet();

for (Integer numero : numerosSet) {

System.out.println(numero); // mostramos los elementos a traves de la variable

Mapas:

HashMap<Integer, String> estudiantes = new HashMap();

// Recorrer las dos partes del mapa

for (Map.Entry<Integer, String> entry : estudiantes.entrySet()) {

System.out.println("documento=" + entry.getKey() + ", nombre=" +


entry.getValue());

// entry.getKey trae la llave y entry.getValue trae los valores del mapa

// Mostrar solo las llaves

for (Integer dni : estudiantes.keySet()) {

System.out.println("Documento = " + dni);

// Mostrar solo los valores

for (String nombres : estudiantes.values()) {

System.out.println("Nombre: " + nombres);

ITERATOR
El Iterator es una interfaz que pertenece al framework de colecciones. Este, nos permite
recorrer, acceder a la información y eliminar algún elemento de una colección. Ya que,
cuando queremos eliminar algún elemento, mediante el for each, nos va a tirar un error.
Gracias a que el Iterator es parte de el framework de colecciones, todas las colecciones
vienen con un metodo iterator(), este devuelve un iterador para recorrer esa colección,
este iterador que devuelve la colección, lo recibe el objeto iterator y nos deja iterar sobre
nuestra colección.
Para poder usar el Iterator es importante crear el objeto de tipo Iterator, con el mismo tipo
de dato que nuestra colección.

El iterator contiene tres metodos muy utiles para lograr esto:

1. boolean hasNext(): Retorna verdadero si al iterator le quedan elementos por


iterar

5
2. Object next(): Devuelve el siguiente elemento en la coleccion, mientras le
metodo hasNext() retorne true. Este metodo es el que nos sirve para mostrar el
elemento,
3. void remove(): Elimina el elemento actual de la colección.

Ejemplo:

ArrayList<String> lista = new ArrayList<String>();

lista.add("A");
lista.add("B");

// Iterator para recorrer la lista


Iterator iterator = lista.iterator(); Devolvemos el iterador

System.out.println("Elementos de la lista : ");

// Usamos un while para recorrer la lista, siempre que el hasnext()


// devuelva true.

while (iterator.hasNext())

// Mostramos los elementos con el iterator.next()

System.out.print(iterator.next() + " ");

System.out.println();
}

ELIMINAR UN ELEMENTO DE UNA COLECCIÓN


Como pudimos ver más arriba para eliminar un elemento de una colección vamos a tener
que utilizar la funcion remove() del Iterator, esto se aplica para el resto de nuestras
colecciones. Para los mapas, vamos a utilizar el Map. Entry para usar con el iterator.
Ademas, podemos eligir sobre si queremos preguntar por la llave o por el valor, para
validar que elemento eliminar.

Conjuntos:

HashSet<Integer> numerosSet = new HashSet();

Iterator<Integer> it = hashEnteros.iterator();

while (it.hasNext()) {

if (it.next() == 3) { // Borramos si está el numero 3

it.remove();

6
Mapas:

Con los mapas vamos a tener que usar el remove propio de los Mapas pero no podemos
recorrerlos, este remove, solo sirve para eliminar elementos del mapa según su llave.

HashMap<Integer, String> estudiantes = new HashMap();

Int llaveABorrar = 123;

estudiantes.remove(llaveABorrar)

ORDENAR UNA COLECCIÓN


Los elementos, que vamos agregando a nuestra colección se van mostrar según se fueron
agregando y nosotros capaz necesitemos mostrar o tener todos los elementos ordenados.
Para ordenar una colección, vamos a tener que utilizar la función
Collections.sort(coleccion ). La función recibe la colección y la ordena para después poder
mostrarla ordenada de manera ascendente.
Algunas colecciones, como los conjuntos o los mapas no pueden utilizar el sort(). Ya que
por ejemplo los HashSet, manejan valores Hash y el sort() no sabe ordenar por hash, si no
por elementos. Por otro lado, los mapas al tener dos datos, el sort() no sabe por cual de sos
datos ordenar.
Entonces, para ordenar los conjuntos, deberemos convertirlos a listas para poder ordenar
esa lista por sus elementos. Y a la hora de ordenar un mapa como tenemos dos datos para
ordenar, vamos a convertir el HashMap a un TreeMap.

Nota: recordemos que los TreeSet y TreeMap se ordenan por si mismos.

Listas:

ArrayList<Integer> numeros = new ArrayList();

Collections.sort(numeros);

Conjuntos:

HashSet<Integer> numerosSet = new HashSet();

ArrayList<Integer> numerosLista = new ArrayList(numerosSet); Se convierte el


HashSet a Lista.

Collections.sort(numerosLista);

Mapas:

HashMap<Integer, String> alumnos = new HashMap();

// Se convierte el HashMap a TreeMap

TreeMap<Integer, String> alumnosTree = new TreeMap(alumnos);

7
COLECCIONES CON OBJETOS
De la misma manera que podemos crear colecciones con los tipos de datos de Java,
podemos crear colecciones, de algún objeto que hayamos creado previamente. Esto, nos
serviría para manejar varios objetos al mismo tiempo y acceder a ellos de una manera más
sencilla.

AÑADIR UN OBJETO A UNA COLECCIÓN


Para añadir un objeto a una colección tenemos que primero crear el objeto que queremos
trabajar y después crear una colección donde su tipo de dato sea dicho objeto.
La manera de agregar los objetos a la colección es muy parecida a lo que habíamos visto
previamente.

A excepción de las colecciones Tree, ya sean TreeSet o TreeMap. Ya que al tratar de


agregar elementos un Tree que su tipo de dato sea algún objeto creado por nosotros. Y los
Tree, siendo colecciones que se ordenan a si mismas, debemos informarle al Tree como va
a ordenarse. Pensemos que el objeto posee más de un dato(atributos), entonces el Tree, no
sabe por qué atributo va a ordenarse. Para solucionar esto vamos a necesitar un
Comparator que le de la pauta de como ordenarse y sobre que atributo. El Comparator
está explicado más abajo en la guía y muestra como agregárselo a los Tree.

Listas:

ArrayList<Libro> libros = new ArrayList();

Libro libro = new Libro();

libros.add(libro);

Conjuntos:

HashSet<Perro> perros = new HashSet();

Perro perro = new Perro();

perros.add(perro);

Mapas:

HashMap<Integer, Alumno> alumnos = new HashMap();

int dni = 34576189;

Alumno alumno = new Alumno(“Pepe”, “Honguito”);

alumnos.put(dni, alumno);

RECORRER UNA COLECCIÓN CON OBJETOS


Para recorrer una colección donde su tipo de dato sea un objeto creado por nosotros,
vamos a seguir utilizando los métodos que conocemos, el for each o el iterator. Pero a la
hora de mostrar el objeto con un System.out.println, no nos va a mostrar sus atributos. Sino
que, nos va a mostrar el nombre de la clase, el nombre del objeto, una arroba y un código
hash para representar los valores del objeto.

8
Ejemplo:

ArrayList<Libro> libros = new ArrayList();

Libro libro = new Libro();

libros.add(libro);

for (Libro libro : libros) {

System.out.println(libro);

Cuando queremos mostrar el libro, que está siendo recorrido por el for each, nos mostraria
algo asi: Libreria.Libro@14ae5a5

Para solucionar este problema, vamos a tener que sobreescribir(Override), un metodo de la


clase String, dentro de la clase de nuestro objeto. Este metodo va a transformar, el nombre
de la clase, el nombre del objeto y el hash, en una cadena legible para imprimir. Para poder
usar este metodo vamos a ir a nuestra clase, ahí hacemos click derecho, insert code y le
damos a toString(). Eso nos va a generar un metodo toString() con los atributos de nuestro
objeto y que retorna una cadena para mostrar el objeto.

Ejemplo:

@Override
public String toString() {
return "Libro{" + "titulo=" + titulo + '}';
}

Este metodo se va a llamar solo, sin necesidad que lo llamemos nosostros, siempre que
querramos mostrar nuestro objeto en un System.out.println. Y mostrará la linea que se ve en
el return.

Ejemplo:

ArrayList<Libro> libros = new ArrayList();

Libro libro = new Libro();

libro.setTitulo(“La Odisea”);

libros.add(libro);

for (Libro libro : libros) {

System.out.println(libro);

Output: Libro{titulo= La Odisea}

9
COMPARATOR
A la hora de querer ordenar una colección de objetos en Java, no podemos utilizar la
función sort, ya que el sort se utiliza para ordenar colecciones con elementos uniformes.
Pero los objetos pueden tener dentro distintos tipos de datos (atributos). Entonces, nuestra
función sort no sabe porqué tipo de dato o atributo ordenar. Para esto, utilizamos la interfaz
Comparator con su función compare en nuestra clase entidad.

Supongamos que tenemos una clase Perro, que tiene como atributos el nombre del perro y
la edad. Nosotros queremos ordenar los perros por edad, deberemos crear el método
compare de la clase Comparator en la clase Perro.

Ejemplo:

Public Class Perro

public static Comparator<Perro> compararEdad = new Comparator<Perro>() {

@Override

public int compare(Perro p1, Perro p2) {

return p2.getEdad().compareTo(p1.getEdad());

};

Explicación del método:

• El método crea un objeto estático de la interfaz Comparator. Este nos va permitir utilizar
a través de un sobre escribir (Override) el método compare, el mismo nos deja
comparar dos objetos para poder ordenarlos. Este objeto se crea static para poder
llamar al método solo llamando a la clase, sin tener que crear otro objeto Comparator,
en este caso la clase Perro.
• Dentro de la creación de objeto se crea un método de la clase Comparator llamado
compare, arriba del método se puede ver la palabra Override. Override, se usa cuando
desde una subclase (Perro), queremos utilizar un método de otra clase (Comparator) en
nuestra subclase.
• El método recibe dos objetos de la clase Perro y retorna una comparación entre los dos
usando los get para traer el atributo que queríamos comparar y usa la función
compareTo, que devuelve 0 si la edad es la misma, 1 si la primera edad es mayor a la
segunda y -1 si la primera edad es menor a la segunda.
• Si quisiéramos cambiar el atributo que usa para ordenar, pondríamos otro atributo en el
get del return.

10
USO DEL METODO COMPARATOR
Como el comparator se va a usar para ordenar nuestras colecciones, se va a poner en el
llamado de la función Collections.sort() y se va a poner en la inicialización de cualquier tipo
de Tree.

Listas:

ArrayList<Perro> perros = new ArrayList();

perros.sort(Perro.compararEdad); Se llama al metodo estatico a traves de la


clase y se pone la lista a ordenar.

Conjuntos:

HashSet<Perro> perrosSet = new HashSet();

ArrayList<Perro> perrosLista = new ArrayList(perrosSet);

perrosLista.sort(Perro.compararEdad);

Crear un TreeSet

En los TreeSet necesitamos crearlos con el comparator porque como el TreeSet se ordena
solo, necesitamos decirle al TreeSet, bajo que atributo se va a ordenar, por eso le pasamos
el comparator en el constructor.

TreeSet<Perro> perros = new TreeSet(Perro.compararEdad);

Perro perro = new Perro();

perros.add(perro);

Mapas:

HashMap<Integer, Alumno> alumnos = new HashMap();

ArrayList<Alumno> nombres = new ArrayList(map.values()); Se usa una función de


los mapas para traer todos valores.

nombres.sort(Alumno.compararDni);

COLECCIÓNES EN FUNCIONES
A la hora de querer pasar una colección a una función, deberemos recordar que Java es
fuertemente tipado, por lo que deberemos poner el tipo de dato de la colección y que tipo
de colección es cuando la pongamos como argumento.

Listas:

Public void llenarLista(ArrayList<Integer> numeros){

numeros.add(20)

11
Main

ArrayList<Integer> numeros = new ArrayList();

llenarLista(numeros); // Le pasamos la lista a la función

Conjuntos:

Public void llenarHashSet(HashSet<String> palabras){

palabras.add(“Hola”)

Main

HashSet<String> palabras = new HashSet();

llenarHashSet(palabras); // Le pasamos el conjunto a la función

Mapas:

Public void llenarMapa(HashMap<Integer, String> alumnos){

alumnos.add(1, “Pepe”);

Main

HashMap<Integer, String> alumnos = new HashMap();

llenarMapa(alumnos); // Le pasamos el conjunto a la función

DEVOLVER UNA COLECCIÓN EN FUNCIONES


Para devolver una colección en una función, tenemos que hacer que el tipo de dato de
nuestra función sea la colección que queremos devolver, teniendo también el tipo de dato
que va a manejar dicha colección.

Listas:

Public ArrayList<Integer> llenarLista(){

ArrayList<Integer> numeros = new ArrayList();

numeros.add(20);

return numeros; // Devolvemos la lista llena.

Conjuntos:

Public HashSet<String> llenarHashSet(){

HashSet<String> palabras = new HashSet();

palabras.add(“Hola”)

return palabras }

12
Mapas:

Public HashMap<Integer,String> llenarMapa(){

HashMap<Integer, String> alumnos = new HashMap();

alumnos.add(1, “Pepe”);

return alumnos;

Proyecto con ejemplos de colecciones


El proyecto contiene un paquete con un main para cada tipo de colección y un paquete
más que muestra como usar una lista con un objeto. Además contiene algunos métodos
que no están explicados en la teoría.

Link: Colecciones

13
CLASE COLLECTIONS
La clase collections es parte del framework de colecciones y también es parte del paquete
java.util. Esta clase nos provee de métodos que reciben una colección y realizan alguna
operación o devuelven una colección, según el método. Vamos a mostrar algunos de los
métodos pero hay muchos más.

Método Descripción.

Este método reemplaza todos los elementos de la lista con


fill(List<T> lista, Objeto objeto) un elemento especifico.

frequency(Collection<T> Este método retorna la cantidad de veces que se encuentra


coleccion, Objeto objeto) un elemento especifico en una colección.

replaceAll(List<T> lista, T Este método reemplaza todas las apariciones de un


valorViejo, T valorNuevo) elemento especifico en una lista, con otro valor.

reverse(List<T> lista) Este método invierte el orden de los elementos de una lista.

Este método retorna un comparator que invierte el orden


reverseOrder() de los elementos de una colección.

Este método modifica la posición de los elementos de una


shuffle(List<T> lista) lista de manera aleatoria.

Este método ordena los elementos de una lista de manera


sort(List<T> lista) ascendente.

METODOS EXTRAS COLECCIONES


En la guía mostramos las acciones más realizadas con colecciones, con la ayuda de sus
métodos, pero también existen otros métodos en las colecciones para realizar otras
acciones. Nota: los métodos de los List y los Set, son los mismos, quitando el get y el set.

Listas y Conjuntos:

Método Descripción.

size() Este método retorna el tamaño de una lista / conjunto.

Este método se usa para remover todos los elementos de


clear() una lista / conjunto.

Este método remueve un elemento de un índice especifico.


Esto mueve los elementos de manera que no queden
remove(int índice) índices sin elementos,

14
remove(elemento) Este método remueve un elemento de una lista

Este método retorna un elemento de la lista según un índice


get(int índice) de la lista.

Este método guarda un elemento en la lista en un índice


set(int índice, elemento) especifico.

Este método retorna verdadero si la lista / conjunto está


isEmpty() vacía y falso si no lo está.

Este método recibe un elemento dado por el usuario y


revisa si el elemento se encuentra en la lista o no. Si el
contains(elemento) elemento se encuentra retorna verdadero y si no falso.

Mapas:

Método Descripción.

Este método se usa para remover todos los elementos de un


clear() mapa.

Este método recibe una llave dada por el usuario y revisa si


la llave se encuentra en la lista o no. Si la llave se encuentra
containsKey(Llave) retorna verdadero y si no falso.

Este método recibe un valor dado por el usuario y revisa si


el valor se encuentra en el mapa o no. Si el elemento se
containsValue(Valor) encuentra retorna verdadero y si no falso.

Este método retorna un elemento del mapa según una llave


get(Llave) dentro del mapa.

Este método retorna verdadero si el mapa está vacío y falso


isEmpty() si no lo está.

size() Este método retorna el tamaño de un mapa.

Este método crea una colección según los valores del


mapa. Ósea, que retorna una lista, por ejemplo, con todos
values() los valores del mapa.

Este método se usa para remover todos los elementos de un


clear() mapa.

15
PREGUNTAS DE APRENDIZAJE
1) Cual de estos paquetes es el contenedor de las colecciones:
a) java.lang
b) java.util
c) java.net
d) java.awt

2) Las colecciones en Java son:


a) Un grupo de objetos.
b) Un grupo de clases.
c) Un grupo de interfaces.
d) Ninguna de las anteriores.

3) En el framework de colecciones de Java un Set es


a) Una colección que no puede contener elementos duplicados
b) Una colección ordenada que puede contener elementos duplicados
c) Un objeto que mapea conjuntos de clave valor y no puede contener valores
duplicados
d) Ninguna de las anteriores

4) Cual, de estos métodos, borra un elemento de una colección:


a) .clear();
b) .delete();
c) .remove();
d) .reset();

5) Para agregar elementos en una lista se usa la función:


a) lista.lenght();
b) lista.size();
c) lista.add();
d) lista.iterator();

6) En Java un Iterator es:


a) Una interface que proporciona los métodos para borrar elementos de una colección
b) Una interface que proporciona los métodos para recorrer los elementos de una
colección y posibilita el borrado de elementos
c) Una interface que proporciona los métodos para ordenar los elementos de la
colección.
d) Ninguna de las anteriores

16
EJERCICIOS DE APRENDIZAJE
En este módulo vamos a continuar modelando los objetos con el lenguaje de programación
Java, pero ahora vamos a utilizar las colecciones para poder manejarlas de manera más
sencilla y ordenada.

VER VIDEOS:

A. Introducción
B. Listas 1
C. Listas 2
D. Listas 3

1. Diseñar un programa que lea y guarde razas de perros en un ArrayList de tipo


String. El programa pedirá una raza de perro en un bucle, el mismo se guardará
en la lista y después se le preguntará al usuario si quiere guardar otro perro o si
quiere salir. Si decide salir, se mostrará todos los perros guardados en el ArrayList.

VER VIDEO: Iterar o Recorrer Colecciones

2. Continuando el ejercicio anterior, después de mostrar los perros, al usuario se le


pedirá un perro y se recorrerá la lista con un Iterator, se buscará el perro en la lista.
Si el perro está en la lista, se eliminará el perro que ingresó el usuario y se mostrará
la lista ordenada. Si el perro no se encuentra en la lista, se le informará al usuario
y se mostrará la lista ordenada.

3. Crear una clase llamada Alumno que mantenga información sobre las notas de
distintos alumnos. La clase Alumno tendrá como atributos, su nombre y una lista
de tipo Integer con sus 3 notas.
En el main deberemos tener un bucle que crea un objeto Alumno. Se pide toda la
información al usuario y ese Alumno se guarda en una lista de tipo Alumno y se le
pregunta al usuario si quiere crear otro Alumno o no.

Despues de ese bluce tendremos el siguiente método en la clase Alumno:

Metodo notaFinal(): El usuario ingresa el nombre del alumno que quiere calcular
su nota final y se lo busca en la lista de Alumnos. Si está en la lista, se llama al
método. Dentro del método se usará la lista notas para calcular el promedio final
de alumno. Siendo este promedio final, devuelto por el método y mostrado en el
main.

Ejemplo de una colección como atributo: ColeccionAtributo

VER VIDEO: Comparator

4. Un cine necesita implementar un sistema en el que se puedan cargar peliculas.


Para esto, tendremos una clase Pelicula con el titulo, director y duración de la
película (en horas). Implemente las clases y métodos necesarios para esta
situación, teniendo en cuenta lo que se pide a continuación:

17
En el main deberemos tener un bucle que crea un objeto Pelicula pidiéndole al
usuario todos sus datos y guardándolos en el objeto Pelicula.
Después, esa Pelicula se guarda una lista de Peliculas y se le pregunta al usuario
si quiere crear otra Pelicula o no.
Después de ese bucle realizaremos las siguientes acciones:

• Mostrar en pantalla todas las películas.


• Mostrar en pantalla todas las películas con una duración mayor a 1 hora.
• Ordenar las películas de acuerdo a su duración (de mayor a menor) y mostrarlo
en pantalla.
• Ordenar las películas de acuerdo a su duración (de menor a mayor) y mostrarlo
en pantalla.
• Ordenar las películas por titulo, alfabéticamente y mostrarlo en pantalla.
• Ordenar las películas por director, alfabéticamente y mostrarlo en pantalla.

Nota: recordar el uso del Comparator para ordenar colecciones con objetos.

VER VIDEO: Conjuntos

5. Se requiere un programa que lea y guarde países, y para evitar que se ingresen
repetidos usaremos un conjunto. El programa pedirá un país en un bucle, se
guardará el país en el conjunto y después se le preguntará al usuario si quiere
guardar otro país o si quiere salir, si decide salir, se mostrará todos los países
guardados en el conjunto.
Después deberemos mostrar el conjunto ordenado alfabéticamente para esto
recordar como se ordena un conjunto.
Y por ultimo, al usuario se le pedirá un país y se recorrerá el conjunto con un
Iterator, se buscará el país en el conjunto y si está en el conjunto se eliminará el
país que ingresó el usuario y se mostrará el conjunto. Si el país no se encuentra
en el conjunto se le informará al usuario.

VER VIDEO: Mapas

6. Se necesita una aplicación para una tienda en la cual queremos almacenar los
distintos productos que venderemos y el precio que tendrán. Además, se necesita
que la aplicación cuente con las funciones básicas.
Estas las realizaremos en el main. Como, introducir un elemento, modificar su
precio, eliminar un producto y mostrar los productos que tenemos con su precio
(Utilizar Hashmap). El HashMap tendrá de llave el nombre del producto y de valor
el precio. Realizar un menú para lograr todas las acciones previamente
mencionadas.

18
EJERCICIOS DE APRENDIZAJE EXTRA
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos pueden
realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que venimos
trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas, podes
continuar con estos ejercicios extra, recordando siempre que no es necesario que los
termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es ayudar
a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es que puedas
explicar el ejercicio con la intención de que tu compañero lo comprenda, y no sólo mostrarlo.
¡Muchas gracias!

1. Diseñar un programa que lea una serie de valores numéricos enteros desde el teclado
y los guarde en un ArrayList de tipo Integer. La lectura de números termina cuando se
introduzca el valor -99. Este valor no se guarda en el ArrayList. A continuación, el
programa mostrará por pantalla el número de valores que se han leído, su suma y su
media (promedio).

2. Crear una clase llamada CantanteFamoso. Esta clase guardará cantantes famosos y
tendrá como atributos el nombre y discoConMasVentas.
Se debe, además, en el main, crear una lista de tipo CantanteFamoso y agregar 5
objetos de tipo CantanteFamoso a la lista. Luego, se debe mostrar los nombres de
cada cantante y su disco con más ventas por pantalla.
Una vez agregado los 5, en otro bucle, crear un menú que le de la opción al usuario de
agregar un cantante más, mostrar todos los cantantes, eliminar un cantante que el
usuario elija o de salir del programa. Al final se deberá mostrar la lista con todos los
cambios.

3. Implemente un programa para una Librería haciendo uso de un HashSet para evitar
datos repetidos. Para ello, se debe crear una clase llamada Libro que guarde la
información de cada uno de los libros de una Biblioteca. La clase Libro debe guardar
el título del libro, autor, número de ejemplares y número de ejemplares prestados.
También se creará en el main un HashSet de tipo Libro que guardará todos los libros
creados.
En el main tendremos un bucle que crea un objeto Libro pidiéndole al usuario todos
sus datos y los seteandolos en el Libro. Despues, ese Libro se guarda en el conjunto y
se le pregunta al usuario si quiere crear otro Libro o no.

La clase Librería contendrá además los siguientes métodos:

• Constructor por defecto.


• Constructor con parámetros.
• Métodos Setters/getters
• Método prestamo(): El usuario ingresa el titulo del libro que quiere prestar y se lo
busca en el conjunto. Si está en el conjunto, se llama con ese objeto Libro al
método. El método se incrementa de a uno, como un carrito de compras, el
atributo ejemplares prestados, del libro que ingresó el usuario. Esto sucederá
cada vez que se realice un préstamo del libro. No se podrán prestar libros de los
que no queden ejemplares disponibles para prestar. Devuelve true si se ha
podido realizar la operación y false en caso contrario.

19
• Método devolucion(): El usuario ingresa el titulo del libro que quiere devolver y se
lo busca en el conjunto. Si está en el conjunto, se llama con ese objeto al método.
El método decrementa de a uno, como un carrito de compras, el atributo
ejemplares prestados, del libro seleccionado por el usuario. Esto sucederá cada
vez que se produzca la devolución de un libro. No se podrán devolver libros
donde que no tengan ejemplares prestados. Devuelve true si se ha podido
realizar la operación y false en caso contrario.
• Método toString para mostrar los datos de los libros.

4. Almacena en un HashMap los códigos postales de 10 ciudades a elección de esta


página: https://mapanet.eu/index.htm. Nota: Poner el código postal sin la letra, solo el
numero.

• Pedirle al usuario que ingrese 10 códigos postales y sus ciudades.


• Muestra por pantalla los datos introducidos
• Pide un código postal y muestra la ciudad asociada si existe sino avisa al
usuario.
• Muestra por pantalla los datos
• Agregar una ciudad con su código postal correspondiente más al HashMap.
• Elimina 3 ciudades existentes dentro del HashMap, que pida el usuario.
• Muestra por pantalla los datos

20
CURSO DE PROGRAMACIÓN FULL STACK

RELACIONES
ENTRE CLASES
PARADIGMA ORIENTADO A OBJETOS
GUÍA RELACIONES ENTRE CLASES
RELACIONES ENTRE CLASES
Una relación es una conexión semántica entre clases. Permite que una clase conozca
sobre los atributos, operaciones y relaciones de otras clases. Las clases no actúan aisladas
entre sí, al contrario las clases están relacionadas unas con otras. Una clase puede ser un
tipo de otra clase —generalización— o bien puede contener objetos de otra clase de varias
formas posibles, dependiendo de la fortaleza de la relación entre las dos clases.

En la programación orientada a objetos, un objeto se comunica con otro objeto para utilizar
la funcionalidad y los servicios proporcionados por ese objeto. Por ejemplo: un objeto
curso tiene varios objetos alumnos y un objeto profesor.
Esto significa que, gracias a la relación entre objetos, el objeto curso puede tener toda la
información que necesita. Además, nos ayuda para la reutilización de código, ya que
podemos usar todo lo de la clase que ya habíamos escrito,

La relación entre dos clases separadas se establece a través de sus Objetos. Es decir, las
clases se conectan juntas conceptualmente. Las relaciones entre clases realmente
significan que una clase contiene una referencia a un objeto u objetos, de la otra clase en
la forma de un atributo.

La relación mas simple es la asociación, esta relación es entre dos objetos como habíamos
dicho previamente. En las relaciones de asociación se puede establecer una relación
bidireccional, que los objetos que están al extremo de una relación pueden “conocerse
“entre sí, o una relación unidireccional que solamente uno de ellos “conoce” a otro.

Bidireccional:

Padre Hijo

Unidireccional:

Curso Alumno

Dentro de la asociación simple existe la composición y la agregación, que son las dos
formas de relaciones entre clases.

AGREGACIÓN
Representa un tipo de relación muy particular, en la que una clase es instanciada por otro
objeto y clase. La agregación se podría definir como el momento en que dos objetos se unen
para trabajar juntos y así, alcanzar una meta. Un punto a tomar muy en cuenta es que ambos
objetos son independientes entre sí. Para validar la agregación, la frase “Usa un” debe tener
sentido, por ejemplo: El programador usa una computadora. El objeto computadora va a
existir más allá de que exista o no el objeto programador.

1
En agregación, ambos objetos pueden sobrevivir individualmente, lo que significa que al
borrar un objeto no afectará a la otra entidad.

COMPOSICIÓN
La composición es una relación más fuerte que la agregación, es una "relación de vida", es
decir, que el tiempo de vida de un objeto está condicionado por el tiempo de vida del
objeto que lo incluye. La composición es un tipo de relación dependiente en dónde un
objeto más complejo es conformado por objetos más pequeños. En esta situación, la frase
“Tiene un”, debe tener sentido, por ejemplo: el cliente tiene una cuenta bancaria. Esta
relación es una composición, debido a que al eliminar el cliente la cuenta bancaria no tiene
sentido, y también se debe eliminar, es decir, la cuenta existe sólo mientras exista el
cliente.

RELACIONES EN CÓDIGO
Recordemos que las relaciones entre clases significan que una clase contiene una
referencia a un objeto u objetos, de la otra clase en la forma de un atributo. Pero a la hora
de poner un atributo en una clase, debemos ver el tipo de relación de esas clases.

En las relaciones, tanto composición como agregación, las relaciones pueden ser de uno a
uno, de uno a muchos, de muchos a uno, de muchos a muchos. El tipo de relación se ve
representada a la hora de poner el objeto como forma de atributo en la clase que recibe la
relación. Por ahora vamos a trabajar solo con uno a uno y uno a muchos porque son las
que podemos representar en código por ahora.

Uno a uno
Por cada objeto tenemos una relación con un solo objeto. Ejemplo: para un curso tengo un
profesor. En código se representa con un atributo que sea un objeto.

Public class Profesor { Public class Curso {

private String nombre; private Profesor profesor;


private String apellido;
public Profesor getProfesor() {
} return profesor;
}

public void setProfesor(Profesor profesor){


this.profesor = profesor;
}

2
En este ejemplo en el Main vamos a tener que crear un objeto Profesor, para poder
guardarlo en el Curso. Para guardar el objeto podemos usar el set que se va a generar de
dicho objeto Profesor, ya que es un atributo de la clase Curso.

Main
Profesor profesor = new Profesor();
profesor.setNombre(“Agustín”);
profesor.setApellido(“Lima”);
Curso curso = new Curso();
curso.setProfesor(profesor);

Uno a muchos
Por cada objeto tenemos una relación con muchos objetos de una clase. Ejemplo: para un
curso tengo muchos alumnos. En java para guardar varios objetos de una clase utilizamos
colecciones. Y como las listas son las colecciones más rápidas de llenar, utilizamos una
lista

Public class Alumno { Public class Curso {

private String nombre; private List<Alumno> alumnos;


private String apellido;
public List<Alumno> getAlumnos() {
} return alumnos;
}

public void setAlumno(sList<Alumno> alumnos){


this.alumnos = alumnos;
}

En este ejemplo en el Main vamos a tener que crear varios objetos Alumno para después
guardarlos en un ArrayList de tipo Alumno, para poder guardarlo en el Curso. Para guardar
el objeto podemos usar el set que se va a generar de dicho ArrayList de tipo Alumno, ya
que es un atributo de la clase Curso.

Main
Alumno alumno1 = new Alumno();
alumno1.setNombre(“Mariela”);
alumno1.setApellido(“Gadea”);
ArrayList<Alumno> alumnos = new ArrayList();
alumnos.add(alumno1);
Curso curso = new Curso();
curso.setAlumnos(alumnos);

3
UML
El lenguaje de modelado unificado (UML) es un lenguaje de modelado de propósito
general. El objetivo principal de UML es definir una forma estándar de visualizar la forma en
que se ha diseñado un sistema mediante diagramas. Es bastante similar a los planos
utilizados en otros campos de la ingeniería.

UML no es un lenguaje de programación, es más bien un lenguaje visual. Usamos


diagramas UML para representar el comportamiento y la estructura de un sistema. Estos
diagramas se hacen siempre previos a la codificación del programa en sí, también para
facilitar después la creación del programa si ya tenemos en claro que debemos crear.
Existen varios tipos de diagramas de programación que podemos hacer con UML, en el
que vamos a hacer hincapié nosotros es el diagrama de clases.

DIAGRAMAS DE CLASES
Es el componente básico de todos los programas orientados a objetos. Usamos diagramas
de clases para representar la estructura de un sistema mostrando las clases del sistema,
sus métodos y atributos. Los diagramas de clases también nos ayudan a identificar la
relación entre diferentes clases u objetos. Ya se relaciones entre clases o herencia.
Cada clase está representada por un rectángulo que tiene una subdivisión de tres
compartimentos: nombre, atributos y métodos.

Hay tres tipos de modificadores que se utilizan para decidir la visibilidad de atributos y
métodos:

+ se usa para el modificador de acceso public.


# se usa para el modificador de acceso protected.
- se usa para el modificador de acceso private.

Libro
-String titulo
-Integer ejemplares

+void préstamo()
+void devolución()

Si tuviéramos una interfaz, se vería así

<<interface>>
Interfaz
+void método()

Nota: El concepto de interfaz se desarrollará en la siguiente guía.

4
RELACIONES ENTRE CLASES

Las relaciones entre clases se representan con flechas entre las clases. La clase que recibe
la relación de la otra clase, como un objeto de la otra clase, es la clase a la que lo toca el
rombo.

Y para representar el tipo de relación, ya sea uno a uno, de uno a muchos, de muchos a
uno o muchos a muchos, es con un símbolo para cada relación en la flecha.
A continuación, veremos uno de los muchos ejemplos:

1…1 Uno a uno

1…* Uno a muchos


o muchos a
uno

En el primer ejemplo la Clase A tiene a la clase B por ser una composición y en el segundo
ejemplo, la clase A usa a la clase B por ser una asociación.

HERENCIA

El concepto de herencia se desarrollará en la siguiente guía.


La herencia se representa con la siguiente flecha:

5
PREGUNTAS DE APRENDIZAJE
1) La relación más fuerte es la

a) Agregación
b) Composición
c) Dependencia
d) Ninguna de las anteriores

2) La relación más débil es la

a) Agregación
b) Composición
c) Dependencia
d) Ninguna de las anteriores

3) La relación es entre

a) Clases
b) Interfaces
c) Métodos
d) Ninguna de las anteriores

4) La relación se representa en una clase con un

a) Método
b) Constructor
c) Atributo que es un objeto de otra clase
d) Ninguna de las anteriores

5) ¿Por qué usamos relaciones entre clases?

a) Para usar la funcionalidad de una clase en otra clase.


b) Para mejorar la comunicación entre clases
c) Para incrementar la reutilización de código
d) Todas las anteriores

6) En base al siguiente código. ¿Qué afirmación describe mejor la relación entre estas dos
clases?

Pagina pagina = new Pagina();


Libro libro = new Libro(pagina);

a) Pagina tiene un Libro


b) Libro tiene una pagina
c) Libro hereda de pagina
d) Ninguna de las anteriores

7) El modificador de acceso public en los UML se representa con un

a) Menos (-)
b) Más (+)
c) Numeral (#)
d) Ninguna de las anteriores

6
8) El modificador de acceso private en los UML se representa con un

a) Menos (-)
b) Más (+)
c) Numeral (#)
e) Ninguna de las anteriores

9) En base a la siguiente imagen, elegir la opción que describe la relación:

a) Auto usa un Motor


b) Motor tiene un Auto
c) Auto tiene un Motor
d) Motor usa un Auto

10) En base a la siguiente imagen, elegir la opción que describe la relación:

a) Alumno tiene un Libro


b) Libro tiene un Alumno
c) Libro usa un Alumno
d) Alumno usa un Libro

7
EJERCICIOS DE APRENDIZAJE
En este módulo de POO, vamos a empezar a ver cómo dos o más clases pueden
relacionarse entre sí, ya sea por una relación entre clases o mediante una herencia de clases.

RELACIONES ENTRE CLASES

VER VIDEOS:

A. Enum
B. Asociación Simple
C. Asociación de Composición
D. Asociación de Agregación
E. Asociación Inversa
F. Asociación Reflexiva
G. Genéricos
H. UML

1. Realizar un programa para que una Persona pueda adoptar un Perro. Vamos a contar de
dos clases. Perro, que tendrá como atributos: nombre, raza, edad y tamaño; y la clase
Persona con atributos: nombre, apellido, edad, documento y Perro.
Ahora deberemos en el main crear dos Personas y dos Perros. Después, vamos a tener
que pensar la lógica necesaria para asignarle a cada Persona un Perro y por ultimo,
mostrar desde la clase Persona, la información del Perro y de la Persona.

2. Realizar el juego de la ruleta rusa de agua en Java. Como muchos saben, el juego se
trata de un número de jugadores, que, con un revolver de agua, el cual posee una sola
carga de agua, se dispara y se moja. Las clases a hacer del juego son las siguientes:

Clase Revolver de agua: esta clase posee los siguientes atributos: posición actual
(posición del tambor que se dispara, puede que esté el agua o no) y posición agua (la
posición del tambor donde se encuentra el agua). Estas dos posiciones, se generarán
aleatoriamente.

Métodos:

• llenarRevolver(): le pone los valores de posición actual y de posición del agua. Los
valores deben ser aleatorios.
• mojar(): devuelve true si la posición del agua coincide con la posición actual
• siguienteChorro(): cambia a la siguiente posición del tambor
• toString(): muestra información del revolver (posición actual y donde está el agua)

Clase Jugador: esta clase posee los siguientes atributos: id (representa el número del
jugador), nombre (Empezara con Jugador más su ID, “Jugador 1” por ejemplo) y mojado
(indica si está mojado o no el jugador). El número de jugadores será decidido por el
usuario, pero debe ser entre 1 y 6. Si no está en este rango, por defecto será 6.

Métodos:

8
• disparo(Revolver r): el método, recibe el revolver de agua y llama a los métodos de
mojar() y siguienteChorro() de Revolver. El jugador se apunta, aprieta el gatillo y si el
revolver tira el agua, el jugador se moja. El atributo mojado pasa a false y el método
devuelve true, sino false.

Clase Juego: esta clase posee los siguientes atributos: Jugadores (conjunto de
Jugadores) y Revolver

Métodos:

• llenarJuego(ArrayList<Jugador>jugadores, Revolver r): este método recibe los


jugadores y el revolver para guardarlos en los atributos del juego.
• ronda(): cada ronda consiste en un jugador que se apunta con el revolver de agua y
aprieta el gatillo. Sí el revolver tira el agua el jugador se moja y se termina el juego,
sino se moja, se pasa al siguiente jugador hasta que uno se moje. Si o si alguien se
tiene que mojar. Al final del juego, se debe mostrar que jugador se mojó.
Pensar la lógica necesaria para realizar esto, usando los atributos de la clase Juego.

3. Realizar una baraja de cartas españolas orientada a objetos. Una carta tiene un número
entre 1 y 12 (el 8 y el 9 no los incluimos) y un palo (espadas, bastos, oros y copas). Esta
clase debe contener un método toString() que retorne el número de carta y el palo. La
baraja estará compuesta por un conjunto de cartas, 40 exactamente.

Las operaciones que podrá realizar la baraja son:

• barajar(): cambia de posición todas las cartas aleatoriamente.

• siguienteCarta(): devuelve la siguiente carta que está en la baraja, cuando no


haya más o se haya llegado al final, se indica al usuario que no hay más cartas.

• cartasDisponibles(): indica el número de cartas que aún se puede repartir.

• darCartas(): dado un número de cartas que nos pidan, le devolveremos ese


número de cartas. En caso de que haya menos cartas que las pedidas, no
devolveremos nada, pero debemos indicárselo al usuario.

• cartasMonton(): mostramos aquellas cartas que ya han salido, si no ha salido


ninguna indicárselo al usuario

• mostrarBaraja(): muestra todas las cartas hasta el final. Es decir, si se saca una
carta y luego se llama al método, este no mostrara esa primera carta.

9
EJERCICIOS DE APRENDIZAJE EXTRA
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos pueden
realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que venimos
trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas, podes
continuar con estos ejercicios extra, recordando siempre que no es necesario que los
termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es ayudar
a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es que puedas
explicar el ejercicio con la intención de que tu compañero lo comprenda, y no sólo mostrarlo.
¡Muchas gracias!

1. Ahora se debe realizar unas mejoras al ejercicio de Perro y Persona. Nuestro programa
va a tener que contar con muchas personas y muchos perros. El programa deberá
preguntarle a cada persona, que perro según su nombre, quiere adoptar. Dos personas
no pueden adoptar al mismo perro, si la persona eligió un perro que ya estaba adoptado,
se le debe informar a la persona.
Una vez que la Persona elige el Perro se le asigna, al final deberemos mostrar todas las
personas con sus respectivos perros.

2. Nos piden hacer un programa sobre un Cine, que tiene una sala con un conjunto de
asientos (8 filas por 6 columnas). De Cine nos interesa conocer la película que se está
reproduciendo, la sala con los espectadores y el precio de la entrada. Luego, de las
películas nos interesa saber el título, duración, edad mínima y director. Por último, del
espectador, nos interesa saber su nombre, edad y el dinero que tiene disponible.

Para representar la sala con los espectadores vamos a utilizar una matriz. Los asientos
son etiquetados por una letra y un número la fila A1 empieza al final del mapa como se
muestra en la tabla. También deberemos saber si el asiento está ocupado por un
espectador o no, si esta ocupado se muestra una X, sino un espacio vacío.

8AX|8BX|8CX|8D |8EX|8FX
7AX|7BX|7CX|7DX|7E |7FX
6A |6BX|6C |6DX|6EX|6F
5AX|5B |5CX|5DX|5EX|5FX
4AX|4BX|4CX|4DX|4EX|4FX
3A |3BX|3CX|3D |3EX|3FX
2AX|2B |2CX|2DX|2EX|2F
1AX|1BX|1CX|1DX|1EX|1FX

Se debe realizar una pequeña simulación, en la que se generen muchos espectadores y


se los ubique en los asientos aleatoriamente (no se puede ubicar un espectador donde
ya este ocupado el asiento).
Los espectadores serán ubicados de uno en uno y para ubicarlos tener en cuenta que
sólo se podrá sentar a un espectador si tiene el dinero suficiente para pagar la entrada,
si hay espacio libre en la sala y si tiene la edad requerida para ver la película. En caso de
que el asiento este ocupado se le debe buscar uno libre.
Al final del programa deberemos mostrar la tabla, podemos mostrarla con la letra y
numero de cada asiento o solo las X y espacios vacíos.

10
3. Ha llegado el momento de poner de prueba tus conocimientos. Para te vamos a contar
que te ha contratado “La Tercera Seguros”, una empresa aseguradora que brinda a sus
clientes coberturas integrales para vehículos.

Luego de un pequeño relevamiento, te vamos a pasar en limpio los requerimientos del


sistema que quiere realizar la empresa.

a. Gestión Integral de clientes. En este módulo vamos a registrar la información


personal de cada cliente que posea pólizas en nuestra empresa. Nombre y apellido,
documento, mail, domicilio, teléfono.
b. Gestión de vehículos. Se registra la información de cada vehículo asegurado. Marca,
modelo, año, número de motor, chasis, color, tipo (camioneta, sedán, etc.).
c. Gestión de Pólizas: Se registrará una póliza, donde se guardará los datos tanto de
un vehículo, como los datos de un solo cliente. Los datos incluidos en ella son:
número de póliza, fecha de inicio y fin de la póliza, cantidad de cuotas, forma de
pago, monto total asegurado, incluye granizo, monto máximo granizo, tipo de
cobertura (total, contra terceros, etc.). Nota: prestar atención al principio de este
enunciado y pensar en las relaciones entre clases. Recuerden que pueden ser de
uno a uno, de uno a muchos, de muchos a uno o de muchos a muchos.
d. Gestión de cuotas: Se registrarán y podrán consultar las cuotas generadas en cada
póliza. Esas cuotas van a contener la siguiente información: número de cuota,
monto total de la cuota, si está o no pagada, fecha de vencimiento, forma de pago
(efectivo, transferencia, etc.).

Debemos realizar el diagrama de clases completo, teniendo en cuenta todos los


requerimientos arriba descriptos. Modelando clases con atributos y sus
correspondientes relaciones. Para hacer el diagrama podes utilizar easyUml de java o
utilizar una pagina que nos permite hacer diagramas online: diagramas online.

4. Desarrollar un simulador del sistema de votación de facilitadores en Egg-

El sistema de votación de Egg tiene una clase llamada Alumno con los siguientes
atributos: nombre completo, DNI y cantidad de votos. Además, crearemos una clase
Simulador que va a tener los métodos para manejar los alumnos y sus votaciones. Estos
métodos serán llamados desde el main.

• La clase Simulador debe tener un método que genere un listado de alumnos


manera aleatoria y lo retorne. Las combinaciones de nombre y apellido deben ser
generadas de manera aleatoria. Nota: usar listas de tipo String para generar los
nombres y los apellidos.

• Ahora hacer un generador de combinaciones de DNI posibles, deben estar


dentro de un rango real de números de documentos. Y agregar a los alumnos su
DNI. Este método debe retornar la lista de dnis.

• Ahora tendremos un método que, usando las dos listas generadas, cree una
cantidad de objetos Alumno, elegidos por el usuario, y le asigne los nombres y los
dnis de las dos listas a cada objeto Alumno. No puede haber dos alumnos con el
mismo dni, pero si con el mismo nombre.

11
• Se debe imprimir por pantalla el listado de alumnos.

• Una vez hecho esto debemos generar una clase Voto, esta clase tendrá como
atributos, un objeto Alumno que será el alumno que vota y una lista de los
alumnos a los que votó.

• Crearemos un método votación en la clase Simulador que, recibe el listado de


alumnos y para cada alumno genera tres votos de manera aleatoria. En este
método debemos guardar a el alumno que vota, a los alumnos a los que votó y
sumarle uno a la cantidad de votos a cada alumno que reciba un voto, que es un
atributo de la clase Alumno.
Tener en cuenta que un alumno no puede votarse a sí mismo o votar más de una
vez al mismo alumno. Utilizar un hashset para resolver esto.

• Se debe crear un método que muestre a cada Alumno con su cantidad de votos
y cuales fueron sus 3 votos.

• Se debe crear un método que haga el recuento de votos, este recibe la lista de
Alumnos y comienza a hacer el recuento de votos.

• Se deben crear 5 facilitadores con los 5 primeros alumnos votados y se deben


crear 5 facilitadores suplentes con los 5 segundos alumnos más votados. A
continuación, mostrar los 5 facilitadores y los 5 facilitadores suplentes.

12
CURSO DE PROGRAMACIÓN FULL STACK

HERENCIA
PARADIGMA ORIENTADO A OBJETOS
GUÍA DE HERENCIA
HERENCIA
La herencia es una relación fuerte entre dos clases donde una clase es padre de otra.
La herencia es un pilar importante de la POO. Es el mecanismo mediante el cual una clase
es capaz de heredar todas las características (atributos y métodos) de otra clase.
Las propiedades comunes se definen en la superclase (clase padre) y las subclases heredan
estas propiedades (Clase hija). En esta relación, la frase “Un objeto es un-tipo-de una
superclase” debe tener sentido, por ejemplo: un perro es un tipo de animal, o también, una
heladera es un tipo de electrodoméstico.

La herencia apoya el concepto de "reutilización", es decir, cuando queremos crear una


nueva clase y ya existe una clase que incluye parte del código que queremos, podemos
utilizar esa clase que ya tiene el código que queremos y hacer de la nueva clase una
subclase. Al hacer esto, estamos reutilizando los campos y métodos de la clase existente.

La manera de usar herencia es a través de la palabra extends.

class subclase extends superclase {


// atributos y métodos
}

HERENCIA Y ATRIBUTOS
La subclase (Hija) como hemos dicho recibe todos los atributos de la superclase (Madre), y
además la subclase puede tener atributos propios.

Class Persona {

protected String nombre;

protected Integer edad;

protected Integer documento;

Class Alumno extends Persona {

private String materia;

El siguiente programa crea una superclase llamada Persona, que crea personas según su
nombre, edad y documento, y una subclase llamada Alumno, que recibe todos los atributos
de Persona. De esta manera se piensa que los atributos de alumno son nombre, edad y
documento, que son propios de cualquier Persona y matera que sería especifico de cada
Alumno. Usualmente la superclase suele ser un concepto muy general y abstracto, para
que pueda utilizarse para varias subclases.

En la superclase podemos observar que los atributos están creados con el modificador de
acceso protected y no private. Esto es porque el modificador de acceso protected permite
que las subclases puedan acceder a los atributos sin la necesidad de getters y setters.

1
Los atributos se trabajan como protected también, porque una subclase no hereda los
miembros privados de su clase principal. Sin embargo, si la superclase tiene métodos
públicos o protegidos (como getters y setters) para acceder a sus campos privados, estos
también pueden ser utilizados por la subclase. Entonces, para evitar esto, usamos atributos
protected.

Visibilidad Public Private Protected Default

Desde la misma Clase SI SI SI SI


Desde cualquier Clase del SI NO SI SI
mismo Paquete

Desde una Subclase del SI NO SI SI


mismo Paquete

Desde una Subclase fuera del SI NO SI, a través de NO


mismo Paquete la herencia

Desde cualquier Clase fuera SI NO NO NO


del Paquete

HERENCIA Y CONSTRUCTORES
Una diferencia entre los constructores y los métodos es que los constructores no se heredan,
pero los métodos sí. Todos los constructores definidos en una superclase pueden ser usados
desde constructores de las subclases a través de la palabra clave super. La palabra clave
super es la que me permite elegir qué constructor, entre los que tiene definida la clase padre,
es el que debo usar. Si la superclase tiene definido el constructor vacío y no colocamos una
llamada explícita super, se llamará el constructor vacío de la superclase.

Class Persona {

public Persona(String nombre, Integer edad, Integer documento){

this.nombre = nombre;

this.edad = edad;

this.documento = documento;

Class Alumno extends Persona {

public Alumno(String materia, String nombre, Integer edad, Integer documento){

super.(nombre, edad, documento);

this.materia = materia;

2
En el ejemplo podemos ver que el constructor de la clase Alumno utiliza la palabra clave
super para llamar al constructor de la superclase y de esa manera utilizarlo como constructor
propio y además sumarle su atributo materia.

La palabra clave super nos sirve para hacer referencia o llamar a los atributos, métodos y
constructores de la superclase en las subclases.

super.atributoClasePadre;

super.metodoClasePadre;

HERENCIA Y MÉTODOS
Todos los métodos accesibles o visibles de una superclase se heredan a sus subclases.
Pero, ¿qué ocurre si una subclase necesita que uno de sus métodos heredados funcione de
manera diferente?

Los métodos heredados pueden ser redefinidos en las clases hijas. Este mecanismo se lo
llama sobreescritura. La sobreescritura permite que las clases hijas sumen sus particulares
en torno al funcionamiento y agrega coherencia al modelo. Esto se logra poniendo la
anotación @Override arriba del método que queremos sobreescribir, el método debe
llamarse igual en la subclase como en la superclase.

Class Persona {

public void codear(){

System.out.println(“Una persona comun no codea”);

Class Alumno extends Persona {

@Override
public void codear(){

System.out.println(“Está aprendiendo”);

En el ejemplo podemos ver que tenemos el mismo método en la clase Persona, que en la
clase Alumno, el método nos va a informar cuales son sus capacidades para codear según
la clase que llamemos. Por lo que en la clase Alumno, cuando heredamos el método lo
sobreescribimos para cambiar su funcionamiento, y hacer que diga algo distinto al método
de Persona.

En los métodos de la superclase, también podemos hacer que tengan un modificador de


acceso protected, esto hace que los únicos que puedan invocar a ese método sean las
subclases.

3
POLIMORFISMO
El término polimorfismo es una palabra de origen griego que significa “muchas formas”. Este
término se utiliza en POO para referirse a la propiedad por la que es posible enviar mensajes
sintácticamente iguales a objetos de tipos distintos, es decir, que la misma operación se
realiza en las clases de diferente forma. Estas operaciones tienen el mismo significado y
comportamiento, pero internamente, cada operación se realiza de diferente forma. El único
requisito que deben cumplir los objetos que se utilizan de manera polimórfica es saber
responder al mensaje que se les envía. Esto hace referencia a la idea de que podemos tener
un método definido en la superclase y que las subclases tengan el mismo método, pero con
distintas funcionalidades

TIPOS DE HERENCIA
Herencia única: en la herencia única, las subclases heredan las características de solo una
superclase. En la imagen a continuación, la clase A sirve como clase base para la clase
derivada B.

Herencia Jerárquica: en la herencia jerárquica, una clase sirve como una superclase (clase
base) para más de una subclase. En la imagen inferior, la clase A sirve como clase base para
la clase derivada B, C y D.

B C D

Herencia Multinivel: en la herencia multinivel, una clase derivada heredará una clase base
y, además, la clase derivada también actuará como la clase base de otra clase. En la
imagen inferior, la clase A sirve como clase base para la clase derivada B, que a su vez
sirve como clase base para la clase derivada C. En Java, una clase no puede acceder
directamente a los miembros de los “abuelos”.

4
Clase
A
Base

Clase
B
Intermedia

Clase
C
Derivada

Herencia Múltiple (a través de interfaces): en Herencia múltiple, una clase puede tener más
de una superclase y heredar características de todas las clases principales. Tenga en
cuenta que Java no admite herencia múltiple con clases. En Java, podemos lograr
herencia múltiple solo a través de Interfaces. En la imagen a continuación, la Clase C se
deriva de la interfaz A y B.

A B

MODIFICADORES DE CLASES Y METODOS


Clases Finales
El modificador final puede utilizarse también como modificador de clases. Al marcar una
clase como final impedimos que se generen hijos a partir de esta clase, es decir, cortamos
la jerarquía de herencia.

public final class Animal{ }

Métodos Finales
El modificador final puede utilizarse también como modificador de métodos. La herencia
nos permite reutilizar el código existente y uno de los mecanismos es la crear una subclase
y sobrescribir alguno de los métodos de la clase padre. Cuando un método es marcado
como final en una clase, evitamos que sus clases hijas puedan sobrescribir estos métodos.

public final void método(){ }

5
Clases Abstractas
En java se dice que una clase es abstracta cuando no se permiten instancias de esa clase,
es decir que no se pueden crear objetos. Nosotros haríamos una clase abstracta por dos
razones. Usualmente las clases abstractas suelen ser las superclases, esto lo hacemos
porque creemos que la superclase o clase padre, no debería poder instanciarse. Por
ejemplo, si tenemos una clase Animal, el usuario no debería poder crear un Animal, sino que
solo debería poder instanciar solo objetos de las subclases

public abstract class Animal { }

Otra razón es porque decidimos hacer métodos abstractos en nuestra superclase. Cuando
una clase posee al menos un método abstracto esa clase necesariamente debe ser
marcada como abstracta.

Métodos Abstractos
Un método abstracto es un método declarado, pero no implementado, es decir, es un
método del que solo se escribe su nombre, parámetros, y tipo devuelto, pero no su código
de implementación. Estos métodos se heredan y se sobreescriben por las clases hijas
quienes son las responsables de implementar sus funcionalidades. ¿Qué utilidad tiene un
método abstracto? Podemos ver un método abstracto como una palanca que fuerza dos
cosas: la primera, que no se puedan crear objetos de una clase. La segunda, que todas las
subclases sobreescriban el método declarado como abstracto.

public abstract void codear();

Hija:

@Override
Public void codear(){

System.out.println(“Está aprendiendo”);

INTERFACES
Una interfaz en Java es una clase que contiene todos sus métodos abstractos y sus atributos
son sólo constantes. En las interfaces se especifica qué se debe hacer, pero no su
implementación o funcionalidad. Las clases que implementen una interface serán las
responsables de describir la lógica del comportamiento de los métodos, las interfaces se
implementan usando la palabra implements. La principal diferencia entre interface y abstract
es que una interface proporciona un mecanismo de encapsulación de los métodos sin forzar
a la utilización de una herencia.

public interface Interfaz {

public final int constante = 10;

public void metodo();

6
public class Clase implements Interfaz {

@Override
Public void metodo(){

System.out.println(“Implementacion del método”);

System.out.println(“La constante tiene un valor de ” + constante);

7
PREGUNTAS DE APRENDIZAJE
1) ¿Qué palabra se usa para generar la herencia entre clases?

a) implements
b) super
c) this
d) extends

2) ¿Qué código de los siguientes tiene que ver con la herencia?

a) public class Componente extends Producto


b) public class Componente inherit Producto
c) public class Componente implements Producto
d) public class Componente belong to Producto

3) ¿La superclase es la clase?

a) Madre
b) Hija
c) Nieta
d) Es una interfaz

4) Cual de estos componentes de la superclase no hereda la subclase

a) Atributos
b) Métodos
c) Getter/Setters
d) Constructores

5) La superclase debe ser abstracta

a) Siempre
b) Nunca
c) Depende de la situación
d) Cuando implementa una interfaz

6) Podemos acceder a los atributos de una superclase desde una subclase gracias al
modificador de acceso:

a) public
b) private
c) protected
d) final

7) ¿De cuántas clases se puede derivar en Java?

a) Tres clases
b) Dos clases
c) Una clase
d) Cinco clases

8
8) Una clase que termina la cadena de una herencia se la declarara como:

a) final
b) abstract
c) public
d) Ninguna de las anteriores

9) ¿Qué palabra se usa para implementar una interfaz?

a) implements
b) super
c) this
d) extends

10) ¿Qué código asociarías a una Interfaz en Java?

a) public class Componente interface Product


b) Componente cp = new Componente (interfaz)
c) public class Componente implements Producto
d) Componente cp = new Componente.interfaz

9
EJERCICIOS DE APRENDIZAJE
En este módulo de POO, vamos a empezar a ver cómo dos o más clases pueden
relacionarse entre si mediante una herencia de clases.

VER VIDEOS:

A. Herencia 1
B. Herencia 2

1. Tenemos una clase padre Animal junto con sus 3 clases hijas Perro, Gato, Caballo.
La clase Animal tendrá como atributos el nombre, alimento, edad y raza del
Animal.
Crear un método en la clase Animal a través del cual cada clase hija deberá
mostrar luego un mensaje por pantalla informando de que se alimenta. Generar
una clase Main que realice lo siguiente:

VER VIDEOS:

A. Interfaces
B. Clases Abstractas
C. Polimorfismo

2. Crear una superclase llamada Electrodoméstico con los siguientes atributos:


precio, color, consumo energético (letras entre A y F) y peso.

Los constructores que se deben implementar son los siguientes:

• Un constructor vacío.
• Un constructor con todos los atributos pasados por parámetro.
Los métodos a implementar son:

• Métodos getters y setters de todos los atributos.

10
• Método comprobarConsumoEnergetico(char letra): comprueba que la letra
es correcta, sino es correcta usara la letra F por defecto. Este método se debe
invocar al crear el objeto y no será visible.
• Método comprobarColor(String color): comprueba que el color es correcto, y
si no lo es, usa el color blanco por defecto. Los colores disponibles para los
electrodomésticos son blanco, negro, rojo, azul y gris. No importa si el nombre
está en mayúsculas o en minúsculas. Este método se invocará al crear el
objeto y no será visible.
• Metodo crearElectrodomestico(): le pide la información al usuario y llena el
electrodoméstico, también llama los métodos para comprobar el color y el
consumo. Al precio se le da un valor base de $1000.
• Método precioFinal(): según el consumo energético y su tamaño, aumentará
el valor del precio. Esta es la lista de precios:

LETRA PRECIO PESO PRECIO

A $1000 Entre 1 y 19 kg $100

B $800 Entre 20 y 49 kg $500

C $600 Entre 50 y 79 kg $800

D $500 Mayor que 80 kg $1000

E $300

F $100

A continuación se debe crear una subclase llamada Lavadora, con el atributo


carga, además de los atributos heredados.

Los constructores que se implementarán serán:

• Un constructor vacío.
• Un constructor con la carga y el resto de atributos heredados. Recuerda que
debes llamar al constructor de la clase padre.
Los métodos que se implementara serán:

• Método get y set del atributo carga.


• Método crearLavadora (): este método llama a crearElectrodomestico() de la
clase padre, lo utilizamos para llenar los atributos heredados del padre y
después llenamos el atributo propio de la lavadora.

11
• Método precioFinal(): este método será heredado y se le sumará la siguiente
funcionalidad. Si tiene una carga mayor de 30 kg, aumentará el precio en $500,
si la carga es menor o igual, no se incrementará el precio. Este método debe
llamar al método padre y añadir el código necesario. Recuerda que las
condiciones que hemos visto en la clase Electrodoméstico también deben
afectar al precio.
Se debe crear también una subclase llamada Televisor con los siguientes
atributos: resolución (en pulgadas) y sintonizador TDT (booleano), además de los
atributos heredados.
Los constructores que se implementarán serán:

• Un constructor vacío.
• Un constructor con la resolución, sintonizador TDT y el resto de atributos
heredados. Recuerda que debes llamar al constructor de la clase padre.

Los métodos que se implementara serán:

• Método get y set de los atributos resolución y sintonizador TDT.


• Método crearTelevisor(): este método llama a crearElectrodomestico() de la
clase padre, lo utilizamos para llenar los atributos heredados del padre y
después llenamos los atributos del televisor.
• Método precioFinal(): este método será heredado y se le sumará la siguiente
funcionalidad. Si el televisor tiene una resolución mayor de 40 pulgadas, se
incrementará el precio un 30% y si tiene un sintonizador TDT incorporado,
aumentará $500. Recuerda que las condiciones que hemos visto en la clase
Electrodomestico también deben afectar al precio.

Finalmente, en el main debemos realizar lo siguiente:


Vamos a crear una Lavadora y un Televisor y llamar a los métodos necesarios
para mostrar el precio final de los dos electrodomésticos.

3. Siguiendo el ejercicio anterior, en el main vamos a crear un ArrayList de


Electrodomésticos para guardar 4 electrodomésticos, ya sean lavadoras o
televisores, con valores ya asignados.

Luego, recorrer este array y ejecutar el método precioFinal() en cada


electrodoméstico. Se deberá también mostrar el precio de cada tipo de objeto,
es decir, el precio de todos los televisores y el de las lavadoras. Una vez hecho
eso, también deberemos mostrar, la suma del precio de todos los
Electrodomésticos. Por ejemplo, si tenemos una lavadora con un precio de 2000
y un televisor de 5000, el resultado final será de 7000 (2000+5000) para
electrodomésticos, 2000 para lavadora y 5000 para televisor.

4. Se plantea desarrollar un programa que nos permita calcular el área y el perímetro


de formas geométricas, en este caso un circulo y un rectángulo. Ya que este
calculo se va a repetir en las dos formas geométricas, vamos a crear una Interfaz,
llamada calculosFormas que tendrá, los dos métodos para calcular el área, el
perímetro y el valor de PI como constante.

12
Desarrollar el ejercicio para que las formas implementen los métodos de la
interfaz y se calcule el área y el perímetro de los dos. En el main se crearán las
formas y se mostrará el resultado final.

Área circulo: PI * radio ^ 2 / Perímetro circulo: PI * diámetro.

Área rectángulo: base * altura / Perímetro rectángulo: (base + altura) * 2.

13
EJERCICIOS DE APRENDIZAJE EXTRA
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos pueden
realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que venimos
trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas, podes
continuar con estos ejercicios extra, recordando siempre que no es necesario que los
termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es ayudar
a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es que puedas
explicar el ejercicio con la intención de que tu compañero lo comprenda, y no sólo mostrarlo.
¡Muchas gracias!

1. En un puerto se alquilan amarres para barcos de distinto tipo. Para cada Alquiler
se guarda: el nombre, documento del cliente, la fecha de alquiler, fecha de
devolución, la posición del amarre y el barco que lo ocupará.
Un Barco se caracteriza por: su matrícula, su eslora en metros y año de
fabricación.

Sin embargo, se pretende diferenciar la información de algunos tipos de barcos


especiales:

• Número de mástiles para veleros.


• Potencia en CV para barcos a motor.
• Potencia en CV y número de camarotes para yates de lujo.

Un alquiler se calcula multiplicando el número de días de ocupación (calculado


con la fecha de alquiler y devolución), por un valor módulo de cada barco
(obtenido simplemente multiplicando por 10 los metros de eslora).

En los barcos de tipo especial el módulo de cada barco, se calcula sacando el


modulo normal y sumándole el atributo particular de cada barco. En los veleros
se suma el número de mástiles, en los barcos a motor se le suma la potencia en
CV y en los yates se suma la potencia en CV y el número de camarotes.

Utilizando la herencia de forma apropiada, deberemos programar en Java, las


clases y los métodos necesarios que permitan al usuario elegir el barco que
quiera alquilar y mostrarle el precio final de su alquiler.

2. Crear una superclase llamada Edificio con los siguientes atributos: ancho, alto y
largo. La clase edificio tendrá como métodos:

• Método calcularSuperficie(): calcula la superficie del edificio.


• Método calcularVolumen(): calcula el volumen del edifico.

Estos métodos serán abstractos y los implementarán las siguientes clases:

• Clase Polideportivo con su nombre y tipo de instalación que puede ser


Techado o Abierto, esta clase implementará los dos métodos abstractos y los
atributos del padre.

14
• Clase EdificioDeOficinas con sus atributos número de oficinas, cantidad de
personas por oficina y numero de pisos. Esta clase implementará los dos
métodos abstractos y los atributos del padre.
De esta clase nos interesa saber cuantas personas pueden trabajar en todo el
edificio, el usuario dirá cuantas personas entran en cada oficina, cuantas
oficinas y el numero de piso (suponiendo que en cada piso hay una oficina).
Crear el método cantPersonas(), que muestre cuantas personas entrarían en
un piso y cuantas en todo el edificio.

Por ultimo, en el main vamos a crear un ArrayList de tipo Edificio. El ArrayList debe
contener dos polideportivos y dos edificios de oficinas. Luego, recorrer este array
y ejecutar los métodos calcularSuperficie y calcularVolumen en cada Edificio. Se
deberá mostrar la superficie y el volumen de cada edificio.

Además de esto, para la clase Polideportivo nos interesa saber cuantos


polideportivos son techados y cuantos abiertos. Y para la clase EdificioDeOficinas
deberemos llamar al método cantPersonas() y mostrar los resultados de cada
edificio de oficinas.

3. Una compañía de promociones turísticas desea mantener información sobre la


infraestructura de alojamiento para turistas, de forma tal que los clientes puedan
planear sus vacaciones de acuerdo a sus posibilidades. Los alojamientos se
identifican por un nombre, una dirección, una localidad y un gerente encargado
del lugar. La compañía trabaja con dos tipos de alojamientos: Hoteles y
Alojamientos Extrahoteleros.

Los Hoteles tienen como atributos: Cantidad de Habitaciones, Número de Camas,


Cantidad de Pisos, Precio de Habitaciones. Y estos pueden ser de cuatro o cinco
estrellas. Las características de las distintas categorías son las siguientes:

• Hotel **** Cantidad de Habitaciones, Número de camas, Cantidad de Pisos,


Gimnasio, Nombre del Restaurante, Capacidad del Restaurante, Precio de las
Habitaciones.

• Hotel ***** Cantidad de Habitaciones, Número de camas, Cantidad de Pisos,


Gimnasio, Nombre del Restaurante, Capacidad del Restaurante, Cantidad
Salones de Conferencia, Cantidad de Suites, Cantidad de Limosinas, Precio
de las Habitaciones.

Los gimnasios pueden ser clasificados por la empresa como de tipo “A” o de tipo
“B”, de acuerdo a las prestaciones observadas. Las limosinas están disponibles
para cualquier cliente, pero sujeto a disponibilidad, por lo que cuanto más
limosinas tenga el hotel, más caro será.

El precio de una habitación debe calcularse de acuerdo a la siguiente fórmula:


PrecioHabitación = $50 + ($1 x capacidad del hotel) + (valor agregado por
restaurante) + (valor agregado por gimnasio) + (valor agregado por limosinas).

Donde:

Valor agregado por el restaurante:

15
• $10 si la capacidad del restaurante es de menos de 30 personas.
• $30 si está entre 30 y 50 personas.
• $50 si es mayor de 50.

Valor agregado por el gimnasio:

• $50 si el tipo del gimnasio es A.


• $30 si el tipo del gimnasio es B.

Valor agregado por las limosinas:

• $15 por la cantidad de limosinas del hotel.

En contraste, los Alojamientos Extra hoteleros proveen servicios diferentes a los


de los hoteles, estando más orientados a la vida al aire libre y al turista de bajos
recursos. Por cada Alojamiento Extrahotelero se indica si es privado o no, así
como la cantidad de metros cuadrados que ocupa. Existen dos tipos de
alojamientos extrahoteleros: los Camping y las Residencias. Para los Camping se
indica la capacidad máxima de carpas, la cantidad de baños disponibles y si
posee o no un restaurante dentro de las instalaciones. Para las residencias se
indica la cantidad de habitaciones, si se hacen o no descuentos a los gremios y
si posee o no campo deportivo. Realizar un programa en el que se representen
todas las relaciones descriptas.

Realizar un sistema de consulta que le permite al usuario consultar por diferentes


criterios:

• todos los alojamientos.


• todos los hoteles de más caro a más barato.
• todos los campings con restaurante
• todos las residencias que tienen descuento.

4. Sistema Gestión Facultad. Se pretende realizar una aplicación para una facultad
que gestione la información sobre las personas vinculadas con la misma y que se
pueden clasificar en tres tipos: estudiantes, profesores y personal de servicio. A
continuación, se detalla qué tipo de información debe gestionar esta aplicación:

• Por cada persona, se debe conocer, al menos, su nombre y apellidos, su número


de identificación y su estado civil.
• Con respecto a los empleados, sean del tipo que sean, hay que saber su año de
incorporación a la facultad y qué número de despacho tienen asignado.
• En cuanto a los estudiantes, se requiere almacenar el curso en el que están
matriculados.
• Por lo que se refiere a los profesores, es necesario gestionar a qué departamento
pertenecen (lenguajes, matemáticas, arquitectura, ...).
• Sobre el personal de servicio, hay que conocer a qué sección están asignados
(biblioteca, decanato, secretaría, ...).

El ejercicio consiste, en primer lugar, en definir la jerarquía de clases de esta


aplicación. A continuación, debe programar las clases definidas en las que,
además de los constructores, hay que desarrollar los métodos correspondientes
a las siguientes operaciones:

16
• Cambio del estado civil de una persona.
• Reasignación de despacho a un empleado.
• Matriculación de un estudiante en un nuevo curso.
• Cambio de departamento de un profesor.
• Traslado de sección de un empleado del personal de servicio.
• Imprimir toda la información de cada tipo de individuo. Incluya un programa
de prueba que instancie objetos de los distintos tipos y pruebe los métodos
desarrollados.

17
CURSO DE PROGRAMACIÓN FULL STACK

MANEJO DE
EXCEPCIONES
PARADIGMA ORIENTADO A OBJETOS
GUÍA DE MANEJO DE EXCEPCIONES
EXCEPCIONES
El término excepción es una abreviación de la frase “Evento Excepcional”. Una excepción es
un evento que ocurre durante la ejecución de un programa que interrumpe el flujo normal
de las instrucciones del programa.

Existen muchas clases de errores que pueden provocar una excepción, desde un
desbordamiento de memoria o un disco duro estropeado hasta un intento de dividir por cero
o intentar acceder a un vector fuera de sus límites. Cuando esto ocurre, la máquina virtual
Java crea un objeto de la clase exception o error y se notifica el hecho al sistema de
ejecución. Se dice que se ha lanzado una excepción (“Throwing Exception”). Luego, el objeto,
llamado excepción, contiene información sobre el error, incluyendo su tipo y el estado del
programa cuando el error ocurrió.

Después de que un método lanza una excepción, el sistema, en tiempo de ejecución, intenta
encontrar algo que maneje esa excepción. El conjunto de posibles “algo” para manejar la
excepción es la lista ordenada de los métodos que habían sido llamados hasta llegar al
método que produjo el error. Esta lista de métodos se conoce como pila de llamadas. Luego,
el sistema en tiempo de ejecución busca en la pila de llamadas el método que contenga un
bloque de código que pueda manejar la excepción. Este bloque de código es llamado
manejador de excepciones.

Concretamente, una excepción en java es un objeto que modela un evento excepcional, el


cual no debería haber ocurrido. Como observamos anteriormente, al ocurrir estos tipos de
evento la máquina virtual no debe continuar con la ejecución normal del programa. Es
evidente que las excepciones son objetos especiales, son objetos con la capacidad de
cambiar el flujo normal de ejecución. Cuando se detecta un error, una excepción debe ser
lanzada.

Ejemplos de situaciones que provocan una excepción:

• No hay memoria disponible para asignar


• Acceso a un elemento de un array fuera de rango
• Leer por teclado un dato de un tipo distinto al esperado
• Error al abrir un fichero
• División por cero

JERARQUIA DE EXCEPCIONES
En Java, todas las excepciones están representadas por clases. Todas las clases de
excepción se derivan de una clase llamada Throwable. Por lo tanto, cuando se produce una
excepción en un programa, se genera un objeto de algún tipo de clase de excepción.

Hay dos subclases directas de Throwable: Exception y Error:

1. Las excepciones de tipo Error están relacionadas con errores que ocurren en
la Máquina Virtual de Java y no en tu programa. Este tipo de excepciones escapan a
su control y, por lo general, tu programa no se ocupará de ellas. Por lo tanto, este tipo
de excepciones no se describen aquí.

1
2. Los errores que resultan de la actividad del programa están representados por
subclases de Exception. Por ejemplo, dividir por cero, límite de matriz y errores de
archivo caen en esta categoría. En general, tu programa debe manejar excepciones
de estos tipos. Una subclase importante de Exception es RuntimeException, que se
usa para representar varios tipos comunes de errores en tiempo de ejecución.

2
MANEJADOR DE EXCEPCIONES
El manejo de excepciones Java se gestiona a través de cinco palabras
clave: try, catch, throw, throws, y finally. Forman un subsistema interrelacionado en el
que el uso de uno implica el uso de otro.

Las declaraciones del programa que desea supervisar para excepciones están contenidas
dentro de un bloque try. Si se produce una excepción dentro del bloque try, se lanza. Tu
código puede atrapar esta excepción usando catch y manejarlo de una manera racional. Las
excepciones generadas por el sistema son lanzadas automáticamente por el sistema de
tiempo de ejecución de Java. Para lanzar manualmente una excepción, use la palabra
clave throw. En algunos casos, una excepción arrojada por un método debe ser especificada
como tal por una cláusula throws. Cualquier código que debe ejecutarse al salir de un
bloque try se coloca en un bloque finally.

Ahora vamos a ver en detalle cada palabra clave dentro del manejo de excepciones.

El bloque try
Lo primero que hay que hacer para que un método sea capaz de tratar una excepción
generada por la máquina virtual Java o por el propio programa mediante una instrucción
throw es encerrar las instrucciones susceptibles de generarla en un bloque try. En el bloque
try vamos a poner una serie de instrucciones que creemos que puede llegar a tirar una
excepción durante su ejecución y queremos manejarla para evitar la finalización del
programa.

try {

Instrucción1;

Intruscción2;

Instrucción3;

Instrucción4

...

Cualquier excepción que se produzca por alguna instrucción, dentro del bloque try será
analizada por el bloque o bloques catch. En el momento en que se produzca la excepción,
se abandona el bloque try, y las instrucciones que sigan al punto donde se produjo la
excepción no son ejecutadas. Cada bloque try debe tener asociado por lo menos un bloque
catch.

El bloque catch
Por cada bloque try pueden declararse uno o varios bloques catch, cada uno de ellos capaz
de tratar un tipo u otro de excepción. Para declarar el tipo de excepción que es capaz de
tratar un bloque catch, se declara un objeto cuya clase es la clase de la excepción que se
desea tratar o una de sus superclases.

3
try {

BloqueDeIntrucciones

} catch (TipoExcepción nombreVariable) {

BloqueCatch

} catch (TipoExcepción nombreVariable) {

BloqueCatch

Al producirse la excepción dentro de un bloque try, la ejecución del programa se pasa al


primer bloque catch. Si la clase de la excepción se corresponde con la clase o alguna
subclase de la clase declarada en el bloque catch, se ejecuta el bloque de instrucciones
catch y a continuación se pasa el control del programa a la primera instrucción a partir de
los bloques try-catch. Lo más adecuado es utilizar excepciones lo más cercanas al tipo de
error previsto, ya que lo que se pretende es recuperar al programa de alguna condición de
error y si “se meten todas las condiciones en la misma bolsa”, seguramente habrá que
averiguar después qué condición de error se produjo para poder dar una respuesta
adecuada.

try {

// Se intenta hacer la división

int division = 10 / 0;

} catch (ArithmeticException a) {

// Si la división falla el programa va al bloque catch y se ejecuta el


System.out.println

System.out.println(“Error: división por cero”);

En este ejemplo en el bloque try hacemos una división por cero, las divisiones por cero
generan un tipo de excepción llamado, ArithmeticExcepction. En el bloque catch ponemos
como tipo de excepción la ArithmeticException y dentro del bloque ponemos un mensaje
que explique cual ha sido el error.

Métodos Throwable

Dentro del bloque catch, utilizamos un System.out.print para mostrar el error, pero no hemos
estado haciendo nada con el objeto de excepción en sí mismo. Como muestran todos los
ejemplos anteriores, una cláusula catch especifica un tipo de excepción y un parámetro. El
parámetro recibe el objeto de excepción. Como todas las excepciones son subclases de
Throwable, todas las excepciones admiten los métodos definidos por Throwable.

Estos métodos son:

Método Sintaxis Descripción


Devuelve una descripción de la
getMessage String getMessage()
excepción

4
Devuelve un objeto Throwable
que contiene un seguimiento
fillInStackTrace Throwable fillInStackTrace()
de pila completo. Este objeto se
puede volver a lanzar.
Devuelve un objeto String que
contiene una descripción
completa de la excepción. Este
toString String toString()
método lo llama println()
cuando se imprime un objeto
Throwable.

try {

int division = 10 / 0;

} catch (ArithmeticException a) {

System.out.println(“Error:” + a.getMessage());

System.out.println(“Error:” + a)

System.out.println(a.fillStrakTrace());

Resultado

Error: / by zero

Error: / by zero

Error: java.lang.ArithmeticException: / by zero

java.lang.ArithmeticException: / by zero

El bloque finally
El bloque finally se utiliza para ejecutar un bloque de instrucciones sea cual sea la excepción
que se produzca. Este bloque se ejecutará siempre, incluso si no se produce ninguna
excepción. Sirve para no tener que repetir código en el bloque try y en los bloques catch. El
bloque finally es un buen lugar en donde liberar los recursos tomados dentro del bloque de
intento.

try {

BloqueDeIntrucciones

} catch (TipoExcepción nombreVariable) {

MensajeDeError

} catch (TipoExcepción nombreVariable) {

MensajeDeError

} finally {

CodigoFinal

5
try {

// Se intenta hacer la división

int division = 10 / 0;

} catch (ArithmeticException a) {

// Si la división falla el programa va al bloque catch y se ejecuta el


System.out.println

System.out.println(“Error: división por cero”);

} finally {

// Si el programa hizo la división o no, este System.out.print se va a ejecutar


igual

System.out.println(“Saliendo del try”);

La claúsula throws
La cláusula throws lista las excepciones que un método puede lanzar. Los tipos de
excepciones que lanza el método se especifica después de los paréntesis de un método,
con una cláusula throws. Un método puede lanzar objetos de la clase indicada o de
subclases de la clase indicada.

Java distingue entre las excepciones verificadas y errores. Las excepciones verificadas
deben aparecer en la cláusula throws de ese método. Como las RuntimeExceptions y los
Errores pueden aparecer en cualquier método, no tienen que listarse en la cláusula throws y
es por esto que decimos que no están verificadas. Todas las excepciones que no son
RuntimeException y que un método puede lanzar deben listarse en la cláusula throws del
método y es por eso que decimos que están verificadas. El requisito de atrapar excepciones
en Java exige que el programador atrape todas las excepciones verificadas o bien las
coloque en la cláusula throws de un método.

Si la excepción no se trata, el manejador de excepciones realiza lo siguiente:

• Muestra la descripción de la excepción.


• Muestra la traza de la pila de llamadas.
• Provoca el final del programa.

Colocar una excepción en la cláusula throws obliga a otros métodos a ocuparse de la


excepción. Esto se puede hacer colocando otro throws al método que llama al método, con
el tipo de excepción que podría tirar o rodear el llamado del método con un try-catch, y de
esa manera que el try-catch se encargue de manejar la excepción que podría tirar el método.

[acceso][modificador][tipo] nombreFuncion() throws TipoDeExcepcion {

Bloque de instrucciones

6
// Tenemos un método que devuelve un resultado y que tira una ArithmeticException

public int division() throws ArithmeticException {

int division;

// Hacemos la división, si la división tira una excepción la manejará el


try/catch del llamado a la función

division = 20 / 0;

// Si tira una excepción el método no va a devolver ningún resultado

return division;

Main

try {

// Llamamos a la función, si tira una excepción va al bloque catch y ejecuta el


mensaje de error, sino imprime el resultado de la división.

System.out.println(division());

} catch (ArithmeticException a) {

System.out.println(“Error: división por cero”);

La palabra throw

Los programas escritos en Java pueden lanzar excepciones explícitamente mediante la


instrucción throw, lo que facilita la devolución de un “código de error” al método que invocó
el método que causó el error. La cláusula throw debe ir seguida del tipo de excepción que
queremos que lance el método. Puede lanzarse cualquier tipo de excepción que
implemente la interfaz Throwable.

Cuando se lanza una excepción usando la palabra throw, el flujo de ejecución del programa
se detiene y el control se transfiere al bloque try-catch más cercano que coincida con el tipo
de excepción lanzada. Si no se encuentra tal coincidencia, el controlador de excepciones
predeterminado finaliza el programa. La palabra clave throw es útil para lanzar excepciones
basadas en ciertas condicione, por ejemplo, si un usuario ingresa datos incorrectos. También
es útil para lanzar excepciones personalizadas específicas para un programa o aplicación.

Cuando utilicemos la palabra throw en un método, vamos a tener que agregarle la palabra
throws al método con la excepción que va a tirar nuestro throw. De esa manera avisamos
que cuando se llame al método hay que manejar una posible excepción.

throw new TipoExcepcion(“Mensaje de error”);

7
// En este método recibimos una lista y un numero para agregar a dicha lista.
El método contiene la palabra throws para avisar que este método puede tirar
una excepción

public void agregarNumeroLista(List<Integer> lista, int numero) throws


Exception{

// Validamos si la lista ya tiene el numero a agregar

if(lista.contains(numero){

// Si lo tiene tiramos un excepción de tipo Exception, poniéndole un mensaje


entre los paréntesis

throw new Exception(“El numero ya está en la lista);

// Si no contiene el numero, lo agregamos a la lista

lista.add(numero);

Main

List<Integer> lista = new ArrayList();

try{

//Llamamos al método dentro de un try/catch para manejar la posible excepción

agregarNumeroLista(lista, 1);

catch (Exception e){

//Usamos el metodo getMessage, para obtener el mensaje que pusimos en el throw

System.out.println(e.getMessage);

8
PREGUNTAS DE APRENDIZAJE
1) La clase Error maneja errores:

a) Del código
b) De la Maquina Virtual de Java
c) De Netbeans
d) Ninguna de las anteriores

2) La clase Exception maneja errores:

a) Del código
b) De la Maquina Virtual de Java
c) De Netbeans
d) Ninguna de las anteriores

3) Las excepciones se manejan con el bloque:

a) Finally
b) Throws
c) Try Catch
d) Throw

4) Para cerrar recursos después de una operación usamos el bloque:

a) Finally
b) Throws
c) Try Catch
d) Throw

5) Cuando queremos informar que un método puede tirar una excepción usamos el bloque:

a) Finally
b) Throws
c) Try Catch
d) Throw

6) Cuando queremos lanzar una excepción de manera explicita usamos el bloque:

a) Finally
b) Throws
c) Try Catch
d) Throw

7) En Java la diferencia entre throws y throw es:

a) throws arroja una excepción y throw indica el tipo de excepción que no maneja el
método
b) throws se usa en los metodos y throw en los constructores
c) throws indica el tipo de excepcición que no maneja el método y throw arroja una
excepción
d) Ninguna de las anteriores

9
EJERCICIOS DE APRENDIZAJE
En este módulo vamos a empezar a manejar los errores y las excepciones de nuestro código
para poder seguir trabajando sin que el código se detenga

MANEJO DE EXCEPCIONES
VER VIDEOS:

A. Excepciones I
B. Excepciones II

1. Inicializar un objeto de la clase Persona ejercicio 7 de la guía POO, a null y tratar


de invocar el método esMayorDeEdad() a través de ese objeto. Luego, englobe el
código con una cláusula try-catch para probar la nueva excepción que debe ser
controlada.

2. Definir una Clase que contenga algún tipo de dato de tipo array y agregue el
código para generar y capturar una excepción ArrayIndexOutOfBoundsException
(índice de arreglo fuera de rango).

3. Defina una clase llamada DivisionNumero. En el método main utilice un Scanner


para leer dos números en forma de cadena. A continuación, utilice el método
parseInt() de la clase Integer, para convertir las cadenas al tipo int y guardarlas en
dos variables de tipo int. Por ultimo realizar una división con los dos numeros y
mostrar el resultado.
Todas estas operaciones puede tirar excepciones a manejar, el ingreso por
teclado puede causar una excepción de tipo InputMismatchException, el método
Integer.parseInt() si la cadena no puede convertirse a entero, arroja una
NumberFormatException y además, al dividir un número por cero surge una
ArithmeticException. Manipule todas las posibles excepciones utilizando bloques
try/catch para las distintas excepciones

4. Escribir un programa en Java que juegue con el usuario a adivinar un número. La


computadora debe generar un número aleatorio entre 1 y 500, y el usuario tiene
que intentar adivinarlo. Para ello, cada vez que el usuario introduce un valor, la
computadora debe decirle al usuario si el número que tiene que adivinar es mayor
o menor que el que ha introducido el usuario. Cuando consiga adivinarlo, debe
indicárselo e imprimir en pantalla el número de veces que el usuario ha intentado
adivinar el número. Si el usuario introduce algo que no es un número, se debe
controlar esa excepción e indicarlo por pantalla. En este último caso también se
debe contar el carácter fallido como un intento.

5. Dado el método metodoA de la clase A, indique:

a) ¿Qué sentencias y en qué orden se ejecutan si se produce la excepción


MioException?

10
b) ¿Qué sentencias y en qué orden se ejecutan si no se produce la excepción
MioException?

class A {
void metodoA() {
sentencia_a1
sentencia_a2
try {
sentencia_a3
sentencia_a4
} catch (MioException e){
sentencia_a6
}
sentencia_a5
}
}

6. Dado el método metodoB de la clase B, indique:

a) ¿Qué sentencias y en qué orden se ejecutan si se produce la excepción


MioException?
b) ¿Qué sentencias y en qué orden se ejecutan si no se produce la excepción
MioException?

class B {
void metodoB() {
sentencia_b1
try {
sentencia_b2
} catch (MioException e){
sentencia_b3
}
finally
sentencia_b4
}
}

7. Indique que se mostrará por pantalla cuando se ejecute cada una de estas clases:

class Uno{

private static int metodo() {

int valor=0;

try {

valor = valor+1;

valor = valor + Integer.parseInt (”42”);

valor = valor +1;

System.out.println(”Valor final del try:” + valor) ;

} catch (NumberFormatException e) {

11
Valor = valor + Integer.parseInt(”42”);

System.out.println(“Valor final del catch:” + valor);

} finally {

valor = valor + 1;

System.out.println(”Valor final del finally: ” + valor) ;

valor = valor +1;

System.out.println(”Valor antes del return: ” + valor) ;

return valor;

public static void main (String[] args) {

try {

System.out.println (metodo()) ;

}catch(Exception e) {

System.err.println(”Excepcion en metodo() ”) ;

e.printStackTrace();

class Dos{

private static metodo() {

int valor=0;

try{

valor = valor + 1;

valor = valor + Integer.parseInt (”W”);

valor = valor + 1;

System.out.println(”Valor final del try: ” + valor) ;

} catch ( NumberFormatException e ) {

valor = valor + Integer.parseInt (”42”);

System.out.println(”Valor final del catch: ” + valor) ;

} finally {

valor = valor + 1;

System.out.println(”Valor final del finally: ” + valor) ;

12
}

valor = valor + 1;

System.out.println(”Valor antes del return: ” + valor) ;

return valor;

public static void main (String[] args) {

try{

System.out.println ( metodo ( ) ) ;

} catch(Exception e) {

System.err.println ( ” Excepcion en metodo ( ) ” ) ;

e.printStackTrace();

class Tres{

private static metodo( ) {

int valor=0;

try{

valor = valor + 1;

valor = valor + Integer.parseInt (”W”);

valor = valor + 1;

System.out.println(”Valor final del try: ” + valor);

} catch(NumberFormatException e) {

valor = valor + Integer.parseInt (”W”);

System.out.println(”Valor final del catch: ” + valor);

} finally{

valor = valor + 1;

System.out.println(”Valor final del finally:” + valor);

valor = valor + 1;

System.out.println(”Valor antes del return: ” + valor) ;

return valor;

13
public static void main (String[] args) {

try{

System.out.println( metodo ( ) ) ;

} catch(Exception e) {

System.err.println(”Excepcion en metodo ( ) ” ) ;

e.printStackTrace();

8. Dado el método metodoC de la clase C, indique:

a) ¿Qué sentencias y en qué orden se ejecutan si se produce la excepción


MioException?
b) ¿Qué sentencias y en qué orden se ejecutan si no se produce la excepción
MioException?
c) ¿Qué sentencias y en qué orden se ejecutan si se produce la excepción TuException?

class C {

void metodoC() throws TuException{

sentencia_c1

try {

sentencia_c2

sentencia_c3

} catch (MioException e){

sentencia_c4

} catch (TuException e){

sentencia_c5

throw (e)

finally

sentencia_c6

IMPORTANTE: A partir de la próxima guía se debe aplicar en todos los ejercicios el manejo
de excepciones cada vez que sea necesario controlar una posible excepción.

14
EJERCICIO INTEGRADOR COMPLEMENTARIO
Este ejercicio va a requerir que utilicemos todos conocimientos previamente vistos en esta
y otras guías. Estos pueden realizarse cuando hayas terminado todas las guías y tengas una
buena base sobre todo lo que veníamos trabajando. Además, si ya terminaste la guía y te
queda tiempo libre en las mesas, podes continuar con este ejercicio complementario,
recordando siempre que no es necesario que los termines para continuar con el tema
siguiente. Este ejercicio, no lleva nota y es solamente para medir nuestros conocimientos.
Por ultimo, recordá que la prioridad es ayudar a los compañeros de la mesa y que cuando
tengas que ayudar, lo más valioso es que puedas explicar el ejercicio con la intención de
que tu compañero lo comprenda, y no sólo mostrarlo. ¡Muchas gracias!

Armadura Iron Man:

J.A.R.V.I.S. es una inteligencia artificial desarrollada por Tony Stark. Está programado para
hablar con voz masculina y acento británico. Actualmente se encarga de todo lo
relacionado con la información doméstica de su casa, desde los sistemas de calefacción
y refrigeración hasta los Hot Rod que Stark tiene en su garage.

Tony Stark quiere adaptar a J.A.R.V.I.S. para que lo asista en el uso de sus armaduras, por
lo tanto, serás el responsable de llevar adelante algunas de estas tareas.

El objetivo de JARVIS es que analice intensivamente toda la información de la armadura


y del entorno y en base a esto tome decisiones inteligentes.

En este trabajo se deberá crear en el proyecto una clase llamada Armadura que modele
toda la información y las acciones que pueden efectuarse con la Armadura de Iron Man.
La armadura de Iron Man es un exoesqueleto mecánico ficticio usado por Tony Stark
cuando asume la identidad de Iron Man. La primera armadura fue creada por Stark y Ho
Yinsen, mientras estuvieron prisioneros.

Las armaduras de Stark se encuentran definidas por un color primario y un color


secundario. Se encuentran compuestas de dos propulsored, uno en cada bota; y dos
repulsores, uno en cada guante (los repulsores se utilizan también como armas). Tony los
utiliza en su conjunto para volar.

La armadura tiene un nivel de resistencia, que depende del material con el que está
fabricada, y se mide con un número entero cuya unidad de medida de dureza es
Rockwell (https://es.wikipedia.org/wiki/Dureza_Rockwell). Todas las armaduras poseen
un nivel de salud el cual se mide de 0 a 100. Además, Tony tiene un generador, el cual le
sirve para salvarle la vida en cada instante de tiempo alejando las metrallas de metal de
su corazón y también para alimentar de energía a la armadura. La batería a pesar de estar
en el pecho de Tony, es considerada como parte de la armadura.

La armadura también posee una consola en el casco, a través de la cual JARVIS le


escribe información a Iron Man. En el casco también se encuentra un sintetizador por
donde JARVIS susurra cosas al oído de Tony. Cada dispositivo de la armadura de Iron
Man (botas, guantes, consola y sintetizador) tienen un consumo de energía asociado.

15
En esta primera etapa con una armadura podremos: caminar, correr, propulsar, volar,
escribir y leer.

• Al caminar la armadura hará un uso básico de las botas y se consumirá la energía


establecida como consumo en la bota por el tiempo en el que se camine.
• Al correr la armadura hará un uso normal de las botas y se consumirá el doble de la
energía establecida como consumo en la bota por el tiempo en el que se corra.
• Al propulsarse la armadura hará un uso intensivo de las botas utilizando el triple de la
energía por el tiempo que dure la propulsión.
• Al volar la armadura hará un uso intensivo de las botas y de los guantes un uso normal
consumiendo el triple de la energía establecida para las botas y el doble para los
guantes.
• Al utilizar los guantes como armas el consumo se triplica durante el tiempo del
disparo.
• Al utilizar las botas para caminar o correr el consumo es normal durante el tiempo
que se camina o se corra.
• Cada vez que se escribe en la consola o se habla a través del sintetizador se consume
lo establecido en estos dispositivos. Solo se usa en nivel básico.
• Cada vez que se efectúa una acción se llama a los métodos usar del dispositivo se le
pasa el nivel de intensidad y el tiempo. El dispositivo debe retornar la energía
consumida y la armadura deberá informar al generador se ha consumido esa
cantidad de energía.

Modele las clases, los atributos y los métodos necesarios para poder obtener un modelo
real de la armadura y del estado de la misma.

Mostrando Estado

Hacer un método que JARVIS muestre el estado de todos los dispositivos y toda la
información de la Armadura.

Estado de la Batería

Hacer un método para que JARVIS informe el estado de la batería en porcentaje a través
de la consola. Poner como carga máxima del reactor el mayor float posible. Ejecutar
varias acciones y mostrar el estado de la misma.

Mostrar Información del Reactor

Hacer un método para que JARVIS informe el estado del reactor en otras dos unidades
de medida. Hay veces en las que Tony tiene pretensiones extrañas. Buscar en Wikipedia
la tabla de transformaciones.

Sufriendo Daños

A veces los dispositivos de la armadura sufren daños para esto cada dispositivo contiene
un atributo público que dice si el dispositivo se encuentra dañado o no. Al utilizar un
dispositivo existe un 30% de posibilidades de que se dañe.

La armadura solo podrá utilizar dispositivos que no se encuentren dañados.

16
Modifique las clases que sean necesarias para llevar adelante este comportamiento.

Reparando Daños

Hay veces que se puede reparar los daños de un dispositivo, en general es el 40% de las
veces que se puede hacer. Utilizar la clase Random para modelar este comportamiento.
En caso de estar dentro de la probabilidad (es decir probabilidad menor o igual al 40%)
marcar el dispositivo como sano. Si no dejarlo dañado.

Revisando Dispositivos

Los dispositivos son revisados por JARVIS para ver si se encuentran dañados. En caso
de encontrar un dispositivo dañado se debe intentar arreglarlo de manera insistente. Para
esos intentos hay un 30% de posibilidades de que el dispositivo quede destruido, pero
se deberá intentar arreglarlo hasta que lo repare, o bien hasta que quede destruido.

Hacer un método llamado revisar dispositivos que efectúe lo anteriormente descrito, el


mecanismo insistente debe efectuarlo con un bucle do while.

Radar Versión 1.0

JARVIS posee también incorporado un sistema que usa ondas electromagnéticas para
medir distancias, altitudes, ubicaciones de objetos estáticos o móviles como aeronaves
barcos, vehículos motorizados, formaciones meteorológicas y por su puesto enemigos
de otro planeta.

Su funcionamiento se basa en emitir un impulso de radio, que se refleja en el objetivo y


se recibe típicamente en la misma posición del emisor.

Las ubicaciones de los objetos están dadas por las coordenadas X, Y y Z. Los objetos
pueden ser marcados o no como hostiles. JARVIS también puede detectar la resistencia
del objeto, y puede detectar hasta 10 objetos de manera simultánea.

JARVIS puede calcular la distancia a la que se encuentra cada uno de los objetos, para
esto siempre considera que la armadura se encuentra situada en la coordenada (0,0,0).

Hacer un método que informen a qué distancia se encuentra cada uno de los enemigos.
Usar la clase Math de Java.

Simulador

Hacer un método en JARVIS que agregue en radar objetos, hacer que la resistencia, las
coordenadas y la hostilidad sean aleatorios utilizando la clase random. Utilizar la clase
Random.

¿Qué ocurre si quiero añadir más de 10 objetos?


¿Qué ocurre si cuando llevo 8 enemigos aumento la capacidad del vector?

Destruyendo Enemigos

Desarrollar un método para que JARVIS que analice todos los objetos del radar y si son
hostiles que les dispare. El alcance de los guantes es de 5000 metros, si el objeto se
encuentra fuera de ese rango no dispara.

17
JARVIS al detectar un enemigo lo atacará hasta destruirlo, la potencia del disparo es
inversamente proporcional a la distancia al a que se encuentra el enemigo y se
descontará de la resistencia del enemigo. El enemigo se considera destruido si su
resistencia es menor o igual a cero.

JARVIS solo podrá disparar si el dispositivo está sano y si su nivel de batería lo permite.
Si tiene los dos guantes sanos podrá disparar con ambos guantes haciendo más daño.
Resolver utilizando un for each para recorrer el arreglo y un while para destruir al enemigo.

Acciones Evasivas

Desarrollamos un método para que JARVIS que analice todos los objetos del radar y si
son hostiles que les dispare. Modificar ese método para que si el nivel de batería es
menor al 10% se corten los ataques y se vuelve lo suficientemente lejos para que el
enemigo no nos ataque. Deberíamos alejarnos por lo menos 10 km enemigo. Tener en
cuenta que la velocidad de vuelo promedio es de 300 km / hora.

Bibliografía
Información sacada de las paginas:

- https://www.oracle.com/ar/database/what-is-a-relational-database/

18
- https://www.geeksforgeeks.org/sql-tutorial/

19
CURSO DE PROGRAMACIÓN FULL STACK

BASES DE DATOS
CON MYSQL
GUÍA DE BASE DE DATOS
BASE DE DATOS
Una base de datos es una colección organizada de información estructurada, o datos,
típicamente almacenados electrónicamente en un sistema de computadora. Una base de
datos es usualmente controlada por un sistema de gestión de base de datos (DBMS). En
conjunto, los datos y el DBMS, junto con las aplicaciones que están asociados con ellos, se
conocen como un sistema de base de datos, que a menudo se reducen a solo base de
datos.

Los datos dentro de los tipos más comunes de bases de datos en funcionamiento hoy en
día se modelan típicamente en filas y columnas en una serie de tablas para que el
procesamiento y la consulta de datos sean eficientes. Luego se puede acceder,
administrar, modificar, actualizar, controlar y organizar fácilmente los datos. La mayoría de
las bases de datos utilizan lenguaje de consulta estructurado (SQL) para escribir y consultar
datos.

¿CUÁL ES LA DIFERENCIA ENTRE UNA BASE DE DATOS Y UNA


HOJA DE CÁLCULO?
Las bases de datos y las hojas de cálculo (como Microsoft Excel) son dos formas
convenientes de almacenar información. Las principales diferencias entre las dos son:

• Cómo se almacenan y manipulan los datos

• Quién puede acceder a los datos

• Cuántos datos se pueden almacenar

Las hojas de cálculo se diseñaron originalmente para un usuario, y sus características lo


reflejan. Son muy buenas para un solo usuario o un pequeño número de usuarios que no
necesitan manipular una gran cantidad de datos complicados. Las bases de datos, por otro
lado, están diseñadas para contener colecciones mucho más grandes de información
organizada, cantidades masivas en ocasiones. Las bases de datos permiten a múltiples
usuarios al mismo tiempo acceder y consultar los datos de forma rápida y segura utilizando
una lógica y un lenguaje altamente complejos.

¿POR QUÉ INTERESA USAR UNA BASE DE DATOS?


• Mayor independencia. Los datos son independientes de las aplicaciones que los usan,
así como de los usuarios.
• Mayor disponibilidad. Se facilita el acceso a los datos desde contextos, aplicaciones y
medios distintos, haciéndolos útiles para un mayor número de usuarios.
• Mayor seguridad (protección de los datos). Por ejemplo, resulta más fácil replicar una
base de datos para mantener una copia de seguridad que hacerlo con un conjunto de
ficheros almacenados de forma no estructurada. Además, al estar centralizado el
acceso a los datos, existe una verdadera sincronización de todo el trabajo que se haya
podido hacer sobre estos (modificaciones), con lo que esa copia de seguridad servirá a
todos los usuarios.

1
• Menor redundancia. Un mismo dato no se encuentra almacenado en múltiples archivos
o con múltiples esquemas distintos, sino en una única instancia en la base de datos.
Esto redunda en menor volumen de datos y mayor rapidez de acceso.
• Mayor eficiencia en la captura, codificación y entrada de datos.

CLASIFICACIÓN DE LAS BASES DE DATOS


Hay muchos tipos diferentes de bases de datos. La mejor base de datos para una
organización específica depende de cómo la organización pretende utilizar los datos.

• Bases de datos relacionales: Los elementos de una base de datos relacional se


organizan como un conjunto de tablas con columnas y filas. La tecnología de base
de datos relacional proporciona la manera más eficiente y flexible de acceder a
información estructurada.
• Bases de datos orientadas a objetos: La información en una base de datos orientada
a objetos se representa en forma de objetos, como en la programación orientada a
objetos.
• Bases de datos NoSQL: Una NoSQL, o una base de datos no relacional, permite que
los datos no estructurados y semiestructurados se almacenen y manipulen, a
diferencia de una base de datos relacional, que define cómo deben componerse
todos los datos insertados en la base de datos. Las bases de datos NoSQL se
hicieron populares a medida que las aplicaciones web se hacían más comunes y
más complejas.

BASE DE DATOS RELACIONALES


Las bases de datos relacionales se basan en el modelo relacional, una forma intuitiva y
directa de representar datos en tablas. En una base de datos relacional, cada fila de la tabla
es un registro con un ID único llamado clave. Las columnas de la tabla contienen atributos
de los datos, y cada registro generalmente tiene un valor para cada atributo, lo que facilita
el establecimiento de las relaciones entre los puntos de datos.

MODELO RELACIONAL

En los primeros años de las bases de datos, cada aplicación almacenaba datos en su
propia estructura única. Cuando los desarrolladores querían crear aplicaciones para usar
esos datos, tenían que saber mucho sobre la estructura de datos particular para encontrar
los datos que necesitaban. Estas estructuras de datos eran ineficientes, difíciles de
mantener y difíciles de optimizar para ofrecer un buen rendimiento de la aplicación. El
modelo de base de datos relacional se diseñó para resolver el problema de varias
estructuras de datos arbitrarias.

El modelo relacional proporcionó una forma estándar de representar y consultar datos que
cualquier aplicación podría utilizar. Desde el principio, los desarrolladores reconocieron
que la principal fortaleza del modelo de base de datos relacional estaba en el uso de
tablas, que eran una forma intuitiva, eficiente y flexible de almacenar y acceder a
información estructurada.

2
Con el tiempo, cuando los desarrolladores comenzaron a utilizar el lenguaje de consulta
estructurado (SQL) para escribir y consultar datos en una base de datos, surgió otra
fortaleza del modelo relacional. Durante muchos años, se utilizó ampliamente el SQL como
lenguaje para consultas de bases de datos. El SQL, que se basa en el álgebra relacional,
proporciona un lenguaje matemático internamente consistente que facilita la mejora del
rendimiento de todas las consultas de la base de datos. En comparación, otros enfoques
deben definir consultas individuales.

MODELO ENTIDAD-RELACION
Un modelo entidad-relación es una herramienta para el modelo de datos, la cual facilita la
representación de entidades de una base de datos.

El modelo de datos entidad-relación está basado en una percepción del mundo real que
consta de una colección de objetos básicos, llamados entidades, y de relaciones entre
esos objetos amorfos. De esa manera facilita su utilización.

TABLAS (TUPLA)

Cada tabla va a representar un conjunto de objetos del mundo real a guardar. Por ejemplo
alumnos, autos, cursos, etc. Cada tabla va a contar de columnas y filas, las columnas van a
ser los atributos de cada objeto, por ejemplo, nombre, apellido, edad, etc. Y cada fila va a
ser un objeto único, cada objeto tendrá también sus propios valores, conocidos como
atributos.

FILAS (ENTIDAD)

El elemento básico representado por el modelo entidad relación es una entidad, que es un
objeto del mundo real con una existencia independiente. Una entidad puede ser un
elemento con una existencia física (por ejemplo, una persona en particular, un coche, una
casa o un empleado) o puede ser un elemento con una existencia conceptual (por
ejemplo, una venta, un trabajo o un curso universitario). Cada entidad tiene atributos
(propiedades particulares que la describen).

ID Nombre Apellido Edad

1 Agustín Cocco 24

2 Martin Bullon 21

3 Gaston Cabral 18

En este ejemplo vemos la tabla Alumnos, donde tenemos las columnas ID, nombre,
apellido y edad. En esta tabla vamos a tener filas, cada fila va a representar un alumno, con
cada alumno con su propia información.

3
ATRIBUTOS

Un atributo es una abstracción que identifica características, propiedades que posee una
entidad. Los atributos de una entidad deben ser:

• Completos: capturar toda la información que interesa del objeto, desde el punto de
vista del sistema.
• Plenamente elaborados: cada atributo captura un aspecto separado de la entidad.
• Mutuamente independientes: cada atributo debe tomar un valor independientemente
de los valores asumidos por otros atributos.

IDENTIFICADOR ÚNICO

Se denomina identificador a uno o más atributos que identifican unívocamente cada


instancia de una entidad; es conocido también como "clave candidata". Es decir, nunca
puede existir dos instancias de una entidad con el mismo valor de su atributo identificador.

El o los atributos identificadores se señalan con el símbolo "@"(arroba), o de lo contrario


con la sigla PK (clave primaria).

Para garantizar que los datos sean siempre precisos y accesibles, las bases de datos
relacionales siguen ciertas reglas de integridad. Por ejemplo, una regla de integridad
puede especificar que no se permitan filas duplicadas en una tabla, para eliminar la
posibilidad de que ingrese información errónea en la base de datos. Esto se puede lograr
gracias al identificador único, cada objeto/fila, tendrá un valor único que no se puede
repetir y evita datos duplicados.

Para mejorar el desempeño de la base de datos se recomienda utilizar identificadores


numéricos; por lo tanto, si una entidad no posee un atributo identificador numérico, se
debería agregar un atributo, comúnmente llamado id (abreviación de identificador) seguido
por el nombre de la entidad.

ID Nombre Apellido Edad

1 Agustín Cocco 24

2 Martin Bullon 21

3 Agustín Cocco 18

En esta tabla Alumnos, tendremos dos alumnos con el mismo nombre y apellido, pero con
distintos identificadores y distintas edades, por lo que no se consideran datos duplicados.
Si nosotros nos basáramos en el nombre para evitar datos duplicados, no podríamos
ingresar dos alumnos con el mismo nombre, esta es otra de las ventajas del identificador
único.

4
LLAVE FORANEA

Una llave foránea es una clave que se utiliza para vincular dos tablas. A veces, esto también
se denomina clave de referencia. Una llave foránea es una columna o una combinación de
columnas cuyos valores coinciden con una clave primaria de una tabla diferente.

La relación entre 2 tablas coincide con la clave principal en una de las tablas con una clave
externa en la segunda tabla. Por ejemplo, si tenemos las tablas profesor y curso, para
relacionarlas, tendríamos una llave foránea de la llave principal de un profesor como
columna en la tabla curso. De esta manera se dice que ese profesor pertenece a ese curso.

Id Nombre Apellido Edad Id Nombre Costo id_profesor

1 Agustín Cocco 24 1 Curso de 500 1


Programación

En este ejemplo la tabla Curso (tabla de la derecha), tiene una columna llamada
id_profesor, esta columna es la que va a tener las llaves foráneas y la que va mostrar que
hay una relación en entre las dos tablas. En este ejemplo, la columna id_profesor, tiene el id
1 del profesor Agustín, por lo que, seria correcto decir que Agustín es el profesor del Curso
de Programación.

RELACIONES

Una relación es la abstracción de un conjunto de asociaciones que existen entre las tablas
de dos entidades, por ejemplo, existe una relación entre Película (tabla Películas) y
PaisDeOrigen (tabla PaisesDeOrigen).

• Las relaciones tienen sentido bidireccional.


• Las relaciones existen ya que las entidades representan aspectos del mundo real y en
este mundo los componentes no están aislados, sino que se relacionan entre sí; es por
esto que es necesario que existan las relaciones entre las entidades.

¿QUÉ ES EL SOFTWARE DE BASE DE DATOS?


El software de base de datos se utiliza para crear, editar y mantener archivos y registros de
bases de datos, lo que facilita la creación de archivos y registros, la entrada de datos, la
edición de datos, las actualizaciones y los informes. El software también se encarga del
almacenamiento de datos, las copias de seguridad y los informes, el control de acceso
múltiple y la seguridad. La sólida seguridad de las bases de datos es especialmente
importante hoy en día, ya que el robo de información se vuelve más frecuente. En
ocasiones, el software de base de datos también se denomina "sistema de administración
de bases de datos" (DBMS).

5
El software de base de datos simplifica la gestión de la información al permitirles a los
usuarios almacenar datos en una forma estructurada y luego, acceder a ellos. Por lo
general, tiene una interfaz gráfica para ayudar a crear y administrar los datos y, en algunos
casos, los usuarios pueden crear sus propias bases de datos mediante el software de base
de datos.

¿QUÉ ES UN SISTEMA DE ADMINISTRACIÓN DE BASE DE DATOS


(DBMS)?
Una base de datos generalmente requiere un programa completo de software de base de
datos, que se conoce como sistema de administración de bases de datos (DBMS). Un
DBMS sirve como una interfaz entre la base de datos y sus usuarios o programas finales, lo
que permite a los usuarios recuperar, actualizar y administrar cómo se organiza y optimiza
la información. Un DBMS también facilita la supervisión y el control de las bases de datos,
lo que permite una variedad de operaciones administrativas, como la supervisión del
rendimiento, el ajuste, las copias de seguridad y la recuperación.
Algunos ejemplos de software de bases de datos o DBMS populares incluyen MySQL,
Microsoft Access, Microsoft SQL Server, FileMaker Pro, Oracle Database y dBASE.
En este curso vamos a utilizar el software de bases de datos MySQL.

¿QUÉ ES UNA BASE DE DATOS DE MYSQL?

MySQL es un sistema de gestión de bases de datos relacionales de código abierto basado


en SQL. Fue diseñado y optimizado para aplicaciones web y puede ejecutarse en cualquier
plataforma. A medida que surgían nuevos y diferentes requisitos con Internet, MySQL se
convirtió en la plataforma elegida por los desarrolladores web y las aplicaciones basadas
en la web. Debido a que está diseñada para procesar millones de consultas y miles de
transacciones. La flexibilidad bajo demanda es la característica principal de MySQL.

LENGUAJE DE CONSULTA ESTRUCTURADO SQL

SQL es un acrónimo en inglés para Structured Query Language, un Lenguaje de Consulta


Estructurado. Un tipo de lenguaje de programación que te permite acceder, manipular y
descargar datos de una base de datos mediante comandos, mejor conocido como
consultas (Querys).

Tiene capacidad de hacer cálculos avanzados y álgebra. Es utilizado en la mayoría de


empresas que almacenan datos en una base de datos. Ha sido y sigue siendo el lenguaje
de programación más usado para bases de datos relacionales.

El lenguaje SQL también se usa para controlar el acceso a datos y para la creación y
modificación de esquemas de Base de datos. SQL utiliza los términos tabla, fila y columna
para los términos relación, tupla y atributo del modelo relacional formal, respectivamente.
Por lo tanto, es posible utilizar todos estos términos indistintamente.

6
Existen dos tipos de comandos SQL:

1. Lenguaje de Definición de Datos (DDL): permite crear y definir nuevas bases de datos,
campos e índices.

• CREATE: Crea nuevas tablas, campos e índices.


• DROP: Elimina tablas e índices.
• ALTER: Modifica las tablas agregando campos o cambiando la definición de los
campos.

2. Lenguaje de Manipulación de Datos (DML): permiten generar consultas para ordenar,


filtrar y extraer datos de la base de datos.

• SELECT: Consulta registros de la base de datos que satisfagan un criterio


determinado.
• INSERT: Carga lotes de datos en la base de datos en una única operación.
• UPDATE: Modifica los valores de los campos y registros especificados.
• DELETE: Elimina registros de una tabla de una base de datos.

PASOS PARA IMPLEMENTAR UNA BASE DE DATOS

PASO Descripción
Definir en el disco duro, el área física que contendrá las tablas
1
de la base de datos. Sentencia SQL à CREATE DATABASE

Crear las diferentes tablas de la base de datos. Sentencia SQL


2
à CREATE TABLE

Insertar en las filas los datos a las diferentes tablas, sin violar
3
la integridad de los datos. Sentencia SQL à INSERT INTO

Actualizar los datos que cambien con el tiempo en las


4
diferentes tablas. Sentencia SQL à UPDATE

Eliminar las filas que ya no se requieran en las diferentes


5
tablas. Sentencia SQL à DELETE

Realizar las consultas deseadas a las tablas de la base de


6 datos a través de la poderosa sentencia de consultas del SQL,
llamada SELECT

Dar nombre a las consultas, elaboradas en el paso No.6


cuando se requiera ocultar el diseño y columnas de las tablas
7
a través de la creación de vistas lógicas. Sentencia SQL à
CREATE VIEW

7
CONSULTAS SQL
Estas son las consultas que vamos a escribir en nuestro software de base de datos para
crear, actualizar, borrar, acceder y manipular información de nuestra base de datos.

CONSULTAS DE CREACIÓN
1. CREATE DATABASE
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] nombre_base_datos

• Esta sentencia sirve para crear una base de datos con un nombre específico.
• Para poder crear una base de datos, el usuario que la crea debe tener privilegios de
creación asignados.
• IF NOT EXISTS significa: SI NO EXISTE, por lo tanto, esto es útil para validar que la
base de datos sea creada en caso de que no exista, si la base de datos existe y se
ejecuta esta sentencia, se genera un error.
• CREATE SCHEMA o CREATE DATABASE son sinónimos.

2. CREATE TABLE
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nombre_de_tabla (
campo1 tipo dato [NULL/NOT NULL] | CHECK (expresiónLógica) | [
DEFAULT expresiónConstante],
campo2 tipo dato [NULL/NOT NULL] | CHECK (expresiónLógica) | [
DEFAULT expresiónConstante ],
campo-N,
PRIMARY KEY(campo_llave),
FOREIGN KEY (campo_llave) REFERENCES tabla2 (campo_llave-tabla2))

Ligaduras

Tipo: Integridad de Dominio o Columna

Especifica un conjunto de valores que son válidos a ingresar sobre una columna
específica para una tabla de la base de datos. Esta integridad se verifica a través de
una la validación de los valores de datos que se ingresan y el tipo de los datos a
introducir (numérico, alfanumérico, alfabético, etc.).

• DEFAULT: Esta restricción asigna un valor específico a una columna cuando el valor
para ello no haya sido explícitamente proporcionado para tal columna en una
sentencia "INSERT" o de adición de un nuevo registro en la tabla.

• CHECK: Específica los valores de datos que el DBMS acepta le sean ingresados
para una columna.

• REFERENCES: Específica los valores de datos que el DBMS acepta le sean


ingresados para una columna.

8
Tipo: Integridad de Entidad o Tabla

Específica que, en una tabla o entidad, todas sus filas tengan un identificador único que
diferencie a una fila de otra y también que se establezcan columnas cuyo contenido es
un valor único que las hace llaves candidatas para un futuro como, por ejemplo:
número de cédula, número de seguro social o cuenta de email.

• PRIMARY KEY: Este tipo de restricción se aplica a todas las filas permitiendo que
exista un identificador, que se conoce como llave primaria y que se asegura que los
usuarios no introduzcan valores duplicados. Además, asegura que se cree un índice
para mejorar el desempeño. Los valores nulos no están permitidos para este tipo de
restricción.

• UNIQUE: Con esta restricción se previene la duplicación de valores en columnas


que tienen valor único y que no son llave primaria pero que pueden ser una llave
alternativa o candidata para el futuro. Asegura que se cree (Por parte del DBMS) un
índice para mejorar el desempeño. Y al igual que las llaves primarias, no se le está
permitido que se introduzcan valores nulos.

Tipo: Integridad Referencial

La Integridad Referencial asegura que las relaciones que existe entre llave primaria
(en la tabla referenciada) y la llave foránea (en las tablas referenciantes) serán
siempre mantenidas. Una fila o registro en la tabla referenciada (tabla donde reside
la llave primaria) no puede ser borrada o su llave primaria cambiada si existe una fila
o registro con una llave foránea (en la tabla referenciante) que se refiere a esa llave
primaria.

• FOREIGN KEY: En esta restricción se define una llave foránea, una columna o
combinación de columnas en las cuales su valor debe corresponder al valor de la
llave primaria en la misma u en otra tabla.

CONSULTAS PARA ACTUALIZAR Y BORRAR


Eliminación de Tablas:

La sentencia para eliminar una tabla y por ende todos los objetos asociados con esa tabla
es DROP TABLE, donde r es el nombre de una tabla existente.

DROP TABLE r

Modificación de Tablas

Después que una tabla ha sido utilizada durante algún tiempo, los usuarios suelen
descubrir que desean almacenar información adicional con respecto a las tablas. La
sentencia ALTER TABLE se utiliza sobre tablas que ya poseen desde cientos a miles de filas
por ser tablas de un sistema de

Base de Datos que ya está en producción.

ALTER TABLE nombre_tabla acción

9
Siendo acción una de las siguientes:

• RENAME TO nuevo_nombre

• ADD [COLUMN] nombre_atributo definición_atributo

• DROP [COLUMN] nombre_atributo

• MODIFY nombre_atributo definición_atributo

• CHANGE nombre_atributo nuevo_nombre nueva_definición

• ALTER COLUMN nombre_atributo nuevo_nombre nueva_definición

Los cambios que se pueden realizar con la sentencia SQL ALTER TABLE son:

• Añadir una definición de columna a una tabla. Puede crearse con valores nulos o con
valores.

• Eliminar una columna de la tabla. Pero antes de su eliminación deben ser eliminados
por ALTER TABLE todas las restricciones que estén definidas sobre esta columna.

• Eliminar la definición de: llave primaria, foránea o restricciones de ligaduras de


integridad (check), existentes para una tabla. Esta acción no elimina a la columna con
sus valores, ella permanece tal cual como está, solo se elimina su definición.

• Definir una llave primaria para una tabla. La columna(s) a la cual se le dará esta
responsabilidad debe contener previamente valores únicos por fila.

• Definir una nueva llave foránea para una tabla. La columna a definir como llave foránea
debe contener previamente valores que corresponden a la llave primaria de otra tabla.

3. INSERT INTO

En su formato más sencillo, INSERT se utiliza para añadir una sola fila a una tabla.
Debemos especificar el nombre de la tabla y una lista de valores para la fila. Los valores
deben suministrarse en el mismo orden en el que se especificaron los atributos
correspondientes en el comando CREATE TABLE.

INSERT INTO nombre_tabla (columna1, columna2, columna3,...) VALUES


(valor, valor2, valor3,...);

4. UPDATE

El comando UPDATE se utiliza para modificar los valores de atributo de una o más filas
seleccionadas. Una cláusula WHERE en el comando UPDATE selecciona las filas de
una tabla que se van a modificar. La sentencia UPDATE tiene la siguiente forma:

UPDATE nombre_tabla

SET nombre_columna1 = valor1,

nombre_columna2 = valor2,

[ORDER BY ...] [WHERE condicion]

10
5. DELETE

El comando DELETE elimina filas de una tabla. Incluye una cláusula WHERE, para
seleccionar las filas que se van a eliminar.

• Las filas se eliminan explícitamente sólo de una tabla a la vez. Sin embargo, la
eliminación se puede propagar a filas de otras tablas si se han especificado opciones
de acciones referenciales en las restricciones de integridad referencial del DDL.

• En función del número de filas seleccionadas por la condición de la cláusula WHERE,


ninguna, una o varias filas pueden ser eliminadas por un solo comando DELETE. La
ausencia de una cláusula WHERE significa que se borrarán todas las filas de la relación;
sin embargo, la tabla permanece en la base de datos, pero vacía. Debemos utilizar el
comando DROP TABLE para eliminar la definición de la tabla.

DELETE FROM nombre_tabla [WHERE condicion] [ORDER BY ...] [LIMIT


cantidad_filas]

CONSULTAS PARA ACCEDER Y MANIPULAR INFORMACIÓN


6. SELECT

La sentencia SELECT es muy poderosa y ampliamente rica en sus cláusulas y variantes


permitiendo la capacidad de atender en poco tiempo a consultas complejas sobre la base
de datos. Está en el especialista desarrollador de aplicaciones conocerlo a profundidad
para explotar las bondades y virtudes.

Se usa para listar las columnas de las tablas que se desean ver en el resultado de una
consulta. Además de las columnas se pueden listar columnas a calcular por el SQL cuando
actué la sentencia. Esta cláusula no puede omitirse.

La sentencia SELECT, obtiene y nos permite mostrar filas de la base de datos, también
permite realizar la selección de una o varias filas o columnas de una o varias tablas. Para
seleccionar la tabla de la que queremos obtener dichas filas vamos a utilizar la sentencia
FROM.

La sentencia FROM lista las tablas de donde se listarán las columnas enunciadas en el
SELECT. Esta cláusula no puede omitirse.

SELECT nombres de las columnas FROM tablaOrigen;

SELECT nombre, apellido FROM Alumnos;

Teniendo la siguiente tabla de alumnos:

Id Nombre Apellido Edad

1 Agustín Cocco 24

2 Martin Bullon 21

11
El resultado que mostraría sería:

Nombre Apellido

Agustín Cocco

Martin Bullon

Para mostrar todos los datos de una tabla usamos el símbolo (*). Esto nos mostraría la
primera tabla.

SELECT * FROM Alumnos;

También en las consultas SELECT podemos hacer operaciones matemáticas entre los
datos numéricos de las tablas que elijamos. Usualmente ponemos estas operaciones entre
paréntesis para separar la operación del resto de la consulta.

SELECT nombre,(salario+comision) FROM Empleados;

Teniendo la siguiente tabla de alumnos:

Id Nombre Salario Comisión

1 Agustín 5000 300

2 Martin 2000 250

El resultado que mostraría sería:

Nombre (salario+comision)

Agustín 5300

Martin 2250

En este ejemplo hacemos una suma pero podemos hacer una resta (-), una multiplicación
(*) y una división (/), también podemos poner agregarle números a nuestras operaciones.

SELECT nombre,(salario + comisión - 200) FROM Empleados;

Ahora el resultado que mostraría sería:

Nombre (salario+comisión-200)

Agustín 5100

Martin 2050

A la consulta SELECT le podemos sumar clausulas que van a alterar el resultado de filas
que obtenga el SELECT, esto nos puede servir para traer ciertas filas y evitar algunas que
no queremos mostrar.

12
CLÁUSULAS:
1. SELECT DISTINCT

El SELECT DISTINCT se utiliza cuando queremos traer solo registros diferentes. En las
tablas a veces pueden haber valor repetidos, para evitarlos usamos esta sentencia.

SELECT DISTINCT nombres de las columnas FROM tablaOrigen;

SELECT DISTINCT nombre, apellido FROM Alumnos;

Teniendo la siguiente tabla de alumnos:

Id Nombre Apellido Edad

1 Agustín Cocco 24

2 Martin Bullon 21

3 Agustín Cocco 18

El resultado que mostraría sería:

Nombre Apellido

Agustín Cocco

Martin Bullon

2. WHERE

Establece criterios de selección de ciertas filas en el resultado de la consulta gracias a las


condiciones de búsqueda. Si no se requiere condiciones de búsqueda puede omitirse y el
resultado de la consulta serán todas las filas de las tablas enunciadas en el FROM.

SELECT nombres de las columnas FROM tablaOrigen WHERE condición de


Búsqueda;

SELECT nombre, apellido FROM Alumnos WHERE nombre = “Agustin”;

En este ejemplo traerá todos los alumnos con nombre Agustín. Nótese que el nombre está
en comillas dobles, esto es porque si vamos a poner una cadena en la condición debe
estar entre comillas dobles, si fuese un numero no seria necesario.

Teniendo la siguiente tabla alumnos:

Id Nombre Apellido Edad

1 Agustín Cocco 24

2 Martin Bullon 21

13
El resultado que mostraría sería:

Nombre Apellido

Agustín Cocco

En las condiciones WHERE podemos utilizar operadores lógicos, operadores relaciones


operadores propios de SQL.

OPERADORES RELACIONALES

Operador Significado Ejemplo


> Mayor que SELECT * FROM Alumnos
WHERE edad > 21;
< Menor que SELECT * FROM Alumnos
WHERE edad < 18;
= Igual que SELECT * FROM Alumnos
WHERE edad = 20;
>= Mayor o igual que SELECT * FROM Alumnos
WHERE edad >= 30;
<= Menor o igual que SELECT * FROM Alumnos
WHERE edad <= 10;
<> o != Distinto que SELECT * FROM Alumnos
WHERE edad <> 5;

En todos estos ejemplos estamos buscando las filas donde la edad de un alumno sea
mayor, menor, etc, a x edad. Usamos edad pero puede ser cualquier valor numérico o
valor de tipo cadena.

OPERADORES LÓGICOS

Operador Significado Ejemplo


AND El operador AND
muestra un registro si SELECT * FROM Alumnos
todas las condiciones WHERE edad = 18 AND edad =
separadas por AND son 21;
verdaderas
OR El operador OR muestra
un registro si algunas de SELECT * FROM Alumnos
las condiciones WHERE edad = 15 OR edad =
separadas por OR es 20;
verdadera.
NOT El operador NOT muestra
un registro si la/s SELECT * FROM Alumnos
condición/es no es WHERE NOT edad = 20;
verdadera.

Los operadores lógicos sirven para filtrar resultados basados en más de una condición.

14
OPERADORES PROPIOS DE SQL

a) BETWEEN

El operador BETWEEN selecciona valores dentro de un rango determinado. Los valores


pueden ser números, texto o fechas.

SELECT nombre/s de la/s columna/s FROM tablaOrigen WHERE condición de


Búsqueda BETWEEN valor1 AND valor2;

SELECT * FROM Alumnos WHERE edad BETWEEN 21 AND 40;

Usamos edad pero puede ser cualquier valor numérico o valor de tipo cadena.

Teniendo la siguiente tabla:

Id Nombre Apellido Edad

1 Agustín Cocco 24

2 Martin Bullon 39

3 Mariela Lima 60

4 Juliana Martínez 30

5 Gastón Vidal 26

El resultado sería:

Id Nombre Apellido Edad

1 Agustín Cocco 24

2 Martin Bullon 39

4 Juliana Martínez 30

5 Gastón Vidal 26

b) IN

El operador IN te permite especificar varios valores para una condición de una clausula
WHERE. Es un atajo para no escribir varias condiciones OR.

SELECT nombre/s de la/s columna/s FROM tablaOrigen WHERE condición de


Búsqueda IN (valor1, valor2, valor3, …);

SELECT * FROM Alumnos WHERE nombre IN (“Agustín, “Mariela”, “Juliana”);

Usamos nombre pero puede ser cualquier valor numérico o valor de tipo cadena.

Teniendo la siguiente tabla de alumnos:

15
Id Nombre Apellido Edad

1 Agustín Cocco 24

2 Martin Bullon 15

3 Mariela Lima 20

El resultado que mostraría sería:

Id Nombre Apellido Edad

1 Agustín Cocco 24

3 Mariela Lima 20

c) LIKE

El operador LIKE se usa en una cláusula WHERE para buscar un patrón específico en una
columna. También se usa cuando queremos utilizar una cadena en una comparación
WHERE

Hay dos símbolos que se utilizan a menudo junto con el operador LIKE:

El signo de porcentaje (%) representa cero, uno o varios caracteres y el guion bajo (_) para
representar un carácter. Estos signos se pueden utilizar por separado o juntos.

SELECT nombre/s de la/s columna/s FROM tablaOrigen WHERE condición de


Búsqueda LIKE patrón de valores o cadena;

SELECT nombre, apellido FROM Alumnos WHERE nombre LIKE ‘s%’;

Esa consulta, lo que hace es traer todos los alumnos donde el nombre empiece con el
carácter s.

Teniendo la siguiente tabla de alumnos:

Id Nombre Apellido Edad

1 Sebastián Gómez 24

2 Sabrina Martínez 15

3 Mariela Lima 20

El resultado que mostraría sería:

Id Nombre Apellido Edad

1 Sebastián Gómez 24

2 Sabrina Martínez 15

16
Operador LIKE Significado
WHERE nombre Encuentra cualquier nombre
LIKE ‘a%’ que empiece con “a”.
WHERE nombre Encuentra cualquier nombre
LIKE ‘%a’ que termine con “a”.
WHERE nombre Encuentra cualquier nombre
LIKE ‘%ar%’ que tenga “ar” en cualquier
posición.
WHERE nombre Encuentra cualquier nombre
LIKE ‘_e%’ que tenga “e” en la segunda
posición.
WHERE nombre Encuentra cualquier nombre
LIKE ‘e_%’ que empiece con “e” y sea
por lo menos de 2 de largo.
WHERE nombre Encuentra cualquier nombre
LIKE ‘e__%’ que empiece con “e” y sea
por lo menos de 3 de largo.
WHERE nombre Encuentra cualquier nombre
LIKE ‘a%n%’ que empiece con “a” y
termine con “n”.

3. ORDER BY

La clausula ORDER BY permitirá establecer la columna o columnas sobre las cuales las
filas que se mostrarán de la consulta deberán ser ordenadas. Este orden puede ser
ascendiente se agrega la palabra ASC y descendiente si se agrega la palabra DESC al final.

Esta cláusula puede omitirse.

SELECT nombre/s de la/s columna/s FROM tablaOrigen ORDER BY columna


ASC|DESC;

SELECT nombre, apellido FROM Alumno ORDER BY nombre ASC;

En este caso mostraría los resultados ordenados de manera ascendiente, según el nombre
de los alumnos.

Teniendo la siguiente tabla de alumnos:

Id Nombre Apellido Edad

1 Jerónimo Wiunkhaus 24

2 Ana Gadea 15

3 Mariela Lima 20

4 Pablo González 18

5 Sabrina Pérez 30

17
El resultado que mostraría sería:

Id Nombre Apellido Edad

2 Ana Gadea 15

1 Jerónimo Wiunkhaus 24

3 Mariela Lima 20

4 Pablo González 18

5 Sabrina Pérez 30

4. GROUP BY

Especifica una consulta sumaria. En vez de producir una fila de resultados por cada fila de
datos de la base de datos, una consulta sumaria agrupa todas las filas similares y luego
produce una fila sumaria de resultados para cada grupo de los nombres de columnas
enunciado en esta cláusula.
En otras palabras, esta cláusula permitirá agrupar un conjunto de columnas con valores
repetidos y utilizar las funciones de agregación sobre las columnas con valores no
repetidas. Esta cláusula puede omitirse.

SELECT nombre/s de la/s columna/s FROM tablaOrigen GROUP BY nombres de


columna/s por la cual Agrupar;

¿QUE SON LAS FUNCIONES DE AGREGACIÓN?

En la gestión de bases de datos, una función de agregación es una función en la que los
valores de varias filas se agrupan bajo un criterito para formar un valor único más
significativo. Estas funciones se ponen el SELECT.

Existen 5 tipos de funciones de agregación, max(), min(), count(), sum(), avg().

a) MAX

Esta función retorna el valor más grande de una columna.

SELECT MAX(nombre de la columna) FROM tablaOrigen;

SELECT MAX(salario) FROM Empleados;

Teniendo la siguiente tabla de empleados:

Id Nombre Apellido Salario

1 Franco Medina 1000

2 Agustina Koch 2000

3 Ignacio Pérez 1500

18
El resultado que mostraría sería:

MAX(Salario)

2000

b) MIN

Esta función retorna el valor más chico de una columna.

SELECT MIN(nombre de la columna) FROM tablaOrigen;

SELECT MIN(salario) FROM Empleados;

Teniendo la siguiente tabla de empleados:

Id Nombre Apellido Salario

1 Franco Medina 1000

2 Agustina Koch 2000

3 Ignacio Pérez 1500

4 Martin Bruno 3000

El resultado que mostraría sería:

MIN(Salario)

1000

c) AVG

Esta función retorna el promedio de una columna.

SELECT AVG(nombre de la columna) FROM tablaOrigen;

SELECT AVG(salario) FROM Empleados;

Teniendo la siguiente tabla de empleados:

Id Nombre Apellido Salario

1 Franco Medina 1000

2 Agustina Koch 2000

3 Ignacio Pérez 1600

4 Valentín Mazuran 700

19
El resultado que mostraría sería:

AVG(Salario)

1325

d) COUNT

Esta función retorna el numero de filas de una columna.

SELECT COUNT(nombre de la columna) FROM tablaOrigen;

SELECT COUNT(Id) FROM Empleados;

Teniendo la siguiente tabla de empleados:

Id Nombre Apellido Salario

1 Franco Medina 1000

2 Agustina Koch 2000

3 Ignacio Pérez 1600

El resultado que mostraría sería:

COUNT(Id)

En este caso ponemos el id, para saber cuantos empleados tenemos en la tabla
empleados.

También podemos usar el COUNT(*), este no requiere que le pasamos una columna
concreta y cuenta todas filas de una tabla, mostrando tanto los valores repetidos como
los valores en null.

Id Nombre Apellido Salario

1 Franco Medina 1000

2 Agustina Koch 2000

3 Franco Medina 1600

4 Martin Santiago null

El resultado que mostraría sería:

COUNT(Id)

20
Entonces, volviendo al Group By, vamos a utilizar esta sentencia junto con las funciones de
agregación para agrupar los valores que devuelva dicha función. Existen dos tipos de
GROUP BY.

SELECT nombre, SUM(salario) FROM Empleados GROUP BY nombre;

Teniendo la siguiente tabla de empleados:

Id Nombre Salario

1 Franco 1000

2 Mariela 2000

3 Franco 1000

4 Mariela 2000

El resultado que mostraría sería:

Nombre SUM(Salario)

Franco 2000

Mariela 4000

El resultado de la consulta, muestra que agrupa todos los nombre repetidos bajo un solo
nombre y el salario es la suma de los salarios de las filas que fueron agrupadas.

Otro ejemplo de un group by sería:

SELECT COUNT(ID), pais FROM Personas GROUP BY pais;

Teniendo la siguiente tabla de personas:

Id Nombre Pais

1 Franco Argentina

2 Juliana Alemania

3 Agustín Argentina

El resultado que mostraría sería:

COUNT(Id) Pais

2 Argentina

1 Alemania

En la consulta hacemos un count del id de personas para saber cuantos hay, pero al
agrupar el resultado por países, nos muestra cuantas personas hay en cada país.

21
5. HAVING

Esta clausula le dice al SQL que incluya sólo ciertos grupos producidos por la cláusula
GROUP BY en los resultados de la consulta. Al igual que la cláusula WHERE, utiliza una
condición de búsqueda para especificar los grupos deseados. La cláusula HAVING es la
encargada de condicionar la selección de los grupos en base a los valores resultantes en
las funciones agregadas utilizadas debidas que la cláusula WHERE condiciona solo para la
selección de filas individuales. Esta cláusula puede omitirse.

SELECT nombre/s de la/s columna/s FROM tablaOrigen GROUP BY nombres de


columnas por la cual Agrupar HAVING condiciónBúsqueda para Group By;

SELECT COUNT(ID), pais FROM Personas GROUP BY Personas GROUP BY pais


HAVING COUNT(ID) > 1;

Teniendo la siguiente tabla de personas:

Id Nombre Pais

1 Franco Argentina

2 Juliana Alemania

3 Agustín Argentina

4 Gastón Alemania

5 Mariela Uruguay

El resultado que mostraría sería:

COUNT(Id) Pais

2 Argentina

2 Alemania

En la consulta hacemos un count del id de personas para saber cuantos hay, las
agrupamos por países para que nos muestre cuantas personas hay en cada país. Pero, con
el having le decimos que nos muestre solo los resultados donde el count sea mayor a 1, o
en otras palabras, mostramos los países que tienen más de una persona.

6. AS

La sentencia AS, le da un alias a una o la columna de una tabla, un nombre temporal. El


alias existe solo por la duración de la consulta.

El alias se usa para darle a una columna un nombre más legible

SELECT nombre/s de la/s columna/s AS alias FROM tablaOrigen;

SELECT nombre AS Nombre Alumno, apellido As Apellido Alumno FROM Alumnos;

22
Teniendo la siguiente tabla de alumnos:

Id Nombre Apellido Edad

1 Jerónimo Wiunkhaus 24

2 Ana Gadea 15

3 Mariela Lima 20

El resultado que mostraría sería:

Nombre Alumno Apellido Alumno

Ana Gadea

Jerónimo Wiunkhaus

Mariela Lima

Todas estas clausulas / sentencias pueden ser usadas juntas, no es necesario que las usen
separadas.

SELECT nombres de las columnas AS Alias FROM tablaOrigen


WHERE condición de Búsqueda
GROUP BY nombres de columnas por la cual Agrupar
HAVING condiciónBúsqueda para Group By
ORDER BY nombre de columnas [ASC | DESC]

7. ROUND

Las sentencia round sirve para redondear los decimales de un numero que se pida en un
select.

SELECT AVG(salario) FROM Empleados;

AVG(Salario)

1325,55

SELECT ROUND(AVG(salario)) FROM Empleados;

AVG(Salario)

1326

23
8. LIMIT

La cláusula LIMIT se utiliza para establecer un límite al número de resultados devueltos por
SQL.

SELECT nombres de las columnas FROM tablaOrigen LIMIT numero x;


SELECT nombre, apellido FROM Alumnos LIMIT 1;

Teniendo la siguiente tabla de alumnos:

Id Nombre Apellido Edad

1 Jerónimo Wiunkhaus 24

2 Ana Gadea 15

3 Mariela Lima 20

El resultado que mostraría sería:

Nombre Apellido

Jerónimo Wiunkhaus

CONSULTAS MULTITABLAS
Como habíamos dicho previamente en la teoría, estamos trabajando con base de datos
relacionales, esto significa que tenemos tablas relacionadas entre sí. Y dentro de esas
tablas, tenemos fila relacionadas con filas de otras tablas.

Pero como hacemos para traer toda esa información. Una sentencia muy útil para unificar
información de tablas relacionales es el JOIN.

SQL JOIN
La sentencia JOIN, se usa para combinar data o filas de dos o más tablas que tengan un
campo en común entre ellas. Usualmente es la llave foránea.

Los diferentes tipos de JOIN son:

1. INNER JOIN

El INNER JOIN selecciona todas las filas que tengan el valor en común con la/s tabla/s. Si
hay una fila, que no tiene el valor en común con la otra tabla no la trae.

24
SELECT nombre/s de la/s columna/s FROM tabla1 INNER JOIN tabla2 ON
tabla1.nombre_columna = tabla2.nombre_columna;

SELECT Nombre, Nombre_curso FROM Profesores INNER JOIN Cursos ON


Profesores.Id = Cursos.Id_profesor;

Teniendo la siguiente tabla de profesores:

Id Nombre Apellido Edad

1 Agustín Oviedo 24

2 Ana Gadea 15

3 Mariela Lima 20

4 Emiliano Chirino 30

Teniendo la siguiente tabla de Cursos:

Id Nombre_curso Costo Id_profesor

1 Curso de 1000 1
Programación
2 Curso de Mecánica 2000 2

3 Curso de Cocina 500 3

El resultado que mostraría sería:

Nombre Nombre_curso

Agustín Curso de Programación

Ana Curso de Mecánica

Mariela Curso de Cocina

Gracias al INNER JOIN, podemos mostrar todos los nombres de los profesores, junto al
curso que dan, nosotros decimos que son el profesor de ese curso, porque tienen
asignado su id en la tabla curso. Y como usamos el INNER JOIN, solo mostramos los
profesores que tenían su id en la tabla curso. Esto se por la condición que pusimos arriba
en el ON, donde decíamos que el valor a chequear por posible coincidencia era el id en la
tabla profesor y el id_profesor en la tabla curso.

2. LEFT JOIN

La sentencia LEFT JOIN retorna todos los registros de la tabla de la izquierda (tabla1) y
todos los registros con coincidencia de la tabla de la derecha (tabla2). Si no existe ninguna
coincidencia para alguna de las filas de la tabla de la izquierda, de igual forma todos los
resultados de la primera tabla se muestran.

25
SELECT nombre/s de la/s columna/s FROM tabla1 LEFT JOIN tabla2 ON
tabla1.nombre_columna = tabla2.nombre_columna;

SELECT Nombre, Nombre_curso FROM Profesores LEFT JOIN Cursos ON


Profesores.Id = Cursos.Id_profesor;

Teniendo la siguiente tabla de profesores:

Id Nombre Apellido Edad

1 Agustín Oviedo 24

2 Ana Gadea 15

3 Mariela Lima 20

4 Francisco Chirino 21

Teniendo la siguiente tabla de Cursos:

Id Nombre_curso Costo Id_profesor

1 Curso de 1000 1
Programación
2 Curso de Mecánica 2000 2

El resultado que mostraría sería:

Nombre Nombre_curso

Agustín Curso de Programación

Ana Curso de Mecánica

Mariela null

Francisco Chirino null

Si nos fijamos en el resultado de la consulta, podemos ver que trajo todas las filas de la
tabla de la izquierda, in importar si las filas tenían coincidencia o no.

26
3. RIGHT JOIN

Esta sentencia es parecida a la anterior pero le da prioridad al tabla de la derecha.

SELECT nombre/s de la/s columna/s FROM tabla1 RIGHT JOIN tabla2 ON


tabla1.nombre_columna = tabla2.nombre_columna;

SELECT Nombre, Nombre_curso FROM Profesores RIGHT JOIN Cursos ON


Profesores.Id = Cursos.Id_profesor;

Teniendo la siguiente tabla de profesores:

Id Nombre Apellido Edad

1 Agustín Oviedo 24

2 Ana Gadea 15

3 Mariela Lima 20

4 Francisco Chirino 21

Teniendo la siguiente tabla de Cursos:

Id Nombre_curso Costo Id_profesor

1 Curso de 1000 1
Programación
2 Curso de Mecánica 2000 2

3 Curso de Natación 600 null

El resultado que mostraría sería:

Nombre Nombre_curso

Agustín Curso de Programación

Ana Curso de Mecánica

null Curso de Natación

Si nos fijamos en el resultado de la consulta, podemos ver que trajo todas las filas de la
tabla de la derecha, sin importar si las filas tenían coincidencia o no.

27
SUBCONSULTAS
Una subconsulta en SQL consiste en utilizar los resultados de una consulta dentro de otra,
que se considera la principal. Esta posibilidad fue la razón original para la palabra
“estructurada” en el nombre Lenguaje de Consultas Estructuradas (Structured Query
Language, SQL).

Anteriormente hemos utilizado la cláusula WHERE para seleccionar los datos que
deseábamos comparando un valor de una columna con una constante, o un grupo de
ellas. Si los valores de dichas constantes son desconocidos, normalmente por proceder de
la aplicación de funciones a determinadas columnas de la tabla, tendremos que utilizar
subconsultas. Por ejemplo, queremos saber la lista de empleados cuyo salario supere el
salario medio.

En primer lugar, tendríamos que averiguar el importe del salario medio:

SELECT AVG(salario) “Salario Medio” FROM Empleados;

Salario Medio

256666,67

Ahora que sabemos el dato podríamos usarlo para la consulta:

SELECT nombre, salario FROM Empleados WHERE > 256666,67;

Nombre Salario

Agustín 385000

Ana 608000

Esto estaría bien pero, es porque primero buscamos el dato en una consulta y una vez que
conseguimos el dato, ahí hicimos la consulta. Pero, lo mejor sería que en vez de hacer dos
consultas usemos una subconsulta, para que al mismo tiempo que averiguamos el salario
medio, se calcule cuales son los empleados que tienen un sueldo mayor a ese salario
medio.

SELECT nombre, salario FROM Empleados WHERE > (SELECT AVG(salario) FROM
Empleados);

Nombre Salario

Agustín 385000

Ana 608000

Esto nos daría el mismo resultado, pero sin la necesidad de hacer dos consultas para saber
el dato. Estos son los casos donde usaríamos una subconsulta, donde no sabíamos el
salario medio antes de hacer la consulta.

28
PREGUNTAS DE APRENDIZAJE
1) Responda Verdadero (V) o Falso (F)
V F

Una primary key es la columna (columnas) que tiene datos ( ) ( )


completamente únicos a lo largo de la tabla.

La función principal de una clave primaria en una tabla es mantener su ( ) ( )


integridad.

Las foreign keys o llaves foráneas son campos que vinculan una tabla ( ) ( )
con la clave primaria o externa de otra tabla.

Una tabla no puede tener más de una clave foránea definida. ( ) ( )

INSERT, UPDATE y CREATE son commandos DDL. ( ) ( )

El comando DROP se utiliza para eliminar todas las filas de una tabla. ( ) ( )

2) ¿Cuál de las siguientes sentencias son ciertas sobre las relaciones?

a) Las relaciones son entidades


b) Las relaciones son enlaces lógicos entre las tablas implementadas a través de
primary y foreign keys.
c) Las relaciones son almacenadas como atributos en la base de datos.
d) Las relaciones explícitamente definen una asociación entre 2 tablas.

3) ¿Cómo se crea una base de datos con SQL?

a) CREATE DATABASE
b) UPDATE DATABASE
c) ALTER DATABASE
d) Las anteriores respuestas no son correctas

4) En SQL, ¿cuál de estas sentencias añade una fila a una tabla en una base de datos?

a) ADD
b) INSERT
c) UPDATE
d) INCLUDE

5) En SQL, para modificar la estructura de una tabla de una base de datos se emplea la
instrucción

a) ALTER TABLE
b) CHANGE TABLE
c) MODIFY TABLE
d) Las anteriores respuestas no son correctas

29
6) ¿Qué instrucción se emplea para eliminar todo el contenido de una tabla, pero
conservando la tabla?

a) DELETE TABLE
b) DROP TABLE
c) TRUNCATE TABLE
d) Las anteriores respuestas no son correctas

7) ¿Cómo se borra toda una base de datos con SQL?

a) DELETE DATABASE
b) DROP DATABASE
c) ERASE DATABASE
d) Las anteriores respuestas no son correctas

8) ¿En cuál de las siguientes sentencias del lenguaje SQL se emplea la cláusula SET?

a) DELETE
b) DROP
c) SELECT
d) UPDATE

9) En SQL, para eliminar las filas duplicadas del resultado de una sentencia SELECT se
emplea:

a) NO DUPLICATE
b) UNIQUE
c) DISTINCT
d) Las anteriores respuestas no son correctas

10) Una sentencia SELECT sin la cláusula WHERE devuelve

a) Todos los registros existentes en la tabla que no estén relacionados con otra tabla
b) Todos los registros existentes en la tabla
c) No se puede ejecutar una sentencia SELECT sin la cláusula WHERE
d) Las anteriores respuestas no son correctas

11) En SQL, para ordenar los datos devueltos por una sentencia SELECT se emplea la
cláusula

a) ORDER BY
b) ORDERED BY
c) SORT BY
d) SORTED BY

12) En una cláusula LIKE, ¿cómo se obtienen todos los nombres de personas que
comienzan con "Juan"?

a) LIKE "Juan%"
b) LIKE "Juan*"
c) LIKE "Juan$"
d) LIKE "Juan&"

30
13) ¿Cuál de las siguientes no es una función de agregación?

a) AVG()
b) MAX()
c) SUM()
d) LIMIT()

14) ¿Cuál de las siguientes si es una función de agregación?

a) ROUND()
b) ORDER BY
c) FLOOR()
d) COUNT()

31
EJERCICIOS DE APRENDIZAJE
Para la realización de los ejercicios que se describen a continuación, es necesario
descargar el archivo scriptsBD.zip que contiene algunos scripts con las bases de datos
sobre las cuales se va a trabajar. En cada ejercicio se indica el nombre del script que se
debe utilizar.

VER VIDEO: Introducción Base de Datos

1. Abrir el script llamado “superhéroes” y ejecutarlo de modo tal que se cree la base de
datos y todas sus tablas. Posteriormente, crear las tablas que se muestran en el
siguiente modelo de entidad relación:

VER VIDEO: Insertar, Modificar y Eliminar

a) Insertar en las tablas creadas los siguientes datos:

Tabla creador

Tabla personajes

32
Una vez insertados todos los registros realizar una selección de todos los atributos para
corroborar que la tablas se encuentren completas.

b) Cambiar en la tabla personajes el año de aparición a 1938 del personaje Superman.


A continuación, realizar un listado de toda la tabla para verificar que el personaje
haya sido actualizado.

c) El registro que contiene al personaje Flash. A continuación, mostrar toda la tabla


para verificar que el registro haya sido eliminado.

d) Eliminar la base de datos superhéroes.

VER VIDEO: Select, From, Where

2. Abrir el script llamado “personal-inserts” y ejecutarlo de modo tal que se cree la base
de datos “personal”, se creen las tablas y se inserten todos los datos en las tablas para
que quede de la siguiente manera:

a) A continuación, realizar las siguientes consultas sobre la base de datos personal:

1. Obtener los datos completos de los empleados.


2. Obtener los datos completos de los departamentos.
3. Listar el nombre de los departamentos.
4. Obtener el nombre y salario de todos los empleados.
5. Listar todas las comisiones.
6. Obtener los datos de los empleados cuyo cargo sea ‘Secretaria’.
7. Obtener los datos de los empleados vendedores, ordenados por nombre
alfabéticamente.

VER VIDEOS:
A) Tablas Relacionadas
B) Join Avanzados
C) Order by, Group by, Having

33
8. Obtener el nombre y cargo de todos los empleados, ordenados por salario de
menor a mayor.
9. Elabore un listado donde para cada fila, figure el alias ‘Nombre’ y ‘Cargo’ para
las respectivas tablas de empleados.
10. Listar los salarios y comisiones de los empleados del departamento 2000,
ordenado por comisión de menor a mayor.
11. Obtener el valor total a pagar que resulta de sumar el salario y la comisión de los
empleados del departamento 3000 una bonificación de 500, en orden alfabético
del empleado.
12. Muestra los empleados cuyo nombre empiece con la letra J.
13. Listar el salario, la comisión, el salario total (salario + comisión) y nombre, de
aquellos empleados que tienen comisión superior a 1000.
14. Obtener un listado similar al anterior, pero de aquellos empleados que NO
tienen comisión.
15. Obtener la lista de los empleados que ganan una comisión superior a su sueldo.
16. Listar los empleados cuya comisión es menor o igual que el 30% de su sueldo.
17. Hallar los empleados cuyo nombre no contiene la cadena “MA”
18. Obtener los nombres de los departamentos que sean “Ventas” ni “Investigación”
ni ‘Mantenimiento.
19. Ahora obtener los nombres de los departamentos que no sean “Ventas” ni
“Investigación” ni ‘Mantenimiento.
20. Mostrar el salario más alto de la empresa.
21. Mostrar el nombre del último empleado de la lista por orden alfabético.
22. Hallar el salario más alto, el más bajo y la diferencia entre ellos.
23. Hallar el salario promedio por departamento.
Consultas con Having

24. Hallar los departamentos que tienen más de tres empleados. Mostrar el número
de empleados de esos departamentos.
25. Mostrar el código y nombre de cada jefe, junto al número de empleados que
dirige. Solo los que tengan más de dos empleados (2 incluido).
26. Hallar los departamentos que no tienen empleados
Consulta con Subconsulta

27. Mostrar la lista de los empleados cuyo salario es mayor o igual que el promedio
de la empresa. Ordenarlo por departamento.

3. Abrir el script de la base de datos llamada “tienda.sql” y ejecutarlo para crear sus tablas
e insertar datos en las mismas. A continuación, generar el modelo de entidad relación.
Deberá obtener un diagrama de entidad relación igual al que se muestra a
continuación:

34
A continuación, se deben realizar las siguientes consultas sobre la base de datos:

1. Lista el nombre de todos los productos que hay en la tabla producto.


2. Lista los nombres y los precios de todos los productos de la tabla producto.
3. Lista todas las columnas de la tabla producto.
4. Lista los nombres y los precios de todos los productos de la tabla producto,
redondeando el valor del precio.
5. Lista el código de los fabricantes que tienen productos en la tabla producto.
10. Lista el código de los fabricantes que tienen productos en la tabla producto, sin
mostrar los repetidos.
11. Lista los nombres de los fabricantes ordenados de forma ascendente.
12. Lista los nombres de los productos ordenados en primer lugar por el nombre de
forma ascendente y en segundo lugar por el precio de forma descendente.
13. Devuelve una lista con las 5 primeras filas de la tabla fabricante.
14. Lista el nombre y el precio del producto más barato. (Utilice solamente las cláusulas
ORDER BY y LIMIT)
15. Lista el nombre y el precio del producto más caro. (Utilice solamente las cláusulas
ORDER BY y LIMIT)
16. Lista el nombre de los productos que tienen un precio menor o igual a $120.
17. Lista todos los productos que tengan un precio entre $60 y $200. Utilizando el
operador BETWEEN.
18. Lista todos los productos donde el código de fabricante sea 1, 3 o 5. Utilizando el
operador IN.
23. Devuelve una lista con el nombre de todos los productos que contienen la cadena
Portátil en el nombre.

Consultas Multitabla

1. Devuelve una lista con el código del producto, nombre del producto, código del
fabricante y nombre del fabricante, de todos los productos de la base de datos.
2. Devuelve una lista con el nombre del producto, precio y nombre de fabricante de
todos los productos de la base de datos. Ordene el resultado por el nombre del
fabricante, por orden alfabético.

35
3. Devuelve el nombre del producto, su precio y el nombre de su fabricante, del
producto más barato.
4. Devuelve una lista de todos los productos del fabricante Lenovo.
5. Devuelve una lista de todos los productos del fabricante Crucial que tengan un
precio mayor que $200.
6. Devuelve un listado con todos los productos de los fabricantes Asus, Hewlett-
Packard. Utilizando el operador IN.
7. Devuelve un listado con el nombre de producto, precio y nombre de fabricante, de
todos los productos que tengan un precio mayor o igual a $180. Ordene el resultado
en primer lugar por el precio (en orden descendente) y en segundo lugar por el
nombre (en orden ascendente)

Consultas Multitabla

Resuelva todas las consultas utilizando las cláusulas LEFT JOIN y RIGHT JOIN.

1. Devuelve un listado de todos los fabricantes que existen en la base de datos, junto
con los productos que tiene cada uno de ellos. El listado deberá mostrar también
aquellos fabricantes que no tienen productos asociados.
2. Devuelve un listado donde sólo aparezcan aquellos fabricantes que no tienen
ningún producto asociado.

Subconsultas (En la cláusula WHERE)

Con operadores básicos de comparación

1. Devuelve todos los productos del fabricante Lenovo. (Sin utilizar INNER JOIN).
2. Devuelve todos los datos de los productos que tienen el mismo precio que el
producto más caro del fabricante Lenovo. (Sin utilizar INNER JOIN).
3. Lista el nombre del producto más caro del fabricante Lenovo.
4. Lista todos los productos del fabricante Asus que tienen un precio superior al precio
medio de todos sus productos.

Subconsultas con IN y NOT IN

1. Devuelve los nombres de los fabricantes que tienen productos asociados.


(Utilizando IN o NOT IN).
2. Devuelve los nombres de los fabricantes que no tienen productos asociados.
(Utilizando IN o NOT IN).

Subconsultas (En la cláusula HAVING)

1. Devuelve un listado con todos los nombres de los fabricantes que tienen el mismo
número de productos que el fabricante Lenovo.

36
EJERCICIOS EXTRAS
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos
pueden realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que
venimos trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas,
podes continuar con estos ejercicios extra, recordando siempre que no es necesario que
los termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es
ayudar a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es
que puedas explicar el ejercicio con la intención de que tu compañero lo comprenda, y no
sólo mostrarlo. ¡Muchas gracias!

4. Abrir el script de la base de datos llamada “nba.sql” y ejecutarlo para crear todas las
tablas e insertar datos en las mismas. A continuación, generar el modelo de entidad
relación. Deberá obtener un diagrama de entidad relación igual al que se muestra a
continuación:

A continuación, se deben realizar las siguientes consultas sobre la base de datos:

1. Mostrar el nombre de todos los jugadores ordenados alfabéticamente.


2. Mostrar el nombre de los jugadores que sean pivots (‘C’) y que pesen más de 200
libras, ordenados por nombre alfabéticamente.
3. Mostrar el nombre de todos los equipos ordenados alfabéticamente.
4. Mostrar el nombre de los equipos del este (East).
5. Mostrar los equipos donde su ciudad empieza con la letra ‘c’, ordenados por
nombre.
6. Mostrar todos los jugadores y su equipo ordenados por nombre del equipo.
7. Mostrar todos los jugadores del equipo “Raptors” ordenados por nombre.

37
8. Mostrar los puntos por partido del jugador ‘Pau Gasol’.
9. Mostrar los puntos por partido del jugador ‘Pau Gasol’ en la temporada ’04/05′.
10. Mostrar el número de puntos de cada jugador en toda su carrera.
11. Mostrar el número de jugadores de cada equipo.
12. Mostrar el jugador que más puntos ha realizado en toda su carrera.
13. Mostrar el nombre del equipo, conferencia y división del jugador más alto de la NBA.
14. Mostrar la media de puntos en partidos de los equipos de la división Pacific.
15. Mostrar el partido o partidos (equipo_local, equipo_visitante y diferencia) con mayor
diferencia de puntos.
16. Mostrar la media de puntos en partidos de los equipos de la división Pacific.
17. Mostrar los puntos de cada equipo en los partidos, tanto de local como de visitante.
18. Mostrar quien gana en cada partido (codigo, equipo_local, equipo_visitante,
equipo_ganador), en caso de empate sera null.
5. Abrir el script de la base de datos llamada “jardineria.sql” y ejecutarlo para crear todas
las tablas e insertar datos en las mismas. Deberá obtener un diagrama de entidad
relación igual al que se muestra a continuación:

38
A continuación, se deben realizar las siguientes consultas sobre la base de datos:

Consultas sobre una tabla

1. Devuelve un listado con el código de oficina y la ciudad donde hay oficinas.


2. Devuelve un listado con la ciudad y el teléfono de las oficinas de España.
3. Devuelve un listado con el nombre, apellidos y email de los empleados cuyo jefe
tiene un código de jefe igual a 7.
4. Devuelve el nombre del puesto, nombre, apellidos y email del jefe de la empresa.
5. Devuelve un listado con el nombre, apellidos y puesto de aquellos empleados que
no sean representantes de ventas.
6. Devuelve un listado con el nombre de los todos los clientes españoles.
7. Devuelve un listado con los distintos estados por los que puede pasar un pedido.
8. Devuelve un listado con el código de cliente de aquellos clientes que realizaron
algún pago en 2008. Tenga en cuenta que deberá eliminar aquellos códigos de
cliente que aparezcan repetidos. Resuelva la consulta:
o Utilizando la función YEAR de MySQL.
o Utilizando la función DATE_FORMAT de MySQL.
o Sin utilizar ninguna de las funciones anteriores.
9. Devuelve un listado con el código de pedido, código de cliente, fecha esperada y
fecha de entrega de los pedidos que no han sido entregados a tiempo.
10. Devuelve un listado con el código de pedido, código de cliente, fecha esperada y
fecha de entrega de los pedidos cuya fecha de entrega ha sido al menos dos días
antes de la fecha esperada.
o Utilizando la función ADDDATE de MySQL.
o Utilizando la función DATEDIFF de MySQL.
11. Devuelve un listado de todos los pedidos que fueron rechazados en 2009.
12. Devuelve un listado de todos los pedidos que han sido entregados en el mes de
enero de cualquier año.
13. Devuelve un listado con todos los pagos que se realizaron en el año 2008 mediante
Paypal. Ordene el resultado de mayor a menor.
14. Devuelve un listado con todas las formas de pago que aparecen en la tabla pago.
Tenga en cuenta que no deben aparecer formas de pago repetidas.
15. Devuelve un listado con todos los productos que pertenecen a la gama
Ornamentales y que tienen más de 100 unidades en stock. El listado deberá estar
ordenado por su precio de venta, mostrando en primer lugar los de mayor precio.
16. Devuelve un listado con todos los clientes que sean de la ciudad de Madrid y cuyo
representante de ventas tenga el código de empleado 11 o 30.

39
Consultas multitabla (Composición interna)

Las consultas se deben resolver con INNER JOIN.

1. Obtén un listado con el nombre de cada cliente y el nombre y apellido de su


representante de ventas.
2. Muestra el nombre de los clientes que hayan realizado pagos junto con el nombre
de sus representantes de ventas.
3. Muestra el nombre de los clientes que no hayan realizado pagos junto con el
nombre de sus representantes de ventas.
4. Devuelve el nombre de los clientes que han hecho pagos y el nombre de sus
representantes junto con la ciudad de la oficina a la que pertenece el representante.
5. Devuelve el nombre de los clientes que no hayan hecho pagos y el nombre de sus
representantes junto con la ciudad de la oficina a la que pertenece el representante.
6. Lista la dirección de las oficinas que tengan clientes en Fuenlabrada.
7. Devuelve el nombre de los clientes y el nombre de sus representantes junto con la
ciudad de la oficina a la que pertenece el representante.
8. Devuelve un listado con el nombre de los empleados junto con el nombre de sus
jefes.
9. Devuelve el nombre de los clientes a los que no se les ha entregado a tiempo un
pedido.
10. Devuelve un listado de las diferentes gamas de producto que ha comprado cada
cliente.

Consultas multitabla (Composición externa)

Resuelva todas las consultas utilizando las cláusulas LEFT JOIN, RIGHT JOIN, JOIN.

1. Devuelve un listado que muestre solamente los clientes que no han realizado
ningún pago.
2. Devuelve un listado que muestre solamente los clientes que no han realizado
ningún pedido.
3. Devuelve un listado que muestre los clientes que no han realizado ningún pago y
los que no han realizado ningún pedido.
4. Devuelve un listado que muestre solamente los empleados que no tienen una
oficina asociada.
5. Devuelve un listado que muestre solamente los empleados que no tienen un cliente
asociado.
6. Devuelve un listado que muestre los empleados que no tienen una oficina asociada
y los que no tienen un cliente asociado.
7. Devuelve un listado de los productos que nunca han aparecido en un pedido.

40
8. Devuelve las oficinas donde no trabajan ninguno de los empleados que hayan sido
los representantes de ventas de algún cliente que haya realizado la compra de
algún producto de la gama Frutales.
9. Devuelve un listado con los clientes que han realizado algún pedido pero no han
realizado ningún pago.
10. Devuelve un listado con los datos de los empleados que no tienen clientes
asociados y el nombre de su jefe asociado.

Consultas resumen

1. ¿Cuántos empleados hay en la compañía?


2. ¿Cuántos clientes tiene cada país?
3. ¿Cuál fue el pago medio en 2009?
4. ¿Cuántos pedidos hay en cada estado? Ordena el resultado de forma descendente
por el número de pedidos.
5. Calcula el precio de venta del producto más caro y más barato en una misma
consulta.
6. Calcula el número de clientes que tiene la empresa.
7. ¿Cuántos clientes tiene la ciudad de Madrid?
8. ¿Calcula cuántos clientes tiene cada una de las ciudades que empiezan por M?
9. Devuelve el nombre de los representantes de ventas y el número de clientes al que
atiende cada uno.
10. Calcula el número de clientes que no tiene asignado representante de ventas.
11. Calcula la fecha del primer y último pago realizado por cada uno de los clientes. El
listado deberá mostrar el nombre y los apellidos de cada cliente.
12. Calcula el número de productos diferentes que hay en cada uno de los pedidos.
13. Calcula la suma de la cantidad total de todos los productos que aparecen en cada
uno de los pedidos.
14. Devuelve un listado de los 20 productos más vendidos y el número total de
unidades que se han vendido de cada uno. El listado deberá estar ordenado por el
número total de unidades vendidas.
15. La facturación que ha tenido la empresa en toda la historia, indicando la base
imponible, el IVA y el total facturado. La base imponible se calcula sumando el coste
del producto por el número de unidades vendidas de la tabla detalle_pedido. El IVA
es el 21 % de la base imponible, y el total la suma de los dos campos anteriores.
16. La misma información que en la pregunta anterior, pero agrupada por código de
producto.
17. La misma información que en la pregunta anterior, pero agrupada por código de
producto filtrada por los códigos que empiecen por OR.

41
18. Lista las ventas totales de los productos que hayan facturado más de 3000 euros. Se
mostrará el nombre, unidades vendidas, total facturado y total facturado con
impuestos (21% IVA)

Subconsultas con operadores básicos de comparación

1. Devuelve el nombre del cliente con mayor límite de crédito.


2. Devuelve el nombre del producto que tenga el precio de venta más caro.
3. Devuelve el nombre del producto del que se han vendido más unidades. (Tenga en
cuenta que tendrá que calcular cuál es el número total de unidades que se han
vendido de cada producto a partir de los datos de la tabla detalle_pedido. Una vez
que sepa cuál es el código del producto, puede obtener su nombre fácilmente.)
4. Los clientes cuyo límite de crédito sea mayor que los pagos que haya realizado. (Sin
utilizar INNER JOIN).
5. Devuelve el producto que más unidades tiene en stock.
6. Devuelve el producto que menos unidades tiene en stock.
7. Devuelve el nombre, los apellidos y el email de los empleados que están a cargo de
Alberto Soria.

Subconsultas con ALL y ANY

1. Devuelve el nombre del cliente con mayor límite de crédito.


2. Devuelve el nombre del producto que tenga el precio de venta más caro.
3. Devuelve el producto que menos unidades tiene en stock.

Subconsultas con IN y NOT IN

1. Devuelve el nombre, apellido1 y cargo de los empleados que no representen a


ningún cliente.
2. Devuelve un listado que muestre solamente los clientes que no han realizado
ningún pago.
3. Devuelve un listado que muestre solamente los clientes que sí han realizado ningún
pago.
4. Devuelve un listado de los productos que nunca han aparecido en un pedido.
5. Devuelve el nombre, apellidos, puesto y teléfono de la oficina de aquellos
empleados que no sean representante de ventas de ningún cliente.

Subconsultas con EXISTS y NOT EXISTS

1. Devuelve un listado que muestre solamente los clientes que no han realizado
ningún pago.
2. Devuelve un listado que muestre solamente los clientes que sí han realizado ningún
pago.

42
3. Devuelve un listado de los productos que nunca han aparecido en un pedido.
4. Devuelve un listado de los productos que han aparecido en un pedido alguna vez.

6. Importar el script de la base de datos llamada “pokemondb.sql” y ejecutarlo para crear


todas las tablas e insertar los registros en las mismas. A continuación, generar el
modelo de entidad relación y reorganizar las tablas para mayor claridad de sus
relaciones. Deberá obtener un diagrama de entidad de relación similar al que se
muestra a continuación:

A continuación, se deben realizar las siguientes consultas:

1. Mostrar el nombre de todos los pokemon.


2. Mostrar los pokemon que pesen menos de 10k.
3. Mostrar los pokemon de tipo agua.
4. Mostrar los pokemon de tipo agua, fuego o tierra ordenados por tipo.
5. Mostrar los pokemon que son de tipo fuego y volador.
6. Mostrar los pokemon con una estadística base de ps mayor que 200.
7. Mostrar los datos (nombre, peso, altura) de la prevolución de Arbok.
8. Mostrar aquellos pokemon que evolucionan por intercambio.
9. Mostrar el nombre del movimiento con más prioridad.
10. Mostrar el pokemon más pesado.
11. Mostrar el nombre y tipo del ataque con más potencia.
12. Mostrar el número de movimientos de cada tipo.
13. Mostrar todos los movimientos que puedan envenenar.

43
14. Mostrar todos los movimientos que causan daño, ordenados alfabéticamente por
nombre.
15. Mostrar todos los movimientos que aprende pikachu.
16. Mostrar todos los movimientos que aprende pikachu por MT (tipo de aprendizaje).
17. Mostrar todos los movimientos de tipo normal que aprende pikachu por nivel.
18. Mostrar todos los movimientos de efecto secundario cuya probabilidad sea mayor
al 30%.
19. Mostrar todos los pokemon que evolucionan por piedra.
20. Mostrar todos los pokemon que no pueden evolucionar.
21. Mostrar la cantidad de los pokemon de cada tipo.

44
Bibliografía
Información sacada de las paginas:

- https://www.oracle.com/ar/database/what-is-a-relational-database/

- https://www.geeksforgeeks.org/sql-tutorial/

- https://count.co/blog/posts/take-your-sql-from-good-to-great-part-3

45
CURSO DE PROGRAMACIÓN FULL STACK

ACCESO A BASES
DE DATOS DESDE
JAVA: JDBC
GUÍA DE PERSISTENCIA CON JDBC Y JPA
¿QUE ES JDBC?
Java™ Database Connectivity (JDBC) es la especificación JavaSoft de una interfaz de
programación de aplicaciones (API) estándar que permite que los programas Java accedan
a sistemas de gestión de bases de datos. La API JDBC consiste en un conjunto de interfaces
y clases escritas en el lenguaje de programación Java.

Con estas interfaces y clases estándar, los programadores pueden escribir aplicaciones que
se conecten con bases de datos, envíen consultas escritas en el lenguaje de consulta
estructurada (SQL) y procesen los resultados.

Puesto que JDBC es una especificación estándar, un programa Java que utilice la API JDBC
puede conectar con cualquier sistema de gestión de bases de datos (DBMS), siempre y
cuando haya un driver para dicho DBMS en concreto.

COMPONENTES DE JDBC
En general, hay dos componentes principales de JDBC a través de los cuales puede
interactuar con una base de datos. Son los que se mencionan a continuación:

JDBC Driver Manager: carga el driver específico de la base de datos en una aplicación para
establecer una conexión con una base de datos. Se utiliza para realizar una llamada
específica de la base de datos a la base de datos para procesar la solicitud del usuario.

API JDBC: Es un conjunto de interfaces y clases, que proporciona varios métodos e


interfaces para una fácil comunicación con la base de datos. Proporciona dos paquetes de
la siguiente manera que contiene las plataformas java SE y java EE para exhibir capacidades
WORA (write once run everything).

Estos paquetes son:

1. java.sql.*;

2. javax.sql.*;

Las clases e interfaces principales de JDBC son:

• java.sql.DriverManager

• java.sql.Connection

• java.sql.Statement

• java.sql.ResultSet

• java.sql.PreparedStatement

• javax.sql.DataSource

1
ACCESO A BASES DE DATOS CON JDBC
JDBC nos permitirá acceder a bases de datos desde Java. Para ello necesitaremos contar
con un SGBD (sistema gestor de bases de datos) además de un driver específico para poder
acceder a este SGBD. La ventaja de JDBC es que nos permitirá acceder a cualquier tipo de
base de datos, siempre que contemos con un driver apropiado para ella.

Figura 1: Arquitectura de JDBC

Como se observa en la Figura 1, cuando se construye una aplicación Java utilizando JDBC
para el acceso a una base de datos, en la aplicación siempre se utiliza la API estándar de
JDBC, y la implementación concreta de la base de datos será transparente para el usuario.

¿QUÉ ES UN DRIVER JDBC?


Vimos que dentro de los componentes de JDBC existe el Driver Manager que es el
encargado de cargar el driver, pero que es el driver exactamente.

La API JDBC define las interfaces y clases Java™ que utilizan los programadores para
conectarse con bases de datos y enviar consultas. Un driver JDBC implementa dichas
interfaces y clases para un determinado proveedor de DBMS.

Un programa Java que utiliza la API JDBC carga el controlador especificado para el DBMS
particular antes de conectar realmente con una base de datos. Luego la clase
JDBC DriverManager envía todas las llamadas de la API JDBC al controlador cargado.

2
Cada base de datos debe aportar sus propias implementaciones y es ahí donde el Driver
JDBC realiza sus aportes. El concepto de Driver hace referencia al conjunto de clases
necesarias que implementa de forma nativa el protocolo de comunicación con la base de
datos en un caso será Oracle y en otro caso será MySQL.

Por lo tanto para cada base de datos deberemos elegir su Driver .¿Cómo se encarga Java
de saber cual tenemos que usar en cada caso?. Muy sencillo, Java realiza esta operación en
dos pasos. En el primero registra el driver con la instrucción:

Class.forName("com.mysql.jdbc.Driver");

Una vez registrado el Driver , este es seleccionado a través de la propia cadena de conexión
que incluye la información sobre cual queremos usar, en la siguiente línea podemos ver que
una vez especificado el tipo de conexión define el Driver “MySql”

String url="jdbc:mysql://localhost:3306/biblioteca";

COMPONENTES DEL API DE JDBC


Nombramos cuales eran los componentes del API de JDBC, ahora los veremos en
profundidad:

• Driver: Es el enlace de comunicaciones de la base de datos que maneja toda la


comunicación con la base de datos. Normalmente, una vez que se carga el controlador,
el desarrollador no necesita llamarlo explícitamente.

• Connection: Es una interfaz con todos los métodos para contactar una base de datos. El
objeto de conexión representa el contexto de comunicación, es decir, toda la
comunicación con la base de datos es solo a través del objeto de Connection.

• Statement: Encapsula una instrucción SQL que se pasa a la base de datos para ser
analizada, compilada, planificada y ejecutada.

• ResultSet: Los ResultSet representan un conjunto de filas recuperadas debido a la


ejecución de una consulta.

CONEXIÓN CON LA BASE DE DATOS


Para comunicarnos con una base de datos utilizando JDBC, se debe en primer lugar
establecer una conexión con la base de datos a través del driver JDBC apropiado. El API
JDBC especifica la conexión en la interfaz java.sql.Connection.

La clase DriverManager permite obtener objetos Connection con la base de datos.

Para conectarse es necesario proporcionar:

• URL de conexión, que incluye:


o Nombre del host donde está la base de datos.
o Nombre de la base de datos a usar.
• Nombre del usuario en la base de datos.
• Contraseña del usuario en la base de datos.

3
El siguiente código muestra un ejemplo de conexión y obtención de datos en JDBC a una
base de datos MySQL:

Connection connection = null;


(…)
try {
Class.forName("com.mysql.jdbc.Driver");
String url = “jdbc:mysql://hostname/database-name”;
connection = DriverManager.getConnection(url, “user”, “password”);
}
} catch (SQLException ex) {
connection = null;
ex.printStackTrace();
System.out.println(“SQLException: ” + ex.getMessage());
System.out.println(“SQLState: ” + ex.getSQLState());
System.out.println(“VendorError: ” + ex.getErrorCode());
}

En este ejemplo, primero se revisa el driver con la sentencia ClassForName. Después, la


clase DriverManager intenta establecer una conexión con la base de datos database-
name utilizando el driver JDBC que proporciona MySQL. Para poder acceder al RDBMS
MySQL es necesario introducir un username y un password válidos. En el API JDBC, hay
varios métodos que pueden lanzar la excepción SQLException.

Conexión a la Base de Datos (Objeto Connection)

Una vez cargado el driver apropiado para nuestro SGBD se debe establecer la conexión con
la BD. Para ello se utiliza el siguiente método:

Connection con = DriverManager.getConnection(url, login, password);

La conexión a la BD está encapsulada en un objeto Connection, y para su creación se debe


proporcionar la url de la BD y el username y password para acceder a ella. El formato de la
url variará según el driver que se utilice.

El objeto Connection representa el contexto de una conexión con la base de datos, es decir:

• Permite obtener objetos Statement para realizar consultas SQL.


• Permite obtener metadatos acerca de la base de datos (nombres de tablas, etc.)
• Permite gestionar transacciones.

OBTENCIÓN DE DATOS DE LA BASE DE DATOS


Una vez que tengamos la conexión con el objeto Connection, la vamos a usar para crear un
objeto Statement, este objeto recibe la consulta para ejecutarla y enviársela a la base de
datos. La información que recibimos de la base de datos, va a ser capturada por el objeto
ResulSet para después poder mostrar la información.

connection = DriverManager.getConnection(url, “user”, “password”);


String sql = "SELECT a, b, c FROM Table1";

4
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
int x = rs.getInt("a");
String s = rs.getString("b");
double d = rs.getDouble("c");
System.out.println("Fila = " + x + " " + s + " " + d);

Creación y ejecución de sentencias SQL (Objeto Statement)

Una vez obtenida la conexión a la BD, se puede utilizar para crear sentencias. Estas
sentencias están encapsuladas en la clase Statement, y se pueden crear de la siguiente
forma:

Statement stmt = con.createStatement();

• Los objetos Statement permiten realizar consultas SQL en la base de datos.


• Se obtienen a partir de un objeto Connection.

Tienen distintos métodos para hacer consultas:

• executeQuery: envía a la base de datos sentencias SQL para que recuperen datos y
devuelvan un único objeto ResultSet. Es usado para leer datos (típicamente consultas
SELECT).
• executeUpdate: para realizar actualizaciones que no devuelvan un ResultSet. Es
usado para insertar, modificar o borrar datos (típicamente sentencias INSERT,
UPDATE y DELETE).
Una vez obtenido este objeto se puede ejecutar sentencias utilizando su método
executeQuery() al que se proporciona una cadena con la sentencia SQL que se quiere
ejecutar:

stmt.executeQuery(sentenciaSQL);

Estas sentencias pueden utilizarse para consultas al base de datos.

Las sentencias SQL van a ser las mismas que veníamos trabajando en MySQL Workbench,
se van a poner entre comillas dobles ya que el objeto Statement recibe String, como dato
para las sentencias.

String sentenciaSQL = "SELECT nombre, apellido FROM alumnos";

Como podemos ver las sentencias van a tener la misma sintaxis que veníamos trabajando,
la única diferencia, se va a presentar a la hora de trabajar con datos de tipo String y de tipo
Date. Como estos datos suelen ir en comillas dobles en Java y en SQL, y nuestra sentencia
ya está entre comillas dobles, deberemos poner los datos entre comillas simples para
diferenciarlos.

String:

"SELECT nombre, apellido FROM Alumnos WHERE nombre = 'Agustin'";

Date:

"SELECT nombre FROM Alumnos WHERE fechaNacimiento = '01-11-1990'";

5
Obtención de datos (Objeto ResulSet)

Para obtener datos almacenados en la BD se utiliza una consulta SQL (query). La consulta
se puede ejecutar utilizando el objeto Statement, con el método executeQuery() al que le se
le pasa una cadena con la consulta SQL. Los datos resultantes se devuelven como un objeto
ResultSet.

ResultSet result = stmt.executeQuery(query);

La consulta SQL devolverá una tabla, que tendrá una serie de campos y un conjunto de
registros, cada uno de los cuales consistirá en una tupla de valores correspondientes a los
campos de la tabla.

El objeto ResultSet proporciona el acceso a los datos de estas filas mediante un conjunto
de métodos get que permiten el acceso a las diferentes columnas de la filas. El método
ResultSet.next se usa para moverse a la siguiente fila del ResultSet, convirtiendo a ésta en la
fila actual.

El formato general de un ResultSet es una tabla con cabeceras de columna y los valores
correspondientes devueltos por la “query”. Por ejemplo, si la “query” es SELECT a, b, c FROM
Table1, el resultado tendrá una forma semejante a:

a b c

12345 Argentina 10,5

31245 Brasil 22,7

47899 Perú 56,7

El siguiente fragmento de código es un ejemplo de la ejecución de una sentencia SQL que


devolverá una colección de filas, con la columna 1 como un int, la columna 2 como una
String y la columna 3 como un real:

Statement stmt = connection.createStatement();


ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (r.next()) {
int i = r.getInt("a");
String s = r.getString("b");
double d = r.getDouble("c");
// imprimimos los valores de la fila actual
System.out.println("Fila = " + i + " " + s + " " + d);
}
Filas ResulSet

Un ResultSet mantiene un cursor que apunta a la fila actual de datos. El cursor se mueve una
fila hacia abajo cada vez que se llama al método next. Inicialmente se sitúa antes de la
primera fila, por lo que hay que llamar al método next para situarlo en la primera fila
convirtiéndola en la fila actual. Las filas de ResultSet se recuperan en secuencia desde la fila
más alta a la más baja.

6
Columnas ResultSet

Los métodos getX suministran los medios para recuperar los valores de las columnas de la
fila actual. Dentro de cada fila, los valores de las columnas pueden recuperarse en cualquier
orden, pero para asegurar la máxima portabilidad, deberían extraerse las columnas de
izquierda a derecha y leer los valores de las columnas una única vez.

Puede usarse, o bien el nombre de la columna o el número de columna, para referirse a esta.
Por ejemplo: si la columna segunda de un objeto ResultSet rs se denomina “nombre” y
almacena valores de cadena, cualquiera de los dos ejemplos siguientes nos devolverá el
valor almacenado en la columna.

String s = rs.getString("nombre");
String s = rs.getString(2);

Nótese que las columnas se numeran de izquierda a derecha comenzando con la columna
1. Además los nombres usados como input en los métodos getX son insensibles a las
mayúsculas.

Algunos de los datos que podemos traer con el método get es:

Metodo Explicación
getInt Sirve para obtener un numero entero de la base de datos
getLong Sirve para obtener un numero long de la base de datos
getDouble Sirve para obtener un numero real de la base de datos
getBoolean Sirve para obtener un booleano de la base de datos
getString Sirve para obtener una cadena de la base de datos
getDate Sirve para obtener una fecha de la base de datos

Optimización de sentencias

Cuando se quiere invocar una determinada sentencia repetidas veces, puede ser
conveniente dejar esa sentencia preparada para que pueda ser ejecutada de forma más
eficiente. Para hacer esto se utiliza la interfaz PreparedStatement, que podrá obtenerse a
partir de la conexión a la BD de la siguiente forma:

PreparedStatement ps = con.prepareStatement("SELECT * FROM nombreTabla WHERE


campo2> 1200 AND campo2< 1300");

Vemos que, a este objeto, a diferencia del objeto Statement visto anteriormente, se le
proporciona la sentencia SQL en el momento de su creación, por lo que estará preparado y
optimizado para la ejecución de dicha sentencia posteriormente.

Sin embargo, lo más común es que se necesite hacer variaciones sobre la sentencia, ya que
normalmente no será necesario ejecutar repetidas veces la misma sentencia exactamente,
sino variaciones de ella. Por ello, este objeto nos permite parametrizar la sentencia. Para ello
se deben establecer las posiciones de los parámetros con el carácter '?' dentro de la cadena
de la sentencia, tal como se muestra a continuación:

7
PreparedStatement ps = con.prepareStatement("UPDATE FROM nombreTabla
SET campo1 = 'valor'
WHERE campo2 > ? AND campo2 < ?");
En este caso se tienen dos parámetros, que representan un rango de valores en el cual se
quiere actualizar. Cuando se ejecute esta sentencia, el campo1 de la tabla nombreTabla se
establecerá a valor1 desde el límite inferior hasta límite superior indicado en el campo2.

Para dar valor a estos parámetros se utiliza el método setXXX() donde XXX será el tipo de
los datos que asignamos al parámetro, indicando el número del parámetro (que empieza
desde 1) y el valor que le queremos dar. Por ejemplo, para asignar valores enteros a los
parámetros se debe hacer:

ps.setInt(1,1200);
ps.setInt(2,1300);

Una vez asignados los parámetros, se puede ejecutar la sentencia llamando al método
executeUpdate() del objeto PreparedStatement:

int n = ps.executeUpdate();

Igual que en el caso de los objetos Statement, se puede utilizar cualquier otro de los
métodos para la ejecución de sentencias, executeQuery() o execute(), según el tipo de
sentencia que se vaya a ejecutar.

8
PATRON DE DISEÑO DAO
Para la realización de los ejercicios y en los videos, vamos a trabajar JDBC usando el patrón
de diseño DAO. Pero primero debemos saber que es un patrón de diseño.

¿QUE ES UN PATRON DE DISEÑO?


Un patrón de diseño es una solución probada que resuelve un tipo específico de problema
en el desarrollo de software referente al diseño.

Las ventajas de usar un patrón de diseño son, que permiten tener el código bien organizado,
legible y mantenible, además te permite reutilizar código y aumenta la escalabilidad en tu
proyecto. En sí proporcionan una terminología estándar y un conjunto de buenas prácticas
en cuanto a la solución en problemas de desarrollo de software.

PATRON DE DISEÑO DAO


A la hora de trabajar con JDBC y trabajar con base de datos, una de las grandes
problemáticas al momento de acceder a los datos, es que la implementación y formato de
la información puede variar según la fuente de los datos. Implementar la lógica de acceso a
datos en la capa de lógica de negocio puede ser un gran problema, pues tendríamos que
lidiar con la lógica de negocio en sí, más la implementación para acceder a los datos

Dado lo anterior, el patrón DAO propone separar por completo la lógica de negocio de la
lógica para acceder a los datos, de esta forma, el DAO proporcionará los métodos
necesarios para insertar, actualizar, borrar y consultar la información; por otra parte, la capa
de negocio solo se preocupa por lógica de negocio y utiliza el DAO para interactuar con la
fuente de datos.

CLASES
Esto lo vamos a lograr a través de cuatro clases:

Entidad: va a ser la clase que va a representar a la tabla que queremos trabajar de la base
de datos. Va tener como atributos las columnas de la tabla de la base de datos.

Servicio o Business Service: va a tener toda la lógica de negocio del proyecto, usualmente
se genera una para cada entidad. Es la que se encarga de obtener datos desde la base de
datos y enviarla al cliente, o a su vez recibir la clase desde el cliente y enviar los datos al
servidor, por lo general tiene todos los métodos CRUD (create, read, update y delete).

DAO: representa una capa de acceso a datos que oculta la fuente y los detalles técnicos
para recuperar los datos. Esta clase va a ser la encargada de comunicarse con la base de
datos, de conectarse con la base de datos, enviar las consultas y recuperar la información
de la base de datos.

EntidadDaoExt: esta clase va a extender de la clase DAO y se va encargar de generar las


sentencias para enviar a la clase DAO, como un insert, select, etc. Y si estuviéramos haciendo
un select, sería también, la encargada de recibir la información, que recupera la clase DAO
de la base de datos sobre una entidad, para después enviarla al servicio, que será la
encargada de imprimir dicha información. Este es un objeto plano que implementa el
patrón Data Transfer Object (DTO), el cual sirve para transmitir la información entre el DAO y
el Business Service.

9
PAQUETES
Esto representado en un proyecto tendría las siguientes clases y paquetes:

Nota: estos conceptos van a poder verlos en más profundidad en los videos, donde verán
clase por clase y tendrán un ejemplo para descargar y poder verlo ustedes mismos también.

10
PREGUNTAS DE APRENDIZAJE
1) ¿Que significa el acrónimo JDBC?

a) Java DataBase Connectivity


b) Java DataBase Conection
c) Java DataBag Connectivity
d) Ninguna de las anteriores

2) La API de JDBC es un conjunto de:

a) Objetos
b) Clases e Interfaces
c) Métodos
d) Solo Clases

3) El encargado de implementar las clases de JDBC es :

a) El JDBC Driver
b) Java
c) La base de datos
d) Ninguna de las anteriores

4) El paquete de la API de JDBC es:

a) java.jdbc.sql.*;
b) java.mysql.*;
c) java.sql.jdbc*;
d) java.sql*;

5) Cuál de estas no es una clase de la API JDBC:

a) Statement
b) ResultSet
c) Connection
d) MetaData

6) ¿Cuál es la clase encarga de conectarse con la base de datos?

a) Statement
b) ResultSet
c) Connection
d) DriverManager

7) ¿Qué datos necesita el objeto Connection para conectarse?

a) url, username y password


b) username y password
c) url, username y nombre BD
d) nombre BD, username, password

11
8) ¿Cuál es la clase encargada de ejecutar las sentencias a la base de datos?

a) Statement
b) ResultSet
c) Connection
d) DriverManager

9) ¿Cuál es la clase encargada de obtener los datos de la base de datos?

a) Statement
b) ResultSet
c) Connection
d) DriverManager

10) ¿Cuál de estas es la excepción de SQL?

a) MysqlException
b) SQLException
c) DataBaseExcepction
d) ConnectionException

12
EJERCICIOS DE APRENDIZAJE
Para la realización de los ejercicios que se describen a continuación, es necesario descargar
el archivo persistencia.zip que contiene el material necesario para realizar esta práctica. Por
otra parte, se recomienda consultar el Instructivo Conexión Netbeans – MySql para poder
conectarnos correctamente a la base de datos

Ver Videos:

A. Conexión y Dominio
B. DAO 1 JDBC
C. DAO 2 JDBC
D. Insertar - Eliminar - Modificar
E. Consultas
F. Guardando Datos
G. Consultas en Relaciones

1. Tienda

Nos han pedido que hagamos una aplicación Java para una tienda con sus
productos. El objetivo es realizar consultas para saber el stock de ciertos productos
o que productos hay, etc. Utilizando el lenguaje JAVA, una base de datos MySQL y
JDBC para realizar la ejecución de operaciones sobre la base de datos (BD).

Para este ejercicio vamos a usar el script de la base de datos llamada “tienda.sql” que
lo trabajamos en la guía de MySql, igualmente lo van a encontrar dentro del archivo
persistencia.zip. Deberá obtener un diagrama de entidad relación igual al que se
muestra a continuación:

Paquetes del Proyecto Java

Crear un nuevo proyecto en Netbeans del tipo “Java Application” con el nombre
Tienda y agregar dentro 3 paquetes, a uno se lo llamará entidades, al otro se le
llamará servicios y al otro persistencia:

13
Para crear los paquetes de esta manera, se deben crear desde el paquete principal,
sería nos paramos en el paquete tienda -> click derecho -> New Java Package y
creamos los paquetes. También es importante agregar en “Libraries” la librería
“MySQL JDBC Driver” para permitir conectar la aplicación de Java con la base de
datos MySQL. Esto se explica en el Instructivo.

Paquete persistencia

En este paquete estará la clase DAO encarga de conectarse con la base de datos y
de comunicarse con la base de datos para obtener sus datos. Además, estará las
clases de EntidadDaoExt para cada entidad / tabla de nuestro proyecto.

Es importante tener la conexión creada a la base de datos, como lo explica el


Instructivo en la pestaña de Services en Netbeans.

Paquete entidades:

Dentro de este paquete se deben crear todas las clases necesarias que vamos a usar
de la base de datos. Por ejemplo, una de las clases a crear dentro de este paquete
es la clase “Producto.java” con los siguientes atributos:

• private int codigo;

• private String nombre;

• private double precio;

• private int codigoFabricante;

Agregar a cada clase el/los constructores necesarios y los métodos públicos getters
y setters para poder acceder a los atributos privados de la clase. La llave foránea se
pondrá como dato nada más, no como objeto.

Paquete servicios:

En este paquete se almacenarán aquellas clases que llevarán adelante lógica del
negocio. En general se crea un servicio para administrar cada una de las entidades
y algunos servicios para manejar operaciones muy específicas como las estadísticas.

Realizar un menú en java a través del cual se permita elegir qué consulta se desea
realizar. Las consultas a realizar sobre la BD son las siguientes:

a) Lista el nombre de todos los productos que hay en la tabla producto.

b) Lista los nombres y los precios de todos los productos de la tabla producto.

c) Listar aquellos productos que su precio esté entre 120 y 202.

d) Buscar y listar todos los Portátiles de la tabla producto.

e) Listar el nombre y el precio del producto más barato.

f) Ingresar un producto a la base de datos.

g) Ingresar un fabricante a la base de datos

h) Editar un producto con datos a elección.

14
EJERCICIOS EXTRAS
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos pueden
realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que venimos
trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas, podes
continuar con estos ejercicios extra, recordando siempre que no es necesario que los
termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es ayudar
a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es que puedas
explicar el ejercicio con la intención de que tu compañero lo comprenda, y no sólo mostrarlo.
¡Muchas gracias!

1. Estancias en el extranjero

Nos han pedido que hagamos una aplicación Java de consola para una pequeña
empresa que se dedica a organizar estancias en el extranjero dentro de una familia. El
objetivo es el desarrollo del sistema de reserva de casas para realizar estancias en el
exterior, utilizando el lenguaje JAVA, una base de datos MySQL y JDBC para realizar la
ejecución de operaciones sobre la base de datos (BD).

Creación de la Base de Datos MySQL

La información que se desea almacenar en la base de datos es la siguiente:

• Se tienen contactos con familias de diferentes países que ofrecen alguna de las
habitaciones de su hogar para acoger algún chico (por un módico precio). De cada
una de estas familias se conoce el nombre, la edad mínima y máxima de sus hijos,
número de hijos y correo electrónico.

• Cada una de estas familias vive en una casa, de la que se conoce la dirección (calle,
numero, código postal, ciudad y país), el periodo de disponibilidad de la casa
(fecha_desde, fecha_hasta), la cantidad de días mínimo de estancia y la cantidad
máxima de días, el precio de la habitación por día y el tipo de vivienda.

• Se dispone también de información de los clientes que desean mandar a sus hijos a
alguna de estas familias: nombre, dirección (calle, numero, código postal, ciudad y
país) y su correo electrónico.

• En la BD se almacena información de las reservas y estancias realizadas por alguno


de los clientes. Cada estancia o reserva la realiza un cliente, y además, el cliente
puede reservar varias habitaciones al mismo tiempo (por ejemplo para varios de sus
hijos), para un periodo determinado (fecha_llegada, fecha_salida).

• El sistema debe también almacenar información brindada por los clientes sobre las
casas en las que ya han estado (comentarios).

Según todas estas especificaciones se debe realizar:

Para este ejercicio vamos a usar el script de la base de datos llamada


“estancias_exterior.sql” lo van a encontrar en el archivo persistencia.zip Deberá obtener
un diagrama de entidad relación igual al que se muestra a continuación:

15
Paquetes del Proyecto Java

Crear un nuevo proyecto en Netbeans del tipo “Java Application” con el nombre
Estancias y agregar dentro 3 paquetes, a uno se lo llamará entidades, al otro se lo
llamará servicios y al otro persistencia:

16
Paquete persistencia

En este paquete estará la clase DAO encarga de conectarse con la base de datos y de
comunicarse con la base de datos para obtener sus datos. Además, estará las clases de
EntidadDaoExt para cada entidad / tabla de nuestro proyecto.

Es importante tener la conexión creada a la base de datos, como lo explica el Instructivo


en la pestaña de Services en Netbeans.

Agregar en “Libraries” la librería “MySQL JDBC Driver” para permitir conectar la


aplicación de Java con la base de datos MySQL.

Paquete entidades:

Dentro de este paquete se deben crear todas las clases necesarias que queremos
persistir en la base de datos. Por ejemplo, una de las clases a crear dentro de este
paquete es la clase “Familia.java” con los siguientes atributos:

• private int id;


• private String nombre;
• private int edad_minima;
• private int edad_maxima;
• private int num_hijos;
• private String email;

Agregar a cada clase el/los constructores necesarios y los métodos públicos getters y
setters para poder acceder a los atributos privados de la clase.

Paquete servicios:

En este paquete se almacenarán aquellas clases que llevarán adelante lógica del
negocio. En general se crea un servicio para administrar cada una de las entidades y
algunos servicios para manejar operaciones muy específicas como las estadísticas.

Para realizar las consultas con la base de datos, dentro del paquete servicios, creamos
las clases para cada una de las entidades con los métodos necesarios para realizar
consultas a la base de datos. Una de las clases a crear en este paquete será:
FamiliaServicio.java, y en esta clase se implementará, por ejemplo, un método para listar
todas las familias que ofrecen alguna habitación para realizar estancias.

Realizar un menú en java a través del cual se permita elegir qué consulta se desea
realizar. Las consultas a realizar sobre la BD son las siguientes:

a) Listar aquellas familias que tienen al menos 3 hijos, y con edad máxima inferior a 10
años.
b) Buscar y listar las casas disponibles para el periodo comprendido entre el 1 de
agosto de 2020 y el 31 de agosto de 2020 en Reino Unido.
c) Encuentra todas aquellas familias cuya dirección de mail sea de Hotmail.
d) Consulta la BD para que te devuelva aquellas casas disponibles a partir de una fecha
dada y un número de días específico.

17
e) Listar los datos de todos los clientes que en algún momento realizaron una estancia
y la descripción de la casa donde la realizaron.
f) Listar todas las estancias que han sido reservadas por un cliente, mostrar el nombre,
país y ciudad del cliente y además la información de la casa que reservó. La que
reemplazaría a la anterior
g) Debido a la devaluación de la libra esterlina con respecto al euro se desea
incrementar el precio por día en un 5% de todas las casas del Reino Unido. Mostar
los precios actualizados.
h) Obtener el número de casas que existen para cada uno de los países diferentes.
i) Busca y listar aquellas casas del Reino Unido de las que se ha dicho de ellas
(comentarios) que están ‘limpias’.
j) Insertar nuevos datos en la tabla estancias verificando la disponibilidad de las fechas.

Para finalizar, pensar junto con un compañero cómo sería posible optimizar las tablas de
la BD para tener un mejor rendimiento.

18
CURSO DE PROGRAMACIÓN FULL STACK

ACCESO A BASES
DE DATOS DESDE
JAVA: JPA
GUÍA DE PERSISTENCIA CON JPA
PERSISTENCIA EN JAVA CON JPA
JPA (Java Persistence API) es la propuesta estándar que ofrece Java para implementar un
Framework Object Relational Mapping (ORM), que permite interactuar con la base de datos
por medio de objetos, de esta forma, JPA es el encargado de convertir los objetos Java en
instrucciones para el Manejador de Base de Datos (MDB). El objetivo que persigue el diseño
de esta API es no perder las ventajas de la orientación a objetos al interactuar con una base
de datos (siguiendo el patrón de mapeo objeto-relacional).

Cuando empezamos a trabajar con bases de datos en Java utilizamos el API de JDBC el
cual nos permite realizar consultas directas a la base de datos a través de consultas SQL
nativas. JDBC por mucho tiempo fue la única forma de interactuar con las bases de datos,
pero representaba un gran problema y es que Java es un lenguaje orientado a objetos y se
tenía que convertir los atributos de las clases en una consulta SQL como SELECT, INSERT,
UPDATE, DELETE, etc. Lo que ocasionaba un gran esfuerzo de trabajo y provocaba muchos
errores en tiempo de ejecución, debido principalmente a que las consultas SQL se tenían
que generar frecuentemente al vuelo.

JPA es una especificación, es decir, no es más que un documento en el cual se plasman las
reglas que debe de cumplir cualquier proveedor que desee desarrollar una implementación
de JPA, de tal forma que cualquier persona puede tomar la especificación y desarrollar su
propia implementación de JPA. Existen varios proveedores como lo son los siguientes:

• Hibernate
• ObjectDB
• TopLink
• EclipseLink
• OpenJPA

PERSITENCIA DE OBJETOS
JPA representa una simplificación del modelo de programación de persistencia. La
especificación JPA define explícitamente la correlación relacional de objetos, en lugar de
basarse en implementaciones de correlación específicas del proveedor. JPA crea un
estándar para la importante tarea de la correlación relacional de objetos mediante la
utilización de anotaciones o XML para correlacionar objetos con una o más tablas de una
base de datos. Para simplificar aún más el modelo de programación de persistencia:

• La API EntityManager puede actualizar, recuperar, eliminar o aplicar la persistencia


de objetos de una base de datos.
• JPA proporciona un lenguaje de consulta, que amplía el lenguaje de consulta EJB
independiente, conocido también como JPQL, el cual puede utilizar para recuperar
objetos sin grabar consultas SQL específicas en la base de datos con la que está
trabajando.
• El programador no necesita programar código JDBC ni consultas SQL.
• El entorno realiza la conversión entre tipos Java y tipos SQL.

1
• El entorno crea y ejecuta las consultas SQL necesarias.

ARQUITECTURA JPA

La arquitectura de JPA está diseñada para gestionar Entidades y las relaciones que hay
entre ellas. A continuación, detallamos los principales componentes de la arquitectura

Entity: Clase Java simple que representa una fila en una tabla de base de datos con su
formato más sencillo. Los objetos de entidades pueden ser clases concretas o clases
abstractas. Podemos decir que cada Entidad corresponderá con una tabla de nuestra Base
de Datos

Persistence: Clase con métodos estáticos que nos permiten obtener instancias de
EntityManagerFactory.

EntityManagerFactory: Es una factoría de EntityManager. Se encarga crear y gestionar


múltiples instancias de EntityManager

EntityManager: Es una interface que gestiona las operaciones de persistencia de las


entidades, ya sea crear, editar, eliminar, traer de la base de datos una entidad, etc. Es la base
de todo proyecto de JPA. A su vez trabaja como factoría de las Querys.

Query: Es una interface para obtener la relación de objetos que cumplen un criterio

EntityTransaction: Agrupa las operaciones realizadas sobre un EntityManager en una única


transacción de Base de Datos

MAPEO CON ANOTACIONES


Como sabemos las bases de datos relacionales almacenan la información mediante tablas,
filas, y columnas, de manera que para almacenar un objeto hay que realizar una correlación
entre el sistema orientado a objetos de Java y el sistema relacional de nuestra base de
datos. JPA nos permite realizar dicha correlación de forma sencilla, realizando nosotros
toda la conversión entre nuestros objetos y las tablas de una base de datos. Esta conversión
se llama ORM (Object Relational Mapping - Mapeo Relacional de Objetos), y puede
configurarse a través de metadatos (anotaciones). A estos objetos, las cuales son clases
comunes y corrientes, los llamaremos desde ahora entidades.

2
Las anotaciones nos permiten configurar el mapeo de una entidad dentro del mismo archivo
donde se declara la clase, de este modo, relaciona las clases contra las tablas y los atributos
contra las columnas.

Las anotaciones comienzan con el símbolo “@” seguido de un identificador. Las anotaciones
son utilizadas antes de la declaración de clase, propiedad o método. A continuación, se
detallan las principales:

@Entity: Declara la clase como una Entidad

@Table: Declara el nombre de la Tabla con la que se mapea la Entidad

@Id: Declara un atributo como la clave primaria de la Tabla

@GeneratedValue: Declara como el atributo que va a ser al clave primaria va a ser


inicializada. Manualmente, Automático o a partir de una secuencia

@Column: Declara que un atributo se mapea con una columna de la tabla

@Enumerated: Declara que un atributo es de alguno de los valores definidos en un


Enumerado (lista de valores constantes). Los valores de un tipo enumerado tienen asociado
implícitamente un tipo ordinal que será asociada a la propiedad de este tipo.

@Temporal: Declara que se está tratando de un atributo que va a trabajar con fechas, entre
paréntesis, debemos especificarle que estilo de fecha va a manejar en la base de datos:
@Temporal(TemporalType.DATE), @Temportal(TemporalType.TIME),
@Temporal(TemporalType.TIMESTAMP)

DECLARAR ENTIDADES CON @ENTITY


Como ya discutimos hace un momento, las entidades son simples clases Java como
cualquier otra, sin embargo, JPA debe de ser capaz de identificar que clases son entidades
para de esta forma poder administrarlas. Es aquí donde nace la importancia de la anotación
@Entity, esta anotación se debe de definir a nivel de clase y sirve únicamente para indicarle
a JPA que esa clase es una Entity, veamos el siguiente ejemplo:

public class Empleado {


private Long id;
private String nombre;
}
En el ejemplo vemos una clase común y corriente la cual representa a un Empleado, hasta
este momento la clase Empleado, no se puede considerar una entidad, pues a un no tiene
la anotación @Entity que la señale como tal. Ahora bien, si a esta misma clase le agregamos
la anotación @Entity le estaremos diciendo a JPA que esta clase es una entidad y deberá
ser administrada por el EntityManager, veamos el siguiente ejemplo:

@Entity
public class Empleado {
private Long id;
private String nombre;
}
En este punto la clase ya se puede considerar una Entidad.

3
DEFINIR LLAVE PRIMARÍA CON @ID
Al igual que en las tablas, las entidades también requieren un identificador o clave
primaria(ID). Dicho identificador deberá de diferenciar a la entidad del resto. Como regla
general, todas las entidades deberán definir un ID, de lo contrario provocaremos que el
EntityManager marque error a la hora de instanciarlo.

El ID es importante porque será utilizado por el EntityManager a la hora de persistir un objeto,


y es por este que puede determinar sobre que registro hacer el select, update o delete.

@Entity
public class Empleado {
@Id
private Long id;
private String nombre;
}
Se ha agregado @Id sobre el atributo id, de esta manera, cuando el EntityManager inicie
sabrá que el campo id es el Identificador de la clase Empleado.

ANOTACIÓN @GENERATEDVALUE
Esta anotación se utiliza cuando el ID es autogenerado (Identity) como en el caso de MySQL.
JPA cuenta con la anotación @GeneratedValue para indicarle a JPA que regla de
autogeneración de la lleva primaria vamos a utilizar.

Identity

Esta estrategia es la más fácil de utilizar pues solo hay que indicarle la estrategia y listo, no
requiere nada más, JPA cuando persista la entidad no enviará este valor, pues asumirá que
la columna es auto generada. Esto provoca que el contador de la columna incremente en 1
cada vez que un nuevo objeto es insertado.

@Entity
public class Empleado {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nombre;
}

MAPEO DE FECHAS CON @TEMPORAL


Mediante la anotación @Temporal es posible mapear las fechas con la base de datos de una
forma simple. Una de las principales complicaciones cuando trabajamos con fecha y hora
es determinar el formato empleado por el manejador de base de datos. Sin embargo, esto
ya no será más problema con @Temporal.

Mediante el uso de @Temporal es posible determinar si el atributo almacena Hora, Fecha U


hora y Fecha. Para esto podemos utilizar la clase Date o Calendar. Se pueden establecer
tres posibles valores para la anotación:

4
DATE: Acotara el campo solo a la Fecha, descartando la hora.

@Temporal(TemporalType.DATE)
TIME: Acotara el campo solo a la Hora, descartando a la fecha.
@Temporal(TemporalType.TIME)
TIMESTAMP: Toma la fecha y hora.

@Temporal(TemporalType.TIMESTAMP)
Ejemplo:

@Entity
public class Persona {
@Id
private Long id;
private String nombre;
@Temporal(TemporalType.DATE)
private Date fechaNacimiento;
}

LAS RELACIONES
Como sabemos en Java, los objetos pueden estar relacionados entre sí mediante las
relaciones entre clases y sabemos que en MySQL las tablas también están relacionadas
entre sí. Es por esto que JPA, nos da 4 anotaciones para cuando tenemos una relación entre
dos clases en Java y le queremos explicar a la base de datos la relación entre las tablas y
sus registros.

Estas anotaciones solo van a afectar a las tablas, sirven para especificar como se van a
relacionar los registros de una tabla, con los registros de otra tabla. Recordemos que las
anotaciones cumplen el propósito de “traducir” nuestro código de Java para que lo entienda
la base de datos, por lo que las anotaciones, no van a afectar nunca a nuestro código.

Entonces, supongamos que tenemos dos clases, Curso y Profesor, entre las cuales existe
una relación de 1 a 1 . Un Curso por lo tanto tiene 1 Profesor y un Profesor pertenece a un
Curso. Esto en nuestro código Java sería algo así:

@Entity
public class Profesor {
@Id
private Long id;
private String nombre;
}
@Entity
public class Curso {
@Id
private Long id;
private Integer precio;
private String nombreCurso;
private Profesor profesor;
}

5
Por ahora lo único que hemos creado es una referencia a la clase Profesor sin utilizar JPA
para nada. El siguiente paso será anotar la clase con anotaciones de JPA para que se
construya la relación a nivel de persistencia.

@Entity
public class Curso {
@Id
private Long id;
private Integer precio;
private String nombreCurso;
@OneToOne
private Profesor profesor;
}
Con esta anotación nos quedará unas tablas en MySQL de la siguiente manera:

Como podemos observar en la tabla Curso, existe una llave foránea de la tabla Profesor, de
la misma manera que en nuestra clase Curso existe un objeto de tipo Profesor.

La relación OneToOne en nuestra tablas va a especificar que para un registro de un Curso,


solo hay un registro de un Profesor. En otras palabras sería que un Curso no puede tener
dos Profesores o que a cada Curso, solo podemos asignarle/persistir un Profesor.

A partir de estos conceptos definimos 4 tipos principales de relaciones entre entidades:

@OneToOne: usamos esta anotación cuando tenemos una relación de 1 a 1 entre dos clases
/ tablas.

@ManyToOne: usamos esta anotación cuando tenemos una relación de n a 1 entre dos
clases / tablas. Por ejemplo, muchos Álbumes pueden pertenecer a un Autor.

@ManyToOne
private Autor autor;

La relación ManyToOne en nuestra tablas va a especificar que para uno o varios registros de
Álbumes va a haber un Autor. En otras palabras sería que uno o más Álbumes van a tener el
mismo Autor. Esto nos daría la posibilidad de que, a uno o muchos Álbumes asignarle el
mismo Autor, esta posibilidad no existe con la OneToOne, ya que a cada registro solo le
podemos asignar un registro.

@OneToMany: usamos esta anotación cuando tenemos una relación de 1 a n entre dos
clases / tablas. Por ejemplo, un Curso tiene muchos Alumnos. Es importante recordar que
cuando hablamos de que una clase tiene muchos(Many) o n de algo, usamos una colección
para representar esa relación en Java, sino usaríamos un solo objeto.

@OneToMany
private List<Alumno> alumnos;

6
La relación OneToMany en nuestra tablas va a especificar que para un registro de un Curso,
va a haber varios registros de Alumnos. En otras palabras sería que un Curso puede tener
uno o más Alumnos. Esto nos daría la posibilidad de, al mismo registro de Curso asignarles
varios Alumnos.

@ManyToMany: usamos esta anotación para entidades que están relacionadas con muchos
elementos de un tipo determinado, pero al mismo tiempo, estos últimos registros no son
exclusivos de un registro en particular, si no que pueden ser parte de varios. Por lo tanto,
tenemos una Entidad A, la cual puede estar relacionada como muchos registros de la
Entidad B, pero al mismo tiempo, la Entidad B puede pertenecer a varias instancias de la
Entidad A.

Algo muy importante a tomar en cuenta cuando trabajamos con relaciones @ManyToMany
o @OneToMany, es que en realidad este tipo de relaciones no existen físicamente en la base
de datos, y en su lugar, es necesario crear una tabla intermedia que relacione las dos
entidades.

@ManyToMany
private List<Alumno> alumnos;

Nota: que clase va a tener la referencia a la otra clase va a ser decisión del programador.

Tabla intermedia

El concepto de tabla intermedia se presenta cuando tenemos una entidad que va a


pertenecer a varias instancias de otra entidad, por ejemplo, un Curso tiene muchos Alumnos.
Esto en SQL sería que un registro tiene varios registros asignados a el mismo.

El problema es que en SQL solo podemos poner un dato por columna, supongamos que el
Curso tiene 3 alumnos con los identificadores(id) 1,2,3. Nosotros no podemos tener una
columna que tenga 3 valores separados. Lo que podríamos hacer es que se repita el registro
de Curso 3 veces con los 3 identificadores, pongamos un ejemplo de una tabla que cumpla
ese requisito:

ID Precio NombreCurso IdAlumnos

1 1000 Programación 1

1 1000 Programación 2

1 1000 Programación 3

Esto parecería estar bien, pero si pensamos en las reglas de SQL, no podemos tener dos
identificadores iguales en la misma y en nuestra tabla Curso hay 3 veces el mismo
identificador para el Curso, ya que necesitamos que se repita.

Aquí es donde entra la tabla intermedia, la tabla intermedia va a ser una tabla que se va a
crear, además de las dos tablas que ya tenemos y que va a encargarse de relacionar estas
dos tablas.

La tabla intermedia se denomina típicamente "tabla de unión". Esta tabla se utiliza para
vincular las otras dos tablas. Para ello, tiene dos campos que hacen referencia a la clave
principal de cada una de las otras dos tablas. Veamos un ejemplo de una tabla intermedia:

7
Id_curso Id_alumno

1 1

1 2

1 3

Como podemos observar la tabla intermedia solo tiene dos columnas, el id del curso y el id
del alumno. Esta tabla no toma las columnas como llaves primarias, sino como llaves
foráneas, esto nos permite repetir el identificador de Curso para asignárselo a los 3 alumnos.

Las tablas en MySQL se verían así:

Notemos que en la tabla Curso no tiene una columna que haga referencia a Alumno, ni
Alumno a Curso, si no que es la tabla intermedia la encargada de hacer el cruce entre las
dos tablas.

Nota: recordemos que esta tabla intermedia se va a generar con las anotaciones
@OneToMany y @ManyToMany.

RELACIONES JPA Y UML


En Java, nosotros tenemos dos posibles relaciones entre clases, uno a uno o de uno a
muchos, además son las dos que podemos representar en código. Por ejemplo, la relación
muchos a uno, no existe en Java porque no podemos poner que una clase va a ser un List
para representar el muchos. Java al ver que hay una referencia a una clase con un objeto
solo, la va a tomar como una relación de uno a uno.

Esto nos va a generar que cuando veamos un UML de nuestro proyecto JPA, no veamos las
relaciones ManyToOne o ManyToMany, ya que como dijimos solo existen las uno a uno o
uno a muchos.

Pongamos un ejemplo, tenemos la Clase Autor y la clase Álbum, vamos a decir que muchos
Álbumes existe el mismo autor, por lo que sería una ManyToOne. Si la representamos en
código sería así:

@ManyToOne
private Autor autor;

Ahora si tuviéramos una OneToOne, la representación en codigo sería esta:

@OneToOne
private Autor autor;

8
Si miramos el código, podemos observar que para las dos relaciones escribimos el mismo
código, entonces para Java la relación ManyToOne la va a representar como una OneToOne
(1…1) en UML y lo mismo nos pasaría con la OneToMany y la ManyToMany.

Por lo que si nos encontramos con un UML que tiene una relación uno a uno (1…1), pensar
que puede ser una OneToOne o una ManyToOne, o que si tiene una relación uno a muchos
(1…n), puede ser una OneToMany o una ManyToMany.

Esto es porque las relaciones muchos a uno y muchos a muchos son propias de MySQL, no
de Java. Entonces es importante, que a la hora de pensar en que anotaciones le vamos a
poner a nuestras entidades, pensemos en las tablas, ya que estamos trabajando como va a
ser la relación entre las tablas y no las clases.

PERSISTENCIA EN JPA CON ENTITYMANAGER


Ahora que entendemos como a través de las anotaciones del ORM podemos unificar las
tablas de la base de datos con los objetos, que pasan a llamarse entidades. Ahora tenemos
que ver como hacemos para poder guardar, editar, eliminar, etc. a esas entidades en la base
de datos.

JPA tiene como interface medular al EntityManager, el cual es el componente que se


encarga de controlar el ciclo de vida de todas las entidades definidas en la unidad de
persistencia. El EntityManager nos dará la posibilidad de poder crear, borrar, actualizar y
consultar todas estas entidades de la base de datos. También es la clase por medio de la
cual se controlan las transacciones. Los EntityManager son configurados siempre a partir de
las unidades de persistencia definidas en el archivo persistence.xml.

EntityManager em =
Persistence.createEntityManagerFactory("nombreUnidadDePersistencia").creat
eEntityManager();

En esta línea se puede ver que se obtiene una instancia de la Interfaz EntityManagerFactory,
mediante la clase Persistence, esta última recibe como parámetro el nombre de la unidad
de persistencia que definimos en el archivo persistence.xml. Una vez con el
EntityManagerFactory se obtiene una instancia de EntityManager para finalmente ser
retornada para ser utilizada.

OPERACIONES ENTITYMANAGER
Las entidades pueden ser cargadas, creadas, actualizadas y eliminadas a través del
EntityManager. Vamos a mostrar los métodos del EntityManager que nos permiten lograr
estas operaciones.

9
Persist()

Este método nos deja persistir una entidad en nuestra base de datos. Persistir es la acción
de preservar la información de un objeto de forma permanente, en este caso en una base
de datos, pero a su vez también se refiere a poder recuperar la información del mismo para
que pueda ser nuevamente utilizado.

Antes de ver como persistimos un objeto, también tenemos que entender el concepto de
transacciones, ya que para persistir un objeto en la base de datos, la operación debe estar
marcada como una transacción.

Una transacción es un conjunto de operaciones sobre una base de datos, que suelen crear,
editar o eliminar un registro de la base de datos, que se deben ejecutar como una unidad.
Por lo que una consulta a la base de datos no se la considera una transacción.

Entendiendo esto veamos un ejemplo del método Persist():

// Creamos un EntityManager
EntityManager em =
Persistence.createEntityManagerFactory("nombreUnidadDePersistencia").createEnt
ityManager();
//Creamos un objeto Alumno y le asignamos un nombre
Alumno alumno = new Alumno();
a1.setNombre(“Nahuel”);
//Iniciamos una transacción con el método getTransaction().begin();
em.getTransaction().begin();
//Persistimos el objeto
em.persist(alumno);
//Terminamos la transacción con el método commit. Commit en programación
significa confirmar un conjunto de cambios, en este caso persistir el objeto
em.getTransaction().commit();

Find()

Este método se encarga de buscar y devolver una Entidad en la base de datos, a través de
su clave primaria(Id). Para ello necesita que le pasemos la clave y el tipo de Entidad a buscar.

// Creamos un EntityManager
EntityManager em =
Persistence.createEntityManagerFactory("nombreUnidadDePersistencia").createEnt
ityManager();
// Usamos el método find para buscar una persona con el id 123 en nuestra base
de datos
Persona persona = em.find(Persona.class, 123);

De esta manera podremos obtener una Persona de la base de datos para usar ese objeto
como queramos.

Merge()

Este método funciona igual que el método persist pero, sirve para actualizar una entidad en
la base de datos.

10
EntityManager em =
Persistence.createEntityManagerFactory("nombreUnidadDePersistencia").createEnt
ityManager();
//Usamos el método find para buscar el alumno a editar
Alumno alumno = em.find(Alumno.class,1234);
//Le asignamos un nuevo nombre
alumno.setNombre(Francisco);
em.getTransaction().begin();
//Actualizamos el alumno
em.merge(alumno);
em.getTransaction().commit();

Remove()

Este método se encarga de eliminar una entidad de la base de datos.

EntityManager em =
Persistence.createEntityManagerFactory("nombreUnidadDePersistencia").createEnt
ityManager();
//Usamos el método find para buscar el alumno a borrar
Alumno alumno = em.find(Alumno.class,1234);
em.getTransaction().begin();
//Borramos el alumno
em.remove(alumno);
em.getTransaction().commit();

JAVA PERSISTENCE QUERY LANGUAGE (JPQL)


Es un lenguaje de consulta orientado a objetos independiente de la plataforma definido
como parte de la especificación Java Persistence API (JPA). JPQL es usado para hacer
consultas contra las entidades almacenadas en una base de datos relacional. Está inspirado
en gran medida por SQL, y sus consultas se asemejan a las consultas SQL en la sintaxis,
pero opera con objetos entidad de JPA en lugar de hacerlo directamente con las tablas de
la base de datos.

CLAUSULAS SELECT – FROM


La cláusula FROM define de qué entidades se seleccionan los datos. Cualquier
implementación de JPA, mapea las entidades a las tablas de base de datos
correspondientes. Esto significa que vamos a utilizar el nombre de las entidades en vez del
nombre de las tablas y los atributos de las entidades en vez de las columnas de las tablas.

La sintaxis de una cláusula FROM de JPQL es similar a SQL pero usa el modelo de entidad
en lugar de los nombres de tabla o columna. El siguiente fragmento de código muestra una
consulta JPQL simple en la que selecciono todas las entidades Autor.

SELECT a FROM Autor a;

En la query se ve que, se hace referencia a la entidad Autor en lugar de la tabla de autor y se


le asigna la variable de identificación a. La variable de identificación a menudo se llama alias
y es similar a una variable en su código Java.

11
Se utiliza en todas las demás partes de la consulta para hacer referencia a esta entidad. Por
ejemplo, si queremos seleccionar un atributo de la entidad Autor, en vez de todos, usaríamos
el alias asi:

SELECT a.nombre, a.apellido FROM Autor a;

CLAUSULA WHERE
La sintaxis es muy similar a SQL, pero JPQL admite solo un pequeño subconjunto de las
características de SQL.

JPQL admite un conjunto de operadores básicos para definir expresiones de comparación.


La mayoría de ellos son idénticos a los operadores de comparación admitidos por SQL, y
puede combinarlos con los operadores lógicos AND, OR y NOT en expresiones más
complejas.

Operadores:

• Igual: author.id = 10

• Distinto: author.id <> 10

• Mayor que: author.id > 10

• Mayor o Igual que: author.id => 10

• Menor que: author.id < 10

• Menor o igual que: author.id <= 10

• Between: author.id BETWEEN 5 and 10

• Like: author.firstName LIKE :‘%and%’

• Is null: author.firstName IS NULL .


Se lo puede negar con el operador NOT, para traer todos los que no son nulos

• In: author.firstName IN (‘John’,‘Jane’)


Va a traer todos los autores con el nombre John o Jane.

UNIR ENTIDADES
Si necesitamos seleccionar datos de más de una entidad, por ejemplo, todos los libros que
ha escrito un autor, debe unir las entidades en la cláusula FROM. La forma más sencilla de
hacerlo es utilizar las asociaciones definidas de una entidad como en el siguiente fragmento
de código.

SELECT a FROM Libro a JOIN a.autor b;


La definición de la entidad Libro proporciona toda la información necesaria para unirla a la
entidad Autor, y no es necesario que proporcione una declaración ON adicional.

También podemos utilizar el operador “.”, para navegar a través del atributo de autor de la
entidad Libro y traer los libros que tengan un autor con un nombre a elección. Esto generaría
una relación implícita entre las dos entidades, sin la necesidad de usar un Join.

SELECT a FROM Libro a WHERE a.autor.nombre LIKE : "Homero";

12
PREGUNTAS DE APRENDIZAJE
1) ¿Que significa el acrónimo JPA?

a) Java Practise API


b) Java Persitence API
c) Java Persist API
d) Ninguna de las anteriores

2) El ORM nos permite interactuar con la base de datos mediante:

a) Objetos
b) Clases e Interfaces
c) Métodos
d) Solo Clases

3) La anotación @Entity:

a) Declara la clave primaria de una entidad


b) Declara la clase como entidad
c) Declara que el atributo es una columna de la tabla
d) Ninguna de las anteriores

4) La anotación @Id:

a) Declara la clave primaria de una entidad


b) Declara la clase como entidad
c) Declara que el atributo es una columna de la tabla
d) Ninguna de las anteriores

5) La anotación @Column:

a) Declara la clave primaria de una entidad


b) Declara la clase como entidad
c) Declara que el atributo es una columna de la tabla
d) Ninguna de las anteriores

6) La anotación @Temporal:

a) Declara que se está tratando de un atributo que va a trabajar con fechas


b) Declara la clase como entidad
c) Declara que el atributo es una columna de la tabla
d) Ninguna de las anteriores

7) ¿Cuál de estos no es un tipo de la anotación @Temporal?

a) DATE
b) TIME
c) DATETIME
d) TIMESTAMP

13
8) Elegir que anotación se aplica a la siguiente relación, un Perro pertenece a un Dueño:

a) @OneToOne
b) @ManyToMany
c) @ManyToOne
d) @OneToMany

9) Elegir que anotación se aplica a la siguiente relación, un Cliente tiene muchas Facturas:

a) @OneToOne
b) @ManyToMany
c) @ManyToOne
d) @OneToMany

10) Elegir que anotación se aplica a la siguiente relación, muchos Alumnos tienen un
Profesor:

a) @OneToOne
b) @ManyToMany
c) @ManyToOne
d) @OneToMany

11) Elegir que anotación se aplica a la siguiente relación, muchas Alumnos tienen muchas
Clases:

a) @OneToOne
b) @ManyToMany
c) @ManyToOne
d) @OneToMany

12) ¿Qué interfaz se encargar de persistir, actualizar y borrar las entidades?

a) Persistence
b) EntityManagerFactory
c) EntityManager
d) DriverManager

13) El método que se encarga de persistir las entidades es el método:

a) Persist()
b) Merge()
c) Remove()
d) Find()

14) ¿Cuál es el lenguaje de consultas en JPA?

a) SQL
b) MYSQL
c) JPQL
d) Mongo

14
EJERCICIOS DE APRENDIZAJE
Para la realización de los ejercicios que se describen a continuación, sigue siendo necesario
el conector de MySQL y es necesario tener descargado el Instructivo Unidad de Persistencia.

VER VIDEOS:

A. Introducción JPA – Parte 1


B. Introducción JPA – Parte 2
C. Capa de acceso a datos

1. Sistema de Guardado de una Librería

El objetivo de este ejercicio es el desarrollo de un sistema de guardado de libros en JAVA


utilizando una base de datos MySQL y JPA como framework de persistencia.

Creación de la Base de Datos MySQL:

Lo primero que se debe hacer es crear la base de datos sobre el que operará el sistema de
reservas de libros. Para ello, se debe abrir el IDE de base de datos que se está utilizando
(Workbench) y ejecutar la siguiente sentencia:

CREATE DATABASE libreria;


De esta manera se habrá creado una base de datos vacía llamada librería.

Paquetes del Proyecto Java:

Los paquetes que se utilizarán para este proyecto son los siguientes:

Ø entidades: en este paquete se almacenarán aquellas clases que se quiere


persistir en la base de datos.

Ø servicios: en este paquete se almacenarán aquellas clases que llevarán adelante


la lógica del negocio. En general se crea un servicio para administrar las
operaciones CRUD (Create, Remove, Update, Delele) cada una de las entidades
y las consultas de cada entidad.

Nota: En este proyecto vamos a eliminar entidades, pero no es considerado una


buena practica. Por esto, además de eliminar nuestras entidades, vamos a practicar
que nuestras entidades estén dados de alta o de baja. Por lo que las entidades
tendrán un atributo alta booleano, que estará en true al momento de crearlas y en
false cuando las demos de baja, que sería cuando se quiere eliminar esa entidad.

15
a) Entidades

Crearemos el siguiente modelo de entidades:

Entidad Libro

La entidad libro modela los libros que están disponibles en la biblioteca para ser
prestados. En esta entidad, el atributo “ejemplares” contiene la cantidad total de
ejemplares de ese libro, mientras que el atributo “ejemplaresPrestados” contiene
cuántos de esos ejemplares se encuentran prestados en este momento y el atributo
“ejemplaresRestantes” contiene cuántos de esos ejemplares quedan para prestar.

Entidad Autor

La entidad autor modela los autores de libros.

Entidad Editorial

La entidad editorial modela las editoriales que publican libros.

b) Unidad de Persistencia

Para configurar la unidad de persistencia del proyecto, se recomienda leer el Instructivo


Unidad de Persistencia recuerde hacer click con el botón derecho sobre el proyecto y
seleccionar nuevo. A continuación, se debe seleccionar la opción de Persistence Unit
como se indica en la siguiente imagen.

16
Base de Datos

Para este proyecto nos vamos a conectar a la base de datos Librería, que creamos
previamente.

Generación de Tablas

La estrategia de generación de tablas define lo que hará JPA en cada ejecución, si debe
crear las tablas faltantes, si debe eliminar todas las tablas y volver a crearlas o no hacer
nada. Recomendamos en este proyecto utilizar la opción: “Create”

Librería de Persistencia

Se debe seleccionar para este proyecto la librería “EclipseLink”.

c) Servicios

AutorServicio

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para administrar autores (consulta, creación, modificación y eliminación).

EditorialServicio

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para administrar editoriales (consulta, creación, modificación y eliminación).

LibroServicio

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para administrar libros (consulta, creación, modificación y eliminación).

17
d) Main

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para interactuar con el usuario. En esta clase se muestra el menú de opciones con las
operaciones disponibles que podrá realizar el usuario.

e) Tareas a Realizar

Al alumno le toca desarrollar, las siguientes funcionalidades:

1) Crear base de datos Librería


2) Crear unidad de persistencia
3) Crear entidades previamente mencionadas ( excepto Préstamo )
4) Generar las tablas con JPA
5) Crear servicios previamente mencionados.
6) Crear los métodos para persistir entidades en la base de datos librería
7) Crear los métodos para dar de alta/bajo o editar dichas entidades.
8) Búsqueda de un Autor por nombre.
9) Búsqueda de un libro por ISBN.
10) Búsqueda de un libro por Título.
11) Búsqueda de un libro/s por nombre de Autor.
12) Búsqueda de un libro/s por nombre de Editorial.
13) Agregar las siguientes validaciones a todas las funcionalidades de la aplicación:
• Validar campos obligatorios.
• No ingresar datos duplicados.

18
EJERCICIOS EXTRAS
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos pueden
realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que venimos
trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas, podes
continuar con estos ejercicios extra, recordando siempre que no es necesario que los
termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es ayudar
a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es que puedas
explicar el ejercicio con la intención de que tu compañero lo comprenda, y no sólo mostrarlo.
¡Muchas gracias!

1. Sistema de Reservas de una Librería

Vamos a continuar con el ejercicio anterior. Ahora el objetivo de este ejercicio es el


desarrollo de un sistema de reserva de libros en JAVA. Para esto vamos a tener que
sumar nuevas entidades a nuestro proyecto en el paquete de entidades y crearemos los
servicios de esas entidades.

Usaremos la misma base de datos y se van a crear las tablas que nos faltan. Deberemos
agregar las entidades a la unidad de persistencia.

a) Entidades

Crearemos el siguiente modelo de entidades:

Entidad Cliente

La entidad cliente modela los clientes (a quienes se les presta libros) de la biblioteca. Se
almacenan los datos personales y de contacto de ese cliente.

19
Entidad Préstamo

La entidad préstamo modela los datos de un préstamo de un libro. Esta entidad registra
la fecha en la que se efectuó el préstamo y la fecha en la que se devolvió el libro. Esta
entidad también registra el libro que se llevo en dicho préstamo y quien fue el cliente al
cual se le prestaron.

b) Servicios

ClienteServicio

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para administrar clientes (consulta, creación, modificación y eliminación).

PrestamoServicio

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para generar prestamos, va a guardar la información del cliente y del libro para persistirla
en la base de datos. (consulta, creación, modificación y eliminación).

c) Tareas a Realizar

Al alumno le toca desarrollar, las siguientes funcionalidades:

1. Creación de un Cliente nuevo


2. Crear entidad Préstamo
3. Registrar el préstamo de un libro.
4. Devolución de un libro
5. Búsqueda de todos los prestamos de un Cliente.
6. Agregar validaciones a todas las funcionalidades de la aplicación:
• Validar campos obligatorios.
• No ingresar datos duplicados.
• No generar condiciones inválidas. Por ejemplo, no se debe permitir prestar más
ejemplares de los que hay, ni devolver más de los que se encuentran prestados.
No se podrán prestar libros con fecha anterior a la fecha actual, etc.

20
CURSO DE PROGRAMACIÓN FULL STACK

TUTORIAL: GUÍA
PRÁCTICA DE USO
DE GIT CON GITHUB
GUÍA DE GIT CON GITHUB
¿QUÉ ES EL CONTROL DE VERSIONES?
Los sistemas de control de versiones son programas que tienen como objetivo controlar los
cambios en el desarrollo de cualquier tipo de software, permitiendo conocer el estado actual
de un proyecto, los cambios que se le han realizado a cualquiera de sus piezas, las personas
que intervinieron en ellos, etc. El software de control de versiones realiza un seguimiento de
todas las modificaciones en el código en un tipo especial de base de datos. Si se comete
un error, los desarrolladores pueden ir atrás en el tiempo y comparar las versiones anteriores
del código para ayudar a resolver el error al tiempo que se minimizan las interrupciones para
todos los miembros del equipo.

Los desarrolladores que trabajan en equipos están escribiendo continuamente nuevo


código fuente y cambiando el que ya existe. El código de un proyecto, una aplicación o un
componente de software normalmente se organiza en una estructura de carpetas o "árbol
de archivos". Un desarrollador del equipo podría estar trabajando en una nueva función
mientras otro desarrollador soluciona un error no relacionado cambiando código. Cada
desarrollador podría hacer sus cambios en varias partes del árbol de archivos.

El control de versiones ayuda a los equipos a resolver estos tipos de problemas, al realizar
un seguimiento de todos los cambios individuales de cada colaborador y ayudar a evitar
que el trabajo concurrente entre en conflicto.

En definitiva, tener un control de los cambios en los códigos de nuestra aplicación es una
variable crucial para el éxito de nuestro desarrollo. Git es un sistema de control de versiones
de código abierto, diseñado para manejar grandes y pequeños proyectos con rapidez y
eficiencia. La pretensión de este tutorial es abordar el uso básico de Git proporcionando
ejemplos prácticos útiles para comenzar a administrar repositorios remotos con plataformas
como Bitbucket o GitHub.

CONTROL DE VERSIONES CON GIT


Git es la mejor opción para la mayoría de los equipos de software actuales. Aunque cada
equipo es diferente y debería realizar su propio análisis, aquí recogemos los principales
motivos por los que destaca el control de versiones de Git con respecto a otras alternativas:

GIT ES UNA EXCELENTE HERRAMIENTA


Git tiene la funcionalidad, el rendimiento, la seguridad y la flexibilidad que la mayoría de los
equipos y desarrolladores individuales necesitan. En las comparaciones directas con gran
parte de las demás alternativas, Git resulta muy ventajoso para muchos equipos.

GIT ES UN PROYECTO DE CÓDIGO ABIERTO DE CALIDAD


Git es un proyecto de código abierto muy bien respaldado con más de una década de
gestión de gran fiabilidad. Los encargados de mantener el proyecto han demostrado un
criterio equilibrado y un enfoque maduro para satisfacer las necesidades a largo plazo de
sus usuarios con publicaciones periódicas que mejoran la facilidad de uso y la funcionalidad.

1
La calidad del software de código abierto resulta sencilla de analizar y un sin número de
empresas dependen en gran medida de esa calidad.

Git goza de una amplia base de usuarios y de un gran apoyo por parte de la comunidad. La
documentación es excepcional y para nada escasa, ya que incluye libros, tutoriales y sitios
web especializados, así como podcasts y tutoriales en vídeo.

El hecho de que sea de código abierto reduce el costo para los desarrolladores aficionados,
puesto que pueden utilizar Git sin necesidad de pagar ninguna cuota. En lo que respecta a
los proyectos de código abierto, no cabe duda de que Git es el sucesor de las anteriores
generaciones de los exitosos sistemas de control de versiones de código abierto, SVN y
CVS.

GITHUB
Github es un portal creado para alojar el código de las aplicaciones de cualquier
desarrollador. La plataforma está creada para que los desarrolladores suban el código de
sus aplicaciones y herramientas, y que como usuario no solo puedas descargarte la
aplicación, sino también entrar a su perfil para leer sobre ella o colaborar con su desarrollo.

Un sistema de gestión de versiones es ese con el que los desarrolladores pueden


administrar su proyecto, ordenando el código de cada una de las nuevas versiones que
sacan de sus aplicaciones para evitar confusiones. Así, al tener copias de cada una de las
versiones de su aplicación, no se perderán los estados anteriores cuando se va a actualizar.

Git, al ser un sistema de control, va ser la herramienta que nos va a permitir comparar el
código de un archivo para ver las diferencias entre las versiones, restaurar versiones
antiguas si algo sale mal, y fusionar los cambios de distintas versiones.

Así pues, Github es un portal para gestionar proyectos usando el sistema Git.

¿CÓMO VAMOS A LOGRAR ESO?


Github permite que los desarrolladores alojen proyectos creando repositorios de forma
gratuita. Un repositorio es como una carpeta para tu proyecto. El repositorio de tu proyecto
contiene todos los archivos de tu repositorio y almacena el historial de revisión de cada
archivo. También puedes debatir y administrar el trabajo de tu proyecto dentro del
repositorio.

2
CREAR UN REPOSITORIO EN GITHUB
Para subir tu proyecto a GitHub, deberás crear un repositorio donde alojarlo. Para poder
crear un repositorio deberemos crearnos una cuenta en GitHub.

1) En la esquina superior derecha de cualquier página, utiliza el menú desplegable + y


selecciona Repositorio Nuevo

2) Escribe un nombre corto y fácil de recordar para tu repositorio. Por ejemplo: "hola-
mundo".

3) También puedes agregar una descripción de tu repositorio. Por ejemplo, "Mi primer
repositorio en GitHub".

4) Elige la visibilidad del repositorio. Puedes restringir quién tiene acceso a un repositorio
eligiendo la visibilidad de un repositorio: público o privado. Publico significa que
cualquier persona puede ver ese repositorio y privado significa que solo personas
autorizadas pueden verlo. Que sea publico no significa que la gente puede subir cosas
a nuestro repositorio, lo único que permite es que se puedan ver los archivos.

3
5) Podemos crear el repositorio con un ReadMe

6) Da click en Crear repositorio.

INSTALACIÓN DE GIT
Una vez que tenemos creado un repositorio en GitHub vamos a tener que instalar Git

INSTALADOR DE GIT PARA MAC


El modelo de Git de Apple viene preinstalado en macOS. Abra su terminal o editor de scripts
de shell de su elección e ingrese git –version para verificar qué versión de Git está en su
máquina. Si aún no está en su máquina, ejecutar git –version le pedirá que instale Git.

Si bien esta compilación de Git está bien para algunos usuarios, es posible que desee
instalar la versión más actualizada. Puede hacerlo de muchas formas diferentes; hemos
recopilado algunas de las opciones más fáciles a continuación.

1) Una forma es instalar Git en un Mac es mediante el instalador independiente:

A. Descarga el instalador de Git para Mac más reciente desde acá:

https://sourceforge.net/projects/git-osx-installer/files/

4
B. Sigue las instrucciones para instalar Git.

Abre un terminal y escribe el siguiente texto para comprobar que la instalación se ha


realizado correctamente:

git --version:

$ git --version
git version 2.9.2

2) Otra forma es instalar Git mediante HomeBrew:

Homebrew instala una lista de paquetes útiles que no vienen preinstalados en Mac.

A. Pegue el siguiente comando en su terminal para instalar Homebrew:

/bin/bash -c "$(curl -fsSL


https://raw.githubusercontent.com/Homebrew/install/HEAD/install
.sh)"

B. El terminal le pedirá que ingrese una contraseña. Ingrese la contraseña que usa para
iniciar sesión en su Mac y continuar con el proceso de instalación.

C. Una vez terminado, ingrese brew install git en la terminal y espere a que se descargue.
Verifique que Git se instaló ejecutando git –version .

INSTALADOR DE GIT PARA LINUX


Debian / Ubuntu (apt-get)

Los paquetes de Git están disponibles mediante APT:

1. Desde tu núcleo, instala Git mediante apt-get:

$ sudo apt-get update


$ sudo apt-get install git

2. Introduce el siguiente texto para verificar que la instalación se ha realizado


correctamente:

git --version:

$ git --version
git version 2.9.2

INSTALADOR DE GIT PARA WINDOWS


1. Descarga el instalador de Git para Windows más reciente.
2. Cuando hayas iniciado correctamente el instalador, verás la pantalla del asistente
de instalación de Git.
3. Selecciona las opciones Siguiente y Finalizar para completar la instalación. Las
opciones predeterminadas son las más lógicas en la mayoría de los casos.

5
4. Abre el símbolo del sistema (o Git Bash si durante la instalación seleccionaste no usar
Git desde el símbolo del sistema de Windows).
5. Introduce el siguiente texto para verificar que la instalación se ha realizado
correctamente:

git --version:

$ git --version
git version 2.9.2

CONFIGURACIÓN INICIAL
Abra su terminal de Git para comenzar con la ejecución de comandos, por ejemplo, abrirá
el programa Git bash en Windows para ingresar a la línea de comandos de este programa.

Una vez que ingrese, use el siguiente comando para establecer el nombre de usuario de git:

git config -—global user.name “Jhoel Perez”

Recuerde sustituir el texto entre comillas por su nombre real. Ahora indique el correo
electrónico del usuario para git:

git config --global user.email "[email protected]"

Sustituyendo el texto entre comillas por su cuenta de correo electrónico. Esta configuración
inicial debería ser suficiente para comenzar. Para comprobar otros valores de su
configuración actual ejecute:

git config -–list

Se mostrarán los nuevos valores configurados al final, y otros valores de configuración


predeterminados:

...
color.diff=auto
color.status=auto
...
user.name=Juan Perez
[email protected]

FORMAS DE COMENZAR A TRABAJAR CON GIT


Para trabajar con Git con Github tenemos dos formas de trabajar:

1) Trabajar en local, en un repositorio que me cree en mi máquina y vincularlo a un


repositorio creado en GitHub

2) Clonar un repositorio de Github (u otro hosting de repositorios) para traernos a local


el repositorio completo y empezar a trabajar con ese proyecto.

6
Vamos a elegir de momento la opción 1) que nos permitirá comenzar desde cero y con la
que podremos apreciar mejor cuáles son las operaciones básicas con Git. En este sentido,
cualquier operación que realizas con Git tiene que comenzar mediante el trabajo en local,
por lo que tienes que comenzar por crear el repositorio en tu propia máquina. Incluso si tus
objetivos son simplemente subir ese repositorio a Github para que otras personas lo puedan
acceder a través del hosting remoto de repositorios, tienes que comenzar trabajando en
local.

INICIO DE UN NUEVO REPOSITORIO: GIT INIT


Primero deberemos crear una carpeta vacía para inicializar nuestro repositorio, una vez que
la tenemos creada debemos decirle a la terminal que se pare en esa carpeta, así todos los
comandos de Git, afectan a esa carpeta.

En Windows podemos hacer click derecho a la carpeta y darle a Git Bash Here, eso nos
abrirá la terminal Git Bash en la carpeta para trabajar Git.

En Mac podemos hacer lo mismo, click derecho a la carpeta y darle a la opción Nuevo
Terminal en la carpeta.

Una vez parados en nuestra carpeta. Para crear un nuevo repositorio, usa el comando git
init. git init es un comando que se utiliza una sola vez durante la configuración inicial de un
repositorio nuevo. Al ejecutar este comando, se creará un nuevo subdirectorio .git en tu
directorio de trabajo actual. También se creará una nueva rama principal.

$ git init

GUARDAR CAMBIOS EN EL REPOSITORIO: GIT ADD Y GIT COMMIT


Ahora que has iniciado o clonado un repositorio, puedes realizar commits en la versión del
archivo. Vamos a ir a nuestra carpeta y vamos a crear un archivo txt con nuestro nombre
escrito, una vez que lo tengamos creado vamos a hacer los siguientes comandos.

Git Status

El comando de git status nos da toda la información necesaria sobre la rama actual.

git status

Podemos encontrar información como:

• Si la rama actual está actualizada

• Si hay algo para confirmar, enviar o recibir (pull).

• Si hay archivos en preparación (staged), sin preparación(unstaged) o que no están


recibiendo seguimiento (untracked)

• Si hay archivos creados, modificados o eliminados

7
Nota: veremos el concepto de ramas más adelante.

Hacemos un git status en nuestro repositorio para ver el estado actual.

Git Add

Cuando creamos, modificamos o eliminamos un archivo, estos cambios suceden en local y


no se incluirán en el siguiente commit (a menos que cambiemos la configuración).

Necesitamos usar el comando git add para incluir los cambios del o de los archivos en tu
siguiente commit.

Añadir un único archivo:

git add <archivo>

Añadir todo de una vez:

git add .

Si revisas la captura de pantalla del git status, verás que hay nombres de archivos en rojo -
esto significa que los archivos sin preparación. Estos archivos no serán incluidos en tus
commits hasta que no los añadas.

Hacemos un git add . para agregar nuestro archivo txt. Una vez que hacemos el git add
hacemos otro git status, ahora veremos que los archivos que estaban en rojo, están en verde,
esto quiere decir que ya los hemos agregado para hacer nuestro commit.

Git Commit

Este sea quizás el comando más utilizado de Git. Una vez que se llega a cierto punto en el
desarrollo, queremos guardar nuestros cambios (quizás después de una tarea o asunto
específico) o subir un archivo / proyecto.

Git commit es como establecer un punto de control en el proceso de desarrollo al cual


puedes volver más tarde si es necesario. Es como un punto de guardado en un videojuego.

También necesitamos escribir un mensaje corto para explicar qué hemos desarrollado o
modificado en el código fuente.

git commit -m "mensaje de confirmación"

8
Hacemos un commit para guardar nuestro txt y le ponemos un mensaje que explique que
hemos hecho.

VINCULAR NUESTRO REPOSITORIO CON GITHUB


Primero deberemos crear un repositorio, sin el archivo readME.

Una vez que tenemos el archivo agregado y guardado de manera local, tenemos que
vincular este repositorio local a un repositorio remoto en GitHub. Para esto vamos a utilizar
el comando git remote add.

Este comando va a tomar el alias nuestro repositorio y la url de nuestro repositorio en


GitHub, con esto va a vincularlo con nuestro repositorio local.

git remote add <name> <url>

El alias que vamos a utilizar para Github es origin y para obtener la url de nuestro repositorio,
podemos encontrarla al principio de nuestro repositorio:

Buscamos el url de nuestro repositorio de GitHub y lo hacemos en nuestro terminal.

Por lo que pondremos git remote add origin <url>

COLABORACIÓN ENTRE REPOSITORIOS: GIT PUSH


Después de haber confirmado tus cambios y haber vinculado el repositorio de Git local con
el repositorio remoto de GitHub, el siguiente paso que quieres dar es enviar tus cambios o
archivos al servidor remoto. git push envía tus commits al repositorio remoto.

git push <nombre-remoto> <nombre-de-tu-rama>

De todas formas, si tu rama ha sido creada recientemente, puede que tengas que cargar y
subir tu rama con el siguiente comando:

git push origin <nombre-de-tu-rama>

Recordemos que usamos el alias origin para el repositorio remoto.

Cuando creamos un repositorio en GitHub, nos crea una rama por defecto llamada main,
podemos en la configuración cambiar para que la rama que se cree por defecto se llame
master.

Por lo que ahora haremos el siguiente comando en nuestra terminal:

git push origin main

git push origin master

Una vez que hemos hecho esto, si refrescamos nuestro repositorio vamos a ver nuestro
archivo txt en nuestro repositorio de GitHub.

9
Este proceso se va a repetir, quitando la vinculación y la inicialización del repositorio, cada
vez que nosotros hagamos un cambio dentro de nuestro repositorio. Esto puede ser
modificar un archivo ya existente o agregar más archivos a la carpeta local.

RAMAS EN GIT
A menudo necesitamos trabajar con más de una persona sobre un mismo proyecto. Pero,
¿Qué pasa si más de un desarrollador hace cambios sobre el mismo archivo?, o peor aún,
¿Qué pasa si ambos cambian la misma línea de código?
Para evitar este tipo de problemas y colisionar código permanentemente, git provee la
herramienta de branches (rama). De esta manera, puedes crear tu propia rama del
proyecto y hacer todos los cambios que necesites, y al final del proceso crear un pull
request para mergear (juntar tus cambios) con la rama principal, main o master.

GIT CHECKOUT Y GIT BRANCH


El comando git branch es el que usaremos principalmente para trabajar con la creación de
ramas, borrado de ramas y demás. Sin embargo, no es el único comando para la operativa
que veremos en este artículo, ya que existen otros subcomandos de Git útiles y necesarios
para trabajar con ramas, como checkout para crear y moverse entre ramas

Puedes comenzar tu primera práctica para trabajar con ramas. Haremos algo tan sencillo
como lanzar el comando "git branch" a secas. Esto nos dará el listado de ramas que
tengamos en un proyecto. Pero hay que advertir que las ramas de un repositorio local
pueden ser distintas de las ramas de un repositorio remoto. Por ejemplo, cuando clonas un
repositorio de GitHub generalmente estás clonando únicamente la rama master y no todas
las ramas que se hayan creado a lo largo del tiempo. Otro ejemplo es cuando creas una
rama en tu repositorio local. En este caso la rama la tendrás simplemente en tu proyecto
local y no se subirá al repositorio remoto hasta que no lo especifiques.

LA RAMA MASTER O MAIN


Cuando inicializamos un proyecto con Git automáticamente nos encontramos en una rama
a la que se denomina "master".

Puedes ver las rama en la que te encuentras en cada instante con el comando:

git branch

Esta rama es la principal de tu proyecto y a partir de la que podrás crear nuevas ramas
cuando lo necesites.

Si has hecho algún commit en tu repositorio observarás que después de lanzar el comando
"git branch" nos informa el nombre de la rama como "master".

Recordemos que en GitHub esta rama puede llamarse Main, siempre podemos cambiar el
nombre de la rama a Master con las configuraciones de GitHub.

CREAR UNA RAMA NUEVA


El procedimiento para crear una nueva rama es bien simple. Usando el comando checkout
seguido del nombre de la rama que queremos crear. El guion b lo que hace es crear la rama
y cambiar a esa rama nueva.

10
git checkout -b nombre_de_tu_branch

Si nos fijamos nos solo creamos una nueva rama local, sino que ahora nos paramos en la
nueva rama que creamos.

Podemos obtener una descripción más detallada de las ramas con este otro comando:

git show-branch

Esto nos muestra todas las ramas del proyecto con sus commits realizados. La salida sería
como la de la siguiente imagen.

Como podemos ver la rama nueva ya tiene el primer commit que realizamos en la rama
master porque como explicamos más arriba, estamos clonando la rama master.

PASAR DE UNA RAMA A OTRA


Para moverse entre ramas usamos el comando git checkout seguido del nombre de la rama
que queremos que sea la activa.

git checkout nombre_de_tu_branch

Esto se vería así:

Esta sencilla operación tiene mucha potencia, porque nos cambiará automáticamente todos
los archivos de nuestro proyecto, los de todas las carpetas, para que tengan el contenido en
el que se encuentren en la correspondiente rama.

De momento en nuestro ejemplo las dos ramas tenían exactamente el mismo contenido,
pero ahora podríamos empezar a hacer cambios en el proyecto ramaGit y sus
correspondientes commit y entonces los archivos tendrán códigos diferentes, de modo que
puedas ver que al pasar de una rama a otra hay cambios en los archivos.

Al igual que explicamos antes cada vez que quieras subir un cambio a tu branch sitúate en
ella y ejecuta los comandos:

git add nombre_del_archivo (punto(.) en lugar del nombre si quieres


agregar todos cambiados)

11
git commit -m “Mensaje de los cambios”

No vamos a hacer un push todavía porque eso lo vamos a explicar más adelante, ya que
eso hará que nuestra rama aparezca en el repositorio remoto.

Habiendo hecho un commit en nuestra nueva rama, observarás que al hacer el show-
branches te mostrará nuevos datos:

Si te dedicas a editar tus ficheros, crear nuevos archivos y demás en las distintas ramas
entonces podrás observar que al moverte de una a otra con checkout el proyecto cambia
automáticamente en tu editor, mostrando el estado actual en cada una de las ramas donde
te estás situando. Es algo divertido y, si eres nuevo en Git verás que es una magia que resulta
bastante sorprendente.

Como podras ver, el proyecto puede tener varios estados en un momento dado y tú podrás
moverte de uno a otro con total libertad y sin tener que cambiar de carpeta ni nada parecido.

SUBIR UNA RAMA AL REPOSITORIO REMOTO


Como habíamos dicho anteriormente, por mucho que hagas la operativa descrita para crear
ramas en tu ordenador, y las puedas ver en tu repositorio local con git branch, las ramas no
se publicarán en Github o cualquier otro hosting de repositorios remoto. Para que esto
ocurra tienes que realizar específicamente la acción de subir una rama determinada.

La operativa de publicar una rama en remoto la haces mediante el comando push, indicando
el nombre de la rama que deseas subir. Por ejemplo de esta manera:

git push origin nombre_de_tu_branch

Así estamos haciendo un push, empujando hacia origin (que es el nombre que se suele dar
al repositorio remoto).

12
Si no quieres poner siempre origin y el nombre de tu rama en tus push, tienes que sumarle
al push anterior, -u antes de la palabra origin. Esto hará que puedas poner git push solamente
y vaya siempre a esa rama.

Es importante asegurarse que lo hagamos en una rama nuestra y no en master, ya que


podríamos mandar cambios a la rama master pensando que iban a la nuestra.

Esto sería asi:

git push -u origin nombre_de_tu_branch

Una vez esto hecho esto podríamos pararnos en nuestra rama y simplemente escribir:

git push

Una vez que hagamos para ver las ramas, primero iremos a branches:

Y ahí podremos ver las dos ramas

Puedes subir tanto commits creas convenientes a tu branch antes de mergear a master,
siempre es mejor pequeños y frecuentes cambios que pocos y grandes.

FUSIONAR RAMAS
A medida que crees ramas y cambies el estado de las carpetas o archivos tu proyecto
empezará a divergir de una rama a otra. Llegará el momento en el que te interese fusionar
ramas para poder incorporar el trabajo realizado a la rama master.

13
El proceso de fusionado se conoce como merge y puede llegar a ser muy simple o más
complejo si se encuentran cambios que Git no pueda procesar de manera automática. Git
para procesar los merge usa un antecesor común y comprueba los cambios que se han
introducido al proyecto desde entonces, combinando el código de ambas ramas.

Para hacer un merge nos situamos en una rama, en este caso la "master", y decimos con
qué otra rama se debe fusionar el código.

El siguiente comando, lanzado desde la rama "master", permite fusionarla con la rama
"ramaGit".

git merge ramaGit

Un merge necesita un mensaje, igual que ocurre con los commit, por lo que al realizar ese
comando se abrirá "Vim" (o cualquier otro editor de consola que tengas configurado) para
que introduzcas los comentarios que juzgues oportuno. Salir de Vim lo consigues pulsando
la tecla ESC y luego escribiendo :q y pulsando enter para aceptar ese comando. Esta
operativa de indicar el mensaje se puede resumir con el comando:

git merge ramaGit -m “Esto es un merge con mensaje”

Luego podremos comprobar que nuestra rama master tiene todo el código nuevo de la
ramaGit y podremos hacer nuevos commits en master para seguir el desarrollo de nuestro
proyecto ya con la rama principal, si es nuestro deseo.

PULL REQUEST
Previamente habíamos fusionado nuestras ramas a través del comando merge, pero GitHub
nos permite fusionar nuestras ramas y además ver los cambios que hay entre una rama y
otra, gracias al Pull Request

Vamos a pararnos de nuevo en una etapa en donde no hemos mergeado las ramas. Hasta
ese punto habíamos logrado independizar nuestros cambios de los del resto del equipo,
pero se acercaba la hora de publicar nuestros cambios y surge la necesidad de conocer y/o
validar cuan diferente es nuestra versión y de ver que todo está bien fusionar esos cambios.
Aquí es donde la herramienta de pull request viene al rescate.

Para crear un pull request debemos ir a la sección de branches, buscar nuestro branch y
clickear en el botón New pull request.

14
Antes de hacer nuestro pull request, podemos ver, cuantos commits (cambios) son los que
separan a otra rama de master. Si nos fijamos nos salen dos ceros, pero si master estuviera
un commit por delante de alguna rama saldrían un uno en el cero de la izquierda y asi se
incrementa el numero según la cantidad de commits que este por delante master. Ahora, si
el numero estuviera a la derecha, sería que la otra rama está x commits por delante master.

Aca podemos ver un ejemplo con ramaGit:

Como podemos ver ramaGit está un commit por delante de master, por lo que si
mergeamos las ramas, sería solo un commit el que se le aplicaría a master.

15
Nos mostrará algo similar a lo siguiente.

Referencias:

1. A la izquierda se selecciona la rama de destino a la cual vamos a querer mergear los


cambios, a la derecha nuestra rama actual. Siempre podemos crear un pull request
y cambiar las ramas que queremos mergear.
2. En esta sección podremos poner un titulo informativo de que se tratan nuestros
cambios y una descripción como documentación adicional. Detalle de los cambios
propuestos, test plan, etc.
3. En esta sección nos muestra un resumen de los commits y archivos modificados.
4. En la ultima sección nos muestra el detalle de los archivos modificados. Para
visualizar los cambios podemos alternar entre los modos de vista “Unified” y “Split”

Hasta este momento aún no hemos creado nada, solo estamos viendo un resumen previo,
para continuar clickeamos en el botón “Create pull request”. A continuación, veremos el pull
request creado de la siguiente manera.

Por otro lado podemos usar la pestaña de “Files changed” para hacer code review.

16
Si detectamos alguna línea de código que requiera cambios puedes clickear sobre ella y
agregar un comentario para que el autor del pull request lo modifique. No es necesario
volver a crear un nuevo pull request para actualizar los cambios, simplemente haciendo un
commit sobre el branch es suficiente, GitHub toma los cambios y actualiza el pull request
automáticamente.

Si esta todo bien y no hay conflictos podemos mergear nuestro branch a master clickeando
en el botón “Merge pull request” y de eso modo finaliza el ciclo del branch.

Finalmente tenemos la opción de aprobar los cambios para que el autor del pull request
mergee su cambio.

Una vez que unamos los cambios en nuestra ramas nos va a salir que la rama ha sido
mergeada.

17
BORRAR UNA RAMA
En ocasiones puede ser necesario eliminar una rama del repositorio, por ejemplo porque
nos hayamos equivocado en el nombre al crearla. Aquí la operativa puede ser diferente,
dependiendo de si hemos subido ya esa rama a remoto o si todavía solamente está en local.

BORRADO DE LA RAMA EN LOCAL


Esto lo conseguimos con el comando git branch, solamente que ahora usamos la opción
-d para indicar que esa rama queremos borrarla.

git branch -d rama_a_borrar

Sin embargo, puede que esta acción no nos funcione porque hayamos hecho cambios que
no se hayan salvado en el repositorio remoto, o no se hayan fusionado con otras ramas. En
el caso que queramos forzar el borrado de la rama, para eliminarla independientemente de
si se ha hecho el push o el merge, tendrás que usar la opción -D.

git branch -D rama_a_borrar

Debes prestar especial atención a esta opción "-D", ya que al eliminar de este modo pueden
haber cambios que ya no se puedan recuperar. Como puedes apreciar, es bastante fácil de
confundir con "-d", opción más segura, ya que no permite borrado de ramas en situaciones
donde se pueda perder código.

ELIMINAR UN BRANCH EN REMOTO


Si la rama que queremos eliminar está en el repositorio remoto, la operativa es un poco
diferente. Tenemos que hacer un push, indicando la opción --delete, seguida de la rama que
se desea borrar.

git push origin --delete rama_a_borrar

DESCARGAR UNA RAMA DE REMOTO


A veces ocurre que se generan ramas en remoto, por ejemplo cuando han sido creadas por
otros usuarios y subidas al hosting de repositorios, como GitHub o similares, y necesitamos
acceder a ellas en local para verificar los cambios o continuar el trabajo. En principio esas
ramas en remoto creadas por otros usuarios no están disponibles para nosotros en local,
pero las podemos descargar.

El proceso para obtener una rama del repositorio remoto es bien sencillo. Primero usaríamos
el comando git checkout para crear la rama que nos falta en local y usamos el -b para
pararnos en ella.

git checkout -b nombre_de_tu_branch

18
Una vez que hicimos eso, podemos conseguir todo lo que esté en la rama con el comando
pull, poniendo el alias del repitorio remoto y el nombre de la rama:

git pull origin rama_a_descargar

GIT PULL
Acabamos de ver que usamos el comando git pull para descargar la rama, asi que vamos a
explicar un poco más de este comando.

Git pull es un comando de Git utilizado para actualizar la versión local de un repositorio
desde otro remoto.

Es uno de los cuatro comandos que solicita interacción de red por Git. Por default, git
pull hace dos cosas.

1. Actualiza la rama de trabajo actual (la rama a la que se ha cambiado actualmente)

2. Actualiza las referencias de rama remota para todas las demás ramas.

git pull recupera (git fetch) las nuevas confirmaciones y las fusiona (git merge) en tu rama
local.

USANDO GIT PULL


Usa git pull para actualizar un repositorio local del repositorio remoto correspondiente. Por
ejemplo: Mientras trabajas localmente en master, ejecuta git pull para actualizar la copia
local de master y actualizar las otras ramas remota de seguimiento remoto.

Sin embargo, hay algunas cosas que hay que tener en cuenta para que ese ejemplo sea
cierto:

El repositorio local tiene un repositorio remoto vinculado.

• Confirma esto ejecutando git remote -v

• Si existen múltiples remotos, git pull podría no ser suficiente información. Es posible
que debas ingresar git pull origin o git pull upstream.

CLONAR UN REPOSITORIO
Ahora vamos a hablar de la operativa de clonado de un repositorio, el proceso que tienes
que hacer cuando quieres traerte el código de un proyecto que está publicado en GitHub y
lo quieres restaurar en tu ordenador, para poder usarlo en local, modificarlo, etc.

Este paso es bastante básico y muy sencillo de hacer, pero es esencial porque lo necesitarás
realizar muchas veces en tu trabajo como desarrollador. Además intentaremos
complementarlo con alguna información útil, de modo que puedas aprender cosas útiles y
un poquito más avanzadas.

DESCARGAR VS CLONAR
Al inicio de uso de un sitio como GitHub, si no tenemos ni idea de usar Git, también podemos
obtener el código de un repositorio descargando un simple Zip. Esta opción la consigues
mediante el botón de la siguiente imagen.

19
Sin embargo, descargar un repositorio así, aunque muy sencillo no te permite algunas de las
utilidades interesantes de clonarlo, como:

• No crea un repositorio Git en local con los cambios que el repositorio remoto ha
tenido a lo largo del tiempo. Es decir, te descargas el código, pero nada más.

• No podrás luego enviar cambios al repositorio remoto, una vez los hayas realizado
en local.

En resumen, no podrás usar en general las ventajas de Git en el código descargado. Así que
es mejor clonar, ya que aprender a realizar este paso es también muy sencillo.

CLONAR EL REPOSITORIO GIT


Entonces veamos cómo debes clonar el repositorio, de modo que sí puedas beneficiarte de
Git con el código descargado. El proceso es el siguiente.

Primero copiarás la URL del repositorio remoto que deseas clonar (ver el icono "Copy to
clipboard” en la siguiente imagen).

Luego abrirás una ventana de terminal, para situarte sobre la carpeta de tu proyecto que
quieras clonar. Yo te recomendaría crear ya directamente una carpeta con el nombre del
proyecto que estás clonando, o cualquier otro nombre que te parezca mejor para este
repositorio. Te sitúas dentro de esa carpeta y desde ella lanzamos el comando para hacer
el clon, que sería algo como esto:

git clone https://github.com/EggEducacion/MiPrimerRepositorio.git .

20
El último punto, después de la url copiada desde git, le indica que el clon lo vas a colocar en
la carpeta donde estás situado, en tu ventana de terminal. La salida de ese comando sería
más o menos como tienes en la siguiente imagen:

De esta manera nosotros ya tenemos el repositorio remoto para trabajar local y podremos
hacer los cambios que queramos y subir los cambios con los comandos que explicamos
previamente.

INVITAR COLABORADORES A UN REPOSITORIO PERSONAL


Nosotros vimos como clonar un repositorio para poder usar su código y si quisiéramos hacer
cambios y subir esos cambios. Todos los usuarios de GitHub pueden ver y clonar tu
repositorio, siempre y cuando sea un repositorio publico. Pero, no todo las personas que
clonan tu repositorio pueden subir sus cambios, ya que GitHub entiende que los repositorios
son de nuestra propiedad y somos los únicos que podemos modificarlo.

Ahora, como hacemos cuando queremos que varias personas trabajen en un mismo
repositorio y queremos que GitHub les deje subir esos cambios. Para ese dilema GitHub nos
deja invitar colaboradores a nuestro proyecto. Esto se hará de la siguiente manera:

1. Solicita el nombre de usuario de la persona que estás invitando como colaboradora.


2. En GitHub, visita la página principal del repositorio.
3. Debajo de tu nombre de repositorio, da clic en Configuración.

4. En la barra lateral izquierda, da clic en Administrar acceso.

21
5. Da clic en Invitar un colaborador.

6. En el campo de búsqueda, comienza a teclear el nombre de la persona que quieres


invitar, luego da clic en un nombre de la lista de resultados.

7. Da clic en Añadir a nombreRepositorio.

8. El usuario recibirá un correo electrónico invitándolo al repositorio. Una vez que


acepte la invitación, tendrá acceso de colaborador a tu repositorio. Las invitaciones
pendientes caducarán después de 7 días. Esto restablecerá cualquier licencia sin
reclamar.

22
PREGUNTAS DE APRENDIZAJE
1) ¿Qué es Git?

a) Una plataforma de repositorios remotos


b) Un nombre para GitHub
c) Un lenguaje de programación
d) Un sistema de control de versiones

2) ¿Qué es GitHub?

a) Una plataforma de repositorios remotos


b) Un nombre para GitHub
c) Un lenguaje de programación
d) Un sistema de control de versiones

3) ¿Que comando usamos para iniciar un repositorio de manera local?

a) Git clone
b) Git commit
c) Git init
d) Git status

4) ¿Que comando usamos para obtener la información de nuestra rama?

a) Git help
b) Git add
c) Git info
d) Git status

5) ¿Que comando usamos para incluir los cambios en el repositorio local?

a) Git add
b) Git clone
c) Git status
d) Git init

6) ¿Que comando usamos para guardar nuestros cambios en el repositorio local?

a) Git clone
b) Git save
c) Git commit
d) Git add

7) ¿Que comando usamos para enviar nuestros cambios al repositorio remoto?

a) Git send
b) Git push
c) Git pull
d) Git remote

23
8) ¿Que comando usamos para crear una rama?

a) Git branch
b) Git checkout -b
c) Git clone
d) Git init

9) ¿Que comando usamos para unir los cambios de dos ramas?

a) Git merge
b) Git join
c) Git pull
d) Git push

10) Para unir nuestros cambios de dos ramas en el repositorio remoto vamos a usar:

a) Pull Request
b) Git Merge remote
c) Pull Merge
d) Ninguna de las anteriores

11) ¿Que comando usamos para clonar un repositorio de GitHub?

a) Git pull
b) Git clone
c) Git download
d) Git remote

24
EJERCICIOS DE APRENDIZAJE
Ahora es momento de poner en practica todo lo visto en la guía.

VER VIDEOS:

A. Fundamentos Básicos de Git


B. Inicialización Repositorio Local
C. Enviar Información entre Repositorios
D. Moverse entre Diferentes Commits

1. Vamos a crear una carpeta con un archivo txt, dentro poner el texto que queramos, esta
carpeta junto con el txt tienen que iniciarse como un repositorio local. Además
deberemos subir este archivo a un repositorio remoto.

2. Ahora tenemos que modificar el txt y subir esos cambios al repositorio remoto.

VER VIDEOS:

A. Creación de una Nueva Rama


B. Merge entre Ramas
C. Clonar un Repositorio
D. Repaso de Comandos

3. Para el siguiente ejercicio, van a tener que trabajar en equipo, con sus compañeros de
mesa.

a) El facilitador de cada equipo debe crear un repositorio público con el nombre


practica_github seleccionando la opción Initialize this repository with a README.
b) Una vez creado el repositorio el facilitador debe invitar a los integrantes de su mesa
al mismo. Clickear en el botón Invite a collaborator y buscar a los miembros de su
mesa por username o email.
c) Cada miembro debe aceptar la invitación al repositorio. Checkear la invitación el
email y clickear en View Invitation.
d) Clonar el repositorio. Cada miembro del equipo debe clonar el repositorio con el
archivo ReadMe. Luego de aceptar la invitación github te redirige al repositorio.
e) Cada miembro de la mesa, incluido el facilitador, debe crear su propia rama para
trabajar sobre el archivo ReadMe
f) Ahora cada miembro de la mesa, debe incluir su nombre en el archivo ReadMe de
manera local y subirlo a su rama.
g) Cuando todos los miembros de la mesa han agregado su nombre al archivo ReadMe,
de uno en uno, ir uniendo en la rama master todos vuestros cambios. Al final les
debería quedar un archivo ReadMe con todos sus nombre.

4. Ahora van a continuar trabajando como mesa. Vuestra tarea ahora es que cada miembro
de la mesa, incluido el facilitador, debe crear su branch y crear una de las siguientes
clases: Gato, Perro, Caballo, Conejo, Pájaro y Pato. Cada uno le va a poner los atributos
que desee.

25
El facilitador va a tener que crear el repositorio y subir un proyecto de Java vacio para
que los miembros de la mesa puedan clonar y crear su clase. Una vez que cada miembro
haya creado su clase en su respectiva rama, deberán unir todas las clases en la rama
master, para que quede el proyecto final.

26
CURSO DE PROGRAMACIÓN FULL STACK

HTML & CSS


GUIA HTML & CSS
INTRODUCCIÓN
El World Wide Web (WWW) es un sistema que contiene una cantidad de información casi
infinita. Pero esta información debe estar ordenada de alguna forma de manera que sea
posible encontrar lo que se busca. La unidad básica donde está almacenada esta
información son las páginas Web. Estas páginas se caracterizan por contener texto,
imágenes, animaciones... e incluso sonido y video.

Una de las características más importantes de las paginas Web es que son hipertexto. Esto
quiere decir que las paginas no son elementos aislados, sino que están unidas a otras
mediante los links o enlaces hipertexto. Gracias a estos enlaces el navegante de internet
puede pulsar sobre un texto de una página para navegar hasta otra pagina. Será cuestión
del programador de la pagina inicial decidir que palabras o frases serán activas y a donde
nos conducirá pulsar sobre ellas.

HTML
Entendiendo que las paginas web son hipertexto, aquí es donde entra HTML. El Lenguaje
de Marcado de Hipertexto o Hyper Text Markup Languange (HTML) es el código que se
utiliza para estructurar y desplegar una página web y sus contenidos. HTML es el lenguaje
con el que se escribe el contenido de las páginas web. Las páginas web pueden ser vistas
por el usuario mediante un tipo de aplicación llamada cliente web o más comúnmente
"navegador". Podemos decir por lo tanto que el HTML es el lenguaje usado para especificar
el contenido que los navegadores deben representar a la hora de mostrar una página web.

Este lenguaje nos permite aglutinar textos, imágenes, enlaces... y combinarlos a nuestro
gusto. La ventaja del HTML a la hora de representar el contenido en un navegador, con
respecto a otros formatos físicos como libros o revistas, es justamente la posibilidad de
colocar referencias a otras páginas, por medio de los enlaces hipertexto.

Cuando nos referimos al contenido queremos indicar párrafos, imágenes, listas, tablas y
todo aquello que forma parte de "el qué". Nunca debemos usar HTML para definir cómo se
debe de ver un contenido, si el texto debe tener color rojo, con una fuente mayor, o si se
debe alinear a la derecha. Para especificar el aspecto que debe tener una web se usa un
lenguaje complementario, llamado CSS.

HTML LENGUAJE DE MARCADO


HTML no es un lenguaje de programación; es un lenguaje de marcado que define la
estructura de tu contenido. Basa su sintaxis en un elemento base al que llamamos marca,
tag o simplemente etiqueta. A través de las etiquetas vamos definiendo los elementos del
documento, como enlaces, párrafos, imágenes, etc. Así pues, un documento HTML estará
constituido por texto y un conjunto de etiquetas para definir la función que juega cada
contenido dentro de la página. Todo eso le servirá al navegador para saber cómo se tendrá
que presentar el texto y otros elementos en la página.

Existen etiquetas para crear negritas, párrafos, imágenes, tablas, listas, enlaces, etc. Así
pues, aprender HTML es básicamente aprenderse una serie de etiquetas, sus funciones,
sus usos y saber un poco sobre cómo debe de construirse un documento básico.

1
Es una tarea muy sencilla de afrontar, al alcance de cualquier persona, puesto que el
lenguaje es muy entendible para los seres humanos.

Por ejemplo, toma la siguiente línea de texto:

Mi gato es muy gruñon

Si quieres especificar que se trata de un párrafo, podrías encerrar el texto con la etiqueta
de párrafo (<p>):

<p> Mi gato es muy gruñon </p>

ANATOMIA DE UNA ETIQUETA HTML

Las partes principales de la etiqueta completa llamada elemento son:

1. La etiqueta de apertura: consiste en el nombre de la etiqueta (en este caso, p),


encerrado por paréntesis angulares (< >) de apertura y cierre. Establece dónde
comienza o empieza a tener efecto la etiqueta ,en este caso, dónde es el comienzo del
párrafo.

2. La etiqueta de cierre: es igual que la etiqueta de apertura, excepto que incluye una
barra de cierre (/) antes del nombre de la etiqueta. Establece dónde termina la etiqueta,
en este caso dónde termina el párrafo.

3. El contenido: este es el contenido de la etiqueta, que en este caso es sólo texto.

4. El elemento: la etiqueta de apertura, más la etiqueta de cierre, más el contenido


equivale al elemento.

ANIDAR ETIQUETAS
Puedes también colocar etiquetas dentro de otros etiquetas, esto se llama anidamiento. Si,
por ejemplo, quieres resaltar una palabra del texto (en el ejemplo la palabra «muy»),
podemos encerrarla en una etiqueta <strong>, que significa que dicha palabra se debe
enfatizar:

<p> Mi gato es <strong>muy</strong> gruñon </p>

Debes asegurarte que las etiquetas estén correctamente anidadas: en el ejemplo, creaste
la etiqueta de apertura del elemento <p> primero, luego la del elemento <strong>, por lo
tanto, debes cerrar esta etiqueta primero, y luego la de <p>.

Las etiquetas deben abrirse y cerrarse ordenadamente, de forma tal que se encuentren
claramente dentro o fuera el uno del otro. Si estos se encuentran solapados, el navegador
web tratará de adivinar lo que intentas decirle, pero puede que obtengas resultados
inesperados.

2
ANATOMIA DE UN DOCUMENTO HTML
Hasta ahora has visto lo básico de elementos HTML individuales, pero estos no son muy
útiles por sí solos. Ahora verás cómo los elementos individuales son combinados para
formar una página HTML entera.

Los documentos html van a ser archivos de texto con la extensión .html y tienen la
siguiente anatomía:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>Mi pagina de prueba</title>

</head>

<body>

<p> Cooperacion Humana </p>

</body>

</html>

Tienes:

• <!DOCTYPE html>: el tipo de documento. Es un preámbulo requerido. Anteriormente,


cuando HTML era joven (cerca de 1991/2), los tipos de documento actuaban como
vínculos a un conjunto de reglas que el código HTML de la página debía seguir para ser
considerado bueno, lo que podía significar la verificación automática de errores y
algunas otras cosas de utilidad. Sin embargo, hoy día es simplemente un artefacto
antiguo que a nadie le importa, pero que debe ser incluido para que todo funcione
correctamente. Por ahora, eso es todo lo que necesitas saber.

• <html></html>: la etiqueta <html>. Esta etiqueta encierra todo el contenido de la página


entera y, a veces, se le conoce como la etiqueta raíz (root element).

• <head></head>: la etiqueta <head>. Esta etiqueta actúa como un contenedor de todo


aquello que quieres incluir en la página HTML que no es contenido visible por los
visitantes de la página. Incluye cosas como palabras clave (keywords), una descripción
de la página que quieres que aparezca en resultados de búsquedas, código CSS para
dar estilo al contenido, declaraciones del juego de caracteres, etc.

• <meta charset="utf-8">: esta etiqueta establece el juego de caracteres que tu


documento usará en utf-8, que incluye casi todos los caracteres de todos los idiomas
humanos. Básicamente, puede manejar cualquier contenido de texto que puedas
incluir. No hay razón para no establecerlo, y puede evitar problemas en el futuro.

3
• <title></title>: la etiqueta <title> establece el título de tu página, que es el título que
aparece en la pestaña o en la barra de título del navegador cuando la página es
cargada, y se usa para describir la página cuando es añadida a los marcadores o como
favorita.

• <body></body>: la etiqueta <body>. Encierra todo el contenido que deseas mostrar a


los usuarios web que visiten tu página, ya sea texto, imágenes, videos, juegos, pistas de
audio reproducibles, y demás. Estos, delimitados a su vez por otras etiquetas como las
que hemos visto.

ELEMENTOS EN BLOQUE Y EN LÍNEA


El lenguaje HTML clasifica a todos los elementos en dos grupos: elementos en línea o inline
elements y elementos en bloque o block elements. La diferencia entre ambos viene dada
por el modelo de contenido, por el formato y la dirección.
Los elementos en bloque siempre empiezan en una nueva línea y ocupan todo el espacio
disponible hasta el final de la línea, mientras que los elementos en línea sólo ocupan el
espacio necesario para mostrar sus contenidos.

ATRIBUTOS ETIQUETAS
Las etiquetas son la estructura básica del HTML. Estas etiquetas se componen y contienen
otras propiedades, como son los atributos y el contenido.

HTML define un total de 91 etiquetas, de las cuales 10 se consideran obsoletas. Sin


embargo, una etiqueta por sí sola a veces no contiene la suficiente información para estar
completamente definida. Para ello contamos con los atributos: pares nombres-
valor separados por "=" y escritos en la etiqueta inicial de un elemento después del nombre
del elemento. El valor puede estar encerrado entre "comillas dobles" o 'simples'. Existen,
también, algunos atributos que afectan al elemento por su presencia en la etiqueta de
inicio.

Esta sería la estructura general de una línea de código en lenguaje HTML:

<etiqueta atributo1="valor1" atributo2="valor2">contenido</etiqueta>

<a href="http://www.enlace.com" target="_blank">Ejemplo de enlace</a>

Donde:

• <a> es la etiqueta inicial y </a> la etiqueta de cierre.

• href y target son los atributos.

• http://www.enlace.com y _blank son las variables.

• Ejemplo de enlace es el contenido.

Nota: las etiquetas <img> y <a> las veremos en mayor profundidad más adelante.

TIPOS DE ATRIBUTOS
Aunque cada una de las etiquetas HTML define sus propios atributos, encontramos algunos
comunes a muchas o casi todas las etiquetas, que se dividen en cuatro grupos según su
funcionalidad:

4
• Atributos básicos

• Atributos de internacionalización

• Atributos de eventos

• Atributos de foco

En esta guía solo vamos a ver los básicos. Ya que el resto de atributos son para el uso de
otro lenguaje.

ATRIBUTOS BASICOS
Los atributos básicos se utilizan en la mayoría de etiquetas HTML y XHTML, aunque
adquieren mayor sentido cuando se utilizan hojas de estilo en cascada (CSS):

Atributo Descripción

id="texto" Establece un indicador único a cada elemento

class="texto" Establece la clase CSS que se aplica a los estilos del elemento

style="texto" Aplica de forma directa los estilos CSS de un elemento

title="texto" Establece el título del elemento (Mejora la accesibilidad)

Nota: los atributos de id, class y style los veremos en mayor profundidad en la parte de
CSS.

SINTAXIS HTML
LAS MAYÚSCULAS O MINÚSCULAS SON INDIFERENTES AL
ESCRIBIR ETIQUETAS
En HTML las mayúsculas y minúsculas son indiferentes. Quiere decir que las etiquetas
pueden ser escritas con cualquier tipo de combinación de mayúsculas y minúsculas.
Resulta sin embargo aconsejable acostumbrarse a escribirlas en minúscula ya que otras
tecnologías que pueden convivir con nuestro HTML (XML por ejemplo) no son tan
permisivas y nunca viene mal hacernos a las buenas costumbres desde el principio, para
evitar fallos triviales en un futuro.

COMENTARIOS EN HTML
En un documento HTML, los comentarios se escriben entre los caracteres "<!--" y "-->". Por
ejemplo: <!--Esto es un comentario en HTML-->

5
SALTOS DE LÍNEA EN HTML
Otra de las cosas importantes de conocer sobre la sintaxis básica del HTML es que los
saltos de línea no importan a la hora de interpretar una página. Un salto de línea será
simplemente interpretado como un separador de palabras, un espacio en blanco. Es por
ello que para separar líneas necesitamos usar la etiqueta de párrafo, o la etiqueta BR que
significa un salto de línea simple.

Esto es una línea

<br>

Esto es otra línea

Esto en una pagina se vería así

La etiqueta BR no tiene su correspondiente cierre. Es un detalle que quizás te haya llamado


la atención.

FORMATO DE PARRAFOS HTML


Previamente en nuestra guía habíamos visto la etiqueta <strong> que nos permitía darle
formato a nuestro texto, más concreto ponerlo en negrita. Ahora veremos con más detalle
las más ampliamente utilizadas y ejemplificaremos algunas de ellas posteriormente.

Formatear un texto pasa por tareas tan evidentes como definir los párrafos, justificarlos,
introducir viñetas, numeraciones o bien poner en negrita, itálica, etc.

Hemos visto que para definir los párrafos nos servimos de la etiqueta P que introduce un
salto y deja una línea en blanco antes de continuar con el resto del documento.

Podemos también usar la etiqueta <br>, de la cual no existe su cierre correspondiente, para
realizar un simple salto de línea con lo que no dejamos una línea en blanco sino que solo
cambiamos de línea. Cabe destacar que la etiqueta <br>, no es la única etiqueta sin cierre.

Podéis comprobar que cambiar de línea en nuestro documento HTML sin introducir alguna
de estas u otras etiquetas no implica en absoluto un cambio de línea en la página
visualizada. En realidad el navegador introducirá el texto y no cambiara de línea a no ser
que esta llegue a su fin o bien lo especifiquemos con la etiqueta correspondiente.

ALINEAR TEXTO
Los párrafos delimitados por etiquetas P pueden ser fácilmente justificados a la izquierda,
centro o derecha especificando dicha justificación en el interior de la etiqueta por medio
de un atributo "align". Recordemos que los atributos no son más que un parámetro incluido
en el interior de la etiqueta que ayudan a definir el funcionamiento de la etiqueta de una
forma más personalizada.

6
Es importante tener muy en cuenta lo siguiente, que ya hemos comentado
anteriormente. El HTML se usa para definir el contenido. Por lo tanto, los atributos align que
vamos a conocer a continuación se estarían metiendo en una terreno que no le
corresponde al HTML, porque están definiendo la forma en la que un párrafo debe de
representarse, su estilo, y no el contenido. Es importante señalarlo para aprender que estas
cosas se deben hacer mediante el lenguaje CSS, que sirve para definir el estilo, la forma.
Usamos este ejemplo también para reforzar el uso de los atributos de una manera más
practica.

Así, si deseásemos introducir un texto alineado a la izquierda escribiríamos:

<p align="left">Texto alineado a la izquierda</p>

Para una justificación al centro:

<p align="center">Texto alineado al centro</p>

Para alinear a la derecha:

<p align="right">Texto alineado a la derecha</p>

Esto en una pagina se vería así:

Como veis, en cada caso el atributo align toma determinados valores que son escritos
entre comillas. En algunas ocasiones necesitamos especificar algunos atributos para el
correcto funcionamiento de la etiqueta. En otros casos, el propio navegador toma un valor
definido por defecto. Para el caso de align, el valor por defecto es left.

FORMATEO DE LETRA
Además de todo lo relativo a la organización de los párrafos, uno de los aspectos
primordiales del formateo de un texto es el de la propia letra. Resulta muy común y
práctico presentar texto resaltado en negrita, itálica y otros. Todo esto y mucho más es
posible por medio del HTML a partir de multitud de etiquetas entre las cuales vamos a
destacar algunas.

Pero antes de comenzar cabe hacer una reflexión sobre por qué son interesantes estas
etiquetas y se siguen usando, a pesar que están entrando prácticamente en el terreno de
CSS, ya que en la práctica están directamente formateando el aspecto de las fuentes. Son
importantes porque las etiquetas en si no están para definir un estilo en concreto, sino una
función de ciertas palabras dentro de un contenido.

NEGRITA
Podemos escribir texto en negrita incluyéndolo dentro de las etiquetas strong y su cierre.
Recordemos que ya la habíamos visto previamente.

<p><strong> Texto en negrita </strong> y texto normal</p>

7
Esto en una pagina se vería así:

ITÁLICA
En este caso existen dos posibilidades, una corta: i y su cierre (italic) y otra un poco más
larga: EM y su cierre. En esta guía vamos a usar, y en la mayoría de las páginas que veréis
por ahí, os encontraréis con la primera forma sin duda más sencilla a escribir y a acordarse.

<p><i> Texto en italica </i> y texto normal</p>

Esto en una pagina se vería así:

SUBRAYADO
El HTML nos propone también para el subrayado la etiqueta: U (underlined). Sin embargo, el
uso de subrayados ha de ser aplicado con mucha precaución dado que los enlaces
hipertexto van, a no ser que se indique lo contrario, subrayados con lo que podemos
confundir al lector y apartarlo del verdadero interés de nuestro texto.

Además, cabe decir que la etiqueta U se ha quedado obsoleta, debido a que es algo que
realmente se debe hacer del lado del CSS, al ser básicamente un estilo.

<p><u> Texto subrayado</u> y texto normal</p>

Esto en una pagina se vería así:

ENCABEZADOS
Existen otras etiquetas para definir párrafos especiales, que funcionaran como títulos de
nuestra pagina. Son los encabezados o headings en inglés. Como decimos, son etiquetas
que formatean el texto como un titulo, pero el hecho de que cambien el formato no es lo
que nos tiene que preocupar, sino el significado en sí de la etiqueta. Es cierto que los
navegadores asignan un tamaño mayor de letra y colocan el texto en negrita, pero lo
importante es que sirven para definir la estructura del contenido de un documento HTML.
Así los navegadores para ciegos podrán informar a los invidentes que esta es una división
nueva de contenido y que su titulo es este o aquel. También motores de búsqueda sabrán
interpretar mejor el contenido de una página en función de los títulos y subtítulos.

Hay varios tipos de encabezados, que se diferencian visualmente en el tamaño de la letra


que utilizan. La etiqueta en concreto es la H1, para los encabezados más grandes, H2 para
los de segundo nivel y así hasta H6 que es el encabezado más pequeño. Pero lo
importante, insistimos es la estructura que denotan. Una página tendrá generalmente un
encabezado de nivel 1 y dentro varios de nivel 2.

8
Luego, dentro de los H2 encontraremos si acaso H3, etc. Nunca debemos usar los
encabezados porque nos formateen el texto de una manera dada, sino porque nuestro
documento lo requiera según su estructura.

Los encabezados se verán de esta manera en la página:

Los encabezados implican también una separación en párrafos, así que todo lo que
escribamos dentro de H1 y su cierre (o cualquier otro encabezado) se colocará en un
párrafo independiente.

Podemos ver cómo se presentan algunos encabezados a continuación.

<h1> Encabezado de nivel 1 </h1>

Los encabezados, como otras etiquetas de HTML, soportan el atributo align. Veremos un
ejemplo de encabezado de nivel 2 alineado al centro, aunque repetimos que esto debería
hacerse en CSS.

<h2 align=”center”> Encabezado de nivel 2 </h2>

LISTAS EN HTML
Las posibilidades que nos ofrece el HTML en cuestión de tratamiento de texto son
realmente notables. No se limitan a lo visto hasta ahora, sino que van más lejos todavía.
Varios ejemplos de ello son las listas, que sirven para enumerar y definir elementos.

Las listas originalmente están pensadas para citar, numerar y definir cosas a través de
características, o al menos así lo hacemos en la escritura de textos. Sin embargo, las listas
finalmente se utilizan para mucho más que enumerar una serie de puntos, en realidad son
un recurso muy interesante para poder maquetar elementos diversos, como barras de
navegación, pestañas etc.

Por ahora, trataremos las listas desde el punto de vista de su construcción y veremos los
diferentes tipos que existen, y que podemos utilizar para resolver nuestras distintas
necesidades a la hora de escribir textos en HTML.

Podemos distinguir dos tipos de listas HTML:

• Listas desordenadas

• Listas ordenadas

9
LISTAS DESORDENADAS
Son delimitadas por las etiquetas UL y su cierre (unordered list). Cada uno de los elementos
de la lista es citado por medio de una etiqueta LI (La LI tiene su cierre, aunque si no lo
colocas el navegador al ver el siguiente LI interpretará que estás cerrando el anterior). La
cosa queda así:

<p>Países del mundo</p>

<ul>

<li>Argentina</li>

<li>Perú</li>

<li>Chile</li>

</ul>

Esto en una pagina se vería así:

Podemos definir el tipo de viñeta empleada para cada elemento. Para ello debemos
especificarlo por medio del atributo type incluido dentro de la etiqueta de apertura UL, si
queremos que el estilo sea válido para toda la lista, o dentro de la etiqueta LI si queremos
hacerlo específico de un solo elemento. La sintaxis es del siguiente tipo:

<ul type="tipo de viñeta">

Donde tipo de viñeta puede ser uno de los siguientes:

• circle
• disc
• square
Vamos a ver un ejemplo de lista con un cuadrado en lugar de un redondel, y en el último
elemento colocaremos un círculo. Para ello vamos a colocar el atributo type en la etiqueta
UL, con lo que afectará a todos los elementos de la lista.

<ul type="square">

<li>Elemento 1 </li>

<li>Elemento 2 </li>

<li>Elemento 3 </li>

<li type="circle">Elemento 4

</ul>

10
Esto en una pagina se vería así:

LISTAS ORDENADAS
Las listas ordenadas sirven también para presentar información, en diversos elementos o
items, con la particularidad que éstos estarán predecidos de un número o una letra para
enumerarlos, siempre por un orden.

Para realizar las listas ordenadas usaremos las etiquetas OL (ordered list) y su cierre. Cada
elemento sera igualmente indicado por la etiqueta LI, que ya vimos en las listas
desordenadas.

Pongamos un ejemplo:

<p>Reglas de comportamiento en el trabajo</p>

<ol>

<li>El jefe siempre tiene la razón </li>

<li>En caso de duda aplicar regla 1 </li>

</ol>

Esto en una pagina se vería así:

Del mismo modo que para las listas desordenadas, las listas ordenadas ofrecen la
posibilidad de modificar el estilo. En concreto nos es posible especificar el tipo de
numeración empleado eligiendo entre números (1, 2, 3...), letras (a, b, c...) y sus mayúsculas
(A, B, C,...) y números romanos en sus versiones mayúsculas (I, II, III,...) y minúsculas (i, ii, iii,...).

Para realizar dicha selección hemos de utilizar, como para el caso precedente, el atributo
type, el cual será situado dentro de la etiqueta OL. Los valores que puede tomar el atributo
en este caso son:

11
Puede que en algún caso deseemos comenzar nuestra enumeración por un número o letra
que no tiene por qué ser necesariamente el primero de todos. Para solventar esta situación,
podemos utilizar un segundo atributo, start, que tendrá como valor un número. Este
número, que por defecto es 1, corresponde al valor a partir del cual comenzamos a definir
nuestra lista. Para el caso de las letras o los números romanos, el navegador se encarga de
hacer la traducción del número a la letra correspondiente.

Un ejemplo de todo esto sería:

<p>Ordenamos por números</p>

<ol type="1">

<li>Elemento 1 </li>

<li> Elemento 2 </li>

</ol>

<p>Ordenamos por letras</p>

<ol type="a">

<li>Elemento a </li>

<li> Elemento b </li>

</ol>

<p>Ordenamos por números romanos empezando por el 10</p>

<ol type="i" start="10">

<li>Elemento x </li>

<li> Elemento xi </li>

</ol>

Esto en una pagina se vería así:

12
ANIDANDO LISTAS
Nada nos impide utilizar todas estas etiquetas de forma anidada como hemos visto en
otros casos. De esta forma, podemos conseguir listas mixtas como por ejemplo:

<p>Ciudades del mundo</p>


<ul>
<li>Argentina </li>
<ol>
<li>Buenos Aires </li>
<li>Bariloche </li>
</ol>
<li>Uruguay </li>
<ol>
<li>Montevideo </li>
<li>Punta del Este </li>
</ol>
</ul>
Esto en una pagina se vería así:

ENLACES EN HTML
Hasta aquí, hemos podido ver que una página web es un archivo HTML en el que podemos
incluir, entre otras cosas, textos formateados a nuestro gusto e imágenes (las veremos con
detalle enseguida). Del mismo modo, un sitio web podrá ser considerado como el conjunto
de archivos, principalmente páginas HTML e imágenes, que constituyen el contenido al que
el navegante tiene acceso.

Sin embargo, no podríamos hablar de navegante o de navegación si estos archivos HTML


no estuviesen debidamente conectados entre ellos y con el exterior de nuestro sitio por
medio de enlaces hipertexto. En efecto, el atractivo original del HTML radica en la posible
puesta en relación de los contenidos de los archivos introduciendo referencias bajo forma
de enlaces que permitan un acceso rápido a la información deseada. De poco serviría en la
red tener páginas aisladas a las que la gente no puede acceder y desde las que la gente no
puede saltar a otras.

Un enlace puede ser fácilmente detectado por el usuario en una página. Basta con deslizar
el puntero del ratón sobre las imágenes o el texto y ver como cambia de su forma original
transformándose por regla general en una mano con un dedo señalador.

13
Adicionalmente, estos enlaces suelen ir, en el caso de los textos, coloreados y subrayados
para que el usuario no tenga dificultad en reconocerlos.

SINTAXIS DE UN ENLACE
Para colocar un enlace, nos serviremos de las etiquetas a y su cierre. Dentro de la etiqueta
de apertura deberemos especificar asimismo el destino del enlace. Este destino será
introducido bajo forma de atributo, el cual lleva por nombre "href".

La sintaxis general de un enlace es por tanto de la forma:

<a href="destino">contenido</a>

Siendo el "contenido" un texto o una imagen. Es la parte de la página que se colocará


activa y donde deberemos pulsar para acceder al enlace. Por su parte, "destino" será una
página, un correo electrónico o un archivo.

Por ejemplo, un enlace a la home de EggEducación, se vería así:

<a href="https://eggeducacion.com/es-AR/">Home de EggEducación.com</a>

Esto en una pagina se vería así:

Ahora, si queremos que el contenido del enlace sea una imagen y no un texto, podremos
colocar la correspondiente etiqueta IMG dentro de la etiqueta a.

<a href="https://eggeducacion.com/es-AR/"><img src="logo.jpg"></a>

Nota: veremos la etiqueta de imágenes más adelante.

EL ASPECTO DE LOS ENLACES


Nosotros mediante el HTML, y las hojas de estilo CSS, podemos definir el aspecto que
tendrán los enlaces en una página. Sin embargo, ya de manera predeterminada el
navegador los destaca para que los podamos distinguir. Generalmente encontraremos a
los enlaces subrayados y coloreados en azul, aunque esta regla depende del navegador
del usuario y de sus estilos definidos como predeterminados.

TIPOS DE ENLACES
Para estudiar en profundidad los enlaces tenemos que clasificarlos por su tipo, porque
dependiendo ese tipo algunas cosas cambiarán a la hora de construirlos.

En función del destino los enlaces son clásicamente agrupados del siguiente modo:

• Enlaces locales: los que se dirigen a otras páginas del mismo sitio web.
• Enlaces remotos: los dirigidos hacia páginas de otros sitios web. Estos son los que
vimos en el ejemplo anterior.

14
ENLACES LOCALES
Como hemos dicho, un sitio web esta constituido de páginas interconexas, que se
relacionan mediante enlaces de hipertexto. Para cumplir con esto es que vamos a utilizar
los enlaces locales.

Los enlaces locales se tratan de un tipo de enlace mucho más común en el día a día del
desarrollo. De hecho, es el tipo de enlace que más se produce en lo general. Estos enlaces
locales nos permiten relacionar distintos documentos HTML que componen un sitio web.
Gracias a los enlaces locales podremos convertir varias páginas sueltas en un sitio web
completo, compuesto de varios documentos.

Para crear este tipo de enlaces, hemos de usar la misma etiqueta A que ya conocemos, de
la siguiente forma:

<a href="archivo.html">contenido</a>

RUTAS DE LOS ENLACES

Hacer un enlace en si no es para nada complejo. No requiere muchas explicaciones con lo


que ya hemos visto en la guía alcanza, sin embargo hay que abordar con detalle un tema
importante: las rutas de los enlaces. Como rutas nos referimos al destino del enlace, o sea,
lo que ponemos en el atributo "href" y es importante que nos paremos aquí porque nos
puede dar algunos problemas al desarrollar, sobre todo para las personas que puedan
tener menos experiencia en el trabajo con el ordenador.

Por regla general, para una mejor organización, los sitios suelen estar ordenados por
directorios. Estos directorios suelen contener diferentes secciones de la página, imágenes,
scripts, estilos, etc. Es por ello que en muchos casos no nos valdrá con especificar el
nombre del archivo, sino que tendremos que especificar además el directorio en el que
nuestro archivo.html esta alojado.

Para aquellos que no saben como mostrar un camino de un archivo, aquí van una serie de
indicaciones que los ayudaran a comprender la forma de expresarlos. No resulta difícil en
absoluto y con un poco de practica lo haréis prácticamente sin pensar.

1. Hay que situarse mentalmente en el directorio en el que se encuentra la página


donde vamos a crear el enlace.

2. Si la página destino está en el mismo directorio que el archivo desde donde vamos
a enlazar podemos colocar simplemente el nombre del archivo de destino, ya que
no hay necesidad de cambiar de directorio.

3. Si la página de destino está en una carpeta o subdirectorio interior al directorio


donde está el archivo de origen, hemos de marcar la ruta enumerando cada uno de
los directorios por los que pasamos hasta llegar al archivo de destino, separándolos
por el símbolo barra "/". Al final obviamente, escribimos el nombre del archivo
destino.

4. Si la página destino se encuentra en un directorio padre (superior al de la página del


enlace), hemos de escribir dos puntos y una barra "../" tantas veces como niveles
subamos en la arborescencia hasta dar con el directorio donde esta emplazado el
archivo destino.

15
5. Si la página se encuentra en otro directorio no incluido ni incluyente del archivo
origen, tendremos que subir como en la regla 3 por medio de ".." hasta encontrar un
directorio que englobe el directorio que contiene a la página destino. A
continuación haremos como en la regla 2. Escribiremos todos los directorios por los
que pasamos hasta llegar al archivo.

Imagina que tienes la siguiente estructura de carpetas y archivos. La que aparece en la


siguiente imagen.

1) Para hacer un enlace a index.html

<a href="index.html">Ir a index.html</a>

2) Para hacer un enlace desde index.html hacia pagina1.html:

<a href="seccion1/paginas/pagina1.html">Ir a pagina1.html</a>

3) Para hacer un enlace desde pagina2 hacia pagina1:

<a href="../seccion1/paginas/pagina1.html">Ir (también) a pagina1.html</a>

4) Para hacer un enlace desde pagina1 hacia pagina2:

<a href="../../seccion2/pagina2.html">Ir ahora a pagina2.html</a>

IMÁGENES EN HTML
Sin duda uno de los aspectos más vistosos y atractivos de las páginas web es el grafismo.
La introducción en nuestro texto de imágenes puede ayudarnos a explicar más fácilmente
nuestra información y darle un aire mucho más estético. El abuso no obstante, puede
conducirnos a una sobrecarga que se traduce en una distracción para el navegante, quien
tendrá más dificultad en encontrar la información necesaria.

El uso de imágenes también tiene que ser realizado con cuidado porque aumentan el
tiempo de carga de la página, lo que puede ser de un efecto nefasto si nuestro visitante no
tiene una buena conexión o si es un poco impaciente. Por ello es recomendable siempre
optimizar las imágenes para Internet, haciendo que su tamaño en bytes sea lo mínimo
posible, para facilitar la descarga, pero sin que ello comprometa mucho su calidad.

En esta guía no explicaremos como crear ni tratar las imágenes, únicamente diremos que
para ello se utilizan aplicaciones como Paint Shop Pro, Photoshop o Gimp. Tampoco
explicaremos las particularidades de cada tipo de archivo: GIF, JPG o PNG y la forma de
optimizar nuestras imágenes.

La etiqueta que utilizaremos para insertar una imagen es IMG (image). Esta etiqueta no
posee su cierre correspondiente y en ella hemos de especificar obligatoriamente el
paradero de nuestro archivo gráfico mediante el atributo src (source).

16
La sintaxis queda entonces de la siguiente forma:

<img src="camino_hacia_el_archivo.jpg">

Para expresar el camino, lo haremos de la misma forma que vimos para los enlaces. Las
reglas siguen siendo las mismas, lo único que cambia es que, en lugar de una página
siendo el destino, el destino es un archivo gráfico. En el código anterior estamos enlazando
un archivo con extensión .jpg, pero podrá ser otro tipo de archivo como .gif o .png.

Aparte de este atributo, indispensable obviamente para la visualización de la imagen, la


etiqueta IMG nos propone otra serie de atributos de mayor o menor utilidad, que listamos a
continuación:

ATRIBUTO ALT
Dentro de las comillas de este atributo colocaremos una brevísima descripción de la
imagen. Esta etiqueta no es indispensable pero presenta varias utilidades. La sintaxis te
quedaría de esta manera:

<img src="mi_archivo.png" alt="Descripción de esta maravillosa imagen">

Primeramente, sirve para el posicionamiento de la página en buscadores. De los atributos


alt el buscador puede extraer palabras clave y le ayuda a entender qué función o
contenido tiene la imagen, y por lo tanto la página.

Otra utilidad importante la encontramos en determinadas aplicaciones, usadas por


personas con discapacidad. Navegadores para ciegos, por ejemplo, no muestran las
imágenes y por tanto los alt ofrecen la posibilidad de leerlas. Nunca esta de más pensar en
crear páginas accesibles.

Por último, durante el proceso de carga de la página y cuando la imagen no ha sido todavía
cargada, el navegador podría mostrar esta descripción, con lo que el navegante se puede
hacer una idea de lo que va en ese lugar. Si hubo problemas de conexión y no se pudo
mostrar la imagen, también podría usarse ese alt para mostrar al menos su descripción.

En general podemos considerar como aconsejable el uso de este atributo, salvo para
imágenes de poca importancia. Si la imagen es usada como cuerpo de un enlace todavía
se hace más indispensable.

ATRIBUTOS HEIGHT Y WIDTH


Estos atributos definen la altura y anchura respectivamente de la imagen en píxeles.
Aunque estas dimensiones forman parte del estilo de la imagen, y por tanto podrían ir en el
CSS, todavía puede ser interesante definirlas dentro del HTML. Esto, ya no es tan
indispensable, puesto que muchos sitios creados con "Responsive Web Design" prefieren
que las imágenes se adapten al tamaño de la pantalla donde se va a visualizar.

Todos los archivos gráficos poseen unas dimensiones de ancho y alto. Estas dimensiones
pueden obtenerse a partir del propio diseñador grafico o bien haciendo clic con el botón
derecho sobre la imagen, vista desde el explorador de archivos de tu ordenador, para
luego elegir "propiedades" o "información de la imagen" sobre el menú que se despliega.

Un ejemplo de etiqueta IMG con sus valores de anchura y altura declarados te quedaría así:

17
<img src="mi-imagen.gif" width="200" height="300">

IMÁGENES QUE SON ENLACES Y EL ATRIBUTO BORDER


Si un texto puede servir de enlace, una imagen puede cumplir la misma función:

<a href="archivo.html"><img src="imagen.gif"></a>

El problema de hacer esto en ciertos navegadores es que se crea un borde en la imagen,


del mismo color que el color configurado para los enlaces, lo que suele ser un efecto poco
deseado.

Sin embargo, en HTML podemos indicar que una imagen tenga borde. Mediante el atributo
"border" se define el tamaño en píxeles del cuadro que rodea la imagen. De esta forma
podemos recuadrar nuestra imagen si lo deseamos. No es algo que se use mucho, pero
resulta particularmente útil cuando deseamos eliminar el borde que aparece cuando la
imagen sirve de enlace. En dicho caso tendremos que especificar border="0".

TABLAS EN HTML
Una tabla es un conjunto de celdas organizadas dentro de las cuales podemos alojar
distintos contenidos. HTML dispone de una gran variedad de etiquetas para crear tablas,
con sus atributos.

En un principio nos podría parecer que las tablas son raramente útiles y que pueden ser
utilizadas principalmente para listar datos como agendas, resultados y otros datos de una
forma organizada. En general, sirven para representar información tabulada, en filas y
columnas. Esto es una realidad en los últimos años, desde que las tablas se han
descartado para fines relacionados con la maquetación.

Como veremos a continuación, existen diversas etiquetas que se deben utilizar en una
forma determinada para la creación de tablas. Por ello, puede que en un principio nos
resulte un poco complicado trabajar con estas estructuras pero, con un poco de práctica
podremos crear tablas con absoluta soltura. Si deseamos mostrar datos de una manera
sencilla de leer, dispuestos en filas y columnas, tarde o temprano observaremos que las
tablas son la mejor solución y apreciaremos las posibilidades nos ofrecen.

ETIQUETAS BÁSICAS PARA TABLAS EN HTML


Para empezar, nada más sencillo que por el principio: las tablas son definidas por las
etiquetas TABLE y su cierre.

Dentro de estas dos etiquetas colocaremos todas las otras etiquetas de las tablas, hasta
llegar a las celdas. Dentro de las celdas ya es permitido colocar textos e imágenes que
darán el contenido a la tabla.

Las tablas son descritas por líneas de arriba a abajo (y luego por columnas de izquierda a
derecha). Cada una de estas líneas, llamada fila, es definida por otra etiqueta y su cierre: TR
(table row).

Asimismo, dentro de cada línea, habrá diferentes celdas. Cada una de estas celdas será
definida por otra etiqueta: TD (table data). Dentro de ésta y su cierre será donde
coloquemos nuestro contenido, el contenido de cada celda.

18
Aquí tenéis un ejemplo de estructura de tabla:

<table>
<tr>
<td>Celda 1, linea 1</td>
<td> Celda 2, linea 1</td>
</tr>
<tr>
<td> Celda 1, linea 2</td>
<td> Celda 2, linea 2</td>
</tr>
</table>
Esto en una pagina se vería así:

También existe la etiqueta TH (table header), que sirve para crear una celda cuyo contenido
esté formateado como un título o cabecera de la tabla. En la práctica, lo que hace es poner
en negrita y centrado el contenido de esa celda, lo que se puede conseguir aplicando las
correspondientes etiquetas dentro de la celda.

Aquí tenéis un ejemplo de estructura de tabla con la etiqueta th:

<table>
<tr>
<th>Titulo Celda 1</th>
<th> Titulo Celda 2</th>
</tr>
<tr>
<td>Celda 1, linea 1</td>
<td> Celda 2, linea 1</td>
</tr>
<tr>
<td> Celda 1, linea 2</td>
<td> Celda 2, linea 2</td>
</tr>
</table>

Esto en una pagina se vería así:

19
ATRIBUTOS PARA TABLAS, FILAS Y CELDAS
A partir de esta idea simple y sencilla, las tablas adquieren otra magnitud cuando les
incorporamos toda una cantidad de atributos aplicados sobre cada tipo de etiquetas que
las componen.

En cuanto a atributos para tabla hay unos cuantos. Muchos los conoces ya de otras
etiquetas, como width, height, align, etc. Hay otros que son especialmente creados para las
etiquetas TABLE.

• cellspacing: es el espacio entre celdas de la tabla.


• cellpadding: es el espacio entre el borde de la celda y su contenido.
• border: es el número de píxeles que tendrá el borde de la tabla.
• bordercolor: es el rbg que le vas a asignar al borde de la tabla.
En cuanto a las etiquetas "interiores" de una tabla, nos referimos a TR y TD, ten en cuenta:

• Podemos usar prácticamente cualquier tipo de etiqueta dentro de la etiqueta TD


para, de esta forma, escribir su contenido.
• Las etiquetas situadas en el interior de la celda no modifican el resto del
documento.
• Las etiquetas de fuera de la celda no son tenidas en cuenta por ésta.
Así pues, podemos especificar el formato de nuestras celdas a partir de etiquetas
introducidas en su interior o mediante atributos colocados dentro de la etiqueta de celda
TD o bien, en algunos casos, dentro de la etiqueta TR, si deseamos que el atributo sea
valido para toda la línea. La forma más útil y actual de dar forma a las celdas es a partir de
las hojas de estilo en cascada que ya tendréis la oportunidad de abordar más adelante.

Veamos a continuación algunos atributos útiles para la construcción de nuestras tablas.


Empecemos viendo atributos que nos permiten modificar una celda en concreto o toda
una línea:

• align: Justifica el texto de la celda del mismo modo que si fuese el de un párrafo.
• valign: Podemos elegir si queremos que el texto aparezca arriba (top), en el centro
(middle) o abajo (bottom) de la celda.
• bgcolor: Da color a la celda o línea elegida.
• bordercolor: Define el color del borde.

Otros atributos que pueden ser únicamente asignados a una celda y no al conjunto de
celdas de una línea son:

• background: Nos permite colocar un fondo para la celda a partir de un enlace o una
imagen.
• height: Define la altura de la celda en pixeles o porcentaje.

20
• width: Define la anchura de la celda en pixeles o porcentaje.
• colspan: Expande una celda horizontalmente.
• rowspan: Expande una celda verticalmente.

Estos últimos cuatro atributos descritos son de gran utilidad. Concretamente, height y
width nos ayudan a definir las dimensiones de nuestras celdas de una forma absoluta (en
pixeles o puntos de pantalla) o de una forma relativa, es decir por porcentajes referidos al
tamaño total de la tabla.

Los atributos rowspan y colspan son también utilizados frecuentemente. Gracias a ellos es
posible expandir celdas fusionando éstas con sus vecinas. El valor que pueden tomar estas
etiquetas es numérico. El número representa la cantidad de celdas fusionadas.

Así:

<td colspan="2">

Por otro lado:

<td rowspan="2">

El resto de los atributos presentados presentan una utilidad y uso bastante obvios. Los
dejamos a vuestra propia investigación.

FORMULARIOS HTML
Hasta ahora hemos visto la forma en la que el HTML gestiona y muestra la información,
esencialmente mediante texto, imágenes y enlaces. Nos queda por ver de qué forma
podemos intercambiar información con nuestro visitante. Desde luego, este nuevo aspecto
resulta primordial para gran cantidad de acciones que se pueden llevar a cabo mediante la
Web: comprar un articulo, rellenar una encuesta, enviar un comentario al autor, registrar un
usuario, etc.

Los formularios son esas famosas cajas de texto y botones que podemos encontrar en
muchas páginas web. Son muy utilizados para realizar búsquedas o bien para introducir
datos personales por ejemplo en sitios de comercio electrónico. Los datos que el usuario
introduce en estos campos son enviados al correo electrónico del administrador del
formulario o bien a un programa que se encarga de procesarlo automáticamente. Nosotros
en esta guía no vamos a mostrar como enviar la información al mail, ya que nos interesa,
más adelante poder manejar esa información.

21
QUÉ SE PUEDE HACER CON UN FORMULARIO
Usando HTML podemos únicamente enviar el contenido del formulario a un correo
electrónico, es decir, construir un formulario con diversos campos y, a la hora pulsar el
botón de enviar, generar un mensaje de que se ha registrado con éxito la información.

Pero para todo lo que sea manejar esa información y guardarla, por ejemplo, en una base
de datos vamos a tener que utilizar Java. Como lo haremos lo veremos más adelante en el
curso.

Así pues, en resumen, con HTML podremos construir los formularios, con diversos tipos de
campos, como cajas de texto, botones de radio, cajas de selección, menús desplegables,
etc. Sin embargo, debe quedar claro que desde HTML no se puede manejar esta
información para guardarla o enviarla a algún correo, etc. Eso será trabajo de Java.

CÓMO HACER UN FORMULARIO EN HTML


Los formularios son definidos por medio de las etiquetas FORM y su cierre. Entre estas dos
etiquetas colocaremos todos los campos y botones que componen el formulario. Dentro
de esta etiqueta FORM debemos especificar algunos atributos:

action: define el tipo de acción a llevar a cabo con el formulario. Como ya hemos dicho,
existen dos posibilidades:

• El formulario es enviado a una dirección de correo electrónico. Para esto hay que
poner el mail en el action.
• El formulario es enviado a un programa o script que procesa su contenido. Esta es
la posibilidad que más no interesa.

<form action="ruta del método que va a manejar la información"></form>

method: Este atributo se encarga de especificar la forma en la que el formulario es enviado.


Los dos valores posibles que puede tomar esta atributo son POST y GET. A efectos
prácticos y, salvo que se os diga lo contrario, daremos siempre el valor POST. Estos
conceptos de POST y GET, lo veremos más adelante en el curso.

enctype: Se utiliza para indicar la forma en la que viajará la información que se mande por
el formulario. En el caso más corriente, enviar el formulario por correo electrónico, el valor
de este atributo debe de ser "text/plain". Así conseguimos que se envíe el contenido del
formulario como texto plano dentro del email. Si fuéramos a enviar una imagen dentro del
formulario, este atributo debería ser “multipart/form-data”. También todos estos conceptos
vamos a verlos más adelante.

Este ultimo atributo puede que esté como que no esté, las otras dos si vamos a guardar la
información de nuestro formulario en Java, van a estar siempre.

EJEMPLO DE ETIQUETA FORM COMPLETA

Entonces con todo lo anterior ya explicado, la etiqueta completa nos quedaría así:

<form action="ruta del metodo que va a manejar la información" method="POST"


enctype="multipart/form-data"></form>

22
Entre esta etiqueta y su cierre colocaremos el resto de etiquetas que darán forma a nuestro
formulario.

CAMPOS DE TEXTO
El lenguaje HTML nos propone una gran diversidad de alternativas a la hora de crear
nuestros formularios, es decir, una gran variedad de elementos para diferentes propósitos.
Estas van desde la clásica caja de texto, hasta la lista de opciones en un menú
desplegable, pasando por las cajas de validación, etc.

Las etiquetas que tenemos que utilizar para crear campos de texto, pueden ser de dos
tipos. Veamos en qué consiste cada una de estas modalidades y como podemos
implementarlas en nuestro formulario.

ETIQUETA INPUT
Las cajas de texto son colocadas por medio de la etiqueta INPUT. Dentro de esta etiqueta
hemos de especificar el valor de dos atributos: type y name.

<input type="text" name="nombre">

Como todos sabrán un input se ve así:

De este modo expresamos nuestro deseo de crear una caja de texto cuyo contenido será
llamado "nombre" (por ejemplo, en el caso de la etiqueta anterior, pero podemos poner
distintos nombres a cada uno de los campos de texto que habrán en los formularios).

ATRIBUTO TYPE
Como hemos visto el atributo type nos sirve para especificar el tipo de dato que se va a
ingresar en nuestro input, en el ejemplo anterior lo habíamos puesto como tipo text, para
que sea una caja de texto y poder ingresar texto. Pero existen otros tipos de valores para el
atributo type

NUMBER

Este tipo permite al usuario ingresar números. Los navegadores vienen con validaciones
para evitar que el usuario ingrese algo que no sea números. Además, en los navegadores
modernos, los campos numéricos suelen venir con controles que permiten a los usuarios
cambiar su valor de forma gráfica.

<input type="number">

Se vería así:

23
DATE

Este le permite al usuario ingresar una fecha, ya sea mediante una caja de texto o una
interfaz grafica con selector de fecha.

<input type="date">

Se vería así:

EMAIL

Este tipo permite al usuario ingresar un mail. Los navegadores vienen con validaciones
para validar que se esté ingresando con el formato correcto de un mail. Este input se va a
ver como un input de texto común y corriente.

<input type="email">

TEXTO OCULTO

Hay determinados casos en los que podemos desear esconder el texto escrito en el
campo input, por medio de círculos negros, de manera que aporte una cierta
confidencialidad. Para esto vamos a usar el type password.

<input type="password">

Se vería así:

Más adelante veremos otros valores para el atributo type con otras utilidades

ATRIBUTO NAME
Si vemos de nuevo el ejemplo del principio:

<input type="text" name="nombre">

En este ejemplo creamos una caja de texto cuyo contenido será llamado "nombre”,
elegimos nombre, pero podemos ponerles el nombre que queramos.

24
El nombre del elemento del formulario es de gran importancia para poder identificarlo en
nuestro programa de procesamiento (Java).

Además de estos dos atributos, esenciales para el correcto funcionamiento de nuestra


etiqueta, existen otra serie de atributos que pueden resultarnos de utilidad pero que no son
imprescindibles:

size: define el tamaño de la caja de texto, en número de caracteres visibles. Si al escribir el


usuario llega al final de la caja, el texto que escriba a continuación también cabrá dentro
del campo pero irá desfilando, a medida que se escribe, haciendo desaparecer la parte de
texto que queda a la izquierda.

maxlength: indica el tamaño máximo del texto, en número de caracteres, que puede ser
escrito en el campo. En caso que el campo de texto tenga definido el atributo maxlength, el
navegador no permitirá escribir más caracteres en ese campo que los que hayamos
indicado.

value: en algunos casos puede resultarnos interesante asignar un valor definido al campo
en cuestión. Esto puede ayudar al usuario a rellenar más rápidamente el formulario o darle
alguna idea sobre la naturaleza de datos que se requieren. Este valor inicial del campo
puede ser expresado mediante el atributo value. Veamos su efecto con un ejemplo
sencillo:

<input type="text" name="instituto" value="Egg Educación">

Genera un campo de este estilo:

placeholder: este atributo especifica una pequeña pista que describe el valor esperado de
para el campo (input).

La pequeña sugerencia se muestra en el campo de entrada antes de que el usuario ingrese


un valor. Una vez que escriba, esa pista va a desaparecer.

<input type="text" name="nombre " placeholder="Nombre del usuario ">

Genera un campo de este estilo:

Nota: recordemos que todos estos ejemplos de input deben ir entre las etiquetas de
apertura y de cierre form.

<form>

<input type="text" name="instituto" value="Egg Educación">

</form>

25
ETIQUETA TEXTAREA PARA TEXTO LARGO
Si deseamos poner a la disposición de usuario un campo de texto donde pueda escribir
cómodamente sobre un espacio compuesto de varias líneas, hemos de invocar una nueva
etiqueta: TEXTAREA y su cierre correspondiente.

Este tipo de campos son prácticos cuando el contenido a enviar no es un nombre, teléfono,
edad o cualquier otro dato breve, sino más bien, un comentario, opinión, etc. en los que
existe la posibilidad que el usuario desee rellenar varias líneas.

Dentro de la etiqueta textarea deberemos indicar, como para el caso visto anteriormente, el
atributo name para asociar el contenido a un nombre que será asemejado a una variable
en un lenguaje de programación. Además, podemos definir las dimensiones del campo a
partir de los atributos siguientes:

• rows: define el número de líneas del campo de texto.


• cols: define el número de columnas del campo de texto.

La etiqueta queda por tanto de esta forma:

<textarea name="comentario" rows="10" cols="40"></textarea>

El resultado es el siguiente:

Asimismo, es posible predefinir el contenido del campo. Para ello, no usaremos el atributo
value, sino que escribiremos dentro de la etiqueta el contenido que deseamos atribuirle.
Veámoslo:

<textarea name="comentario" rows="10" cols="40">Escribe tu comentario…</textarea>

Esta etiqueta al igual que el input debe ir dentro de la etiqueta form.

ETIQUETA LABEL
El elemento LABEL y su etiqueta de cierre, provee una descripción corta para el campo de
texto y que puede ser asociada a un campo de texto. Podemos asociar una etiqueta label a
un campo de texto para que el usuario pueda acceder al campo de texto con solo clickear
el label. También, como veremos más adelante, cuando veamos las cajas de opciones,
clickear en el nombre de la opción para acceder a ella, “tickear” esa opción.

26
La etiqueta se ve de esta forma:

<label>Nombre del Usuario</label>

<input type="text" name="nombre">

Esto en una pagina se vería así:

Podríamos poner un salto de línea para que el label quede arriba del input, si lo
quisiéramos.

ATRIBUTO LABEL
La etiqueta label solo consta del atributo for. Mediante la utilización del atributo for
podemos asociar el label con el input. Para lograr esto vamos a tener que utilizar también
el atributo ID, este atributo lo explicamos previamente y lo vamos a ver más en detalle en la
parte de CSS.

La manera que anclamos un label a un input es, al label le vamos a dar un valor en su
atributo for, este va a representar el dato que se va a ingresar en el input y en el input
vamos a poner el mismo valor pero en el atributo ID. Entonces, el primer elemento input en
el documento con un ID que coincida con el dispuesto en el atributo for puesto en el
label, será el control etiquetado para este elemento.

Esto se vería así:

<label for="nombre">Nombre del Usuario</label>

<input type="text" id="nombre" name="nombre">

El label y el input se verán igual pero ahora cuando el usuario clickee el label se va a activar
el campo de texto del input para poder ingresar el valor que el usuario necesite. Después
vamos a ver un ejemplo más útil con las cajas de opciones.

OTROS ELEMENTOS DE FORMULARIOS


Seguramente hayan notado que los input son un manera muy practica de hacernos llegar
la información del navegante. No obstante, en muchos casos, permitir al usuario que
escriba cualquier texto permite demasiada libertad y puede que la información que éste
escriba no sea la que nosotros estamos necesitando.

Por ejemplo, pensemos que queremos que el usuario indique su país de residencia. En ese
caso podríamos ofrecer una lista de países para que seleccione el que sea. Este mismo
caso se puede aplicar a gran variedad de informaciones, como el tipo de tarjeta de crédito
para un pago, la puntuación que da a un recurso, si quiere recibir o no un boletín de
novedades, etc...

Este tipo de opciones predefinidas por nosotros pueden ser expresadas por medio de
diferentes campos de formulario. Veamos a continuación cuales son:

27
LISTAS DE OPCIONES
Las listas de opciones son ese tipo de menús desplegables que nos permiten elegir una (o
varias) de las múltiples opciones que nos proponen. Para construirlas emplearemos una
etiqueta SELECT, con su respectivo cierre.

Como para los casos ya vistos, dentro de esta etiqueta definiremos su nombre por medio
del atributo name. Cada opción será incluida en una línea precedida de la etiqueta
OPTION.

Podemos ver, a partir de estas explicaciones, la forma más típica y sencilla de esta
etiqueta:

<select name="estacion">

<option>Primavera</option>

<option>Verano</option>

<option>Otoño</option>

<option>Invierno</option>

</select>

Esto en una pagina se vería así:

Y cuando el usuario clickea en el select muestra las opciones así:

Esta estructura puede verse modificada principalmente a partir de otros dos atributos:

size: indica el número de valores mostrados a la vez en la lista. Lo típico es que no se


incluya ningún valor en el atributo size, en ese caso tendremos un campo de opciones
desplegable, pero si indicamos un valor para el atributo size aparecerá un campo donde
veremos las opciones definidas por size y el resto podrán ser vistos por medio de la barra
lateral de desplazamiento.

multiple: permite la selección de más elementos de la lista. Este atributo se expresa sin
valor alguno, es decir, no se utiliza con el igual, simplemente se pone para conseguir el
efecto, o no se pone si queremos una lista desplegable común.

<select name="estacion" size="3" multiple>

28
Esto en una pagina se vería así:

La etiqueta OPTION puede asimismo ser modificada por medio de otros atributos.

selected: del mismo modo que multiple, este atributo no toma ningún valor sino que
simplemente indica que la opción que lo presenta esta elegida por defecto.

<option selected>Otoño</option>

BOTONES DE RADIO
Existe otra alternativa para plantear una elección, en este caso, obligamos al usuario a
elegir únicamente una de las opciones que se le proponen.

La etiqueta empleada en este caso es INPUT en la cual usaremos el atributo type con el de
valor radio. Este atributo colocara una casilla pinchable al lado del valor del input. Veamos
un ejemplo:

<input type="radio" name="estacion" value="1">Primavera


<br>
<input type="radio" name="estacion" value="2">Verano
<br>
<input type="radio" name="estacion" value="3">Otoño
<br>
<input type="radio" name="estacion" value="4">Invierno
Esto en una pagina se vería así:

En este tipo de input para elegir una opción debemos tocar en la casilla clickeable, pero
habíamos explicado previamente en la etiqueta label, que podíamos hacer que la etiqueta
label al clickearla se active la caja de texto del input. Ahora, podemos usar eso para que
cuando el usuario clickee la palabra primavera se seleccione esa opción. Esto se vería así:

<input type="radio" id="primavera" name="estacion" value="1">


<label for="primavera">Primavera</label>
<br>
<input type="radio" id="verano" name="estacion" value="2">
<label for="verano">Verano</label>
<br>

29
<input type="radio" id="otonio" name="estacion" value="3">
<label for="otonio">Otoño</label>
<br>
<input type="radio" id="invierno" name="estacion" value="4">
<label for="invierno">Invierno</label>
Esto en la pagina se verá igual que el anterior:

La única diferencia va a ser que el usuario va a poder clickear el nombre de la estación que
quiere para seleccionar esa opción, además de poder clickear la casilla.

CAJAS DE VALIDACIÓN
Este tipo de elementos pueden ser activados o desactivados por el visitante por un simple
click sobre la caja en cuestión. Para esto vamos a usar la etiqueta INPUT con el valor
checkbox en el atributo type.

<input type="checkbox" name="estacion" value="1">Primavera

Esto se vera así:

ENVIO, BORRADO Y DEMÁS


Ha llegado el momento de explicar cómo podemos hacer un botón para provocar el envío
del formulario, entre otras cosas.

Como podremos imaginarnos, en formularios no solamente habrá elementos o campos


donde solicitar información del usuario, sino también habrá que implementar otra serie de
funciones. Concretamente, han de permitirnos su envío mediante un botón. También
puede resultar práctico poder proponer un botón de borrado o bien acompañar el
formulario de datos ocultos que puedan ayudarnos en su procesamiento.

BOTÓN DE ENVÍO DE FORMULARIO (BOTÓN DE SUBMIT)


Para dar por finalizado el proceso de relleno del formulario y hacerlo llegar a su gestor, el
usuario ha de enviarlo por medio de un botón previsto a tal efecto. Para esto vamos a
utilizar la etiqueta BUTTON y su respectivo cierre. Dentro el elemento button se puede
poner texto ( y etiquetas como <i>, <b>, <strong>, <br>, <img>, etc.). Se vería así:

<button type="submit">Enviar</button>

30
Esto en la pagina se verá así:

Como puede verse, tan solo hemos de especificar que se trata de un botón de envío
(type="submit") y hemos de definir el mensaje que queremos que aparezca escrito en el
botón.

BOTÓN DE BORRADO (BOTÓN DE RESET)


Este botón nos permitirá borrar el formulario por completo, en el caso de que el usuario
desee rehacerlo desde el principio. Su estructura sintáctica es parecida a la anterior:

<button type="reset">Borrar</button>

A diferencia del botón de envío, indispensable en cualquier formulario, el botón de borrado


resulta meramente optativo y no es utilizado frecuentemente. Hay que tener cuidado de no
ponerlo muy cerca del botón de envío y de distinguir claramente el uno del otro, para que
ningún usuario borre el contenido del formulario que acaba de rellenar por error.

BOTONES NORMALES
Dentro de los formularios también podemos colocar botones normales, pulsables como
cualquier otro botón. Estos botones por si solos no tienen mucha utilidad pero podremos
necesitarlos para realizar acciones en el futuro. Su sintaxis es la siguiente:

<button type="button">Borrar</button>

DATOS OCULTOS (CAMPOS HIDDEN)


En algunos casos, aparte de los propios datos rellenados por el usuario, puede resultar
práctico enviar datos definidos por nosotros mismos que ayuden al programa en su
procesamiento del formulario. Este tipo de datos, que no se muestran en la página pero si
pueden ser detectados solicitando el código fuente, no son frecuentemente utilizados por
páginas construidas en HTML, son más bien usados por páginas que emplean tecnologías
de servidor. No se asusten, veremos más adelante qué quiere decir esto. Tan solo
queremos dar constancia de su existencia y de su modo creación. He aquí un ejemplo:

<input type="hidden" name="instituto" value="Egg Educación">

Esta etiqueta, incluida dentro de nuestro formulario, enviara un dato adicional al programa
encargado de la gestión del formulario.

EJEMPLO COMPLETO DE FORMULARIO


Con esto ultimo finalizamos el tema de formularios. Pasemos ahora a ejemplificar todo lo
aprendido a partir de la creación de un formulario.

<form action="ruta del metodo que va a manejar la información" method="POST"


enctype="multipart/form-data"></form>

<label>Nombre del usuario</label> <br>


<input type="text" name="nombre"> <br>

31
<label>Edad del usuario</label> <br>
<input type="number" name="edad "> <br>
<label>Fecha de nacimiento del usuario</label> <br>
<input type="date” name="fechanac"> <br>
<label>Sexo del usuario</label> <br>
<input type="radio" name="sexo" value="Hombre"> Hombre <br>
<input type="radio" name="sexo" value="Mujer"> Mujer <br>
<label>Pais nacimiento del usuario</label> <br>
<select name="pais">
<option>Argentina</option>
<option>Brasil</option>
<option>Chile</option>
<option>Uruguay</option>
</select>
<br>
<button type="submit">Enviar</button>

<button type="reset">Borrar</button>

Este formulario se verá así:

SECCIONES EN HTML
Las paginas web se trabajan con lo que se conoce como un esquema. El esquema (outline)
de una página web es un índice de los apartados de una página web que muestra la
relación de jerarquía entre los diferentes apartados y subapartados. El concepto de
esquema se formalizó en HTML 5 con más precisión que en HTML 4 / XHTML 1 y explica
algunas características y formas de utilización de las etiquetas de secciones y bloques de
contenido.

32
En relación a esto se pensó que las páginas de HTML se pueden dividir en secciones y en
HTML 5 se introdujo una serié de etiquetas que nos van a ayudar con la división de nuestra
pagina en secciones. Dentro de cada sección van a haber más etiquetas, esto es
simplemente para que podemos tener un índice de los apartados de la pagina web.

La pagina dividida en secciones con sus respectivas etiquetas se ve así:

<section>: se utiliza para representar una sección "general" dentro de un documento o


aplicación, como un capítulo de un libro. Puede contener subsecciones y si lo
acompañamos de h1-h6 podemos estructurar mejor toda la página creando jerarquías del
contenido, algo muy favorable para el buen posicionamiento web.

<article>: representa un componente de una página que consiste en una composición


autónoma en un documento, página, aplicación, o sitio web con la intención de que pueda
ser reutilizado y repetido.

33
<aside>: representa una sección de la página que abarca un contenido relacionado con el
contenido que lo rodea, por lo que se le puede considerar un contenido independiente.
Este elemento puede utilizarse para efectos tipográficos, barras laterales, elementos
publicitarios u otro contenido que se considere separado del contenido principal de la
página.

<header>: representa un grupo de artículos introductorios o de navegación. Está destinado


a contener por lo general la cabecera de la sección (un elemento h1-h6 o un elemento
hgroup).

<nav>: representa una sección de una página que enlaza a otras páginas o a otras partes
dentro de la página. No todos los grupos de enlaces en una página necesita estar en un
elemento nav, sólo las secciones que constan de bloques de navegación principales son
apropiadas para el elemento de navegación.

<footer>: representa el pie de una sección, con información acerca de la página/sección


que poco tiene que ver con el contenido de la página, como el autor, el copyright o el año.

<hgroup>: representa el encabezado de una sección. El elemento se utiliza para agrupar un


conjunto de elementos h1-h6 cuando el título tiene varios niveles, tales como subtítulos o
títulos alternativos.

ETIQUETAS EXTRAS
En este apartado que va a ser el ultimo de nuestra parte de html vamos a ver unas
etiquetas que no hemos visto todavía y que son importantes.

ETIQUETA DIV
La etiqueta div se conoce como etiqueta de división. La etiqueta div se usa en HTML para
hacer divisiones de contenido en la página web como (texto, imágenes, encabezado, pie
de página, barra de navegación, etc.). La etiqueta Div tiene etiquetas de apertura (<div>) y
de cierre (</div>) y es obligatorio cerrar la etiqueta. Div es la etiqueta más útil en el
desarrollo web porque nos ayuda a separar datos en la página web y podemos crear una
sección particular para datos o funciones particulares en las páginas web. Cabe aclarar
que la etiqueta div genera un salto de linea.

• La etiqueta Div es una etiqueta de nivel de bloque


• Es una etiqueta de contenedor genérica
• Se utiliza para agrupar varias etiquetas de HTML para que se puedan crear
secciones y aplicarles estilo.
Un ejemplo que podríamos usar para la etiqueta div es, supongamos que tenemos 3
párrafos que queremos alinear a la izquierda, esto recordemos lo haríamos con el atributo
align. Nosotros haríamos algo así:

<p align="left">Parrafo 1</p>


<p align="left">Parrafo 2</p>
<p align="left">Parrafo 3</p>

34
Una forma de simplificar nuestro código anterior y de evitar introducir continuamente el
atributo align sobre cada una de nuestras etiquetas es utilizando la etiqueta DIV. Vamos a
usar un div para generar una sección de todos los párrafos y le pones el atributo align al
div.

Esto se vería asÏ:

<div align="left">
<p>Parrafo 1</p>
<p>Parrafo 2</p>
<p>Parrafo 3</p>
</div>

Como hemos visto, la etiqueta DIV marca divisiones en las que definimos un bloque de
contenido, y a los que podríamos aplicar estilo de manera global, aunque lo correcto sería
aplicar ese estilo del lado del CSS.

ETIQUETA SPAN
El elemento span HTML es un contenedor en línea genérico para elementos y contenido en
línea. Solía agrupar elementos con fines de estilo (mediante el uso de los atributos de clase
o id). La mejor manera de usarlo es cuando no hay ningún otro elemento semántico
disponible. span es muy similar a la etiqueta div, pero div es una etiqueta a nivel de bloque
y span es una etiqueta en línea. La etiqueta Span es una etiqueta emparejada, lo que
significa que tiene una etiqueta de apertura (<) y de cierre (>), y es obligatorio cerrar la
etiqueta.

• La etiqueta span se utiliza para agrupar elementos en línea.


• La etiqueta span no realiza ningún cambio visual por sí misma.
• span es muy similar a la etiqueta div, pero div es una etiqueta a nivel de bloque y
span es una etiqueta en línea.
Un ejemplo de la etiqueta span, es poner una parte de un párrafo de un color concreto, ya
que es una etiqueta en linea, la podemos meter dentro de una etiqueta p.
<p>My mother has <span style="color: blue">blue</span> eyes.</p>

Esto en una pagina se vería así:

La etiqueta span no crea un salto de línea similar a una etiqueta div, sino que permite al
usuario separar cosas de otros elementos a su alrededor en una página dentro de la misma
línea. Al evitar el salto de línea, solo da como resultado el texto seleccionado para cambiar,
manteniendo todos los demás elementos a su alrededor iguales.

Nota: en el apartado de CSS vamos a ver mejor el atributo style y el atributo color. Ahora los
estamos usando para el ejemplo.

35
CSS
INTRODUCCIÓN
CSS es el acrónimo de Cascading Style Sheets, o lo que sería en español Hojas de Estilo
en Cascada. Es un lenguaje que sirve para especificar el estilo o aspecto de las páginas
web. CSS se define en base a un estándar publicado por una organización llamada W3C,
que también se encarga de estandarizar el propio lenguaje HTML.

POR QUÉ EXISTE CSS


El lenguaje HTML está limitado a la hora de aplicar forma a un documento. Sirve de manera
excelente para especificar el contenido que debe tener una página web, pero no permite
definir cómo ese documento se debe presentar al usuario.

Otro motivo que ha hecho necesaria la creación de CSS ha sido la separación del
contenido de la presentación. Al inicio las páginas web tenían mezclado en su código
HTML el contenido con las etiquetas necesarias para darle forma. Esto tiene sus
inconvenientes, ya que la lectura del código HTML se hace pesada y difícil a la hora de
buscar errores o depurar las páginas. Además, desde el punto de vista de la riqueza de la
información y la utilidad de las páginas a la hora de almacenar su contenido, es un gran
problema que los textos están mezclados con etiquetas incrustadas para dar forma a
éstos, pues se degrada su utilidad.

CSS SOLVENTA ESTOS PROBLEMAS


Como hemos visto, para facilitar un correcto mantenimiento de las páginas web y para
permitir que los diseñadores pudieran trabajar como sería deseable, había que introducir
un nuevo elemento en los estándares y éste fue el lenguaje CSS.

CSS se ideó para aplicar el formato en las páginas, de una manera mucho más detallada,
con nuevas posibilidades que no estaban al alcance de HTML. Al mismo tiempo, gracias a
la posibilidad de aplicar el estilo de manera externa al propio documento HTML, se
consiguió que el mantenimiento de las páginas fuese mucho más sencillo.

CARACTERÍSTICAS Y VENTAJAS DE CSS


El modo de funcionamiento de CSS consiste en definir, mediante una sintaxis especial, la
forma de presentación que le aplicaremos a los elementos de la página.

Podemos aplicar CSS a muchos niveles, desde un sitio web entero hasta una pequeña
etiqueta. Estos son los principales bloques de acción.

• Una web entera: de modo que se puede definir en un único lugar el estilo de toda
una web, de una sola vez.
• Un documento HTML o página en particular: se puede definir la forma de cada uno
de los bloques de contenido de una página, en una declaración que afectará a un
solo documento de un sitio web.
• Una porción del documento: aplicando estilos visibles en un trozo de la página,
como podría ser la cabecera.

36
• Una etiqueta en concreto: llegando incluso a poder definir varios estilos diferentes
para una sola etiqueta. Esto es muy importante ya que ofrece potencia en nuestra
programación. Podemos definir, por ejemplo, varios tipos de párrafos: en rojo, en
azul, con márgenes, sin ellos...

La potencia de la tecnología salta a la vista. Pero no solo se queda ahí, ya que además esta
sintaxis CSS permite aplicar al documento formato de modo mucho más exacto. Si antes el
HTML se nos quedaba corto para maquetar las páginas y teníamos que utilizar trucos para
conseguir nuestros efectos, ahora tenemos muchas más herramientas que nos permiten
definir esta forma:

• Podemos definir la distancia entre líneas del documento.


• Se puede aplicar identado (sangrado) a las primeras líneas del párrafo.
• Podemos colocar elementos en la página con mayor precisión, y sin lugar a errores.
• Y mucho más, como definir la visibilidad de los elementos, márgenes, subrayados,
tachados, etc.

Otra ventaja importante de CSS es la capacidad de especificar las medidas con diversas
unidades. Si con HTML tan sólo podíamos definir atributos en las páginas con pixeles y
porcentajes, ahora podemos definir utilizando muchas más unidades como:

• Pixeles (px) y porcentaje (%), como antes.


• Pulgadas (in).
• Puntos (pt).
• Centímetros (cm).
• Y otras que veremos más adelante

SINTAXIS HTML
La meta básica del lenguaje Cascading Stylesheet (CSS) es permitir al motor del
navegador pintar elementos de la página con características específicas, como colores,
posición o decoración. La sintaxis CSS refleja estas metas y estos son los bloques básicos
de construcción.

• La propiedad que es un identificador, un nombre leíble por humanos, que define qué
característica es considerada.

• El valor que describe como las características deben ser manejadas por el motor.
Cada propiedad tiene un conjunto de valores válidos, definido por una gramática
formal, así como un significado semántico, implementados por el motor del
navegador.

DECLARACIONES DE CSS
Configurando propiedades CSS a valores específicos es la función principal del lenguaje
del CSS. Una propiedad y su valor son llamados una declaración, y cualquier motor de CSS
calcula qué declaraciones aplican a cada uno de los elementos de una página para
mostrarlos apropiadamente y estilizarlos.

37
Ambos propiedades y valores son sensibles a mayúsculas y minúsculas en CSS. El par se
separa por dos puntos, “ : ”, y los espacios en blanco antes, entre ellos y después, pero no
necesariamente dentro de ellos, son ignorados.

Declaración CSS:

background-color : red

Propiedad Los dos puntos Valor


separan las dos
entidades.

Hay más de 100 propiedades diferentes en CSS y cerca de un número infinito de diferentes
valores. No todos los pares de propiedades y valores son permitidos, cada propiedad
define que valores son válidos. Cuando un valor no es válido para una propiedad
específica, la declaración es considerada inválida y es completamente ignorada por el
motor del CSS.

BLOQUES DE DECLARACIONES EN CSS


Las declaraciones son agrupada en bloques, que es una estructura delimitada por una llave
de apertura, ‘{‘, y una de cierre, ‘}’. Los bloques en ocasiones puedes anidarse, por lo que las
llaves de apertura y cierre deben de coincidir.

Bloque css:

{
Aquí puede ir cualquier
contenido, incluso
ningún contenido.
}

Las llaves delimitan el inicio y el final del bloque.

Esos bloques son naturalmente llamados bloques de declaraciones y las declaraciones


dentro de ellos están separadas por un punto y coma, “ ; ”. Un bloque de declaración puede
estar vacío, que es contener una declaración nula. Los espacios en blanco alrededor de las
declaraciones son ignorados. En cuanto a la última declaración de un bloque, esta no
necesita terminar en un punto y coma, aunque es usualmente considerado una buena
práctica porque previene el olvidar agregarlo cuando se extienda el bloque con otra
declaración.

Bloque css con declaraciones:

{
background-color : red ;
background-style: none;
}

38
CSS define una serie de términos que permiten describir cada una de las partes que
componen los estilos CSS. El siguiente esquema muestra las partes que forman un estilo
CSS muy básico:

Los diferentes términos se definen a continuación:

Regla: cada uno de los estilos que componen una hoja de estilos CSS.

Selector: indica el elemento o elementos HTML a los que se aplica la regla CSS.

Declaración: especifica los estilos que se aplican a los elementos. Está compuesta por una
o más propiedades CSS.

Propiedad: permite modificar el aspecto de una característica del elemento.

Valor: indica el nuevo valor de la característica modificada en el elemento.

INCLUIR CSS A NUESTRO HTML


CSS sirve para definir el aspecto de las páginas web, eso ya debe haber quedado claro. No
obstante, hay diferentes niveles a los que podemos aplicar los estilos. Vamos a ir por orden,
describiendo los puntos desde el más específico al más general, de manera que también
iremos aumentando la dificultad e importancia de los distintos usos.

PEQUEÑAS PARTES DE LA PÁGINA


Para definir estilos en secciones reducidas de una página se puede utilizar el
atributo style en la etiqueta sobre la que queremos aplicar estilos. Como valor de ese
atributo indicamos en sintaxis CSS las características de estilos. Lo vemos con un ejemplo,
pondremos un párrafo en el que determinadas palabras las vamos a visualizar en color
verde.

<p>My mother has <span style="color: green">blue</span> eyes.</p>

ESTILO DEFINIDO PARA UNA ETIQUETA


De este modo podemos hacer que toda una etiqueta muestre un estilo determinado. Por
ejemplo, podemos definir un párrafo entero en color rojo y otro en color azul. Para ello
utilizamos el atributo style, que es admitido por todas las etiquetas del HTML.

<p style="color: #990000">


Esto es un párrafo de color rojo.
</p>

39
<p style="color: #000099">
Esto es un párrafo de color azul.
</p>

ESTILO DEFINIDO EN UNA PARTE DE LA PÁGINA


Con la etiqueta <div> podemos definir secciones de una página y aplicarle estilos con el
atributo style, es decir, podemos definir estilos de una vez a todo un bloque de la página.

<div style="color: #000099; font-weight: bold">


<h3>Estas etiquetas van en <strong>azul y negrita</strong></h3>
<p>
Seguimos dentro del DIV, luego permanecen los etilos
</p>
</div>
Hasta aquí hemos visto los usos de las CSS más específicos, que se consiguen usando el
atributo style en las etiquetas. Sin embargo, hay otras formas más avanzadas de usar las
CSS, que deberías tener en cuenta porque son todavía más versátiles y recomendadas.

ESTILO DEFINIDO PARA TODA UNA PÁGINA


Podemos definir, en la cabecera del documento, estilos para que sean aplicados a toda la
página. Es una manera muy cómoda de darle forma al documento y muy potente, ya que
estos estilos serán seguidos en toda la página y nos ahorraremos así "ensuciar" las
etiquetas HTML colocando el atributo style.

Además, es común que los estilos declarados se quieran aplicar a distintas etiquetas
dentro del mismo documento. Gracias a la aplicación de estilos para toda la página,
podemos escribir los estilos una vez y usarlos para un número indefinido de etiquetas. Por
ejemplo podremos definir el estilo a todos los párrafos una vez y que se aplique
igualmente, sea cual sea el número de párrafos del documento. Por último, también
tendremos la ventaja que, si más adelante deseamos cambiar los estilos de todas las
etiquetas, lo haremos de una sola vez, ya que el estilo fue definido una única vez de
manera global.

A grandes rasgos, entre <style> y </style>, se coloca el nombre de la etiqueta (o selector)


para la que queremos definir los estilos y entre llaves -{ }- colocamos en sintaxis CSS las
características de estilos. El concepto de selectores lo veremos más adelante.

<html>
<head>
<title>Ejemplo de estilos para toda una pagina</title>
<style>
h1 { text-decoration: underline; text-align: center }
p { font-Family: arial,verdana; color: white; background-color: black }
body { color: black; background-color: #cccccc; text-indent: 1cm }
</style>

40
</head>
<body>
<h1>Pagina con estilos</h1>
<p>Pagina con estilos de ejemplo</p>
</body>
</html>

Como se puede apreciar en el código, hemos definido que la etiqueta <h1> se presentará

• Subrayado
• Centrada
También, por ejemplo, hemos definido que el cuerpo entero de la página (etiqueta <body>)
se le apliquen los estilos siguientes:

• Color del texto negro


• Color del fondo grisáceo
• Margen lateral de 1 centímetro

Cabe destacar que muchos de los estilos aplicados a la etiqueta <body> son heredados
por el resto de las etiquetas del documento, como el color del texto o su tamaño. Esto es
así, siempre y cuando no se vuelvan a definir esos estilos en las etiquetas hijas, en cuyo
caso el estilo de la etiqueta más concreta será el que mande. Puede verse este detalle en
la etiqueta <p>, que tiene definidos estilos que ya fueron definidos para <body>. Los estilos
que se tienen en cuenta son los de la etiqueta <p>, que es más concreta.

ESTILO DEFINIDO PARA TODO UN SITIO WEB


Una de las características más potentes del desarrollo con hojas de estilos es la posibilidad
de definir los estilos de todo un sitio web en una única declaración.

Esto se consigue creando un archivo de extensión .css donde tan sólo colocamos las
declaraciones de estilos de la página y enlazando todas las páginas del sitio con ese
archivo. De este modo, todas las páginas comparten una misma declaración de estilos,
reutilizando el código CSS de una manera mucho más potente.

Este es el modelo más ventajoso de aplicar estilos al documento HTML y por lo tanto el
más recomendable. De hecho, cualquier otro modo de definir estilos no es considerado
una buena práctica y lo tenemos que evitar siempre que se pueda.

Algunas de las ventajas de este modelo de definición de estilos son las siguientes:

• Se ahorra en líneas de código HTML, ya que no tenemos que escribir el CSS en la


propia página (lo que reduce el peso del documento y mejora la velocidad de
descarga).
• Se mantiene separado correctamente lo que es el contenido (HTML) de la
presentación (CSS), que es uno de los objetivos de las hojas de estilo y una de las
máximas de todo desarrollador: cada cosa en su sitio.

41
• Se evita la molestia de definir una y otra vez los estilos con el HTML y lo que es más
importante, si cambiamos la declaración de estilos, cambiarán automáticamente
todas las páginas del sitio web. Esto es una característica muy deseable, porque
aumenta considerablemente la facilidad de mantenimiento del sitio web.

Veamos ahora cómo el proceso para incluir estilos con un fichero externo.

1- Creamos el fichero con la declaración de estilos

Es un fichero de texto normal con la extensión .css para aclararnos qué tipo de archivo es.
El texto que debemos incluir debe ser escrito exclusivamente en sintaxis CSS, es decir,
sería erróneo incluir código HTML en él: etiquetas y demás. Podemos ver un ejemplo a
continuación.

El nombre de este archivo va a ser estilos.css.

p{
font-size: 12cm;
font-family: arial, helvetica;
font-weight: normal;
}
h1 {
font-size: 36cm;
font-family: verdana, arial;
text-decoration: underline;
text-align: center;
background-color: Teal;
}
body {
background-color: #006600;
font-family: arial;
color: White;
}

2- Enlazamos la página web con la hoja de estilos

Para ello, vamos a colocar la etiqueta <link> dentro de la etiqueta <head></head> con los
atributos siguientes:

• rel: indica el tipo de relación que tiene el recurso enlazado y la página HTML. Para
los archivos CSS, siempre se utiliza el valor stylesheet.
• href: indica la URL del archivo CSS que contiene los estilos. La URL indicada puede
ser relativa o absoluta y puede apuntar a un recurso interno o externo al sitio web.

Veamos una página web entera que enlaza con la declaración de estilos anterior:

42
<html>
<head>
<link rel="stylesheet" href="estilos.css">
<title>Ejemplo de pagina que lee estilos </title>
</head>
<body>
<h1>Pagina con estilos</h1>
<p>Pagina con estilos de ejemplo</p>
</body>
</html>

SELECTORES CCS
Teniendo en cuenta que ya podemos asignarle estilos a todo un sitio web, mediante un
archivo css que usa selectores para elegir las etiquetas a las que asignarles los estilos,
también tenemos que entender que existen varios tipos de selectores

Selector Universal

Se utiliza para seleccionar todos los elementos de la página. El siguiente ejemplo elimina el
margen y el relleno de todos los elementos HTML (por ahora no es importante fijarse en la
parte de la declaración de la regla CSS):

Selector de Etiqueta

Selecciona todos los elementos de la página cuya etiqueta HTML coincide con el valor del
selector. El siguiente ejemplo selecciona todos los párrafos de la página:

Selector Descendente

Selecciona los elementos que se encuentran dentro de otros elementos. Un elemento es


descendiente de otro cuando se encuentra entre las etiquetas de apertura y de cierre del
otro elemento.

El selector del siguiente ejemplo selecciona todos los elementos <span> de la página que
se encuentren dentro de un elemento <p>.

43
Selector de Clase

¿Como hago para aplicarle estilos solo al primer párrafo?

Una de las soluciones más sencillas para aplicar estilos a un solo elemento de la página
consiste en utilizar el atributo class de HTML sobre ese elemento para indicar directamente
la regla CSS que se le debe aplicar. Ejemplo:

HTML:

<body>
<p class="destacado">Parrafo 1</p>
<p class="error">Parrafo 2</p>
<p>Parrafo 3</p>
</body>

CSS:
.destacado {
font-size: 15px;
}
.error {
color: red;
}
En nuestro archivo CSS para especificar una clase, vamos a poner punto(‘.’) y el nombre de
la clase que queremos que coincida que con valor que pongamos en nuestro atributo class
en el html.

Entonces, en el ejemplo podemos ver como el primer párrafo tiene el valor destacado y el
segundo párrafo el valor error para el atributo class y en nuestro archivo CSS, hemos
definido un estilo para esas clases.

El beneficio del atributo class, además de dejarnos asignar estilos a un solo elemento, es
que después podemos reutilizar esa class para asignarle ese estilo a otros párrafos
concretos o a otras etiquetas, solo deberemos ponerle el valor de un estilo que ya existe en
el atributo class.

Selector de Id

En un documento HTML, los selectores de ID de CSS buscan un elemento basado en el


contenido del atributo id. El atributo ID del elemento seleccionado debe coincidir
exactamente con el valor dado en el selector. Este tipo de selectores sólo seleccionan un
elemento de la página porque el valor del atributo id no se puede repetir en dos elementos
diferentes de una misma página.

Ejemplo:

44
HTML:

<div id="identificador">¡Este div tiene un ID especial!</div>


<div>Este solo es un div regular.</div>
CSS:

#identificador{

background-color: blue;

En nuestro archivo CSS para especificar un ID, vamos a poner el numeral (‘#’) y el nombre
del ID que queremos que coincida que con valor que pongamos en nuestro atributo ID en
el html.

Como podemos ver el ID, es muy parecido al atributo class pero la diferencia es que el ID
se puede usar para identificar un solo elemento, mientras que una clase se puede usar
para agrupar más de uno.

PRIORIDAD EN APLICACIÓN DE ESTILO


Ahora que entendemos los selectores en CSS, tenemos que entender como prioriza los
estilos CSS.

Herencia

Los hijos heredan los estilos de sus elementos padres, no es necesario declarar sus estilos
si estos se mantienen igual.

Cascada

Todo estilo sobrescribe a uno anterior.

Especificidad

Cuando hay conflictos de estilos el navegador aplica sólo el de mayor especificidad.

45
UNIDADES DE MEDIDA CSS
Los valores que se pueden asignar a los atributos de estilo se pueden ver en una tabla más
adelante en la guía. Muchos de los valores que podemos asignarle son unidades de
medida, por ejemplo, el valor del tamaño de un margen o el tamaño de la fuente. Las
unidades de medida CSS se pueden clasificar en dos grupos, las relativas y las absolutas.
Más la posibilidad de expresar valores en porcentaje.

Absolutas: las unidades absolutas son medidas fijas, que deberían verse igual en todos los
dispositivos. Como los centímetros, que son una convención de medida internacional. Pese
a que en principio pueden parecer más útiles, puesto que se verían en todos los sistemas
igual, tienen el problema de adaptarse menos a las distintas particularidades de los
dispositivos que pueden acceder a una web y restan accesibilidad a nuestro web. Puede
que en tu ordenador 1 centímetro sea una medida razonable, pero en un móvil puede ser
un espacio exageradamente grande, puesto que la pantalla es mucho menor. Se aconseja
utilizar, por tanto, medidas relativas.

• pt (puntos): Un punto es 1/72 pulgadas.


• in (pulgadas)
• cm (centimentros)
• mm (milímetros)
• px (pixeles): Es la unidad mínima de resolución de la pantalla. En realidad suele
considerársela una unidad absoluta, relativa o híbrida dependiendo del criterio que
se analice. Un pixel equivale a 0.26 milímetros.

Relativas: se llaman así porque son unidades relativas al medio o soporte sobre el que se
está viendo la página web, que dependiendo de cada usuario puede ser distinto, puesto
que existen muchos dispositivos que pueden acceder a la web, como ordenadores o
teléfonos móviles. En principio las unidades relativas son más aconsejables, porque se
ajustarán mejor al medio con el que el usuario está accediendo a nuestra web. Son las
siguientes:

Unidad em

La unidad em se utiliza para hacer referencia al tamaño actual de la fuente que ha sido
establecida en el navegador, que habitualmente es un valor aproximado a 16px (salvo que
se modifique por el usuario). De esta forma, podemos trabajar simplificando las unidades a
medidas en base a ese tamaño.

Por ejemplo, imaginemos que el tamaño de la fuente establecida en el navegador del


usuario es exactamente 16px. Una cantidad 1em equivaldría a 16px, mientras que una
cantidad de 2em sería justo el doble: 32px. Por otro lado, una cantidad de 0.5em sería justo
la mitad: 8px.

46
Unidad porcentaje

Porcentaje (%), es una de las unidades relativas más utilizadas. Su valor está calculado
siempre en base a otro elemento. Si lo aplicamos sobre una fuente es relativo al tamaño de
la fuente declarada en el contexto, pero si lo aplicamos al width de un elemento entonces
es relativo al ancho de su contenedor.

El porcentaje se utiliza para definir una unidad en función de la que esté definida en un
momento dado. Imaginemos que estamos trabajando en 12pt y definimos una unidad
como 150%. Esto sería igual al 150% de los 12pt actuales, que equivale a 18pt.

COLORES EN CSS
Con CSS se puede especificar colores para cada elemento HTML de la página, incluso hay
elementos que podrían admitir varios colores, como el color de fondo o el color del borde.
Pero bueno, vamos a ver ahora es las distintas maneras de escribir un color en una
declaración CSS.

Porque lo más habitual es que especifiquemos un color con su valor RGB. Pero en CSS
tenemos otras maneras de declarar colores que pueden interesarnos, como mínimo para
poder entender el código CSS cuando lo veamos escrito.

NOTACIÓN HEXADECIMAL RGB


Se especifican los tres valores de color (rojo, verde y azul) con valores en hexadecimal
entre 00 y FF.

background-color: #ff8800;

NOMBRE DEL COLOR


También podemos definir un color por su nombre. Los nombres de colores son en inglés,
los mismos que sirven para especificar colores con HTML.

color: red;

border-color: Lime;

NOTACIÓN DE COLOR CON PORCENTAJES DE RGB


Se puede definir un color por los distintos porcentajes de valores RGB. Si todos los valores
están al 100% el color es blanco. Si todos están al 0% obtendríamos el negro y con
combinaciones de distintos porcentajes de RGB obtendríamos cualquier matiz de color.

color: rgb(33%, 0%, 0%);

47
NOTACIÓN POR VALORES DECIMALES DE RGB, DE 0 A 255
De una manera similar a la notación por porcentajes de RGB se puede definir un color
directamente con valores decimales en un rango desde 0 a 255.

color: rgb(200,255,0);

De entre todas estas notaciones podemos utilizar la que más nos interese o con la que nos
sintamos más a gusto. Nosotros en nuestros ejemplos venimos utilizando la notación
hexadecimal RGB por habernos acostumbrado a ella en HTML.

COLOR TRANSPARENTE
Para finalizar, podemos comentar que también existe el color transparente, que no es
ningún color, sino que específica que el elemento debe tener el mismo color que el fondo
donde está. Este valor, transparent, sustituye al color. Podemos indicarlo en principio sólo
para fondos de elementos, es decir, para el atributo background-color.

background-color: transparent;

PROPIEDADES CSS
Tanto para practicar en tu aprendizaje como para trabajar con las CSS lo mejor es disponer
de las distintas propiedades y valores de estilos que podemos aplicarle a las páginas web.

Aquí puedes ver las propiedades CSS más fundamentales para aplicar estilos a elementos
básicos, que te vendrá perfectamente para comenzar con las CSS. Pero antes debemos
explicar el concepto de el modelo de caja para poder entender algunas de las
propiedades de css.

EL MODELO DE CAJA
El modelo de cajas o "box model" es seguramente la característica más importante del
lenguaje de hojas de estilos CSS, ya que condiciona el diseño de todas las páginas web. El
modelo de cajas es el comportamiento de CSS que hace que todos los elementos de las
páginas se representen mediante cajas rectangulares.

Las cajas de una página se crean automáticamente. Cada vez que se inserta una etiqueta
HTML, se crea una nueva caja rectangular que encierra los contenidos de ese elemento. La
siguiente imagen muestra las tres cajas rectangulares que crean las tres etiquetas HTML
que incluye la página:

Las cajas de las páginas no son visibles a simple vista porque inicialmente no muestran
ningún color de fondo ni ningún borde.

Los navegadores crean y colocan las cajas de forma automática, pero CSS permite
modificar todas sus características. Cada una de las cajas está formada por cuatro partes,
tal y como muestra la siguiente imagen:

48
• Contenido (content): se trata del contenido HTML del elemento (las palabras de un
párrafo, una imagen, el texto de una lista de elementos, etc.)
• Relleno (padding): espacio libre opcional existente entre el contenido y el borde.
• Borde (border): línea que encierra completamente el contenido y su relleno.
• Margen (margin): separación opcional existente entre la caja y el resto de cajas
adyacentes.

Existen otras dos partes de una caja que son:

• Imagen de fondo (background image): imagen que se muestra por detrás del
contenido y el espacio de relleno.
• Color de fondo (background color): color que se muestra por detrás del contenido y
el espacio de relleno.

El relleno y el margen son transparentes, por lo que en el espacio ocupado por el relleno se
muestra el color o imagen de fondo (si están definidos) y en el espacio ocupado por el
margen se muestra el color o imagen de fondo de su elemento padre (si están definidos).
Si ningún elemento padre tiene definido un color o imagen de fondo, se muestra el color o
imagen de fondo de la propia página (si están definidos).

Si una caja define tanto un color como una imagen de fondo, la imagen tiene más prioridad
y es la que se visualiza. No obstante, si la imagen de fondo no cubre totalmente la caja del
elemento o si la imagen tiene zonas transparentes, también se visualiza el color de fondo.
Combinando imágenes transparentes y colores de fondo se pueden lograr efectos gráficos
muy interesantes.

Teniendo esto en cuenta podemos ver las siguientes propiedades de css:

Ancho

La propiedad CSS que controla la anchura de la caja de los elementos se denomina width.

49
Alto

La propiedad CSS que controla la anchura de la caja de los elementos se denomina height.

Margen

CSS define cuatro propiedades para controlar cada uno de los márgenes horizontales y
verticales de un elemento.

Relleno

CSS define cuatro propiedades para controlar cada uno de los espacios de relleno
horizontales y verticales de un elemento.

50
Bordes - Tamaño

CSS permite definir el aspecto de cada uno de los cuatro bordes horizontales y verticales
de los elementos. Para cada borde se puede establecer su anchura, su color y su estilo.

Bordes - Color

El color de los bordes se controla con las cuatro propiedades siguientes:

51
Bordes - Estilo

El color de los bordes se controla con las cuatro propiedades siguientes:

Bordes - Forma Resumida

Todos los estilos de los bordes se controlan con la siguiente siguientes:

Fondo - Color

El color de fondo se establece con esta propiedad:

52
La imagen de fondo se establece con esta propiedad:

Fondo - Repetición

La repetición de la imagen de fondo se configura con esta propiedad:

Fondo - Posición

La posición de la imagen de fondo se configura con esta propiedad:

53
Fondo - Imagen de Fondo

Para controlar la manera de visualizar la imagen de fondo:

Fondo - Resumida

Establecer todas las propiedades de fondo:

Tipografía - Resumida

CSS define numerosas propiedades para modificar la apariencia del texto. A pesar de que
no dispone de tantas posibilidades como los lenguajes y programas específicos para crear
documentos impresos, CSS permite aplicar estilos complejos y muy variados al texto de las
páginas web. La propiedad básica que define CSS relacionada con la tipografía se
denomina color y se utiliza para establecer el color de la letra.

Tipografía - Fuente

La otra propiedad básica que define CSS relacionada con la tipografía se denomina font-
family y se utiliza para indicar el tipo de letra con el que se muestra el texto.

54
Tipografía – Tamaño

Una vez seleccionado el tipo de letra, se puede modificar su tamaño mediante la


propiedad font-size.

Tipografía – Tamaño

Además de todas las unidades de medida relativas y absolutas y el uso de porcentajes,


CSS permite utilizar una serie de palabras clave para indicar el tamaño de letra del texto:

Tamaño Absoluto: indica el tamaño de letra de forma absoluta mediante alguna de las
siguientes palabras clave: xx-small, x-small, small, medium, large, x-large, xx-large.

Tamaño Relativo: indica de forma relativa el tamaño de letra del texto mediante dos
palabras clave (larger, smaller) que toman como referencia el tamaño de letra del elemento
padre.

Tipografía – Grosor

Una vez indicado el tipo y el tamaño de letra, es habitual modificar otras características
como su grosor (texto en negrita) y su estilo (texto en cursiva). La propiedad que controla la
anchura de la letra es font-weight.

55
Una vez indicado el tipo y el tamaño de letra, es habitual modificar otras características
como su grosor (texto en negrita) y su estilo (texto en cursiva). La propiedad que controla la
anchura de la letra es font-weight.

Texto - Alineación

Para establecer la alineación del contenido del elemento. La propiedad text-align no sólo
alinea el texto que contiene un elemento, sino que también alinea todos sus contenidos,
como por ejemplo las imágenes.

Texto - Interlineado

El interlineado de un texto se controla mediante la propiedad line-height, que permite


controlar la altura ocupada por cada línea de texto:

Texto - Decoración

El valor underline subraya el texto.

El valor overline añade una línea en la parte superior del texto.

El valor line-through muestra el texto tachado con una línea continua, por lo que su uso
tampoco es muy habitual.

El valor blink muestra el texto parpadeante.

56
Texto - Transformación

El valor capitalize transforma a mayúsculas la primera letra de las palabras del texto.

El valor uppercase transforma a mayúsculas todo el texto.

El valor lowercase transforma a minúsculas todo el texto.

Imágenes – Ancho / Altura

Utilizando las propiedades width y height, es posible mostrar las imágenes con cualquier
altura/anchura, independientemente de su altura/anchura real:

#destacada {

width: 120px;

height: 250px;

<img id="destacada" src="imagen.png" />

No obstante, si se utilizan alturas/anchuras diferentes de las reales, el navegador deforma


las imágenes y el resultado estético es muy desagradable.

Imágenes – Bordes

Cuando una imagen forma parte de un enlace, los navegadores muestran por defecto un
borde azul grueso alrededor de las imágenes. Por tanto, una de las reglas más utilizadas en
los archivos CSS es la que elimina los bordes de las imágenes con enlaces:

img {

border: none;

57
Listas – Viñetas Personalizadas

Por defecto, los navegadores muestran los elementos de las listas no ordenadas con una
viñeta formada por un pequeño círculo de color negro. Los elementos de las listas
ordenadas se muestran por defecto con la numeración decimal utilizada en la mayoría de
países.

No obstante, CSS define varias propiedades para controlar el tipo de viñeta que muestran
las listas, además de poder controlar la posición de la propia viñeta. La propiedad básica es
la que controla el tipo de viñeta que se muestra y que se denomina list-style-type.

La siguiente imagen muestra algunos de los valores definidos por la propiedad list-style-
type:

Listas – Viñetas Posición

La propiedad list-style-position permite controlar la colocación de las viñetas.

La diferencia entre los valores outside y inside se hace evidente cuando los elementos
contienen mucho texto, como en la siguiente imagen:

58
Utilizando las propiedades anteriores (list-style-type y list-style-position), se puede
seleccionar el tipo de viñeta y su posición, pero no es posible personalizar algunas de sus
características básicas como su color y tamaño.

Listas – Viñetas Aspecto

Cuando se requiere personalizar el aspecto de las viñetas, se debe emplear la


propiedad list-style-image, que permite mostrar una imagen propia en vez de una viñeta
automática.

Las imágenes personalizadas se indican mediante la URL de la imagen. Si no se encuentra


la imagen o no se puede cargar, se muestra la viñeta automática correspondiente (salvo
que explícitamente se haya eliminado mediante la propiedad list-style-type).

La siguiente imagen muestra el uso de la propiedad list-style-image mediante tres


ejemplos sencillos de listas con viñetas personalizadas:

Las reglas CSS correspondientes al ejemplo anterior se muestran a continuación:

ul.ok { list-style-image: url("imagenes/ok.png"); }

ul.flecha { list-style-image: url("imagenes/flecha.png"); }

ul.circulo { list-style-image: url("imagenes/circulo_rojo.png"); }

59
Listas – Menú Vertical

Los sitios web correctamente diseñados emplean las listas de elementos para crear todos
sus menús de navegación. Utilizando la etiqueta <ul> de HTML se agrupan todas las
opciones del menú y haciendo uso de CSS se modifica su aspecto para mostrar un menú
horizontal o vertical.

A continuación se muestra la transformación de una lista sencilla de enlaces en un menú


vertical de navegación.

<ul>
<li><a href="#">Elemento 1</a></li>
<li><a href="#">Elemento 2</a></li>
<li><a href="#">Elemento 3</a></li>
<li><a href="#">Elemento 4</a></li>
<li><a href="#">Elemento 5</a></li>
<li><a href="#">Elemento 6</a></li>
</ul>
Aspecto final del menú vertical:

El proceso de transformación de la lista en un menú requiere de los siguientes pasos:

1) Definir la anchura del menú:

ul.menu { width: 180px; }

2) Eliminar las viñetas automáticas y todos los márgenes y espaciados aplicados por
defecto:

ul.menu {
list-style: none;
margin: 0;
padding: 0;
width: 180px;
}

60
3) Añadir un borde al menú de navegación y establecer el color de fondo y los bordes de
cada elemento del menú:

ul.menu {
border: 1px solid #7C7C7C;
border-bottom: none;
list-style: none;
margin: 0;
padding: 0;
width: 180px;
}
ul.menu li {
background: #F4F4F4;
border-bottom: 1px solid #7C7C7C;
border-top: 1px solid #FFF;
}
4) Aplicar estilos a los enlaces: mostrarlos como un elemento de bloque para que ocupen
todo el espacio de cada <li> del menú, añadir un espacio de relleno y modificar los colores
y la decoración por defecto:

ul.menu li a {

color: #333;

display: block;

padding: .2em 0 .2em .5em;

text-decoration: none;

Tablas – Bordes Celdas

Cuando se aplican bordes a las celdas de una tabla, el aspecto por defecto con el que se
muestra en un navegador es el siguiente:

El código HTML y CSS del ejemplo anterior se muestra a continuación:

61
.normal {
width: 250px;
border: 1px solid #000;
}
.normal th, .normal td {
border: 1px solid #000;
}

<table class="normal" summary="Tabla genérica">


<tr>
<th scope="col">A</th>
<th scope="col">B</th>
<th scope="col">C</th>
<th scope="col">D</th>
<th scope="col">E</th>
</tr>
</table>
El estándar CSS 2.1 define dos modelos diferentes para el tratamiento de los bordes de las
celdas. La propiedad que permite seleccionar el modelo de bordes es border-collapse:

El modelo collapse fusiona de forma automática los bordes de las celdas adyacentes,
mientras que el modelo separate fuerza a que cada celda muestre sus cuatro bordes. Por
defecto, los navegadores utilizan el modelo separate, tal y como se puede comprobar en el
ejemplo anterior. Ejemplo collapase:

El código CSS completo del ejemplo anterior se muestra a continuación:

62
.normal {
width: 250px;
border: 1px solid #000;
border-collapse: collapse;
}
.normal th, .normal td {
border: 1px solid #000;
}
<table class="normal" summary="Tabla genérica">
<tr>

<th scope="col">A</th>

<th scope="col">B</th>

<th scope="col">C</th>

<th scope="col">D</th>

<th scope="col">E</th>

</tr>

</table>

Si se opta por el modelo separate (que es el que se aplica si no se indica lo contrario) se


puede utilizar la propiedad border-spacing para controlar la separación entre los bordes de
cada celda.

Si solamente se indica como valor una medida, se asigna ese valor como separación
horizontal y vertical. Si se indican dos medidas, la primera es la separación horizontal y la
segunda es la separación vertical entre celdas.

La propiedad border-spacing sólo controla la separación entre celdas y por tanto, no se


puede utilizar para modificar el tipo de modelo de bordes que se utiliza. En concreto, si se
establece un valor igual a 0 para la separación entre los bordes de las celdas, el resultado
es muy diferente al modelo collapse:

63
Formularios – Campos de Texto

Por defecto, los campos de texto de los formularios no incluyen ningún espacio de relleno,
por lo que el texto introducido por el usuario aparece pegado a los bordes del cuadro de
texto.

Añadiendo un pequeño padding a cada elemento <input>, se mejora notablemente el


aspecto del formulario:

La regla CSS necesaria para mejorar el formulario es muy sencilla:

form.elegante input {

padding: .2em;

Formularios – Labels Alineadas y Formateadas

Los elementos <input> y <label> de los formularios son elementos en línea, por lo que el
aspecto que muestran los formularios por defecto, es similar al de la siguiente imagen:

64
Aprovechando los elementos <label>, se pueden aplicar unos estilos CSS sencillos que
permitan mostrar el formulario con el aspecto de la siguiente imagen:

Para mostrar un formulario tal y como aparece en la imagen anterior no es necesario crear
una tabla y controlar la anchura de sus columnas para conseguir una alineación perfecta.
Sin embargo, sí que es necesario añadir un nuevo elemento (por ejemplo un <div>) que
encierre a cada uno de los campos del formulario (<label> y <input>). El esquema de la
solución propuesta es el siguiente:

Por tanto, en el código HTML del formulario se añaden los elementos <div>:

<form>
<fieldset>
<legend>Alta en el servicio</legend>
<div>
<label for="nombre">Nombre</label>
<input type="text" id="nombre" />
</div>
<div>
<label for="apellidos">Apellidos</label>
<input type="text" id="apellidos" size="35" />
</div>
</fieldset>
</form>
Y en el código CSS se añaden las reglas necesarias para alinear los campos del formulario:

div {
margin: .4em 0;
}

65
div label {
width: 25%;
float: left;
}

PSEUDO-CLASES
CSS también permite aplicar diferentes estilos a un mismo enlace en función de su estado.
De esta forma, es posible cambiar el aspecto de un enlace cuando por ejemplo el usuario
pasa el ratón por encima o cuando el usuario pincha sobre ese enlace.

Como con los atributos id o class no es posible aplicar diferentes estilos a un mismo
elemento en función de su estado, CSS introduce un nuevo concepto llamado pseudo-
clases. En concreto, CSS define las siguientes cuatro pseudo-clases:

• :link, aplica estilos a los enlaces que apuntan a páginas o recursos que aún no han
sido visitados por el usuario.
• :visited, aplica estilos a los enlaces que apuntan a recursos que han sido visitados
anteriormente por el usuario. El historial de enlaces visitados se borra
automáticamente cada cierto tiempo y el usuario también puede borrarlo
manualmente.
• :hover, aplica estilos al enlace sobre el que el usuario ha posicionado el puntero del
ratón.
• :active, aplica estilos al enlace que está clickeado el usuario.

Esto se vería asi:


/* link sin visitar */
a:link {
color: red;
}
/* link visitado*/
a:visited {
color: green;
}

/* mouse sobre el link*/


a:hover {
color: pink;
}

/* link clickeado */
a:active {
color: blue;
}

66
BOOTSTRAP
Es un framework de interfaz de usuario, de código abierto, creado para un desarrollo web
más rápido y sencillo. Mark Otto y Jacob Thornton fueron los creadores iniciales. El
framework combina CSS y JavaScript para estilizar los elementos de una página HTML.

Contiene todo tipo de plantillas de diseño basadas en HTML y CSS para diversas funciones
y componentes, como navegación, sistema de cuadrícula, carruseles de imágenes y
botones.

Si bien Bootstrap ahorra tiempo al desarrollador de tener que administrar las plantillas
repetidamente, su objetivo principal es crear sitios responsive. Permite que la interfaz de
usuario de un sitio web funcione de manera óptima en todos los tamaños de pantalla, ya
sea en teléfonos de pantalla pequeña o en dispositivos de escritorio de pantalla grande.

Por lo tanto, los desarrolladores no necesitan crear sitios específicos para dispositivos y
limitar su rango de audiencia.

ARCHIVOS PRIMARIOS DE BOOTSRAP


Ya sabemos qué es Bootstrap; consiste en una colección de sintaxis que realizan funciones
específicas. Debido a esto, tiene sentido que el marco tenga solo tres diferentes tipos de
archivos. A continuación, detallamos los tres archivos principales que administran esta
interfaz de usuario y la funcionalidad de un sitio web.

BOOTSTRAP.CSS

Esta es la hoja de estilos de bootstrap, gracias a esta podremos implementar estilos ya


definidos y asi estilizar nuestra pagina de una manera sencilla. Además las plantillas que
contiene bootstrap, usan esta hoja de estilos.

BOOTSTRAP.JS

Este archivo es la parte principal de Bootstrap. Consiste en archivos JavaScript que son
responsables de la interactividad del sitio web.

CÓMO USAR BOOTSTRAP


Para utilizar bootstrap lo único que vamos a tener que hacer es ir a estas dos paginas:

https://getbootstrap.com/docs/4.5/getting-started/introduction/#css
https://getbootstrap.com/docs/4.5/getting-started/introduction/#js

Dentro de estas dos paginas vamos a encontrar una etiqueta link para el CSS de Bootstrap
y unas etiquetas script para el Javascript de Bootstrap.

Para poder usar Bootstrap lo que haremos es pegar el link con la hoja de estilos de
Bootstrap en la etiqueta <head> de nuestro html y las etiquetas script antes de la etiqueta
de cierre </body>.

Esto se vería así:

67
<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
integrity="sha384-
TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2"
crossorigin="anonymous">

<title>Pagina con bootstrap</title>

</head>

<body>

<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-


DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"
integrity="sha384-
ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx"
crossorigin="anonymous"></script>
</body>

</html>

Una vez que hemos hecho esto, ya podemos usar Bootstrap y sus plantilas.

PLANTILLAS
Dado que es uno de los framework más utilizados, podemos encontrar un amplio abanico
de marcos de trabajo pensados y diseñados a partir de los componentes y estilos que
presenta Bootstrap, de modo que existen variables y ejemplos listos para utilizar en
proyectos específicos.

https://themes.getbootstrap.com/official-themes/

68
PREGUNTAS DE APRENDIZAJE
1) ¿Qué significa el acrónimo HTML?:

a) Hyper Text Mask Language.


b) Hard Text Markup Language.
c) Hyper Text Markup Language.
d) Hard Text Mask Language.

2) HTML es un lenguaje:

a) De programación.
b) De marcado.
c) Hablado.
d) Ninguno de los anteriores.

3) La etiqueta que encierra todo el contenido de una página es:

a) <head></head>
b) <body></body>
c) !DOCTYPE
d) <html></html>

4) La etiqueta que es el contenedor de todo aquello que se va incluir en el html es:

a) <head></head>
b) <body></body>
c) !DOCTYPE
d) <html></html>

5) La etiqueta que encierra todo el contenido visible al usuario es:

a) <head></head>
b) <body></body>
c) !DOCTYPE
d) <html></html>

6) ¿Cuál de estos no es un atributo básico?

a) id
b) class
c) style
d) align

7) En relación a HTML cual de estas es verdadera:

a) Todas las etiquetas deben ir en minúsculas


b) Todas las etiquetes tienen apertura y cierre
c) HTML5 es la ultima versión de HTML
d) Ninguna es cierta

69
8) ¿Cuál es la etiqueta para indicar un salto de línea?

a) </br>
b) <breakLine>
c) <br>
d) <hr>

9) ¿Cuál es la etiqueta para poner texto en negrita?

a) <strong></strong>
b) <bold></bold>
c) <i></i>
d) <u></u>

10) ¿Qué etiqueta se usa para escribir una lista no ordenada?

a) <ol>
b) <ul>
c) <li>
d) <list>

11) ¿Qué etiqueta se usa para denominar cada fila en una tabla html?

a) <tr>
b) <td>
c) <th>
d) <li>

12) ¿Qué atributo debe ir siempre en la etiqueta <a>?

a) src
b) align
c) href
d) alt

13) ¿Qué significa CSS?

a) Cascading Style Sheets


b) Coded Style Sheets
c) Color Style Sheets
d) Carrot Soup Sauce

14) En que parte del HTML podemos agregar la hoja de estilos

a) <Body>
b) <Head>
c) <Footer>
d) <Nav>

70
15) La etiqueta para agregar el archivo CSS a el archivo HTML es:

a) <head>
b) <link>
c) <css>
d) <meta>

16) Para delimitar un bloque de CSS usamos:

a) Llaves {}
b) Parentesis ()
c) Comas ,,
d) Corchetes []

17) ¿Cual de estos no es un tipo de selector?

a) Selector de Clase
b) Selector de Etiqueta
c) Selector Universal
d) Selector de Cascada

18) En relación al atributo class cual es cierta:

a) No se puede repetir en dos elementos


b) Es reutilizable
c) Debe ir siempre
d) Ninguna es cierta

19) ¿Cuál de estas no es una unidad de medida en CSS?


a) Puntos
b) Pulgadas
c) Pies
d) Milimetros

20) ¿Cuál de estas no es una manera de especificar colores en CSS?


a) RGB
b) Binario
c) Nombre
d) Hexadecimal

21) ¿Cuál de estos atributos no es parte del modelo de caja?


a) Margen
b) Relleno
c) Borde
d) Longitud

71
EJERCICIOS DE APRENDIZAJE
Para la realización de los ejercicios que se describen a continuación, es necesario tener
instalado Visual Studio Code o alguna aplicación parecida. Si no lo tienen instalado aquí les
dejamos el link: Visual Studio Code.

Recomendamos también ir al apartado de bibliografía al final de la guía por si necesitamos


reforzar o queremos saber más sobre los temas vistos.

1. Crear un archivo HTML, que contenga un encabezado <h1> seguido de un párrafo y


un encabezado <h2> seguido de otro párrafo. Después, hacer que un párrafo se
muestre en negrita y el otro en itálica. Utilizar saltos de línea si los consideran
necesarios.

2. Ahora vamos a tener que centrar nuestros encabezados y nuestros párrafos


alinearlos a la izquierda. A continuación, después del ultimo párrafo vamos a tener
que crear una lista ordenada de lo que queramos. Tendremos que mostrar la lista
donde la enumeración sean letras del alfabeto. Sin usar CSS

3. Ahora crearemos otro archivo HTML en que crearemos una lista anidada de
enlaces, deberá verse así:

Cada buscador y red social que sale en la lista deben ser links a las respectivas
paginas.

4. Crear un nuevo archivo HTML en el que explicaremos la receta para hacer papas
fritas. La pagina debería verse así:

72
5. Ahora vamos a crear una pagina web de nuestra banda favorita, vamos a mostrar un
ejemplo con los Beatles:

La tabla tendrá bordes que se lo debemos agregar sin css. Investigar atributo
border.

6. Por ultimo vamos a crear un formulario para registrar un usuario que se vea de la
siguiente manera:

Es importante que en las casillas de sexo del usuario se puede clickear la/s
palabra/s hombre, mujer o prefiero no decir para seleccionar la opción.
Recordemos que eso lo podemos hacer con la etiqueta label.

73
7. Crear un archivo HTML y un archivo CSS, vamos a linkear el archivo CSS al archivo
HTML y vamos hacer lo mismo que el primer ejercicio, pero ahora la pagina va a
tener un color de fondo a elección, el encabezado H1 tiene que tener una fuente a
elección y estar centrado, lo mismo para el encabezado H2, y por ultimo los
párrafos deben tener un fuente a elección, deben tener un color a elección y deben
estar centrados a la izquierda.

8. Definir las reglas CSS que permiten mostrar los enlaces con los siguientes estilos:

• En su estado normal, los enlaces se muestran de color rojo #CC0000.


• Cuando el usuario pasa su ratón sobre el enlace, se muestra con un color de fondo
rojo #CC0000 y la letra de color blanco #FFF.
• Los enlaces visitados se muestran en color gris claro #CCC.

9. Para este apartado vamos a crear 2 listas:

1) Lista con viñetas con aspectos personalizados a elección.

2) Lista vertical con links a paginas a elección.

10. A partir del código HTML proporcionado, añadir las reglas CSS necesarias para que
la página resultante tenga el mismo aspecto que el de la siguiente imagen:

Nota: el código para este ejercicio se encuentra en el Drive.

11. Determinar las reglas CSS necesarias para mostrar la siguiente tabla con el aspecto
final mostrado en la imagen (modificar el código HTML que se considere necesario
añadiendo los atributos class oportunos).

Tabla original:

74
Tabla final:

Pasos a hacer:

1) Alinear el texto de las celdas, cabeceras y título. Definir los bordes de la tabla,
celdas y cabeceras (color gris oscuro #333).

2) Formatear las cabeceras de fila y columna con la imagen de fondo


correspondiente en cada caso
(fondo_gris.gif, euro.png, dolar.png, yen.png, libra.png). Modificar el tipo de letra
de la tabla y utilizar Arial. El color azul claro es #E6F3FF.

75
3) Mostrar un color alterno en las filas de datos (color amarillo claro #FFFFCC).

Nota: el código para este ejercicio se encuentra en el Drive.

12. Ahora vamos a utilizar Bootstrap. Deberemos crear una pagina que tenga un
encabezado H1 con un párrafo y un encabezado H2 con un párrafo. Tenemos que
lograr que se vean con los estilos de Bootstrap.

13. Usar Bootstrap para mostrar un tabla de productos así:

14. Una vez que tenemos esa tabla vamos a sumarle una columna más que se vea así:

Para esto investigar la clase button de Bootsrap para las etiquetas <a> e investigar
los colores de Bootstrap y como sumarlos.

15. Un formulario para que el usuario se pueda registrar en nuestra pagina usando
Bootstrap.

76
16. Además, haremos una landing page que contenga un navbar, investigar el navbar
en Bootstrap, con botones a todos las paginas previamente mencionadas.

Pueden también hacer que ese navbar salga en el resto de páginas.

17. Por último, le sumaremos una imagen a la landing page usando las clases para la
etiqueta <img> que nos provee Bootstrap. Ejemplo:

77
EJERCICIOS EXTRAS
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos
pueden realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que
venimos trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas,
podes continuar con estos ejercicios extra, recordando siempre que no es necesario que
los termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es
ayudar a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es
que puedas explicar el ejercicio con la intención de que tu compañero lo comprenda, y no
sólo mostrarlo. ¡Muchas gracias!

1. Siguiendo el ejercicio de Bootstrap, hacer un pagina para el detalle del producto. Una
pagina que muestre el nombre, el precio del producto y un botón para comprar y otro
para agregar al carrito. A esta pagina se accederá con el botón en al tabla de ver
detalle.

2. Sumarle a la landing cartas que muestren productos de esta manera:

78
Bibliografía
Información sacada de las paginas:

HTML:

- https://desarrolloweb.com/manuales/manual-html.html

- https://developer.mozilla.org/es/docs/Learn/Getting_started_with_the_web/HTML_basics

- https://www.arkaitzgarro.com/xhtml/capitulo-2.html#que-es-html

- https://www.geeksforgeeks.org/span-tag-html/

- https://www.geeksforgeeks.org/div-tag-html/

CSS:

- https://desarrolloweb.com/manuales/manual-css-hojas-de-estilo.html

- https://uniwebsidad.com/libros/css/capitulo-1

- https://lenguajecss.com/css/modelo-de-cajas/unidades-css/

- https://developer.mozilla.org/es/docs/Learn/CSS/First_steps

- https://web.dev/learn/css/

79
CURSO DE PROGRAMACIÓN FULL STACK

PROGRAMACIÓN
WEB CON JAVA
GUÍA DE PROGRAMACIÓN WEB
FUNDAMENTOS WEB
El éxito de la web se basa en dos factores fundamentales: el protocolo HTTP y el lenguaje
HTML. El primero permite una implementación sencilla de un sistema de comunicaciones
que permite enviar cualquier archivo de forma fácil, simplificando el funcionamiento del
servidor y posibilitando que servidores poco potentes atiendan cientos o miles de
peticiones y reduzcan de este modo los costes de despliegue. El segundo, el lenguaje
HTML, proporciona un mecanismo sencillo y muy eficiente de creación de páginas
enlazadas.

EL PROTOCOLO HTTP
El protocolo HTTP (Hypertext Transfer Protocol) es el protocolo principal de la World Wide
Web. Es un protocolo simple, orientado a conexión y sin estado. Está orientado a conexión
porque emplea para su funcionamiento un protocolo de comunicaciones (TCP, o Transport
Control Protocol) de modo conectado, que establece un canal de comunicaciones entre el
cliente y el servidor, por el cual pasan los bytes que constituyen los datos de la transferencia,
en contraposición a los protocolos denominados de datagrama (o no orientados a conexión)
que dividen la serie de datos en pequeños paquetes (o datagramas) antes de enviarlos,
pudiendo llegar por diversas vías del servidor al cliente.

Explicado de manera más simple, cuando escribes una dirección web en tu navegador y se
abre la página que deseas, es porque tu navegador se ha comunicado con el servidor web
por HTTP. Dicho de otra manera, el protocolo HTTP es el código o lenguaje en el que el
navegador le comunica al servidor qué página quiere visualizar.

HTTPS
Existe una variante de HTTP denominada HTTPS (S significa "secure", o "seguro") que utiliza
el protocolo de seguridad SSL (o "Secure Socket Layer") para cifrar y autenticar el tráfico de
datos, muy utilizada por los servidores web oientados al comercio electrónico o por aquellos
que albergan información de tipo personal o confidencial.

¿CÓMO FUNCIONA HTTP?


De forma esquemática, el funcionamiento de HTTP es como sigue: el cliente establece una
conexión TCP con el servidor, hacia el puerto por defecto para el protocolo HTTP (o el
indicado expresamente en la conexión), envía una orden HTTP de solicitud de un recurso
(añadiendo algunas cabeceras con información) y, utilizando la misma conexión, el servidor
responde enviando los datos solicitados y, además, añadiendo algunas cabeceras con
información.

La manera más fácil de explicar cómo funciona HTTP es describiendo cómo se abre una
página web:

1
1. En la barra de direcciones del navegador, el usuario teclea example.com.

2. El navegador envía esa solicitud, es decir, la petición HTTP, al servidor web que
administre el dominio example.com. Normalmente, la solicitud del cliente dice algo
así como “Envíame este archivo”, pero también puede ser simplemente “¿Tienes este
archivo?”.

3. El servidor web recibe la solicitud HTTP, busca el archivo en cuestión (en nuestro
ejemplo, la página de inicio de example.com, que corresponde al archivo index.html)
y el servidor envía una respuesta. En primer lugar envía una cabecera o header. Esta
cabecera le comunica al cliente, mediante un código de estado, el resultado de la
búsqueda.
4. Si se ha encontrado el archivo solicitado y el cliente ha solicitado recibirlo (y no solo
saber si existe), el servidor envía, tras el header, el message body o cuerpo del
mensaje, es decir, el contenido solicitado: en nuestro ejemplo, el archivo index.html.

5. El navegador recibe el archivo y lo abre en forma de página web.

MENSAJES HTTP
Como vimos el servidor recibe un mensaje que es la petición HTTP del usuario y después
envía una respuesta HTTP al cliente/navegador, en base a la petición.

Existen dos tipos de mensajes HTTP: peticiones y respuestas, cada uno sigue su propio
formato.

Peticiones

Una petición de HTTP se ve de la siguiente manera:

Una petición de HTTP, está formado por los siguientes campos:

• Un método HTTP, normalmente pueden ser un verbo, como: GET, POST o un nombre
como: OPTIONS (en-US) o HEAD (en-US), que defina la operación que el cliente
quiera realizar. El objetivo de un cliente, suele ser una petición de recursos, usando
GET, o presentar un valor de un formulario HTML, usando POST, aunque en otras
ocasiones puede hacer otros tipos de peticiones.

2
• La dirección del recurso pedido; la URL del recurso, sin los elementos obvios por el
contexto, como pueden ser: sin el protocolo (http://), el dominio
(aquí developer.mozilla.org), o el puerto TCP (aquí el 80).

• La versión del protocolo HTTP.

• Cabeceras HTTP, opcionales, que pueden aportar información adicional a los


servidores.

Respuestas

Un ejemplo de repuesta:

Las respuestas están formadas por los siguientes campos:

• La versión del protocolo HTTP que están usando.


• Un código de respuesta, indicando si la petición ha sido exitosa, o no, y debido a
qué.
• Un mensaje de estado, una breve descripción del código de estado.
• Cabeceras HTTP, como las de las peticiones.

MÉTODOS DE PETICIÓN
En la web, los clientes, como un navegador, por ejemplo, se comunican con los distintos
servidores web con ayuda del protocolo HTTP, el cual regula cómo ha de formular sus
peticiones el cliente y cómo ha de responder el servidor. El protocolo HTTP emplea varios
métodos de petición diferentes.

GET
GET es la madre de todas las peticiones de HTTP. Este método de petición existía ya en los
inicios de la world wide web y se utiliza para solicitar un recurso, como un archivo HTML, del
servidor web. Esto podría ser cuando un usuario clickea un link para ir a una pagina concreta.

Cuando escribes la dirección URL www.ejemplo.com/test.html en tu navegador, este se


conecta con el servidor web y le envía una petición GET:

3
GET /test.html

El servidor enviaría el archivo test.html como respuesta.

PARTES DE UNA URL


A la petición GET puede añadirse más información, con la intención de que el servidor web
también la procese. Estos llamados parámetros de URL se adjuntan a la dirección URL, la
URL puede estar compuesta de varias partes, y las vamos a ver a continuación:

Ruta (Path)

Es lo que viene después de la barra /.

Normalmente indica páginas y subpáginas que podemos encontrar en un sitio web.

www.ejemplo.com/otraPagina.html

Parámetro (Query String)

Es lo que viene después del signo de interrogación ?. Todos los parámetros se componen
de un nombre y un valor: “Nombre=Valor”.

En una URL puede haber varios parámetros. Y cuando es el caso, éstos se separan con el
símbolo de ampersand &.

Los parámetros pueden indicar diferentes cosas. A veces tienen que ver con una búsqueda
en el sitio, a veces son parámetros de campañas publicitarias, etc.

Veámoslo con este ejemplo: para buscar ciertas ofertas en la página web de una empresa
de software, en la petición GET se indicará “Windows” como plataforma y “Office” como
categoría:

GET /search?platform=Windows&category=office

Etiqueta

Las etiquetas en una URL aparecen después del hashtag #.

Su función, entre otras cosas, consiste en permitir hacer scroll hasta un elemento en
concreto. Por ejemplo, si mandamos a alguien una URL que contenga una etiqueta, ésta le
dirigirá a la parte exacta de la página en cuestión. Veamos una URL completa:

4
POST
Cuando se tienen que enviar al servidor web paquetes grandes de datos, como imágenes o
datos de formulario de carácter privado por ejemplo. El método GET se queda corto, porque
todos los datos que se transmiten se escriben abiertos en la barra de direcciones del
navegador.

En estos casos, se recurre al método POST. Este método no escribe el parámetro del URL
en la dirección URL, sino que lo adjunta al encabezado HTTP.

Las peticiones POST suelen emplearse con formularios digitales. Abajo encontrarás el
ejemplo de un formulario que recoge un nombre y una dirección de correo electrónico y lo
envía al servidor por medio de POST:

<html>
<body>
<form action="/prueba " method="post">
Name: <input type="text" name="name"><br>
E-mail: <input type="text" name="email"><br>
<button type="submit">
</form>
</body>
</html>

¿CUÁNDO USAR UNO U OTRO?


El método POST es aconsejable cuando el usuario debe enviar datos o archivos al servidor,
como, por ejemplo, cuando se rellenan formularios o se suben fotos.

El método GET es adecuado para la personalización de páginas web: el usuario puede


guardar búsquedas, configuraciones de filtros y ordenaciones de listas junto al URL como
marcadores, de manera que en su próxima visita la página web se mostrará según sus
preferencias.

A modo de resumen:

GET – Utilizado para obtener un recurso del servidor, identificado por una url. Para la
configuración de páginas web (filtros, ordenación, búsquedas, links, etc.).

POST – Utilizado para la transferencia de información y datos al servidor. Puede utilizarse


para enviar parámetros y su longitud es ilimitada.

CÓDIGOS DE RESPUESTA
Al iniciar el navegador (llamado cliente en este caso) se realiza una petición al servidor web,
quien responde, a su vez, con un código de estado HTTP en forma de cadena de tres dígitos.

5
Con este mensaje, el servidor web le indica al navegador si su solicitud ha sido procesada
correctamente, si ha ocurrido un error o si se necesita una autenticación. Como
consecuencia, el código de estado HTTP se convierte en una parte esencial en la
transmisión de mensajes de respuesta por parte del servidor web, que es insertado
automáticamente en su encabezado. Por lo general, los usuarios se encuentran con páginas
en formato HTML en vez de códigos de estado HTTP, cuando el servidor web no puede o no
tiene permitido procesar la solicitud del cliente o no es posible realizar la transmisión de
datos.

TIPOS DE RESPUESTA DE LOS CÓDIGOS DE ESTADO HTTP


En principio, los códigos de estado HTTP se dividen en cinco categorías diferentes,
identificadas a su vez, por el primer dígito del código. Por ejemplo, el código de estado HTTP
200 forma parte del tipo de respuesta 2xx, el código 404 del tipo de respuesta 4xx. Esta
clasificación se deriva principalmente de la importancia y la función de los códigos de
estado, divididos principalmente en 5 tipos:

Códigos de estado 1xx – Información: Cuando se envía un código de estado HTTP 1xx, el
servidor le notifica al cliente que la petición actual aún continúa. Esta clase reúne y
proporciona información sobre el procesamiento y envío de una solicitud.

Códigos de estado 2xx – Éxito: Los códigos que comienzan con un 2 informan sobre una
operación exitosa. Cuando se reciben este tipo de respuestas quiere decir que la solicitud
del cliente fue recibida, comprendida y aceptada. Por lo general, el usuario solo percibe la
web solicitada.

Códigos de estado 3xx – Redirecciones: Aquellos códigos que comienzan con 3 indican
que la solicitud ha sido recibida por el servidor. Sin embargo, para asegurar un
procesamiento exitoso es necesario que el cliente tome una acción adicional. Este tipo de
códigos aparecen principalmente cuando hay redirecciones.

Códigos de estado 4xx – Errores del cliente: Cuando aparece un código 4xx quiere decir
que se ha presentado un error de cliente. Esto quiere decir que el servidor ha recibido la
solicitud, pero esta no se puede llevar a cabo. Una de las principales causas de este tipo de
respuestas son las solicitudes defectuosas. Los usuarios de Internet son informados de este
error por medio de una página HTML generada automáticamente.

Códigos de estado 5xx –Errores del servidor: El servidor indica un error propio cuando usa
un código 5xx. Este tipo de respuestas indican que la solicitud correspondiente está
temporalmente deshabilitada o es imposible de llevar a cabo. De nuevo, se generará
automáticamente una página en formato HTML.

CÓDIGOS DE ESTADO HTTP MÁS IMPORTANTES


Los únicos códigos visibles para los visitantes son principalmente los códigos de error del
cliente, como el 404 (Not Found), o de error del servidor como el 503 (Service Unavailable),
ya que estos siempre se muestran automáticamente como páginas en formato HTML.

6
Pero ahora que vamos a trabajar sobre la creación de estas paginas web, va a ver códigos
que nos van a informar de cosas a arreglar dentro de nuestro programa.

A continuación, presentamos una pequeña selección de los códigos de respuesta más


comunes:

200 – OK, petición procesada correctamente.

301 – Indica al browser que visite otra dirección.

403 – Acceso prohibido, por falta de permisos.

404 – No encontrado, cuando el documento no existe.

500 – Error interno en el servidor.

En el siguiente link podes ver todos los códigos de estado: Códigos de Estado.

MAVEN
Maven es una herramienta de software para la gestión y construcción de proyectos Java.
Utiliza un Project Object Model (POM) para describir el proyecto de software a construir, sus
dependencias de otros módulos y componentes externos, y el orden de construcción de los
elementos. El modelo de configuración es simple y está basado en un formato XML
(pom.xml). Además, Maven tiene objetivos predefinidos para realizar ciertas tareas
claramente definidas, como la compilación del código y su empaquetado. La siguiente
figura ilustra los pasos que lleva a cabo esta herramienta desde la importación de librerías
hasta la generación de la aplicación Java.

DEPENDENCIAS
Uno de los puntos fuertes de Maven son las dependencias. En nuestro proyecto podemos
decirle a Maven que necesitamos un jar (por ejemplo, log4j o el conector de MySQL) y maven
es capaz de ir a internet, buscar esos jar y bajárselos automáticamente. Es más, si alguno de
esos jar necesitara otros jar para funcionar, maven "tira del hilo" y va bajándose todos los jar
que sean necesarios. Vamos a ver todo esto con un poco de detalle. Las dependencias se
recopilan en el archivo pom.xml, dentro de una etiqueta <dependencies>.

7
Cuando ejecuta una compilación o ejecutamos un proyecto Maven, estas dependencias se
resuelven y luego se cargan desde el repositorio local. Si no están presentes allí, Maven los
descargará de un repositorio remoto y los almacenará en el repositorio local. También se le
permite instalar manualmente las dependencias.

AÑADIR DEPENDENCIAS EN NUESTRO PROYECTO


Para indicarle a maven que necesitamos un jar determinado, debemos editar el fichero
pom.xml que tenemos en el directorio raíz de nuestro proyecto. En el pom.xml generado por
defecto por maven veremos un trozo como el siguiente:

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>

Esta es una dependencia que pone maven automáticamente cuando creamos nuestro
proyecto. Presupone que vamos a usar junit y en concreto, la versión 3.8.1. Si nosotros
queremos añadir más dependencias, debemos poner más trozos como este. Por ejemplo,
si añadimos la dependencia del conector de mysql versión 5.1.12, debemos poner lo
siguiente:

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.12</version>
<scope>runtime</scope>
</dependency>
</dependencies>

SPRING FRAMEWORK
Spring es un framework alternativo al stack de tecnologías estándar en aplicaciones JavaEE.
Spring popularizó ideas como la inyección de dependencias o el uso de objetos
convencionales (POJOs) como objetos de negocio.

8
Spring es el framework más popular para el desarrollo de aplicaciones empresariales en
Java, para crear código de alto rendimiento, liviano y reutilizable. Su finalidad es
estandarizar, agilizar, manejar y resolver los problemas que puedan ir surgiendo en el
trayecto de la programación.

¿QUÉ ES UN FRAMEWORK?
Un framework es un entorno de trabajo que tiene como objetivo facilitar la labor de
programación ofreciendo una serie de características y funciones que aceleran el proceso,
reducen los errores, favorecen el trabajo colaborativo y consiguen obtener un producto de
mayor calidad.

Los framework ofrecen una estructura para el desarrollo y no tienen que estar sujetos a un
único lenguaje de programación, aunque es habitual encontrar en el mercado, distintos
frameworks específicos para un lenguaje concreto.

SPRING FUNCIONALIDADES
Spring, ofrece como elemento clave la inyección de dependencias a nuestro proyecto pero
existen otras funcionalidades también muy útiles:

• Core container: proporciona inyección de dependencias e inversión de control.


• Web: nos permite crear controladores Web, tanto de vistas MVC como aplicaciones
REST. Esto facilita en gran medida la programación basada en MVC (Modelo Vista
Controlador)
• Acceso a datos: abstracciones sobre JDBC, ORMs como Hibernate, sistemas OXM
(Object XML Mappers), JSM y transacciones.
• Instrumentación: proporciona soporte para la instrumentación de clases.
• Pruebas de código: contiene un framework de testing, con soporte para JUnit y
TestNG y todo lo necesario para probar los mecanismos de Spring.

Estos módulos son opcionales, por lo que podemos utilizar los que necesitemos.

9
SPRING MVC
Antes de pasar a ver la inyección de dependencias, veremos otra funcionalidad, que es el
Spring MVC.

Spring Web MVC es un sub-proyecto Spring que está dirigido a facilitar y optimizar el
proceso creación de aplicaciones web utilizando el patrón Modelo Vista Controlador.

¿QUE ES EL PATRÓN DE DISEÑO MVC?


MVC es un patrón de diseño que se estructura mediante tres componentes: modelo, vista y
controlador. Este patrón tiene como principio que cada uno de los componentes esté
separado en diferentes objetos, esto significa que los componentes no se pueden combinar
dentro de una misma clase. Sirve para clasificar la información, la lógica del sistema y la
interfaz que se le presenta al usuario.

Modelo: Esta capa representa todo lo que tiene que ver con el acceso a datos: guardar,
actualizar, obtener datos, además todo el código de la lógica del negocio, básicamente son
las clases Java y parte de la lógica de negocio. No contiene ninguna lógica que describa
como presentar los datos a un usuario.

Vista: este componente presenta los datos del modelo al usuario. La vista sabe cómo
acceder a los datos del modelo, pero no sabe que significa esta información o que puede
hacer el usuario para manipularla.

Controlador: este componente se encarga de gestionar las instrucciones que se reciben,


atenderlas y procesarlas. El controlador es el encargado de conectar el modelo con las
vistas, funciona como un puente entre la vista y el modelo, el controlador recibe eventos
generados por el usuario desde las vistas y se encarga de direccionar al modelo la petición,
recibir los resultados y entregarlos a la vista para que pueda mostrarlos.

10
PROCESAMIENTO DE UNA PETICIÓN EN SPRING MVC
Spring MVC se basa en este patron de diseño para el manejo de las peticiones http y sus
respuestas.

A continuación, se describe el flujo de procesamiento típico para una petición HTTP en


Spring MVC. Spring es una implementación del patrón de diseño "front controller”.

● Todas las peticiones HTTP se canalizan a través del front controller. En casi todos los
frameworks MVC que siguen este patrón, el front controller no es más que un servlet
cuya implementación es propia del framework. En el caso de Spring, la clase
DispatcherServlet.

● El front controller averigua, normalmente a partir de la URL, a qué Controller hay


que llamar para servir la petición. Para esto se usa un HandlerMapping.

● Se llama al Controller, que ejecuta la lógica de negocio, obtiene los resultados y los
devuelve al servlet, encapsulados en un objeto del tipo Model. Además, se devolverá el
nombre lógico de la vista a mostrar (normalmente devolviendo un String, como en
JSF).

11
● Un ViewResolver se encarga de averiguar el nombre físico de la vista que se
corresponde con el nombre lógico del paso anterior.

● Finalmente, el front controller (el DispatcherServlet) redirige la petición hacia la


vista, que muestra los resultados de la operación realizada.

INYECCIÓN DE DEPENDENCIAS
La inyección de dependencias es quizás la característica más destacable del core de Spring
Framework, que consiste que en lugar de que cada clase tenga que instanciar los objetos
que necesite, sea Spring el que inyecte esos objetos, lo que quiere decir que es Spring el
que creara los objetos y cuando una clase necesite usarlos se le pasaran (como cuando le
pasas un parámetro a un método).

La DI (Dependency Injector o Inyector de Dependencias) consiste en que en lugar de que


sean las clases las encargadas de crear (instanciar) los objetos que van a usar (sus atributos),
los objetos se inyectaran mediante los métodos setters o mediante el constructor en el
momento en el que se cree la clase y cuando se quiera usar la clase en cuestión ya estará
lista, en cambio sin usar DI la clase necesita crear los objetos que necesita cada vez que se
use.

En Spring hay un Contendor DI que es el encargado de inyectar a cada objeto los objetos
que necesita (de los que depende) según se le indique ya sea en un archivo de
configuración XML o mediante anotaciones.

Spring a estas clases que van a ser inyectadas por el contenedor, las llama Spring Beans.

¿QUE ES UN BEAN?
Un Bean es una clase de Java que debe cumplir los siguientes requisitos:

• Tener todos sus atributos privados (private).


• Tener métodos set() y get() públicos de los atributos privados que nos interese.
• Tener un constructor público por defecto.

A diferencia de los Bean convencionales que representan una clase, la particularidad de los
Beans de Spring es que son objetos creados y manejados por el contenedor Spring.

CONTENEDOR SPRING
En Spring hay un Contendor DI que es el encargado de inyectar a cada objeto los objetos
que necesita (de los que depende) según se le indique ya sea en un archivo de
configuración XML o mediante anotaciones. En el caso de Spring ese objeto es el
contenedor IoC el cual es provisto por los módulos spring-core y spring-beans.

Spring se basa en el principio de Inversión de Control (IoC) o Patrón Hollywood («No nos
llames, nosotros le llamaremos») consiste en:

12
• Un Contenedor que maneja objetos por vos, este contenedor es un archivo XML. Este
archivo se llama application-context.xml.

• El contenedor generalmente controla la creación de estos objetos. Por decirlo de


alguna manera, el contenedor hace los “new” de las clases java para que no los
realices vos.

• El contenedor resuelve dependencias entre los objetos que contiene.

Un ejemplo típico para ver su utilidad es el de una clase que necesita una conexión a base
de datos, sin DI si varios usuarios necesitan usar esta clase se tendrán que crear múltiples
conexiones a la base de datos con la consiguiente posible perdida de rendimiento, pero
usando la inyección de dependencia, las dependencias de la clase (sus atributos), son
instanciados una única vez cuando se despliega la aplicación y se comparten por todas las
instancias de modo que una única conexión a base de datos es compartida por múltiples
peticiones.

TIPOS DE INYECCIÓN DE DEPENDENCIAS


Las variantes de DI soportadas por el contenedor IoC de Spring son constructor, setter y con
el uso de anotaciones que nos evitaría tener que escribir nada en el xml.

1. Constructor

En este caso el contenedor se encarga de invocar el constructor de la clase pasando los


argumentos como dependencias. Es la recomendada para la mayoría de los casos, podes
leer más detalles en la documentación de Spring.

El siguiente ejemplo muestra una clase que solo puede inyectarse en dependencia con
inyección de constructor:

public class ListadorPeliculasServicio {


// la clase ListadorPeliculasServicio tiene una dependencia de
BuscadorPeliculaServicio
private final BuscadorPeliculaServico buscadorPeliculaServicio;
// Un constructor para que el contenedor de Spring pueda inyectar
BuscadorPelicula
public ListadorPeliculasServicio(BuscadorPeliculaServico
buscadorPeliculaServicio) {
this.buscadorPeliculaServicio = buscadorPeliculaServicio;
}
// la lógica de negocio que usa el buscadorPeliculaServicio se omite...
}

De esta manera la clase ListadorPeliculasServicio, puede usar todos los atributos y métodos
de la clase BuscadorPeliculaServicio, sin la necesidad de usar el new para instanciar la clase
cada vez que queramos usar sus métodos o sus atributos en un método de
ListadorPeliculasServicio.

13
Nuestro application-context.xml se vería así, dentro tendremos los beans que queremos
inyectar a nuestras clases:

2. Setter

Aquí el contenedor asigna las dependencias usando los métodos setter de los atributos.
Recomendada para dependencias opcionales.

// En vez de tener un constructor para que el contenedor de Spring pueda inyectar


BuscadorPelicula, tendríamos un método Setter
public setBuscadorPelicuaServicio(BuscadorPeliculaServico
buscadorPeliculaServicio) {
this.buscadorPeliculaServicio = buscadorPeliculaServicio;
}

ANOTACIONES
De las dos formas anteriores era necesario indicar en el archivo de configuración que beans
podían ser inyectados en otros y sobre los que se querían inyectar.

Ahora, cuando una clase está anotada con uno de las siguientes anotaciones, Spring
las registrará automáticamente en el application-context. Esto hace que la clase esté
disponible para la inyección de dependencias en otras clases y esto se vuelve vital
para construir nuestras aplicaciones. Estas anotaciones se las conoce como Spring
Stereotypes y se pueden encontrar en el paquete org.springframework.stereotype.

Spring Stereotypes

@Component: Es el estereotipo general y permite anotar un bean para que Spring lo


considere uno de sus objetos. Un bean es un componente hecho en software que se
puede reutilizar y que puede ser manipulado visualmente por una herramienta de
programación en lenguaje Java. Sustituye la declaración del bean en el xml.

14
@Repository: Es el estereotipo que se encarga de dar de alta un bean para que implemente
el patrón repositorio. Esta anotación se utiliza en clases Java que acceden directamente a
la base de datos. Los repositorios tendrán los métodos para ingresar, editar, eliminar, etc
objetos en la base de datos, también, tendrá consultas a la base de datos. La anotación
@Repository funciona como un marcador para cualquier clase que cumpla la función de
repositorio u Objeto de acceso a datos.

@Repository
public class Repositorio{}

@Service: Este estereotipo se encarga de gestionar las operaciones de negocio más


importantes a nivel de la aplicación. Usualmente operaciones CRUD, trabajará con los
repositorios para enviar los resultados de las operaciones de negocio a la base de datos y
persistir los objetos.

@Service
public class Servicio{}

15
@Controller: El último de los estereotipos que es el que realiza las tareas de controlador y
gestión de la comunicación entre el usuario y la aplicación. Para ello se apoya habitualmente
en algún motor de plantillas o librería de etiquetas que facilitan la creación de páginas.
Donde se realiza la asignación de solicitudes desde la página de presentación, es decir, la
capa de presentación (o Interface) no va a ningún otro archivo, va directamente a la clase
@Controller y comprueba la ruta solicitada en la anotación @RequestMapping escrita antes
de las llamadas al método si es necesario.

@Controller
public class Controlador{}

Esta es una clase de controlador simple que contiene métodos para manejar peticiones
HTTP para diferentes URLs.

@Autowired Esta anotación le indica a Spring dónde debe ocurrir una inyección. Si se lo
coloca en un método, por ejemplo: setMovie, entiende (por el prefijo que establece la
anotación @Autowired) que se necesita inyectar un bean. Spring busca un bean de tipo
Movie y, si lo encuentra, lo inyecta a este método. Sustituye la declaración de los atributos
del bean en el xml. @Autowired se emplea para generar la inyección de dependencia de un
tipo de Objeto que pertenece a una clase con la @Component(@Controller, @Service,
@Repository)

@Autowired
private final PeliculaServicio peliculaServicio;

@Qualifier(«nombreBean»): es una de las anotaciones más prácticas de Spring cuando se


quiere añadir versatilidad a como se realiza un @Autowired en los componentes. Sirve para
indicar que clase es la que se debe inyectar. Con esta anotación podemos indicar el id del
bean que se quiere inyectar, esta anotación se usa cuando el atributo que vamos a inyectar
es una interfaz de la que hay varias implementaciones y entonces será mediante esta
anotación con la que le diremos cual es la clase que queremos inyectar.

16
SPRING MVC ANOTACIONES

También existen otras anotaciones que nos ayudarán con el manejo del patrón de diseño
Spring MVC. Nos darán facilidades para la comunicación entre las vistas, el controlador y los
modelos.

@Controller: esta anotación se repite en este apartado, ya que nos da la posibilidad de


marcar a una clase como un controlador. Esta anotación se utiliza para crear una clase como
controlador web, que puede manejar las solicitudes del cliente y enviar una respuesta al
cliente.

@RequestMapping: La clase Controller contiene varios métodos para manejar diferentes


peticiones HTTP, pero ¿cómo asigna Spring una petición en particular a un método del
controlador en particular? Bueno, eso se hace con la ayuda de la anotación
@RequestMapping. Es una anotación que se especifica sobre un método del controlador.

Proporciona el mapeo entre la ruta de la petición y el método del controlador. También


admite alguna opción avanzada que se puede usar para especificar métodos de controlador
separados para diferentes tipos de petición en el mismo URI como puede especificar un
método para manejar una petición GET y otro para manejar la petición POST.

@Controller
public class Controlador{
@RequestMapping("/")
public String hola(){
return "Hola Spring MVC";
}
}

En este ejemplo, la página de inicio se asignará a este método de controlador. Entonces,


cualquier petición sobre la ruta localhost:8080“/”, irá a este método que devolverá "Hola
Spring MVC".

@GetMapping: esta anotación se utiliza para asignar solicitudes HTTP GET a métodos de
controlador específicos. @GetMapping es una anotación compuesta que actúa como un
acceso directo para @RequestMapping (method = RequestMethod.GET).

@Controller
public class Controlador{
@GetMapping("/")
public String hola(){
return "Hola Spring MVC";
}
}

@PostMapping: esta anotación se utiliza para asignar solicitudes HTTP POST a métodos de
controlador específicos. @PostMapping es una anotación compuesta que actúa como un
acceso directo para @RequestMapping (method = RequestMethod.POST).

17
@Controller
public class Controlador{
@PostMapping("/guardar")
public String guardarUsuario(){
return "Usuario Guardado ";
}
}
@RequestParam: esta es otra anotación Spring MVC útil que se usa para vincular los
parámetros de una petición HTTP a los argumentos de un método controlador. Por ejemplo,
si envía parámetros de un formulario junto con URL para guardar un usuario, el método
puede obtenerlos como argumentos propios.

@GetMapping(“/libro”){
public void mostrarDetalleLibro(@RequestParam("ISBN") String ISBN){
System.out.println(ISBN);
}}
Si accedes a tu aplicación web que proporciona detalles del libro con un parámetro de
consulta(query string) como el siguiente:

http://localhost:8080/libro?ISBN=900848893

Entonces se llamará al método del controlador porque está vinculado a la URL "/libro" y el
parámetro de consulta ISBN se usará para completar el argumento del método con el
mismo nombre "ISBN" dentro del método mostrarDetalleLibro().

De esa manera podemos obtener en nuestro controlador un dato que viaja a través de una
URL, que va a venir de una petición HTTP.

@PathVariable: esta es otra anotación que se utiliza para recuperar datos de la URL. A
diferencia de la anotación @RequestParam que se usa para extraer parámetros de consulta,
esta anotación permite al controlador manejar una petición HTTP con URLs parametrizadas,
estas serían URLs que tiene parámetros como parte de su ruta, por ejemplo:

http://localhost:8080/libro/900848893

Entonces para poder acceder a este detalle que se encuentra en la ruta de la URL, usaríamos
la anotación @PathVariable de la siguiente manera:

@GetMapping(“/libro{ISBN}”){
public void mostrarDetalleLibro(@PathVariable("ISBN") String ISBN){
System.out.println(ISBN);
}
}

La variable Path o variable de ruta se representa entre llaves como {ISBN} en nuestra ruta de
petición, lo que significa que la parte después de /libro se extrae y se completa en el ISBN
del argumento del método, que está anotado con @PathVaraible.

18
SPRING BOOT
Spring Boot es una de las tecnologías dentro del mundo de Spring de las que más se está
hablando últimamente. ¿Qué es y cómo funciona Spring Boot? . Para entender el concepto
primero debemos reflexionar sobre cómo construimos aplicaciones con Spring Framework

Fundamentalmente existen tres pasos a realizar. El primero es crear un proyecto


Maven/Gradle y descargar las dependencias necesarias. En segundo lugar desarrollamos
la aplicación y en tercer lugar la desplegamos en un servidor. Si nos ponemos a pensar un
poco a detalle en el tema, únicamente el paso dos es una tarea de desarrollo. Los otros
pasos están más orientados a infraestructura. No deberíamos tener que estar eligiendo
continuamente las dependencias y el servidor de despliegue.

SPRING INITIALIZER
SpringBoot nace con la intención de simplificar los pasos 1 y 3 y que nos podamos centrar
en el desarrollo de nuestra aplicación. ¿Cómo funciona?. El enfoque es sencillo y lo
entenderemos realizando un ejemplo. Para ello nos vamos a conectarnos al asistente de
Boot que se denomina Spring Initializer.

19
En este caso voy a construir una aplicación Spring MVC y elijo la dependencia web o Spring
Web. Pulsamos generar proyecto y nos descargará un proyecto Maven en formato zip. Lo
descomprimimos y lo abrimos en nuestro IDE, cuando lo vayamos a compilar, Maven se
encargará de descargar todas la dependencias y sumarlas a nuestro proyecto.

Una vez que se termine de descargar nuestro proyecto Maven, se convertirá en proyecto
Spring para poder trabajar, dentro encontraremos la clase EjemploGuiaApplication, se verá
de la siguiente manera:

Esta clase es la encargada de arrancar nuestra aplicación de Spring a diferencia de un


enfoque clásico no hace falta desplegarla en un servidor web ya que Spring Boot provee de
uno. Vamos a modificarla y añadir una anotación.

SERVIDOR LOCAL
Levantar un servidor o tener un servidor a nuestra disposición no es algo fácil, ni barato. Por
suerte Spring Boot nos deja, a través de Apache Tomcat y la clase que vimos previamente
levantar un servidor local.

20
Tomcat nos permite hacer una conexión por red a si mismo, o escuchar a la espera de
conexiones entrantes que se vayan a originar en el mismo dispositivo.

Se usa para desarrollo y pruebas: normalmente como desarrollador montas un servidor web
(apache) y este escucha en el puerto 8080. Entonces lo que hace el desarrollador para
probar las páginas web que esta creando, o las aplicaciones web, o los APIs o servicios, es
apuntar su navegador a http://localhost/ o http://localhost:8080/ para hacer sus pruebas,
cuando el puerto 80 se usa no se requiere especificar, solo cuando es un puerto diferente
se tiene que poner con : después del nombre

Por lo que si tenemos la siguiente clase:

@Controller
public class ControladorHola {
@GetMapping("/")
Public String home() {
return "holaMundo";
}
}

El controlador recibe la petición GET de HTTP con el GetMapping y usando el return, retorna
como respuesta HTTP una pagina HTML como String, con el nombre holaMundo, que dentro
tiene un <p>HolaMundo</p>, también por eso ponemos el método como String.

Entendido esto, vamos a nuestra clase EjemploGuiaApplication y corremos nuestro


proyecto, se nos va a levantar un servidor local, por lo que si vamos a localhost:8080/, nos
encontraremos con la siguiente página:

Programación en Capas
La programación por capas es un estilo de programación en el que el objetivo primordial
es la separación de la lógica de negocios de la lógica de diseño.

La programación por capas es una técnica de ingeniería de software propia de la


programación por objetos, éstos se organizan principalmente en las siguientes capas:

Capa de Interfaz
Esta capa resuelve la presentación de datos al usuario. Esta capa se encarga de “dibujar”
las pantallas de la aplicación al usuario, y tomar los eventos que el cliente genere (por
ejemplo, el hacer click en un botón).

21
Capa de Comunicación
En esta capa están los controladores y es capa responsable de mediar entre la interfaz de
usuario y las capas inferiores. En esta capa contiene el dispatcher encargado de enrutar las
peticiones, así como los controladores de acceso a los servicios web.

Capa de Servicios
Esta capa resuelve la lógica de la aplicación. Contiene los algoritmos, validaciones y
coordinación necesaria para resolver la problemática. Los elementos fundamentales de
esta capa son los objetos de dominio. Estos objetos representan los objetos principales del
negocio. La lógica para manipular los objetos que representan los datos se encuentra en
los llamados objetos de negocio (Service Object).

Capa de Acceso a Datos (Repositorios)


Esta capa resuelve el acceso a datos, abstrayendo a su capa superior de la complejidad
del acceso e interacción con los diferentes orígenes de datos. Esta capa se encarga de
proveer un API simple de usar, orientado al negocio, sin exponer complejidades propias de
un repositorio de datos.

En esta capa se resuelven:

● cualquier acceso a la base de datos


● cualquier acceso a filesystem
● cualquier acceso a otros sistemas
● cualquier acceso a un repositorio de datos en cualquier forma.

THYMELEAF
Thymeleaf es un motor de plantillas, es decir, es una tecnología que nos va a permitir definir
una plantilla y, conjuntamente con un modelo de datos, obtener un nuevo documento, sobre
todo en entornos web. Para saber más sobre Thymelaf, recomendamos meterse en su
documentación: Thymelaf

¿QUE ES EXACTAMENTE UN MOTOR DE PLANTILLAS?


El motor de plantillas (utilizado específicamente aquí para el desarrollo web) se genera para
separar la interfaz de usuario(Vistas), de los datos comerciales(Modelos), puede generar
documentos en un formato específico y el motor de plantillas para el sitio web generará un
estándar Documento HTML.

Las plantillas, o más exactamente los motores de plantillas (templates engines) leen un
fichero de texto, que contiene la presentación ya preparada en HTML, e inserta en él la
información dinámica que le ordena el Controlador, la parte que une la vista con la
información.

Veamos un ejemplo para ver las posibilidades de las plantillas, que no acaban, ni mucho
menos, en la web. La sintaxis a utilizar depende del motor de plantillas utilizado, pero todos
son muy similares. Los motores de plantillas suelen tener un pequeño lenguaje de script que
permite generar código dinámico, como listas o cierto comportamiento condicional, pero
esto también depende del lenguaje.

22
Este lenguaje de script es absolutamente mínimo, lo justo para posibilitar ese
comportamiento dinámico:

<html>
<body>
Hola ${nombre}
<body>
</html>

Esta claro que este ejemplo, que es una pequeña variación del famoso "Hola Mundo", es
bastante simple. Lo que está sucediendo, al procesar este fichero, el motor de plantillas lo
recorrerá, analizará y sustituirá esa “etiqueta clave” ${nombre} por el texto que le hallamos
indicado, el nombre del visitante, por ejemplo, de forma que tengamos una presentación
personalizada.

Básicamente, el motor de plantillas se encarga de recibir, una variable de tipo String llamada
nombre, que se la va a enviar el controlador a la vista y la hará parte del HTML, haciéndolo
dinámico. Por lo que los diferentes usuarios verán diferentes resultados.

VENTAJAS THYMELEAF
Permite realizar tareas que se conocen como natural templating. Es decir, como está basada
en añadir atributos y etiquetas, sobre todo HTML, va a permitir que nuestras plantillas se
puedan renderizar en local, y esa misma plantilla después utilizarla también para que sea
procesada dentro del motor de plantillas. Por lo cual las tareas de diseño y programación se
pueden llevar conjuntamente.

TIPOS DE EXPRESIONES
Permite trabajar con varios tipos de expresiones:

Expresiones variables: Son quizás las más utilizadas, como por ejemplo ${…}

Expresiones de selección: Son expresiones que nos permiten reducir la longitud de la


expresión si prefijamos un objeto mediante una expresión variable, como por ejemplo *{…}

Expresiones de enlace: Nos permiten crear URL que pueden tener parámetros o variables,
como por ejemplo @{…}

EXPRESIONES VARIABLES
Algunos ejemplos de expresiones variables son:

${sesión.usuario.nombre} : Podemos usar la notación de puntos para acceder a las


propiedades de un objeto.

<span th:text=”${libro.autor.nombre}”> : Uno de los atributos que podemos usar


es th:text con diferentes etiquetas HTML, para poder mostrar, por ejemplo, el nombre del
autor de un libro. También podemos navegar entre objetos.

23
<td th:text=”${myObject.myMethod()}”> :También podemos llamar a métodos
definidos en nuestros propios objetos, lo vamos a poder hacer desde las plantillas.

ATRIBUTOS BÁSICOS
Los atributos básicos más conocidos con los que nos podemos encontrar son:

TH:TEXT

th:text: Permite reemplazar el texto de la etiqueta por el valor de la expresión que le


demos.

<p th:text=”${saludo}”>saludo</p>

TH:EACH

th:each: Nos va a permitir repetir tantas veces como se indique o iterar sobre los elementos
de una colección.

<li th:each=”libro : ${libros}”

th:text=”${libro.titulo}”>El Quijote</li>

La plantilla recibe la colección libros, y crea una variable llamada libro que va a ser en algún
momento todos los elementos de nuestra colección, al igual que el for each de Java.
Después, usamos la variable libro para acceder solo al titulo y al th:text para mostrar en el
HTML el titulo en cuestión.

TH:VALUE

En la guía de HTML cuando estudiamos los input, aprendimos que a los input en algunos
casos puede resultarnos interesante asignar un valor definido al campo en cuestión.

Este valor inicial del campo podía ser expresado mediante el atributo value. Thymeleaf nos
ofrece hacer esto pero de manera dinámica, con el atributo th:value, para darle a los input
valores iniciales distintos, dependiendo de que envié el controlador.

<input type="text" name="instituto" th:value="${nombreInstituto}">

Esto nos haría pensar que es el mismo atributo que th:text, pero no, ya que th:text nos
permite darle un valor a cualquier etiqueta de texto, mientras que th:value solo sirve para las
etiquetas input.

TH:IF

A veces, vamos a necesitar que un fragmento de nuestra plantilla solo aparezca cuando se
cumple una determinada condición.

Los atributos th:if y th:unless, nos permiten mostrar un elemento de HTML dependiendo del
resultado de una determinada condición.

24
<td>
<span th:if="${profesor.sexo == 'F'}">Femenino</span>
<span th:unless="${profesor.sexo == 'M'}">Masculino</span>
</td>

Si el valor de profesor.sexo es igual a F, entonces el elemento span va a mostrar la palabra


Femenino.

En cambio, si el valor es M, entonces el elemento muestra la palabra Masculino.

TH:HREF

Sirve para construir URLs que podemos utilizar en cualquier tipo de contexto.

Podríamos utilizarlas para hacer enlaces para URLs que sean absolutas o relativas al propio
contexto de la aplicación, al servidor, al documento, etc.

Estos son unos ejemplos:

<a th:href=”@{order/details}”>…</a>
<a th:href=”@{…/documents/report}”>…</a>
<a th:href=”@{http://www.micom.es/index}”>…</a>

MODELMAP
Ya vimos como, gracias a Thymelaf podemos recibir del controlador una variable y mostrarla
en nuestro HTML, pero, ¿como hacemos para pasar esa variable desde nuestro controlador
a nuestro HTML?

Para resolver este problema vamos a utilizar el objeto ModelMap, este objeto es parte del
paquete org.springframework.ui.ModelMap.

El objeto ModelMap tiene el método addAttribute que nos permite enviar variables nuestro
HTML, la ventaja del objeto ModelMap, es que también nos permite enviar Collecciones a
nuestro HTML.

El método addAttribute(String variable, Objeto nombreObjeto), recibe dos argumentos, una


es variable de tipo String, que va ser el identificador que le vamos a poner al objeto o
colección, que es el identificador con el que va a viajar al HTML y que va a tener que coincidir
con la variable de Thymeleaf, y la otra es el objeto de Java que queremos mandar al HTML .

Pongamos un ejemplo, supongamos que tenemos la siguiente etiqueta en HTML con


Thymeleaf, en el th:text, decimos que va a recibir una variable llamada nombre:

<p>Hola<span th:text=”${nombre}”></p>

En el controlador tendremos el siguiente método:

25
@Controller
public class ControladorHola {
@GetMapping("/")
String home(ModelMap model) {
String nombre = “Fernando”
model.addAttribute(“nombre”, nombre)
return "paginaHTML";
}
}

Como podemos ver en el controlador, recibimos como argumento un ModelMap, esto es


para que podemos recibir cualquier modelo que venga de la petición y para que podamos
enviar los modelos que queramos como respuesta de x peticiones.

Usando model.addAttribute(), pasamos dos cosas, uno el identificador con el que el objeto
va a viajar a la vista, que es “nombre”, recordemos que tiene que coincidir con la variable
de Thymeleaf, y dos pasamos el objeto en sí.

Entonces cuando se llame a este controlador en localhost:8080/, se enviará el modelo


“nombre”, lo recibirá la vista, gracias a Thymelaf y mostrará el nombre Fernando.

26
PREGUNTAS DE APRENDIZAJE
1) ¿Qué significa el acrónimo HTTP?

a) HypertText Translation Protocol


b) HyperText Transport Protocol
c) HyperText Transfer Protocol
d) Ninguna de las anteriores

2) ¿Cual de estos SI es un método de petición?

a) REMOVE
b) UPDATE
c) REFRESH
d) GET

3) ¿En una URL, después del signo de interrogación van los?

a) Parámetros
b) Etiquetas
c) Rutas
d) Ninguna de las anteriores

4) Usualmente usamos el método POST en, ¿qué etiqueta HTML?

a) <ul>
b) <form>
c) <table>
d) <input>

5) ¿Qué indica el código HTTP 200?

a) OK, petición procesada correctamente.


b) Indica al browser que visite otra dirección.
c) Acceso prohibido, por falta de permisos.
d) No encontrado, cuando el documento no existe.

6) ¿Qué indica el código HTTP 500?

a) Indica al browser que visite otra dirección.


b) Acceso prohibido, por falta de permisos.
c) No encontrado, cuando el documento no existe.
d) Error interno en el servidor.

27
7) Maven:
a) Es una herramienta para formatear código
b) Es una herramienta para automatizar tareas
c) Es un IDE para construir aplicaciones web
d) Ninguna de las anteriores

8) ¿Cuál es el nombre del archivo donde de encuentran las dependencias de Maven?

a) Application-context.xml
b) Dependencies-xml
c) Maven.xml
d) Pom.xml

9) Spring Framework es:


a) Un framework para el desarrollo de aplicaciones PHP
b) Un framework para el desarrollo de aplicaciones .net
c) Un framework para el desarrollo de aplicaciones Java
d) Todas las anteriores

10) ¿Spring Framework utiliza qué patrón de diseño?


a) Patrón DAO
b) Patrón DTO
c) Patrón MVC
d) Patrón EVC

11) ¿Qué significa el acrónimo MVC?


a) Modelo Vistas Controlar
b) Modelo Vistas Controlador
c) Mostrar Vistas Controlador
d) Modelo Ver Controlador

12) ¿Cuál de estas NO es una anotación de Spring?

a) @Component
b) @Repository
c) @Table
d) @Autowired

13) ¿Qué anotación usamos para marcar una clase como Controlador?

a) @Service
b) @Controller
c) @Repository
d) @Component

28
14) ¿Qué anotación usamos para marcar una clase como Servicio?

a) @Service
b) @Controller
c) @Repository
d) @Component

15) ¿Qué anotación usamos para marcar una clase como Repositorio?

a) @Service
b) @Controller
c) @Repository
d) @Component

16) ¿Qué anotación usamos para inyectar una clase?

a) @Qualifier
b) @Autowired
c) @Repository
d) @Component

17) ¿Qué anotación usamos marcar que un método de una clase controlador, va a recibir
peticiones GET?

a) @PostMapping
b) @GetMapping
c) @MappingGet
d) @GetPetition

18) La etiqueta RequestParam nos permite obtener datos del URL, pero, ¿de que parte?

a) Parámetros
b) Etiqueta
c) Ruta
d) Ninguna de las anteriores

19) ¿Qué es Thymeleaf?

a) Un motor de vistas
b) Un lenguaje de programación basado en Java
c) Un motor de plantillas
d) Ninguna de las anteriores

20) ¿Cuál de estos NO es un atributo de Thymeleaf?

a) th:text
b) th:each
c) th:if
d) th:else

29
EJERCICIOS DE APRENDIZAJE
Para la realización de este trabajo práctico se recomienda ver todos los videos de Spring,
de esta manera sabemos todos lo que tenemos que hacer, antes de empezar a hacerlo.
Además, podrán encontrar en el siguiente link un GitHub con ejemplos para descargar de
Spring: GitHubSpring

VER VIDEOS:

A) Fundamentos Web
B) Configuración Spring

1. Sistema de Guardado de una Librería Web

El objetivo de este ejercicio consiste en el desarrollo de un sistema web de guardado de


libros en JAVA utilizando una base de datos MySQL, JPA Repository para persistir
objetos y Spring Boot como framework de desarrollo web.

Creación de la Base de Datos MySQL

Crear el esquema sobre el cual operará el sistema de reservas de libros. Para esto, en el
IDE de base de datos que esté utilizando (por ejemplo, Workbench) ejecute la sentencia:

CREATE DATABASE libreria;

Paquetes del Proyecto

Los paquetes que se deben utilizar para el proyecto se deben estructurar de la siguiente
manera:

● vistas: en este paquete se almacenarán aquellas clases que se utilizarán como vistas
con el usuario.
● controladores: en este paquete se almacenarán aquellas clases que se utilizarán para
mediar entre la vista con el usuario y las capas inferiores.
● servicios: en este paquete se almacenarán aquellas clases que llevarán adelante
lógica del negocio.
● repositorios: en este paquete se crearán los repositorios que servirán como interfaces
entre el modelo de objetos y la base de datos relacional.
● entidades: en este paquete se almacenarán aquellas clases que es necesario persistir
en la base de datos.

30
VER VIDEO: Capa de Acceso a Datos

Capa de Datos

Entidades y Repositorios

Crear el siguiente modelo de entidades y los repositorios correspondientes para este


modelo:

Spring utiliza una anotación para identificar aquellas clases que serán entidades y
repositorios. Todas las entidades deben estar marcadas con la anotación @Entity y los
repositorios con la anotación @Repository, los repositorios heredarán la interfaz
JPARepository, que nos dará todos los métodos para persistir, editar, eliminar, etc.

Entidad Libro

La entidad libro modela los libros que están disponibles en la biblioteca para ser
prestados. En esta entidad, el atributo “ejemplares” contiene la cantidad total de
ejemplares de ese libro, mientras que el atributo “prestados” contiene cuántos de esos
ejemplares se encuentran prestados en este momento y el atributo “restantes” tiene
cuando libros nos quedan para prestar. El repositorio que persiste a esta entidad
(LibroRepositorio) debe contener los métodos necesarios para guardar/actualizar libros
en la base de datos, realizar consultas o dar de baja según corresponda.

Entidad Autor

La entidad autor modela los autores de libros. El repositorio que persiste a esta entidad
debe contener todos los métodos necesarios para guardar en la base de datos, realizar
consultas y eliminar o dar de baja según corresponda. El repositorio que persiste a esta
entidad (AutorRepositorio) debe contener los métodos necesarios para
guardar/actualizar un cliente en la base de datos, realizar consultas o dar de baja según
corresponda.

31
Entidad Editorial

La entidad editorial modela las editoriales que publican libros. El repositorio que persiste
a esta entidad (EditorialRepositorio) debe contener los métodos necesarios para
guardar/actualizar una editorial en la base de datos, realizar consultas o dar de baja
según corresponda.

VER VIDEOS:

A. Capa de Servicios
B. Modelo Vista Controlador

Capa de Servicios

Spring utiliza una anotación para identificar aquellas clases que serán servicios. Todos
los servicios deben estar marcados con la anotación @Service.

LibroServicio

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para administrar libros (consulta, creación, modificación y dar de baja).

AutorServicio

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para administrar autores (consulta, creación, modificación y dar de baja).

EditorialServicio

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para administrar editoriales (consulta, creación, modificación y dar de baja).

Capa de Comunicación

Spring utiliza una anotación para identificar aquellas clases que serán controladores.
Todos los controladores deben estar marcadas con la anotación @Controller. Algunos
de los controladores a desarrollar son los siguientes.

LibroController

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para operar con la vista del usuario diseñada para la gestión de libros (guardar/modificar
libro, listar libros, dar de baja).

AutorController

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para operar con la vista que gestiona los autores (guardar/actualizar, listar autores, dar
de baja).

32
EditorialController

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para operar con las vistas que gestiona editoriales (guardar/modificar, listar editoriales,
dar de baja).

Capa de Vistas

Esta capa tiene la responsabilidad de llevar adelante las funcionalidades necesarias para
interactuar con el usuario. Las vistas para este proyecto tienen que estar desarrolladas
en HTML5 y se debe utilizar la biblioteca Thymeleaf y CSS para implementar las plantillas.
Además, se debe utilizar el framework de Bootstrap para los componentes.

Se deben diseñar y crear todas las vistas web necesarias para llevar a cabo las siguientes
funcionalidades:

- Administrar Autores: cargar datos de un autor, modificar datos, listar autores y dar de
baja

- Administrar Editoriales: cargar los datos de una editorial, modificar los datos, listar
editoriales y dar de baja.

- Administrar Libros: cargar datos de un nuevo libro, modificar datos, listar libros, y dar
de baja.

A continuación, se muestran algunos ejemplos para el módulo de Administración de


Autores.

a) Listar Autores

b) Cargar Autor

33
EJERCICIOS EXTRAS
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos pueden
realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que venimos
trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas, podes
continuar con estos ejercicios extra, recordando siempre que no es necesario que los
termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es ayudar
a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es que puedas
explicar el ejercicio con la intención de que tu compañero lo comprenda, y no sólo mostrarlo.
¡Muchas gracias!

1. Sistema de Reservas: Librería Web

El objetivo de este ejercicio consiste en, utilizando las clases del ejercicio/proyecto
anterior, el desarrollo de un sistema web de reserva de libros en JAVA.

Creación de la Base de Datos MySQL

Usaremos la misma base de datos y se van a crear las tablas que nos faltan.

Capa de Datos

Entidades y Repositorios

Deberemos sumar las Entidades Cliente y Préstamo para que nos quede el siguiente
modelo:

34
Spring utiliza una anotación para identificar aquellas clases que serán entidades y
repositorios. Todas las entidades deben estar marcadas con la anotación @Entity y los
repositorios con la anotación @Repository.

Entidad Cliente

La entidad cliente modela los clientes (a quienes se les presta libros) de la biblioteca. Se
almacenan los datos personales y de contacto de ese cliente. El repositorio que persiste
a esta entidad (ClienteRepositorio) debe contener los métodos necesarios para
guardar/actualizar un cliente en la base de datos, realizar consultas o dar de baja según
corresponda.

Entidad Préstamo

La entidad préstamo modela los datos de un préstamo de un libro. Esta entidad registra
la fecha en la que se efectuó el préstamo y la fecha en la que fue devuelto el libro, al
devolver el libro este préstamo queda dado de baja. Esta entidad también registra el
libro que se llevaron en dicho préstamo y quien fue el cliente al cual se lo prestaron.

El repositorio que persiste a esta entidad (PrestamoRepositorio) debe contener los


métodos necesarios para registrar un préstamo en la base de datos, realizar consultas y
realizar devoluciones, etc.

Capa de Servicios

Spring utiliza una anotación para identificar aquellas clases que serán servicios. Todos
los servicios deben estar marcados con la anotación @Service. Los servicios que faltan
en nuestro proyecto son:

ClienteServicio

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para administrar clientes (consulta, creación, modificación y dar de baja).

PrestamoServicio

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para administrar préstamos (consulta, préstamo, modificación y dar de baja).

Capa de Comunicación

Spring utiliza una anotación para identificar aquellas clases que serán controladores.
Todos los controladores deben estar marcadas con la anotación @ Controller. Algunos
de los controladores a desarrollar son los siguientes. Los controlades que faltan en
nuestro proyecto son:

ClienteController

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para operar con la vista que gestiona clientes (guardar/modificar, listar clientes,
eliminación).

35
PrestamoController

Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para operar con la vistas o portal para gestionar préstamos (guardar/modificar, listar
préstamos realizados, devolución, eliminación).

Capa de Vistas

En la capa de vistas vamos a tener que diseñar y crear todas las vistas web necesarias
para llevar a cabo las siguientes funcionalidades:

- Administrar clientes: cargar datos de los clientes que desean pedir prestado un libro,
modificar datos de los clientes, realizar listados y eliminar clientes.

- Realizar Préstamos: cargar los datos de un préstamo. Tener en cuenta que para
realizar un préstamo se deben incluir los libros a prestar y el cliente asociado.
Modificar un préstamo (por ejemplo, renovar la fecha de devolución), listar préstamos
realizados, etc.

2. Sistema de Estancias en el Extranjero Web

El objetivo de este ejercicio consiste en el desarrollo de un sistema web para una


pequeña empresa que se dedica a organizar estancias en el extranjero dentro de una
familia. El sistema debe registrar la reserva de casas por parte de los clientes que
desean realizar alguna estancia. El objetivo es el desarrollo de un sistema web de
reservas de casas para realizar estancias en el exterior, utilizando el lenguaje JAVA, una
base de datos MySQL, el framework de persistencia JPA y Spring Boot como
framework de desarrollo web.

Creación de la Base de Datos MySQL

Crear el esquema sobre el cual operará el sistema de reservas de casas. Para esto, en
el IDE de base de datos que esté utilizando (por ejemplo, Workbench) se debe ejecutar
la sentencia:

CREATE DATABASE estancias;

De esta manera se creará una base de datos vacía llamada estancias.

Paquetes del Proyecto

En este proyecto se debe utilizar la misma estructura de capas que en el ejercicio


anterior.

36
Capa de Datos

Entidades y Repositorios

Crear el siguiente modelo de entidades y agregar los repositorios correspondientes.


Todas las entidades deben estar marcadas con la anotación @Entity y los repositorios
con la anotación @Repository.

Entidad Usuario
La entidad usuario modela los datos de un usuario que accede al sistema para
registrarse como familia y ofrecer una habitación de su casa para estancias, o bien,
como un cliente que necesita realizar una reserva. De cada usuario se debe registrar el
nombre de usuario (alias), el correo electrónico, el password y la fecha de alta. El
repositorio que persiste a esta entidad (UsuarioRepositorio) debe contener los métodos
necesarios para registrar el usuario en la base de datos, realizar consultas y eliminar.

Entidad Familia
La entidad familia modela las familias que habitan en diferentes países y que ofrecen
alguna de las habitaciones de su hogar para acoger a algún chico (por un módico
precio). De cada una de estas familias se conoce el nombre, la edad mínima y máxima
de sus hijos, número de hijos y correo electrónico. El repositorio que persiste a esta
entidad (FamiliaRepositorio) debe contener los métodos necesarios para
guardar/actualizar los datos de las familias en la base de datos, realizar consultas y
eliminar o dar de baja según corresponda.

37
Entidad Casa
La entidad casa modela los datos de las casas donde las familias ofrecen alguna
habitación. De cada una de las casas se almacena la dirección (calle, numero, código
postal, ciudad y país), el periodo de disponibilidad de la casa (fecha_desde,
fecha_hasta), la cantidad de días mínimo de estancia y la cantidad máxima de días, el
precio de la habitación por día y el tipo de vivienda. El repositorio que persiste a esta
entidad (CasaRepositorio) debe contener los métodos necesarios para
guardar/actualizar los datos de una vivienda, realizar consultas y eliminar.

Entidad Cliente
La entidad cliente modela información de los clientes que desean mandar a sus hijos a
alguna de las casas de las familias. Esta entidad es modelada por el nombre del cliente,
dirección (calle, numero, código postal, ciudad y país) y su correo electrónico. El
repositorio que persiste a esta entidad (ClienteRepositorio) debe contener los métodos
necesarios para guardar/actualizar los datos de un cliente, realizar consultas y eliminar.

Entidad Reserva
La entidad reserva modela los datos de las reservas y estancias realizadas por alguno
de los clientes. Cada estancia o reserva la realiza un cliente, y además, el cliente puede
reservar varias habitaciones al mismo tiempo (por ejemplo para varios de sus hijos),
para un periodo determinado (fecha_llegada, fecha_salida). El repositorio que persiste a
esta entidad (ReservaRepositorio) debe contener los métodos necesarios para realizar
una reserva, actualizar los datos (por ejemplo, fecha de la reserva), realizar consultas de
las reservas realizadas para una determinada vivienda y eliminar reserva.

Entidad Comentario
La entidad comentario permite almacenar información brindada por los clientes sobre
las casas en las que ya han estado. El repositorio que persiste a esta entidad
(ComentarioRepositorio) debe contener los métodos necesarios para guardar los
comentarios que realizan los clientes sobre una determinada una vivienda.

Capa de Servicios

Utiliza la anotación @Service para identificar aquellas clases que serán servicios. Todos
los servicios deben estar marcados con esta anotación.

UsuarioServicio
Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias
para administrar usuarios (alta de usuario, consultas, y baja o eliminación).

FamiliaServicio
Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias
para administrar familias (creación, consulta, modificación y eliminación).

CasaServicio
Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias
para administrar las casas (creación, consulta, modificación y eliminación).

ClienteServicio
Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias
para administrar clientes (creación, consulta, modificación y eliminación).

38
ReservaServicio
Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias
para realizar las reservas de viviendas (reservar, consultar reservas realizadas,
modificación y eliminación).

Capa de Comunicación

Spring utiliza una anotación para identificar aquellas clases que serán controladores.
Todos los controladores deben estar marcadas con la anotación @Controller. Algunos
de los controladores a desarrollar son los siguientes.

UsuarioController
Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias
para operar con la vista del usuario diseñada para la gestión de usuarios (dar de alta un
usuario, cambiar clave, listar usuarios registrados, dar de baja un usuario).

FamiliaController
Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias
para operar con la vista del usuario diseñada para la gestión de familias
(guardar/modificar datos de la familia, listar familias, eliminar).

CasaController
Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias
para operar con la vista del usuario diseñada para la gestión de viviendas
(guardar/modificar datos de la casa, listar viviendas, eliminar).

ClienteController
Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias
para operar con la vista del usuario diseñada para la gestión de clientes
(guardar/modificar, listar clientes, eliminar).

ReservaController
Esta clase tiene la responsabilidad de llevar adelante las funcionalidades necesarias
para operar con la vista o portal para gestionar reservas de estancias
(guardar/modificar, listar estancias reservadas/realizadas, eliminación).

Capa de Vista

Esta capa tiene la responsabilidad de llevar adelante las funcionalidades necesarias


para interactuar con el usuario. Las vistas para este proyecto tienen que estar
desarrolladas en HTML5 y se debe utilizar la biblioteca Thymeleaf y CSS para
implementar las plantillas.

Se deben diseñar y crear todas las vistas web necesarias para llevar a cabo las
siguientes funcionalidades:

- Administrar usuarios: registrar nuevos usuarios en el sistema, cambiar clave, listar


usuarios, dar de baja o eliminar.

- Administrar familias: cargar datos de una familia, modificar datos, consultar familias,
eliminar familias que no ofrecen más sus viviendas para estancias. Las familias deben
darse de alta una vez que hayan sido registradas como usuario.

39
- Administrar casas: cargar los datos de una vivienda y asociar a la familia
correspondiente, modificar los datos (por ejemplo, fechas en las cuales se encuentra
disponible), listar casas (país, el periodo de disponibilidad, cantidad de días mínima y
máxima de estancia, el precio de la habitación por día, el tipo de vivienda y el nombre
del propietario). Se debe eliminar los datos de una casa cada vez que se da de baja la
familia propietaria.

- Administrar clientes: cargar datos de los clientes que desean reservar una habitación
para realizar una estancia, modificar datos de los clientes, realizar consultas y eliminar
clientes. Al igual que las familias, un cliente puede darse de alta una vez que se haya
creado el usuario correspondiente.

- Realizar Reservas: El portal principal debería permitir que una persona que ingresa a
la web pueda consultar las viviendas que se encuentran disponibles para realizar
estancias (validando fechas disponibles). Una vez que el usuario encuentra una
vivienda que se adecua a sus preferencias y quiere realizar una reserva, recién en ese
momento se solicita que se registre como usuario y luego se procede a realizar la
reserva.

o Cuando el usuario se registra se le debe dar la opción de elegir si se quiere


registrar como familia que ofrece una vivienda o como cliente. Dependiendo
de la opción elegida se pide que complete los datos correspondientes (familia
o cliente) para continuar con su registro.
o Si el usuario ya se encuentra restirado entonces debe realizar el login para
poder continuar.
o Se debe tener en cuenta que para realizar una reserva la vivienda no debe
estar ya reservada por otro cliente.
o Se debe permitir que un cliente modifique su reserva, por ejemplo: cambiar las
fechas, o la elimine en caso de no poder realizarla.
o Se deben poder listar las reservas realizadas por parte de los clientes.

40
BIBLIOGRAFÍA
- https://www.ionos.es/digitalguide/hosting/cuestiones-tecnicas/protocolo-http/

- https://www.ionos.es/digitalguide/hosting/cuestiones-tecnicas/http-request/

- https://www.ionos.es/digitalguide/hosting/cuestiones-tecnicas/una-mirada-a-los-
codigos-de-estado-http-mas-comunes/

- https://edytapukocz.com/url-partes-ejemplos-facil/

- https://howtodoinjava.com/maven/maven-dependency-management/

- http://chuwiki.chuidiang.org/index.php?title=Dependencias_con_maven

- https://www.arquitecturajava.com/que-es-spring-framework/

- https://programandoointentandolo.com/2013/05/inyeccion-de-dependencias-en-
spring.html

- https://proitcsolution.com.ve/inyeccion-de-dependencias-spring/

- https://www.java67.com/2019/04/top-10-spring-mvc-and-rest-annotations-
examples-java.html

- https://www.danvega.dev/blog/2017/03/27/spring-stereotype-annotations/

- https://www.arquitecturajava.com/spring-stereotypes/

- https://www.arquitecturajava.com/que-es-spring-boot/

- https://openwebinars.net/blog/que-es-thymeleaf/

41

También podría gustarte