Sunteți pe pagina 1din 97

DISEÑO Y DESARROLLO DE

APLICACIONES PARA DISPOSITIVOS


MÓVILES
Módulo II

1
Programación orientada a objetos

El problema fundamental del


desarrollo de software es la
complejidad. Sólo hay una
forma fácil de hacerle frente:
divide y vencerás.

Bjarne Stroustrup

2
Profesora

• MTIA Lourdes Domenzain


• Contacto :
– e-mail: domen@itam.mx

3
Contenido

• Algorítmica
– Diagramas de flujo.
– Estructuras algorítmicas de control.
• Conceptos generales de POO
• Diagramas UML
• Programación en Java
– Programación de clases.
– Listas (ArrayList).
– Herencia y re-escritura de código.
– Polimorfismo.
– Interfaces gráficas, paradigma: vista/controlador.

4
Evaluación

• Asistencia.
• Trabajo en clase.
• Proyecto final (a realizarse en la última sesión de clases).
• Presentación del proyecto final.

5
ALGORÍTMICA

6
Algoritmo

• Es un conjunto de pasos consecutivos para resolver un problema con un


fin específico.
• Restricciones:
• Carácter finito: un único inicio/ un único fin.
• Precisos: deben evitarse ambigüedades.
• Con entrada
• Con salida
• Eficaces
• Estableciendo orden en cada uno de los pasos necesarios

7
Diagramas de flujo

• Componentes:
• Inicio/fin

• Flujo de datos

• Expresión

• Condición

• Lectura (entrada de datos)

• Impresión (salida de datos)

8
Estructuras algorítmicas de control
Selectivas
if-then

if-then-else
switch

9
Estructuras algorítmicas de control
Iterativas
while

do-while

for
for

10
Expresiones

• Las expresiones se conforman por operandos y operadores.


• Los operandos pueden ser variables o constantes.
• Los operadores pueden ser:
– De asignación
– Aritméticos
– Relacionales
– Lógicos

11
Operadores

• El operador de asignación “=“ se puede utilizar para inicializar variables .


Asigna el valor de una variable a otra o de una constante a una variable.
– numero=20
– a=b
– a=b+c

12
Operadores

• Operadores aritméticos

13
Operadores

• Operadores relacionales

14
Operadores

• Operadores lógicos:
– &&
• and: si ambas expresiones son verdaderas arroja True
– ||
• or: si solo una expresión es verdadera arroja True
– !
• not: invierte la condición de la expresión

15
Operadores

• El operador (+) también se utiliza para la concatenación de cadenas de


caracteres (String):

• El operador punto (.) se utiliza para que un objeto acceda a los métodos y
los atributos de dicha clase:

16
Prioridad de operadores

1. paréntesis
2. funciones y operadores unarios
3. * / div mod
4. + -
5. > >= < <=
6. = !=
7. and (&&)
8. or (||)

• Si la prioridad es la misma, la expresión se evalúa de izquierda a


derecha.

17
Ejercicios algorítmica

• Resuelva con diagramas de flujo los ejercicios de la sección de Algorítmica


que le fueron entregados como material del Módulo I.
• Pruebe el correcto funcionamiento de sus diagramas realizando mapas de
memoria en cada ejercicio.

18
CONCEPTOS GENERALES DE
PROGRAMACIÓN ORIENTADA A
OBJETOS (POO)

19
Conceptos generales de POO

• Paradigma POO vs programación secuencial.


• Abstracción de conceptos: permite modelar la clase.
• Diferencias con programación estructurada.
• Ventajas:
– Todos los modelos WEB o móviles son programados con objetos.
– Al encapsular el todo como una identidad es más segura y más fácil de
representar, administrar, modificar, mantener, entender…

20
Conceptos generales de POO

• Clase: es la abstracción de un concepto de manera general. Define el tipo


de datos (atributos) que guarda el objeto, así como su funcionalidad
(métodos).
• Objeto: es una instancia u ocurrencia de una clase. Guardan datos y
proporcionan métodos para llegar a ellos y modificarlos. Es una instancia
de la clase y tiene los mismos atributos y métodos.
• Atributos: son las características o propiedades específicas a una clase.
Los atributos definen al objeto.
• Métodos: son las operaciones (“habilidades”) que se pueden realizar con
los objetos de una cierta clase.

21
Conceptos generales de POO

