Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción A La Informática - Fernando Berzal
Introducción A La Informática - Fernando Berzal
Conceptos bsicos
Informtica
Ordenador
Hardware y software
Codificacin de la informacin
Cdigo binario
Bits y bytes
Estructura funcional de un ordenador: Arquitectura von Neumann
Unidades de entrada y de salida
Memoria (principal y auxiliar)
CPU = ALU + UC
Soporte lgico de los ordenadores
Sistema operativo
Software de aplicacin
Apndices
Historia de la Informtica
Componentes de un PC
Lecturas recomendadas
Alberto Prieto, Antonio Lloris & Juan Carlos Torres:
Introduccin a la Informtica, 3 edicin, captulo 1
McGraw-Hill / Interamericana de Espaa, 2002
Conceptos bsicos
Informtica
del francs
en ingls
Ordenador
Mquina capaz de aceptar unos datos de entrada, efectuar con ellos
operaciones lgicas y aritmticas, y proporcionar los datos resultantes a travs de
un medio de salida; todo ello sin la intervencin de un operador humano y bajo
el control de un programa de instrucciones previamente almacenado en el
ordenador.
vs. Calculadora Mquina capaz de efectuar operaciones aritmticas
bajo el control directo del usuario:
- No realiza operaciones de tipo lgico
- No enlaza automticamente las operaciones que realiza
Ejemplos de operaciones aritmticas y lgicas
- Operaciones aritmticas:
sumar, restar, multiplicar, dividir...
- Operaciones lgicas:
comparaciones, operaciones del lgebra de Boole...
Introduccin a la Informtica
-1-
Fernando Berzal
Hardware y software
HARDWARE [Soporte fsico]
La mquina en s; es decir, el conjunto de circuitos electrnicos, cables,
dispositivos electromecnicos y otros elementos fsicos que forman los
ordenadores
SOFTWARE [Soporte lgico]
Conjunto de programas ejecutables por el ordenador.
Introduccin a la Informtica
-2-
Fernando Berzal
Dato
Representacin formal de hechos, conceptos o instrucciones adecuada para su
comunicacin, interpretacin y procesamiento por seres humanos o medios
automticos.
Ejemplos: 25C, 25m, 1234-BCD, 4/10/2004...
Informacin
El significado que un ser humano le asigna a los datos.
Introduccin a la Informtica
-3-
Fernando Berzal
Codificacin de la informacin
Codificar es representar los elementos de un conjunto mediante los de otro, de
forma tal que a cada elemento del primer conjunto le corresponda un elemento
distinto del segundo.
Cdigo binario
En el interior de los ordenadores digitales actuales, la informacin se
almacena y se transfiere de un sitio a otro segn un CDIGO BINARIO.
El cdigo binario utiliza nicamente dos smbolos diferentes: {0, 1}
Cualquier dato que introduzcamos en el ordenador o que sea manipulado
por l se codifica en su interior por una sucesin de ceros y unos (que
fsicamente se representa por corrientes elctricas, campos magnticos,
marcas pticas...)
En la entrada y la salida del ordenador, los cambios de cdigo se realizan
de forma automtica para que no tengamos que introducir ni interpretar la
informacin codificada.
Bits
La unidad ms elemental de informacin en el interior de un ordenador es
un valor binario (0 1). Esta unidad elemental de informacin se denomina BIT
(BInary uniT).
Un bit representa la informacin correspondiente a la ocurrencia de un
suceso de dos posibilidades (opciones) distintas.
Cualquier suceso que tenga ms de dos posibilidades no podr
representarse con un nico bit, ya que faltaran valores para codificar la
informacin. Para que una codificacin sea correcta, a cada elemento de un
conjunto se ha de asignar un elemento distinto del otro conjunto.
Introduccin a la Informtica
-4-
Fernando Berzal
Ejemplo de codificacin
Mensaje
Confirmo asistencia
Cdigo Morse
--
-
---
-
-
-
-- --
-- -
01000001
01001000
10100101
01010101
01000010
01001001
01001111
01010110
01000011
01001010
01010000
01010111
01000100
01001011
01010001
01011000
01000101
01001100
01010010
01011001
01000110
01001101
01010011
01011010
01000111
01001110
01010100
Introduccin a la Informtica
-5-
Fernando Berzal
Bytes
Usualmente, la informacin se representa por medio de caracteres. A cada
carcter le corresponde un cierto nmero de bits. Un BYTE es el nmero de bits
necesario para almacenar un carcter. Este nmero depende del cdigo utilizado
(generalmente, 8).
Para medir la capacidad de almacenamiento del un ordenador se utilizan
mltiplos del byte:
Kilobyte
Megabyte
Gigabyte
Terabyte
1 KB
1 MB
1 GB
1 TB
210 bytes
220 bytes
230 bytes
240 bytes
1 024 bytes
1 048 576 bytes
1 073 741 824 bytes
1 099 511 627 776 bytes
Ejemplos
Datos
Texto
Imagen en
blanco y negro
Imagen
en color
Sonido de
baja calidad
Sonido de
alta calidad
Vdeo
(calidad VHS)
Vdeo
(calidad DVD)
Tamao
800 000 bytes
(unos 780 KB)
98 304 bytes
(menos de 100KB)
2 359 296 bytes
(unos 2300KB)
1 980 000 bytes
(casi 2MB)
23 814 000 bytes
(casi 23MB)
41 057 280 000 bytes
(casi 40GB)
167 961 600 000 bytes
menos de 160GB !!!
Introduccin a la Informtica
-6-
Fernando Berzal
Estructura funcional
de un ordenador:
Arquitectura von Neumann
Unidades de entrada
Dispositivos por medio de los cuales se introducen datos e instrucciones en el
ordenador.
vg: Teclado, ratn, cmara digital, escner, lector de cdigos de barras...
Unidades de salida
Dispositivos por donde se obtienen los resultados de los programas ejecutados
por el ordenador.
vg: Monitor, impresora, plotter, sintetizador de voz...
Introduccin a la Informtica
-7-
Fernando Berzal
Memoria
Donde se almacenan, por un corto o largo perodo de tiempo, tanto los datos
como las instrucciones.
Memoria principal/central/interna
La que trabaja a mayor velocidad
RAM [Random Access Memory]: De lectura y escritura, suele ser voltil.
ROM [Read Only Memory]: Slo lectura (no se puede modificar), permanente.
:
Memoria auxiliar/secundaria/externa/masiva
Ms lenta, pero de mayor capacidad que la memoria principal
:
vg:
Dispositivos de almacenamiento
como discos magnticos y pticos, cintas magnticas...
Introduccin a la Informtica
-8-
Fernando Berzal
Microprocesador (P)
CPU contenida en uno
o varios circuitos integrados (chips)
Introduccin a la Informtica
-9-
Fernando Berzal
Ejecucin de un programa
Una vez cargado el programa en memoria, se le cede el control del ordenador:
1. Se lee una instruccin del programa.
2. La unidad de control decodifica la instruccin
3. La unidad de control enva las seales necesarias para ejecutar la instruccin:
a. Se leen los datos de entrada (1 2)
b. Se efecta una operacin con ellos en la ALU (p.ej. suma)
c. Se almacena el resultado
4. Se determina cul debe ser la siguiente instruccin que se debe ejecutar.
5. Se vuelve al paso 1.
Tipos de instrucciones
Instrucciones de transferencia de datos
Mover datos de un sitio a otro
Instrucciones de tratamiento
Realizacin de operaciones aritmticas y lgicas
Instrucciones de bifurcacin y saltos
Alteracin del orden secuencial de ejecucin de las instrucciones
p.ej.: Llamadas/retornos de subrutinas
Otras
p.ej.: Peticin de interrupciones, detencin de la CPU...
Introduccin a la Informtica
- 10 -
Fernando Berzal
Introduccin a la Informtica
- 11 -
Fernando Berzal
Clasificacin
Software de sistema
Sistema operativo (SO)
Herramientas / utilidades (complementos del SO)
Optimizacin de recursos (p.ej. desfragmentador de disco)
Diagnstico del sistema
Herramientas de administracin
Backup (p.ej. compresin de archivos)
Antivirus (McAffee, Norton, Panda...)
Software de aplicacin
Programacin
Traductores (compiladores/intrpretes)
Depuradores
Editores de texto
Entornos integrados de desarrollo (IDEs)
Ciencia/Ingeniera
CAD/CAM (AutoCAD, Cadence)
Clculo matemtico (Mathematica, Matlab, SPSS)
Sistemas gestores de bases de datos (Oracle, IBM DB2, Interbase...)
- 12 -
Fernando Berzal
Sistemas operativos
Sistema operativo
Conjunto de programas encargado de controlar los recursos del ordenador
Funciones
Evitar que el usuario/aplicacin tenga que conocer con demasiados
detalles el hardware (esto es, servir de puente entre el hardware y los
programas de aplicacin)
Ofrecer una interfaz de usuario que permita ejecutar aplicaciones (p.ej.
interfaz grfica de usuario tipo WIMP)
Mdulos
KERNEL (ncleo del sistema operativo)
- Cargador inicial (arranque del ordenador)
- Administrador de CPU (dispatcher/planificador)
- Administrador de memoria (memoria virtual, swapping)
- Gestor de archivos (FAT, NTFS...)
- Comunicacin entre procesos
- Proteccin de datos y control de acceso
Controladores de dispositivos (drivers)
Herramientas de administracin
Interfaz de usuario (GUI)
Clasificacin
Monousuario
Monotarea
vs.
vs.
Multiusuario
Multitarea
Introduccin a la Informtica
Multitarea
OS/2 (IBM)
MacOS (Apple)
Windows 95/98/Me (uso domstico)
Windows NT/2000 (uso profesional)
Windows XP
UNIX (IRIX, Solaris/SunOS, Linux...)
- 13 -
Fernando Berzal
Introduccin a la Informtica
- 14 -
Fernando Berzal
Introduccin a la Informtica
- 15 -
Fernando Berzal
Software peligroso
Virus
Pequeo programa diseado para instalarse y ejecutarse en un ordenador
sin permiso del usuario y, habitualmente, con mala intencin
- Funciones: propagarse, defenderse & realizar alguna accin (inocua/daina).
- Suelen permanecer inactivos algn tiempo para propagarse sin ser detectados.
Tipos
- Virus clsicos: Infectan ficheros ejecutables (.exe, .com...)
- Virus de macros: Macros dentro de documentos (Word, Excel...)
- Virus MBR [Master Boot Record]: Infectan el sector de arranque del
disco y permanecen incluso cuando formateamos el disco.
Troyanos
Programas que hacen algo de cara al usuario
y, adems, realizan otras tareas "ocultas".
Bombas lgicas
Software, incluido por los que desarrollaron la aplicacin,
que se activa cuando se dan ciertas condiciones (p.ej. fecha).
Introduccin a la Informtica
- 16 -
Fernando Berzal
Historia de la Informtica
Dispositivos mecnicos
Dispositivos electromecnicos
Primera generacin (1946-1957): Vlvulas de vaco
Segunda generacin (1958-1964): Transistores
Tercera generacin (1965-1970): Circuitos integrados
Cuarta generacin (1971-...): Microprocesadores
http://www.snopes.com/inboxer/hoaxes/computer.asp
Dispositivos mecnicos
Fecha
3000 a.C.
Invencin
baco
1612-1614
1622
1642
1674
Mquina de Leibnitz
Sumas, restas, multiplicaciones y divisiones
1801
Telares Jacquard
Tarjetas perforadas controlan el telar
1820
Arithmometer
Primera calculadora producida en masa
1822
1834
baco
Historia de la Informtica
-1-
Fernando Berzal
Regla de clculo
Mquina de Pascal
Historia de la Informtica
-2-
Fernando Berzal
Telares Jacquard
Historia de la Informtica
-3-
Fernando Berzal
Charles Babbage
Historia de la Informtica
Fernando Berzal
Dispositivos electromecnicos
Rel
Fecha
1889
Invencin
Mquina tabuladota de Hollerith para el Censo de EE.UU
1914
1938
1944
Historia de la Informtica
-5-
Fernando Berzal
Primera generacin
Vlvulas de vaco
Fecha
1946
Ordenador
ENIAC (Electronic Numerical Integrator And Computer)
1948
Manchester Mark I
Primer ordenador digital con programa almacenado
Whirlwind (Jay Forrester, MIT)
Primer ordenador de tiempo real
EDSAC (Electronic Delay Storage Automatic Computer)
Maurice Wilkes, Universidad de Cambridge, Inglaterra
ILLIAC I (Universidad de Illinois en Urbana-Champaign)
1949
1949
1952
Historia de la Informtica
-6-
Fernando Berzal
Historia de la Informtica
-7-
Fernando Berzal
Empresa
Tabulating Machines Co. (Herman Hollerith)
1911
1924
1938
HP: Hewlett-Packard
Desde un garage de Palo Alto (William Hewlett & David Packard)
1958
Remington-Rand Corporation:
UNIVAC Division (Universal Automatic Computer)
UNIVAC I (1951)
Primer ordenador comercial, empleado para el censo de EEUU en 1951
UNIVAC 1103A (1953)
Primera mquina comercial con memoria de ncleos de ferrita
-8-
Fernando Berzal
Segunda generacin
Transistores
1958-1964
Fecha
1957
1960
1961
1964
1965
Ordenador
Atlas Guidance Computer (Burroughs)
Control del lanzamiento del misil Atlas
DEC PDP-1 (Digital Equipment Corporation)
Primer ordenador comercial con monitor y teclado
IBM 7030, Stretch
30x ms rpido que el IBM 704
CDC 6600 (Control Data Corporation)
Primer supercomputador comercial
DEC PDP-8 (Digital Equipment Corporation)
Primera minicomputadora
DEC PDP-8
Historia de la Informtica
-9-
Fernando Berzal
Tercera generacin
Circuitos integrados
Inventados en 1958:
Jack Kilby en Texas Instruments
Robert Noyce en Fairchild Semiconductor
Fecha
1965
1964
Ordenador
Burroughs B2500 y B3500
Primeros ordenadores con circuitos integrados
IBM anuncia su lnea de ordenadores System/360
1972
DEC PDP-11/45
1976
Cray-1
Primer supercomputador vectorial
DEC VAX-11/780
1978
IBM 360
Ley de Moore (Gordon Moore, ejecutivo de Intel):
El nmero de transistores en un chip se duplica cada 18 meses
Menor tamao = Menor consumo = Mejor rendimiento
Historia de la Informtica
- 10 -
Fernando Berzal
Cuarta generacin
Microprocesadores
Primer microprocesador (de 4 bits)
Intel 4004 (1971), 108kHz, unos 4004 transistores
Microprocesadores de 8 bits
Intel 8008 (1972), Intel 8080 (1974) e Intel 8085 (1976)
Microprocesadores de 16 bits
Intel 8086 (1978), 4.77 MHz
Microprocesadores de 32 bits
Intel 80386 (1985)
Microprocesadores de 64 bits
DEC Alpha (1992)
Intel Itanium, IA-64
Microprocesadores utilizados en PCs
CPUs
Ao(s) Transistores
1978-81
1984
1987-88
1990-92
1993-95
1996
1996
1997
1997
1997
1998
1995
1997
1997
1998
1999
Historia de la Informtica
1999
2000
2001
- 11 -
29,000
134,000
275,000
1,200,000
3,100,000
--3,500,000
4,500,000
6,000,000
6,000,000
5,500,000
8,800,000
7,500,000
9,300,000
27,400,000
18,900,000
9,300,000
?
28,000,000
22,000,000
37,000,000
42,000,000
Fernando Berzal
Intel 4004
Intel Pentium 4
Historia de la Informtica
- 12 -
Fernando Berzal
Ordenador
Alto (Xerox PARC: PC experimental con ratn, Ethernet y GUI)
MITS Altair 8800 (primer ordenador personal comercial)
Apple I (Steve Jobs & Steve Wozniak)
Apple II
Osborne 1 (primer ordenador porttil)
Xerox Star (versin comercial del Alto)
IBM PC (arquitectura abierta)
IBM PC-XT
Apple Lisa
IBM PC-AT (80286)
Apple Macintosh
Apple Next
Apple Newton (primer PDA)
Altair
Alto
Apple I
Osborne 1
Macintosh
IBM PC-XT
Newton
http://oldcomputers.net/
http://www.theoldcomputer.com/
http://www.old-computers.com/
http://www.computer.org/history/
Historia de la Informtica
- 13 -
Fernando Berzal
-1-
Componentes de un PC
-2-
Microprocesador
Fabricante
vg: Intel, AMD
Generacin (modelo del microprocesador)
vg: Intel Pentium 4, AMD Athlon
La frecuencia interna del reloj (Hz)
vg: > 2 GHz
Slo la parte interna del microprocesador funciona a esa frecuencia.
Tamao de palabra (bits)
vg: 32 bits
Memoria cach interna
vg: 512KB
CPU
-3-
CPUs
8086 and 8088
80286
80386DX and 80386SX
80486SX, 80486DX,
80486DX2 and 80486DX4
Pentium
Cyrix 6X86
AMD K5
IDT WinChip C6
Pentium MMX
IBM/Cyrix 6x86MX
IDT WinChip2 3D
Pentium Pro
AMD K6
Pentium II
AMD K6-2
Mobile Pentium II
Mobile Celeron
Pentium III
AMD K6-3
Pentium III CuMine
AMD original Athlon
AMD Athlon Thunderbird
Pentium 4
Ao(s)
1978-81
1984
1987-88
1990-92
Transistores
29,000
134,000
275,000
1,200,000
1993-95
1996
1996
1997
1997
1997
1998
1995
1997
1997
1998
1999
3,100,000
--3,500,000
4,500,000
6,000,000
6,000,000
5,500,000
8,800,000
7,500,000
9,300,000
27,400,000
18,900,000
9,300,000
?
28,000,000
22,000,000
37,000,000
42,000,000
1999
2000
2001
-4-
Memoria RAM
Tamao (bits)
vg: 256 MB
Velocidad
Fecuencia del reloj (MHz)
Tiempo de refresco (ns)
vg: PC-100
10 ns
-5-
Placa base
Placa ATX
Mejor distribucin de los componentes y circulacin de aire:
CPU colocada junto a la fuente de alimentacin para recibir el
aire del ventilador.
Conectores para teclado y ratn de tipo PS/2.
Baby AT
Basado en el modelo original del IBM PC-AT, fsicamente
compatible con ste pero de dimensiones ms reducidas.
Conector para teclado DIN de 5 pins.
-6-
-7-
Chipset de Intel
POST
[Power On Self Test]
BIOS
[Basic Input Output System]
-8-
PGA
ZIF
Slot 1
Slot A
Slot 1
-9-
Buses
1 ISA
1 VLB
1 PCI
Puertos
1 AGP
Buses
1
1
1
1
1
IDE
EIDE (Enhanced IDE)
SCSI
USB
Firewire (IEEE 1384)
Puertos
1
vg: Modem
vg: Impresora
- 10 -
- 11 -
Puertos serie
Puerto paralelo
Puerto multimedia
- 12 -
Dispositivos de almacenamiento
Parmetros
Capacidad (MB, GB, TB)
Velocidad
o Velocidad de transferencia (MB/s)
o Tiempo medio de acceso (ms)
vg: 10MB/s
vg: 14ms (HD)
150ms (CD)
Almacenamiento de informacin
o Dispositivos magnticos: disco 3, disco duro
o Dispositivos pticos: CD-ROM, DVD
Modo de acceso
o Directo (discos)
o Secuencial (cintas)
Dispositivos de almacenamiento
- 13 -
Disquetes
Tamao
Modelo
Capacidad
Descripcin
5,25"
SS/DD
180 Kb
5,25"
DS/DD
360 Kb
5,25"
DS/HD
1,2 MB
3,5 "
DS/DD
720 Kb
3,5"
DS/HD
1,44 MB
Disco antiguo de 5
Disco de 3
Discos duros
Velocidad de rotacin en revoluciones por minuto (rpm)
Memoria cach
- 14 -
Discos pticos
CD-ROM
CD-R
CD-RW
DVD
Compact-Disc Read-Only-Memory
Compact-Disc Recordable
Compact-Disc ReWritable
Digital Versatile Disc
Lector de CD
650 MB
4.7 GB
CD-ROMs
2,400 KB/s
3,600
4,800
6,000
7,200
9,000
(16x)
(24x)
(32x)
(40x)
(48x)
(60x)
- 15 -
Cintas magnticas
vg: QIC (120MB), Travan (800MB-4GB), DAT (2GB-4GB)
Unidad de cinta
Cinta magntica
Zip
LS-120
Discos de 120 MB
Memorias flash
Zip
Jaz
LS-120
- 16 -
Perifricos de E/S
Dispositivos de entrada
1 Ratn
1 Teclado
Dispositivos de entrada
1 Escner
1 Cmara
1 Micrfono (tarjeta de sonido)
Dispositivos de salida
1 Impresora
1 Monitor (tarjeta grfica)
1 Altavoces (tarjeta de sonido)
Dispositivos de salida
Dispositivos de entrada/salida
1 Modem
1 Tarjeta de red
Fernando Berzal & Nicols Marn
Departamento de Ciencias de la Computacin e Inteligencia Artificial
Universidad de Granada
- 17 -
Ratn
Tipos de ratones
Mecnicos (bola) u pticos (LEDs)
Conexin va puerto serie (RS-232), PS2 o USB
Normales o inalmbricos (conexin por infrarrojos)
Dispositivos similares
Joystick
Trackball
Touchpad
- 18 -
Teclado
Estndar:
Teclado QWERTY
Conexin:
- 19 -
Impresora
Parmetros
Resolucin
Puntos por pulgada (dpi)
vg: 600x300 (600 dpi horizontal x 300 dpi vertical)
Velocidad de impresin
Pginas por minuto (ppm) o caracteres por segundo (cps)
NOTA: Vara en funcin de la resolucin
buffer
- 20 -
Tipos de impresoras
1 Impresoras de impacto: margarita, agujas (9, 12, 24)
1 Impresoras lser
Plotters
Impresoras fotogrficas
Impresoras de gran formato
Impresoras multifuncin
- 21 -
Monitor
Conexin
A travs de la tarjeta grfica.
Parmetros
Tamao
Pulgadas (diagonal)
vg: 15, 17
Resolucin
Pxeles (picture elements)
vg: 1024x768
Distancia entre puntos (dot pitch)
Definicin de las imgenes
vg: 0.28 mm
Frecuencia de refresco (Hz)
vg: > 72Hz
Tipos de monitores
Tubos CRT
Pantallas TFT
- 22 -
Tarjeta grfica
Alternativas
Tarjeta de expansin independiente o integrada en la placa base
Caractersticas
Resolucin mxima (pxeles)
vg: 1024x768
Profundidad de color (bits por pxel o nmero de colores)
vg: 24
Memoria (MB)
vg: 16MB
Modos grficos (configuraciones posibles)
vg: SVGA (800x600, 256 colores)
- 23 -
- 24 -
Modem [MOdulador-DEModulador]
Modem interno
Modem externo
Norma
Explicacin
V.22bis
V.32
Comunicaciones mdem-mdem
9.600
V.32bis
14.400
V.34
28.800
V.34+
33.600
V.90
55.600
V.29
Comunicaciones mdem-fax
14.400
V.42 y MNP2-4
Control de errores
No aplicable
V.42bis y MNP5-10
Compresin de datos
No aplicable
- 25 -
Tarjeta de sonido
Caractersticas
Precisin de los conversores A/D y D/A (nmero de bits)
Frecuencia de muestreo
Ejemplo: CD
16 bits, 44100Hz, estreo
- 26 -
Escner
Escner de sobremesa
Escner de mano
Caractersticas
Resolucin (puntos por pulgada, ppp)
Profundidad de color (bits)
Calidad del CCD [Charge-Coupled Device]
Longitud
Anchura
Resolucin horizontal
Resolucin vertical
Bits de color (bits por pxel)
Perifricos relacionados
Lectores de cdigos de barras
Cmaras fotogrficas digitales
Webcams
Fernando Berzal & Nicols Marn
Departamento de Ciencias de la Computacin e Inteligencia Artificial
Universidad de Granada
- 27 -
UPS
Tarjeta de televisin
Tarjeta TV
Reproductor MP3
Reproductor mp3
- 28 -
Algoritmos y programas
Algoritmo
Secuencia ordenada de pasos que resuelve un problema concreto.
Caractersticas
- Correccin
(sin errores).
- Precisin
(ausencia de ambigedades).
- Repetitividad
(solucin genrica de un problema dado).
- Finitud
(nmero finito de rdenes no implica finitud).
- Eficiencia
(temporal [tiempo necesario] y espacial [memoria utilizada])
Programa
Implementacin de un algoritmo en un lenguaje de programacin
Datos de
entrada
Programa
Instrucciones
Datos de
salida
Introduccin a la Programacin
-1-
Fernando Berzal
Lenguajes de programacin
Una instruccin es un conjunto de smbolos que representa una orden
para el ordenador: la ejecucin de una operacin con datos.
Las instrucciones se escriben en un lenguaje de programacin:
- Se forman con smbolos tomados de un determinado repertorio
(componentes lxicos)
- Se construyen siguiendo unas reglas precisas (sintaxis)
Lenguaje mquina
El nico que entiende directamente la CPU del ordenador
Depende del modelo de ordenador
Repertorio de instrucciones reducido (operaciones muy elementales)
Muy difcil programar en l (en binario, con cadenas de ceros y unos)
Lenguaje ensamblador
Equivalente al lenguaje mquina, cada lnea de cdigo se traduce en
una instruccin para la mquina.
Le asocia mnemnicos a las operaciones que entiende la CPU
Repertorio de instrucciones reducido (operaciones muy elementales)
Programas difciles de entender
Lenguajes de alto nivel
Permiten que el programador exprese el procesamiento de datos de
forma simblica, sin tener en cuenta los detalles especficos de la
mquina.
Independientes del modelo de ordenador
Proporcionan un mayor nivel de abstraccin
Introduccin a la Programacin
-2-
Fernando Berzal
-3-
Fernando Berzal
C++
1983, Bjarne Stroustroup (AT&T Bell Labs)
Extensin de C que permite la programacin orientada a objetos
Java
1995, Sun Microsystems
Similar a C++, aunque ms sencillo de aprender y usar.
C#
2000, Microsoft Corporation
Alternativa de Microsoft a Java, muy similar a ste
-4-
Fernando Berzal
Introduccin a la Programacin
-5-
Fernando Berzal
Introduccin a la Programacin
-6-
Fernando Berzal
Traductores
Los traductores transforman programas escritos en un lenguaje de alto
nivel en programas escritos en cdigo mquina:
Tipos de traductores
Compiladores
Generan un programa ejecutable a partir del cdigo fuente
Intrpretes
Van analizando, traduciendo y ejecutando las instrucciones del
programa una a una. No se traduce una instruccin hasta que la
ejecucin de la anterior haya finalizado.
Herramientas de programacin
Editores, depuradores, profilers...
IDEs (entornos integrados de desarrollo)
Ejemplos Microsoft Visual Studio .NET
Borland C++Builder/Delphi
Eclipse
Introduccin a la Programacin
-7-
Fernando Berzal
-8-
Fernando Berzal
Planificacin
Delimitacin del mbito del proyecto, estudio de viabilidad, anlisis de riesgos,
estimacin de costos, planificacin temporal y asignacin de recursos.
Implementacin:
Adquisicin de componentes, creacin de los mdulos de la
aplicacin en un lenguaje de programacin e integracin de los
recursos necesarios para que el sistema funcione.
Depuracin y pruebas:
Comprobacin del funcionamiento de la aplicacin
Pruebas de unidad y de integracin, pruebas alfa, pruebas beta, test de aceptacin.
-9-
Fernando Berzal
Introduccin a la programacin
Java
La plataforma de programacin Java
Historia
La mquina virtual Java
Herramientas de programacin en Java
Aplicaciones y applets
Aplicacin de ejemplo
Applet de ejemplo
Fases en la creacin y ejecucin de programas en Java
Caractersticas clave de Java
Mitos y realidades
La plataforma Java
- 11 -
Fernando Berzal
Historia de Java
Hay versiones distintas sobre el origen, concepcin y
desarrollo de Java, desde la que dice que ste fue un proyecto que
estuvo durante mucho tiempo por distintos departamentos de Sun
sin que nadie le prestara atencin hasta la ms difundida, que
presenta a Java como un lenguaje pensado para pequeos
electrodomsticos:
Hace algunos aos, Sun Microsystems decidi intentar introducirse en el
mercado de la electrnica de consumo y desarrollar programas para pequeos
dispositivos electrnicos. Sun decidi crear una filial, denominada FirstPerson Inc..
El mercado inicialmente previsto para los programas de FirstPerson eran los
equipos domsticos: microondas, tostadoras y, fundamentalmente, televisores
interactivos. En este mercado, dada la falta de pericia de los usuarios, se requeran unos
interfaces mucho ms cmodos e intuitivos que los sistemas de ventanas del momento.
James Gosling decidi que las ventajas aportadas por la eficiencia de C++ no
compensaban el gran coste de la prueba y depuracin de aplicaciones C++. Gosling
haba estado trabajando en un lenguaje de programacin que l haba llamado Oak, el
cual, an partiendo de la sintaxis de C++, intentaba remediar las deficiencias que iba
observando.
El primer proyecto en que se aplic este lenguaje recibi el nombre de proyecto
Green y consista en un sistema de control completo de los aparatos electrnicos y el
entorno de un hogar.
Para ello se construy un ordenador experimental denominado *7
(Star Seven). El sistema presentaba una interfaz basada en la
representacin de la casa de forma animada y el control se llevaba a
cabo mediante una pantalla sensible al tacto. En el sistema apareca
Duke, la mascota de Java.
Posteriormente, se aplic a otro proyecto de VoD (Video On Demand) en el que
se empleaba como interfaz para la televisin interactiva. Ninguno de estos proyectos se
convirti nunca en un sistema comercial.
Cuando en Sun se dieron cuenta de que a corto plazo la televisin interactiva no
iba a ser un gran xito, urgieron a FirstPerson a desarrollar con rapidez nuevas
estrategias que produjeran beneficios. No lo consiguieron y FirstPerson cerr en la
primavera de 1994.
A pesar de este fracaso, Bill Joy, cofundador de Sun y uno de los desarrolladores
principales del Unix de Berkeley, juzg que Internet poda llegar a ser el terreno
adecuado para disputar a Microsoft su primaca casi absoluta en el terreno del software
y vio en Oak el instrumento idneo para llevar a cabo estos planes. Tras un cambio de
nombre, al estar Oak ya registrado como marca, el lenguaje Java fue presentado en
sociedad en mayo de 1995 (Sun World95).
http://java.sun.com/features/1998/05/birthday.html
- 12 -
Fernando Berzal
Java Bytecode
Compilador JIT
o intrprete
Compilador
(javac)
Execution
Java Bytecode
Tiempo
de compilacin
Tiempo
de ejecucin
- 13 -
Fernando Berzal
Applets
Los applets son programas diseados para ejecutarse como
parte de una pgina web.
Java impone restricciones de seguridad para que los applets no
puedan daar el ordenador en que se ejecutan
Ejemplos: Acceder a ficheros locales
Ejecutar otro programa
Conectarse a otro ordenador desde el nuestro.
- 14 -
Fernando Berzal
De pago
Borland JBuilder
IBM Visual Age for Java
Sybase PowerJ
Metrowerks CodeWarrior
- 15 -
Fernando Berzal
Aplicaciones y applets
Creacin y ejecucin de aplicaciones Java
Editor
Cdigo Java:
Prog.java
de texto
javac Prog.java
Bytecode:
Prog.class
java MyProg
Salida
Cdigo Java:
App.java
javac App.java
Bytecode:
App.class
Editor
de texto
Pgina web:
App.html
appletviewer MyApp.html
- 16 -
Navegador
Web
Ventana
Fernando Berzal
Aplicacin de ejemplo
Cdigo Java: Fichero Programa.java
public class Programa
{
public static void main (String[] args)
{
System.out.println("Hola");
}
}
Compilacin
javac Programa.java
Ejecucin
java Programa
Resultado
- 17 -
Fernando Berzal
Applet de ejemplo
Cdigo Java: Fichero Saludo.java
import java.awt.*;
import java.applet.Applet;
public class Saludo extends Applet
{
public void paint(Graphics g) {
g.drawString("Hola!", 50, 50);
}
}
Resultado
- 18 -
Fernando Berzal
- 19 -
Fernando Berzal
Java es multiplataforma
Los programas escritos en Java se compilan en un bytecode
independiente de la mquina y todos los sistemas operativos
principales tienen entornos de ejecucin de aplicaciones Java
[mquinas virtuales].
NOTA: La idea no es nueva (p.ej. UCSD Pascal)
Java es seguro
Pueden forzarse restricciones sobre las operaciones permitidas (los
applets no acceden directamente al hardware de la mquina).
Al cargar un programa en memoria, la mquina virtual Java verifica
los bytecodes de la aplicacin.
Java tiene un amplio conjunto de bibliotecas estndar
Bibliotecas para trabajar con colecciones y otras estructuras de
datos, ficheros, acceso a bases de datos (JDBC), interfaces grficas
de usuario (JFC/Swing), redes de ordenadores (RMI, Jini),
aplicaciones distribuidas (EJB), interfaces web (servlets/JSP),
hebras, compresin de datos, criptografa...
- 20 -
Fernando Berzal
- 21 -
Fernando Berzal
- 22 -
Fernando Berzal
Tipo de dato
Especificacin de un dominio (rango de valores) y de un conjunto
vlido de operaciones a los que normalmente los traductores
asocian un esquema de representacin interna propio.
Introduccin a la Programacin
- 23 -
Fernando Berzal
2N
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
- 24 -
Fernando Berzal
NMEROS ENTEROS
Ejemplo: Si utilizamos 32 bits para representar nmeros enteros,
disponemos de 232 combinaciones diferentes de 0s y 1s:
4 294 967 296 valores.
Como tenemos que representar nmeros negativos y el cero,
el ordenador ser capaz de representar
del 2 147 483 648 al +2 147 483 647.
Con 32 bits no podremos representar nmeros ms grandes.
2 147 483 647 + 1 = 2 147 483 648 !!!
- 25 -
Fernando Berzal
Representacin de textos
Se escoge un conjunto de caracteres: alfabticos, numricos,
especiales (separadores y signos de puntuacin), grficos y
de control (por ejemplo, retorno de carro).
Se codifica ese conjunto de caracteres utilizando n bits.
Por tanto, se pueden representar hasta 2n smbolos distintos.
Ejemplos de cdigos normalizados
Introduccin a la Programacin
- 26 -
Fernando Berzal
short
double
int
char
long
boolean
char
boolean
- 27 -
float, double
Fernando Berzal
Nmeros enteros
byte, short, int, long
Tipo
Espacio en
Valor
Valor
de dato memoria
mnimo
Mximo
byte
8 bits
-128
127
short
16 bits
-32768
32767
int
32 bits
-2147483648
2147483647
long
-9223372036854775808 9223372036854775807
64 bits
Literales enteros
Los literales enteros pueden expresarse:
- En decimal (base 10): 255
- En octal (base 8): 0377 ( 382 + 781 + 7 = 255 )
- En hexadecimal (base 16): 0xff ( 15*161 + 15 = 255)
Los literales enteros son de tipo int por defecto (entre -231 y 231-1).
Un literal entero es de tipo long si va acompaado del sufijo l o L:
1234567890L es de tipo long
NOTA:
Definicin
Literal: Especificacin de un valor concreto de un tipo de dato.
Introduccin a la Programacin: Java
- 28 -
Fernando Berzal
Operacin
127 + 1
32767 + 1
2147483647 + 1
byte
short
int
Resultado
-128
-32768
-2147483648
Operacin
1000000 * 1000000
1000000 * 1000000
Resultado
-727379968
1000000000000
- 29 -
Fernando Berzal
Tipo
Espacio en
Mnimo
Mximo
Dgitos
de dato memoria (valor absoluto) (valor absoluto) significativos
float
32 bits
1.4 x 10-45
3.4 x 1038
6
-324
308
double
64 bits
4.9 x 10
1.8 x 10
15
Literales reales
- Cadenas de dgitos con un punto decimal
123.45
0.0
.001
123E+45 1E-6
.001f
Resultado
Infinity
-Infinity
NaN
- 30 -
Fernando Berzal
Operadores aritmticos
Java incluye cinco operadores para realizar operaciones aritmticas:
Operador
Operacin
+
*
/
%
Suma
Resta o cambio de signo
Multiplicacin
Divisin
Mdulo (resto de la divisin)
Divisin (/)
Operacin
7/3
7 / 3.0f
5.0 / 2
7.0 / 0.0
0.0 / 0.0
Tipo
Resultado
int
float
double
double
double
2
2.333333333f
2.5
+Infinity
NaN
Tipo
Resultado
int
double
- 31 -
0.1
Fernando Berzal
Expresiones aritmticas
Se pueden combinar literales y operadores
para formar expresiones complejas.
Ejemplo
3 + 4 x 10( y 5)( a + b + c)
4 9+ x
+ 9( +
)
5
x
x
y
En Java se escribira as:
(3+4*x)/5 10*(y-5)*(a+b+c)/x + 9*(4/x + (9+x)/y)
Precisin
Las operaciones en coma flotante no son exactas debido a la forma
en que se representan los nmeros reales en el ordenador
Operacin
1 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1
1.0 - 0.9
Resultado
0.5000000000000001
0.09999999999999998
Definicin
Expresin: Construccin que se evala para devolver un valor.
Introduccin a la Programacin: Java
- 32 -
Fernando Berzal
Caracteres
char
http://www.unicode.org/
Tipo
Espacio en
de dato memoria
char
16 bits
Codificacin
UNICODE
1 2 3
Descripcin
Tabulador (tab)
Avance de lnea (new line)
Retorno de carro (carriage return)
Retroceso (backspace)
Comillas simples
Comillas dobles
Barra invertida
- 33 -
Fernando Berzal
Cadenas de caracteres
La clase String
- String no es un tipo primitivo, sino una clase predefinida
- Una cadena (String) es una secuencia de caracteres
- Las cadenas de caracteres, en Java, son inmutables: no se pueden
modificar los caracteres individuales de la cadena.
Literales
Texto entra comillas dobles
Esto es una cadena
Esto tambin es una cadena
Resultado
Total = 34
Total = 7
- 34 -
Fernando Berzal
Valores
Verdadero o falso
Literales
Literal
true
false
Significado
Verdadero (1)
Falso (0)
Operadores relacionales
- Operadores de comparacin vlidos para nmeros y caracteres
- Generan un resultado booleano
Operador
==
!=
<
>
<=
>=
Significado
Igual
Distinto
Menor
Mayor
Menor o igual
Mayor o igual
- 35 -
Fernando Berzal
Operadores lgicos/booleanos
- Operandos booleanos.
- Tienen menos precedencia que los operadores de comparacin.
Operador Nombre
!
NOT
&&
AND
||
OR
^
XOR
Significado
Negacin lgica
y lgico
o inclusivo
o exclusivo
Tablas de verdad
X
!X
true
False
false
true
A&&B
A||B
A^B
false
false
true
true
false
true
false
true
false
false
false
true
false
true
true
True
false
True
True
False
- 36 -
Operacin
~10
10 & 1
10 & 2
10 & 3
10 | 1
10 | 2
10 | 3
10 ^ 1
10 ^ 2
10 ^ 3
A nivel de bits
Resultado
~000001010
(111110101)
000001010 & 00001
(000000000)
000001010 & 00010
(000000010)
000001010 & 00011
(000000010)
000001010 | 00001
(000001011)
000001010 | 00010
(000001010)
000001010 | 00011
(000001011)
000001010 ^ 00001
(000001011)
000001010 ^ 00010
(000001000)
000001010 ^ 00011
(000001001)
-11
- 37 -
0
2
2
11
10
11
11
8
9
Fernando Berzal
Operacin
10 << 1
7 << 3
10 >> 1
27 >> 3
-50 >> 2
-50 >>> 2
0xff >>> 4
A nivel de bits
Resultado
00001010 << 1
(0010100)
00000111 << 3
(00111000)
00001010 >> 1
(00000101)
00011011 >> 3
(0000011)
11001110 >> 2
(11110011)
111001110 >>> 2
(001110011)
11111111 >>> 4
(00001111)
20
(==10*2)
56
(==7*23)
5
(==10/2)
3
(==27/23)
-13
(!=-50/22)
1073741811
15
(==255/24)
- 38 -
Fernando Berzal
Variables
Una variable no es ms que un nombre simblico que identifica
una direccin de memoria:
Declaracin de variables
Para usar una variable en un programa hay que declararla.
- El ordenador conoce as cmo codificar la informacin que se
va a almacenar en la posicin de memoria correspondiente.
- Al declarar una variable, se reserva el espacio de memoria
necesario para almacenar un valor del tipo de la variable.
- El identificador asociado a la variable se puede utilizar para
acceder al dato almacenado en memoria y para modificarlo.
Introduccin a la Programacin
- 39 -
Fernando Berzal
Ejemplos
// Declaracin una variable entera x de tipo int
int x;
- 40 -
Fernando Berzal
Identificadores en Java
El primer smbolo del identificador ser un carcter
alfabtico (a, , z, A, , Z, _, $) pero no un dgito.
Despus de ese primer carcter, podremos poner caracteres
alfanumricos (a, , z) y (0, 1, , 9), signos de dlar $ o
guiones de subrayado _.
Los identificadores no pueden coincidir con las palabras
reservadas, que ya tienen significado en Java:
abstract
boolean
break
byte
byvalue
case
catch
char
class
const
continue
default
do
double
else
extends
false
final
finally
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
null
package
private
protected
public
return
short
static
super
cast
operator
future
outer
generic
rest
inner
var
switch
synchronized
this
threadsafe
throw[s]
transient
true
try
void
while
Ejemplos no vlidos
345abc, mi variable, Nombre.Largo, caada, camin
- 41 -
Fernando Berzal
Convenciones
Los identificadores deben ser descriptivos: deben hacer
referencia al significado de aquello a lo que se refieren.
int n1, n2;
int anchura, altura;
// MAL
// BIEN
// MAL
// BIEN
// MAL
// ACEPTABLE
// MEJOR
NOTA:
- 42 -
Fernando Berzal
// Ilegal
- 43 -
Fernando Berzal
Expresiones y sentencias
Expresin
Construccin (combinacin de tokens)
que se evala para devolver un valor.
Sentencia
Representacin de una accin o una secuencia de acciones.
En Java, todas las sentencias terminan con un punto y coma [;].
Construccin de expresiones
Literales y variables son expresiones primarias:
1.7
sum
- 44 -
Fernando Berzal
Nmero de operandos
- Operadores unarios
Operador
Descripcin
Cambio de signo
Operador NOT
Complemento a 1
!
~
- Operadores binarios
Operadores
+ - * / %
== != < >
<= >=
&& || ^
& | ^
<< >> >>>
+
Descripcin
Operadores aritmticos
Operadores relacionales
Operadores booleanos
Operadores a nivel de bits
Concatenacin de cadenas
Descripcin
Operadores aritmticos
Operadores de igualdad
Operadores booleanos
Operandos
Nmeros
Cualesquiera
Nmeros
o caracteres
Booleanos
Enteros
Concatenacin de cadenas
Cadenas
Descripcin
Operadores aritmticos
Resultado
Nmero*
Operadores de comparacin
Operadores relacionales
Booleano
Operadores booleanos
Operadores a nivel de bits
Entero
Concatenacin de cadenas
Cadena
- 45 -
Fernando Berzal
Sentencias de asignacin
Las sentencias de asignacin constituyen el ingrediente bsico en la
construccin de programas con lenguajes imperativos.
Sintaxis:
<variable> = <expresin>;
Restriccin:
El tipo del valor que se obtiene como resultado de evaluar la
expresin ha de ser compatible con el tipo de la variable.
Ejemplos
x = x + 1;
NOTA IMPORTANTE:
Una sentencia de asignacin no es una igualdad matemtica.
Introduccin a la Programacin: Java
- 46 -
Fernando Berzal
Efectos colaterales
Al evaluar una expresin, algunos operadores provocan efectos
colaterales (cambios en el estado del programa; es decir, cambios en
el valor de alguna de las variables del programa).
Descripcin
Post-incremento
Evala primero y despus incrementa
Pre-incremento
Primero incrementa y luego evala
Post-decremento
Evala primero y luego decrementa
Pre-decremento
Primero decrementa y luego evala
Ejemplo
Equivalencia
Resultado
i=0; i++;
i=1; j=++i;
i=1; j=i++;
i=3; n=2*(++i);
i=3; n=2*(i++);
i=1; k=++i+i;
i=0; i=i+1;
i=1; i=i+1; j=i;
i=1; j=i; i=i+1;
i=3; i=i+1; n=2*i;
i=3; n=2*i; i=i+1;
i=1; i=i+1; k=i+i;
i=1;
j=2;
j=1;
n=8;
n=6;
k=4;
- 47 -
Fernando Berzal
Ejemplo
Equivalencia
i
f
n
n
n
k
k
k
x
x
x
i++;
f = f
n = n
n = n
n = n
k = k
k = k
k = k
x = x
x = x
x = x
+= 1;
-= 4.0;
*= 2;
/= 2;
%= 2;
&= 0x01;
|= 0x02;
^= 0x04;
<<= 1;
>>= 2;
>>>= 3;
4.0;
* 2;
/ 2;
% 2;
& 0x01;
& 0x02;
& 0x04;
<< 1;
>> 2;
>>> 3;
Resultado
cadena = Hola;
cadena = Hola,;
cadena += ,
nombre = Juan;
apellido = Q.;
nombre += +apellido; nombre = Juan Q.
- 48 -
Fernando Berzal
Conversin de tipos
En determinadas ocasiones, nos interesa convertir el tipo de un dato
en otro tipo para poder operar con l.
Ejemplo
Convertir un nmero entero en un nmero real
para poder realizar divisiones en coma flotante
Java permite realizar conversiones entre datos de tipo numrico
(enteros y reales), as como trabajar con caracteres como si fuesen
nmeros enteros:
- La conversin de un tipo con menos bits a un tipo con ms bits es
automtica (vg. de int a long, de float a double), ya que el
tipo mayor puede almacenar cualquier valor representable con el
tipo menor (adems de valores que no caben en el tipo menor).
- La conversin de un tipo con ms bits a un tipo con menos bits
hay que realizarla de forma explcita con castings. Como se
pueden perder datos en la conversin, el compilador nos obliga a
ser conscientes de que se est realizando una conversin
int i;
byte b;
i = 13;
b = 13;
b = i;
b = (byte) i;
// Fuerza la conversin
i = (int) 14.456;
// Almacena 14 en i
i = (int) 14.656;
// Sigue almacenando 14
- 49 -
Fernando Berzal
Castings
Para realizar una conversin explcita de tipo (un casting) basta
con poner el nombre del tipo deseado entre parntesis antes del valor
que se desea convertir:
char c;
int x;
long k;
double d;
=
=
=
=
A;
100;
100L;
3.0;
=
=
=
=
c;
100;
x;
3;
//
//
//
//
char int
int long
int long
int double
// char int
// int float
// long int
// double int
// float int
- 50 -
Fernando Berzal
boolean
byte
short
char
int
long
Float
double
Convertir desde
Convertir a
boolean
byte
Short
char
int
I*
long
I* I*
float
double
Conversin implcita
(se realiza de forma automtica)
I*
Conversin implcita
(con posible prdida de dgitos significativos)
Conversin explcita
(requiere la realizacin de un casting)
- 51 -
Fernando Berzal
Ejemplo
I
c
c
C
=
=
=
=
Equivalencia
Resultado
a;
i = (int) a;
97;
c = (char) 97;
a+1; c = (char) ((int)a+1);
(char)(i+2);
i
c
c
c
=
=
=
=
97
a
b
c
=
=
=
=
Byte.parseByte(str);
Short.parseShort(str);
Integer.parseInt(str);
Long.parseLong(str);
//
//
//
//
String
String
String
String
byte
short
int
long
f = Float.parseFloat(str);
// String float
d = Double.parseDouble(str); // String double
Introduccin a la Programacin: Java
- 52 -
Fernando Berzal
Evaluacin de expresiones
- La precedencia de los operadores determina el orden de
evaluacin de una expresin (el orden en que se realizan las
operaciones):
3*4+2 es equivalente a (3*4)+2
porque el operador * es de mayor precedencia que el operador +
- 53 -
Fernando Berzal
Programas
Estructura de un programa simple
Los programas ms simples escritos en lenguajes imperativos
suelen realizar tres tareas de forma secuencial:
Entrada de datos
Procesamiento de los datos
Salida de resultados
- 54 -
Fernando Berzal
- 55 -
Fernando Berzal
=
=
=
=
TextIO.getByte();
TextIO.getShort();
TextIO.getInt();
TextIO.getLong();
x = TextIO.getFloat();
y = TextIO.getDouble();
//
//
//
//
byte
short
int
long
// float
// double
a = TextIO.getBoolean(); // boolean
c = TextIO.getChar();
// char
s = TextIO.getln();
// String
- 56 -
Fernando Berzal
- 57 -
Fernando Berzal
JOptionPane.showMessageDialog ( null,
Bienvenido a Java!,
Programa de ejemplo,
JOptionPane.INFORMATION_MESSAGE );
JOptionPane.showMessageDialog ( null,
Bienvenido a Java!,
Programa de ejemplo,
JOptionPane.WARNING_MESSAGE );
JOptionPane.showMessageDialog ( null,
Bienvenido a Java!,
Programa de ejemplo,
JOptionPane.ERROR_MESSAGE );
- 58 -
Fernando Berzal
Ejemplos
Calificacin final de la asignatura
public class Asignatura
{
public static void main (String args[])
{
// Declaraciones
// Constante
final double PORCENTAJE_LABORATORIO = 0.5;
// Variables
String nombre;
double notaExamen;
double notaLaboratorio;
double notaFinal;
// Entrada de datos
nombre = args[0];
notaExamen = Double.parseDouble(args[1]);
notaLaboratorio = Double.parseDouble(args[2]);
// Clculo
notaFinal =
(1-PORCENTAJE_LABORATORIO)*notaExamen
+ PORCENTAJE_LABORATORIO*notaLaboratorio;
// Salida de resultados
System.out.println (nombre
+ " ha obtenido una nota final de "
+ notaFinal);
}
}
- 59 -
Fernando Berzal
Ejemplos
Ao bisiesto
Programa para comprobar si un ao es bisiesto o no:
Un ao es bisiesto si es divisible por 4 pero no por 100,
o bien es divisible por 400.
public class Bisiesto
{
public static void main (String args[])
{
// Declaracin de variables
int
year;
boolean bisiesto;
// Entrada de datos
year = Integer.parseInt(args[0]);
// Clculos
bisiesto = ((year%4==0) && (year%100!=0))
|| (year%400==0);
// Salida de resultados
System.out.println(bisiesto);
}
}
- 60 -
Fernando Berzal
Ejemplos
Cuota de una hipoteca
import javax.swing.JOptionPane;
public class Hipoteca
{
public static void main (String args[])
{
double cantidad; // en euros
double interes; // en porcentaje (anual)
int
tiempo;
// en aos
double cuota;
// en euros (mensual)
double interesMensual; // en tanto por uno
String entrada;
// variable auxiliar
// Entrada de datos
entrada = JOptionPane.showInputDialog
("Importe de la hipoteca ()");
cantidad = Double.parseDouble(entrada);
entrada = JOptionPane.showInputDialog
("Tipo de inters (%)");
interes = Double.parseDouble(entrada);
entrada = JOptionPane.showInputDialog
("Perodo de amortizacin (aos)");
tiempo = Integer.parseInt(entrada);
// Clculo de la cuota mensual
interesMensual = interes/(12*100);
cuota = (cantidad*interesMensual)
/ (1.01.0/Math.pow(1+interesMensual,tiempo*12));
cuota = Math.round(cuota*100)/100.0;
// Resultado
JOptionPane.showMessageDialog
(null, "Cuota mensual = "+cuota+"" );
System.exit(0);
}
}
Introduccin a la Programacin: Java
- 61 -
Fernando Berzal
cantidad
1
1
(1 + ) aos12
Redondeo
Operacin
Descripcin
Resultado
100*cuota
double
Cuota en cntimos de euro
Math.round() Redondeo al entero ms cercano
int
/ 100.0
Cuota en euros (con cntimos) double
3. Resultado final
- 62 -
Fernando Berzal
// Incrementa el contador
// Mes
int mes;
ax = 0x723;
/* RIP L.v.B. */
- 63 -
Fernando Berzal
Sangras
Conviene utilizar espacios en blanco o separadores para delimitar
el mbito de las estructuras de control de nuestros programas.
Lneas en blanco
Para delimitar claramente los distintos segmentos de cdigo en
nuestros programas dejaremos lneas en blanco entre ellos.
Identificadores
Los identificadores deben ser descriptivos (reflejar su significado).
p, i, s...
Declaraciones
Usualmente, declararemos una nica variable por lnea.
Nunca mezclaremos en una misma lnea la declaracin de
variables que sean de distintos tipos o que se utilicen en el
programa para distintos fines.
Constantes
Se considera una mala costumbre incluir literales de tipo
numrico (nmeros mgicos) en medio del cdigo. Se
prefiere la definicin de constantes simblicas (declaraciones
con final).
- 64 -
Fernando Berzal
Expresiones
Uso de parntesis: Aunque las normas de precedencia de los
operadores vienen definidas en el lenguaje, no abusaremos de
ellas. Siempre resulta ms fcil interpretar una expresin si sta
tiene los parntesis apropiados. Adems, stos eliminan
cualquier tipo de ambigedad.
Uso de espacios en blanco: Resulta ms fcil leer una
expresin con espacios que separen los distintos operadores y
operandos involucrados en la expresin.
a%x*c/b-1
( (a%x) * c ) / b - 1
Expresiones complejas:
Es aconsejable dividirlas para mejorar su legibilidad
Claridad:
Siempre buscaremos la forma ms simple de escribir una expresin.
key = key >> ( bits ((bits>>3)<<3));
key >>= bits & 0x7;
- 65 -
Fernando Berzal
IDEA CLAVE
Escribimos cdigo para que lo puedan leer otras personas,
no slo para que lo traduzca el compilador (si no fuese as,
podramos seguir escribiendo nuestros programas en binario).
Errores de programacin
Errores sintcticos
Errores detectados por el compilador en tiempo de compilacin.
Errores semnticos
Slo se detectan en tiempo de ejecucin: Causan que el programa
finalice inesperadamente su ejecucin (p.ej. divisin por cero) o
que el programa proporcione resultados incorrectos.
Introduccin a la Programacin: Java
- 66 -
Fernando Berzal
Elementos lxicos
del lenguaje de programacin
Java
Elementos lxicos del lenguaje de programacin Java
Palabras reservadas
Identificadores
Literales
Operadores
Delimitadores
Comentarios
Apndices
Operadores de Java
Sintaxis de Java
Palabras reservadas
Palabras que tiene un significado concreto en el lenguaje de programacin,
sin necesidad de que se lo asignemos nosotros.
abstract
boolean
break
byte
byvalue
case
catch
char
class
const
continue
default
do
double
else
extends
false
final
finally
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
null
package
private
protected
public
return
short
static
super
cast
operator
future
outer
generic
rest
inner
var
switch
synchronized
this
threadsafe
throw[s]
transient
true
try
void
while
Identificadores
Palabras que podemos utilizar para denominar algo en el lenguaje.
Identificadores en Java
- El primer smbolo del identificador ser un carcter alfabtico (a, , z,
A, , Z, _, $) pero no un dgito. Despus de ese primer carcter,
podremos poner caracteres alfanumricos (a, , z) y (0, 1, , 9),
signos de dlar $ o guiones de subrayado _.
- Los identificadores no pueden coincidir con las palabras reservadas.
- Las maysculas y las minsculas se consideran diferentes.
- El signo de dlar y el guin de subrayado se interpretan como una letra
ms.
Ejemplos vlidos
a, pepe, r456, tu_re_da, AnTeNa, antena, usd$
Ejemplos no vlidos
345abc, mi variable, Nombre.Largo, caada, camin
Elementos lxicos de Java
-1-
Fernando Berzal
Literal
Especificacin de un valor concreto de un tipo de dato.
Nmeros enteros
21 (int), 21L (long), 077 (en octal), 0xDC00 (en hexadecimal)
Nmeros reales
3.14 (double), 3.14f (float), 3.14d (double), 2e12, 3.1E12
Valores booleanos
true (verdadero), false (falso)
Caracteres
p, \u???? (cdigo UNICODE en hexadecimal), \t (tabulador)
Cadenas de caracteres
mensaje, (cadena vaca)
Operadores
Igual que en Matemticas, realizan una accin especfica:
- Suelen estar definidos en el ncleo del compilador
(aunque tambin pueden estar definidos en bibliotecas externas)
- Suelen representarse con tokens formados por smbolos.
- Suelen utilizar notacin infija.
- Pueden aplicarse a uno o varios operandos (argumentos).
- Suelen devolver un valor.
Operadores en Java, por orden de precedencia
. [ ] ( )
++ -! ~ instanceof
new
* / %
+ << >> >>>
< > <= >= == !=
& ^ |
&& ||
? :
= op= ,
Elementos lxicos de Java
-2-
Fernando Berzal
Delimitadores
Smbolos utilizados como separadores de las distintas construcciones de un
lenguaje de programacin (esto es, los signos de puntuacin de un lenguaje
de programacin.
( ) PARNTESIS: Listas de parmetros en la definicin y llamada a
mtodos, precedencia en expresiones, expresiones para control
de flujo y conversiones de tipo.
{ } LLAVES: Inicializacin de arrays, bloques de cdigo, clases,
mtodos y mbitos locales.
[ ] CORCHETES: Arrays.
;
Comentarios
Aclaracin que el programador incluye en el texto del programa para
mejorar su inteligibilidad.
En Java hay tres tipos de comentarios:
// Comentario de una sola lnea
/* Comentario de una o ms lneas */
/** Comentario de documentacin, una o ms lneas */
-3-
Fernando Berzal
Apndices
P
15
12
A Operador
I .
[]
( args )
++, - D ++,- +,~
!
D new
( type )
I * ,/, %
Operando(s)
Objeto, mtodo (miembro)
Array (indice)
Mtodo, lista de
argumentos variable
Variable
Nmero
Entero
Booleano
Clase, lista de argumentos
Tipo, cualquier tipo
Nmero, nmero
11
Numero, nmero
String, cualquiera
Entero, entero
Entero, entero
Entero, entero
Nmero, Nmero
Nmero, Nmero
Referencia, tipo
Primitiva , primitiva
Primitiva , primitiva
Referencia, referencia
Referencia, referencia
Entero, entero
Booleano, booleano
Entero, Entero
Booleano, Booleano
Entero, Entero
Booleano, Booleano
Booleano, Booleano
Booleano, Booleano
Booleano, otro, otro
Variable, otro
14
13
10
9
8
7
6
5
4
3
2
1
+,+
I <<
>>
>>>
I <, <=
>, >=
instance of
I ==
!=
==
!=
I &
&
I ^
^
I |
|
I &&
I ||
D ?:
D =
*=,/=,%=
+=,-=
,<<=,>>=
>>>=,
&=,^=,|=
Operacin
Acceso a un miembro del objeto
Acceso a un elemento de un array
Llamada a un mtodo
Post incremento, post decremento
Pre incremento, Pre decremento
Cambio de signo (-)
Complemento a nivel de bit
NOT booleano
Creacin de objetos
Cast (conversin de tipos)
Multplicacin, divisin, mdulo. Vlido tb
para fp
Suma, resta
Concatenacin de cadenas
Desplazamiento a izquierda
Desplazamiento a derecha con signo
Desplazamiento a derecha con ceros
Menor que, menor igual que
Mayor que, mayor igual que
Comparacin de tipo
Igual (tiene el mismo valor)
No igual ( diferente valor)
Igual (mismo objeto)
No igual ( diferente objeto)
And booleano a nivel de bits
And Booleano
XOR booleano a nivel de bits
XOR Booleano
OR booleano a nivel de bits
OR Booleano
AND Condicional
OR Condicional
Operador condicional (if)
Asignacin con operacin
P: Precedencia
A : Asociatividad (I=Izquierda, D=Derecha)
-4-
Fernando Berzal
Elemento
Asignacin
Llamada
Instanciacin
Secuencia
Vaca
Etiqueta
Variable
if
switch
while
do
for
break
continue
return
synchronized
throw
try
Objetivo
Evaluacin de una expresin
y almacenamiento del valor
obtenido como resultado
Llamada a un mtodo
Creacin de un objeto
Grupo de instrucciones
No hacer nada
Etiquetado
de una instruccin
Declaracin
de una variable
Condicional
Sintaxis
var = expr;
expr++;
method();
new Type( )
{ instrucciones }
;
etiqueta: instruccin
-5-
Fernando Berzal
Introduccin a la programacin
Relacin de ejercicios
Conceptos bsicos
1. Escriba (en lenguaje natural) un algoritmo adecuado para la elaboracin de su
receta de cocina favorita. Analice las caractersticas de su algoritmo
(especialmente, su precisin).
2. Elabore, en lenguaje natural, dos algoritmos que permitan calcular el mximo
comn divisor de dos nmeros enteros positivos. Analice las caractersticas de
los algoritmos propuestos (precisin, finitud y eficiencia).
NOTA: Busque informacin sobre el algoritmo de Euclides.
Datos, tipos de datos y expresiones
3. Traduzca las siguientes frmulas a expresiones escritas en Java, declarando para
ello las variables que considere necesarias:
9
a. F = C + 32
5
1+
b.
f ( x, y ) =
c.
ex
1 + 2
x
x2
y
x3
1+ y
Programas
5. Disee un programa que lea los coeficientes de una ecuacin de segundo grado
ax2+bx+c=0 y calcule sus dos soluciones. Se supone que la ecuacin tiene
soluciones reales.
6. Disee un programa que lea los coeficientes de un sistema de dos ecuaciones
lineales con dos incgnitas y calcule su solucin. Se supone que el sistema de
ecuaciones es compatible determinado.
ax + by = c
dx + ey = f
7. Implemente un programa que, dados los tres vrtices de un tringulo, calcule el
rea del mismo. Puede aplicar la siguiente frmula:
S = T (T S1 )(T S 2 )(T S 3 )
donde S1, S2 y S3 son las longitudes de los tres lados del tringulo y T es la mitad
de su permetro.
8. Dada una medida de tiempo expresada en horas, minutos y segundos con valores
arbitrarios, elabore un programa que transforme dicha medida en una expresin
correcta. Por ejemplo, dada la medida 3h 118m 195s, el programa deber
obtener como resultado 5h 1m 15s.
9. Escriba un programa en Java que nos calcule el cambio que debe dar la caja de
un supermercado: Dado un precio y una cantidad de dinero, el programa nos dir
cuntas monedas deben darse como cambio de tal forma que el nmero total de
monedas sea mnimo.
10. El precio final de un producto para un comprador es la suma total del costo del
producto, un porcentaje de beneficios que obtiene el vendedor y el I.V.A.
Disear un algoritmo para obtener el precio final de un producto sabiendo su
costo, el porcentaje de beneficios y el I.V.A. aplicable. Obtener el resultado
redondeando a los cinco cntimos (p.ej. 5.94 5.95).
11. Un banco recibe todos los das del Banco Mundial una lista de cmo est el
cambio de las divisas del mundo respecto del dlar americano (USD). Disear
un algoritmo que, a partir de una cantidad de dlares que deseamos comprar, nos
devuelva la cantidad en euros (y en pesetas) que nos costaran esos dlares.
Suponga que el banco obtiene en el cambio un tanto por ciento variable de
beneficios.
NOTA: 1 euro = 166.386 pesetas
Introduccin a la programacin
Relacin de ejercicios
Datos, tipos de datos y expresiones
1. Traduzca las siguientes frmulas a expresiones escritas en Java, declarando para
ello las variables que considere necesarias:
9
a. F = C + 32
5
int c, f;
Solucin
Error comn
f = 9*c/5 + 32;
f = 9/5*c + 32; // == 1*c + 32
float c, f;
Solucin
f = 9*c/5 + 32;
Error comn
f = (9/5)*c + 32; // == 1*c + 32
Solucin alternativa f = (9.0/5.0)*c + 32;
1+
b.
f ( x, y ) =
x2
y
x3
1+ y
double x,y;
double f;
// Tanto x como y
// han de ser != 0
c.
ex
1 + 2
x
double x;
Math.sqrt ( 1 + Math.pow( Math.exp(x)/(x*x), 2) )
Math.sqrt ( 1 + Math.exp(2*x) / Math.pow(x,4) )
Math.sqrt ( 1 + Math.exp(2*x) / (x*x*x*x) )
=
+
=
+
1;
(++x)
2;
x == 1 + 2 == 3
Evolucin
Aos 60
Simula
Resolucin de problemas de simulacin
Ole-Johan Dahl & Krysten Nygaard (Noruega)
Aos 70
Smalltalk
Entorno de programacin entendible por novatos
Alan Kay (Xerox PARC, Palo Alto, California)
Aos 80
C++
Extensin de C
Bjarne Stroustroup (AT&T Bell Labs)
Aos 90
Java
Write once, run everywhere
Sun Microsystems
Conceptos bsicos
Todo es un objeto
Los objetos se comunican entre s pasndose mensajes
Cada objeto tiene un estado
(contiene su propia memoria [datos])
Un objeto es un caso particular (instancia) de una clase
Las clases definen el comportamiento de un conjunto de objetos
-1-
Fernando Berzal
-2-
Fernando Berzal
Clases y objetos
Clase
Implementacin de un tipo de dato.
Una clase sirve tanto de mdulo como de tipo
- Tipo:
- Mdulo:
Objeto
Instancia de una clase:
Unidad atmica que encapsula estado y comportamiento.
Un objeto puede caracterizar una entidad fsica (un telfono, un
interruptor, un cliente) o una entidad abstracta (un nmero, una
fecha, una ecuacin matemtica).
Todos los objetos son instancias de una clase: Los objetos se crean
por instanciacin de las clases.
Todos los objetos de una misma clase (p.ej. coches) comparten
ciertas caractersticas: sus atributos (tamao, peso, color, potencia
del motor) y el comportamiento que exhiben (aceleran, frenan,
curvan).
-3-
Fernando Berzal
Las diferentes instancias de cada clase difieren entre s por los valores
de los datos que encapsulan (sus atributos).
Dos objetos con los mismos valores en sus atributos pueden ser
diferentes.
TODOS los objetos de una misma clase usan el mismo algoritmo como
respuesta a mensajes similares.
El algoritmo empleado como respuesta a un mensaje (esto es, el mtodo
invocado) viene determinado por la clase del receptor.
-4-
Fernando Berzal
Clases en Java
Cada clase en Java:
Se define en un fichero independiente con extensin .java.
Se carga en memoria cuando se necesita.
La mquina virtual Java determina en cada momento las clases
necesarias para la aplicacin y las carga en memoria.
El programa puede ampliarse dinmicamente (sin tener que recompilar):
La aplicacin no es un bloque monoltico de cdigo.
-5-
Fernando Berzal
Errores comunes
Cuando el nombre de la clase no coincide con el nombre del
fichero, el compilador nos da el siguiente error:
Public class MiClase must be defined
in a file called MiClase.java
-6-
Fernando Berzal
-7-
Fernando Berzal
-8-
Fernando Berzal
Identidad
La identidad de un objeto lo identifica unvocamente:
- Es independiente de su estado.
- No cambia durante la vida del objeto.
Estado
El estado de un objeto viene dado por los valores de sus atributos.
- Cada atributo toma un valor en un dominio concreto.
- El estado de un objeto evoluciona con el tiempo
- Los atributos de un objeto no deberan ser manipulables
directamente por el resto de objetos del sistema (ocultamiento de
informacin):
o Se protegen los datos de accesos indebidos.
o Se distingue entre interfaz e implementacin.
o Se facilita el mantenimiento del sistema.
Interfaz vs. implementacin
Los objetos se comunican a travs de interfaces bien
definidas sin tener que conocer los detalles internos de
implementacin de los dems objetos.
Ejemplo: Un coche se puede conducir
- Sin saber exactamente de qu partes consta el
motor ni cmo funciona ste (implementacin).
- Basta con saber manejar el volante,
el acelerador y el freno (interfaz).
OOP Introduccin: Java
-9-
Fernando Berzal
Comportamiento
Los mtodos que definen el comportamiento de un objeto:
- Agrupan las competencias del objeto (responsabilidades)
- Describen sus acciones y reacciones.
Las acciones realizadas por un objeto son consecuencia
directa de un estmulo externo (un mensaje enviado desde otro
objeto) y dependen del estado del objeto.
- 10 -
Fernando Berzal
// Saldo
// Lmite
- 11 -
Fernando Berzal
- 12 -
Fernando Berzal
Clase de ejemplo
Representacin grfica en UML:
Definicin en Java:
Fichero Motocicleta.java
// Placa de matrcula
// Color de la pintura
- 13 -
Fernando Berzal
Uso de objetos
El operador .
El operador . (punto) en Java
nos permite acceder a los distintos miembros de una clase:
objeto.miembro
- 14 -
Fernando Berzal
Ejemplos
cuenta.ingresar(150.00);
System.out.println(Mensaje);
- 15 -
Fernando Berzal
Creacin de objetos
Antes de poder usar un objeto hemos de crearlo
El operador new
El operador new nos permite crear objetos en Java.
Tipo identificador = new Tipo();
Observaciones
- Se suele crear una clase aparte, que nicamente contenga un
mtodo main, como punto de entrada de la aplicacin.
- En la implementacin del mtodo main se crean los objetos que
sean necesarios y se les envan mensajes para indicarles lo que
deseamos que hagan.
OOP Introduccin: Java
- 16 -
Fernando Berzal
Constructores
Cuando utilizamos el operador new acompaado del nombre de una
clase, se crea un objeto del tipo especificado (una instancia de la clase
cuyo nombre aparece al lado de new).
Al crear un objeto de una clase concreta, se invoca a un mtodo especial
de esa clase, denominado constructor, que es el que se encarga de
inicializar el estado del objeto.
- 17 -
Fernando Berzal
- 18 -
Fernando Berzal
O bien
Cuenta cuentaVIP = new Cuenta(6000.00);
- 19 -
Fernando Berzal
}
}
OOP Introduccin: Java
- 20 -
Fernando Berzal
Referencias
Cualquier tipo que definamos en Java con una clase
es un tipo no primitivo.
Cuando declaramos una variable de un tipo primitivo en Java, estamos
reservando espacio en memoria para almacenar
un valor del tipo correspondiente.
Sin embargo,
cuando declaramos una variable de un tipo no primitivo en Java,
lo nico que hacemos es reservar una zona en memoria
donde se almacenar una referencia a un objeto del tipo especificado
(y no el objeto en s, de ah la necesidad de utilizar el operador new).
IMPORTANTE
Para acceder a un miembro de un objeto
(leer el valor de una variable de instancia o invocar un mtodo)
hemos de tener una referencia a un objeto distinta de null
- 21 -
Fernando Berzal
// La variable temporal
// almacena el valor inicial de y
y = x;
x = tmp;
// Se almacena en x
// el valor original de y (200)
// Copia la referencia
tmp.ingresar(150);
// Se hace un ingreso en
//
miCuenta !!!
MUY IMPORTANTE
En una sentencia de asignacin,
no se crea una copia del dato representado por un objeto
(salvo que trabajemos con tipos primitivos)
OOP Introduccin: Java
- 22 -
Fernando Berzal
- 23 -
Fernando Berzal
Asociacin
Una asociacin es una relacin estructural
que describe una conexin entre objetos.
Asociacin unidireccional
Asociacin bidireccional
OOP Introduccin: Java
- 24 -
Fernando Berzal
equivale a
class Cuenta
{
private Dinero balance;
public void ingresar (Dinero cantidad)
{
balance += cantidad;
}
public void retirar (Dinero cantidad)
{
balance -= cantidad;
}
public Dinero getSaldo ()
{
return balance;
}
}
- 25 -
Fernando Berzal
con la salvedad de
que el enlace bidireccional hemos de mantenerlo nosotros
}
public class Cliente
{
- 26 -
Fernando Berzal
Multiplicidad
1
0..1
N..M
*
0..*
1..*
Significado
Uno y slo uno
Cero o uno
Desde N hasta M
Cero o varios
Cero o varios
Uno o varios (al menos uno)
- 27 -
Fernando Berzal
dirige
Profesor
Departamento
0..1
Relacin opcional
Un cliente puede o no
ser titular de una cuenta
Relacin obligatoria
Una cuenta ha de tener
un titular como mnimo
Relaciones involutivas
Cuando la misma clase aparece en los dos extremos de la asociacin.
- 28 -
Fernando Berzal
Agregacin y composicin
Casos particulares de asociaciones:
Relacin entre un todo y sus partes
Grficamente,
se muestran como asociaciones con un rombo en uno de los extremos.
Agregacin
Las partes pueden formar parte de distintos agregados.
Composicin
Agregacin disjunta y estricta:
Las partes slo existen asociadas al compuesto
(slo se accede a ellas a travs del compuesto)
- 29 -
Fernando Berzal
Dependencia
Relacin (ms dbil que una asociacin) que muestra la relacin entre
un cliente y el proveedor de un servicio usado por el cliente.
- Cliente es el objeto que solicita un servicio.
- Servidor es el objeto que provee el servicio solicitado.
Ejemplo
Resolucin de una ecuacin de segundo grado
b b 2 4ac
x=
2a
Para resolver una ecuacin de segundo grado hemos
de recurrir a la funcin sqrt de la clase Math
para calcular una raz cuadrada.
NOTA:
La clase Math es una clase degenerada que no tiene
estado. Es, simplemente, una coleccin de funciones
de clculo matemtico.
OOP Introduccin: Java
- 30 -
Fernando Berzal
- 31 -
Fernando Berzal
Instancias:
coches vehculos
Propiedades:
propiedades(coches) propiedades(vehculos)
- 32 -
Fernando Berzal
Jerarquas de clases
En el diagrama de clases,
los atributos, mtodos y relaciones de una clase se muestran en el nivel
ms alto de la jerarqua en el que son aplicables.
- 33 -
Fernando Berzal
Visibilidad
de los miembros de una clase
Se pueden establecer distintos niveles de encapsulacin
para los miembros de una clase (atributos y operaciones)
en funcin de desde dnde queremos que se pueda acceder a ellos:
Visibilidad
Pblica
Protegida
Privada
Significado
Se puede acceder al
miembro de la clase
desde cualquier lugar.
Slo se puede acceder
al miembro de la clase
desde la propia clase o
desde una clase que
herede de ella.
Slo se puede acceder
al miembro de la clase
desde la propia clase.
Java
UML
public
protected
private
- 34 -
Fernando Berzal
Diseo incorrecto
- 35 -
Fernando Berzal
Diseo correcto
import java.util.ArrayList;
public class Persona
{
// Variables de instancia privadas
private String nombre;
private Persona padre;
private Persona madre;
private ArrayList hijos = new ArrayList();
// Constructores pblicos
public Persona (String nombre)
{
this.nombre = nombre;
}
public Persona
(String nombre, Persona padre, Persona madre)
{
this.nombre = nombre;
this.padre = padre;
this.madre = madre;
padre.addHijo(this);
madre.addHijo(this);
}
OOP Introduccin: Java
- 36 -
Fernando Berzal
// Mtodo privado
private void addHijo (Persona hijo)
{
hijos.add(hijo);
}
// Mtodos pblicos
// p.ej. Acceso a las variables de instancia
public void setNombre (String nombre)
{
this.nombre = nombre;
}
public String getNombre ()
{
return nombre;
}
// Cambio de nombre
- 37 -
Fernando Berzal
UML
- 38 -
Fernando Berzal
Jacobson
Odell
Shlaer-Mellor
Meyer
UML
Harel
Wirfs-Brock
Fusion
Inconvenientes de UML
- Falta de integracin con otras tcnicas
(p.ej. diseo de interfaces de usuario)
- UML es excesivamente complejo (y no est del todo libre de
ambigedades): el 80% de los problemas puede modelarse
usando alrededor del 20% de UML
OOP Introduccin: Java
- 39 -
Fernando Berzal
Diagramas de clases
Muestran un conjunto de clases y sus relaciones
- 40 -
Fernando Berzal
Diagramas de objetos
Muestran un conjunto de objetos y sus relaciones
(una situacin concreta en un momento determinado).
NOTA:
Los identificadores subrayados indican que se trata de objetos.
OOP Introduccin: Java
- 41 -
Fernando Berzal
Diagramas de interaccin
Muestran una interaccin concreta: un conjunto de objetos y sus
relaciones, junto con los mensajes que se envan entre ellos.
Diagramas de secuencia
Resaltan la ordenacin temporal de los mensajes que se intercambian.
: WInP rstamos
: Encargado
:Socio
:Video
: Prstamo
prestar(video, socio)
verificar situacin socio
verificar situacin video
registrar prstamo
entregar recibo
:Video
2: verificar situacin socio
1: prestar(video, socio)
5: entregar recibo
: Encargado
4: registrar prstamo
:Prstamo
- 42 -
Fernando Berzal
Diagramas de secuencia
Muestran la secuencia de mensajes entre objetos durante un escenario
concreto (paso de mensajes).
- En la parte superior aparecen los objetos que intervienen.
- La dimensin temporal se indica verticalmente
(el tiempo transcurre hacia abajo).
- Las lneas verticales indican el perodo de vida de cada objeto.
- El paso de mensajes se indica con flechas horizontales u oblicuas
(cando existe demora entre el envo y la atencin del mensaje).
- La realizacin de una accin se indica con rectngulos sobre las
lneas de actividad del objeto que realiza la accin.
Diagramas de comunicacin/colaboracin
La distribucin de los objetos en el diagrama permite observar
adecuadamente la interaccin de un objeto con respecto de los dems
- La perspectiva esttica del sistema viene dada por las relaciones
existentes entre los objetos (igual que en un diagrama de objetos).
- La vista dinmica de la interaccin viene indicada por el envo de
mensajes a travs de los enlaces existentes entre los objetos.
NOTA:
Fernando Berzal
C aso de U so
Actor
- Diagramas de estados
(estados y transiciones entre estados),
contratar
en el paro
en ac tivo
perder em pleo
jubilarse
jubil arse
jub ilado
- 44 -
Fernando Berzal
- Diagramas de actividades
(flujo de control en el sistema)
Customer
Sales
Stockroom
Request
service
Take order
Play
Fill order
Deliver order
Collect
order
- 45 -
Fernando Berzal
Diagramas UML
para representar aspectos fsicos del sistema
- Diagramas de componentes
(componentes y dependencias entre ellos)
Organizacin lgica de la implementacin de un sistema
- Diagramas de despliegue
(nodos de procesamiento y componentes)
Configuracin del sistema en tiempo de ejecucin
<<Cliente>>
Terminal Punto
de Venta
<<Servidor>>
<<TCP/IP>>
Base de
Datos
<<RDSI>>
<<LAN>>
- 46 -
Fernando Berzal
Referencias
Pginas web
http://www.uml.org/
Pgina oficial de UML, uno de los estndares promovidos por el OMG.
http://www.cetus-links.org/oo_uml.html
Coleccin de enlaces relacionados con UML.
http://www.agilemodeling.com/essays/umlDiagrams.htm
Informacin prctica acerca de todos los diagramas UML 2
http://www.ootips.org/
Ideas clave en programacin orientada a objetos.
Libros
Martin Fowler: UML Distilled:
A Brief Guide to the Standard Object Modeling Language
3rd edition. Addison-Wesley, 2004. ISBN 0321193687
Grady Booch et al.:
Object-Oriented Analysis and Design with Applications
3rd edition. Addison-Wesley, 2004. ISBN 020189551X
Craig Larman: Applying UML and Patterns: An Introduction to
Object-Oriented Analysis and Design and the Unified Process
2nd edition. Prentice-Hall, 2001. ISBN 0130925691
Robert C. Martin:
Agile Software Development: Principles, Patterns, and Practices
Prentice-Hall, 2003. ISBN 0135974445
- 47 -
Fernando Berzal
Alumno
DNI
Nombre
Direccin
Beca
se matricula en
*
1..* Calificacin
Asignatura
ID
Grupo
impartida en
Nombre
ID
Crditos
1
1..* Tipo
Carcter
Curso
*
asignada a
Da
Hora
*
Aula
ID
Capacidad
ensea
*
1..*
Profesor
NRP
Nombre
Categora
rea
*
pertenece a
1
dirige
1
Departamento
ID
Nombre
Ejemplo
class Pelicula
class Alquiler
{
private Cliente cliente;
private Pelicula peli;
private DateTime fecha;
public Alquiler
(Cliente cliente, Pelicula peli, DateTime fecha)
{
this.cliente = cliente;
this.peli = peli;
this.fecha = fecha;
}
Modularizacin
Uso de subprogramas
Razones vlidas para crear un subprograma
Pasos para escribir un subprograma
Acerca del nombre de un subprograma
Mtodos
Definicin de los mtodos: cabecera, cuerpo y signatura
Uso de los mtodos
Paso de parmetros
Devolucin de resultados (sentencia return)
Constructores (la palabra reservada this)
Mtodos estticos
mbito de las variables
Cohesin y acoplamiento
Bibliografa
Steve McConnell: Code Complete.
Microsoft Press, 2004 [2 edicin] ISBN 0735619670.
Microsoft Press, 1994 [1 edicin] ISBN 1556154844.
Uso de subprogramas
Los lenguajes de programacin permiten descomponer un programa
complejo en distintos subprogramas:
Funciones y procedimientos
en lenguajes de programacin estructurada
Mtodos
en lenguajes de programacin orientada a objetos
-1-
Fernando Berzal
Modularizacin
-2-
Fernando Berzal
El nombre de un subprograma
Al crear un subprograma hemos de darle un nombre:
Cuando el subprograma no devuelve ningn valor
(procedimientos y mtodos void):
El nombre del subprograma suele estar formado por un verbo
seguido, opcionalmente, del nombre de un objeto.
Ejemplos:
ingresar
realizarTransferencia
abonarImpuestos
saldoActual
saldoMedio
-3-
Fernando Berzal
Mtodos
Los mtodos definen
el comportamiento de los objetos de una clase dada
(lo que podemos hacer con los objetos de esa clase)
Los mtodos
Nos dicen cmo hemos de usar los objetos de una clase.
Nos permiten cambiar la implementacin de una clase sin tener que
modificar su interfaz (esto es, sin tener que modificar el cdigo que
utiliza objetos de la clase cuya implementacin cambiamos)
Ejemplo:
Utilizar un algoritmo ms eficiente
para resolver un problema concreto
sin tener que tocar el cdigo del resto del programa.
Modularizacin
-4-
Fernando Berzal
Definicin de mtodos
Sintaxis en Java
cuerpo
}
-5-
Fernando Berzal
Ejemplo
El punto de entrada a una aplicacin escrita en Java
CONVENCIN
El texto correspondiente al cdigo que se ejecuta al invocar un mtodo
se sangra con respecto a la posicin de las llaves que delimitan el
cuerpo del mtodo.
Modularizacin
-6-
Fernando Berzal
La cabecera de un mtodo
La cabecera de un mtodo determina su interfaz
Modificadores de acceso (p.ej. public o private)
Determinan desde dnde se puede utilizar el mtodo.
Tipo devuelto (cualquier tipo primitivo, no primitivo o void)
Indica de que tipo es la salida del mtodo, el resultado que se
obtiene tras llamar al mtodo desde el exterior.
NOTA:
void se emplea cuando el mtodo no devuelve ningn valor.
Nombre del mtodo
Identificador vlido en Java
CONVENCIN:
En Java, los nombres de mtodos comienzan con minscula.
Parmetros formales
Entradas que necesita el mtodo para realizar la tarea de la que es
responsable.
MTODOS SIN PARMETROS:
Cuando un mtodo no tiene entradas, hay que poner ()
El cuerpo de un mtodo
El cuerpo de un mtodo define su implementacin:
NB: Como cualquier bloque de cdigo en Java,
el cuerpo de un mtodo ha de estar delimitado por llaves { }
Modularizacin
-7-
Fernando Berzal
La signatura de un mtodo
El nombre de un mtodo, los tipos de sus parmetros y el orden de los
mismos definen la signatura de un mtodo.
Los modificadores y el tipo del valor devuelto por un mtodo no
forman parte de la signatura del mtodo.
Sobrecarga
Lenguajes como Java permiten que existan distintos mtodos con el
mismo nombre siempre y cuando su signatura no sea idntica (algo
que se conoce con el nombre de sobrecarga)
Ejemplo
System.out.prinln();
- System.out.println()
- System.out.println(boolean)
- System.out.println(char)
- System.out.println(char[])
- System.out.println(double)
- System.out.println(float)
- System.out.println(int)
- System.out.println(long)
- System.out.println(Object)
- System.out.println(String)
-8-
Fernando Berzal
Uso de mtodos
Para enviarle un mensaje a un objeto,
invocamos (llamamos a) uno de sus mtodos:
Ejemplo
Cuenta cuenta = new Cuenta();
cuenta.mostrarMovimientos();
-9-
Fernando Berzal
- 10 -
Fernando Berzal
En la definicin de un mtodo,
la lista de parmetros formales de un mtodo establece:
Cuntos parmetros tiene el mtodo
El tipo de los valores que se usarn como parmetros
El orden en el que han de especificarse los parmetros
En la invocacin de un mtodo,
se han de especificar los valores concretos para los parmetros.
Los valores que se utilizan como parmetros
al invocar un mtodo se denominan
parmetros actuales (o argumentos).
Modularizacin
- 11 -
Fernando Berzal
Al llamar a un mtodo,
el mtodo utiliza una copia local de los parmetros
(que contiene los valores con los cuales fue invocado).
OJO!
Modularizacin
- 12 -
Fernando Berzal
// Definicin
// Invocacin
- 13 -
Fernando Berzal
Convenciones
Si varios mtodos utilizan los mismos parmetros,
stos han de ponerse siempre en el mismo orden.
De esta forma, resulta ms fcil de recordar
la forma correcta de usar un mtodo.
No es aconsejable utilizar los parmetros de una rutina como si
fuesen variables locales de la rutina.
En otras palabras, los parmetros no los utilizaremos para
almacenar resultados parciales.
Se han de documentar claramente las suposiciones que se hagan
acerca de los valores permitidos para los distintos parmetros de
un mtodo.
Esta informacin debera figurar en la documentacin del
cdigo realizada con la herramienta javadoc.
Slo se deben incluir los parmetros que realmente necesite el
mtodo para efectuar su labor.
Si un dato no es necesario para realizar un clculo, no tiene
sentido que tengamos que pasrselo al mtodo.
Las dependencias existentes entre distintos mtodos han de
hacerse explcitas mediante el uso de parmetros.
Si evitamos la existencia de variables globales (datos
compartidos entre distintos mdulos), el cdigo resultante
ser ms fcil de entender.
Modularizacin
- 14 -
Fernando Berzal
return
return expresin;
Modularizacin
- 15 -
Fernando Berzal
Ejemplo
Figuras geomtricas
//
//
//
//
//
Title:
Version:
Copyright:
Author:
E-mail:
Geometry
0.0
2004
Fernando Berzal
[email protected]
- 16 -
Fernando Berzal
Ejemplo de uso
public static void main(String[] args)
{
Circle fig
= new Circle( new Point(0,0), 10);
Point dentro = new Point (3,3);
Point fuera = new Point (10,10);
System.out.println(figura);
System.out.println(dentro+"? "+fig.isInside(dentro));
System.out.println(fuera +"? "+fig.isInside(fuera) );
}
Modularizacin
- 17 -
Fernando Berzal
this
NOTA:
La palabra reservada this permite acceder
al objeto sobre el que se ejecuta el mtodo.
Modularizacin
- 18 -
Fernando Berzal
Gracias a la encapsulacin,
podemos crear componentes reutilizables
cuya evolucin no afectar al resto del sistema.
Modularizacin
- 19 -
Fernando Berzal
Ejemplo de uso:
public class ContactoTest
{
public static void main(String[] args)
{
Contacto nico = new Contacto (Nicols);
Contacto juan = new Contacto (Juan,
[email protected]);
...
}
}
Constructor de copia
Un constructor que recibe como parmetro
un objeto de la misma clase que la del constructor
Modularizacin
- 20 -
Fernando Berzal
RECORDATORIO: Encapsulacin
Se consigue con los modificadores de acceso public y private.
Las variables de instancia de una clase suelen definirse como
privadas (con la palabra reservada private).
Los mtodos pblicos muestran la interfaz de la clase.
Pueden existir mtodos no pblicos que realicen tareas auxiliares
manteniendo la separacin entre interfaz e implementacin.
Modularizacin
- 21 -
Fernando Berzal
Mtodos estticos
Los mtodos estticos pertenecen a la clase
(no estn asociados a un objeto particular de la clase)
Ya hemos visto algunos ejemplos:
Math.pow(x,y)
public static void main (String[] args)
System.out
Colores predefinidos:
Color.black, Color.red
Modularizacin
- 22 -
Fernando Berzal
Como es lgico,
los mtodos estticos slo pueden acceder a variables estticas.
public class Mensajes
{
private String mensaje = Hola;
// Error!
}
El programa anterior funcionara correctamente
si hubisemos declarado mensaje como una variable esttica:
private static String mensaje = Hola;
- 23 -
Fernando Berzal
- 24 -
Fernando Berzal
void method ()
{
int i=0;
while (i<10) {
int j=0;
...
}
// Declara e inicializa i
//
//
//
//
IMPORTANTE
Las variables de instancia se inicializan automticamente al crear un
objeto (a 0 o null), mientras que las variables locales de un mtodo
tenemos que inicializarlas nosotros antes de usarlas.
Modularizacin
- 25 -
Fernando Berzal
Cohesin y acoplamiento
Cohesin
Medida del grado de identificacin
de un mdulo con una funcin concreta.
Cohesin aceptable (fuerte)
COHESIN FUNCIONAL (un mdulo realiza una nica accin).
COHESIN SECUENCIAL (un mdulo contiene acciones que han
de realizarse en un orden particular sobre unos datos concretos).
COHESIN DE COMUNICACIN (un mdulo contiene un conjunto de
operaciones que se realizan sobre los mismos datos).
COHESIN TEMPORAL (las operaciones se incluyen en un mdulo
porque han de realizarse al mismo tiempo; p.ej. inicializacin).
Cohesin inaceptable (dbil)
COHESIN PROCEDURAL (un mdulo contiene operaciones que se
realizan en un orden concreto aunque sean independientes).
COHESIN LGICA (cuando un mdulo contiene operaciones cuya
ejecucin depende de un parmetro: el flujo de control del mdulo
es lo nico que une a las operaciones que lo forman).
COHESIN COINCIDENTAL (cuando las operaciones de un mdulo
no guardan ninguna relacin observable entre ellas).
Hay que procurar evitar situaciones de
cohesin procedural, lgica o coincidental
Modularizacin
- 26 -
Fernando Berzal
Acoplamiento
Medida de la interaccin
de los mdulos que constituyen un programa.
Niveles de acoplamiento (de mejor a peor):
ACOPLAMIENTO DE DATOS (acoplamiento normal): Todo lo que
comparten dos mdulos se especifica en la lista de parmetros del
mdulo invocado.
ACOPLAMIENTO DE CONTROL: Cuando un mdulo pasa datos que le
indican a otro qu hacer (el primer mdulo tiene que conocer
detalles internos del segundo).
ACOPLAMIENTO EXTERNO: Cuando dos mdulos utilizan los
mismos datos globales o dispositivos de E/S (p.ej. ficheros).
Si los datos son de slo lectura, el acoplamiento se puede
considerar aceptable. No obstante, en general, este tipo de
acoplamiento no es deseable porque la conexin existente
entre los mdulos no es visible (de forma explcita).
ACOPLAMIENTO PATOLGICO: Cuando un mdulo utiliza el cdigo
de otro o altera sus datos locales (acoplamiento de contenido).
Los lenguajes estructurados incluyen reglas para el mbito de
las variables que impiden este tipo de acoplamiento.
Los lenguajes orientados a objetos incluyen modificadores de
visibilidad para evitar este tipo de acoplamiento.
Objetivo final
Reducir al mximo el acoplamiento entre mdulos
y aumentar la cohesin interna de los mdulos.
Modularizacin
- 27 -
Fernando Berzal
Ejemplo
Clase Hipoteca
public class Hipoteca
{
double importe; // en euros
double interes; // en porcentaje (anual)
int
tiempo;
// en aos
// Constructor
public Hipoteca ()
// getters & setters
public double getImporte () {
return importe;
}
public void setCantidad (double euros) {
importe = euros;
}
public double getInteres () {
return interes;
}
public void setInteres (double tipoAnual) {
interes = tipoAnual;
}
public int getTiempo () {
return tiempo;
}
public void setTiempo (int years)
{
this.tiempo = years;
}
public double getCuota ()
{
double interesMensual = interes/(12*100);
double cuota = (cantidad*interesMensual)
/ (1.01.0/Math.pow(1+interesMensual,tiempo*12));
return Math.round(cuota*100)/100.0;
}
}
Modularizacin
- 28 -
Fernando Berzal
import javax.swing.JOptionPane;
public class CuotaHipotecaria
{
public static void main (String args[])
{
double
cantidad; // en euros
double
interes; // en porcentaje (anual)
int
tiempo;
// en aos
Hipoteca hipoteca; // Hipoteca
// Entrada de datos
...
hipoteca = new Hipoteca(cantidad,interes,tiempo);
// Resultado
JOptionPane.showMessageDialog (null,
"Cuota mensual = "+hipoteca.getCuota()+"
System.exit(0);
}
}
Modularizacin
- 29 -
Fernando Berzal
Modularizacin
Relacin de ejercicios
1. Disee una clase Cuenta que represente una cuenta bancaria y permita realizar
operaciones como ingresar y retirar una cantidad de dinero, as como realizar
una transferencia de una cuenta a otra.
a. Represente grficamente la clase utilizando la notacin UML
b. Defina la clase utilizando la sintaxis de Java, definiendo las variables de
instancia y mtodos que crea necesarios.
c. Implemente cada uno de los mtodos de la clase. Los mtodos deben
actualizar el estado de las variables de instancia y mostrar un mensaje en
el que se indique que la operacin se ha realizado con xito.
d. Cree un programa en Java (en una clase llamada CuentaTest) que cree
un par de objetos de tipo Cuenta y realice operaciones con ellos. El
programa debe comprobar que todos los mtodos de la clase Cuenta
funcionan correctamente.
2. Disee una clase Factura que represente la venta de un producto en una tienda.
La clase debe incluir informacin relativa al producto vendido (cdigo,
descripcin y precio), datos acerca del cliente que compra el producto (nombre,
apellidos, direccin, DNI) y el nmero de unidades compradas. Los mtodos de
la clase han de permitir obtener el importe total de la compra (suponiendo un
porcentaje de IVA constante) y generar un informe con los datos de la factura (el
ticket correspondiente a la venta), adems de poder acceder y modificar los
distintos datos recogidos en la factura.
a. Represente grficamente en UML la clase resultante.
b. Implemente en Java la clase tal como est representada en el diagrama.
c. Cree un programa (FacturaTest) que compruebe el correcto
funcionamiento de la implementacin realizada.
d. Idee la forma de descomponer la clase Factura en varias clases de
forma que la implementacin resultante sea ms cohesiva y las clases
estn dbilmente acopladas. Represente su diseo en UML e
implemntelo en Java teniendo en cuenta las relaciones existentes entre
las distintas clases.
PISTA:
La factura mezcla varios datos de productos con datos relativos a clientes
demandatotal = demandaautnomos+demandaestudiantes
Si suponemos que la empresa de telecomunicaciones tiene que invertir
100M en poner en marcha la red UMTS y el coste marginal de un
telfono mvil supone slo 5, calcule cul es el precio al que habra que
vender los mviles si la demanda fuese:
precio(cantidad) = 300 c/40000
Estructuras de control
Programacin estructurada
Estructuras condicionales
La sentencia if
La clusula else
Encadenamiento y anidamiento
El operador condicional ?:
La sentencia switch
Estructuras repetitivas/iterativas
El bucle while
El bucle for
El bucle dowhile
Bucles anidados
Cuestiones de estilo
Estructuras de control
-0-
Fernando Berzal
Programacin estructurada
IDEA CENTRAL:
Las estructuras de control de un programa
slo deben tener un punto de entrada y un punto de salida.
La programacin estructurada...
mejora la productividad de los programadores.
mejora la legibilidad del cdigo resultante.
-1-
Fernando Berzal
Secuencia
Conjunto de sentencias que se ejecutan en orden
Ejemplos:
Sentencias de asignacin y llamadas a rutinas.
Seleccin
Elige qu sentencias se ejecutan en funcin de una condicin.
Ejemplos:
Estructuras de control condicional if-then-else y case/switch
Iteracin
Las estructuras de control repetitivas repiten conjuntos de
instrucciones.
Ejemplos:
Bucles while, do...while y for.
Bhm, C. & Jacopini, G.: Flow diagrams, Turing machines, and languages only with two
formation rules. Communications of the ACM, 1966, Vol. 9, No. 5, pp. 366-371
Dijkstra, E.W.: Goto statement considered harmful. Communications of the ACM, 1968, Vol.
11, No. 3, pp. 147-148
-2-
Fernando Berzal
Estructuras de control
condicionales
Por defecto,
las instrucciones de un programa se ejecutan secuencialmente:
Ejemplo tpico
Realizar una divisin slo si el divisor es distinto de cero.
-3-
Fernando Berzal
Sintaxis
if (condicin)
sentencia;
if (condicin) {
bloque
}
Bloque de instrucciones:
Secuencia de instrucciones encerradas entre dos llaves {....}
-4-
Fernando Berzal
Error comn:
if (condicin);
sentencia;
es interpretado como
if (condicin)
;
// Sentencia vaca
sentencia;
-5-
Fernando Berzal
Ejemplo
Comparacin de nmeros (Deitel & Deitel)
Operador
==
!=
<
>
<=
>=
Significado
Igual
Distinto
Menor
Mayor
Menor o igual
Mayor o igual
import javax.swing.JOptionPane;
public class Comparison
{
public static void main( String args[] )
{
// Declaracin de variables
String primerDato, segundoDato;
String resultado;
int
dato1, dato2;
primerDato
= JOptionPane.showInputDialog
( "Primer dato:" );
segundoDato = JOptionPane.showInputDialog
( "Segundo dato:" );
dato1 = Integer.parseInt( primerDato );
dato2 = Integer.parseInt( segundoDato );
resultado = "";
if ( dato1 == dato2 )
resultado += dato1 + " == " + dato2;
if ( dato1 != dato2 )
resultado += dato1 + " != " + dato2;
-6-
Fernando Berzal
-7-
Fernando Berzal
La clusula else
Una sentencia if, cuando incluye la clusula else,
permite ejecutar un bloque de cdigo si se cumple la condicin
y otro bloque de cdigo diferente si la condicin no se cumple.
Sintaxis
if (condicin)
sentencia1;
else
sentencia2;
if (condicin) {
bloque1
} else {
bloque2
}
-8-
Fernando Berzal
Ejemplo
import javax.swing.JOptionPane;
public class IfElse
{
public static void main( String args[] )
{
String primerDato, segundoDato;
String resultado;
int
dato1, dato2;
primerDato
= JOptionPane.showInputDialog
( "Primer dato:" );
segundoDato = JOptionPane.showInputDialog
( "Segundo dato:" );
dato1 = Integer.parseInt( primerDato );
dato2 = Integer.parseInt( segundoDato );
resultado = "";
if ( dato1 == dato2 )
resultado += dato1 + " == " + dato2;
else
resultado += dato1 + " != " + dato2;
if ( dato1 < dato2 )
resultado += "\n" + dato1 + " < " + dato2;
else
resultado += "\n" + dato1 + " >= " + dato2;
if ( dato1 > dato2 )
resultado += "\n" + dato1 + " > " + dato2;
else
resultado += "\n" + dato1 + " <= " + dato2;
JOptionPane.showMessageDialog
( null, resultado,
"Resultados de la comparacin",
JOptionPane.INFORMATION_MESSAGE );
System.exit( 0 );
}
}
-9-
Fernando Berzal
La sentencia
if (condicin)
sentencia1;
else
sentencia2;
es equivalente a
if (condicin)
sentencia1;
if (!condicin)
sentencia2;
- 10 -
Fernando Berzal
- 11 -
Fernando Berzal
Encadenamiento
Las sentencias if se suelen encadenar:
if else if
import javax.swing.JOptionPane;
public class IfChain
{
public static void main( String args[] )
{
String entrada;
String resultado;
float nota;
entrada = JOptionPane.showInputDialog
( "Calificacin numrica:" );
nota = Float.parseFloat( entrada );
if ( nota >= 9
resultado =
else if ( nota
resultado =
else if ( nota
resultado =
else
resultado =
)
"Sobresaliente";
>= 7 )
"Notable";
>= 5 )
"Aprobado";
"Suspenso";
JOptionPane.showMessageDialog
( null, resultado,
"Calificacin final",
JOptionPane.INFORMATION_MESSAGE );
System.exit( 0 );
}
}
- 12 -
Fernando Berzal
entrada = JOptionPane.showInputDialog
( "Calificacin numrica:" );
nota = Float.parseFloat( entrada );
resultado = ;
if ( nota >= 9 )
resultado = "Sobresaliente";
if ( (nota>=7) && (nota<9) )
resultado = "Notable";
if ( (nota>=5) && (nota<7) )
resultado = "Aprobado";
if ( nota < 5 )
resultado = "Suspenso";
JOptionPane.showMessageDialog
( null, resultado,
"Calificacin final",
JOptionPane.INFORMATION_MESSAGE );
System.exit( 0 );
}
}
- 13 -
Fernando Berzal
Anidamiento
Las sentencias if tambin se pueden anidar unas dentro de otras.
- 14 -
Fernando Berzal
- 15 -
Fernando Berzal
El operador condicional ?:
Java proporciona una forma de abreviar una sentencia if
El operador condicional ?:
permite incluir una condicin dentro de una expresin.
Sintaxis
variable = condicin? expresin1: expresin2;
equivale a
if (condicin)
variable = expresin1;
else
variable = expresin2;
Ejemplos
max = (x>y)? x : y;
min = (x<y)? x : y;
med = (x<y)? ((y<z)? y: ((z<x)? x: z)):
((x<z)? x: ((z<y)? y: z));
nick = (nombre!=null)? nombre : desconocido;
- 16 -
Fernando Berzal
- 17 -
Fernando Berzal
Ejemplo
public class Switch
{
public static void main( String args[] )
{
String resultado;
int
nota;
// Entrada de datos
switch
case
case
case
case
case
(nota) {
0:
1:
2:
3:
4:
resultado = "Suspenso";
break;
case 5:
case 6:
resultado = "Aprobado";
break;
case 7:
case 8:
resultado = "Notable";
break;
case 9:
case 10:
resultado = "Sobresaliente";
break;
default:
resultado = "Error";
}
// Salida de resultados
}
}
- 18 -
Fernando Berzal
Estructuras de control
repetitivas/iterativas
repetitivas/iterativas
A menudo es necesario ejecutar
una instruccin o un bloque de instrucciones ms de una vez.
Ejemplo
Implementar un programa que calcule
la suma de N nmeros ledos desde teclado.
- 19 -
Fernando Berzal
El bucle while
Permite repetir la ejecucin de un conjunto de sentencias
mientras se cumpla una condicin:
while (condicin)
sentencia;
while (condicin) {
bloque
}
- 20 -
Fernando Berzal
Ejemplo
Tabla de multiplicar de un nmero
public class While1
{
public static void main( String args[] )
{
int n; // Nmero
int i; // Contador
n = Integer.parseInt( args[0] );
i = 0;
while (i<=10) {
System.out.println (n+" x "+i+" = "+(n*i));
i++;
}
}
}
Ejemplo
Divisores de un nmero
public class While2
{
public static void main( String args[] )
{
int n;
int divisor;
n = Integer.parseInt( args[0] );
System.out.println("Los divisores son:");
divisor = n;
while (divisor>0) {
if ((n%divisor) == 0)
System.out.println(divisor);
divisor--;
}
}
}
Estructuras de control: Java
- 21 -
Fernando Berzal
o bien
contador--;
- 22 -
Fernando Berzal
Ejemplo
Sumar una serie de nmeros
hasta que el usuario introduzca un cero
import javax.swing.JOptionPane;
public class While3
{
public static void main( String args[] )
{
float valor;
float suma;
suma = 0;
valor = leerValor();
while (valor!=0) {
suma += valor;
valor = leerValor();
}
mostrarValor("Suma de los datos", suma);
System.exit(0);
}
private static float leerValor ()
{
String entrada;
entrada = JOptionPane.showInputDialog
( "Introduzca un dato:" );
return Float.parseFloat(entrada);
}
private static void mostrarValor
(String mensaje, float valor)
{
JOptionPane.showMessageDialog
( null, valor, mensaje,
JOptionPane.INFORMATION_MESSAGE );
}
}
- 23 -
Fernando Berzal
El bucle for
Se suele emplear en sustitucin del bucle while
cuando se conoce el nmero de iteraciones que hay que realizar.
Sintaxis
for (expr1; expr2; expr3) {
bloque;
}
- 24 -
Fernando Berzal
En general,
for (expr1; expr2; expr3) {
bloque;
}
equivale a
expr1;
while (expr2) {
bloque;
expr3;
}
- 25 -
Fernando Berzal
Ejemplo
Clculo del factorial de un nmero
Bucle for
public class FactorialFor
{
public static void main( String args[] )
{
long i,n,factorial;
n = Integer.parseInt( args[0] );
factorial = 1;
for (i=1; i<=n; i++) {
factorial *= i;
}
System.out.println ( "f("+n+") = " + factorial);
}
}
Bucle while
public class FactorialWhile
{
public static void main( String args[] )
{
long i,n,factorial;
n = Integer.parseInt( args[0] );
factorial = 1;
i = 1;
while (i<=n) {
factorial *= i;
i++;
}
System.out.println ( "f("+n+") = " + factorial);
}
}
Estructuras de control: Java
- 26 -
Fernando Berzal
En un bucle for
La primera expresin, expr1, suele contener inicializaciones de
variables separadas por comas. En particular, siempre aparecer la
inicializacin de la variable que hace de contador.
o Las instrucciones que se encuentran en esta parte del for slo
se ejecutarn una vez antes de la primera ejecucin del cuerpo
del bucle (bloque).
La segunda expresin, expr2, es la que contiene una expresin
booleana (la que aparecera en la condicin del bucle while
equivalente para controlar la ejecucin del cuerpo del bucle).
La tercera expresin, expr3, contiene las instrucciones, separadas
por comas, que se deben ejecutar al finalizar cada iteracin del bucle
(p.ej. el incremento/decremento de la variable contador).
El bloque de instrucciones bloque es el mbito del bucle (el bloque
de instrucciones que se ejecuta en cada iteracin).
- 27 -
Fernando Berzal
Nmero de
iteraciones
N
N+1
N-k
N+1
N-k
N/k
(N-j)/k
log2 N
log2 N + 1
Bucles infinitos
Un bucle infinito es un bucle que se repite infinitas veces:
for (;;)
/*bucle infinito*/
while (true)
/*bucle infinito*/
- 28 -
Fernando Berzal
El bucle do while
Tipo de bucle, similar al while, que realiza la comprobacin de la
condicin despus de ejecutar el cuerpo del bucle.
Sintaxis
do
sentencia;
while (condicin);
do {
bloque
} while (condicin);
- 29 -
Fernando Berzal
Ejemplo
Clculo del factorial
comprobando el valor del dato de entrada
import javax.swing.JOptionPane;
public class FactorialDoWhile
{
public static void main( String args[] )
{
long n;
do {
n = leerEntero(0,20);
} while ((n<0) || (n>20));
mostrarMensaje ( "f("+n+") = "+ factorial(n));
System.exit(0);
}
private static long factorial (long n)
{
long i;
long factorial = 1;
for (i=1; i<=n; i++) {
factorial *= i;
}
return factorial;
}
private static int leerEntero (int min, int max)
{
String entrada = JOptionPane.showInputDialog
( "Introduzca un valor entero
+ (entre "+min+" y "+max+"): );
return Integer.parseInt(entrada);
}
private static void mostrarMensaje (String mensaje)
{
JOptionPane.showMessageDialog(null,mensaje);
}
}
- 30 -
Fernando Berzal
Ejemplo
Clculo de la raz cuadrada de un nmero
import javax.swing.JOptionPane;
public class Sqrt
{
public static void main( String args[] )
{
double n;
do {
n = leerReal ("Introduzca un nmero positivo");
} while (n<0);
mostrarMensaje( "La raz cuadrada de "+n
+ " es aproximadamente "+raiz(n));
System.exit(0);
}
private static double raiz (double n)
{
double r;
// Raz cuadrada del nmero
double prev; // Aproximacin previa de la raz
r = n/2;
do {
prev = r;
r = (r+n/r)/2;
} while (Math.abs(r-prev) > 1e-6);
return r;
}
private static double leerReal (String mensaje)
{
String entrada;
entrada = JOptionPane.showInputDialog(mensaje);
return Double.parseDouble(entrada);
}
private static void mostrarMensaje (String mensaje)
{
JOptionPane.showMessageDialog(null,mensaje);
}
}
Estructuras de control: Java
- 31 -
Fernando Berzal
Bucles anidados
Los bucles tambin se pueden anidar:
Ejemplo
int n,i,k;
n = 0;
// Paso 1
// Paso 2
// Paso 3
n = n + i + k;
// Paso 4
// Paso 5
// Paso 6
// Paso 7
Paso
10
12
19
24
2
5
3
5
- 32 -
27
Fernando Berzal
Cuestiones de estilo
Escribimos cdigo para que lo puedan leer otras personas,
no slo para que lo traduzca el compilador.
Identificadores
q
p, i, s...
precio, izquierda, suma...
Constantes
q
- 33 -
Fernando Berzal
Expresiones
q
Expresiones booleanas:
Es aconsejable escribirlas como se diran en voz alta.
if ( !(bloque<actual) )
if ( bloque >= actual )
Expresiones complejas:
Es aconsejable dividirlas para mejorar su legibilidad
max = (a > b) ? a : b;
Comentarios
q
i++;
/* Incrementa el contador */
- 34 -
Fernando Berzal
Estructuras de control
q
Sangras:
Conviene utilizar espacios en blanco o separadores para delimitar
el mbito de las estructuras de control de nuestros programas.
Lneas en blanco:
Para delimitar claramente los distintos bloques de cdigo
en nuestros programas dejaremos lneas en blanco entre ellos.
Salvo en la cabecera de los bucles for,
slo incluiremos una sentencia por lnea de cdigo.
Sean cuales sean las convenciones utilizadas al escribir cdigo (p.ej.
uso de sangras y llaves), hay que ser consistente en su utilizacin.
while () {
while ()
{
for (;;) {
for (;;)
{
if () {
if ()
{
- 35 -
Fernando Berzal
Estructuras de control
Relacin de ejercicios
1. Cuntas veces se ejecutara el cuerpo de los siguientes bucles for?
for (i=1; i<10; i++)
for (i=30; i>1; i-=2)
for (i=30; i<1; i+=2)
for (i=0; i<30; i+=4)
3. Escriba un programa que lea una serie de N datos y nos muestre: el nmero de
datos introducidos, la suma de los valores de los datos, la media del conjunto de
datos, el mximo, el mnimo, la varianza y la desviacin tpica.
PISTA: La varianza se puede calcular a partir de
la suma de los cuadrados de los datos.
4. Disee un programa que lea los coeficientes de una ecuacin de segundo grado
ax2+bx+c=0 y calcule sus dos soluciones. El programa debe responder de forma
adecuada para cualquier caso que se pueda presentar.
5. Disee un programa que lea los coeficientes de un sistema de dos ecuaciones
lineales con dos incgnitas y calcule su solucin. El programa debe responder de
forma adecuada cuando el sistema de ecuaciones no sea compatible
determinado.
ax + by = c
dx + ey = f
6. Dada una medida de tiempo expresada en horas, minutos y segundos con valores
arbitrarios, elabore un programa que transforme dicha medida en una expresin
correcta. Por ejemplo, dada la medida 3h 118m 195s, el programa deber
obtener como resultado 5h 1m 15s. Realice el programa sin utilizar los
operadores de divisin entera (/ y %).
7. Escriba un programa en C que nos calcule el cambio que debe dar la caja de un
supermercado: Dado un precio y una cantidad de dinero, el programa nos dir
cuntas monedas deben darse como cambio de tal forma que el nmero total de
monedas sea mnimo. Realice el programa sin utilizar los operadores de divisin
entera (/ y %).
8. Implemente un programa que lea un nmero decimal y lo muestre en pantalla en
hexadecimal (base 16). El cambio de base se realiza mediante divisiones
sucesivas por 16 en las cuales los restos determinan los dgitos hexadecimales
del nmero segn la siguiente correspondencia:
Resto
Dgito
0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10 11 12 13 14 15
A B C D E F
Por ejemplo:
65029|10 = FE05|16
9. Escriba una funcin (un mtodo) que obtenga la letra del DNI a partir del
nmero. Para ello debe obtener el resto de dividir el nmero entre 23. La letra
asociada al nmero vendr dada por este resto en funcin de la siguiente tabla:
0T
6Y
12 N
18 H
1R
7F
13 J
19 L
2W
8P
14 Z
20 C
3A
9D
15 S
21 K
4G
10 X
16 Q
22 E
5M
11 B
17 V
23 T
10. Escriba una funcin que, a partir de los dgitos de un ISBN, calcule el carcter
de control con el que termina todo ISBN. Para calcular el carcter de control,
debe multiplicar cada dgito por su posicin (siendo el dgito de la izquierda el
que ocupa la posicin 1), sumar los resultados obtenidos y hallar el resto de
dividir por 11. El resultado ser el carcter de control, teniendo en cuenta que el
carcter de control es X cuando el resto vale 10.
11. Implemente un programa que calcule la suma de los 100 primeros trminos de
las siguientes sucesiones:
a n = a n 1 + n
a n 1
n
n2 1
a n = (1) n
2n + 1
an =
23. Ample el programa del ejercicio anterior permitiendo que el jugador juegue
tantas veces como desee. El programa deber mantener las estadsticas del
jugador y mostrrselas al final de cada partida (nmero medio de intentos para
adivinar el nmero, nmero de veces que el jugador abandona, mejor partida y
peor partida).
Vectores y matrices
Arrays
Declaracin
Creacin
Acceso a los elementos de un array
Manipulacin de vectores y matrices
Algoritmos de ordenacin
Ordenacin por seleccin
Ordenacin por insercin
Ordenacin por intercambio directo (mtodo de la burbuja)
Ordenacin rpida (QuickSort)
Algoritmos de bsqueda
Bsqueda lineal
Bsqueda binaria
Apndice: Cadenas de caracteres
-0-
Fernando Berzal
Arrays
Un array es una estructura de datos
que contiene una coleccin de datos del mismo tipo
Ejemplos
Temperaturas mnimas de los ltimos treinta das
Valor de las acciones de una empresa durante la ltima semana
Terminologa
Los arrays unidimensionales se conocen con el nombre de vectores.
Los arrays bidimensionales se conocen con el nombre de matrices.
Vectores y matrices - Java
-1-
Fernando Berzal
Declaracin
Para declarar un array,
se utilizan corchetes para indicar que se trata de un array
y no de una simple variable del tipo especificado.
o bien
tipo[] identificador;
donde
tipo es el tipo de dato de los elementos del vector
identificador es el identificador de la variable.
o bien
tipo[][] identificador;
-2-
Fernando Berzal
Creacin
Los arrays se crean con el operador new.
Ejemplos
float[] notas = new float[ALUMNOS];
int[] temperaturas = new int[7];
Ejemplo
int[][] temperaturas = new int[12][31];
Vectores y matrices - Java
-3-
Fernando Berzal
Uso
Para acceder a los elementos de un array,
utilizamos ndices
(para indicar la posicin del elemento dentro del array)
Ejemplo
float[] notas = new float[3];
-4-
Fernando Berzal
Inicializacin en la declaracin
Podemos asignarle un valor inicial
a los elementos de un array en la propia declaracin
int vector[] = {1, 2, 3, 5, 7};
int matriz[][] = { {1,2,3}, {4,5,6} };
-5-
Fernando Berzal
Manipulacin
de vectores y matrices
Las operaciones se realizan componente a componente
-6-
Fernando Berzal
Ejemplo
public class Vectores
{
public static void main (String[] args)
{
int pares[] = { 2, 4, 6, 8, 10 };
int impares[] = { 1, 3, 5, 7, 9 };
mostrarVector(pares);
System.out.println("MEDIA="+media(pares));
mostrarVector(impares);
System.out.println("MEDIA="+media(impares));
}
static void mostrarVector (int datos[])
{
int
i;
for (i=0; i<datos.length; i++)
System.out.println(datos[i]);
}
static float media (int datos[])
{
int i;
int n = datos.length;
int suma = 0;
for (i=0; i<n; i++)
suma = suma + datos[i];
return suma/n;
}
}
-7-
Fernando Berzal
IMPORTANTE:
Cuando se pasa un array como parmetro,
se copia una referencia al array y no el conjunto de valores en s.
Por tanto, tenemos que tener cuidado con los efectos colaterales
que se producen si, dentro de un mdulo,
modificamos un vector que recibimos como parmetro.
Ejemplo
El siguiente mtodo lee los elementos de un vector ya creado
static void leerVector (int[] datos)
{
int
i;
for (i=0; i<datos.length; i++)
datos[i] = leerValor();
}
-8-
Fernando Berzal
Copia de arrays
La siguiente asignacin slo copia las referencias,
no crea un nuevo array:
int[] datos = pares;
EXTRA:
La biblioteca de clases de Java incluye una clase auxiliar llamada
java.util.Arrays que incluye como mtodos algunas de las tareas
que se realizan ms a menudo con vectores:
- Arrays.sort(v) ordena los elementos del vector.
- Arrays.equals(v1,v2) comprueba si dos vectores son iguales.
- Arrays.fill(v,val) rellena el vector v con el valor val.
- Arrays.toString(v) devuelve una cadena que representa
el contenido del vector.
- Arrays.binarySearch(v, k) busca el valor k dentro del vector
v (que previamente ha de estar ordenado).
Vectores y matrices - Java
-9-
Fernando Berzal
Ejemplos
Un programa que muestra los parmetros
que le indicamos en la lnea de comandos:
public class Eco
{
public static void main(String args[])
{
int i;
for (i=0; i<args.length; i++)
System.out.println(args[i]);
}
}
- 10 -
Fernando Berzal
Algoritmos de ordenacin
Ordenacin por seleccin
- 11 -
Fernando Berzal
- 12 -
Fernando Berzal
En cada iteracin
- 13 -
Fernando Berzal
Uso:
quicksort (vector, 0, vector.length-1);
- 14 -
Fernando Berzal
- 15 -
Fernando Berzal
/**
* Divisin del vector en dos partes
* @see quicksort
*
* @param primero ndice del primer elemento
* @param ultimo ndice del ltimo elemento
* @return Posicin del pivote
*
* @pre (primero>=0)
*
&& (primero<=ultimo)
*
&& (ultimo<v.length)
*/
private static int partir
(double v[], int primero, int ultimo)
{
double pivote = v[primero]; // Valor del pivote
double temporal;
// Variable auxiliar
int izda = primero+1;
int dcha = ultimo;
do {
// Pivotear
- 16 -
Fernando Berzal
Algoritmos de bsqueda
Bsqueda lineal = Bsqueda secuencial
// Bsqueda lineal de un elemento en un vector
// - Devuelve la posicin de dato en el vector
// - Si dato no est en el vector, devuelve -1
static int buscar (double vector[], double dato)
{
int i;
int N = vector.length;
int pos = -1;
for (i=0; i<N; i++)
if (vector[i]==dato)
pos = i;
return pos;
}
Versin mejorada
// Bsqueda lineal de un elemento en un vector
// - Devuelve la posicin de dato en el vector
// - Si dato no est en el vector, devuelve -1
static int buscar (double vector[], double dato)
{
int i;
int N = vector.length;
int pos = -1;
for (i=0; (i<N) && (pos==-1); i++)
if (vector[i]==dato)
pos = i;
return pos;
}
Vectores y matrices - Java
- 17 -
Fernando Berzal
Bsqueda binaria
Precondicin
El vector ha de estar ordenado
Algoritmo
Se compara el dato buscado
con el elemento en el centro del vector:
- Si coinciden, hemos encontrado el dato buscado.
- Si el dato es mayor que el elemento central del vector,
tenemos que buscar el dato en segunda mitad del vector.
- Si el dato es menor que el elemento central del vector,
tenemos que buscar el dato en la primera mitad del
vector.
- 18 -
Fernando Berzal
- 19 -
Fernando Berzal
Apndice:
Cadenas de caracteres
Una cadena de caracteres no es ms que un vector de caracteres.
La clase java.lang.String,
que se emplea para representar cadenas de caracteres en Java,
incluye distintos mtodos que nos facilitan algunas de las
operaciones que se suelen realizar con cadenas de caracteres:
- El mtodo substring nos permite obtener una subcadena:
String java=Java;
String s = java.substring(0,3);
System.out.println(s);
// Jav
// v
// 1
- 20 -
// Jini
Fernando Berzal
RECORDATORIO:
- 21 -
Fernando Berzal
Vectores y matrices
Relacin de ejercicios
1. Dado un vector de nmeros reales:
a. Escriba un mtodo max que nos devuelva el mximo de los valores
incluidos en el vector.
b. Escriba un mtodo min que nos devuelva el mnimo de los valores
incluidos en el vector.
c. Escriba un mtodo media que nos devuelva la media de los valores
incluidos en el vector.
d. Escriba un mtodo varianza que nos devuelva la varianza de los
valores incluidos en el vector.
e. Escriba un mtodo mediana que nos devuelva la mediana de los valores
incluidos en el vector.
f. Escriba un mtodo moda que nos devuelva la moda de los valores
incluidos en el vector
g. Escriba un mtodo percentil(n) que nos delvuelva el valor
correspondiente al percentil n en el conjunto de valores del vector.
2. Implemente una clase en Java, llamada Serie, que encapsule un vector de
nmeros reales e incluya mtodos (no estticos) que nos permitan calcular todos
los valores mencionados en el ejercicio anterior a partir de los datos
encapsulados por un objeto de tipo Serie.
3. Dado un vector de nmeros reales, escriba un mtodo que nos devuelva el
mximo y el mnimo de los valores incluidos en el vector.
4. Dado un vector, implemente un mtodo que inserte un elemento en una posicin
dada del vector.
NOTA: Insertar un elemento en el vector desplaza una posicin hacia la
derecha a los elementos del vector que han de quedar detrs del elemento
insertado. Adems, la insercin ocasiona la desaparicin del ltimo
elemento del vector.
Se pide disear una clase que represente una secuencia de ADN e incluya un
mtodo booleano que nos devuelva true si dos cadenas de ADN coinciden.
MUY IMPORTANTE: La secuencia de ADN es cclica, por lo que puede comenzar
en cualquier posicin. Por ejemplo, las dos secuencias siguientes coinciden:
A
7. Dado un vector de nmeros reales, escriba un mtodo que ordene los elementos
del vector de mayor a menor.
8. Dado un vector de nmeros reales, escriba un mtodo que ordene los elementos
del vector de tal forma que los nmeros pares aparezcan antes que los nmeros
impares. Adems, los nmeros pares debern estar ordenados de forma
ascendente, mientras que los nmeros impares debern estar ordenados de forma
descendente. Esto es, el vector {1,2,3,4,5,6} quedar como {2,4,6,5,3,1}.
9. Crear una clase Matriz para manipular matrices que encapsule un array
bidimensional de nmeros reales.
a. Incluya en la clase mtodos que nos permitan acceder y modificar de
forma segura los elementos de la matriz (esto es, las variables de
instancia deben ser privadas y los mtodos han de comprobar la validez
de sus parmetros).
b. Escriba un mtodo que nos permita sumar matrices.
c. Implemente un mtodo que nos permita multiplicar matrices.
d. Cree un mtodo con el que se obtenga la traspuesta de una matriz.
12. Crear un programa modular para jugar a las 7 y media. Se trata de un juego de
cartas (con baraja espaola) en el que el objetivo es alcanzar una puntuacin de
7.5. Cada carta del 1 al 7 tiene su valor nominal y cada figura (sota, caballo y
rey) vale 0.5 puntos.
NOTA: Para barajar, mezcle los elementos de
un vector de cartas intercambiando en repetidas
ocasiones cartas elegidas al azar con la ayuda de
la funcin Math.random()
Recursividad
Preliminares
Uso de memoria en tiempo de ejecucin
Demostraciones por induccin
Concepto de recursividad
Utilidad
Funcionamiento de un algoritmo recursivo
Diseo de algoritmos recursivos
Recursividad frente a iteracin
Ejemplos
Sucesin de Fibonacci
Combinaciones
Las torres de Hanoi
Recursividad - Java
-0-
Fernando Berzal
Preliminares
Uso de memoria en tiempo de ejecucin
Al ejecutar una aplicacin Java,
la memoria usada por la aplicacin se divide en distintas zonas:
Memoria
Zona esttica
Programa
Variables de clase
Bytecodes
Pila
Heap
Objetos
Llamadas a mtodos
Programa
En una zona de memoria se cargan los bytecodes correspondientes a
las clases que forman parte de la aplicacin.
NOTA:
Zona esttica
Donde se almacenan las variables de clase (declaradas con static)
- Datos compartidos (datos globales).
- Datos que han de mantenerse ms all de la duracin de la
invocacin a un mtodo o de la vida de un objeto.
Recursividad - Java
-1-
Fernando Berzal
Pila
Donde se almacenan las variables locales (y parmetros) de los
mtodos que se invocan.
- Cada llamada a un mtodo provoca que se reserve espacio en la
pila para almacenar sus variables locales (y los valores de sus
parmetros).
- Al finalizar la ejecucin del mtodo, se libera el espacio ocupado
en la pila por las variables locales del mtodo.
Esta zona de memoria se denomina pila
por la forma en que evoluciona su estado:
Heap
Donde se almacena el estado de los objetos creados con new.
Java incluye un recolector de basura (garbage collector) que
libera la memoria ocupada por un objeto cuando ste deja de
usarse sin que nosotros tengamos que estar pendientes de liberar
la memoria que dejamos de utilizar.
Recursividad - Java
-2-
Fernando Berzal
Induccin
Una estrategia matemtica de demostracin.
Ejemplo
Sea S:intint una funcin
que nos da la suma de los n primeros nmeros naturales
De forma iterativa, podemos escribir
S(n) = 1 + 2 + 3 + + n
La expresin anterior es equivalente a
S ' ( n) =
n(n + 1)
2
2.
k ( k + 1)
k 2 + 3k + 2 ( k + 1)( k + 2)
S ( k + 1) = S ( k ) + ( k + 1) =
+ ( k + 1) =
=
= S ' ( k + 1)
2
2
2
-3-
Fernando Berzal
Recursividad
Una funcin que se llama a s misma se denomina recursiva
Utilidad
Cuando la solucin de un problema se puede expresar en
trminos de la resolucin de un problema de la misma naturaleza,
aunque de menor complejidad.
Divide y vencers:
Un problema complejo se divide en otros problemas ms sencillos
(del mismo tipo)
Slo tenemos que conocer la solucin no recursiva para algn
caso sencillo (denominado caso base) y hacer que la divisin de
nuestro problema acabe recurriendo a los casos base que hayamos
definido.
Como en las demostraciones por induccin, podemos considerar
que tenemos resuelto el problema ms simple para resolver el
problema ms complejo (sin tener que definir la secuencia exacta de
pasos necesarios para resolver el problema).
Recursividad - Java
-4-
Fernando Berzal
Ejemplo
Cuntas formas hay de colocar n objetos en orden?
- Podemos colocar cualquiera de los n objetos en la primera
posicin.
- A continuacin, colocamos los (n-1) objetos restantes.
- Por tanto: P(n) = n P(n-1) = n!
fact(3)
fact(4) n = 3
n=4
n=4
fact(1)
n=0
fact(2)
n=1
n=1
n=2
n=2
1
1
n=1
2
n=2
n=2
n=2
6
n=3
n=3
n=3
n=3
n=3
n=3
n=4
n=4
n=4
n=4
n=4
n=4
24
n=4
tiempo
Recursividad - Java
-5-
Fernando Berzal
Ejemplo
static int potencia (int x, int n)
{
if (n==0)
// Caso base
return 1;
else
// Caso general
return x * potencia(x,n-1);
}
n=0
x=5
n=1
n=1
n=1
x=5
x=5
x=5
n=2
n=2
n=2
n=2
n=2
x=5
x=5
x=5
x=5
x=5
25
n=3
n=3
n=3
n=3
n=3
n=3
n=3
x=5
x=5
x=5
x=5
x=5
x=5
x=5
125
Clculo de 53
Recursividad - Java
-6-
Fernando Berzal
Recursividad - Java
-7-
Fernando Berzal
-8-
Fernando Berzal
Solucin recursiva
static int fibonacci (int n)
{
if ((n == 0) || (n == 1))
return 1;
else
return fibonacci(n-1) + fibonacci(n-2);
}
Solucin iterativa
static int fibonacci (int n)
{
int actual, ant1, ant2;
ant1 = ant2 = 1;
if ((n == 0) || (n == 1)) {
actual = 1;
} else
for (i=2; i<=n; i++) {
actual = ant1 + ant2;
ant2 = ant1;
ant1 = actual;
}
}
return actual;
}
Clculo recursivo de fibonacci(5)
Recursividad - Java
-9-
Fernando Berzal
Ejemplo: Combinaciones
De cuntas formas se pueden seleccionar
m elementos de un conjunto de n?
Si cogemos dos letras del conjunto {A,B,C,D,E}
podemos obtener 10 parejas diferentes:
{A, B}
{A, C}
{B, C}
{A, D}
{B, D}
{C, D}
{A, E}
{B, E}
{C, E}
{D, E}
n n 1 n 1
=
+
m m m 1
n
0 1 2 3 4 5
0
1
2
3
4
5
m
0 C0 C0 C0 C0 C0 C0
1 C 2C 3 C 4 C 5 C
1
1
1
1
1
1
2
2C 3 C 4 C 5 C
2
2
2
2
3 C 4 C 5 C 6C
3
3
3
3
4C 5C
4
4
Recursividad - Java
- 10 -
Fernando Berzal
Implementacin recursiva:
static int combinaciones (int n, int m)
{
if ((m == 0) || (m == n))
return 1;
else
return combinaciones(n-1, m)
+ combinaciones(n-1, m-1);
}
n!
Recursividad - Java
- 11 -
Fernando Berzal
Solucin recursiva:
static void hanoi
(int n, int inic, int tmp, int fin)
{
if (n > 0) {
// Mover n-1 discos de "inic" a "tmp".
// El temporal es "fin".
hanoi (n-1, inic, fin, tmp);
// Mover el que queda en "inic" a "fin"
System.out.println(inic+->+fin);
// Mover n-1 discos de "tmp" a "fin".
// El temporal es "inic".
hanoi (n-1, tmp, inic, fin);
}
}
Recursividad - Java
- 12 -
Fernando Berzal
Segn la leyenda, los monjes de un templo tenan que mover una pila
de 64 discos sagrados de un sitio a otro. Slo podan mover un disco al
da y, en el templo, slo haba otro sitio en el que podan dejarlos,
siempre ordenados de forma que los mayores quedasen en la base.
El da en que los monjes realizasen el ltimo movimiento,
el final del mundo habra llegado en cuntos das?
Recursividad - Java
- 13 -
Fernando Berzal
Recursividad
Relacin de ejercicios
1. Demuestre por induccin que la funcin Q(n)=12+22+32++n2
puede expresarse como Q(n) = n (n+1) (2n+1) / 6
2. Demuestre por induccin que, para todo n mayor o igual que 1,
133 divide a 11n+1 + 122n-1
3. Demuestre por induccin que, para todo n mayor o igual que 4, n!>2n
4. Dado un tablero de ajedrez (de tamao 8x8) al que le falta una casilla, podemos
rellenar las dems casillas utilizando nicamente teselas con forma de L?
10. Construya una funcin que convierta un nmero decimal en una cadena que represente
el valor del nmero en hexadecimal (base 16). A continuacin, generalice la funcin
para convertir un nmero decimal en un nmero en base B (con B<10).
0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10 11 12 13 14 15
A B C D E F
Por ejemplo:
65029|10 = FE05|16
11. Implemente, tanto de forma recursiva como de forma iterativa, una funcin que nos
diga si una cadena de caracteres es simtrica (un palndromo). Por ejemplo,
DABALEARROZALAZORRAELABAD es un palndromo.
12. Implemente, tanto de forma recursiva como de forma iterativa, una funcin que le d la
vuelta a una cadena de caracteres.
NOTA:
Obviamente, si la cadena es un palndromo, la cadena y su inversa coincidirn.
13. Implemente, tanto de forma recursiva como de forma iterativa, una funcin que
permitan calcular el nmero de combinaciones de n elementos tomados de m en m.
Realice dos versiones de la implementacin iterativa, una aplicando la frmula y otra
utilizando una matriz auxiliar (en la que se vaya construyendo el tringulo de Pascal).
14. Implemente, tanto de forma recursiva como de forma iterativa, una funcin que nos
devuelva el mximo comn divisor de dos nmeros enteros utilizando el algoritmo de
Euclides.
ALGORITMO DE EUCLIDES
Dados dos nmeros enteros positivos m y n, tal que m > n,
para encontrar su mximo comn divisor
(es decir, el mayor entero positivo que divide a ambos):
- Dividir m por n para obtener el resto r (0 r < n)
- Si r = 0, el MCD es n.
- Si no, el mximo comn divisor es MCD(n,r).
16. Disee e implemente un algoritmo que imprima todas las posibles descomposiciones de
un nmero natural como suma de nmeros menores que l (sumas con ms de un
sumando).
17. Disee e implemente un mtodo recursivo que nos permita obtener el determinante de
una matriz cuadrada de dimensin n.
18. Disee e implemente un programa que juegue al juego de cifras de Cifras y Letras.
El juego consiste en obtener, a partir de 6 nmeros, un nmero lo ms cercano posible a
un nmero de tres cifras realizando operaciones aritmticas con los 6 nmeros.
19. Problema de las 8 reinas: Se trata de buscar la forma de colocar 8 reinas en un tablero
de ajedrez de forma que ninguna de ellas amenace ni se vea amenazada por otra reina.
Algoritmo:
- Colocar la reina i en la primera casilla vlida de la fila i
- Si una reina no puede llegar a colocarse en ninguna casilla, se vuelve
atrs y se cambia la posicin de la reina i-1
- Intentar colocar las reinas restantes en las filas que quedan
20. Salida de un laberinto: Se trata de encontrar un camino que nos permita salir de un
laberinto definido en una matriz NxN. Para movernos por el laberinto, slo podemos
pasar de una casilla a otra que sea adyacente a la primera y no est marcada como una
casilla prohibida (esto es, las casillas prohibidas determinan las paredes que forman el
laberinto).
Algoritmo:
- Se comienza en la casilla (0,0) y se termina en la casilla (N-1,N-1)
- Nos movemos a una celda adyacente si esto es posible.
- Cuando llegamos a una situacin en la que no podemos realizar ningn
movimiento que nos lleve a una celda que no hayamos visitado ya,
retrocedemos sobre nuestros pasos y buscamos un camino alternativo.
Tcnicas tiles
en el desarrollo de software
Refactorizacin
Ejemplo: Generacin de nmeros primos
Cundo hay que refactorizar?
Algunas refactorizaciones comunes
Pruebas de unidad
JUNIT
Ejemplo: La clase Money
TDD [Test-Driven Development]
Caso prctico: Bolera
Bibliografa
Robert C. Martin:
Agile Software Development: Principles, Patterns, and Practices.
Prentice Hall, 2003. ISBN 0-13-597444-5.
Martin Fowler:
Refactoring: Improving the design of existing code.
Addison-Wesley, 2000. ISBN 0-201-48567-2.
Kent Beck:
Test-Driven Development by Example.
Addison-Wesley, 2003. ISBN 0-321-14653-0
Refactorizacin
Definicin
Refactorizacin (n)
Cambio realizado a la estructura interna del software
para hacerlo ms fcil de comprender
y
ms fcil de modificar
sin cambiar su comportamiento observable.
Refactorizar (v)
Reestructurar el software
aplicando una secuencia de refactorizaciones.
-1-
Fernando Berzal
Ejemplo
Generacin de nmeros primos
Robert C. Martin, The Craftsman column,
Software Development magazine, julio-septiembre 2002
Para conseguir un trabajo nos plantean el siguiente problema
Implementar una clase que sirva para calcular todos los nmeros
primos de 1 a N utilizando la criba de Eratstenes
Una primera solucin
Necesitamos crear un mtodo que reciba como parmetro un valor
mximo y devuelva como resultado un vector con los nmeros primos.
Para intentar lucirnos, escribimos
/**
* Clase para generar todos los nmeros primos de 1 hasta
* un nmero mximo especificado por el usuario. Como
* algoritmo se utiliza la criba de Eratstenes.
* <p>
* Eratstenes de Cirene (276 a.C., Cirene, Libia 194
* a.C., Alejandra, Egipto) fue el primer hombre que
* calcul la circunferencia de la Tierra. Tambin
* se le conoce por su trabajo con calendarios que ya
* incluan aos bisiestos y por dirigir la mtica
* biblioteca de Alejandra.
* <p>
* El algoritmo es bastante simple: Dado un vector de
* enteros empezando en 2, se tachan todos los mltiplos
* de 2. A continuacin, se encuentra el siguiente
* entero no tachado y se tachan todos sus mltiplos. El
* proceso se repite hasta que se pasa de la raz cuadrada
* del valor mximo. Todos los nmeros que queden sin
* tachar son nmeros primos.
*
* @author Fernando Berzal
* @version 1.0 Enero2005 (FB)
*/
-2-
Fernando Berzal
-3-
Fernando Berzal
// Vector vaco
}
}
}
// JUnit
-4-
Fernando Berzal
// Casos de prueba
public void testPrimos()
{
int[] nullArray = Criba.generarPrimos(0);
assertEquals(nullArray.length, 0);
int[] minArray = Criba.generarPrimos(2);
assertEquals(minArray.length, 1);
assertEquals(minArray[0], 2);
int[] threeArray = Criba.generarPrimos(3);
assertEquals(threeArray.length, 2);
assertEquals(threeArray[0], 2);
assertEquals(threeArray[1], 3);
int[] centArray = Criba.generarPrimos(100);
assertEquals(centArray.length, 25);
assertEquals(centArray[24], 97);
}
}
-5-
Fernando Berzal
-6-
Fernando Berzal
-7-
Fernando Berzal
Un segundo intento
El cdigo ha mejorado pero an es algo ms enrevesado de la cuenta:
eliminamos la variable dim (nos vale esPrimo.length),
elegimos identificadores ms adecuados para los mtodos y
reorganizamos el interior del mtodo inicializarCandidatos
(el antiguo inicializarCriba).
public class GeneradorDePrimos
{
private static boolean esPrimo[];
private static int primos[];
public static int[] generarPrimos (int max)
{
if (max < 2) {
return new int[0];
} else {
inicializarCandidatos(max);
eliminarMultiplos();
obtenerCandidatosNoEliminados();
return primos;
}
}
private static void inicializarCandidatos (int max)
{
int i;
esPrimo = new boolean[max+1];
esPrimo[0] = esPrimo[1] = false;
for (i=2; i<esPrimo.length; i++)
esPrimo[i] = true;
}
private static void eliminarMultiplos ()
// Cdigo del antiguo mtodo cribar()
private static void obtenerCandidatosNoEliminados ()
// Cdigo del antiguo mtodo rellenarPrimos()
}
-8-
Fernando Berzal
Mejoras adicionales
El bucle anidado de eliminarMultiplos poda eliminarse si usamos
un mtodo auxiliar para eliminar los mltiplos de un nmero concreto.
Por otro lado, la raz cuadrada que aparece en eliminarMultiplos
no queda muy claro de dnde proviene (en realidad, es el valor
mximo que puede tener el menor factor de un nmero no primo
menor o igual que N). Adems, el +1 resulta innecesario.
private static void eliminarMultiplos ()
{
int i;
for (i=2; i<maxFactor(); i++)
if (esPrimo[i])
eliminarMultiplosDe(i);
}
private static int maxFactor ()
{
return (int) Math.sqrt(esPrimo.length) + 1;
}
private static void eliminarMultiplosDe (int i)
{
int multiplo;
for ( multiplo=2*i;
multiplo<esPrimo.length;
multiplo+=i)
esPrimo[multiplo] = false;
}
-9-
Fernando Berzal
Fernando Berzal
Fernando Berzal
NOTA:
Si el antiguo mtodo era un mtodo pblico usado por otros
componentes o aplicaciones y no podemos eliminarlo, el antiguo
mtodo se deja en su lugar (como una llamada al nuevo mtodo)
y se marca como deprecated con Javadoc (@deprecated).
Fernando Berzal
Fernando Berzal
Versin final
Como sabemos que no es muy recomendable usar demasiado a
menudo la palabra reservada static, con unos pequeos cambios
convertimos GeneradorDePrimos en una clase de la que se puedan
crear distintos objetos.
En primer lugar, modificamos los casos de prueba con los que
comprobaremos el funcionamiento de nuestro generador de primos:
import junit.framework.*;
public class GeneradorDePrimosTest extends TestCase
{
GeneradorDePrimos generador;
int[]
primos;
public static void main(String args[])
{
junit.swingui.TestRunner.main(
new String[] {"GeneradorDePrimosTest"});
}
public GeneradorDePrimosTest(String name)
{
super(name);
}
public void testPrimos0()
{
generador = new GeneradorDePrimos(0);
primos = generador.getPrimos();
assertEquals( primos.length, 0);
}
public void testPrimos2()
{
generador = new GeneradorDePrimos(2);
primos = generador.getPrimos();
assertEquals(primos.length, 1);
assertEquals(primos[0], 2);
}
Tcnicas tiles en el desarrollo de software - 10 -
Fernando Berzal
Fernando Berzal
// Vector vaco
} else {
inicializarCandidatos(max);
eliminarMultiplos();
obtenerCandidatosNoEliminados();
}
}
Fernando Berzal
Fernando Berzal
Pruebas de unidad
con JUnit
Cuando se implementa software, resulta recomendable comprobar
que el cdigo que hemos escrito funciona correctamente.
Para ello, implementamos pruebas que verifican
que nuestro programa genera los resultados que de l esperamos.
Fernando Berzal
JUnit
Herramienta especialmente diseada para implementar y automatizar
la realizacin de pruebas de unidad en Java.
Fernando Berzal
Fernando Berzal
import junit.framework.*;
public class CuentaTest extends TestCase
{
public static void main(String args[])
{
junit.swingui.TestRunner.main (
new String[] {"CuentaTest"});
}
public CuentaTest(String name)
{
super(name);
}
// Casos de prueba
Fernando Berzal
Acciones
200
100
Precio
10 EUR
50 EUR
Total
2000 EUR
5000 EUR
7000 EUR
Acciones
200
100
Precio
13 USD
50 EUR
Total
2600 USD
5000 EUR
7000 EUR
Fernando Berzal
Una de las cosas que tendremos que hacer es sumar cantidades, por lo
que podemos idear un caso de prueba como el siguiente:
import junit.framework.*;
public class MoneyTest extends TestCase
{
public void testSumaSimple()
{
Money m10 = new Money (10, "EUR");
Money m20 = new Money (20, "EUR");
Money esperado = new Money (30, "EUR");
Money resultado = m10.add(m20);
Assert.assertEquals(resultado,esperado);
}
}
Fernando Berzal
Fernando Berzal
Fernando Berzal
Fernando Berzal
Fernando Berzal
Por ahora, nos hemos limitado a realizar una conversin fija para
probar el funcionamiento de nuestra clase Money (en una aplicacin
real tendramos que conectarnos realmente con el banco).
Obviamente, al ejecutar nuestros casos de prueba se produce un error:
Fernando Berzal
Fernando Berzal
Fernando Berzal
TDD
[Test-Driven Development]
Consiste en implementar las pruebas de unidad
antes incluso de comenzar a escribir el cdigo de un mdulo.
Tradicionalmente,
las pruebas se realizan a posteriori
Los casos de prueba se suelen escribir despus de implementar el
mdulo cuyo funcionamiento pretenden verificar.
Como mucho, se preparan en paralelo si el programador
y la persona que realiza las pruebas [tester] no son la misma persona.
En TDD,
las pruebas se preparan antes de comenzar a escribir el cdigo.
Primero escribimos un caso de prueba
y slo despus implementamos el cdigo necesario
para que el caso de prueba se pase con xito
Fernando Berzal
Fernando Berzal
Fernando Berzal
El problema consiste en
obtener la puntuacin de un jugador en una partida de bolos.
Robert C. Martin:
Agile Software Development: Principles, Patterns, and Practices.
Prentice Hall, 2003. ISBN 0-13-597444-5.
Fernando Berzal
Clases y objetos
Encapsulacin
Herencia
Redefinicin de mtodos y polimorfismo
El Principio de Sustitucin de Liskov
Acerca de la sobrecarga de mtodos
Un ejemplo clsico: Figuras geomtricas
La palabra reservada final
Organizacin de las clases
Organizacin fsica: ficheros
Organizacin lgica: paquetes
Modificadores de acceso
Caso prctico: Vdeo-club
Encapsulacin
RECORDATORIO
Clases
Una clase es la especificacin de un tipo de dato.
Una clase sirve
tanto de mdulo (unidad de descomposicin del software)
como de tipo
y objetos
Un objeto es una instancia de una clase.
Un objeto encapsula:
- Datos (atributos que le sirven para mantener su estado).
- Operaciones (mtodos que definen su comportamiento).
Un objeto es una entidad autnoma
con una funcionalidad concreta y bien definida.
Al programar, definimos una clase para especificar cmo se
comportan y mantienen su estado los objetos de esa clase:
Todos los objetos de una misma clase comparten
sus atributos y el comportamiento que exhiben.
Una clase no es ms que una especificacin, por lo que para
usarla hemos de instanciarla:
Se crean tantos objetos de la clase como nos haga falta.
Cada objeto proporcionar un servicio que podr ser
utilizado por otros objetos de nuestro sistema.
OOP Clases y objetos: Java
-1-
Fernando Berzal
Herencia
Hay clases que comparten gran parte de sus caractersticas.
-2-
Fernando Berzal
-3-
Fernando Berzal
En Java:
import java.util.Date;
NOTA:
Fernando Berzal
-5-
Fernando Berzal
-6-
Fernando Berzal
Redefinicin de mtodos
Como hemos visto en el ejemplo con el mtodo toString(),
cada subclase hereda las operaciones de su superclase
pero tiene la posibilidad de modificar localmente el
comportamiento de dichas operaciones (redefiniendo mtodos).
// Declaracin de variables
Trabajador trabajador;
Empleado
empleado;
Consultor consultor;
// Creacin de objetos
trabajador = new Trabajador ("Juan", "456");
empleado = new Empleado
-7-
Fernando Berzal
Polimorfismo
Al redefinir mtodos, objetos de diferentes tipos
pueden responder de forma diferente a la misma llamada
(y podemos escribir cdigo de forma general sin preocuparnos
del mtodo concreto que se ejecutar en cada momento).
Ejemplo
Podemos aadirle a la clase Trabajador un mtodo
calcularPaga genrico (que no haga nada por ahora):
// Nmina
-8-
// Por horas
Fernando Berzal
Una vez que tenemos un vector con todos los trabajadores de una
empresa, podramos crear un programa que realizase los pagos
correspondientes a cada trabajador de la siguiente forma:
una transferencia de 1200
!#"
%$&"'(
otra transferencia, esta vez de 500
-9-
Fernando Berzal
- 10 -
Fernando Berzal
- 11 -
Fernando Berzal
- 12 -
Fernando Berzal
}
Aunque creemos subclases de Consultor, el dinero
RECORDATORIO:
En Java, final tambin se usa para definir constantes simblicas.
OOP Clases y objetos: Java
- 13 -
Fernando Berzal
- 14 -
Fernando Berzal
package economics;
public class Demanda
{
private double pendiente;
private double precioMaximo;
- 15 -
Fernando Berzal
package economics.markets;
public class AnalisisEconomico
{
private economics.Demanda demanda;
private economics.Costes
costes;
private economics.Ingresos ingresos;
o bien
package economics.markets;
import economics.*;
public class AnalisisEconomico
{
private Demanda demanda;
private Costes
costes;
private Ingresos ingresos;
}
OOP Clases y objetos: Java
- 16 -
Fernando Berzal
Ejemplo
La biblioteca de clases estndar de Java
incluye cientos de clases organizadas en multitud de paquetes:
Paquete
java.lang
java.awt
java.applet
java.io
java.util
java.net
java.rmi
Descripcin
Clases centrales de la plataforma Java
(nmeros, cadenas y objetos).
No es necesario incluir la sentencia import
cuando se usan clases de este paquete.
Clases para crear interfaces grficas
y dibujar figuras e imgenes.
Clases necesarias para crear applets.
Clases para realizar operaciones de
entrada/salida (p.ej. uso de ficheros).
Utilidades varias:
fechas, generadores de nmeros aleatorios,
vectores de tamao dinmico, etctera.
Para implementar aplicaciones distribuidas
(que funcionen en redes de ordenadores).
Para crear aplicaciones distribuidas con mayor
comodidad [Remote Method Invocation].
java.sql
javax.swing
- 17 -
Fernando Berzal
Modificadores de acceso
Se pueden establecer distintos niveles de encapsulacin
para los miembros de una clase (atributos y operaciones) en
funcin de desde dnde queremos que se pueda acceder a ellos:
Visibilidad Significado
Se puede acceder al
Pblica
miembro de la clase
desde cualquier lugar.
Slo se puede acceder
al miembro de la clase
desde la propia clase o
Protegida
desde una clase que
herede de ella.
Se puede acceder a los
miembros de una clase
Por defecto
desde cualquier clase
en el mismo paquete
Slo se puede acceder
Privada
al miembro de la clase
desde la propia clase.
Java
UML
public
protected
private
La encapsulacin
permite agrupar datos y operaciones en un objeto,
de tal forma los detalles del objeto se ocultan a sus usuarios
(ocultamiento de informacin):
- 18 -
Fernando Berzal
- 19 -
Fernando Berzal
OBSERVACIONES FINALES:
}
public class Cuadrado extends Figura
{
- 20 -
Fernando Berzal
Caso prctico
Alquiler de pelculas en un vdeo-club
Adaptado de Refactoring Martin Fowler, 2000
-1-
Fernando Berzal
-2-
Fernando Berzal
import java.util.Vector;
informe()
total;
importe;
puntos;
i;
alquiler;
salida;
total = 0;
puntos = 0;
salida = "Informe para " + getNombre() + "\n";
-3-
Fernando Berzal
-4-
Fernando Berzal
\n";
-5-
Fernando Berzal
public String
{
double
double
int
int
Alquiler
String
informe()
total;
importe;
puntos;
i;
alquiler;
salida;
total = 0;
puntos = 0;
salida = "Informe para " + getNombre() +
"\n";
\n";
-6-
Fernando Berzal
-7-
Fernando Berzal
11/11
OOP - Caso prctico: Vdeo-club
-8-
Fernando Berzal
-9-
Fernando Berzal
}
}
- 10 -
Fernando Berzal
}
}
- 11 -
Fernando Berzal
- 12 -
Fernando Berzal
getPuntos()
i;
puntos;
alquiler;
puntos = 0;
for (i=0; i<_alquileres.size(); i++) {
alquiler = (Alquiler) _alquileres.get(i);
puntos += alquiler.getPuntos();
}
return puntos;
}
- 13 -
Fernando Berzal
"\t"
alquiler.getDVD().getTitulo()
"\t"
String.valueOf(alquiler.getPrecio())
" \n";
}
salida += "IMPORTE TOTAL = "
+ String.valueOf(getImporteTotal())
+ " \n";
salida += "Dispone de "
+ String.valueOf(getPuntos())
+ " puntos\n";
return salida;
}
- 14 -
Fernando Berzal
informeHTML()
i;
alquiler;
salida;
</B>\n";
- 15 -
Fernando Berzal
- 16 -
Fernando Berzal
11/11
Como siempre, la ejecucin de los casos de prueba
nos confirma que todo funciona correctamente.
OOP - Caso prctico: Vdeo-club
- 17 -
Fernando Berzal
NOTA:
Por qu no creamos una jerarqua de tipos de pelculas?
- 18 -
Fernando Berzal
- 19 -
Fernando Berzal
11/11
OOP - Caso prctico: Vdeo-club
- 20 -
Fernando Berzal
11/11
OOP - Caso prctico: Vdeo-club
- 21 -
Fernando Berzal
- 22 -
Fernando Berzal
- 23 -
Fernando Berzal
Clases y objetos
Relacin de ejercicios
1. Identifique los datos que decidira utilizar para almacenar el estado de los
siguientes objetos en funcin del contexto en el que se vayan a utilizar:
a. Un punto en el espacio.
b. Un segmento de recta.
c. Un polgono.
d. Una manzana (de las que se venden en un mercado).
e. Una carta (en Correos)
f. Un libro (en una biblioteca)
g. Un libro (en una librera)
h. Una cancin (en una aplicacin para un reproductor MP3).
i. Una cancin (en una emisora de radio)
j. Un disco de msica (en una tienda de msica).
k. Un disco de msica (en una discoteca).
l. Un telfono mvil (en una tienda de telefona)
m. Un telfono mvil (en el sistema de una empresa de telecomunicaciones)
n. Un ordenador (en una tienda de Informtica)
o. Un ordenador (en una red de ordenadores)
p. Un ordenador (en el inventario de una organizacin)
Declare las correspondientes clases en Java, defina los constructores que
considere adecuados e implemente los correspondientes mtodos para el acceso
y la modificacin del estado de los objetos (esto es, los mtodos get y set).
2. Cree una clase denominada Alarma cuyos objetos activen un objeto de tipo
Timbre cuando el valor medido por un Sensor supere un umbral
preestablecido:
a. Una coleccin de CDs, entre los cuales hay discos de msica (CDs de
audio), discos de msica en MP3 (CD-ROMs con msica), discos de
aplicaciones (CD-ROMs con software) y discos de datos (CD-ROMs con
datos y documentos).
b. Los diferentes productos que se pueden encontrar en una tienda de
electrnica, que tienen un conjunto de caractersticas comunes (precio,
cdigo de barras) y una serie de caractersticas especficas de cada
producto.
c. Los objetos de una coleccin de monedas/billetes/sellos.
Implemente en Java las jerarquas de clases que haya diseado (incluyendo sus
variables de instancia, sus constructores y sus mtodos get/set). A
continuacin, escriba sendos programas que realicen las siguientes tareas:
a. Buscar y mostrar todos los datos de un CD concreto (se recomienda
definir el mtodo toString en cada una de las subclases de CD).
b. Crear un carrito de la compra en el que se pueden incluir productos y
emitir un ticket en el que figuren los datos de cada producto del carrito,
incluyendo su precio y el importe total de la compra.
c. Un listado de todos los objetos coleccionables cuya descripcin incluya
una cadena de caracteres que el programa reciba como parmetro.
OBSERVACIONES:
Para cada clase que defina, determine qu miembros de la clase han de ser pblicos
(public), cules han de mantenerse privados (private) y, si lo considera
oportuno, cules seran miembros protegidos (protected).
Tenga en cuenta que no siempre se debe permitir la modificacin desde el exterior
de una variable de instancia (esto es, habr variables de instancia a las que
asociemos un mtodo get pero no un mtodo set y, de hacerlo, ste puede que sea
privado o protegido).
Analice tambin qu mtodos de una clase deben declararse con la palabra reservada
final para que no se puedan redefinir en subclases y qu clases han de ser finales
(esto es, aquellas clases de las que no queramos permitir que se creen subclases).
En los distintos programas de esta relacin de ejercicios puede resultar necesaria la
creacin de colecciones de objetos de distintos tipos (p.ej. arrays de CDs, productos,
objetos coleccionables o documentos).
Principios de
programacin orientada a objetos
Diseo de clases
Sntomas de un mal diseo
El principio de responsabilidad nica
El principio abierto-cerrado
El principio de sustitucin de Liskov
El principio de inversin de dependencias
Clases abstractas e interfaces
El principio de segregacin de interfaces
Ejemplo: Banca electrnica
Diseo de paquetes
Granularidad
Estabilidad
Bibliografa
Robert C. Martin:
Agile Software Development: Principles, Patterns, and Practices.
Prentice Hall, 2003. ISBN 0-13-597444-5.
http://www.objectmentor.com/resources
Diseo de clases
Cmo sabemos si nuestro diseo es correcto?
Existen algunos sntomas que nos indican
que el diseo de un sistema es bastante pobre:
- RIGIDEZ (las clases son difciles de cambiar)
- FRAGILIDAD (es fcil que las clases dejen de funcionar)
- INMOVILIDAD (las clases son difciles de reutilizar)
- VISCOSIDAD (resulta difcil usar las clases correctamente)
- COMPLEJIDAD INNECESARIA (sistema sobrediseado)
- REPETICIN INNECESARIA (abuso de copiar y pegar)
- OPACIDAD (aparente desorganizacin)
-1-
Fernando Berzal
-2-
Fernando Berzal
Viscosidad
Es ms difcil utilizar correctamente lo que ya hay implementado
que hacerlo de forma incorrecta (e, incluso, que reimplementarlo).
Por qu es un problema?
Cuando hay varias formas de hacer algo, no siempre se elige
la mejor forma de hacerlo y el diseo tiende a degenerarse.
La alternativa ms evidente y fcil de realizar
ha de ser aqulla que preserve el estilo del diseo.
Complejidad innecesaria
El diseo contiene infraestructura que no proporciona beneficios.
Por qu es un problema?
A veces se anticipan cambios que luego no se producen, lo
que conduce a ms cdigo (que hay que depurar y mantener)
La complejidad innecesaria
hace que el software sea ms difcil de entender.
Repeticin innecesaria
Copiar y pegar resulta perjudicial a la larga.
Por qu es un problema?
Porque el mantenimiento puede convertirse en una pesadilla.
El cdigo duplicado debera unificarse bajo una nica abstraccin.
Opacidad
Cdigo enrevesado difcil de entender.
Por qu es un problema? Porque la entropa del cdigo
tiende a aumentar si no se toman las medidas oportunas.
Escribimos cdigo para que otros puedan leerlo (y entenderlo).
OOP Principios de diseo: Java
-3-
Fernando Berzal
Por ejemplo, podemos crear una clase Partida para representar una
partida de bolos (que consta de 10 jugadas):
-4-
Fernando Berzal
En este contexto,
una responsabilidad equivale a una razn para cambiar.
Si se puede pensar en ms de un motivo por el que cambiar una clase,
entonces la clase tiene ms de una responsabilidad.
Ejemplo
public class Modem
{
public void marcar (String nmero)
public void colgar ()
public void enviar (String datos)
public String recibir ()
}
-5-
Fernando Berzal
El principio abierto-cerrado
Bertrand Meyer, 1997: Construccin de software orientado a objetos
-6-
Fernando Berzal
-7-
Fernando Berzal
El principio abierto-cerrado
es clave en el diseo orientado a objetos.
No obstante,
pese a que la abstraccin y el polimorfismo lo hacen posible,
el principio abierto-cerrado
no se garantiza simplemente con utilizar
un lenguaje de programacin orientado a objetos.
De la misma forma,
tampoco tenemos que crear abstracciones arbitrariamente:
No todo tiene que ser abstracto:
El cdigo debe acabar haciendo algo concreto.
Las abstracciones se han de utilizar
en las zonas que exhiban cierta propensin a sufrir cambios.
-8-
Fernando Berzal
Si S es un subtipo de T,
cualquier programa definido en funcin de T
debe comportarse de la misma forma con objetos de tipo S.
-9-
Fernando Berzal
- 10 -
Fernando Berzal
- 11 -
Fernando Berzal
- 12 -
Fernando Berzal
Formalmente,
la interfaz de una clase define su contrato.
El contrato se especifica declarando
las precondiciones y las postcondiciones asociadas a cada mtodo
(esto es, lo que verificamos con las pruebas de unidad con JUNIT):
Las precondiciones son las condiciones que
se han de cumplir antes de la llamada al mtodo.
Las postcondiciones son las condiciones que
se verifican tras la ejecucin del mtodo.
Por qu? Porque cuando se usa una clase base, slo se conocen las
precondiciones y postcondiciones asociadas a la clase base.
OOP Principios de diseo: Java
- 13 -
Fernando Berzal
La programacin estructurada
tiende a crear estructuras jerrquicas en las que
el comportamiento de los mdulos de alto nivel
(p.ej. el programa principal)
depende de detalles de mdulos de un nivel inferior
(p.ej. la opcin del men seleccionada por el usuario).
- 14 -
Fernando Berzal
Ejemplo
La inversin de dependencias de puede realizar siempre que una clase
enva un mensaje a otra y deseamos eliminar la dependencia
- 15 -
Fernando Berzal
- 16 -
Fernando Berzal
- 17 -
Fernando Berzal
Interfaces
Una interfaz es una clase completamente abstracta
(una clase sin implementacin)
- 18 -
Fernando Berzal
- 19 -
Fernando Berzal
- 20 -
Fernando Berzal
- 21 -
Fernando Berzal
- 22 -
Fernando Berzal
- 23 -
Fernando Berzal
- 24 -
Fernando Berzal
Solucin A
Interfaz contaminado
- 25 -
Fernando Berzal
Solucin B
Adaptadores
- 26 -
Fernando Berzal
Solucin C
Segregacin de interfaces
- 27 -
Fernando Berzal
Diseo de paquetes
Conforme el tamao de las aplicaciones crece,
se hace necesario algn tipo de organizacin a alto nivel.
Las clases son unidades demasiado pequeas,
por lo que se agrupan en paquetes.
Qu criterios utilizaremos para organizar las clases?
Los mismos que para organizar los miembros de las clases:
la cohesin y el acoplamiento
Granularidad:
La cohesin de los paquetes
Cundo se ponen dos clases en el mismo paquete?
Cuando para usar una, siempre es necesario usar la otra.
Cuando dos clases estn en un mismo paquete,
es porque se usan juntas. Por tanto, todas las clases de un
paquete se usan conjuntamente: si se usa una, se usan todas.
A la inversa, cundo se ponen en paquetes diferentes?
Aqullas clases que no siempre se usen conjuntamente con las
dems clases del paquete son candidatas para abandonar el
paquete (quiz para ir a un subpaquete ms especfico).
Las clases de un paquete se vern afectadas por los mismos tipos de
cambios y las modificaciones necesarias para realizar un cambio
concreto debern estar localizadas en un nico paquete.
OOP Principios de diseo: Java
- 28 -
Fernando Berzal
Estabilidad:
El acoplamiento entre paquetes
Para facilitar el desarrollo de un sistemas complejo,
resulta aconsejable que las distintas partes del sistema
sean lo ms independientes posible:
Cuanto menos dependa un paquete de otros paquetes, mejor.
- 29 -
Fernando Berzal
- 30 -
Fernando Berzal
- 31 -
Fernando Berzal
Caso prctico
Red de telefona mvil
Material adaptado de
Michael Kircher & Prashant Jain:
Pattern-oriented Software Architecture
Volume 3: Patterns for Resource Management
John Wiley & Sons, 2004
ISBN 0-470-84525-2
-1-
Fernando Berzal
Caractersticas
Transmisin analgica de voz
Transmisin digital de voz
Transmisin digital de voz y datos
Ejemplo
Moviline
GSM900
UMTS
-2-
Fernando Berzal
Red
Controlador de
la red de radio
Centro de
operaciones y mantenimiento
Estacin base
Estacin base
-3-
Fernando Berzal
Estaciones base
Se comunican con los telfonos mviles que hay en su celda
a travs de una o varias antenas.
Envan los datos que reciben de un telfono mvil al RNC,
que los reenva a otra estacin base (cuando el destinatario
es otro mvil) o a otra red (p.ej. red de telefona
convencional RTC).
Se reparten por amplias zonas geogrficas y han de ser muy
fiables para reducir su coste de mantenimiento (suelen tener
mltiples CPUs para ser capaces de procesar mltiples
llamadas en paralelo y evitar que el fallo de una CPU deje
inoperativa la estacin base)
RNCs
Hacen de mediadores entre las estaciones base y otras redes.
Son ordenadores potentes que suelen funcionar con sistemas
operativos convencionales.
OMC
Controla la configuracin del hardware y del software de las
estaciones base y de los RNCs.
Monitoriza el funcionamiento de la red y permite que
operadores humanos intervengan cuando sea necesario.
Es el nico elemento de la red que tiene interfaz de usuario.
Suele estar formado por un cluster de ordenadores (para
repartir la carga de trabajo entre varias mquinas y evitar
que el fallo de una de ellas inutilice el OMC).
-4-
Fernando Berzal
-5-
Fernando Berzal
CPU
de operacin y
mantenimiento
CPUs
para el procesamiento
de llamadas
Estacin base
-6-
Fernando Berzal
-7-
Fernando Berzal
RNC
Estacin
base
Estacin
base
CPU
-8-
Fernando Berzal
-9-
Fernando Berzal
- 10 -
Fernando Berzal
2. Al estudiar clases y objetos, vimos cmo disear una alarma que conectbamos
a un sensor y activaba un timbre:
Clases y objetos
Ejercicio resuelto
Cree una clase denominada Alarma cuyos objetos activen un
objeto de tipo Timbre cuando el valor medido por un Sensor
supere un umbral preestablecido:
-1-
Fernando Berzal
/**
* Alarma
*/
public class Alarma
{
private Sensor sensor;
private Timbre timbre;
private double umbral;
/**
* Constructor
*/
public Alarma
(Sensor
{
this.sensor
this.timbre
this.umbral
}
/**
* Comprobar estado de la alarma
*/
public void comprobar ()
{
if (sensor.getValorActual()>umbral) {
timbre.activar();
} else {
timbre.desactivar();
}
}
}
OOP Clases y objetos: Alarma
-2-
Fernando Berzal
Programa principal:
public class Programa
{
// Programa principal
public static void main(String[] args)
{
SensorSwing sensor = new SensorSwing();
Timbre timbre = new Timbre();
Alarma alarma = new Alarma (sensor, timbre, 0.0);
sensor.setAlarma(alarma);
}
}
SensorSwing es un tipo particular de Sensor que se
encarga de llamar al mtodo comprobar() de la alarma
-3-
Fernando Berzal
comprobar()
/**
* Comprobar estado de la alarma
*/
public void comprobar ()
{
if (sensor.getValorActual()>umbral) {
timbre.activar();
} else {
timbre.desactivar();
}
}
}
OOP Clases y objetos: Alarma
-4-
Fernando Berzal
/**
* Alarma luminosa (versin 1)
*/
public class AlarmaLuminosa extends Alarma
{
private Bombilla bombilla;
/**
* Constructor
*/
public AlarmaLuminosa
( Sensor sensor, Timbre timbre,
Bombilla bombilla, double umbral)
{
super(sensor,timbre,umbral);
this.bombilla = bombilla;
}
/**
* Redefinicin del mtodo comprobar()
*/
public void comprobar ()
{
super.comprobar();
if (sensor.getValorActual()>umbral) {
bombilla.encender();
} else {
bombilla.apagar();
}
}
}
-5-
Fernando Berzal
-6-
Fernando Berzal
/**
* Alarma
*/
public class Alarma
{
private Sensor sensor;
private Timbre timbre;
private double umbral;
/**
* Constructor
*/
public Alarma
(Sensor sensor, Timbre timbre, double umbral)
{
this.sensor = sensor;
this.timbre = timbre;
this.umbral = umbral;
}
/**
* Comprobar estado de la alarma
*/
public final void comprobar ()
{
if (sensor.getValorActual()>umbral) {
activar();
} else {
desactivar();
}
}
public void activar ()
{
timbre.activar();
}
public void desactivar ()
{
timbre.desactivar();
}
}
OOP Clases y objetos: Alarma
-7-
Fernando Berzal
/**
* Alarma luminosa (versin 2)
*/
public class AlarmaLuminosa extends Alarma
{
private Bombilla bombilla;
/**
* Constructor
*/
public AlarmaLuminosa
( Sensor sensor, Timbre timbre,
Bombilla bombilla, double umbral)
{
super(sensor,timbre,umbral);
this.bombilla = bombilla;
}
/**
* Redefinicin del mtodo activar()
*/
public void activar ()
{
super.activar();
bombilla.encender();
}
/**
* Redefinicin del mtodo desactivar()
*/
public void desactivar ()
{
super.desactivar();
bombilla.apagar();
}
}
-8-
Fernando Berzal
Sensor.java
/**
* Clase genrica para representar un sensor
*/
public class Sensor
{
/**
* Valor actual medido por el sensor
*/
private double valorActual;
/**
* Acceso al valor medido por el sensor
*/
public double getValorActual ()
{
return valorActual;
}
/**
* Modificacin del valor del sensor
* (algo de lo que se encargarn
* las subclases particulares de Sensor)
*/
protected void setValorActual (double valor)
{
valorActual = valor;
}
}
-9-
Fernando Berzal
SensorSwing.java
/**
* Sensor "ficticio"
* (demostracin del uso de SWING)
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SensorSwing extends Sensor
implements ActionListener
{
private JFrame
frame;
private JPanel
panel;
private JButton
button;
private JTextField editor;
private JLabel
info;
private Alarma
alarma;
/**
* Constructor
*/
public SensorSwing()
{
// Ventana (JFrame)
frame = new JFrame("Medidor de ");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,100);
// Panel (JPanel)
// donde se colocan los controles de la interfaz
panel = new JPanel(new GridLayout(3, 1));
// Controles de la interfaz de usuario
// ----------------------------------editor = new JTextField(5);
info
= new JLabel("...", SwingConstants.CENTER);
button = new JButton("Actualizar");
OOP Clases y objetos: Alarma
- 10 -
Fernando Berzal
- 11 -
Fernando Berzal
Timbre.java
import java.awt.Toolkit;
/**
* Timbre
*/
public class Timbre
{
private static final int PITIDOS = 5;
/**
* Activar el timbre
*/
public void activar ()
{
int i;
for (i=0; i<PITIDOS; i++) {
Toolkit.getDefaultToolkit().beep();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
}
/**
* Desactivar el timbre
*/
public void desactivar ()
{
}
}
- 12 -
Fernando Berzal
Bombilla.java
Una ventana roja o verde en funcin del estado de la bombilla
import java.awt.*;
import javax.swing.*;
/**
* Bombilla
*/
public class Bombilla
{
private JFrame frame;
/**
* Constructor
*/
public Bombilla()
{
frame = new JFrame("Bombilla");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,200);
frame.setVisible( true );
apagar();
}
/**
* Encender la bombilla
*/
public void encender ()
{
frame.getContentPane().setBackground( Color.red );
}
/**
* Apagar la bombilla
*/
public void apagar ()
{
frame.getContentPane().setBackground( Color.green );
}
}
OOP Clases y objetos: Alarma
- 13 -
Fernando Berzal
Excepciones
Qu es una excepcin?
Una situacin que, aunque puede pasar,
suele suponer algo negativo para la ejecucin de nuestro programa.
Ejemplos
El usuario escribe una palabra cuando se esperaba un nmero.
El programa intenta leer un fichero que no existe.
El programa no puede establecer una conexin de red.
Una conexin de red se pierde
El programa intenta realizar una divisin por cero.
Se intenta calcular la raz cuadrada de un nmero negativo.
El programa se sale de los lmites de un array.
El programa accede a los miembros de un objeto inexistente.
Terminologa
Cuando se produce una excepcin, la excepcin se lanza [throw].
Cuando se prev el posible lanzamiento de una excepcin y se toman
medidas al respecto en el cdigo de nuestra aplicacin, se captura la
excepcin [catch].
El manejo/tratamiento de excepciones consiste en capturar una
excepcin y tomar las medidas adecuadas al respecto.
Excepciones
-1-
Fernando Berzal
Gestin de errores
Qu hacer cuando se pueden producir errores
class EjemploSinControlDeErrores
{
public static void main(String args[])
{
mostrarEntero (args, 0);
}
public static void mostrarEntero
(String args[], int n)
{
System.out.println( "Entero: "
+ obtenerEntero(args,0) );
}
public static int obtenerEntero
(String args[], int n)
{
return Integer.parseInt(args[n]);
}
}
Excepciones
-2-
Fernando Berzal
class EjemploConControlDeErrores
{
public static void main(String args[]) {
mostrarEntero (args, 0);
}
public static int mostrarEntero
(String args[], int n)
{
int
i
= obtenerEntero(args,n);
int
error = 0;
String salida = null;
if (i%2 == 0)
i = i/2;
else
error = -1; // Error en los argumentos
if (error == 0) {
if ( Runtime.getRuntime().freeMemory() > (8+10)*2 )
error = -2; // Memoria insuficiente
}
if (error == 0) {
salida = "Entero: " + i;
if (salida == null)
error = -3; // Error al crear la salida
}
if (error == 0) {
System.out.println(salida);
if (System.out.checkError())
error = -4; // Error al mostrar la salida
}
return error;
}
Excepciones
-3-
Fernando Berzal
Inconvenientes
Demasiadas comprobaciones
Cdigo excesivamente enrevesado (confuso y propenso a errores)
Excepciones
-4-
Fernando Berzal
Solucin 2: Excepciones
Ya que los errores son inevitables,
las excepciones nos proporcionan una estructura de control que permite
implementar los casos normales con facilidad
y tratar separadamente los casos excepcionales
class EjemploConExcepciones
{
public static void main(String args[])
{
try {
mostrarEntero (args, 0);
} catch (Exception error) {
// Casos excepcionales...
}
}
// Casos normales...
public static void mostrarEntero
(String args[], int n)
{
System.out.println( "Entero: "
+ obtenerEntero(args,0) );
}
public static int obtenerEntero
(String args[], int n)
{
return Integer.parseInt(args[n]);
}
}
-5-
Fernando Berzal
# $
!"
Excepciones
-6-
Fernando Berzal
Throwable
Clase base que representa todo lo que se puede lanzar en Java
Contiene una instantnea del estado de la pila en el momento en el
que se cre el objeto ( stack trace o call chain").
Almacena un mensaje (variable de instancia de tipo String)
que podemos utilizar para detallar qu error se produjo.
Puede tener una causa, tambin de tipo Throwable,
que permite representar el error que caus este error.
Error
Subclase de Throwable que indica problemas graves que una aplicacin
no debera intentar solucionar (documentacin de Java).
Ejemplos: Memoria agotada, error interno de la JVM
Exception
Exception y sus subclases indican situaciones que una aplicacin
Excepciones
-7-
Fernando Berzal
// Bloque 1
try {
// Bloque 2
} catch (Exception error) {
// Bloque 3
}
// Bloque 4
Sin excepciones:
124
1 2* 3 4
1*
// Bloque 1
try {
// Bloque 2
} catch (ArithmeticException ae) {
// Bloque 3
} catch (NullPointerException ne) {
// Bloque 4
}
// Bloque 5
Sin excepciones:
125
1 2* 3 5
1 2* 4 5
1 2*
Excepciones
-8-
Fernando Berzal
// Bloque1
try {
// Bloque 2
} catch (ArithmeticException ae) {
// Bloque 3
} catch (Exception error) {
// Bloque 4
}
// Bloque 5
Sin excepciones:
125
1 2* 3 5
1 2* 4 5
Sin excepciones:
125
1 2* 3 5
1 2* 3 5
Excepciones
-9-
Fernando Berzal
La clusula finally
En ocasiones, nos interesa ejecutar un fragmento de cdigo
independientemente de si se produce o no una excepcin
(por ejemplo, cerrar un fichero que estemos manipulando).
// Bloque1
try {
// Bloque 2
} catch (ArithmeticException ae) {
// Bloque 3
} finally {
// Bloque 4
}
// Bloque 5
Sin excepciones:
1245
1 2* 3 4 5
1 2* 4
Excepciones
- 10 -
Fernando Berzal
Lanzamiento de excepciones
La sentencia throw
Se utiliza en Java para lanzar objetos de tipo Throwable
throw new Exception(Mensaje de error);
- 11 -
Fernando Berzal
Excepciones
- 12 -
Fernando Berzal
Ejemplo clsico
Excepciones
- 13 -
Fernando Berzal
public DivideByZeroException
extends ArithmeticException
{
public DivideByZeroException(String Message)
{
super(message);
}
}
Excepciones
- 14 -
Fernando Berzal
Registro
Fichero
Carpeta
/ Directorio
-1-
Fernando Berzal
Ficheros y streams
Desde el punto de vista de Java,
cada fichero no es ms que una secuencia o flujo de bytes [stream].
-2-
Fernando Berzal
La clase File
Acceso a informacin acerca de ficheros y directorios:
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class FileDemo
{
public void mostrarInfoFichero( String path )
throws IOException
{
File fichero = new File( path );
if ( fichero.exists() ) {
System.out.println("Nombre: "+fichero.getName());
System.out.println("- Ruta completa: "
+ fichero.getAbsolutePath() );
System.out.println("- Tamao: "
+ fichero.length() + " bytes");
System.out.println("- ltima modificacin: "
+ new Date(fichero.lastModified()) );
if (fichero.isFile()) {
System.out.println("- Fichero normal");
} else if (fichero.isDirectory()) {
System.out.println("- Directorio");
mostrarContenidoDirectorio(fichero);
}
} else {
throw new IOException
("El fichero '"+path+"' no existe");
}
}
public void mostrarContenidoDirectorio
(File directorio)
{
String ficheros[] = directorio.list();
for (int i=0; i<ficheros.length; i++)
System.out.println("\t"+ficheros[i]);
}
El sistema de E/S: Ficheros
-3-
Fernando Berzal
Fichero convencional
java FileDemo FileDemo.java
Nombre: FileDemo.java
- Ruta completa: F:\[fp]\ejemplos\FileDemo.java
- Tamao: 1496 bytes
- ltima modificacin: Thu Apr 28 16:31:23 CEST 2005
- Fichero normal
Directorio
java FileDemo f:\[fp]\ejemplos
Nombre: ejemplos
- Ruta completa: f:\[fp]\ejemplos
- Tamao: 0 bytes
- ltima modificacin: Thu Apr 28 16:31:05 CEST 2005
- Directorio
FileDemo.class
FileDemo.java
Fichero inexistente
java FileDemo xxx.java
Exception in thread "main" java.io.IOException:
El fichero 'xxx.java' no existe
at FileDemo.mostrarInfoFichero(FileDemo.java:40)
at FileDemo.main(FileDemo.java:59)
-4-
Fernando Berzal
Streams de entrada
Las clases derivadas de InputStream representan flujos de datos de
entrada que pueden provenir de distintas fuentes:
Clase
ByteArray
InputStream
StringBuffer
InputStream
File
InputStream
Piped
InputStream
Sequence
InputStream
Fuente
de datos
Parmetros
del constructor
Array de bytes
String
Cadena de caracteres
Fichero
Pipeline*
Piped
OutputStream
Otros
InputStreams
Secuencia de varios
InputStreams
siguientes clases:
Clase
Data
InputStream
Buffered
InputStream
LineNumber
InputStream
Pushback
InputStream
El sistema de E/S: Ficheros
Funcin
Lectura de datos primitivos en binario
(int, char). Vase DataOutputStream
Usa un buffer para evitar el acceso a
disco cada vez que se lee un dato
Mantiene el nmero de lnea actual,
al que se accede con getLineNumber()
Permite devolver el ltimo byte ledo
-5-
Fernando Berzal
Streams de salida
Las clases derivadas de OutputStream permiten decidir a dnde
mandar los datos de salida:
Clase
ByteArray
OutputStream
File
OutputStream
Piped
InputStream
Destino
de los datos
Parmetros
del constructor
Array de bytes
Fichero
Pipeline*
Piped
InputStream
Clase
Data
OutputStream
PrintStream
Buffered
OutputStream
Funcin
Salida de datos primitivos en binario.
Vase DataInputStream
Salida con formato
(p.ej. System.out)
Salida a travs de un buffer.
El mtodo flush() permite vaciarlo.
-6-
Fernando Berzal
Subclases de Reader
Clase
Fuente
Buffered
Reader
Reader
CharArray
Reader
char[]
FileReader
Fichero
InputStream
Reader
LineNumber
Reader
Piped
Reader
String
Reader
InputStream
Uso
Aade un buffer
del que leer los caracteres
Lectura de caracteres a partir
de un array de caracteres
Lectura de caracteres
de un fichero de texto
Convierte un InputStream
en un Reader
Reader
Pipeline*
PipedWriter
String
Lectura de caracteres
de una cadena
Subclases de Writer
Clase
Destino
Buffered
Writer
Reader
CharArray
Writer
char[]
FileWriter
Fichero
OutputStream
Writer
Piped
Writer
OutputStream
Uso
Aade un buffer
en el que escribir caracteres
Escritura de caracteres
en un array de caracteres
Escritura de caracteres
en un fichero de texto
Conecta un Writer
con un OutputStream
Pipeline*
PipedReader
PrintWriter
OutputStream
String
Writer
String
-7-
OutputStream
Escritura de caracteres
en una cadena
Fernando Berzal
Configuraciones tpicas
Leer datos desde el teclado con System.in
import java.io.*;
public class TestSystemIn
{
public static void main (String[] args)
throws IOException
{
InputStreamReader reader;
BufferedReader
input;
// Secuencia de bytes -> Secuencia de caracteres
reader = new InputStreamReader(System.in);
// Secuencia de caracteres -> Secuencia de lneas
input = new BufferedReader(reader);
// Lectura de una lnea de texto
System.out.println("Escriba algo...");
String cadena = input.readLine();
System.out.println("Ha escrito: "+cadena);
}
}
-8-
Fernando Berzal
Configuraciones tpicas
Mostrar el contenido de un fichero
Solucin 1: Byte a byte
import java.io.*;
public class TestReadByte
{
public static void main(String[] args)
throws IOException
{
FileInputStream
file;
BufferedInputStream buffered;
DataInputStream
in;
// Apertura del fichero (modo de lectura)
file = new FileInputStream(args[0]);
// con buffer
buffered = new BufferedInputStream(file);
// para leer datos en binario
in = new DataInputStream(buffered);
-9-
Fernando Berzal
Configuraciones tpicas
Mostrar el contenido de un fichero
Solucin 2: Lnea a lnea
import java.io.*;
public class TestReadLine
{
public static void main(String[] args)
throws IOException
{
FileReader
file;
BufferedReader in;
String
cadena;
// Apertura del fichero de texto (modo de lectura)
file = new FileReader(args[0]);
// con buffer para leer lnea a lnea
in = new BufferedReader(file);
- 10 -
Fernando Berzal
- 11 -
Fernando Berzal
Ficheros de texto
Ejemplos de uso de ficheros de acceso secuencial
Fernando
958 24 05 99
[email protected]
CCIA - Despacho 17
3 de diciembre de 1977
1
6.6
Juan Carlos
958 24 05 97
[email protected]
CCIA - Despacho 37
29 de enero de 1962
1
-6.6
- 12 -
Fernando Berzal
import java.io.*;
import java.util.Date;
import java.text.DateFormat;
public class ContactoWriter
{
private FileWriter
writer;
private BufferedWriter buffer;
private PrintWriter
output;
// Apertura del fichero de texto
public void abrir()
throws IOException
{
try {
writer = new FileWriter( "clientes.txt" );
buffer = new BufferedWriter(writer);
output = new PrintWriter(writer);
} catch (SecurityException securityException) {
System.err.println
("No tiene permiso para escribir en el fichero");
throw securityException;
} catch (FileNotFoundException fileException) {
System.err.println
("Error al crear el fichero" );
throw fileException;
}
}
// Cierre del fichero de texto
public void cerrar()
throws IOException
{
if ( output != null )
output.close();
}
El sistema de E/S: Ficheros
- 13 -
Fernando Berzal
- 14 -
Fernando Berzal
import java.io.IOException;
import java.util.Date;
public class LeerContactos
{
public static void main( String args[] )
throws IOException, java.text.ParseException
{
Contacto
contacto;
ContactoReader entrada;
// Lectura de datos
entrada = new ContactoReader();
entrada.abrir();
do {
contacto = entrada.leer();
System.out.println(contacto);
} while (contacto!=null);
entrada.cerrar();
}
}
- 15 -
Fernando Berzal
import java.io.*;
import java.util.Date;
import java.text.DateFormat;
- 16 -
Fernando Berzal
- 17 -
Fernando Berzal
Serializacin de objetos
Java facilita el almacenamiento y transmisin del estado de un objeto
mediante un mecanismo conocido con el nombre de serializacin.
La serializacin de un objeto consiste en generar una secuencia de
bytes lista para su almacenamiento o transmisin. Despus, mediante
la deserializacin, el estado original del objeto se puede reconstruir.
Para que un objeto sea serializable, ha de implementar la interfaz
java.io.Serializable (que lo nico que hace es marcar el objeto
como serializable, sin que tengamos que implementar ningn mtodo).
import java.io.Serializable;
import java.util.Date;
public class Contacto implements Serializable
{
private String nombre;
private String telefono;
private String email;
private String direccion;
private Date
nacimiento;
private int
grupo;
private double deuda;
- 18 -
Fernando Berzal
Serializacin
import java.io.*;
- 19 -
Fernando Berzal
Deserializacin
import java.io.*;
public class ContactoInput
{
private FileInputStream
file;
private ObjectInputStream input;
public void abrir()
throws IOException
{
file = new FileInputStream( "clientes.ser" );
input = new ObjectInputStream (file);
}
public void cerrar()
throws IOException
{
if (input!=null )
input.close();
}
- 20 -
Fernando Berzal
Uso
Escritura de datos
ContactoOutput salida;
salida = new ContactoOutput();
salida.abrir();
salida.escribir( contacto1 );
salida.escribir( contacto2 );
salida.cerrar();
Lectura de datos
Contacto
ContactoInput
contacto;
entrada;
- 21 -
Fernando Berzal
Campo
Nombre
Telfono
E-Mail
Direccin
Fecha de nacimiento
Grupo
Deuda
TOTAL
Contenido
32 caracteres
16 caracteres
32 caracteres
64 caracteres
32 caracteres
1 int
1 double
Tamao
64 bytes
32 bytes
64 bytes
128 bytes
64 bytes
4 bytes
8 bytes
364 bytes
- 22 -
Fernando Berzal
Registro
import java.io.*;
import java.text.DateFormat;
(
(
(
(
readString
readString
readString
readString
(file,
(file,
(file,
(file,
32)
16)
32)
64)
);
);
);
);
df = DateFormat.getDateInstance(DateFormat.LONG);
setNacimiento ( df.parse(readString(file,32)) );
setGrupo(file.readInt());
setDeuda(file.readDouble());
}
- 23 -
Fernando Berzal
// Escritura
public void write (RandomAccessFile file)
throws IOException
{
DateFormat df;
writeString
writeString
writeString
writeString
(file,
(file,
(file,
(file,
getNombre(),
getTelefono(),
getEmail(),
getDireccion(),
32);
16);
32);
64);
df = DateFormat.getDateInstance(DateFormat.LONG);
writeString (file, df.format(getNacimiento()), 32);
file.writeInt
( getGrupo() );
file.writeDouble ( getDeuda() );
}
- 24 -
Fernando Berzal
Fichero de contactos
import java.io.*;
// Escribir un registro
// en la posicin actual del cursor
public void escribir (Registro registro)
throws IOException
{
if (file!=null)
registro.write(file);
}
- 25 -
Fernando Berzal
- 26 -
Fernando Berzal
Ejemplos de uso
Registro contacto;
Contactos agenda;
agenda = new Contactos();
- 27 -
Fernando Berzal
AWT y Swing
Los componentes que se utilizan en Java para crear interfaces grficas
de usuario se agrupan en dos paquetes (y sus correspondientes
subpaquetes):
java.awt (Abstract Window Toolkit)
-1-
Fernando Berzal
Frames
Los frames (marcos) son ventanas en las que se pueden colocar otros
controles de los que se utilizan para crear las interfaces grficas de
usuario (botones, etiquetas, cajas de texto, listas desplegables, mens,
etctera).
AWT
SWING
java.awt.Frame
javax.swing.JFrame
import javax.swing.*;
class PrimerFrame extends JFrame
{
public PrimerFrame()
{
setTitle("Mi primer programa grfico");
setSize(400,100);
}
}
public class FrameTest
{
public static void main(String[] args)
{
JFrame frame = new PrimerFrame();
frame.setVisible(true);
}
}
-2-
Fernando Berzal
Eventos
El programa anterior tiene un problema:
Cuando se cierra la ventana,
dejamos de verla pero el programa no finaliza su ejecucin.
Interfaces de usuario
-3-
Fernando Berzal
import javax.swing.*;
import java.awt.event.*;
class PrimerFrame extends JFrame
{
public PrimerFrame()
{
setTitle("Mi primer programa grfico");
setSize(400,100);
addWindowListener(new PrimerWindowListener());
}
}
class PrimerWindowListener extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
Interfaces de usuario
-4-
Fernando Berzal
Componentes Swing
-5-
Fernando Berzal
Componentes estndar
Los frames (como JFrame) son contenedores, por lo que incluyen un
panel de contenido (content pane) al cual se le pueden aadir
componentes grficos (etiquetas, botones, cajas de texto, etc.) y otros
contenedores (como paneles JPanel).
Las interfaces grficas de usuario se construyen con componentes,
cada uno de los cuales est preparado para responder a distintos tipos
de eventos. Algunos de los componentes incluidos en Swing son:
JLabel (etiqueta para mostrar texto)
JTextBox & JTextArea (cajas de texto para la entrada de datos)
JButton (botn)
JCheckBox (caja de comprobacin, para elegir opciones)
JRadioButton (para elegir opciones mutuamente excluyentes)
JList (lista de opciones)
JComboBox (lista desplegable de opciones)
JScrollBar (barra de scroll)
JTree (rbol)
JTable (tabla)
-6-
Fernando Berzal
NORTH
WEST
CENTER
EAST
SOUTH
Usualmente,
al JFrame se le aaden paneles usando BorderLayout
y luego se rellenan los paneles JPanel usando FlowLayout
Interfaces de usuario
-7-
Fernando Berzal
Dibujo de grficos 2D
Los paneles (como JFrame) son contenedores que pueden contener
otros componentes y, adems, tienen una superficie sobre la que se
puede dibujar (canvas o lienzo).
Para dibujar en un panel JPanel, hay que redefinir el mtodo
paintComponent() de la clase JComponent, que se invoca
automticamente cada vez que hay que refrescar la visualizacin del
componente en la pantalla (p.ej. cuando se mueve o redimensiona una
ventana).
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class JPanelFrame extends JFrame
{
public JPanelFrame()
{
this.setTitle("Mi primer programa grfico");
this.setSize(400,150);
this.addWindowListener(new MainWindowListener());
this.getContentPane().add(new MiPanel());
}
}
class MainWindowListener extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
public class JPanelTest
{
public static void main(String[] args)
{
JFrame frame = new JPanelFrame();
frame.setVisible(true);
}
}
Interfaces de usuario
-8-
Fernando Berzal
-9-
Fernando Berzal
Visualizacin de imgenes
El mtodo Graphics.drawImage()
nos permite dibujar imgenes en formato GIF, PNF o JPEG.
Las imgenes podemos leerlas con el mtodo getImage()
de la clase java.awt.Toolkit
- 10 -
Fernando Berzal
Interfaces de usuario
- 11 -
Fernando Berzal
- 12 -
Fernando Berzal
- 13 -
Fernando Berzal
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class EventFrame extends JFrame
{
public EventFrame()
{
setTitle("Demostracin del uso de eventos...");
setSize(600,440);
addWindowListener(new MainWindowListener());
Container contenido = getContentPane();
contenido.add(new ButtonPanel());
}
}
class MainWindowListener extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
public class EventTest
{
public static void main(String[] args)
{
JFrame frame = new EventFrame();
frame.setVisible(true);
}
}
Interfaces de usuario
- 14 -
Fernando Berzal
Interfaces de usuario
- 15 -
Fernando Berzal
- 16 -
Fernando Berzal
- 17 -
Fernando Berzal
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class ListFrame extends JFrame
implements ActionListener
{
JPanel
tools;
JComboBox font;
JComboBox fontsize;
JCheckBox bold;
JCheckBox italic;
FontPanel panel;
public ListFrame()
{
setTitle("Demostracin del uso de eventos...");
setSize(600,150);
addWindowListener(new MainWindowListener());
// Barra de herramientas
tools = new JPanel();
tools.add(new JLabel("Fuente "));
font = new JComboBox();
font.setEditable(false);
font.addItem("Serif");
font.addItem("SansSerif");
font.addItem("Monospaced");
font.addActionListener(this);
tools.add(font);
Interfaces de usuario
- 18 -
Fernando Berzal
- 19 -
Fernando Berzal
Interfaces de usuario
- 20 -
Fernando Berzal
Applets
Los applets son aplicaciones Java que se ejecutan dentro de un
navegador web (generalmente, como parte de una pgina web).
Ejemplo
En vez de partir de JFrame, usamos JApplet:
import java.awt.*;
import javax.swing.*;
class DemoPanel extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setFont(new Font("SansSerif",Font.BOLD,36));
g.drawString("Hola a todos!", 50, 120);
}
}
public class DemoJApplet extends JApplet
{
public void init()
{
Container contentPane = getContentPane();
contentPane.add(new DemoPanel());
}
}
Interfaces de usuario
- 21 -
Fernando Berzal
<HTML>
<HEAD>
<TITLE>Applet de ejemplo</TITLE>
<META NAME="Author" CONTENT="Fernando Berzal">
</HEAD>
<BODY>
<H1>Applet Java</H1>
<APPLET CODE="DemoJApplet.class" WIDTH=300 HEIGHT=300>
</APPLET>
</BODY>
</HTML>
Interfaces de usuario
- 22 -
Fernando Berzal
- 23 -
Fernando Berzal
El resultado
Interfaces de usuario
- 24 -
Fernando Berzal
Interfaces de usuario
- 25 -
Fernando Berzal
Concurrencia
Procesos y hebras
Concurrencia
Programacin concurrente
Por qu usar hebras y procesos?
Ejecucin de procesos
Ejecucin de hebras
Hebras vs. Procesos
Creacin y ejecucin de hebras
La prioridad de las hebras
Finalizacin de la ejecucin de una hebra
Uso de recursos compartidos
Mecanismos de exclusin mutua
synchronized
Ms informacin
Procesos y hebras
Hoy en da, cualquier usuario espera poder hacer varias cosas a la
vez y no verse forzado a ejecutar los programas secuencialmente.
Los sistemas operativos multitarea, como Windows o UNIX,
se encargan de que varios programas se puedan ejecutar a la vez
(concurrentemente) incluso cuando slo se dispone de una nica
CPU.
Concurrencia
Dos tareas se dice que son concurrentes si transcurren durante el
mismo intervalo de tiempo.
Se entiende por programacin concurrente el conjunto de
tcnicas y notaciones que sirven para expresar el paralelismo
potencial en los programas, as como resolver problemas de
comunicacin y sincronizacin.
Cuando se trabaja en entornos distribuidos o con mquinas con
mltiples procesadores, se suele hablar de programacin
distribuida o paralela, respectivamente.
NOTA:
Concurrencia
-1-
Fernando Berzal
-2-
Fernando Berzal
Programacin concurrente
Independientemente de si utilizamos procesos o hebras, el
desarrollo de aplicaciones concurrentes involucra el uso de
tcnicas especficas y la superacin de dificultades que no se
presentan en la implementacin de programas secuenciales.
A la hora de crear aplicaciones concurrentes, distribuidas o
paralelas, deberemos tener en mente ciertas consideraciones:
El diseo de aplicaciones concurrentes es ms complejo que
el de aplicaciones secuenciales, ya que hemos de
descomponer el programa en un conjunto de tareas con el
fin de aprovechar el paralelismo que pueda existir. Si no
existe ese paralelismo potencial, no tiene sentido que
intentemos descomponer nuestra aplicacin en tareas
independientes.
La implementacin de aplicaciones concurrentes es
tambin ms compleja que la de aplicaciones secuenciales
convencionales porque hemos de garantizar la coordinacin
de las distintas hebras o procesos.
La depuracin de las aplicaciones concurrentes es
extremadamente difcil, dado que la ejecucin de los
distintos procesos/hebras se entrelaza conforme el sistema
operativo les va asignando la CPU (algo que no podemos
prever por completo).
En tiempo de ejecucin, adems, cada hebra o proceso
supone una carga adicional para el sistema, por lo hay que
tener en cuenta la eficiencia de la implementacin
resultante. Deberemos ser cuidadosos para asegurar que se
aprovecha el paralelismo para mejorar el rendimiento de la
aplicacin. Este rendimiento puede medirse en funcin del
tiempo de respuesta del sistema o de la cantidad de trabajo
que realiza por unidad de tiempo [throughput].
Concurrencia
-3-
Fernando Berzal
1. De cara al usuario
Hebras y procesos permiten la creacin de interfaces que
respondan mejor a las rdenes del usuario.
Concurrencia
-4-
Fernando Berzal
Paralelismo real
Su aprovechamiento requiere el uso de hebras y procesos
Un sistema multiprocesador dispone de varias CPUs.
Un cluster de ordenadores est compuesto por un conjunto
de ordenadores conectados entre s, a los que se accede
como si se tratase de un nico ordenador.
Algunas versiones del Pentium 4 de Intel incorporan
Simultaneous MultiThreading (SMT), que Intel denomina
comercialmente Hyper-Threading, con lo que un nico
microprocesador puede funcionar como si tuvisemos un
multiprocesador.
Concurrencia
-5-
Fernando Berzal
IMPORTANTE
El objetivo principal del uso de paralelismo es
mejorar el rendimiento del sistema.
El uso de paralelismo (hebras o procesos) permite mejorar el
tiempo de respuesta de una aplicacin
o la carga de trabajo que puede soportar el sistema.
No obstante, un nmero excesivo de hebras o procesos puede
llegar a degradar el rendimiento del sistema (debido al tiempo de
CPU requerido por los cambios de contexto): hay que analizar
hasta qu punto compensa utilizar hebras y procesos.
Concurrencia
-6-
Fernando Berzal
Ejecucin de procesos
La mquina virtual Java nos asla de los detalles particulares de la
mquina en la que se ejecutan nuestras aplicaciones. No obstante,
La clase System nos permite acceder a recursos del sistema
de forma portable (aunque de una forma muy rudimentaria):
o Usar los dispositivos de E/S estndar
System.in & System.out
o Acceder a algunas variables de entorno
System.getProperties()
-7-
Fernando Berzal
-8-
Fernando Berzal
Ejecucin de hebras
En realidad, todas las aplicaciones escritas en Java son
aplicaciones multihebra (recuerde el recolector de basura).
Concurrencia
-9-
Fernando Berzal
- 10 -
Fernando Berzal
- 11 -
Fernando Berzal
- 12 -
Fernando Berzal
Concurrencia
- 13 -
Fernando Berzal
Concurrencia
- 14 -
Fernando Berzal
Proceso 1
Ingreso en una cuenta
P1.A Obtener saldo actual
Proceso 2
Transferencia a otra cuenta
P2.A Obtener saldo actual
++
-P1.B Guardar saldo modificado P2.B Guardar saldo modificado
Si el saldo
inicial
de
lacuenta
!
"es#$de
%1000
&
' ( "
de 500
*)
de la cuenta sea de 750
Ahora bien, en funcin de cmo se ordenen las operaciones de las
dos tareas independientes (el ingreso y la transferencia), el
resultado final puede ser muy distinto:
+
+
+
+
P1.A+(lee
, 1000
-/.) P2.A (lee
+ 1000 P1.B (escribe
B (escribe 250 , por lo que nos quedan 250 .
1500
P2.A
P1.A (lee +
1000 P2.B (almacena
+(lee
, -11000
0)
250
B (almacena 1500 , por lo que tenemos 1500
al final ;-)
Concurrencia
- 15 -
Fernando Berzal
- 16 -
Fernando Berzal
synchronized
Java permite definir secciones crticas (fragmentos de cdigo que
slo puede estar ejecutando una hebra) mediante la palabra
reservada synchronized:
synchronized (objeto) {
// A este bloque de cdigo
// slo puede acceder una hebra
// en cada momento
}
- 17 -
Fernando Berzal
- 18 -
Fernando Berzal
- 19 -
Fernando Berzal
- 20 -
Fernando Berzal
Concurrencia
- 21 -
Fernando Berzal
SwingUtilities.invokeLater()
SWING
== EnventQueue.invokeLater()
AWT
- 22 -
Fernando Berzal
javax.swing.Timer
Cuando lo que queremos es realizar una operacin de forma
peridica, no es necesario que creemos explcitamente una hebra.
Podemos utilizar la clase javax.swing.Timer, que asociaremos
a un ActionListener encargado de realizar la operacin:
Timer timer;
public Animator (int fps)
{
timer = new Timer(1000/fps, this);
}
public void startAnimation()
{
timer.start();
}
public void stopAnimation()
{
timer.stop();
}
public void actionPerformed (ActionEvent e)
{
// Mostrar el siguiente frame
repaint();
}
}
Concurrencia
- 23 -
Fernando Berzal
Ms informacin
The JavaTM Tutorial
Threads: Doing Two or More Tasks At Once
http://java.sun.com/docs/books/tutorial/essential/threads/
Bruce Eckel:
Thinking in Java [3rd edition]. Chapter 13: Concurrency
http://www.mindview.net/Books/TIJ/
Concurrencia
- 24 -
Fernando Berzal
Distribucin
Mecanismos de comunicacin entre procesos
Redes de ordenadores: Internet
Sockets
Sockets TCP
Creacin de un cliente TCP
Creacin de un servidor TCP
Sockets UDP
La clase URL
RMI (Remote Method Invocation)
Extensiones: Jini
Alternativas: CORBA y .NET Remoting
Comunicaci
omunicacin
n entre procesos
El desarrollo de aplicaciones concurrentes involucra el uso de
mecanismos de comunicacin. Estos mecanismos, conocidos
genricamente como mecanismos de comunicacin entre
procesos (IPC) permiten que los distintos procesos que
conforman una aplicacin "hablen entre s".
Los procesos en los que se descompone una aplicacin pueden
ejecutarse en un mismo ordenador (siempre que tengamos un
sistema operativo multitarea) o en mquinas diferentes. En este
ltimo caso, la comunicacin entre procesos involucra el uso de
redes de ordenadores.
-1-
Fernando Berzal
-2-
Fernando Berzal
-3-
Fernando Berzal
Origen de Internet
Proyecto del US Defense Advanced Research Project Agency
(DARPA) para el desarrollo de su red ARPANET.
Objetivo
Tolerancia a errores en los elementos de la subred.
Distribucin
-4-
Fernando Berzal
Evolucin de ARPANET
(a)
(b)
(c)
(d)
(e)
Diciembre 1969
Julio 1970
Marzo 1971
Abril 1972
Septiembre 1972
Distribucin
-5-
Fernando Berzal
-6-
Fernando Berzal
Protocolo
FTP
Telnet
SMTP
Finger
HTTP
POP3
NNTP
Uso
Transferencia de ficheros
Acceso remoto
Envo de correo electrnico
Informacin acerca de usuarios
World Wide Web
Lectura de correo electrnico
Grupos de noticias USENET
ACLARACIN:
El telfono proporciona un servicio orientado a conexin,
mientras que el correo ofrece servicios no orientados a conexin.
Distribucin
-7-
Fernando Berzal
Distribucin
-8-
Fernando Berzal
Sockets
La biblioteca estndar de clases de Java nos proporciona todo lo
que necesitamos para utilizar sockets en nuestras aplicaciones en
el paquete java.net, por lo que tendremos que aadir la
siguiente lnea al comienzo de nuestros ficheros de cdigo:
import java.net.*;
Distribucin
-9-
Fernando Berzal
Sockets TCP
Las clases Socket y ServerSocket permiten utiliza el
protocolo TCP en Java:
Un Socket se utiliza para transmitir y recibir datos.
Un ServerSocket nunca se utiliza para transmitir datos. Su
nico cometido es, en el servidor, esperar a que un cliente
quiera establecer una conexin con el servidor.
Funcionamiento
El cliente crea un Socket para solicitar una conexin con el
servidor al que desea conectarse.
Distribucin
- 10 -
Fernando Berzal
Transmisin de datos
Cuando la conexin queda establecida, los dos sockets conectados
pueden comunicarse entre s mediante operaciones de lectura y
escritura idnticas a las cualquier otro stream en Java (read y
write).
La entrada y la salida de un socket se representan en Java mediante
las clases InputStream y OutputStream, respectivamente (las
mismas que se utilizan para trabajar con ficheros).
</BODY>
</HTML>
Distribucin
- 11 -
Fernando Berzal
Socket
PrintWriter
InputStreamReader
BufferedReader
String
socket;
out;
reader;
in;
line;
// Conexin TCP
try {
socket = new Socket("elvex.ugr.es", 80);
} catch (UnknownHostException e) {
System.err.println("Host desconocido";
}
// Streams de E/S
out = new PrintWriter(socket.getOutputStream());
reader = new InputStreamReader(socket.getInputStream());
in = new BufferedReader(reader);
// Solicitud HTTP
out.println("GET /");
out.println("");
out.flush();
// Respuesta HTTP
line = in.readLine();
while (line!=null) {
System.out.println(line);
line = in.readLine();
}
// Cierre de la conexin
out.close();
in.close();
socket.close();
Distribucin
- 12 -
Fernando Berzal
- 13 -
Fernando Berzal
= new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
out.println(args[0]);
out.flush();
String eco = in.readLine();
System.out.println(eco);
in.close();
out.close();
socket.close();
Distribucin
- 14 -
Fernando Berzal
// OJO!
clientSocket = serverSocket.accept();
out = new PrintWriter
(clientSocket.getOutputStream());
out.println(new java.util.Date());
out.flush();
out.close();
clientSocket.close();
}
} catch (IOException error) {
serverSocket.close();
}
}
}
- 15 -
Fernando Berzal
IMPORTANTE
Los servidores, usualmente, han de atender mltiples peticiones
provenientes de distintos clientes, por lo que siempre debemos
implementarlos como aplicaciones multihebra.
Sockets UDP
El tipo ms sencillo de sockets, puesto que no es necesario
establecer ninguna conexin para enviar y recibir datos.
En Java, un objeto de tipo DatagramSocket representa un socket
UDP y puede enviar o recibir datos directamente de otro socket UDP.
Los datos se envan y reciben en paquetes autocontenidos
denominados datagramas (igual que el correo convencional).
Los datagramas se representan en Java mediante la clase
DatagramPacket, que consiste simplemente en un array de bytes
dirigido a una direccin IP y a un puerto UDP concretos.
La clase MulticastSocket se puede emplear para enviar un
mismo datagrama a muchos destinatarios simultneamente.
Ejemplos disponibles en:
http://java.sun.com/docs/books/tutorial/networking/datagrams/
Distribucin
- 16 -
Fernando Berzal
La clase URL
Cuando alguien accede a un servidor web, generalmente lo hace
para obtener un documento, para lo que usa una URL (que en java
se representa mediante la clase java.net.URL).
El siguiente fragmento de cdigo muestra cmo podemos crear
una URL y acceder a un recurso en Internet a partir de la URL:
URL url = new URL("http://elvex.ugr.es/");
// Datos de la URL
System.out.println("Protocolo = " + url.getProtocol());
System.out.println("Host = " + url.getHost());
System.out.println("Fichero = " + url.getFile());
System.out.println("Puerto = " + url.getPort());
// Acceso al contenido asociado a la URL
InputStreamReader reader = new InputStreamReader(
url.openStream());
BufferedReader in = new BufferedReader(reader);
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
- 17 -
Fernando Berzal
RMI
[Remote Method Invocation]
Cuando utilizamos sockets, hemos de preocuparnos de cmo se
transmiten fsicamente los datos entre los extremos de una
conexin (a nivel de bytes, ya que usamos los streams estndar)
RMI permite olvidarnos de los detalles de la transmisin de datos
y centrarnos en el diseo de la lgica de nuestra aplicacin,
puesto que nos permite acceder a un objeto remoto como si de un
objeto local se tratase.
Internamente, RMI utiliza serializacin de objetos para
encargarse de la transmisin de datos a travs de la red (de
cara al programador, el acceso al objeto remoto es como una
llamada a un mtodo local).
Para localizar un objeto al que se desee acceder, RMI
proporciona un registro que se usa a modo de pginas
amarillas.
Como respuesta de las llamadas a mtodos de un objeto
remoto, RMI devuelve objetos y se encarga de obtener los
bytecodes que sean necesarios (cuando se obtiene una
referencia a un objeto cuyos bytecodes no estn disponibles
en la mquina virtual del receptor).
Distribucin
- 18 -
Fernando Berzal
En RMI:
El servidor crea algunos objetos y los hace accesibles a
travs del registro. A continuacin, se queda esperando a
recibir peticiones.
El cliente obtiene una referencia a un objeto remoto (que
est alojado en el servidor) y la utiliza para invocar mtodos
del objeto de forma remota.
Objetos e interfaces remotos
Para que un objeto sea accesible de forma remota, ha de
implementar un interfaz remoto (derivado de java.rmi.Remote)
Cuando una llamada a un mtodo realizada desde el cliente
devuelve un objeto remoto, en vez de obtener una copia del
objeto, se obtiene una referencia al objeto remoto (un stub que
hace de proxy y se comporta igual que el objeto remoto).
Desarrollo de aplicaciones distribuidas con RMI
1. Crear los distintos componentes de la aplicacin, teniendo
en cuenta que, para que a un objeto se pueda acceder de
forma remota con RMI, es necesario que implemente una
interfaz derivada de java.rmi.Remote.
2. Compilar con javac y generar los stubs con rmic.
3. Hacer accesibles los objetos remotos (usualmente, dejando
los bytecodes correspondientes a los interfaces remotos y a
los stubs en algn servidor web).
4. Arrancar la aplicacin, que incluye el registro RMI, el
servidor y el cliente.
Distribucin
- 19 -
Fernando Berzal
El servidor RMI
1. Interfaz remota
Para los objetos a los que se acceder de forma remota:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Compute extends Remote
{
Object executeTask(Task t)
throws RemoteException;
}
2. Objetos serializables
Aqullos que se transmitirn a travs de la red:
import java.io.Serializable;
public interface Task extends Serializable {
Object execute();
}
Distribucin
- 20 -
Fernando Berzal
// Objeto remoto
// Interfaz remota
- 21 -
Fernando Berzal
El cliente RMI
import java.rmi.*;
import java.math.*;
public class ComputePi {
public static void main(String args[])
{
System.setSecurityManager
(new RMISecurityManager());
String name = "//" + args[0] + "/Compute";
Compute comp = (Compute) Naming.lookup(name);
NOTA
La caracterstica ms destacable de RMI es que el servidor no
tiene por qu disponer de antemano de los bytecodes asociados a
la tarea que ha de ejecutar.
Cuando recibe la peticin del cliente, carga los bytecodes en su
mquina virtual, ejecuta la tarea y devuelve el resultado.
Distribucin
- 22 -
Fernando Berzal
- 23 -
Fernando Berzal
Ms informacin
Essentials of the Java Programming Language, Part 2
Sockets Communications
http://java.sun.com/developer/onlineTraining/Programming
/BasicJava2/socket.html
The JavaTM Tutorial
Custom Networking: All about sockets
http://java.sun.com/docs/books/tutorial/networking/
The JavaTM Tutorial
RMI
http://java.sun.com/docs/books/tutorial/rmi/
Distribucin
- 24 -
Fernando Berzal
____________________________________________________
EJERCICIO 1 (2 puntos)
Defina adecuadamente las clases en Java que se derivan del siguiente diagrama de clases UML
(declare las variables de instancia necesarias para representar los objetos de las distintas clases
que aparecen en el diagrama).
EJERCICIO 2 (3 puntos)
Escriba un mtodo eliminarRepetidos() para la clase Vector que elimine los datos que
aparecen repetidos en el vector. Esto es, dado el vector {1,3,2,2,1,3}, el vector debe
quedarse en {1,3,2} tras la llamada al mtodo eliminarRepetidos().
EJERCICIO 3 (2 puntos)
Disee e implemente un mtodo que ordene los datos de mayor a menor valor absoluto. Por
ejemplo, el vector {0,3,-4,2,-1} quedar ordenado como sigue: {-4,3,2,-1,0}.
EJERCICIO 4 (3 puntos)
Se tiene el siguiente mtodo recursivo para la clase Vector:
void in (int j, int k)
{
double aux;
if (j<k) {
in (j+1, k-1);
aux = datos[j];
datos[j] = datos[k];
datos[k] = aux;
}
}
a) Dado un vector v cualquiera y dos nmeros enteros (a, b), qu funcin realiza la
llamada al mtodo recursivo v.in(a,b)? Ejecute paso a paso la llamada al mtodo
vector.in(2,6) para el vector {1,3,5,7,9,11,13,15}.
b) Implemente un mtodo equivalente sin utilizar recursividad.
____________________________________________________
PRIMERA PARTE
Consideremos que una imagen est formada por una matriz de nmeros enteros en la que cada
elemento contiene el nivel de gris de un pxel. Este valor puede ir de 0 (negro) a 255 (blanco).
Dada la clase Imagen declarada de la siguiente forma
public class Imagen
{
private int pixels[][];
}
EJERCICIO 1 (3 puntos)
Implemente un mtodo histograma() para la clase Imagen que nos devuelva un vector de
256 elementos en el que su elemento i-simo indica el nmero de pxeles que aparecen en la
imagen con el nivel de gris i.
EJERCICIO 2 (3 puntos)
Disee e implemente un mtodo imagenReducida() que, dada una imagen de tamao NN,
devuelva una nueva imagen de tamao N/2N/2. Cada pxel de la imagen reducida se obtiene
haciendo la media de 4 pxeles adyacentes en la imagen original.
EJERCICIO 3 (4 puntos)
Se tiene el siguiente mtodo recursivo para la clase Imagen:
public void ref (int pos)
{
int aux[];
int N = pixels.length;
if (2*pos<N) {
aux = pixels[N-pos-1];
pixels[N-pos-1] = pixels[pos];
pixels[pos] = aux;
ref(pos+1);
}
}
____________________________________________________
SEGUNDA PARTE
EJERCICIO 1
(2 puntos)
EJERCICIO 2
Lado B
4
Lado C
5
rea
6
Justificacin
Tringulo rectngulo tpico
(4 puntos)
Declare e implemente adecuadamente las clases en Java que se derivan del siguiente
diagrama de clases UML e implemente el constructor de la clase PuertaTemporizada:
(4 puntos)
____________________________________________________
EJERCICIO 1
(1.5 puntos)
(2.5 puntos)
Declare adecuadamente las clases en Java que se derivan del siguiente diagrama de
clases UML:
EJERCICIO 3
(3 puntos)
Disee e implemente un programa en Java capaz de leer una serie de datos almacenada
en un fichero de texto y mostrar los dos valores ms altos incluidos en el fichero. Por
ejemplo, dado un fichero con el conjunto de datos (1, 2, 4, 8, 1, 3, 6, 9, 0,
7), el programa debe indicar que los dos valores ms altos son el 9 y el 8.
NOTA: Cada lnea del fichero de texto contiene un nico valor.
EJERCICIO 4
(3 puntos)
Implemente un servidor TCP que nos permita acceder de forma remota a los datos
medidos por un Sensor. El servidor recibir peticiones a travs del puerto 2206.
El servidor deber atender cada peticin en una hebra independiente, de forma que
varios clientes puedan consultar simultneamente los datos medidos por el sensor.
Otros miembros de nuestro equipo de trabajo ya se han encargado de disear e
implementar el protocolo de comunicacin necesario, por lo que nosotros slo tenemos
que delegar en el mtodo atenderCliente cada vez que alguien se conecte a nuestro
servidor:
public class ProtocoloSensor
{
public void atenderCliente (InputStream entrada, OutputStream salida)
donde entrada corresponde al stream mediante el que el servidor recibe datos y salida
representa el stream utilizado para enviar datos desde el servidor hasta el cliente.
EJERCICIO 1
(1.5 puntos)
Entradas
Salida
Comentarios
Hora de inicio
Hora de finalizacin
Duracin de la llamada
09:55:04
09:55:55
00:00:51
Caso base
10:37:34
10:48:24
00:10:50
Cambio de minuto
19:15:32
20:32:40
01:17:08
Cambio de hora
23:55:30 22/6/05
00:10:30 23/6/05
00:10:00
Cambio de da
00:00:00
00:00:00
00:00:00
Llamada nula
10:00:00
09:00:00
Error
25:64:98
15:30:45
Error
15:20:45
25:64:98
Error
12:54:76
12:76:43
Error
Entradas incorrectas
EJERCICIO 2
(2.5 puntos)
Declare adecuadamente las clases en Java que se derivan del siguiente diagrama de clases
UML:
EJERCICIO 3
(3 puntos)
Disee e implemente un programa en Java capaz de leer una serie de datos almacenada en
un fichero de texto y mostrar los dos valores ms altos incluidos en el fichero. Por ejemplo,
dado un fichero con el conjunto de datos (1, 2, 4, 8, 1, 3, 6, 9, 0, 7), el programa
debe indicar que los dos valores ms altos son el 9 y el 8.
NOTA: Cada lnea del fichero de texto contiene un nico valor.
Solucin A: Implementacin modular
import java.io.*;
// Programa principal
public class DosMayoresModular
{
public static void main (String[] args)
throws IOException
{
Serie serie;
// Serie de datos
int
mayores[]; // Valores ms altos
if (args.length<1) {
System.err.println("USO:");
System.err.println();
System.err.println(" java DosMayores <fichero>");
System.err.println();
System.err.println("donde <fichero> es el nombre del fichero
+ que contiene la serie de datos");
System.exit(-1);
}
serie = new Serie(args[0]);
mayores = serie.mayores();
if (mayores!=null) {
if (mayores.length==2) {
System.out.println("Los valores ms altos del fichero son "
+ mayores[0] + " y " + mayores[1]);
} else {
System.out.println("El fichero slo contiene el valor "
+ mayores[0]);
}
} else {
System.out.println("El fichero no contiene valores numricos");
}
}
}
= new FileReader(fichero);
= new BufferedReader(file);
total = 0;
max1 = Integer.MIN_VALUE;
max2 = Integer.MIN_VALUE;
line = lector.readLine();
while (line!=null) {
try {
valor = Integer.parseInt(line);
total++;
if (valor>max1) {
max2 = max1;
max1 = valor;
// El antiguo mximo
// pasa a ser el segundo mayor valor
} else if (valor>max2) {
max2 = valor;
}
} catch (Exception error) {
// Pasar a la siguiente lnea (nmero incorrecto)
}
line = lector.readLine();
}
if (total>2) {
return new int[] { max1, max2 };
} else if (total==1) {
return new int[] { max1 };
} else {
return null;
}
}
}
} else if (valor>max2) {
max2 = valor;
}
} catch (Exception error) {
// Pasar a la siguiente lnea
}
line = lector.readLine();
}
if (total>2) {
System.out.println("Los valores ms altos del fichero son "
+max1+" y "+max2);
} else if (total==1) {
System.out.println("El fichero slo contiene el valor "+max1);
} else {
System.out.println("El fichero no contiene valores numricos");
}
}
}
(3 puntos)
Implemente un servidor TCP que nos permita acceder de forma remota a los datos medidos
por un Sensor. El servidor recibir peticiones a travs del puerto 2206.
El servidor deber atender cada peticin en una hebra independiente, de forma que varios
clientes puedan consultar simultneamente los datos medidos por el sensor.
Otros miembros de nuestro equipo de trabajo ya se han encargado de disear e implementar
el protocolo de comunicacin necesario, por lo que nosotros slo tenemos que delegar en el
mtodo atenderCliente cada vez que alguien se conecte a nuestro servidor:
public class ProtocoloSensor
{
public void atenderCliente (InputStream entrada, OutputStream salida)
donde entrada corresponde al stream mediante el que el servidor recibe datos y salida
representa el stream utilizado para enviar datos desde el servidor hasta el cliente.
cliente = servidor.accept();
hebra = new HebraServidor(cliente);
hebra.start();
}
}
}
class HebraServidor extends Thread
{
Socket socket;
public HebraServidor (Socket socket)
{
this.socket = socket;
}
public void run()
{
ProtocoloSensor protocolo = new ProtocoloSensor();
try {
protocolo.atenderCliente ( socket.getInputStream(),
socket.getOutputStream());
} catch (IOException error) {
}
}
}
____________________________________________________
EJERCICIO 1 (3 puntos)
Dada una clase Vector declarada de la siguiente forma
public class Vector
{
private double datos[];
}
Vector inicial
Llamada
{1, 2, 3, 4, 5}
rec(0)
Resultado
Justificacin
____________________________________________________
EJERCICIO 3
(2 puntos)
Declare e implemente adecuadamente las clases en Java que se derivan del siguiente
diagrama de clases UML e implemente el mtodo dibujar() para las clases Ventana y
Panel.
NOTA: Al dibujar una ventana, hay que dibujar su icono y el panel que contiene todos
los componentes grficos incluidos en la ventana. Al dibujar el panel, hay que ir
dibujando uno a uno todos los componentes que contiene.
EJERCICIO 4
(3 puntos)
____________________________________________________
EJERCICIO 1 (3 puntos)
Defina adecuadamente las clases en Java que se derivan del siguiente diagrama de clases UML.
Declare todas las variables de instancia necesarias para representar los objetos de las distintas
clases que aparecen en el diagrama y declare (sin implementarlos) todos los mtodos que
considere oportunos.
EJERCICIO 2 (4 puntos)
Escriba un mtodo encuentra() para la clase Matriz que, dado un vector de nmeros enteros
que recibe como parmetro, nos indique la posicin dentro de la matriz donde se encuentra el
vector. El vector puede estar oculto dentro de la matriz igual que una palabra en una sopa de
letras: puede aparecer horizontal, vertical o diagonalmente (al derecho y tambin al revs).
EJERCICIO 3 (3 puntos)
Dado el siguiente mtodo recursivo para la clase Matriz, interprete cul es la funcin de la
llamada al mtodo matriz.f(a,b) siendo a<=b e implemente un mtodo equivalente sin
utilizar recursividad. Se le ocurre alguna aplicacin de la llamada matriz.f(1,9)?
public boolean f (int a, int b)
{
if (a==b)
return g(a);
else
return g(a) && f(a+1,b);
}
private boolean g (int x)
{
int i,j;
for (i=0; i<datos.length; i++)
for (j=0; j<datos[i].length; j++)
if (datos[i][j] == x)
return true;
return false;
}
EJERCICIO 1
Defina adecuadamente las clases en Java que se derivan del siguiente diagrama de clases
UML. Declare todas las variables de instancia necesarias para representar los objetos de las
distintas clases que aparecen en el diagrama y declare (sin implementarlos) todos los
mtodos que considere oportunos.
class JDBCConnectionPool
{
public Connection getConnection ()
{}
public void returnConnection (Connection connection)
{ }
}
class JDBCDatabase
{
public Connection getConnection ()
{}
public void closeConnection (Connection connection)
{}
}
class DatasetMetadata
{
private String id;
private String type;
private Dataset datasets[];
public String getAttribute(String id)
{}
}
Variantes y mejoras
1. Eliminacin de algunas iteraciones innecesarias:
encuentra
for ... && (pos[0]==-1) ...
encuentraPos
for ... && !encontrado ...
encuentraDir
for ... && ok ...
encontrado = true;
for (k=0; k<vector.length; k++)
if ( (x+k>=datos.length) || (datos[x+k][y]!=vector[k]) )
encontrado = false;
if (!encontrado) {
encontrado = true;
for (k=0; k<vector.length; k++)
if ( (x-k<0) || (datos[x-k][y]!=vector[k]) )
encontrado = false;
}
if (!encontrado) {
encontrado = true;
for (k=0; k<vector.length; k++)
if ( (y+k>=datos[0].length) || (datos[x][y+k]!=vector[k]) )
encontrado = false;
}
if (!encontrado) {
encontrado = true;
for (k=0; k<vector.length; k++)
if ( (y-k<0) || (datos[x][y-k]!=vector[k]) )
encontrado = false;
}
// Diagonales
if (!encontrado) {
encontrado = true;
for (k=0; k<vector.length; k++)
if ( (x+k>=datos.length) || (y+k>=datos[0].length)
|| (datos[x+k][y+k]!=vector[k]) )
encontrado = false;
}
if (!encontrado) {
encontrado = true;
for (k=0; k<vector.length; k++)
if ( (x+k>=datos.length) || (y-k<0)
|| (datos[x+k][y-k]!= vector[k]) )
encontrado = false;
}
if (!encontrado) {
encontrado = true;
for (k=0; k<vector.length; k++)
if ( (x-k<0) || (y+k>=datos[0].length)
|| (datos[x-k][y+k]!=vector[k]) )
encontrado = false;
}
if (!encontrado) {
encontrado = true;
for (k=0; k<vector.length; k++)
if ( (x-k<0) || (y-k<0)
|| (datos[x-k][y-k]!=vector[k]) )
encontrado = false;
}
return encontrado;
Versin iterativa
public boolean fwhile (int a, int b)
{
boolean resultado = true;
while (a<=b) {
resultado = resultado && g(a);
a++;
}
return resultado;
}
public boolean ffor (int a, int b)
{
int x;
boolean resultado = true;
for (x=a; (x<=b) && resultado; x++)
resultado = g(x);
return resultado;
}
____________________________________________________
PRIMERA PARTE
Consideremos que una imagen est formada por una matriz de nmeros enteros en la que cada
elemento contiene el nivel de gris de un pxel. Este valor puede ir de 0 (negro) a 255 (blanco).
Dada la clase Imagen
public class Imagen
{
private int pixels[][];
}
EJERCICIO 1 (2 puntos)
Implemente un mtodo reflejoHorizontal()que refleje horizontalmente la imagen (esto es,
lo que hubiese a la izquierda de la imagen original debe quedar a la derecha y lo que hubiese a
la derecha debe quedar a la izquierda en la imagen reflejada).
EJERCICIO 2 (4 puntos)
Disee e implemente un mtodo ecualizar() que ecualice la imagen. La ecualizacin del
histograma de una imagen uniformiza los niveles de gris de una imagen de tal forma que, en
imgenes muy concentradas en determinados niveles de gris, se aumenta el contraste. Para
ecualizar una imagen:
1. Se calcula el histograma acumulado de la imagen: c(i ) =
p( j )
j =0
2. Se transforma cada pxel de la imagen de tal forma que, si tenemos un pxel con
el nivel de gris i, ste pasar a tener el nivel de gris 255 * c(i) / pxeles,
donde p(j) es el nmero de pxeles de la imagen con el nivel de gris j, c(i) es el nmero de
pxeles con una intensidad menor o igual que i y pxeles es el nmero de pxeles de la imagen.
EJERCICIO 3 (4 puntos)
Dado el siguiente fragmento de cdigo:
static final double N = 2;
static final double PREC = 1e-6;
static double f (double x)
{
return x*x-N;
}
static double bis (double min, double max)
{
double med = (min+max)/2;
if (max-min<PREC) {
return med;
} else if (f(min)*f(med)<0) {
return bis (min,med);
} else {
return bis (med,max);
}
}
____________________________________________________
SEGUNDA PARTE
EJERCICIO 1 (4 puntos)
Dado el siguiente diagrama UML:
a) Declare e implemente adecuadamente en Java las clases que se derivan del diagrama.
b) Defina una subclase de TMinerTask llamada Experimento que redefina el mtodo
execute() de tal forma que ste sirva para determinar si un nmero es primo o no (el
nmero se obtiene a travs del mtodo getInput(), el cual devuelve un String, y el
resultado del experimento se guarda como una cadena utilizando el mtodo setOutput())
c) Disee un conjunto de casos de prueba adecuado para comprobar el funcionamiento de la
clase implementada en el apartado anterior.
d) Implemente un programa en Java que lance el experimento en una hebra independiente.
EJERCICIO 2 (3 puntos)
Disee e implemente un programa en Java que lea un fichero de texto y nos d la frecuencia de
las 3 vocales que aparecen ms a menudo en el fichero.
EJERCICIO 3 (3 puntos)
Queremos acceder a un componente de tipo TMinerComponent de forma remota usando RMI:
describa cmo deberamos declarar la clase TMinerComponent, implemente el servidor RMI
necesario para poder acceder al componente de forma remota y escriba el cdigo necesario para
acceder al componente desde un cliente RMI.
____________________________________________________
EJERCICIO 1
(4 puntos)
(2 puntos)
Implemente un mtodo que, dada una cadena de caracteres, nos indique si la cadena
incluye una subcadena que tambin recibe como parmetro.
Disee un conjunto de casos de prueba adecuado para comprobar el funcionamiento del
mtodo anterior y construya una tabla de casos de prueba de la siguiente forma:
Cadena
EJERCICIO 3
Subcadena
Resultado
Justificacin
(4 puntos)
____________________________________________________
EJERCICIO 1 (3 puntos)
El nmero de Reynolds es un nmero adimensional utilizado en mecnica de fluidos que viene
dado por la siguiente expresin:
Resultado
Justificacin
(el porqu de cada caso de prueba)
EJERCICIO 2 (2 puntos)
Dada una clase Vector declarada de la siguiente forma:
public class Vector
{
private int datos[];
public int size ()
{
return datos.length;
}
public int rec (int j, int k)
{
int m = (j+k)/2;
if (j<=k) {
return (datos[m]%2)
+ rec(j, m-1)
+ rec(m+1, k);
} else {
return 0;
}
}
}
____________________________________________________
EJERCICIO 3
(2 puntos)
Declare e implemente adecuadamente las clases en Java que se derivan del siguiente
diagrama de clases UML:
EJERCICIO 4
(3 puntos)
Disee e implemente en Java un servidor TCP multihebra que sea capaz de recibir
conexiones a travs del puerto TCP nmero 21.
Cuando un cliente se conecta al servidor, le enva una lnea de texto que contiene el
nombre de un fichero al que desea acceder. Entonces, el servidor lee el fichero que haya
solicitado el cliente y le devuelve el contenido del mismo a travs de la conexin
establecida con el cliente a travs de un socket.
NOTA: Cuando el cliente intenta acceder a un fichero que no existe en el
servidor, el servidor simplemente cierra la conexin sin enviarle nada al cliente.