Guia
Guia
Programación de Algoritmos
Guía Didáctica
4 créditos
Ciclo Carrera
3 ¡ Informática
Área Técnica
MODALIDAD ABIERTA Y A DISTANCIA
Programación de Algoritmos
Guía Didática
4 créditos
Carrera Ciclo
- Informática III
Autor:
Pedro Daniel Irene Robalino
4.0, CC BY-NY-SA
Primera edición.
ISBN digital - 978-9942-25-579-2
La versión digital ha sido acreditada bajo la licencia Creative Commons 4.0, CC BY-NY-SA:
Reconocimiento-No comercial-Compartir igual; la cual permite: copiar, distribuir y comunicar
públicamente la obra, mientras se reconozca la autoría original, no se utilice con fines comerciales
y se permiten obras derivadas, siempre que mantenga la misma licencia al ser divulgada. https://
creativecommons.org/licenses/by-nc-sa/4.0/deed.es
24 de marzo, 2020
Índice
2. Índice 4
3. Introducción 6
4. Bibliografía 8
4.1. Básica 8
4.2. Complementaria 9
PRIMER BIMESTRE
1.5. Herencia. 29
1.6. Polimorfismo. 40
Autoevaluación 1 45
Autoevaluación 2 73
SEGUNDO BIMESTRE
Autoevaluación 3 93
Autoevaluación 4 108
Autoevaluación 5 130
7. Solucionario 135
3. Introducción
Programación de Algoritmos es una asignatura troncal del tercer ciclo con un peso
de 4 créditos a la malla curricular de la carrera de Informática de la Modalidad
Abierta y a Distancia de nuestra Universidad Técnica Particular de Loja.
4. Bibliografía
4.1. Básica
4.2. Complementaria
Pearson Español (2019): Sitio Web del texto básico: Cómo programar en Java
10e. Deitel. [En línea]. Enlace Web http://www.pearsonenespanol.com/
mexico/educacion-superior/deitel_index/como-programar-en-java-10e
[Consultado 26-07-2019].
Deitel & Associates (2017): Sitio Web del texto básico – Java How to Program,
10/e (Early Objects). [Consultado 28-08-2019].
En este sitio web del texto básico en ingles, podrá encontrar y descargar los
ejercicios desarrollados en cada capítulo del texto básico “Cómo programar
en Java” de Deitel P. así como otros recursos adicionales en ingles.
Pearson Español (2012): Sitio Web del texto básico – Cómo programar en Java
9/e. [Consultado 28-08-2019].
En este sitio web del texto básico en español, novena edición, podrá
encontrar y descargar los recursos para el profesor, código en español y
material adicional.
Este video muestra como usar el nuevo Apache NetBeans versión 11.
Deitel & Associates (2019): Red social Deitel y de alguna de sus obras.
[Consultado 28-08-2019].
Focalizadores Descripción
Lectura recomendada
Focalizadores Descripción
PRIMER BIMESTRE
- Anónimo
necesita de una sola clase, para crear n objetos; siendo más prácticos podríamos
comparar a una clase como un molde de pasteles, con el cual se crean pasteles
que vendrían a ser los objetos los mismos que se crean de acuerdo a las
características del molde, en realidad una clase es algo así como una plantilla que
se utiliza para crear objetos. O como Deitel & Deitel dirían, “una CLASE es a un
Plano de Construcción, lo que un Objeto es a una Casa”
Cuando creamos una clase, se crea un nuevo “tipo de dato” llamado tipo de dato
por referencia, ya que, a una clase se puede acceder solo por medio de un objeto.
El concepto de una clase puede abstraerse aún más y volverse objeto; para
ello, dicho nuevo objeto (aeronave, vehículo), debe estar dentro de una clase
que los contenga, en esta representación gráfica, la clase que los contiene es:
Transportes.
¿Como le fue?, ¿verdad que el método de código activo que Deitel & Deitel,
desarrollan en su texto básico, es muy pedagógico para explicar cada concepto
aplicado en programación?, a mi si me lo parece, es por lo que en esta guía de
estudio he aplicado el mismo método didáctico para resumirle, complementarle
y aclararle cada tema aquí expuesto. Entonces por favor, hagamos la siguiente
reflexión: ¿cómo identificar, que niveles de acceso le debo asignar a los miembros
de mi clase? La respuesta es sencilla dadas las siguientes definiciones:
Por tanto, deberá asignar uno u otro acceso, según los privilegios de lectura/
asignación que desea brindar a agentes internos/externos – métodos – para los
miembros de su Clase (atributos, métodos). Si lo confundí, por favor, revisemos
el siguiente ejemplo complementario (ver Figura 1.5 Clase Personas (niveles de
acceso) y Figura 1.6 Clase TestPersonas (niveles de acceso)), en el que explico
esto a detalle, línea a línea de código.
1 class TestPersona{
2 public static void main(String[] args) {
3 Personas personaA = new Personas();
4 Personas personaB = new Personas();
5 Personas personaC = new Personas();
6 personaA.sexo = "Masculino";
7 personaA.caminar();
8 System.out.println("personaA d sexo <"
9 +personaA.sexo+"> esta <"
10 +personaA.estado+">");
11 }
12 }
personaA.estatura = 175.5;
personaA.numIdentidad = 1105467862;
personaA.peso = 70;
¿Qué tal estuvo el estudio? Si lo hizo con pausa, estudiando bien, y practicando
con los ejercicios del texto básico (que los puede descargar desde el sitio web
de la editorial del texto básico, para no digitarlos y así compilarlos y ejecutarlos
directamente en consola), de ser así, ya conoce que son los métodos de una
clase, para que sirven, como se los define (para devolver o no, valores), y por que
se configura sus niveles de accesos con las palabras reservadas public, private y
protected.
Es por ello que en este apartado deseo puntualizar más aún, sobre dos tipos
de métodos muy conocidos y que los reviso también con la lectura de su texto
Todos los atributos de una clase tienen un fin, y es que un objeto (que nace
desde una clase), no podría ser descrito en “QUE ES”, si la clase que origino
estos objetos no contiene atributos que describan a los objetos. Aquí es donde
entra el método o propiedad establecer([lista de parámetros opcional]) o
set([lista de parámetros opcional]), que es el encargado de recibir en la lista de
sus parámetros entre paréntesis “( … )” los parámetros con valores de entrada
para los atributos de la clase, y set() los asigne, haciendo uso de la palabra
reservada this. Por buena práctica de programación, cada atributo de una clase
debe tener su respectivo setNombreAtributo(…), y así mismo su respectivo
getNombreAtributo(), que no recibe parámetro alguno de entrada, pero que si se
encarga de devolver el contenido o valor actual del atributo.
En las líneas de código 10 y 11 de la “Fig. 3.6 Uso del constructor de Cuenta para
inicializar la variable de instancia nombre al momento de crear el objeto Cuenta.”
de su texto básico:
1. ¿Se puede confirmas el dicho: “una clase es como un molde para crear
objetos” ?, y
2. ¿Con el mismo molde/clase, se pueden crear n número de objetos?, por
ejemplo, ¿cuáles objetos?
Si respondió bien, seguro va siendo consciente del potencial que tiene la POO en
cuanto a los principios de: encapsulamiento, y un poco de reusabilidad de código.
Bien, para que afiance su comprensión en estos temas, deseo dejarle la siguiente
código de clases (ver Figura 1.7 Clase Persona versión con constructores sobre
cargados y Figura 1.8 Clase TestPersona), y caso de estudio:
19 this.estado = estado;
20 }
21 //Métodos SET (void), funciones GET (return)
22 public String getSexo() {
23 return sexo;
24 }
25 public void setSexo(String sexo) {
26 this.sexo = sexo;
27 }
28 public String getEstado() {
29 return estado;
30 }
31 public void setEstado(String estado) {
32 this.estado = estado;
33 }
34 }
Pista: por ejemplo, lo que se puede ver en la línea 9-10 de la Figura 1.8 Clase
TestPersona.
Solución
Antes de poder importar una clase en varias aplicaciones, la clase debe colocarse
en un paquete. Solo puede haber una declaración package en cada archivo de
código fuente de Java nomClase.java.
Finalmente, no se requiere de import cuando se desea usar una clase que esta
dentro de un mismo paquete, o si accedemos a sus miembros directamente con el
nombre de la clase.
cada uno de ellos, las clases: ClaseA1 y ClaseA2 dentro del PaqueteA, y la
ClaseB1 dentro del PaqueteB.
1.5. Herencia.
Otro de los temas clave son: saber como aprovechar al máximo las capacidades
de la herencia, reutilizando código y ocultando información – con la definición
de los niveles de acceso –. Por ello le invito a reflexionar sobre las siguientes
ilustraciones de la mano de su texto básico.
Bien, me parece que ahora si esta listo para aplicar todo lo aprendido; es por lo
que le planteo el siguiente Estudio de Caso (1):
Solución
8 }
9 public void setSueldo(double sueldo) {
10 this.sueldo = sueldo;
11 }
12 public double getSueldo( ) {
13 return sueldo;
14 }
15 }
16
17 class Gerente extends Empleado {
18 public String departamento;
19 public String secretaria;
20 public Gerente( ) { }
21 public Gerente(String departamento, String secretaria)
22 this.departamento = departamento;
23 this.secretaria = secretaria;
24 }
25 public Gerente(String departamento, String secretaria)
26 String nombre, double sueldo) {
27 super(nombres, sueldo);
28 this.departamento = departamento;
29 this.secretaria = secretaria;
30 }
31 @Override
32 public String toString( ) {
33 return String.format("Nombres: %s \nSueldo: %.2f \n"
34 + "Departamento: %s \nSecretaria: %s"
35 ,this.nombres, this.getSueldo ( ),
36 this.departamento,this.secretaria);
37 }
38 }
39
40 class Operario extends Empleado {
41 private double horasLaboradas;
42 private double costoHora;
43 public Operario ( ) { }
44 public Operario (double horasLaboradas) {
45 this.horasLaboradas = horasLaboradas;
46 }
47 public Operario(double horasLaboradas, String nombres,
48 double sueldo) { }
49 super(nombres, sueldo);
50 this.horasLaboradas = horasLaboradas;
51 }
¿Que le pareció?, ¿se cree capaz de resolver un caso de estudio por su cuenta?,
intentémoslo por favor; se lo propongo a continuación:
¿Estuvo fácil, difícil?, ¿al menos realizo el intento?, si no, hágalo por favor, las
competencias que se ponen a prueba aquí le van ha ser de total ayuda cuando
usted como Ingeniero Informático este frente a escenarios reales.
1.6. Polimorfismo.
• Encapsulamiento.
• Abstracción.
• Herencia, y
• Polimorfismo
Resumen de polimorfismo:
Autoevaluación 1
Instrucciones:
▪▪ Anote sus respuestas, para que al final sea usted quien juzgue, califique
y autoevalúe, su nivel de competencias adquiridas, comparando con el
solucionario adjunto al final de esta guía de estudios.
1. Cada declaración de clase que empieza con la palabra clave ________ debe
almacenarse en un archivo que tenga exactamente el mismo nombre de la
clase, y que termine con la extensión de nombre de archivo .java.
A. new
B. extends
C. abstract
D. public
45 MODALIDAD ABIERTA Y A DISTANCIA
Guía Didáctica: Programación de Algoritmos PRIMER BIMESTRE
A. El mismo nombre del archivo .java con el que se guarda todo el código.
B. Distinto al nombre con el que se guardo el archivo .java.
C. Cualquier nombre, ya que esto no es importante al momento de
compilar.
D. La clase de object como super clase asignada por jerarquía.
LibroNotas
- nombreCurso: String
<<constructor>> LibroNotas( nombre: String)
- nombreDelCurso: String
LibroNotas
+ establecerNombreDelCurso( nombre : String)
B. <<constructor>> LibroNotas( nombre: String)
LibroNotas
+ nombreDelCurso: String
-<<constructor>> LibroNotas( nombre: String)
D. + establecerNombreCurso( nombre : String)
A. Atributo
B. Método
C. Objeto
D. Uml
A. new
B. extends
C. Object
D. class
A. referencia
B. variable global
C. variable local
D. instancia
A. editorial( ), ciudad( )
B. hojas, letras
C. numeros, anaquel
D. leer( ), abrir( )
A. 2
B. 3
C. 4
D. 0
13. Dado el siguiente flujo, ¿Cuál es la sentencia que se debe escribir dentro de
los paréntesis de la línea de código número 5 para invocar al método sumar
enviando num para ser sumado y retornado dicho resultado?
1 class TestCalc {
2 public static void main(String[ ] args) {
3 int num[ ] = {1, 2, 3};
4 Calculadora calc = new Calculadora ( );
5 System.out.printIn(_______);
6 }
7 }
8
9 class Calculadora {
10 public int sumar(int arreglo[ ]) {
11 int suma = 0;
12 for(int num : arregle)
13 suma+=num;
14 return suma;
15 }
16 }
A. sumar(num)
B. calc.sumar(num)
C. calc.sumar(num[3])
D. Calculadora.sumar(num[ ])
14. Defina una clase Forma que tenga los siguientes miembros: color,
coordenada del centro, y nombre de la forma; luego derive Rectangulo
que tenga los siguientes miembros/datos: lado menor, lado mayor; y las
funciones: Calcular el área (lado menor * lado mayor); y Calcular el perímetro
(2 * lado menor) + (2 * lado mayor).
AFIRMACIÓN
1. Forma es superclase y Rectangulo subclase.
2. Atributos de Rectangulo se inicializan en su constructor.
3. Las funciones de cálculo se heredan hacia Forma
4. Las funciones de cálculo no se deben sobrecargar.
17. Crear una clase base denominada Punto que conste de las coordenadas
coorX y coorY. A partir de esta clase, definir una clase denominada Circulo
que tenga las coordenadas del centro y un atributo denominado radio. Entre
las funciones miembro de una clase deberá existir una función distancia()
que devuelva la distancia entre dos puntos.
Dado es requerimiento, y con el fin de aprovechar al máximo la herencia; ¿a
que clase debe pertenecer la función distancia().?
A. Circulo
B. Punto
C. Distancia
D. Coordenadas
A. Avanzar()
B. Frenar()
C. Avanzar() y Frenar()
D. Auto, Avioneta y Animal
- Jack Gibb
Primer caso:
Dados los ejemplos de las Fig. 11.2 y 11.3, de su texto básico, ¿Ud. cree que
realmente, el manejo de excepciones permite a un programa recuperarse de un
error acontecido en tiempo de ejecución, si, no, y por que?
Solución
Por supuesto que si, y eso es precisamente lo que hace que los
sistemas sean más estables y tolerantes a fallos; como vemos en el
DivisionEntreCeroSinManejoDeExcepciones.java, el programa termina su
ejecución repentinamente sin avisar al usuario con exactitud que es lo que paso
cuando se lanza un error (ya que no se gestionan las excepciones), pero en el
DivisionEntreCeroConManejoDeExcepciones.java, el programa si se logra
recuperar tanto por el manejo de excepciones (bloque try-catch) como por el
bloque repetitivo do-while.
Segundo caso:
Solución
Claro que resulta ventajoso agrupar excepciones de tipo similar, ya que reduce
el código y el tratamiento de errores atrapados; sin embargo, podría resultar
también contraproducente sino se categorizan o agrupan de forma correcta,
llevándonos a gestionarlos de la misma manera cuando se lo debería hacer de
forma individual, y así facilitar al programador y usuario información y soluciones
más personalizadas. En el siguiente fragmento de código, revisemos como queda
la solución con multi-catch. (Ver la Figura 2.1 Solución con multi-catch.).
32
33 } // fin de bloque try
34 catch(InputMismatchException | ArithmeticException inputMismatch_arithmetic_Exception)
35 {
36 System.err.printf( "\nExcepcion: %s\n", inputMismatch_arithmetic_Exception );
37 explorador.nextLine( ); // descarta entrada para que el usuario intente otra vez
38 System.out.printIn("Debe introducir enteros diferentes de cero.Intente de nuevo.\n);
39 } // fin de bloque catch
40 } while (continuarCiclo ); // fin de do...while
41
Para finalizar este tema deseo recalcar que, en Java toda la gran cantidad de
clases existentes heredan de la clase Object y toda esta jerarquía se muestra
en su documentación API. Le recomiendo que utilice desde el principio esta
documentación (API), ya que caerá en cuenta de que las clases se encuentran
agrupadas en paquetes y cuando utilicemos alguna en nuestros programas lo
primero que se debe hacer es importar el paquete que la contiene. Por ejemplo,
para gestionar las excepciones de tipo InputMismatchException, el paquete
que importaremos es el java.util como lo indica muy bien su API, (ver Figura 2.4
Application Programming Interface (API de Java). Clase InputMismatchException.
de esta guía, y la Figura nro. 11.3, línea de código 3 de su texto básico). Existen
algunos paquetes que son importados por defecto en nuestros programas .java
(por ejemplo el java.lang), y no requieren importación explicita.
1
2 //......................
3 try {
4 //......................
5 / / .Lanza la Excepción. . . . . .
6 //......................
7 } catch (Exception exception) {
8 //......................
9 / / .Atrapa la Excepción. . . . . .
10 //......................
11 } finally {
12 //......................
13 / / .Liberación la Excepción. . .
14 //......................
15 }
16 //......................
17
Nota: Luego de una instrucción try se debe colocar por lo menos un bloque catch
cuyo código se ejecuta si y solamente si se ha generado una excepcionen en el
bloque try correspondiente. Un try puede tener uno o mas catch asociados.
¿Cómo le fue con la lectura? En los apartados anteriores, ya había revisado estos
temas, sin embargo, se ha deseado retomarlos solamente para dejar puntualizado
lo siguiente:
1
2 public static void main(String[] args) throws IOException {
3 probandoThrow_Throws();
4 }
5
6 public static void probandoThrow_Throws() throws IOException{
7 //.........................
8 try {
9 //................................................
10 //Se lanza la Excepción EXPLICITAMENTE con throw..
11 throw new IOException();
12 } catch (IOException ioException) {
13 //................................................
14 //Captura y resuelve la excepción IOException.....
15 //................................................
16 } catch (Exception exception) {
17 //................................................
18 //Captura y resuelve la excepción Exception.......
19 //................................................
20 } finally {
21 //................................................
22 //.Liberación de recursos.........................
23 //................................................
24 }
25 //.........................
26 }
27
Primera caso:
Solución
1
2 public static void main(String[] args) {
3 probandoThrow_Throws();
4 }
5
6 public static void probandoThrow_Throws() {
7 //.........................
8 try {
9 //................................................
10 //Se lanza la Excepción EXPLICITAMENTE con throw..
11 throw new IOException();
12 } catch (IOException ioException) {
13 //................................................
14 //Captura y resuelve la excepción IOException.....
15 //................................................
16
Figura 2.8 Primera solución antes el uso de las sentencias throws y throw.
En esta primera solución: (más sencilla o corta – Figura 2.8 Primera solución
antes el uso de las sentencias throws y throw. de esta guía), podemos observar
que las clausulas throws IOException, se han eliminado de las cabeceras
tanto del método main(), como del método probandoThrow_Throws(), dejando
así la gestión interna de la excepción IOException únicamente al método
probandoThrow_Throws(). – línea de código nro. 12. - Figura 2.8 Primera
solución antes el uso de las sentencias throws y throw. de esta guía.
1
2 public static void main(String[] args) {
3 try {
4 probandoThrow_Throws();
5 } catch (Exception e) {
6 //................................................
7 //Captura y resuelve la excepción Exception.......
8 //................................................
9 }
10 }
11
12 public static void probandoThrow_Throws() throws IOException{
13 //.........................
14 try {
15 //................................................
16 //Se lanza la Excepción EXPLICITAMENTE con throw..
17 throw new IOException();
18 } catch (IOException ioException) {
19 //................................................
20 //Captura y resuelve la excepción IOException.....
21 //................................................
22 } catch (Exception exception) {
23 //................................................
24 //Captura y resuelve la excepción Exception.......
25 //................................................
26 } finally {
27 //................................................
28 //.Liberación de recursos.........................
29 //................................................
30 }
31 //.........................
32 }
33
Figura 2.9 Segunda solución antes el uso de las sentencias throws y throw.
En esta segunda y última solución: (Figura 2.9 Segunda solución antes el uso
de las sentencias throws y throw. de esta guía), observamos que se hace una
doble gestión de la excepción IOException, en los bloques de código try-catch,
tanto del método main() (bloque 3-9 ), como del método probandoThrow_
Throws() (bloque 14-21).
¿Cómo le fue con la lectura? ¿Logró revisar (compilar y ejecutar) los ejercicios de
las Fig. 21.03 y siguientes (carpeta fig21_03_05)?. Si no lo pudo localizar online,
los ejercicios de cada capítulo de su texto básico están publicados en su EVA o
en la URL indicada en bibliografía de esta guía, desde ahí los puede descargar.
Si lo hicimos bien, o no tanto, creo pertinente resumamos este último tema de la
segunda unidad, antes de pasar a nuestra autoevaluación.
Ejemplo
Una excepción propia por definición debe ser una clase, es por ello que,
MiExcepcionPropia_A (marcada de color degradado azul y blanco en la figura
anterior) se codifica como un public class, pero al ser una nueva excepción que
nosotros deseamos definir, debemos heredarla/derivarla de la clase Exception
o cualquiera de sus SubClases (clases hijas) según se tenga la necesidad.
Esta herencia o derivación en código java, se lo hace usando la palabra clave
extends seguido del nombre de la clase Padre, de quien se hereda/deriva nuestra
excepción propia. En la Figura 2.11 Codificación de MiExcepcionPropia_A. línea
de código 2, podemos revisar como se hace:
1
2 public class MiExcepcionPropia_A extends Exception {
3 // Constructor sobre cargado 1
4 public MiExcepcionPropia_A( )
5 {
6 this("Error de División para cero"); // Llama al otro constructor sobre cargado
7 }
8
9 // Constructor sobre cargado 2
10 public MiExcepcionPropia_A(String msjError)
11 {
12 super(msjError + "aqui"); // Llama al otro constructor de la super clase Exception
13 }
14 }
15
1
2 import java.util.Scanner;
3
4 public class ProbandoExcepcionPropia {
5
6 public static void main(String[ ] args) {
7 Scanner teclado = new Scanner(System.in);
8 int numero1 = teclado.nextInt ( );
9 int numero2 = teclado.nextInt ( );
10 int division;
11 try {
12 if (numero2! = 0)
13 division = numero 1 / numero 2;
14 else
15 throw new MiExcepcionPropia_A( );
16 } catch (Exception excepcion) {
17 excepcion.printStackTrace( );
18 }
19
20 }
21 }
22
Autoevaluación 2
Instrucciones:
▪▪ Anote sus respuestas, para que al final sea usted quien juzgue, califique
y autoevalúe, su nivel de competencias adquiridas, comparando con el
solucionario adjunto al final de esta guía de estudios.
A. generar – maneja
B. manejar – genera
C. capturar – genera
D. manejar – limpia
73 MODALIDAD ABIERTA Y A DISTANCIA
Guía Didáctica: Programación de Algoritmos PRIMER BIMESTRE
4. Todo bloque _____ debe tener al menos _____ bloque(s) _____ para el
manejo correcto de una excepción.
CONTROL DE ERRORES
Realizar una tarea
A. while
B. for
C. try – catch
D. if – else
CLASE DE EXCEPCIÓN
Nl NullPointerException
Ru RuntimeException
Ex Exception
Cc ClassCastException
At ArithmeticException
Ip InputMismatchException
Io IOException
Ar ArrayIndexOutOfBoundsException
1 /* Bloque 1 */
2 try {
3 /* Bloque 2 */
4 } catch (Exception e) {
5 /* Bloque 3 */
6 }
7 /* Bloque 4 */
A. 3
B. 4
C. 5
D. Ninguna
A. 1, 3, 4
B. 5, 6, 7
C. 10, 11, 12
D. 14, 15, 16
A. MiException1
B. MiException2
C. MiException3
D. MiException4
SEGUNDO BIMESTRE
- Gandhi.
Que gusto estimado estudiante el aún tenerlo hasta acá, esa es una prueba de
valor y constancia para usted. Pero cuénteme, ¿cómo le fue en el primer bimestre
con la POO y las Excepciones?, esos son temas importantes y necesarios no
solo para esta asignatura, si no para otras de ciclos superiores, “Arquitectura de
Aplicaciones” por ejemplo.
Pero bien, si aún no tiene claro algún tema de POO y/o Excepciones, podemos
volverlos a revisar juntos, quedando a las órdenes vía EVA ante cualquier duda
al respecto. Pero en este segundo bimestre, corresponde iniciar revisando los
mecanismos de almacenamiento de datos, temas útiles cuando se requiere de
la persistencia de información, por que sabemos es volátil o temporal mientras
se procesa en un programa en ejecución. Para tener disponibles los datos de
forma permanente es necesario guardarlos en los dispositivos de almacenamiento
secundarios (por ejemplo: disco duro o pindriver, etc.). En esta unidad
revisaremos los mecanismos que dispone el lenguaje Java para almacenar y
recuperar información en estos dispositivos persistentes.
Una vez con los .pdf descargados, por favor abrir el archivo
llamado: M15_DEITEL_COMO-PROGRAMAR-EN-JAVA_
SE_10ED_C15_644-683_XXXX-X.pdf que corresponde al
Capítulo 15, diríjase a las Secciones 15.1, 15.2 y 15.3, que
son totalmente introductorias pero interesante.
• Copiar archivos
• Crear/eliminar archivos/directorios
• Obtener información sobre archivos/directorios
• Leer el contenido de archivos
• Obtener objetos para manipular el contenido de archivos/directorios.
Entre otros.
Las clases anteriores trabajan con rutas absolutas (que contiene todos los
directorios, empezando con el directorio raíz.) o ruta relativa (que empiezan
desde el directorio en el que se empezó a ejecutar la aplicación)
Perfecto, ahora con estos dos apartados teóricos anteriores, es hora de aplicar lo
aprendido, por lo que le solicito a continuación:
Del M15_DEITEL_COMO-PROGRAMAR-EN-JAVA_
SE_10ED_C15_644-683_XXXX-X.pdf, diríjase a la Sección
15.4, lea, compile y ejecute los ejemplos que aquí se
describen, y al finalizar el estudio de esta sección responda
a los siguientes casos, ya acostumbradas:
Primer caso:
1 package FILES;
2
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.io.FileWriter;
6 import java.io.IOException;
7 import java.nio.file.Files;
8 import java.nio.file.Path;
9 import java.nio.file.Paths;
10 import java.util.Formatter;
11
12 public class Formatter_VS_FileWrite_Opcion1 {
13 public static void main(String[ ] args) {
14 //Rutas del archivo
15 String strNombArchivo - "miArchivoPrueba1.txt";
16 File file = new File(strNomArchivo);
17 Path path = Paths.get(strNomArchivo);
18 try {
19 //Apertura el flujo de salida al archivo.
20 //Si el archivo existe, se trunca y se escribe desde el inicio
21 Formatter flujoOUT_Formatter = new Formatter(file);
22 //IF TERNARIO valida si existe o no el archivo,
23 //para iniciar/continuar(false/true) su escritura al inicio/final (false/true).
24 FileWriter flujoOUT_FileWriter = Files.exists(path)?
25 new FileWriter(file,true) : new FileWriter(file);
26
27 flujoOUT_Formatter.format("Nombre: %s \ t Sueldo: %.2f%m", "Daniel", 900.500);
28 flujoOUT_FileWriter.write("Nombre: Juan \t Sueldo: 1000.560 \n");
29
30 flujoOUT_Formatter.close( );
31 flujoOUT_FileWriter.close( );
32
33 } catch (SecurityException securityException) {
34 System.err.printIn("Permisos de escritura negados. Terminar el programa");
35 System.exit (1); //Termina el programa.
36 } catch (FileNotFoundException fileNotFoundException) {
37 System.err.printIn("Error para abrir el archivo. Terminar el programa");
38 System.exit (1); //Termina el programa.
39 } catch (IOException e) {
40 System.err.printIn("Error para abrir el archivo");
41 }
42 }
43 }
Solución
Las dos clases: Fig. 15.3: CrearArchivoTexto.java (de su texto básico) y Figura
3.1 Creación de un archivo usando las clases Formatter y FileWriter., son
similares al crear archivos con flujos basados en caracteres y distintas por que el
CrearArchivoTexto.java y Formatter_VS_FileWrite_Opcion1.java, hacen una
comparativa al respecto del uso de las dos clases (Formatter y FileWriter) para la
escritura de datos en un archivo, y esta diferencia básicamente es que: mientras
Formatter trunca/elimina los datos dentro de un archivo si este existe, la clase
FileWriter permite establecer parámetros para continuar con la escritura de datos
dentro de un archivo manteniendo o no los datos existentes.
Las líneas que marcan la diferencia son las agrupadas en el bloque 19-28 de la
Figura 3.1 Creación de un archivo usando las clases Formatter y FileWriter.
Segundo caso:
¿Cuáles son las diferencias entre estas dos soluciones? Marcar de ser posible los
fragmentos de código en donde encuentre algo importante que resaltar.
1 package FILES:
2
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.nio.file.Path;
6 import java.nio.file.Paths;
7 import java.util.Formatter;
8 import java.util.FormatterClosedException;
9 import java.util.NoSuchElementException;
10 import java.util.Scanner;
11
12 public class Formatter_VS_FileWrite_Opcion2 {
13 public static void main(String[ ] args) {
14 Scanner teclado - new Scanner(System.in)
15 //Rutas del archivo
16 String strNombArchivo = "miArchivoPrueba1.txt";
17 File file = new File(strNombArchivo);
18 Path path = Paths.get(strNombArchivo);
19 try {
20 Formatter flujoOUT_Formatter = new Formatter(file);
21 System.out.printf("%s%n%s%n?", "Ingrese su nombre", "Ingrese su sueldo.");
22 //Bucle hasta encontrar la combinacion de teclas de fin de archivo
23 while (teclado.hasNext( ) ) {
24 try {
25 flujoOUT_Formatter.format("Nombre: %s \t Sueldo: %.2f%n",
26 teclado.next( ), teclado.nextDouble( ) );
27 } catch (FormatterClosedException formatterClosedException) {
28 System.err.printIn("Error al escribir en el archivo");
29 break;
30 } catch (NoSuchElementException elementException) {
31 System.err.printIn("Entrada invalida. Intente de nuevo");
32 teclado.nextLine( );//Descarta la entrada, puede intentar otra vez.
33 }
34 System.out.print("?");
35 }
36 flujoOUT_Formatter.close( );
37 } catch (SecurityException securityException) {
38 System.err.printIn("Permisos de escritura negados. Terminar el programa");
39 System.exit( 1 ); //Termina el programa.
40 } catch (FileNotFoundException fileNotFoundException) {
41 System.err.printIn("Error al escribir en el archivo. Terminar el programa");
42 System.exit( 1 ); //Termina el programa.
43 }
44 }
45 }
Solución
Tercer caso:
1 package FILES:
2
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.FileReader;
6 import java.io.IOException;
7 import java.nio.file.Path;
8 import java.nio.file.Paths;
9 import java.util.Scanner;
10
11 public class Formatter_VS_FileWrite_Opcion1 {
12 public static void main(String[ ] args) {
13 String strNombArchivo = "miArchivoPrueba1.txt";
14 File file = new File(strNombArchivo);
15 Path path = Paths.get(strNombArchivo);
16 try {
17 //Apertura el flujo de entrada del archivo con Scanner.
18 Scanner flujoEntrada_Scanner = new FileReader(file);
19 //Apertura el flujo de entrada del archivo con FileReader.
20 FileReader flujoEntrada_FileReader = new FileReader(file);
21
22 //CON EL FLUJO DE ENTRADA Scanner
23 //Lectura dato a dato => //System.out.printIn(flujoEntrada_Scanner.next( ));
24 //Lectura linea a linea => //System.out.printIn(flujoEntrada_Scanner.nextline( ));
25 //Lectura ciclica. Puede ser dato a dato o linea a linea.
26 while(flujoEntrada_Scanner.hasnext( ));
27 System.out.printIn(flujoEntrada_Scanner.nextLine( ));
28 }
29
30 // CON EL FLUJO DE ENTRADA FILEREADER
31 BufferedReader leerFilesBuffer = new BufferedReader(flujoEntrada_FileReader);
32 String strLinea;
33 //Lectura caracter a caracter => //int caracter = leerFilesBuffer.read( )
34 while ( (strLinea = leerFilesBuffer.readLine( ) ) ! = null) {
35 System.out.printIn(strLinea);
36 }
37
38 flujoEntrada_Scanner.close( );
39 flujoEntrada_FileReader.close( );
40
41 } catch (IOException e) {
42 System.err.printIn("Error al abrir el archivo");
43 }
44 }
45 }
Solución
Entre las clases LeerArchivoTexto.java del texto básico y la Figura 3.3 Lectura
de un archivo con las clases Scanner y FileReader., si existe similitudes y
diferencias: son similares por que ambas realizan la lectura de flujos basados
en caracteres, la diferencia es que, en esta guía hace una comparativa entre
las clases Scanner y FileReader para ilustrar el uso de estas dos clases para un
mismo fin, y en el texto básico usa únicamente la clase Scanner. Los fragmentos
de código que resaltan lo anteriormente indicado son: líneas de código 17-36.
Y para cerrar este apartado, le dejo la Figura 3.4 Creación de archivos CSV con
flujos basados en caracteres., en donde se realiza la salida y entrada (output,
input) con flujos basados en caracteres, pero de un tipo de archivo peculiar
con extensión .CSV, el cual siendo un archivo de texto, puede ser importado y
exportado usando Excel con una visualización más atractiva y tabulada en celdas,
pero si se usa un editor de texto común, se observa punto y coma (;) como
separador de valores.
1 package FILES:
2
3 import java.io.File;
4 import java.util.Formatter;
5 import java.util.Scanner;
6 import java.util.Locale;
7
8 public class FilesNotasJava_CSV {
9 public static void main(String[ ] args) {
10 try {
11 //FLUJO DE SALIDA al archivo,
12 //con Charset US-ASCII, para escribir . en lugar de ,
13 Locale ingles = new Locale ("en", "EN");
14 Formatter outArchivo = new Scanner (new File ("notas.csv") );
15 outArchivo.format("%.2f;%d';%d;%n", 4.5, 20, 8);
16 outArchivo.format("%d';%d;%.2f;%n", 15, 19, 16.4);
17 outArchivo.close( );
18
19 //FLUJO DE SALIDA al archivo,
20 Scanner inArchivo = new Scanner(new File("notas.csv") );
21 String contenido;
22 int nroEst = 1
23 while (inArchivo.hasNext( )) {
En el archivo M15_DEITEL_COMO-PROGRAMAR-EN-
JAVA_SE_10ED_C15_644-683_XXXX-X.pdf, diríjase a la
Sección 15.5, lea, compile y ejecute los ejemplos que aquí
se describir y expliquemos como se aplica cada un de las
siguientes afirmaciones en los códigos de las clases allí
expuestas.
Autoevaluación 3
Instrucciones:
▪▪ Anote sus respuestas, para que al final sea usted quien juzgue, califique
y autoevalúe, su nivel de competencias adquiridas, comparando con el
solucionario adjunto al final de esta guía de estudios.
AFIRMACIÓN
1. Para leer varias veces desde el inicio un archivo con Scanner, debe cerrarse y
volver a abrirse.
2. Los archivos binarios pueden ser leídos por los seres humanos en un editor de
texto normal o común.
3. La ruta relativa contiene todos los directorios que conducen hacia un archivo o
directorio específico.
4. La clase Formatter contiene el método printf, para enviar datos con formato a
pantalla o a un archivo.
3. Escriba una instrucción que abra con un flujo basado en bytes, el archivo
personas.ser en modo entrada; use la variable ipPers para envolver un
objeto InputStream.
4. Escriba una instrucción que abra con un flujo basado en bytes, el archivo
personas.ser en modo salida; use la variable opPers para envolver un objeto
OutputStream.
5. Escriba una instrucción que abra el archivo “fileTest.txt” en modo salida, con
un flujo basado en caracteres.
Se desea almacenar los datos de clientes que ingresan a una sala de cine
(ejemplo de la numeración de asientos: A1, A2, …, A16; B1, B2, etc.), para
ello los datos indispensables y sus tipos, son:
A. 1
B. 2
C. 4
D. n
10. Un archivo (file) puede contener otros archivos, o también uno o varios
registros; el registro a su vez está formado por campos y los campos por
caracteres (dato o valor) y éstos últimos por bits.
- Robert F. Kennedy.
Para repasar los conceptos introductorios recursivos, por favor, remitámonos a los
siguientes apartados de nuestro texto básico:
Fundamentos de recursividad:
Paso recursivo
Recursividad indirecta
Recursividad infinita
Sugerencia
Vuelta recursiva
Es hora de aplicar cada concepto estudiado anteriormente, por ello por favor,
debemos remitirnos nuevamente a nuestro texto básico:
En el archivo M18_DEITEL_COMO-PROGRAMAR-EN-
JAVA_SE_10ED_C18_776-809_XXXX-X.pdf, diríjase a
las Secciones 18.3 a la 18.6, compile, ejecute y estudie
cada ejemplo de la mano de su texto básico, al final
compleméntelos con las siguientes ilustraciones, resumen y
explicaciones que le hago a continuación:
1 package RECURSIVIDAD
2
3 /**
4 * La clase permite obtener el factorial de un número
5 *recursivamente a traves del metodo recursivo (num)
6 *@author Pedro Daniel Irene Robalino
7 *@email [email protected]
8 */
9 public class FactorialRecursivo {
10 public static void main(String[ ] args) {
11 int num = 3, resultado = 0
12 resultado = factorialRecursivo(num);
13 Sistem.out.printIn(num + "! = " + resultado);
14 }
15 /**
16 * Metodo recursivo para obtener el factorial de un numero
17 *@param num por medio del cual se obtendra el factorial
18 *@return retorna el factorial de num - 1
19 */
20 public static int factorialRecursivo(int num) {
21 if(num ==0) //Evalua el caso base
22 return 1; //Caso base
23 else { //Paso recursivo / llamada recursiva
24 int devolver = (num*factorialRecursivo(num-1));
25 return devolver; //Vuelta recursiva
26 }
27 }
28 }
En el archivo M18_DEITEL_COMO-PROGRAMAR-EN-
JAVA_SE_10ED_C18_776-809_XXXX-X.pdf, diríjase a las
Secciones 18.7, al finalizar este estudio, complemente con
el resumen que le ofrezco a continuación:
ITERACIÓN RECURSIVIDAD
Usa instrucciones/condiciones de Usa una instrucción de selección.
repetición.
Usa explícitamente una instrucción de Se repite a través de llamadas repetidas a
repetición. un mismo método.
Termina cuando falla la condición de Termina cuando se reconoce un caso
continuación de ciclo. base.
Controlada por contador. Se acercan en forma gradual a la
terminación.
Modifica un contador hasta que hace que Sigue produciendo versiones cada vez
falle la condición. más simples del problema original hasta
llegar al caso base.
ITERACIÓN RECURSIVIDAD
Ciclo infinito si la condición nunca es falsa. Infinita si el paso recursivo no reduce un
problema más sencillo que converja en el
caso base.
Podría requerir una gran cantidad de Se implementa con pocas líneas de código
código. (frecuentemente).
Autoevaluación 4
Instrucciones:
▪▪ Anote sus respuestas, para que al final sea usted quien juzgue, califique
y autoevalúe, su nivel de competencias adquiridas, comparando con el
solucionario adjunto al final de esta guía de estudios.
AFIRMACIONES
1. Un método que se llama a sí mismo en forma indirecta no es
un ejemplo de recursividad.
2. La recursividad es eficiente, debido a la reducción en el uso
del espacio en memoria.
3. Un método recursivo es capaz de resolver sólo el caso base.
4. La recursividad es factible cuando el paso recursivo se
asemeja al problema original pero más sencillo/pequeño.
A. 2 veces
B. infinitas veces
C. una sola vez de forma indirecta
D. a sí mismo en forma directa o indirecta
A. paso recursivo
B. instrucción break
C. tipo de valor de retorno void
D. caso base
Términos Aplicabilidad
1 paso recursivo / caso base w Iteraciones recursivas
2 for / while x Iteraciones cíclicas
3 lanzar / pila de llamadas y Manejo de excepciones
4 burbuja / inserción z Métodos de ordenamiento
8. Dado el siguiente flujo, indicar cual es el valor que se muestra por pantalla
gracias a la llamada del método recursivoA(3).
A. 1
B. 4
C. 5
D. 120
- Yokoi Kenji.
Antes de empezar con el estudio de los algoritmos para manipular los datos
almacenados en un arreglo, recordemos algunas características y aplicaciones
importantes de este tipo de datos de la mano de nuestro texto básico:
For mejorado:
Esta claro que un arreglo hace referencia a un conjunto de datos, por lo tanto,
existe una serie de operaciones que son típicas en esta estructura. Iniciemos con
el estudio de los algoritmos de búsqueda puesto que estos algoritmos son la base
para realizar operaciones de eliminación, modificación, etc.
Y para complementar lo que seguro le fue muy sencillo (por que este método de
búsqueda es realmente muy fácil, implica únicamente un ciclo repetitivo y una
pregunta secuencial), puntualizo lo siguiente:
Búsqueda binaria
En el archivo M19_DEITEL_COMO-PROGRAMAR-
EN-JAVA_SE_10ED_C19_810-838_XXXX-X.pdf que
corresponde al Capítulo 19, de nuestro texto básico,
revisemos la Secciones 19.4.
Cada uno de estos métodos tiene sus ventajas y desventajas, en unos casos
la sencillez de su implementación puede resultar un factor favorable, en otros
casos se debe tener en cuenta la eficiencia o el tiempo y cantidad de recursos de
memoria que requieren para hacer su trabajo.
Figura 5.4 Solución alternativa – ordenamiento por selección y salida por pantalla.
Enlace web: Ver código en GitLab
ORDENANDO EL ARREGLO
[5, 6, 2, 1, 4]
2 <=> 6 2 <=> 5
[2, 5, 6, 1, 4]
1 <=> 6 1 <=> 5 1 <=> 2
[1, 2, 5, 6, 4]
4 <=> 6 4 <=> 5
[1, 2, 4, 5, 6]
[1, 2, 4, 5, 6]
Figura 5.5 Solución alternativa – ordenamiento por inserción y salida por pantalla.
Enlace web: Ver código en GitLab
Ordenamiento burbuja:
Comparar los dos primeros elementos, toma el más pequeño (<) o más grande (>)
y lo burbujea (mueve) al final del arreglo comparándolos con los subsiguientes,
al final de una iteración el elemento queda ordenado en la última posición. El
burbujeo de cada i-ésimo (par de elementos), se hace hasta ubicar el menor (<) o
mayor (>) en la última i-ésima posición del arreglo.
1 /**
2 * Metodo de ordenamiento Burbuja, para arreglos
3 *@author Pedro Daniel Irene Robalino
4 *@version 1.0.0
5 */
6 package ARREGLOS
7 import java.util.Arrays;
8
50 }
ORDENANDO EL ARREGLO
2 <=> 6 [5, 2, 6, 1, 4]
1 <=> 6 [5, 2, 1, 6, 4]
4 <=> 6 [5, 2, 1, 4, 6]
2 <=> 5 [2, 5, 1, 4, 6]
1 <=> 5 [2, 1, 5, 4, 6]
4 <=> 5 [2, 1, 4, 5, 6]
1 <=> 2 [1, 2, 4, 5, 6]
[1, 2, 4, 5, 6]
1 /**
2 * Programa para buscar un valor dado, y eliminarlo del arreglo
3 *@author Pedro Daniel Irene Robalino
4 *@version 1.0.0
5 */
6
7 package ARREGLOS
8 import java.util.Arrays;
9
10 public class EliminarElementoArreglo {
11
12 /**
13 *Metodo de busqueda Lineal; busca secuencialmente en cada elemento
14 *del arreglo hasta encontrar el elemento buscado o hasta llegar al final.
15 *@param arreglo Arreglo sobre el cual se busca el valorBuscado
16 *@param valorBuscado valor que se compara con cada elemento del arreglo
17 *@return La posicion en el arreglo, del valorBuscado
18 */
19 public static int busquedaLineal (int arreglo [ ], int valorBuscado) {
20 int posicion = - 1;
21 for(int i = 0; i < arreglo.length; i++)
22 if (valorBuscado == arreglo[i]) {
23 posicion = i;
24 eliminarElemento(arreglo, posicion);
25 break;
26 }
27 return posicion; //Retorna -1 si no encuentra el valorBuscado
28 }
29
30 public static void eliminarElemento(int arreglo[ ], int posicion) {
31 for(int i = posicion; i < arreglo -1; i++)
32 arreglo[i] = arreglo[i + 1];
33 arreglo[arreglo.length -1] = 0;
34 }
35
36 public static void main (String[ ] args) {
37 int[ ] arreglo = {23, 25, 29, 42, 44, 46, 48, 49, 57, 59, 68, 74, 75, 85, 97};
38 System.out.printIn("ARREGLO ORIGINAL");
39 System.out.printIn(Arrays.toString(arreglo));
40 int valorBuscado = 23;
41 System.out.printIn("%nElemento a eliminar;[%d]%n" , valorBuscado);
42 int posicionElemento = busquedalineal(arreglo, valorBuscado);
43 System.out.printIn(posicionElemento >=0
44 ? "Elemento [" + (valorBuscado) + "] eliminado de la posicion; ["
45 + posicionElemento + "]" : "ELEMENTO [" + (valorBuscado) + "] NO ENCONTRADO");
46 System.out.printIn("ARREGLO FINAL:");
47 System.out.printIn(Arrays.toString(arreglo));
48 }
49 }
Figura 5.7 Método para eliminar un elemento especifico y salida por pantalla.
Enlace web: Ver código en GitLab
Otra de las operaciones que son muy comunes cuando trabajamos con arreglos
es la inserción de nuevos elementos, en este caso se debe tener en cuenta que,
si el arreglo ya esta lleno el último elemento se perderá, y la lógica es muy similar
al problema presentado anteriormente puesto que los elementos se deben mover
para crear el espacio para el nuevo elemento. Usted se cree capaz de programar
esta solución ayudándose de la Figura 5.7 Método para eliminar un elemento
especifico y salida por pantalla., de ser así genial, si no, no dude solicitarle la
solución a su docente tutor vía EVA.
1 package ARREGLOS;
2
3 import java.util.Arrays;
4
5 public class ClasesVarias_Arreglos {
6
Autoevaluación 5
Instrucciones:
• Anote sus respuestas, para que al final sea usted quien juzgue,
califique y autoevalúe, su nivel de competencias adquiridas,
comparando con el solucionario adjunto al final de esta guía de
estudios.
A. arreglos – colecciones
B. clases – archivos
C. variables – objetos
D. métodos – arreglos
A. System.out.println(arregloA[1]);
B. System.out.println(arregloA[2]);
C. System.out.println(arregloA.length - 2);
D. System.out.println(arregloA[arregloA.length - 2]);
AFIRMACIONES
1. La matriz tiene 3 filas.
2. La matriz tiene 2 columnas.
3. La matriz puede guardar 5 elementos.
4. El último elemento de la matriz es matriz[1][2]
4. Un arreglo es:
1 double opera = 0
2 double arrayNum [ ] = {2.6, 3.4, 4, 1.2, 0.8};
3 for (double num : arrayNum) {
4 opera += (num <=2) ? num ; 0
5 }
6 System.out.printIn(opera);
int [ ]arreglo = {13, 23, 24, 34, 35, 36, 38, 42, 47, 51, 68, 74, 75, 85, 97}
A. 1
B. 2
C. 3
D. 4
int[ ] arreglo = {23, 25, 29, 42, 44, 46, 48, 49, 57, 59, 68, 74, 75, 85, 97};
A. arreglo.length - 1
B. arreglo.length
C. 14
D. 0
int [ ]arreglo = {53, -13, 4, 35, 15, 36, -8, 2, 7, 15, -3, 4, 71, 95, 3}
A. Burbuja
B. Burbuja mejorado
C. Lineal
D. Binario
int[ ] arreglo = {75, 95, 55, 56, 63, 81, 76, 59, 25, 66};
7. Solucionario
B. Incorrecta:bonificaciones no es un atributo
perteneciente a la clase docente ni mediante herencia.
8. Referencias bibliográficas
Deitel, Paul. Deitel, H. (2016). Cómo programar en Java. (Sergio Fonseca Garza,
Alan David Palau, y otros.) (10th ed.). México: Pearson Educación.
Cadenhead, R. (2014). Java 8. (Grupo Comercial Anaya, Ed.) (1st ed.). Madrid:
Ediciones Anaya.
Montero, M. R. (2014). Java 8. (Grupo Comercial Anaya, Ed.) (1st ed.). Madrid:
Multimedia Anaya.
Pearson Español (2019): Sitio Web del texto básico: Cómo programar en Java
10e. Deitel. [En línea]. Enlace Web http://www.pearsonenespanol.com/
mexico/educacion-superior/deitel_index/como-programar-en-java-10e
[Consultado 26-07-2019].
Deitel & Associates (2017): Sitio Web del texto básico: Java How to Program, 10/e
(Early Objects) [En línea]. Enlace Web http://www.deitel.com/books/jhtp10/
[Consultado 28-08-2019].
Pearson Español (2012): Sitio Web del texto básico: Cómo programar en Java
9/e. [En línea]. Enlace Web http://recursosmcc.pearsonenespanol.com/
Deitel/material_adicional.html [Consultado 28-08-2019].
Jaor Software (2019): Un vistazo al Nuevo Apache NetBeans Versión 11. [En
línea]. Enlace web https://www.youtube.com/watch?v=bAsdyFAcOGU
[Consultado 28-08-2019].
Deitel & Associates (2019): Red social Deitel y de alguna de sus obras. [En línea].
Enlace Web http://www.deitel.com/deitelfan [Consultado 28-08-2019].