• Notación Camello: En Java, es la manera de escribir los nombres de clases,


métodos y variables.
– Si se representa una clase, se debe de escribir cada palabra que
conforme el nombre de la clase con su inicial en mayúscula y sin
espacios (NombreClase).
– Si se representa un método o variable, se debe escribir la primera
palabra que conforma el nombre del método o variable en
minúscula y las palabras subsecuentes deberán tener su letra
inicial en mayúscula (nombreVariable, nombreMetodo).
– En todos los casos conviene evitar el uso de acentos.

22
Conceptos generales de POO

• Accesibilidad o encapsulamiento: se utiliza para restringir el acceso a los


atributos y/o métodos de una clase; se pueden definir distintos grados de
acceso a los miembros de la clase:
– public (+): cualquier miembro de cualquier clase tiene acceso.
– private (-): sólo se puede usar y modificar por la misma clase.
– protected (#): se utiliza principalmente en herencia. Además de la
súper clase, las subclases pueden tener acceso.
– (paquete) : por omisión

23
Conceptos generales de POO

• Accesibilidad:
– Una variable o método public:
• Es accesible desde cualquier lugar donde la misma clase sea accesible.
• Se hereda a las subclases.
• Es utilizado por los programadores que usan la clase.
– Una variable o método private:
• Sólo es accesible desde el interior de la clase que la declara.
• No se hereda.

24
Conceptos generales de POO

• Accesibilidad:
– Una variable o método protected:
• Es accesible por la misma clase, sus subclases y por las clases contenidas
en el mismo paquete.
• Se hereda a las subclases.
• Es utilizado por los programadores que extienden la clase.

25
Conceptos generales de POO

• Accesibilidad:
– Una variable o método por omisión (paquete):
• Se declara sin modificador de acceso.
• Es accesible por la misma clase y por las clases contenidas en el mismo
paquete.
• Se hereda sólo a las subclases contenidas en el mismo paquete.

26
JAVA

27
Cómo escribir una clase que se ejecuta
(con main)
//Inclusión de librerías

/* Nombre programador
* Fecha creación
* Para que sirve la clase
*/
public class NombreClaseEjecutable {

public static void main( String [ ] args) {


// declaración de variables locales

// cuerpo del programa


}
}

28
Comentarios en Java

• Se utilizan los comentarios como notas acerca de lo que hace un método,


o una sección del programa, para explicarlo a otras personas que lean el
programa o como recordatorio para quien lo escribió.
• En java existen dos tipos de comentarios:
– en una sola línea:
//comentario
– en varias líneas:
/* inicia comentario
termina comentario
*/

29
Inclusión de librerías

• La palabra reservada import se emplea para incluir al proyecto en el que


se este trabajando otras clases ajenas, así se puede reciclar el código de
clases distintas.
Por ejemplo :
import java.util.Scanner;
• La inclusión de librerías se realiza al inicio de la clase (antes de public class
NombreClase)

30
Variables

• Las variables locales se utilizan dentro de los métodos y funciones, y se


declaran en el momento en que son necesarias. Estas variables sólo se
pueden usar dentro del mismo método (scope), es decir, su ámbito de
acción es local al método donde fueron declaradas.

public static void main (String [] args){


int variable;
double numero;
String nombre;
…..
}

31
Sintaxis para declaración de variables

• Para declarar una variable es necesario especificar el tipo de información


que contendrá y en consecuencia el tamaño de memoria que se deberá
reservar:

tipo nombreVariable;

32
Tipos primitivos en Java

33
Cómo codificar diagramas de flujo en Java

if (condición) {
instrucciones;
}

if (condición){
instruccionesA;
}
A else{
B
instrccionesB;
}

34
Cómo codificar diagramas de flujo en Java

switch (selector){
case valor1: instrucciones;
break;
case valor2: instrucciones;
break;
default: instrucciones
}
35
Cómo codificar diagramas de flujo en Java

while (condición){
instrucciones;
}

do{
instrucciones;
}while (condición) ;

36
Cómo codificar diagramas de flujo en Java

for (int varControl=valorInicial; varControl<valorFinal; varControl++){


instrucciones;
}

37
Lectura en Java: clase Scanner

• Empleo de la clase Scanner


//Declaración del objeto
Scanner objLec;
//Instanciacion del objeto
objLec=new Scanner(System.in);
• Ejemplos de lectura
int x;
double y;
boolean b;
String str;

x= objLec.nextInt();
y= objLec.nextDouble();
b= objLec.nextBoolean();
str= objLec.next();
str= objLec.nextLine();

38
Impresión en Java

• Para imprimir:
System.out.print(loQueSeQuiereImprimir);

• Para imprimir e incluir un cambio de línea:


System.out.println(loQueSeQuiereImprimir);

• Ejemplos:
System.out.print(“Ejemplo de impresión literal”);
System.out.println(“con cambio de línea….”);
System.out.println(“suponiendo que x tiene algún valor =“+x);

39
Eclipse

• IDE (Entorno de Desarrollo Integrado)para programar en Java.


• Un IDE son programas compuestos por un conjunto de herramientas de
programación que pueden dedicarse en exclusiva a un sólo lenguaje de
programación o varios.
• https://eclipse.org/downloads/

40
Ejercicios

De acuerdo a los ejercicios de diagramas de flujo resueltos con anterioridad,


codifique de manera independiente clases Ejecutables en Java (clases que
puedan ser ejecutadas, es decir, clases que contengan el método:
public static void main (String [] args){

}
).

41
UNIFIED MODELING LANGUAGE (UML)

42
Diagramas UML

• Notación estándar para el diseño de software.


• Es la síntesis de 3 notaciones separadas.
• Es independiente al lenguaje de programación.
• Provee herramientas para el análisis, diseño e implementación para los
sistemas de software.
• Por su visión universal, se utiliza para representar clases, sus
características y sus relaciones independientemente del lenguaje en que
se codificarán.
• Es útil para estratificar las soluciones del problema antes de programar, de
una manera gráfica y concisa.

43
Diagramas UML

• De manera general consiste de un rectángulo dividido en 3 secciones:

» Nombre de la clase
» Atributos / propiedades

» Constructores, métodos y funciones

44
Diagramas UML

• La primera sección contiene el nombre de la clase (NombreClase) y debe


de estar centrado.

45
Diagramas UML

• La segunda sección contiene los atributos de la clase, primero se coloca el


nivel de encapsulamiento (accesibilidad) del atributo (-, #, +), luego su
nombre, : , y por último su tipo.

46
Diagramas UML

• La tercera sección muestra la funcionabilidad de la clase, es decir, sus


constructores y métodos. Se indica al método su encapsulamiento (-, #,+),
su nombre, seguido de dos paréntesis que llevan los parámetros, y el tipo
de resultado que regresa.

47
Constructores

• Cada clase tiene un (método) constructor


– se llama igual que la clase,
– puede recibir o no parámetros: constructor por parámetros y
constructor nulo.
– no regresa ningún resultado,
– su objetivo es crear un objeto a partir de la clase,
– su accesibilidad siempre es public.

48
Métodos setAtributo

• El objetivo es permitir la modificación de un atributo de la clase a través


del envío de un parámetro.
• Típicamente se programa un método (de tipo void) set por cada atributo
definido en la clase.
• Siempre son public.

49
Funciones getAtributo

• El objetivo es arrojar el contenido de un atributo de la clase


• Típicamente se programa una función (método de tipo específico) get por
cada atributo definido en la clase.
• Siempre son public.

50
Funcionalidad mínima requerida en Java

• Las clases siempre deben de tener de manera obligatoria los métodos


– toString()
– compareTo()
– equals(),
– hashCode(),

• En realidad, los métodos que conforman la funcionalidad mínima


requerida de una clase en Java son métodos que deben ser OVERRRIDING
(ver Herencia), ya que se encuentran en la clase Object.

51
Ejercicios

Realice los ejercicios descritos en la Sección UML de Ejercicios del Módulo I


que se encuentran en el material que le fue entregado al inicio del módulo.

52
TRANSCRIBIENDO DE UML A CÓDIGO
EN JAVA

53
Cómo escribir una clase en Java a partir de
un diagrama UML
//Inclusión de librerías

/* Nombre programador
* Fecha creación
* Para que sirve la clase
*/
public class NombreClase {
//declaración de atributos
//declaración de constructores, constructor nulo
//declaración de métodos set
//declaración de métodos get
//métodos propios de la clase
//funcionalidad mínima requerida de la clase
}

54
Sintaxis de declaraciones en Java

• Variables
– Atributos:
• private/public/protected tipo nombreAtributo;
– Variables locales:
• tipo nombreVariable;
– Parámetros:
• tipo nombreParametro

55
Sintaxis de declaraciones en Java

• Constructores:
public NombreClase(lista parámetros){
//inicialización de atributos con parámetros o ctes.
}
• Métodos:
private/public void nombreMétodo(lista parámetros){
}
• Métodos que arrojan un resultado (funciones)
private/public tipo nombreFunción(lista parámetros){
……
return ____;
}

56
Sintaxis funciones set y get

public void setNombreDelAtributo(tipo nomParametro){


this.nombreDelAtributo = nomParametro;
}

public tipoAtributo getNombreDelAtributo(){


return atributo;
}

57
Función
toString():String
• Método cuyo objetivo es generar una cadena de caracteres (String) con la
“información” (atributos) que define a un objeto determinado.
• Ejemplo de toString en la clase Triangulo:

public String toString(){


StringBuilder cadena = new StringBuilder();

cadena.append(“\nTriangulo de tipo: “+tipo);


cadena.append(“\n base: “+base);
cadena.append(“\n altura: “+altura);
return cadena.toString();
}

58
Función compareTo(NombreClase):int

• Método de tipo entero cuyo objetivo es permitir la comparación de dos


objetos de la misma clase.
• El método puede arrojar 3 posibles valores:
– 0 (cero) si los 2 objetos que se comparan son iguales.
– Positivo (>0) si el objeto que se compara es mayor al parámetro.
– Negativo (<0) si el objeto que se compara es menor al parámetro.
• Ejemplo de compareTo en la clase Triangulo:
public int compareTo(Triangulo otro){
int res=-1;

if (calculaArea() == otro.calculaArea())
res=0;
else
if (calculaArea()>otro.calculaArea())
res=1;
return res;
}
59
Función
equals(Object):boolean
• Método boolean cuyo objetivo es determinar si dos objetos son iguales o
no lo son.
• El método puede arrojar 2 posibles valores:
– True si los 2 objetos que se comparan son iguales.
– False si los 2 objetos que se comparan son diferentes.
• Ejemplo de equals en la clase Triangulo:
public boolean equals(Triangulo otro){
boolean res;

if (calculaArea() == otro.calculaArea())
res=true;
else
res=false;
return res;
}

60
Ejemplo

• Realizar diagrama UML y codificación de la clase en Java de acuerdo al


siguiente enunciado:
• Un pentágono es una figura que tiene 5 lados iguales y una apotema, a esta
figura se le puede calcular su perímetro y su área con unas fórmulas sencillas.
Las características que definen al pentágono pueden ser decimales.

61
Diagrama UML de la clase Pentagono

62
Código en Java de la clase Pentagono

public class Pentagono{ //setters


//atributos public void setApotema(double apotema){
private double apotema; this.apotema=apotema;
private double lado; }
public void setLado(double lado){
//constructores this.lado=lado;
public Pentagono(){ }
} //metodos
public Pentagono(double lado, double apotema){ public double calculaPerimetro(){
this.lado=lado; return lado*5;
this.apotema=apotema; }
} public double calculaArea(){
// getters double area;
public double getApotema(){ area=((lado*5)*apotema)/2;
return apotema; return area;
} }
public double getLado(){ //funcionalidad mínima requerida….
return lado;
} } //delimitador que cierra la clase Pentagono
63
Creación de objetos

• Para crear (o instanciar) un nuevo objeto a partir de una clase, primero


deberá declararse una variable de clase y luego invocar al constructor de
dicha clase. Por ejemplo:

Pentagono unPentagono = new Pentagono(2.0,3.5);

Declaración: Instanciación:
NombreClase variableClase = new MétodoConstructor(param);

64
Ejercicios

Realice los ejercicios descritos en la Sección Clases en Java de Ejercicios del


Módulo I que se encuentran en el material que le fue entregado al inicio del
módulo.

65
LISTAS

66
Conceptos generales

• Estructuras de datos derivadas que permiten almacenar un grupo de datos


bajo el mismo nombre de variable.
• Listas: son estructuras dinámicas, es decir, en el curso de ejecución su
tamaño puede crecer o decrecer.

67
Conceptos generales

• Lista indexada de 7 celdas (nodos):

contenido

0 1 2 3 4 5 6 índice

68
Sintaxis para declaración de listas en Java

• Inclusión de librerías:
– import java.util.ArrayList;
• Sintaxis para declaración:
– ArrayList<tipo> nomLista = new ArrayList<tipo> ();

Donde: tipo debe ser una clase NO tipo primitivo.

69
Métodos y funciones en clase ArrayList

• .add(elemento)
• .add(índice, elemento)
• .isEmpty()
• .indexOf(elemento)
• .contains(elemento)
• .remove(índice)
• .remove(elemento)
• .size()
• .get(índice)
• .clear()
• .expandCapacity()

70
Ejercicios

Realice los ejercicios descritos en la Sección Listas de Ejercicios del Módulo I


que se encuentran en el material que le fue entregado al inicio del módulo.

71
HERENCIA

72
Jerarquía de clases

• Una clase que no extiende explícitamente a otra, extiende implícitamente


la clase Object.
• La clase Object es la raíz de la jerarquía de clases.
• “Object es el padre de todas las clases en Java”

73
Jerarquía de clases

• Todas las clases extienden directa o indirectamente la clase Object y por lo


tanto heredan sus métodos:
– protected Object clone()
• devuelve un clon del objeto
– public boolean equals(Object obj)
• compara el objeto receptor y el objeto referenciado por obj a efectos de
igualdad
– public int hashCode()
• devuelve un código hash para el objeto

74
Herencia

• Para que una clase herede de otra, se debe utilizar la palabra reservada
extends al momento de su declaración.
• Una subclase hereda las variables y los métodos de su superclase.
• Una clase extendida puede:
– Adicionar nuevos constructores
– Proporcionar nuevas variables y métodos
– Sobrecargar y redefinir métodos

75
Herencia

• Una clase extendida debe invocar uno de los constructores de su


superclase mediante la construcción super().
• Esta construcción debe contener los parámetros adecuados.
• Cuando se extiende una clase para añadir nueva funcionalidad se crea una
relación EsUn.
• Por ejemplo, si la clase Vista extiende a la clase JFrame añadiendo otros
componentes GUIs, entonces una Vista esUn JFrame.

76
Re definición de métodos

• Si una subclase define un método que tiene la misma firma que un


método de alguna superclase, se dice que el método está siendo
redefinido o anulado (overriding).
• Se puede utilizar la palabra super dentro del método o constructor para
invocar a la operación original de la superclase.

77
Sobrecarga y redefinición

• Sobrecargar un método es proporcionar más de un método con el mismo


nombre, pero con firmas diferentes.
• Redefinir un método significa sustituir la implementación de la superclase
por un método propio, con la misma firma:
– Reemplazo
– Refinamiento

78
Clases y métodos finales

• Una clase se declara final cuando se desea que no tenga subclases.


• Un método se declara final para evitar que una clase derivada pueda
redefinirlo.

79
POLIMORFISMO

80
Conversión por ensanchamiento

• Las variables de tipo Object se pueden referir a cualquier objeto.


• La clase Object es suficientemente “ancha” para incluir a cualquier otra…
• En general, una variable de tipo X puede contener en cualquier momento
una referencia a una instancia de la clase X o a cualquiera de sus
subclases.

81
Polimorfismo

• El polimorfismo es la característica que permite que objetos de diferentes


clases relacionadas mediante la herencia respondan de forma distinta a
una “misma” llamada de método.
• El polimorfismo es posible por la existencia de objetos polimórficos:
– Un objeto polimórfico puede contener referencias a diferentes tipos
durante el curso de ejecución.
– La existencia de objetos polimórficos es un resultado natural de la
herencia (relación esUn) y de la conversión por ensanchamiento.

82
Polimorfismo

• Sea x una variable de la clase X que define un método m, y sean a y b


instancias de dos subclases diferentes de X que (posiblemente) redefinen
este método.
• Sin importar si x=a ó x=b, podemos escribir x.m() y obtener la respuesta
adecuada.
• Lo anterior es posible porque el método que se manda llamar se
determina en tiempo de ejecución y está en función del objeto realmente
referido por la variable y no por el tipo de la variable.

83
Polimorfismo

• La habilidad de llamar al “mismo” método en múltiples clases y obtener


comportamientos adecuados soporta el reuso de código:
– Se mejora la organización y lectura de los programas, así como su
evolución, al escribir el código para la clase base (de manera genérica)
y olvidarse de las subclases (tal vez desconocidas).

84
Clases abstractas

• Una clase abstracta


– no puede ser instanciada
– sirve como déposito de variables y métodos
• Para indicar que una clase es abstracta se incluye la palabra reservada
abstract.
• Definir una clase abstracta es útil cuando parte del comportamiento es el
mismo para la mayoría o todos los objetos de determinado tipo, pero
otras partes del comportamiento sólo tienen sentido para tipos
particulares y no para una superclase general.
• Una clase abstracta tiene algunos métodos abstractos (listos para
escribirse…están vacíos)

85
Interfaces

• Java usa interfaces para obtener algunos de los beneficios de la herencia


múltiple y evitar sus complicaciones.
• Una interfaz se crea sustituyendo class por interface.
• Una interfaz es una expresión de diseño puro: se compone sólo de
constantes y métodos abstractos (todos!).
• Para implementar (implements) una interfaz, una clase debe proporcionar
una implementación específica de todos los métodos (abstractos) de la
interfaz.
• Las interfaces proporcionan una forma de herencia múltiple porque una
clase puede implementar múltiples interfaces.

86
Ejemplo

• Clase Animal (abstracta o inferfaz)


– clase Perro
– clase Gato
– clase Gallo
• En la clase Animal se especifica el método (abstracto) habla()
• En cada una de las clases que hereda de Animal habla() arrojará un
resultado diferente:
– Para unPerro “guau guau”
– Para unGato “miau miau”
– Para unGallo “Kikiriqui”

87
GRAPHICAL USER INTERFACE (GUI)

88
GUIs

• Paradigma:
– Alguien lanza el mensaje
– Alguien esta disponible a escuchar ese mensaje
– Detona el evento
• División de clases: Vista y Controlador

89
Algunos componentes Java GUI

• JFrame
• JPanel
• JLabel
• JTextField
• JTextArea
• JButton

90
Clase VistaX

• Crear una clase:


public class VistaX extends JFrame {
}
 Los atributos de la clase son los componentes GUIs.
 El constructor los instancia (new) y los agrega (add) al JPanel (p).
 Agregar un “border” y un “layout” al JPanel :
p.setLayout(new GridLayout(ren,col));
Border gap=BorderFactory.createEmptyBorder(2,2,2,2);
p.setBorder(gap);
 Agregar el JPanel al JFrame.

91
Clase VistaX

 Realizar 3 acciones sobre el JFrame:


 Hacerlo visible: setVisible(true);
 Determinar tamaño del la ventana: setBounds(n1,n2,n3,n4);
 Detener la ejecución si la ventana cierra: setDefaultCloseOperation
(EXIT_ON_CLOSE);
• Agregar un main provisional para probar la clase.
• Imports necesarios:
– import javax.swing.*;
– import javax.swing.border.Border;
– import java.awt.GridLayout;

92
Ejercicio

• Realizar una clase VistaConversion para dibujar una ventana como la que
se muestra a continuación:

93
Clase ControladorX

• Crear una clase:


public class ControladorX extends VistaX{
}
 Programar un constructor que invoque al constructor del “padre” y
agregue un “escuchador” para cada componente GUI al cuál se desee
reaccionar:
 super();
 componenteGUI.addActionListener(new ClaseEscuchador());
 Declarar una clase privada para cada “escuchador”:
private class ClaseEscuchador implements ActionListener{
}

94
Clase ControladorX

 Programar en cada ClaseEscuchador el método:


public void actionPerformed(ActionEvent ae) {
// lo que se desea ejecutar cuando “detone” el escuchador.
}
 Agregar un main definitivo para ejecutar la clase.
• Imports necesarios:
– import java.awt.event.ActionEvent;
– Import java.awt.event.ActionListener;

95
Ejercicios

Realice los ejercicios descritos en la Sección GUIs de Ejercicios del Módulo I


que se encuentran en el material que le fue entregado al inicio del módulo.

96
Bibliografía

• http://java.com/es/about/
• http://www.omg.org/technology/documents/modeling_spec_catalog.htm
#UML
• Guardati, S. “Estructuras de datos básicas, Programación orientada a
objetos con Java”, 2015, Alfaomega.

97

S-ar putea să vă placă și