FullStack EGG 21 Guia Completa Del Curso
FullStack EGG 21 Guia Completa Del Curso
FullStack EGG 21 Guia Completa Del Curso
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
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.
Integrador
MYSQL
Guia 1 • Aprender a hacer consultas con WHERE, ORDER BY y JOIN
JAVA + MYSQL
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
HTML
SPRING
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.
• 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.
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.
• Un algoritmo debe ser correcto: el resultado del algoritmo debe ser el resultado
esperado.
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.
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.
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
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:
5
✓ Instrucciones de lectura, se utilizan para leer datos de un dispositivo de entrada y se
asignan a las variables.
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
✓ Real: números con cifras decimales. Para separar decimales se utiliza el punto. Ejemplo:
3.14
Notas:
✓ Cadena y Carácter son términos equivalentes, no genera error que las escribamos
indistintamente.
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:
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
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:
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.
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:
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
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.
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.
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.
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:
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.
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 Y
11
Operador O
Operador NO
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
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
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
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
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
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
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
16
Ejercicios de aprendizaje
Primero tenemos que tener descargado Pseint, para descargalo haga click aquí:
http://pseint.sourceforge.net/?page=descargas.php.
Pero antes de empezar, recomendamos leer este breve inciso sobre como encararemos la
resolución de los siguientes ejercicios / programas.
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.
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
17
Básicamente, tomamos un problema grande y general para convertirlo en pequeños
problemas más concretos y fáciles de afrontar.
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.
• Leer Radio
• Calcular Superficie : PI * radio ^ 2
• Calcular Longitud : 2 * PI * radio
• Escribir resultados
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.
• 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.
• Tener paciencia y entender que con el tiempo y con practica, iremos aprendiendo
que necesitamos para resolver estos problemas de manera más sencilla.
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
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.
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
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.
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
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.
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.
Pseudocódigo en PSeInt:
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:
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:
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.
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.
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:
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
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:
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
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.
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:
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
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
Invocación a un Subprograma
Un procedimiento puede ser llamado de la siguiente forma:
nombre(argumentos)
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
donde PA1, PA2, ..., PAn son los parámetros y ARG1, ARG2, ..., ARGn son los argumentos.
2
En PSeInt todas las variables que pasemos como argumentos pasan por defecto
“Por Valor” sino se especifica lo contrario explícitamente.
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
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:
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
@ # $ % *
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.
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
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.
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.
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.
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
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.
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.
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:
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.
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
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
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
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
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.
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 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;
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
}
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: 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.
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.
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>;
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).
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).
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'.
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.
byte 0
short 0
int 0
long 0
float 0.0
7
double 0.0
boolean false
char '\u0000'
String null
Objetos null
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
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 de Incremento.
-- Operador de Decremento.
== Igual
!= Distinto
9
>= Mayor o igual que
Operadores Condicionales
&& AND
|| OR
?: Ternario
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:
10
✓ Instrucciones de escritura, se utilizan para escribir o mostrar mensajes o contenidos de
las variables en un dispositivo de salida.
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:
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”);
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”);
• 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().
int numero;
numero = leer.nextInt();
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
if(<condición>){
<sentencias>
}
if(<condición>){
<sentencias A>
} 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>
}
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.
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
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:
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.
Sentencias de Salto
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
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.
/*
* Bloque de instrucciones
*/
return valor;
}
/*
* Bloque de instrucciones
*/
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.
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.
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;
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
vector[i] = 5;
matriz[i][j] = 6;
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 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.
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.
21
concat(String str) Concatena la cadena del parámetro al final de la
primera 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
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
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);
Ejemplo:
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.
23
max(double a, double b) Devuelve el mayor de dos valores double
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.
Por lo tanto, para generar un número entero entre 0 y 9, hay que escribir la siguiente
sentencia:
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
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
25
8) El double se aplica para datos tipo:
a) Entero
b) Decimal
c) Carácter
d) Ninguno de los anteriores
PREGUNTAS EXTRA:
Investigar la documentación de la clase System y responder:
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.
Lo primero que haremos será instalar Java en nuestras computadoras. Para ello debemos
descargarlo a través del siguiente link:
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
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.
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.
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
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().
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:
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.
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.
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
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).
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
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:
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:
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!
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.
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”.
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:
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.
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:
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:
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:
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.
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.
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.
// 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;
A partir de este momento los objetos ya pueden ser referenciados por su nombre.
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.
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:
• <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.
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:
<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.
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:
<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:
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.
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.
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.
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.
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.
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.
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(int dia, int mes, int año) Constructor que inicializa la fecha sumándole 1900 al año.
12
getMonth() Retorna el mes de la fecha.
13
PREGUNTAS DE APRENDIZAJE
1) Responda Verdadero (V) o Falso (F)
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
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?
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
a) Atributos de objeto
b) Atributos de clase estáticos
c) Variables finales
d) Ninguna de las anteriores
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
VER VIDEOS:
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:
3. Crear una clase llamada Operacion que tenga como atributos privados numero1 y
numero2. A continuación, se deben crear los siguientes métodos:
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.
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
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:
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.
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.
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:
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.
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
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.
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:
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:
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:
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:
¡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:
24
----------------------------------------------
----------------------------------------------
----------------------------------------------
25
Bibliografía
Información sacada de libros:
- 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.
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.
• 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:
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.
Listas:
numeros.add(num);
3
Conjuntos:
numeros.add(20);
Mapas:
alumnos.put(dni, nombreAlumno);
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.
For Each:
Listas:
4
Conjuntos:
Mapas:
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.
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:
lista.add("A");
lista.add("B");
while (iterator.hasNext())
System.out.println();
}
Conjuntos:
Iterator<Integer> it = hashEnteros.iterator();
while (it.hasNext()) {
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.
estudiantes.remove(llaveABorrar)
Listas:
Collections.sort(numeros);
Conjuntos:
Collections.sort(numerosLista);
Mapas:
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.
Listas:
libros.add(libro);
Conjuntos:
perros.add(perro);
Mapas:
alumnos.put(dni, alumno);
8
Ejemplo:
libros.add(libro);
System.out.println(libro);
Cuando queremos mostrar el libro, que está siendo recorrido por el for each, nos mostraria
algo asi: Libreria.Libro@14ae5a5
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:
libro.setTitulo(“La Odisea”);
libros.add(libro);
System.out.println(libro);
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:
@Override
return p2.getEdad().compareTo(p1.getEdad());
};
• 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:
Conjuntos:
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.
perros.add(perro);
Mapas:
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:
numeros.add(20)
11
Main
Conjuntos:
palabras.add(“Hola”)
Main
Mapas:
alumnos.add(1, “Pepe”);
Main
Listas:
numeros.add(20);
Conjuntos:
palabras.add(“Hola”)
return palabras }
12
Mapas:
alumnos.add(1, “Pepe”);
return alumnos;
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.
reverse(List<T> lista) Este método invierte el orden de los elementos de una lista.
Listas y Conjuntos:
Método Descripción.
14
remove(elemento) Este método remueve un elemento de una lista
Mapas:
Método Descripción.
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
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
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.
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.
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:
Nota: recordar el uso del Comparator para ordenar colecciones con objetos.
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.
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.
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.
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.
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
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.
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:
Libro
-String titulo
-Integer ejemplares
+void préstamo()
+void devolución()
<<interface>>
Interfaz
+void método()
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:
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
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
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
a) Método
b) Constructor
c) Atributo que es un objeto de otra clase
d) Ninguna de las anteriores
6) En base al siguiente código. ¿Qué afirmación describe mejor la relación entre estas dos
clases?
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
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.
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:
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.
• 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
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.
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.
• 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ó.
• 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.
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.
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 {
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.
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 {
this.nombre = nombre;
this.edad = edad;
this.documento = 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 {
@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.
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
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.
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
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.
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.
6
public class Clase implements Interfaz {
@Override
Public void metodo(){
7
PREGUNTAS DE APRENDIZAJE
1) ¿Qué palabra se usa para generar la herencia entre clases?
a) implements
b) super
c) this
d) extends
a) Madre
b) Hija
c) Nieta
d) Es una interfaz
a) Atributos
b) Métodos
c) Getter/Setters
d) Constructores
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
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
a) implements
b) super
c) this
d) extends
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
• Un constructor vacío.
• Un constructor con todos los atributos pasados por parámetro.
Los métodos a implementar son:
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:
E $300
F $100
• 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:
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.
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.
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.
2. Crear una superclase llamada Edificio con los siguientes atributos: ancho, alto y
largo. La clase edificio tendrá como métodos:
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.
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á.
Donde:
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.
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:
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.
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.
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
BloqueCatch
BloqueCatch
try {
int division = 10 / 0;
} catch (ArithmeticException a) {
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.
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
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
MensajeDeError
MensajeDeError
} finally {
CodigoFinal
5
try {
int division = 10 / 0;
} catch (ArithmeticException a) {
} finally {
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.
Bloque de instrucciones
6
// Tenemos un método que devuelve un resultado y que tira una ArithmeticException
int division;
division = 20 / 0;
return division;
Main
try {
System.out.println(division());
} catch (ArithmeticException a) {
La palabra throw
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.
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
if(lista.contains(numero){
lista.add(numero);
Main
try{
agregarNumeroLista(lista, 1);
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
a) Del código
b) De la Maquina Virtual de Java
c) De Netbeans
d) Ninguna de las anteriores
a) Finally
b) Throws
c) Try Catch
d) Throw
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
a) Finally
b) Throws
c) Try Catch
d) Throw
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
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).
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
}
}
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{
int valor=0;
try {
valor = valor+1;
} catch (NumberFormatException e) {
11
Valor = valor + Integer.parseInt(”42”);
} finally {
valor = valor + 1;
return valor;
try {
System.out.println (metodo()) ;
}catch(Exception e) {
System.err.println(”Excepcion en metodo() ”) ;
e.printStackTrace();
class Dos{
int valor=0;
try{
valor = valor + 1;
valor = valor + 1;
} catch ( NumberFormatException e ) {
} finally {
valor = valor + 1;
12
}
valor = valor + 1;
return valor;
try{
System.out.println ( metodo ( ) ) ;
} catch(Exception e) {
e.printStackTrace();
class Tres{
int valor=0;
try{
valor = valor + 1;
valor = valor + 1;
} catch(NumberFormatException e) {
} finally{
valor = valor + 1;
valor = valor + 1;
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();
class C {
sentencia_c1
try {
sentencia_c2
sentencia_c3
sentencia_c4
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!
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.
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.
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.
15
En esta primera etapa con una armadura podremos: caminar, correr, propulsar, volar,
escribir y leer.
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.
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.
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.
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.
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.
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.
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.
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).
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
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.
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.
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).
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.
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.
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
Insertar en las filas los datos a las diferentes tablas, sin violar
3
la integridad de los datos. Sentencia SQL à INSERT INTO
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
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.
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.
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.
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
9
Siendo acción una de las siguientes:
• RENAME TO nuevo_nombre
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.
• 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.
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
nombre_columna2 = valor2,
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.
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.
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.
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.
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.
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.
1 Agustín Cocco 24
2 Martin Bullon 21
3 Agustín Cocco 18
Nombre Apellido
Agustín Cocco
Martin Bullon
2. WHERE
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.
1 Agustín Cocco 24
2 Martin Bullon 21
13
El resultado que mostraría sería:
Nombre Apellido
Agustín Cocco
OPERADORES RELACIONALES
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
Los operadores lógicos sirven para filtrar resultados basados en más de una condición.
14
OPERADORES PROPIOS DE SQL
a) BETWEEN
Usamos edad pero puede ser cualquier valor numérico o valor de tipo cadena.
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:
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.
Usamos nombre pero puede ser cualquier valor numérico o valor de tipo cadena.
15
Id Nombre Apellido Edad
1 Agustín Cocco 24
2 Martin Bullon 15
3 Mariela Lima 20
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.
Esa consulta, lo que hace es traer todos los alumnos donde el nombre empiece con el
carácter s.
1 Sebastián Gómez 24
2 Sabrina Martínez 15
3 Mariela Lima 20
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.
En este caso mostraría los resultados ordenados de manera ascendiente, según el nombre
de los alumnos.
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:
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.
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.
a) MAX
18
El resultado que mostraría sería:
MAX(Salario)
2000
b) MIN
MIN(Salario)
1000
c) AVG
19
El resultado que mostraría sería:
AVG(Salario)
1325
d) COUNT
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.
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.
Id Nombre Salario
1 Franco 1000
2 Mariela 2000
3 Franco 1000
4 Mariela 2000
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.
Id Nombre Pais
1 Franco Argentina
2 Juliana Alemania
3 Agustín Argentina
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.
Id Nombre Pais
1 Franco Argentina
2 Juliana Alemania
3 Agustín Argentina
4 Gastón Alemania
5 Mariela Uruguay
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
22
Teniendo la siguiente tabla de alumnos:
1 Jerónimo Wiunkhaus 24
2 Ana Gadea 15
3 Mariela Lima 20
Ana Gadea
Jerónimo Wiunkhaus
Mariela Lima
Todas estas clausulas / sentencias pueden ser usadas juntas, no es necesario que las usen
separadas.
7. ROUND
Las sentencia round sirve para redondear los decimales de un numero que se pida en un
select.
AVG(Salario)
1325,55
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.
1 Jerónimo Wiunkhaus 24
2 Ana Gadea 15
3 Mariela Lima 20
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.
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;
1 Agustín Oviedo 24
2 Ana Gadea 15
3 Mariela Lima 20
4 Emiliano Chirino 30
1 Curso de 1000 1
Programación
2 Curso de Mecánica 2000 2
Nombre Nombre_curso
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;
1 Agustín Oviedo 24
2 Ana Gadea 15
3 Mariela Lima 20
4 Francisco Chirino 21
1 Curso de 1000 1
Programación
2 Curso de Mecánica 2000 2
Nombre Nombre_curso
Mariela 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
1 Agustín Oviedo 24
2 Ana Gadea 15
3 Mariela Lima 20
4 Francisco Chirino 21
1 Curso de 1000 1
Programación
2 Curso de Mecánica 2000 2
Nombre Nombre_curso
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.
Salario Medio
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
Las foreign keys o llaves foráneas son campos que vinculan una tabla ( ) ( )
con la clave primaria o externa de otra tabla.
El comando DROP se utiliza para eliminar todas las filas de una tabla. ( ) ( )
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
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
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()
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.
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:
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.
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:
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:
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.
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.
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:
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:
39
Consultas multitabla (Composición interna)
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
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)
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.
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.
1. java.sql.*;
2. javax.sql.*;
• 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.
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.
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";
• 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.
3
El siguiente código muestra un ejemplo de conexión y obtención de datos en JDBC a una
base de datos MySQL:
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:
El objeto Connection representa el contexto de una conexión con la base de datos, es decir:
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);
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:
• 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);
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.
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:
Date:
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.
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
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:
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.
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.
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.
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) Objetos
b) Clases e Interfaces
c) Métodos
d) Solo Clases
a) El JDBC Driver
b) Java
c) La base de datos
d) Ninguna de las anteriores
a) java.jdbc.sql.*;
b) java.mysql.*;
c) java.sql.jdbc*;
d) java.sql*;
a) Statement
b) ResultSet
c) Connection
d) MetaData
a) Statement
b) ResultSet
c) Connection
d) DriverManager
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
a) Statement
b) ResultSet
c) Connection
d) DriverManager
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:
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.
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:
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:
b) Lista los nombres y los precios de todos los productos de la tabla producto.
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).
• 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.
• El sistema debe también almacenar información brindada por los clientes sobre las
casas en las que ya han estado (comentarios).
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.
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:
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:
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.
Query: Es una interface para obtener la relación de objetos que cumplen un criterio
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:
@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)
@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.
@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;
}
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.
@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 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:
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.
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.
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;
@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.
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.
// 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()
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();
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.
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:
CLAUSULA WHERE
La sintaxis es muy similar a SQL, pero JPQL admite solo un pequeño subconjunto de las
características de SQL.
Operadores:
• Igual: author.id = 10
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.
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.
12
PREGUNTAS DE APRENDIZAJE
1) ¿Que significa el acrónimo JPA?
a) Objetos
b) Clases e Interfaces
c) Métodos
d) Solo Clases
3) La anotación @Entity:
4) La anotación @Id:
5) La anotación @Column:
6) 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
a) Persistence
b) EntityManagerFactory
c) EntityManager
d) DriverManager
a) Persist()
b) Merge()
c) Remove()
d) Find()
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:
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:
Los paquetes que se utilizarán para este proyecto son los siguientes:
15
a) 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
Entidad Editorial
b) Unidad de Persistencia
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
c) Servicios
AutorServicio
EditorialServicio
LibroServicio
17
d) Main
e) Tareas a Realizar
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!
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
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
PrestamoServicio
c) Tareas a Realizar
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.
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.
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.
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.
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.
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
INSTALACIÓN DE GIT
Una vez que tenemos creado un repositorio en GitHub vamos a tener que instalar 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.
https://sourceforge.net/projects/git-osx-installer/files/
4
B. Sigue las instrucciones para instalar Git.
git --version:
$ git --version
git version 2.9.2
Homebrew instala una lista de paquetes útiles que no vienen preinstalados en Mac.
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 .
git --version:
$ git --version
git version 2.9.2
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:
Recuerde sustituir el texto entre comillas por su nombre real. Ahora indique el correo
electrónico del usuario para git:
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:
...
color.diff=auto
color.status=auto
...
user.name=Juan Perez
[email protected]
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.
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
Git Status
El comando de git status nos da toda la información necesaria sobre la rama actual.
git status
7
Nota: veremos el concepto de ramas más adelante.
Git Add
Necesitamos usar el comando git add para incluir los cambios del o de los archivos en tu
siguiente commit.
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.
También necesitamos escribir un mensaje corto para explicar qué hemos desarrollado o
modificado en el código fuente.
8
Hacemos un commit para guardar nuestro txt y le ponemos un mensaje que explique que
hemos hecho.
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.
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:
De todas formas, si tu rama ha sido creada recientemente, puede que tengas que cargar y
subir tu rama con el siguiente comando:
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.
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.
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.
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.
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.
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:
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.
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:
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.
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:
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".
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:
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.
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:
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.
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.
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.
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.
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
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.
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.
Sin embargo, hay algunas cosas que hay que tener en cuenta para que ese ejemplo sea
cierto:
• 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.
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:
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.
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:
21
5. Da clic en Invitar un colaborador.
22
PREGUNTAS DE APRENDIZAJE
1) ¿Qué es Git?
2) ¿Qué es GitHub?
a) Git clone
b) Git commit
c) Git init
d) Git status
a) Git help
b) Git add
c) Git info
d) Git status
a) Git add
b) Git clone
c) Git status
d) Git init
a) Git clone
b) Git save
c) Git commit
d) Git add
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
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
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:
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:
3. Para el siguiente ejercicio, van a tener que trabajar en equipo, con sus compañeros de
mesa.
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
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.
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.
Si quieres especificar que se trata de un párrafo, podrías encerrar el texto con la etiqueta
de párrafo (<p>):
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.
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:
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">
</head>
<body>
</body>
</html>
Tienes:
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.
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.
Donde:
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
class="texto" Establece la clase CSS que se aplica a los estilos del elemento
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.
<br>
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.
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.
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.
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.
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.
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 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.
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.
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.
• 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í:
<ul>
<li>Argentina</li>
<li>Perú</li>
<li>Chile</li>
</ul>
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:
• 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:
<ol>
</ol>
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.
<ol type="1">
<li>Elemento 1 </li>
</ol>
<ol type="a">
<li>Elemento a </li>
</ol>
<li>Elemento x </li>
</ol>
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:
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.
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".
<a href="destino">contenido</a>
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.
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>
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.
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.
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.
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.
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:
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.
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">
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.
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.
<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>
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.
• 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">
<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.
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.
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.
Entonces con todo lo anterior ya explicado, la etiqueta completa nos quedaría así:
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.
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í:
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:
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).
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:
placeholder: este atributo especifica una pequeña pista que describe el valor esperado de
para el campo (input).
Nota: recordemos que todos estos ejemplos de input deben ir entre las etiquetas de
apertura y de cierre form.
<form>
</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:
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:
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:
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.
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.
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>
Esta estructura puede verse modificada principalmente a partir de otros dos atributos:
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.
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:
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í:
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.
<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.
<button type="reset">Borrar</button>
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>
Esta etiqueta, incluida dentro de nuestro formulario, enviara un dato adicional al programa
encargado de la gestión del formulario.
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>
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.
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.
<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.
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.
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.
<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 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.
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 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.
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:
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:
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
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.
Bloque css:
{
Aquí puede ir cualquier
contenido, incluso
ningún contenido.
}
{
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:
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.
39
<p style="color: #000099">
Esto es un párrafo de color azul.
</p>
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.
<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:
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.
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:
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.
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.
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;
}
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
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
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
Ejemplo:
44
HTML:
#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.
Herencia
Los hijos heredan los estilos de sus elementos padres, no es necesario declarar sus estilos
si estos se mantienen igual.
Cascada
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.
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.
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.
background-color: #ff8800;
color: red;
border-color: Lime;
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.
• 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.
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
51
Bordes - Estilo
Fondo - Color
52
La imagen de fondo se establece con esta propiedad:
Fondo - Repetición
Fondo - Posición
53
Fondo - Imagen de Fondo
Fondo - Resumida
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
Tipografía – Tamaño
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
Texto - Decoración
El valor line-through muestra el texto tachado con una línea continua, por lo que su uso
tampoco es muy habitual.
56
Texto - Transformación
El valor capitalize transforma a mayúsculas la primera letra de las palabras del texto.
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;
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:
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.
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.
<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:
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;
text-decoration: none;
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:
61
.normal {
width: 250px;
border: 1px solid #000;
}
.normal th, .normal td {
border: 1px solid #000;
}
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:
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 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.
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.
form.elegante input {
padding: .2em;
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.
/* 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.
BOOTSTRAP.CSS
BOOTSTRAP.JS
Este archivo es la parte principal de Bootstrap. Consiste en archivos JavaScript que son
responsables de la interactividad del sitio web.
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>.
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">
</head>
<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?:
2) HTML es un lenguaje:
a) De programación.
b) De marcado.
c) Hablado.
d) Ninguno de los anteriores.
a) <head></head>
b) <body></body>
c) !DOCTYPE
d) <html></html>
a) <head></head>
b) <body></body>
c) !DOCTYPE
d) <html></html>
a) <head></head>
b) <body></body>
c) !DOCTYPE
d) <html></html>
a) id
b) class
c) style
d) align
69
8) ¿Cuál es la etiqueta para indicar un salto de línea?
a) </br>
b) <breakLine>
c) <br>
d) <hr>
a) <strong></strong>
b) <bold></bold>
c) <i></i>
d) <u></u>
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>
a) src
b) align
c) href
d) alt
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>
a) Llaves {}
b) Parentesis ()
c) Comas ,,
d) Corchetes []
a) Selector de Clase
b) Selector de Etiqueta
c) Selector Universal
d) Selector de Cascada
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.
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:
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:
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).
75
3) Mostrar un color alterno en las filas de datos (color amarillo claro #FFFFCC).
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.
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.
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.
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.
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.
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
• 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).
Respuestas
Un ejemplo de repuesta:
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.
3
GET /test.html
Ruta (Path)
www.ejemplo.com/otraPagina.html
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
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>
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.).
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.
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.
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.
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.
<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:
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.
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.
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.
● 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.
● 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.
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).
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:
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.
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.
1. Constructor
El siguiente ejemplo muestra una clase que solo puede inyectarse en dependencia con
inyección de constructor:
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.
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
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
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;
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
public class Controlador{
@RequestMapping("/")
public String hola(){
return "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
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:
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
@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.
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.
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).
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
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 enlace: Nos permiten crear URL que pueden tener parámetros o variables,
como por ejemplo @{…}
EXPRESIONES VARIABLES
Algunos ejemplos de expresiones variables son:
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
<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.
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.
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>
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.
<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.
<p>Hola<span th:text=”${nombre}”></p>
25
@Controller
public class ControladorHola {
@GetMapping("/")
String home(ModelMap model) {
String nombre = “Fernando”
model.addAttribute(“nombre”, nombre)
return "paginaHTML";
}
}
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í.
26
PREGUNTAS DE APRENDIZAJE
1) ¿Qué significa el acrónimo HTTP?
a) REMOVE
b) UPDATE
c) REFRESH
d) GET
a) Parámetros
b) Etiquetas
c) Rutas
d) Ninguna de las anteriores
a) <ul>
b) <form>
c) <table>
d) <input>
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
a) Application-context.xml
b) Dependencies-xml
c) Maven.xml
d) Pom.xml
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
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
a) Un motor de vistas
b) Un lenguaje de programación basado en Java
c) Un motor de plantillas
d) Ninguna de las anteriores
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
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:
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
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
AutorServicio
EditorialServicio
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
AutorController
32
EditorialController
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) 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!
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.
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.
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
PrestamoServicio
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
35
PrestamoController
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.
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:
36
Capa de Datos
Entidades y Repositorios
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
Se deben diseñar y crear todas las vistas web necesarias para llevar a cabo las
siguientes funcionalidades:
- 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.
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