Algodritmo9 3
Algodritmo9 3
Algodritmo9 3
Atributos y Mtodos............................................................................................................36 Atributos............................................................................................................................36 El dato............................................................................................................................37 La Variable....................................................................................................................37 Tipos de Datos en Java.........................................................................................37 Tabla de tipos de datos primitivos.....................................................................38 Mtodos..............................................................................................................................40 Creando nuestra primera clase utilizando BlueJ...........................................................42 Pero... qu dijimos que es un programa?....................................................................42 Qu es BlueJ?.................................................................................................................42 1) Crear un proyecto...................................................................................................44 2) Crear una clase........................................................................................................44 Convenciones sobre el nombre de las clases....................................................46 3) Crear objetos..........................................................................................................47 El mtodo constructor.....................................................................................................51 Algunas convenciones sobre los nombres de mtodos...................................53 Iteractuando con objetos en BlueJ.............................................................................55 Colecciones de Objetos.......................................................................................................56 La clase ArrayList............................................................................................................56 Constructores...................................................................................................................57 Mtodos..............................................................................................................................57 Declaracin de un ArrayList de enteros...........................................................57 Creacin de un ArrayList de enteros.................................................................57 Aadiendo elementos al ArrayList......................................................................58 Conociendo el tamao del ArrayList...................................................................58 Obteniendo un elemento del ArrayList.............................................................58 Borrando un elemento del ArrayList..................................................................58 Relaciones entre objetos....................................................................................................59 Composicin (tiene un).....................................................................................................59 Herencia (es un)................................................................................................................60 Recursividad................................................................................................................................63 Definicin................................................................................................................................63 Tipos de Recursin................................................................................................................69 Recursividad Simple.........................................................................................................69 Recursividad Mltiple......................................................................................................69 Recursividad Anidada......................................................................................................69 3
Recursividad Cruzada o Indirecta................................................................................70 Reglas fundamentales de la recursividad.........................................................................71 a) Caso base: .....................................................................................................................71 b) Progreso:........................................................................................................................71 c) Regla de diseo:............................................................................................................71 d) Regla del inters compuesto:....................................................................................72 La Pila de Recursin..............................................................................................................73 Llamada a una funcin......................................................................................................73 Llamada a una funcin recursiva...................................................................................73 Anlisis de Algoritmos..............................................................................................................74 Definicin................................................................................................................................74 Factores que influyen en la eficiencia de un algoritmo................................................75 El Hardware ......................................................................................................................75 El Software.......................................................................................................................75 La longitud de entrada....................................................................................................75 Anlisis de Algoritmos.........................................................................................................76 Elementos de un algoritmo.............................................................................................76 Enunciados simples (sentencias)..............................................................................77 Enunciados compuestos (estructuras de control)................................................78 Selectivas......................................................................................................................78 IF................................................................................................................................78 IF-ELSE....................................................................................................................80 Repetitivas....................................................................................................................82 FOR............................................................................................................................82 WHILE......................................................................................................................84 DO - WHILE............................................................................................................85 Orden de Magnitud (Notacin O grande)........................................................................86 Definicin conceptual del Orden de Magnitud..........................................................86 Propiedades del Orden de Magnitud............................................................................87 Estructuras de Datos...............................................................................................................88 Definicin................................................................................................................................88 Operaciones.......................................................................................................................88 Navegar por la estructura.........................................................................................88 Bsqueda........................................................................................................................88 Consulta de la informacin.........................................................................................88 Copia parcial o total....................................................................................................88 4
Prueba.............................................................................................................................89 Modificacin..................................................................................................................89 Insercin........................................................................................................................89 Eliminacin.....................................................................................................................89 Verificar si es vaca....................................................................................................89 Clasificacin...........................................................................................................................90 Estructuras de Datos Interna y Externa...................................................................90 Estructuras de Datos Estticas...................................................................................90 Estructuras de Datos Dinmicas..................................................................................90 Estructuras de Datos Lineales y No Lineales.............................................................91 Objetivos.................................................................................................................................91 Estructuras de Datos Lineales...............................................................................................92 Listas........................................................................................................................................92 Operaciones.......................................................................................................................92 Definicin recursiva.........................................................................................................93 La clase Lista.java.......................................................................................................95 Constructores .........................................................................................................95 Mtodos....................................................................................................................95 Verificar si es vaca...........................................................................................95 Insertar un dato al final...................................................................................96 Insertar un dato al inicio..................................................................................96 Insertar un dato en la k-sima posicin de la lista....................................96 Eliminar un dato de la lista..............................................................................97 Obtener el tamao de la lista..........................................................................97 Buscar un dato sobre la lista...........................................................................97 Obtener un elemento de cualquier posicin de la lista..............................98 Obtener en formato cadena a la lista...........................................................98 Modificar el elemento de una posicin dada................................................99 Eliminar el elemento de una posicin dada...................................................99 Genericidad o Parametrizacin de tipos...............................................................101 Definicin de Lista en base a Nodos..........................................................................103 Lista de Simple Enlace..............................................................................................103 La clase ListaSE.java................................................................................................106 Constructor............................................................................................................106 Mtodos...................................................................................................................106 Verificar si es vaca.........................................................................................106 5
Insertar un dato al inicio................................................................................106 Insertar un dato al final.................................................................................107 Obtener el tamao de la lista........................................................................107 Obtener el elemento de una posicin dada.................................................108 Eliminar el elemento de una posicin dada.................................................108 Buscar un elemento en la lista.......................................................................109 Lista de Doble Enlace...............................................................................................109 La clase ListaDE.java..................................................................................................111 Constructor ............................................................................................................111 Mtodos....................................................................................................................111 Insertar un elemento al inicio.........................................................................111 Insertar un elemento al final.........................................................................112 Obtener los elementos de la lista en formato cadena.............................112 Eliminar y obtener el primer elemento de la lista.....................................113 Eliminar y obtener el ltimo elemento de la lista......................................113 Buscar un elemento en la lista........................................................................114 Buscar un elemento en la lista........................................................................114 Lista Circular de Simple Enlace..............................................................................115 La clase ListaSEC.java...............................................................................................116 Constructor.............................................................................................................116 Mtodos...................................................................................................................116 Verificar si es vaca..........................................................................................116 Insertar un dato al inicio................................................................................116 Insertar un dato al final..................................................................................117 Obtener en formato cadena...........................................................................117 Lista Circular de Doble Enlace................................................................................118 La clase ListaDEC.java..............................................................................................118 Constructor.............................................................................................................118 Mtodos...................................................................................................................119 Verificar si es vaca..........................................................................................119 Insertar un dato al inicio................................................................................119 Insertar un dato al final.................................................................................120 Obtener la lista en formato cadena.............................................................120 Pilas.........................................................................................................................................121 Operaciones......................................................................................................................121 Aplicaciones de las Pilas ...............................................................................................124 6
Colas.......................................................................................................................................125 Operaciones.....................................................................................................................126 Aplicaciones de las Colas .............................................................................................127 Estructuras de Datos No Lineales.......................................................................................128 Introduccin.........................................................................................................................128 rboles..................................................................................................................................128 Algunos Conceptos..........................................................................................................129 rboles Binarios ..................................................................................................................131 Operaciones......................................................................................................................131 Definicin recursiva........................................................................................................131 La clase ArbolB.java..................................................................................................132 Constructor ...........................................................................................................133 Mtodos...................................................................................................................133 Verificar si el rbol est vaco......................................................................133 Insertar un elemento en el rbol en una ubicacin aleatoria.................133 Obtener el peso del rbol binario.................................................................134 Obtener el tamao del rbol binario............................................................134 Buscar un elemento en el rbol binario.......................................................134 Calcular la altura del rbol binario...............................................................135 Recorrido de un rbol binario......................................................................................135 Recorrido preorden...................................................................................................135 Recorrido enorden.....................................................................................................136 Recorrido postorden.................................................................................................136 rboles Binarios de Bsqueda..........................................................................................137 rboles Binarios de Expresin.........................................................................................138 Bibliografa................................................................................................................................139
Introduccin a la Programacin
La importancia de la lgica
Cuando era nio, alguna vez me coloqu mal los zapatos, en un instante en que toda mi familia estaba en un afn de salir rpido. Una ta vi que tena puestos los zapatos al revs y me rega fuertemente dicindome que porqu me haba puesto los zapatos as, que no tena un poquito de lgica.
Luego de ponerme adecuadamente los zapatos, es decir, colocando el zapato donde debera ser, zapato izquierdo para el pie izquierdo, zapato derecho para el pie derecho, comenc a pensar que realmente era posible que no tuviera lgica porque me pareca increble que yo no hubiera detectado que para colocarse correctamente los zapatos, slo haba un camino (y que adems era muy sencillo). Adems de esta conclusin (tan obvia) tambin llegu a otra (no tan obvia) y era el hecho de que es ms difcil ponerse mal los zapatos que ponrselos bien o, dicho en otras palabras, es muy muy muy fcil colocarse correctamente los zapatos. En la medida en que los aos fueron pasando y fui creciendo, me d cuenta que son muchas pero muchas las cosas obvias que por un extrao error no hacemos y vuelve a mi mente el recuerdo de mi ta dicindome: - Es que no tienes lgica o qu.!!! Dediqu mi carrera universitaria al estudio de las Ciencias de la Computacin, precisamente porque all encontr porqu era tan importante aquello de la lgica. Sin embargo y luego de buscar muchas definiciones de Lgica llegu a una que en mi concepto refleja realmente el sentido de esa palabra. Pregunt a una amiga: - Qu 8
es para ti la lgica? Me respondi en un lenguaje muy popular: - Pues, ehh.. la lgica es... es... es... como algo muy lgico. De hecho su respuesta no me satisfizo. Estaba incluyendo en la definicin el trmino a definir o sea que no me haba dicho nada. Pero cuando le pregunt: - Por qu te es difcil definirlo..? Me respondi: - Es que no es fcil definir algo tan lgico. O sea que ella tena clara la concepcin del trmino, sencillamente no saba cmo definirlo.
Pregunt a Don Jos, un viejo zapatero que durante varios aos lo haba visto llegar todas las maanas a armar su cambuche desde donde atenda, para desarmarlo en las horas de la noche. El me respondi: - Pues hombre, lo nico que le puedo decir es que lgico es todo aquello que no es ilgico. Su definicin me pareca muy racional pero de hecho segua siendo distante de lo que yo estaba esperando. Sin embargo yo vea que el proceso de armar su cambuche que constaba de unos nueve soportes y dos plsticos (desde donde l atenda a su clientela) le tomaba a l solamente unos diez minutos. Un da le dije que me dejara armrselo y al cabo de media hora me dijo un poco molesto: - Quieres armarlo rpido..? . Yo le respond que s, entonces me dijo: - Pues pngale lgica a esos palos y ver lo sencillo que es. Luego de un buen rato y de haber colmado la paciencia de Don Jos pude armarlo, pero lo que si not fue que l tena muy clara la definicin de Lgica porque luego de armado vi que realmente era muy sencillo y que todo lo que necesitaba era ponerle lgica. Mi inquietud sigui sin resolverse porque yo quera tener una definicin concreta y exacta de ese trmino. Pregunt a mi profesora de Lenguaje y me entreg una excelente definicin de diccionario: - Lgica es la rama del conocimiento que nos permite determinar que algo est aprobado por la razn como bien deducido o bien pensado. Para m era una definicin exacta y era suficiente con que apareciera en el Pequeo Larousse para que yo no la discutiera. Sin embargo me exiga ms razonamientos de los necesarios para entender tal definicin (al menos en esos das), pues me pareca inaudito que la definicin de Lgica fuera muy compleja, es decir no fuera tan lgica. Esa misma razn era la que no me haba animado a buscar una definicin de diccionario sino buscar una expresin tan sencilla y tan lgica que no me exigiera muchos razonamientos. En esa bsqueda por una definicin que dejara satisfechas mis expectativas ca en las fauces de un buen matemtico. De hecho, saba que tena que conocer y 9
poder definir qu era la Lgica. Cuando le pregunt al respecto me respondi diciendo: - Lgica es la Ciencia que estudia la estructura, fundamentos y uso de las expresiones del conocimiento humano. Realmente era la definicin ms exacta que yo haba recibido hasta ese momento, pero al igual que la definicin del Pequeo Larousse, me exiga demasiados razonamientos como para poder digerirla. No puedo discutir que considero que es la definicin ms exacta y precisa acerca de lo que es Lgica pero mi nivel de conocimiento no me permita procesar adecuadamente, en esos tiempos, esta definicin. Le pregunte a alguien, un transente, un desconocido qu era la Lgica y su respuesta desprevenida y silvestre me gust porque pude entenderla muy fcilmente: - Yo considero la lgica como una serie coherente de ideas y razonamientos. Compart con l dicha definicin y me pareci acertada. Adems que en todo mi entorno pude descubrir que todas las personas a quienes les preguntaba tenan, por lo menos, muy claro el concepto de lo que era la Lgica as en algunos casos no la pudieran definir de una manera clara. Finalmente y luego de tantas definiciones, busqu a mi padre. Un hombre del campo para quien los avances tecnolgicos le corran por la espalda porque no eran su afn. Me miraba sin parpadear cada que yo iniciaba algunas de mis disertaciones sobre la tecnologa y su relacin con el mundo moderno. Para l el mundo moderno no era sino un cmulo de problemas en vez de soluciones. Yo pensaba lo contrario. Sin embargo me arriesgu a preguntarle: - Pap, para usted qu es la lgica...? y l mirndome con la extraeza de la pregunta me dijo: - Pues es la forma ms OBVIA y ms FCIL de hacer algo. Y v que todas las definiciones que hasta el momento haba recibido, unas provenientes de la vida cotidiana y otras extractadas de libros especializados en el tema, se resuman en sta ltima. Eso es la LGICA. Algunos libros citan que la base para la solucin de problemas a travs de la computadora es tener muy buena lgica. Yo ira mas all. Considero que la base para ello es, sencillamente, ser muy lgicos o sea poder vislumbrar el camino ms obvio y ms fcil para lograr un objetivo.
10
La Importancia de la Informacin
En sentido general, la informacin es un conjunto organizado de datos, que constituyen un mensaje sobre un determinado ente o fenmeno. De esta manera, si por ejemplo organizamos datos sobre un pas, tales como: nmero de habitantes, densidad de poblacin, nombre del presidente, etc. y escribimos por ejemplo, el captulo de un libro, podemos decir que ese captulo constituye informacin sobre ese pas. Cuando tenemos que resolver un determinado problema o tenemos que tomar una decisin, empleamos diversas fuentes de informacin (como podra ser el captulo mencionado de este libro imaginario), y construimos lo que en general se denomina conocimiento o informacin organizada que permite la resolucin de problemas o la toma de decisiones. En muy distintas pocas el progreso de la humanidad ha sido posible gracias a: el fuego, la rueda, la agricultura, la industria y la tecnologa. Pues bien, ahora entramos en la Era de la Informacin, porque es a travs de la informacin como llegan a nuestras vidas las grandes soluciones... para los grandes problemas. Nuestras vidas giran en torno a la informacin que podemos percibir de nuestro entorno. La vida es una constante decisin, debemos elegir en cada momento de nuestras vidas, y las decisiones claramente deben estar basadas en informacin. La informacin se produce cuando, de alguna manera, logramos interpretar datos, es decir, seales de nuestro entorno. Por otra parte, la informacin debe tener una serie de caractersticas implcitas para que podemos utilizarla, debe ser fidedigna, a tiempo, etc. Hoy en da la ciencia que se encarga del estudio de la informacin es la Informtica.
11
La Informtica
La informtica es la Ciencia que estudia, aplica y optimiza el tratamiento eficiente de la informacin. Sabes lo que significa el tratamiento eficiente de la informacin..? Sencillamente que es la ciencia que se ocupa de que la informacin, cualquiera que sea su procedencia o su destino, cumpla con dos objetivos:
Veracidad : Toda informacin debe ser verdad (es decir veraz). De nada te sirve que vayas al Banco y solicites tu saldo e inmediatamente y sin ninguna demora te den un saldo que no corresponde a la realidad. Oportunidad : Toda informacin debe llegar en el momento indicado (o sea oportunamente). De nada te sirve que en el Banco te digan que tu verdadero saldo te lo entregan en 10 meses.
Porqu cada que se habla de Informtica se relaciona inmediatamente el concepto con computadoras..? Pues sencillamente porque en la actualidad los computadores son los dispositivos que mejor pueden cumplir con el objetivo de la Oportunidad ya que trabajan a velocidades impresionantemente altas (millonsimas de segundo). Y quien es el encargado de cumplir con la veracidad...? Pues el ser humano que es quien planea, organiza, programa todo lo que la computadora va a entregar como informacin.
12
La computadora
Las computadoras u ordenadores, son herramientas esenciales en muchas reas: industria, gobierno, ciencia, educacin...., en realidad en casi todos los campos de nuestras vidas. El papel de los programas es esencial; sin una lista de instrucciones a seguir, la computadora es virtualmente intil. Los lenguajes de programacin nos permiten escribir esos programas y, por consiguiente, comunicarnos con las computadoras.
Desde un punto de vista simple, una computadora procesa datos y los convierte en informacin significativa.
Datos
Computadora
Informacin
El programa es la fuerza conductora de cualquier tarea que hace una computadora. Un programa es una lista de instrucciones detalladas que indican a la computadora lo que ha de hacer. La computadora no puede hacer nada sin un programa. Los programas modernos producen informacin en muchos formatos. Estos programas reproducen msica, se comunican con otras computadoras en diferentes formas. La salida se enva a la pantalla y/o a la impresora que constituyen los dispositivos ms usuales para acceso a la computadora: es decir, los datos de 13
entrada y los datos de salida pueden ser, realmente, cualquier cosa, texto, dibujos, sonidos... Una computadora consta de dos partes bien diferenciadas, hardware y software. El hardware consta de las partes fsicas, tangibles de la computadora. El software consta de programas, tambin llamados aplicaciones, que contienen instrucciones que la computadora ejecuta o corre. Una computadora necesita tanto del hardware como del software para poder ser usada real y prcticamente. El hardware de la computadora sin el software que le acompaa es como si tuviramos un libro con pginas en blanco. La portada, contraportada y las pginas interiores constituyen el hardware del libro, pero el libro no es til sin ningn texto, el software.
14
El hardware
Las computadoras estn compuestas en su mayora por transistores, en donde los transistores en su nivel ms bsico hacen lo mismo que un interruptor, dejan o no pasar energa.
bit = es la mnima cantidad de informacin posible de ser manipulada. Ya que el bit es muy pequeo se vio la necesidad de agruparlos, para su mencin, en cantidades ms grandes. 8 bits = 1 byte Debido a que las necesidades informticas son cada vez ms grandes se usan agrupaciones ms y ms grandes, por ejemplo: 1 bit (b) = 1 cero o 1 uno 1 Byte (B) = 8 bits (b) 1 Kilo Byte (Kb) = 1024 bytes 1 Mega Byte (Mb) = 1024 Kb 1 Giga Byte (Gb) = 1024 Mb 1 Tera Byte (Tb) = 1024 Gb 1 Peta Byte (Pb) = 1024 Tb etc.. Otra cosa que interesa a la hora de hablar de computadoras es la velocidad del procesador. Todos somos impacientes y queremos que nuestra computadora 15
funcione lo ms rpidamente posible. Existen diferentes factores que determinan con qu rapidez la computadora ejecuta los trabajos. La Velocidad del Procesador es un factor. Pero qu es lo que determina la velocidad del procesador? La Velocidad del Procesador es afectada por: Reloj Reloj del Sistema = Un pulso electrnico que es usado para sincronizar el procesamiento. (Entre pulso y pulso solamente puede tener lugar una sola accin). Medido en megahertz (MHz) dnde 1 MHz= 1 milln de ciclos por segundo o gigahertz (GHz) donde 1 GHz = 1 ciclos de mil millones por segundo. De esto es lo que estn hablando cuando dicen que una computadora es una mquina de 2.8 Ghz. La velocidad de su reloj es de 2.8 mil millones de ciclos por segundo. Cuanto ms grande el nmero = ms rpido el procesamiento Ancho del Bus = Es la cantidad de datos que la CPU puede transmitir en cada momento hacia lla memoria principal y a los dispositivos de entradas y salidas. (todo camino para conducir bits es un bus). Un bus de 8 bits mueve en cada instante 8 bits de datos. El ancho del Bus puede ser de 8, 16, 32, 64, o 128 bits, hasta ahora. Piense en ello como "cuntos pasajeros (bits) puede caber en determinado momento, dentro del autobs a fin de trasladarse de una parte de la computadora a otra." Cuanto ms grande sea el nmero = ms rpida ser la transferencia de datos. Tamao de la palabra = Una palabra es la cantidad de datos que la CPU puede procesar en un ciclo de reloj. Un procesador de 8 bits puede manejar 8 bits cada vez. Los procesadores pueden 16
ser, hasta ahora, de 8, 16, 32, o 64 bits. Cuanto ms grande sea el nmero = ms rpida ser el procesamiento Es necesaria la plena coincidencia entre el tamao de la palabra, tamao del bus y el reloj. No servira de nada tener un bus que entregue 128 bits cada vez, si la CPU solo puede, utilizar 8 bits y tiene un reloj de baja velocidad. Se formara una enorme fila de datos esperando poder salir del bus! Cuando las computadoras se saturan como en ese caso, pueden suceder cosas indeseables con sus datos. Es como si los espectadores esperaran en una larga cola para entrar al cine; algunos podran irse!!
17
Tarjeta Principal
Es el lugar donde se coloca el microprocesador, generalmente es la tarjeta ms grande dentro del equipo, determina la calidad, estabilidad del sistema y compatibilidad del hardware.
Tarjeta de video
Debido al desarrollo de juegos y programas cada vez ms complejos las necesidades grficas crecen en forma abrumadora, tal es la necesidad que los fabricantes se ven obligados a desarrollar Tarjetas y Ranuras para videos especiales para dar ms velocidad a los grficos afectando en especial a la estructura de la tarjeta principal.
Memoria RAM
La memoria principal o RAM (Random Access Memory, Memoria de Acceso Aleatorio) es una memoria temporal, donde se guardan los datos que se estn utilizando en el momento presente (todo lo que se ve en pantalla), mientras ms memoria mejor. La diferencia entre la RAM y otros tipos de memoria de almacenamiento, como los disquetes o los discos duros, es que la RAM es mucho ms rpida y que se borra al apagar el equipo.
Disco Duro
Sirven como unidad de almacenamiento masivo, es donde se guarda toda la informacin, incluyendo el sistema operativo y no se borra al apagar el equipo.
18
Torre
Llamado tambin Case o Caja o Gabinete. Antiguamente el case no era importante, ahora no slo sirve para que el equipo se vea bien sino que se convirti en un elemento bsico para el buen funcionamiento de la computadora.
Dispositivos
Pueden o no necesitarse, dependiendo del uso, estos son: Floppy Drive (disquetera), CD-ROM (lector), CD-RW (quemador), DVD (lector de DVD), DVD-RW (quemador DVD), ZIP Drive, LS 120, lectores de tarjetas mltiples (SD, MS, PCMCIA, etc.)
Perifricos
Suelen ser los dispositivos que se conectan externamente al equipo como: Monitor, Teclado, Mouse, Impresora, Scanner, Joystick / gamepad, cmaras, etc. A continuacin una computadora y sus partes explicadas:
19
El Software
Las operaciones que debe realizar el hardware son especificadas por una lista de instrucciones, llamadas programas o software. El software se divide en dos grandes grupos: software del sistema y software de aplicaciones. El software del sistema es el conjunto de programas indispensables para que la mquina funcione. Estos programas son, bsicamente, el sistema operativo, los editores de texto, los compiladores/intrpretes (lenguajes de programacin) y los programas de utilidad.
Uno de los programas ms importantes es el sistema operativo, que sirve, esencialmente para facilitar la existencia, ejecucin y produccin programas. El sistema operativo dirige las operaciones globales de la computadora, instruye a la computadora para ejecutar otros programas y controla el almacenamiento y recuperacin de archivos (programas y datos) de dispositivos de almacenamiento.
20
Un programa es un conjunto de instrucciones que controlan (dirigen) a una computadora; ms formalmente, un programa de computadora es un conjunto de introducciones internas utilizadas para ejecutarse en una computadora y que produzca un resultado concreto. Otro trmino para un programa o conjunto de programas es software; ambos trminos se utilizan indistintamente. El proceso de escribir un programa, o software, se denomina programacin y el conjunto de instrucciones que se pueden utilizar para construir un programa se denomina lenguaje de programacin. As pues, los lenguajes utilizados para escribir programas de computadoras son los lenguajes de programacin y programadores son los escritores y diseadores de programas.
lenguajes mquina instrucciones binarias (ceros y unos) slo la mquina puede entenderlo lenguajes de bajo nivel (assembler) instrucciones nemotcnicas a las binarias pueden entenderlo las personas lenguajes de alto nivel instrucciones en lenguaje fcil de leer por las personas es fcil escribir y entender para las personas
21
Los lenguajes de programacin de alto nivel existentes hoy en da 1 son muy numerosos, aunque la prctica demuestra que los ms usados se reducen a: -C - C# - JAVA - PYTHON - C++ - PHP - JAVASCRIPT - RUBY
Unos programas especiales llamados traductores (compiladores o intrpretes) convierten las instrucciones escritas en un determinado lenguaje de programacin en instrucciones escritas en el lenguaje que la mquina se sabe y entiende muy bien (0 y 1, bits). El propsito de un lenguaje informtico (lenguaje de computadora) es permitir a las personas comunicarse con una computadora. Los lenguajes de los humanos y los lenguajes de la mquina son muy diferentes, ya que las caractersticas y posibilidades de las personas y de las mquinas son muy diferentes.
Traductores de lenguaje
Los traductores de lenguaje son programas que traducen los programas fuente escritos en un lenguaje entendible por personas a un lenguaje que la mquina entienda. Los traductores se dividen en:
Intrpretes: que son traductores que toman un programa fuente, lo traducen y a continuacin lo ejecutan. Compiladores: generan un programa equivalente que la mquina ser capaz de interpretar.
1 Diciembre de 2007
22
La programacin
Despus que se ha diseado y pensado como resolver el problema en papel, se debe comenzar el proceso de introducir el programa en un archivo en el disco duro de la computadora. La introduccin y modificacin de su programa en un archivo se hace utilizando un simple editor de texto o un editor especializado que hace la tarea de escribir un programa una tarea muy fcil. El programa que se introduzca en el editor, estar escrito en Java o C++ o cualquier otro, pero ni C++ ni Java son lenguajes mquina, muy al contrario, como ya se mencion, son lenguajes de alto nivel diseados para hacer ms fcil la programacin que utilizando el lenguaje mquina. Pero a la vez, una computadora no entiende los lenguajes de alto nivel. En consecuencia, un programa escrito en un lenguaje de alto nivel debe ser traducido a un lenguaj que la mquina pueda comprender. Los lenguajes que la computadora puede comprender (ms o menos directamente) son los lenguajes de bajo nivel. La traduccin de un programa escrito en un lenguaje de alto nivel, como C++ o Java, a un lenguaje que pueda entender la computadora se hace mediante otro programa conocido como compilador. Los lenguajes de bajo nivel que la computadora puede entender directamente se conocen como lenguajes ensamblador o lenguajes mquina. En realidad, aunque son muy similares y en ocasiones se les considera sinnimos, tienen algunas pequeas diferencias. El lenguaje que la computadora puede comprender directamente es el lenguaje mquina. El lenguaje ensamblador es casi la misma cosa, pero necesita un paso adicional para que la traduccin pueda ser entendida por la mquina. Si un compilador traduce su programa de alto nivel a algn lenguaje de bajo nivel, no es exactamente lenguaje de mquina, se necesita una pequea traduccin adicional antes de ser ejecutado, pero normalmente este proceso suele ser automtico y no es problema. Hacer un programa en un lenguaje de programacin es escribir el programa, compilarlo y luego ejecutarlo.
23
24
Paradigmas de Programacin
La programacin como cualquier otro arte, por ejemplo Las Artes Marciales, posee diferentes estilos, tcnicas o modos de pensar diferentes para programar:
Programacin Estructurada, Procedural o Imperativa, en el que los programas se dividen en procedimientos independientes con acceso total a datos comunes. Ejemplos de estos tipos de programas son: C, FORTRAN, BASIC. Algoritmos + Estructuras de Datos = Programas Programacin Funcional, en el que el resultado de un clculo es la entrada del siguiente, as hasta que se produce el valor deseado. HASKELL es un ejemplo moderno. Funciones + Estructuras de Datos = Programas Programacin Orientada a Objetos, en el que los datos se consideran la parte ms importante del programa, de modo que se agrupan en objetos. Los objetos modelan las caractersticas de los problemas del mundo real, su comportamiento ante estas caractersticas y su forma de interactuar con otros elementos. SMALLTALK, JAVA son algunos de los lenguajes que soportan este paradigma. Objetos + Mensajes = Programas
25
James Gosling
Taza de caf
Duke
Creador de Java
Logo de Java
Mascota de Java
26
27
La clave en sta forma de programar son los objetos que nos rodean. Estos objetos pueden ser cosas fsicas como personas, casas, sillas, etc. o cosas lgicas como el clima, la hora, la fecha, etc. La POO nos permitir resolver problemas de la vida real usando objetos de la vida real. 28
Objetos y clases
La programacin orientada a objetos est modelada sobre cmo, al igual que en el mundo real, los objetos con frecuencia estn formados por varios tipos de objetos ms pequeos. Esta capacidad de combinar objetos, sin embargo, slo es un aspecto muy general de la programacin orientada a objetos. sta proporciona otros conceptos y caractersticas para hacer ms fcil y ms flexible la creacin y utilizacin de objetos, donde la ms importante de estas caractersticas son las clases. Una clase es una plantilla para mltiples objetos con caractersticas similares. Las clases comprenden todas las caractersticas de una serie particular de objetos.
Vamos a ver cual es la diferencia bsica entre clases y objetos. Por ejemplo, si nos ponemos a hablar de palmeras, eucaliptos, pinos... de qu estamos hablando realmente? Pues de rboles. Entonces podramos contar con una clase Arbol que describa las caractersticas de todos los rboles (tienen hojas y races, crecen, crean clorofila, etc). La clase Arbol sirve como un modelo abstracto para el concepto de un rbol; para alcanzar y sujetar, o interactuar con l, o cortarlo tendr que poseer una instancia concreta del mismo. Por supuesto, en cuanto tenga una clase rbol, puede crear muchas instancias del mismo, y cada diferente instancia puede tener diversas caractersticas (bajo, alto, frondoso, cambia de hojas en el otoo), mientras todava se compone y se reconozca como rbol.
30
As que, cul es la diferencia exacta entre una instancia y un objeto? En realidad ninguna. Objeto es el trmino ms general, pero tanto las instancias como los objetos son la representacin concreta de una clase. De hecho, los trminos instancia y objeto con frecuencia se utilizan en forma indistinta en el lenguaje POO. Una instancia de un rbol y un objeto rbol son lo mismo.
31
Tipo de Objetos
Puntos Pases
Clase Java
Punto
Objetos
(5,2) (1,-3) (0,1) Java, C#, C++
Docentes 10:30 - 15:45 8:00 Planetas 14/09/2007, 25/12/2006, 14/08/2003 Sistemas Operativos
13X
2
7X
, 3XY 5
Celulares 5 Bs, 10 $us, 1 Bs Universidades Hitachi de 80 Gb Maxtor de 120 Gb Samsumg de 160 Gb Algebra I, Calculo II, Fsica III 14/7, 1/2, 3/4
32
Antes de continuar veamos un concepto que es muy importante en programacin y sobre todo en programacin orientada a objetos.
La abstraccin
La abstraccin visto desde el punto de vista de la programacin orientada a objetos expresa las caractersticas esenciales de un objeto dentro un contexto en particular, las cuales distinguen al objeto de los dems. Adems de distinguir entre los objetos provee lmites conceptuales. Entonces se puede decir que la encapsulacin separa las caractersticas esenciales de las no esenciales dentro de un objeto. Si un objeto tiene mas caractersticas de las necesarias los mismos resultarn difciles de usar, modificar, construir y comprender. La misma genera una ilusin de simplicidad dado a que minimiza la cantidad de caractersticas que definen a un objeto.
El contexto en el que se analiza al objeto es importante, ya que de ello depender la abstraccin que realicemos. Por ejemplo, la importancia que tiene la cabeza para un psiclogo es muy diferente a la importancia que tiene la cabeza para un peluquero.
Vs.
EJERCICIO.- Indica la forma de llegar a tu casa. Para ste ejercicio puedes utilizar cualquier forma de representacin.
33
Durante aos, los programadores se han dedicado a construir aplicaciones muy parecidas que resolvan una y otra vez los mismos problemas. Para conseguir que los esfuerzos de los programadores puedan ser utilizados por otras personas se cre la POO, que es una forma de programar que enfatiza descubrir los objetos del mundo real en un contexto particular, simulndolos en objetos computacionales. La POO no es difcil, pero es una manera especial de pensar, a veces subjetiva de quien la programa, de manera que la forma de hacer las cosas puede ser diferente segn el programador. Aunque podamos hacer los programas de formas distintas, no todas ellas son correctas, lo difcil no es programar orientado a objetos sino programar bien. Programar bien es importante porque as podemos aprovechar todas las ventajas de la POO.
34
Pues en un esquema POO el coche sera el nombre general (clase) que utilizamos para referirnos a un conjunto de objetos con las mismas caractersticas y las mismas funcionalidades; los atributos seran las caractersticas como el color o el modelo y los mtodos seran las funcionalidades asociadas como ponerse en marcha o parar. Por poner otro ejemplo vamos a ver cmo modelariamos en un esquema POO a las fracciones (, , etc.). un objeto fraccin, es esa estructura matemtica que tiene un numerador y un denominador que divide al numerador, por ejemplo 3/2. Fraccin ser el nombre que le demos a esta clase de objetos y tendr dos atributos, el numerador y el denominador. Luego podra tener varios mtodos como simplificarse, sumarse, restarse, multiplicarse, dividirse con otra fraccin o nmero, etc. Estos objetos se podrn utilizar en los programas, por ejemplo en un programa de matemticas hars uso de objetos fraccin y en un programa que gestione un taller de coches utilizars objetos coche.
35
Atributos y Mtodos
Ahora bien, cada clase est, por lo general, compuesta de dos componentes:
atributos, indican caractersticas comunes de los objetos mtodos, indican comportamiento similar de los objetos
Atributos
Los atributos son las caractersticas individuales que diferencian a un objeto de otro, y determinan la apariencia, estado u otras cualidades de ese objeto. Por ejemplo, suponiendo que queremos modelar a las personas, creamos una clase llamada Persona, y para ver cuales seran sus atributos pensemos en una persona, una individuo en particular y seguro muy conocido para ti: Homero Simpson... Vamos a decir que Homero est viejo, seguramente te imaginars a Homero muy adulto, calvo, de unos 50 aos. Es decir, apenas yo digo Homero est viejo, y ya entras en una serie de razonamientos lgicos y concluyentes para captar claramente lo que yo quise decir. Qu fue lo que describ de Homero? Muy sencillo, describ un atributo. A veces los atributos pueden llegar a describirse de una forma muy relativa. Ya que si Homero tuviera unos 30 aos no sera tan viejo para personas del la misma edad, para personas ms jvenes si sera algo viejo y para los nios si sera muy viejo. Cuando se describe de esa forma un atributo depende mucho de quien da el concepto. Igual como cuando un hombre dice que una determinada mujer es hermosa, pues la que para l es hermosa puede que para otros no lo sea tanto. Por esta razn es mejor expresar los atributos de manera que sean tasados a travs de una escala ya que estos los hace manejables y no relativos. Esto dar lugar a la presencia de un concepto muy importante en Informtica: El Dato. En lugar de decir Homero est viejo podramos decir Homero tiene 40 aos. En este caso, a pesar de que los razonamientos y conclusiones sean las mismas, podemos dejar al libre concepto de quien sea.
36
El dato
El dato es un atributo codificado en trminos entendibles a un sistema computarizado, en condiciones que sean manejables y comparables de manera casi absoluta. Sin embargo un dato, solo, no significa nada a menos que se tenga claridad de cul es el atributo que l est describiendo. Por ejemplo, si yo dijera que el dato es 7. Qu pensaras que significa este dato? La cantidad de computadoras que tengo o la cantidad de novias que tengo o la cantidad de autos que tengo o la edad que tengo o ... realmente no tendras idea del significado de dicho dato. Para ello, vendr sobre nosotros un concepto que aclarar las cosas: la variable.
La Variable
Una variable se representa con un nombre significativo al atributo que representa, un identificador que hace referencia a un lugar de la memoria principal y almacena un dato. Pero es necesario especificar que tipos de dato se puede almacenar en una variable, para eso existen los tipos de datos que se encargan de restringir el dato que puede almacenarse en una variable.
lgico: boolean, almacena valores o datos lgicos como true o false. texto: char, almacena valores o datos caracteres como 'a' entero: byte, short, int, long, almacena valores numricos enteros. real: float, double, almacena valores numricos reales. 37
IEEE 754 estndar 0.0 punto flotante IEEE 754 estndar 0.0 punto flotante
1.79769313486231570E+308 4.94065645841246544E-324
Los tipos referencia son slo referencias a otros objetos. En realidad lo que hacemos cuando creamos una clase para modelar objetos, es crear un nuevo tipo de dato objeto, ms conocido como tipos referencia. Algunos tipos referencia de ejemplo:
Tipo String Integer Long Short Double Float Character Persona Coche Fraccion Referencia Literales o cadenas de texto Un entero con signo Un entero grande con signo Un entero corto con signo Un nmero real Un nmero real Un caracter Unicode Un objeto persona Un objeto coche Un objeto fraccion Tamao 32 bits 32 bits 32 bits 32 bits 32 bits 32 bits 32 bits 32 bits 32 bits 32 bits
Volviendo al ejemplo, nuestra frase inicial Homero est viejo, que luego se convirti en Homero tiene 40 aos. podramos ahora enunciarla como La edad de Homero es 40. En este instante, a pesar de que podemos obtener las mismas conclusiones que en las frases pasadas, ya tenemos identificado de manera clara y 38
con un nombre el atributo que se est describiendo. ste es el concepto de Variable o Campo que no es ms que el nombre que se le coloca a un dato para identificar el atributo que est describiendo. Adems podemos especificar el tipo de dato que tendra esta variable que sera int puesto que la edad es un valor entero. As en nuestra frase La edad de Homero es 40, tenemos tres atributos claramente identificados (tres...???) S, tres atributos, tres campos, tres variables: el primero de ellos es la edad, atributo con el cual hemos estado realizando toda la explicacin, el segundo es el nombre de la persona de quien estamos hablando y ya sabemos que es Homero y el tercero es el sexo pues podemos asegurar que Homero es de sexo masculino. De tal forma que si organizramos la informacin de la que hemos hablado hasta el momento podramos hacer un pequeo esquema como el que se presenta a continuacin: Los atributos de la persona:
nombre de tipo Literal (String) edad de tipo entero o (Int) sexo de tipo Literal (String)
Nombre Homero
Edad 40 aos.
Sexo Masculino
Incluso podramos tener informacin de otros objetos del mismo tipo: Nombre Homero Bart Lisa Marge Edad 40 aos 10 aos 8 aos 35 aos Sexo Masculino Masculino Femenino Femenino
39
Homero
Bart
Marge
Lisa
Mtodos
Los mtodos reflejan el comportamiento de los objetos. El comportamiento de clase determina qu instancias de esa clase requieren cambiar su estado interno o cundo esa instancia es llamada para realizar algo por otra clase u objeto. El comportamiento es la nica manera en que los objetos pueden hacerse algo a s mismos o tener que hacerles algo. Algunos comportamientos para nuestra clase de ejemplo:
40
Los mtodos son la interfaz de comunicacin del objeto con el mundo exterior, permiten mandar mensajes a los objetos para que realicen cosas. Por ejemplo: Si alguna vez jugaste Mario Bross o un video juego parecido, recordars que para hacer que Mario salte o bote fuego haba que apretar algunos botones del mando, pues as es la utilizacin de los mtodos de un objeto, en este caso para hacer que el objeto Mario salte, pues le mandamos un mensaje desde el mando para esto, aprentando un botn, si quisieramos que bote fuego, pues apretamos otro botn. Los mtodos no siempre afectan a un solo objeto; los objetos tambin se comunican entre s mediante el uso de mtodos. Un objeto puede llamar a mtodos en otro objeto para avisar sobre los cambios en el ambiente o para solicitarle a ese objeto que cambie su estado.
41
Qu es BlueJ?
BlueJ es un IDE (Entorno de Desarrollo Integrado), que facilita mucho el proceso de crear un programa (editar, compilar y ejecutar) y el proceso de entender un programa (ver grficamente a los objetos, las clases y sus relaciones).
Logo de BlueJ
42
La siguiente figura muestra y explica la ventana principal de BlueJ y sus principales reas de trabajo:
1. Sobre el ttulo no es mucho lo que se puede decir, cuando trabajas con BlueJ creas un nuevo proyecto para trabajar, a ese tienes que darle un nombre, el cual se muestra en esta parte. 2. En el men tenemos 5 secciones, Project (proyecto), Edit (edicin), Tools (herramientas), View (ver) y Help (ayuda), vamos a describir solo lo que vamos a utilizar ms. 1. En proyect podemos crear, guardar y abrir proyectos, crear ejecutables y tambin salir del programa principalmente. 2. En edit podemos crear clases, flechas de uso o de herencia (ya vamos a ver que son). 3. En Tools podemos ver las preferencias de BlueJ y compilar principalmente. 4. View sirve para mostrar diferentes cosas que tiene BlueJ como debbuger, terminal y code pad. 43
5. Help creo que todos sabrn para que es... si quieres encontrar informacin sobre BlueJ o clases java. Ahora s, empecemos a crear nuestra primera clase con la ayuda del buen BlueJ. Estmos listos? Lo primero ser crear un proyecto, crear una clase y crear los objetos.
1) Crear un proyecto
Un proyecto para BlueJ es una carpeta donde se colocarn todos los archivos de nuestro programa. Para crear un proyecto nos vamos al men Project, luego seleccionamos la opcin New Project, el mismo nos abrir un cuadro de dilogo para crear nuestro proyecto donde querramos. El nombre de proyecto puede ser cualquier cosa.
45
Debe ser significativo Empezar con mayscula (como un nombre propio) Estar escrito en singular
Una vez colocado el nombre en el cuadro de dilogo, aparecer una cajita en el rea de las clases, sta representar a la clase en cuestin.
Debemos de editar el cdigo por defecto que tiene sta clase, para lo cual haremos doble click sobre la cajita, aparecer el editor de esta clase mostrando cdigo que tal vez, de momento, no entendamos ni j, as que borraremos todo lo que est escrito en el editor para hacer nuestro propio cdigo. Una vez borrado todo, escribimos lo siguiente:
class Persona { }
Y pues bien, hemos creado una clase. Claro que no hace mucho en este momento, pero sta es una clase en Java en su forma ms sencilla. sta es la sintaxis general para definir a una clase.
class <NombreClase> { // Declaracin de atributos <tipo> <variable> ; // Declaracin de mtodos <tipo> <nombreMtodo> ( <parmetros> ) { ... } }
46
El nombre del archivo Java debe coincidir con el de la clase definida en l <NombreClase>.java
3) Crear objetos
Una vez hecha la clase ya es posible crear objetos. En BlueJ esto es una tarea fcil. Slo tenemos que hacer click derecho sobre la clase y elegir la opcin new Persona (para nuestro ejemplo).
Siguiendo con la creacin de nuestra clase Persona, ahora veamos algunos atributos (variables de instancia) para esta clase. Qu tiene toda persona? nombre edad Una vez identificado los atributos para una clase, es necesario indicar el tipo de dato que guardarn sus objetos.
47
...Volviendo al ejemplo:
nombre, como Homero, Bart, Lisa, Marge. El tipo de dato ms adecuado sera String. edad, como 40, 10, 8, 38. El tipo de dato ms adecuado sera int. Y de esa manera colocamos los atributos en nuestra clase.
class Persona { String nombre; int edad; }
Ahora nos toca ver algunos mtodos. Qu hace toda persona? saludar decir si es mayor de edad o no decir su nombre decir su edad modificar edad Como los mtodos son las cosas que saben hacer los objetos, y para invocar a ese mtodo se lo hace a travs de mensajes, veamos que tipo de mensajes existen para ver como debera estar estructurado un mtodo. Los mensajes pueden ser:
con respuesta. Ejemplo: dime tu nombre. sin respuesta. Ejemplo: levntate. (No esperamos que nos de una respuesta, simplemente realiza una accin) con informacin adicional (parmetros). Ejemplo: Te gusta el color .... ? (El parmetro sera el color) sin informacin adicional (sin parmetros). Ejemplo: Eres mayor de edad? (No 48
se necesita ningn parmetro para realizar ese mensaje) A un mtodo podra vrselo de la siguiente forma (como si fuese una caja):
Donde la entrada, sera la informacin adicional del mensaje (parmetros) y la salida sera el retorno del mensaje (retorno del mtodo). La sintaxis general de un mtodo es:
Donde: Tipo de dato del retorno: Si el mtodo devuelve algo, ste tiene un tipo de dato, que es un tipo de dato vlido en Java (primitivo o clase). es el nombre, a travs del cual se invocar al mtodo. la informacin adicional al mtodo. aqu indicamos cmo el objeto hace la operacin. Si el mtodo tiene respuesta, entonces deber existir una instruccin:
return <expresion>;
49
Volviendo a nuestro ejemplo, veamos como son los mtodos de la clase Persona:
public String saludar() { return "Hola soy "+nombre+" y tengo "+edad+" aos "; }
decir si es mayor de edad o no: tiene respuesta (boolean) y no necesita informacin adicional.
50
modificar su edad: no tiene respuesta (void) y necesita saber la nueva edad (int)
El mtodo constructor
Es un mtodo especial que sirve para inicializar los atributos. Tiene el mismo nombre que la clase. No tiene tipo de retorno (ni siquiera void)
class Persona { String nombre; int edad;
51
52
se escriben con minscula. Ej: saludar si su nombre involucra varias palabras, la primera letra de cada letra (menos la primera), con mayscula. Ej: decirNombre Para todos aquellos mtodos que se encargan de obtener valores de atributos, coloca el prefijo get seguido del nombre del atributo. Ej: En nuestro ejemplo, en lugar de escribir decirNombre, deberamos colocar getNombre. Para todos aquellos mtodos que se encargan de modificar valores de los atributos, coloca el prefijo set seguido del nombre del atributo. Ej: En nuestro ejemplo, en lugar de escribir modificarEdad deberamos colocar setEdad. Si el mtodo va a devolver un valor lgico, el nombre del mtodo debera escribirse como si fuese una pregunta al objeto. Ej: esMayorDeEdad ?
53
54
Ejemplo:
String s = per.saludar(); per.setEdad(13); String nom = per.getNombre();
55
Colecciones de Objetos
Una coleccin de objetos es sencillamente un conjunto de cosas del mismo tipo. Esta idea de agrupar cosas no es nueva para ti. Ya conoces el significado de estas expresiones: un juego de libros, una coleccin de sellos, una cadena de tiendas, un conjunto de ejercicios. Algunas veces utilizamos otras palabras tales como rebao, manada, cuadrilla, equipo, compaa, grupo, club, clase o familia para referirnos a colecciones y conjuntos. T mismo eres un elemento de grupo o conjunto tales como stos: tu familia o tu clase. En Java, existen colecciones de objetos que tambin son considerados otros objetos, estn modelados por clases o por estructuras primitivas. ArrayList es una clase que modela a un grupo especial de colecciones.
La clase ArrayList
La clase ArrayList almacena un conjunto de objetos del mismo tipo a manera de lista. Java tiene una suite completa de objetos Collection que almacenan objetos de varias maneras. ArrayList es el tipo de coleccin ms famoso y comnmente usado.
add(x) isEmpty()
13 7
0 1
11 23 19 2
2 3 4 5
get(pos)
size()
56
A continuacin presentaremos los constructores y mtodos ms importantes de esta clase, para un detalle ms exacto y completo revisar los JAVADOCS.
Constructores
Constructor
ArrayList() ArrayList(int)
Descripcin
Construye una lista vaca con una capacidad inicial de 10. Construye una lista vaca con una capacidad inicial especificada.
Mtodos
Tipo de retorno
boolean void E void boolean E int
Descripcin
Aade el elemento dado al final de la lista. Aade el elemento dado en la posicin especificada. Retorna el elemento de la posicin dada Establece un nuevo elemento E en la posicin especificada. Verifica si la lista est vacia. Remueve el elemento de la posicin dada. Retorna el nmero de elementos de la lista.
11
2
Cada elemento ocupa una posicin en el ArrayList que es accedida mediante un ndice que empieza en 0.
11
1
Existen otras clases que modelan colecciones de objetos como HashMap, HashSet, Vector, etc. todas ellas propias de Java. Tambin existen estructuras primitivas para manejar conjuntos de elementos conocidas como arreglos.
58
La Composicin La Herencia
59
60
Las subclases heredan caractersticas y mtodos de las superclases (excepto los constructores). Supongamos, por ejemplo, que tenemos la clase Aula y la clase Laboratorio definidas como sigue:
Las partes comunes se pueden agrupar en una misma clase, manteniendo las otras dos clases con las partes no comunes y heredando de esta nueva clase con la palabra reservada extends.
61
62
Recursividad
Definicin
Recursin es una tcnica de programacin en el cual un mtodo puede llamarse a s mismo. Esto seguramente suena como algo raro de hacer o un grave error del que escribi esto. Sin embargo, la recursin una de las ms interesantes y una de las tcnicas sorprendentemente efectivas en programacin. Algo es recursivo si se define en trminos de s mismo (cuando para definirse hace mencin a s mismo). Para que una definicin recursiva sea vlida, la referencia a s misma debe ser relativamente ms sencilla que el caso considerado. Ejemplo: definicin de un nmero natural.
El N 0 es natural. El N n es natural si n-1 lo es. En un algoritmo recursivo distinguimos como mnimo 2 partes:
Es la respuesta ms sencila a un problema. Es un caso donde el problema puede resolverse sin tener que hacer uso de una nueva llamada a s mismo. Evita la continuacin indefinida de las partes recursivas.
Relaciona el resultado del problema con resultados de casos ms simples. Se hacen nuevas llamadas a la funcin, pero estn ms prximas al caso base.
63
Ejemplo:
Por definicin matemtica, tambin sabemos que: 0! = 1 Con lo que tendramos las siguiente la siguiente definicin de factorial: n! = 1 n*(n-1)! Si n = 0 Otros casos
Caso base Parte recursiva
Un problema que puede resolverse de manera recursiva, debe tener por lo menos 1 caso base y 1 parte recursiva, sino no hay recursin.
64
Para ver ms o menos como funciona la recursividad, vamos a ver una analoga de como funciona la recursividad con el siguiente ejemplo:
65
66
Como en el ejemplo, las llamadas recursivas siempre tienden hacia el caso base, hasta la forma de solucionar ms fcil y una vez ahi, se van devolviendo los resultados de las llamadas hasta llegar a la llamada inicial. Ahora, para implementarlo en un lenguaje de programacin como Java, slo tenemos que traducir nuestros casos bases y partes recursivas:
Caso base Parte recursiva
1 n! = n*(n-1)!
Si n = 0 Otros casos
67
En Java tendramos un mtodo que recibe como parmetro un nmero y devuelve como resultado otro nmero:
public int factorial(int n) { if(n==0) return 1; else return n*factorial(n-1); }
Prueba de Escritorio
Veamos como podemos ver el funcionamiento de nuestro mtodo recursivo haciendo una pequea prueba de escritorio. Probemos intentando calcular el factorial de 4.
n
4 3 2 1 0
factorial(4)
4 * factorial(3) 3 * factorial(2) 2 * factorial(1) 1 * factorial(0) 1
A la IDA
Se ejecuta la parte recursiva Se ejecuta la parte recursiva Se ejecuta la parte recursiva Se ejecuta la parte recursiva Se ejecuta el caso base
A la VUELTA
Se devuelve el resultado de evaluar 4*6 = 24 Se devuelve el resultado de evaluar 3*2 = 6 Se devuelve el resultado de evaluar 2*1 = 2 Se devuelve el resultado de evaluar 1*1 = 1 Se devuelve 1
class Factorial { public int factorial(int n) { if(n==0) return 1; else return n*factorial(n-1); } }
class Principal { public static void main(String[] args) { Factorial f = new Factorial(); int res = f.factorial(4); System.out.println(res); //24 } }
68
Tipos de Recursin
Recursividad Simple
Aquella en cuya funcin slo aparece una llamada recursiva. Se puede transformar con facilidad en algoritmos iterativos. Ej: factorial
public int factorial(int n) { if(n==0) return 1; else return n*factorial(n-1); } public int factorial(int n) { int f=1; for (int i = 1; i <= n; i++) f=f*i; return f; }
Recursividad Mltiple
Se da cuando hay ms de una llamada a s misma dentro del cuerpo de la funcin, resultando ms difcil de hacer de forma iterativa. Ej: Fibonacci.
public int fibonacci(int n) { if(n==1) return 0; if(n==2) return 1; else return fibonacci(n-1)+fibonacci(n-2); }
Recursividad Anidada
En algunos de los argumentos de la llamada hay una nueva llamada a s misma. Ej: La funcin de Ackerman:
public int ackerman (int m, int n) { if (m == 0) return n+1; if (n == 0) return ackerman(n-1, 1); else return ackerman( m-1, ackerman(m, n-1) ); }
69
70
b) Progreso:
Para los casos que deben resolverse recursivamente, la llamada recursiva siempre debe tender hacia un caso base.
Esta regla nos asegura que las llamadas recursivas no se alejen del caso base, ms al contrario se dirijan hacia l.
c) Regla de diseo:
Todas las llamadas recursivas funcionan correctamente.
Esta regla es importante porque significa que cuando se disean programas recursivos, generalmente no es necesario conocer los detalles del funcionamiento interno si se tiene que rastrear la gran cantidad de llamadas recursivas. Con frecuencia, es en extremo difcil seguir la secuencia real de llamadas recursivas. Por supuesto, en muchos casos esto indica el buen uso de la recursin, ya que la computadora se usa para encargarse de los detalles complicados.
71
public int fibonacci(int n) { if(n==1) return 0; if(n==2) return 1; else return fibonacci(n-1)+fibonacci(n-2); }
El anterior programa halla el ensimo nmero de la serie de fibonacci: 0, 1, 1, 2, 3, 5, 8, etc. Para una llamada: fibonacci(4) = fibonacci(3) + fibonacci(2) fibonacci(3) = fibonacci(2) + fibonacci(1) Y como vemos para este caso sencillo, existe doble llamada recursiva para hallar el fibonacci(2).
1 2 3 4 5 6 7 ...
72
La Pila de Recursin
La memoria del ordenador se divide (de manera lgica, no fsica) en varios segmentos:
Segmento de cdigo: Parte de la memoria donde se guardan las instrucciones del programa en cdigo mquina. Segmento de datos: Parte de la memoria destinada a almacenar las variables estticas. Montculo: Parte de la memoria destinada a las variables dinmicas. Pila del programa: Parte destinada a las variables locales y parmetros de la funcin que est siendo ejecutada.
Anlisis de Algoritmos
Definicin
Algoritmo es sinnimo de procedimiento computacional y es fundamental para las ciencias de la computacin1. Un algoritmo es una secuencia finita de instrucciones, cada cual con un significado concreto y cuya ejecucin genera un tiempo finito. Un algoritmo debe terminar en un tiempo finito. Algoritmo es toda receta, proceso, rutina, mtodo, etc. que adems de ser un conjunto de instrucciones que resuelven un determinado problema, cumple las siguientes condiciones: 1. Ser finito. La ejecucin de un algoritmo acaba en un tiempo finito; un procedimiento que falle en la propiedad de la finitud es simplemente un procedimiento de clculo. 2. Ser preciso. Cada instruccin de un algoritmo debe ser precisa; deber tenerse en cuenta un rigor y no la ambigedad, esta condicin es la definibilidad: cada frase tiene un significado concreto. 3. Posee entradas. Las entradas se toman como un conjunto especfico de valores que inicializan el algoritmo. 4. Posee salida. Todo algoritmo posee una o ms salidas; la salida es la transformacin de la entrada. 5. Ser eficaz. Un algoritmo es eficaz cuando resuelve el problema. 6. Ser eficiente. Un algoritmo es eficiente cuando resuelve el problema de la mejor manera posible, o sea utilizando la mnima cantidad de recursos.
74
Una vez que tenemos un algoritmo que resuelve un problema y podemos decir que es de alguna manera correcto, un paso importante es tener idea de la cantidad de recursos, como tiempo de procesador o espacio en la memoria principal que requerir. El objetivo de este captulo es:
Conocer los factores que influyen en la eficiencia de un algoritmo. Aprender a calcular el tiempo que emplea un algoritmo. Aprender a reducir el tiempo de ejecucin de un programa de das o aos a fracciones de segundo.
El Hardware
Por ejemplo: procesador, frecuencia de trabajo, memoria, discos, etc.
El Software
Por ejemplo: sistema operativo, lenguaje de programacin, compilador, etc.
La longitud de entrada
El enfoque matemtico considera el tiempo del algoritmo como una funcin del tamao de entrada. Normalmente, se identifica la longitud de entrada (tamao de entrada), con el nmero de elementos lgicos contenidos en un ejemplar de entrada, por ejemplo: en un algoritmo que calcula el factorial de un nmero, la longitud de entrada sera el mismo nmero, porque no es lo mismo calcular el factorial de 4 que calcular el factorial de 1000, las iteraciones que tenga que hacer el algoritmo depender de la entrada. De igual manera se puede considerar como longitud de 75
entrada: al tamao de un arreglo, el nmero de nodos de una lista enlazada, el nmero de registros de un archivo o el nmero de elementos de una lista ordenada). A medida que crece el tamao de un ejemplar del programa, generalmente, crece el tiempo de ejecucin. Observando cmo vara el tiempo de ejecucin con el tamao de la entrada, se puede determinar la tasa de crecimiento del algoritmo, expresado normalmente en trminos de n, donde n es una medida del tamao de la entrada. La tasa de crecimiento de un problema es una medida importante de la eficiencia ya que predice cunto tiempo se requerir para entradas muy grandes de un determinado problema. Para que un algoritmo sea eficiente, se debe optimizar el tiempo de ejecucin y el espacio en la memoria, aunque se producir la optimizacin de uno a costa del otro.
Anlisis de Algoritmos
El anlisis de algoritmo que hacemos en este captulo toca nicamente el punto de vista temporal ( tiempo de ejecucin de un algoritmo) y utilizamos como herramienta el lenguaje de programacin Java. Es difcil realizar un anlisis simple de un algoritmo que determine la cantidad exacta de tiempo requerida para ejecutarlo. La primera complicacin es que la cantidad exacta de tiempo depender de la implementacin del algoritmo y de la mquina real en que se ejecuta. El anlisis normalmente debe ser independiente de la computadora (hardware y software) y del lenguaje o mquina que se utilice para implementar el algoritmo. La tarea de calcular el tiempo exacto requerido suele ser bastante pesado.
Elementos de un algoritmo
Un algoritmo es un conjunto de instrucciones ordenados de manera lgica que resuelven un problema. stas instrucciones a su vez pueden ser: enunciados simples (sentencias) o enunciados compuestos (estructuras de control). El tiempo de ejecucin depender de como est organizado ese conjunto de instrucciones, pero 76
nunca ser constante. Es conveniente utilizar una funcin T(n) para representar el nmero de unidades de tiempo tomadas por un algoritmo de cualquier entrada de tamao n. Ahora bien, para calcular el T(n) de un algoritmo, vamos a ver cmo calcular el tiempo de ejecucin de las instrucciones que podra tener un algoritmo.
Podramos calcular minuciosamente el tiempo de ejecucin, pero es una tarea que se la dejamos a los grandes matemticos que hacen clculos precisos, pero para nosotros todo enunciado simple se ejecutar en 1 (una unidad de tiempo que podra ser 1 segundo o 1 nanosegundo...) y listo :). Ejemplo:
1 2 3 4 5 6 7 8 9 10
//Algoritmo para mostrar el mayor de 2 # enteros positivos. //Sin utilizar estructuras de control :) a = in.nextInt(); b = in.nextInt(); m = (Math.abs(a+b)+Math.abs(a-b))/2; System.out.println("El mayor es: "+m);
1 1 1 1
77
Haremos un repaso de la sintaxis y semntica operacional que sea general para otros lenguajes de programacin.
Selectivas
IF
Sintaxis:
Cabecera: if(<expresin lgica>) Cuerpo:
{ //instrucciones }
Semntica: Si el resultado de evaluar la expresin lgica de la cabecera es verdad entonces se ejecutan las instrucciones del cuerpo.
Ahora bien, cmo calculamos su tiempo de ejecucin? Pues como en el caso de las sentencias simples diremos que la cabecera se ejecuta en 1 unidad de tiempo y luego calculamos el tiempo de ejecucin del cuerpo. Cabecera: if(<expresin lgica>) Cuerpo:
{ //instrucciones }
1 Tc(n)
78
Ejemplo:
1 2 3 4 5 6 7 8 9 10 //Algoritmo para mostrar el valor absoluto de un # leido del teclado x = LeerTeclado.readInt(); if(x<0) { x = -x; } System.out.println("El valor absoluto es: "+x);
1 1 1 1
el mejor de los casos (cuando se ejecuta la menor cantidad de instrucciones) y el peor de los casos (cuando se ejecuta la mayor cantidad de instrucciones)
Para nuestro ejemplo anterior el tiempo de ejecucin sera: MEJOR DE LOS CASOS: PEOR DE LOS CASOS: T(n) = 3 T(n) = 4
Normalmente suele hacerse el anlisis del tiempo de ejecucin tomando en cuenta el peor de los casos ya que estaramos subestimando al algoritmo si nos basaremos en el mejor de los casos. 79
A partir de ahora todo nuestro anlisis ser har en base al peor de los casos.
1 Tc(n)
Tif(n) = 1 + Tc(n)
IF-ELSE
Sintaxis:
Cabecera: if(<expresin lgica>)
{
Semntica: Si el resultado de evaluar la expresin lgica de la cabecera es verdad entonces se ejecutan las instrucciones del cuerpo if en caso contrario se hacen las instrucciones del cuerpo else.
Cmo calcular el tiempo de ejecucin de una estructura if-else? Pues como nuestro anlisis es en el peor de los casos, tomamos en cuenta el mayor de los tiempos de ejecucin del cuerpo if y del cuerpo else. Cabecera: Cuerpo del if:
if(<expresin lgica>) { //instrucciones } else { //instrucciones }
1 TcIf(n)
TcElse(n)
Tif-else(n) = 1 + MAX(TcIf(n),TcElse(n)) 80
Ejemplo:
1 2 3 4 5 6 7 8 9 10 11 //Algoritmo que muestra ordenado de forma descendente 2 nmeros. if(x>y) { System.out.println(x+,+y); } else { System.out.println(Los nmeros son); System.out.println(y+,+x); }
1 1
1 1
81
Repetitivas
FOR
Sintaxis:
Cabecera: for(<inicializacin>; <expresin lgica>; <actualizacin>) Cuerpo:
{ //instrucciones }
Semntica: Se realiza la instruccin de inicializacin, luego se evala la expresin lgica, si sta es verdadera entonces se realizan las instrucciones del cuerpo, despus se pasa a la actualizacin de variable y vuelve a evaluarse la expresin lgica.
Cmo calcular el tiempo de ejecucin de una estructura de control for? Para realizar nuestro anlisis, consideraremos que un for tiene bsicamente 2 partes: una cabecera y un cuerpo. Estableceremos una frmula que nos dir cuantas veces se ejecuta la cabecera porque conociendo cuantas veces lo hace podemos saber cuantas veces entra hacer las instrucciones de su cuerpo.
x *(x-1)
Tc(n)
Si decimos que la cabecera se ejecuta un nmero x de veces entonces se entrarn a hacer las instrucciones del cuerpo x-1 veces. x= distancia 2 valor que actualiza
Donde distancia es lo que recorre la variable para llegar desde la inicializacin hasta ya no cumplir la expresin lgica. Tfor(n) = x + Tc(n)*(x-1) 82
Ejemplo:
1 2 3 4 5 6 7 8 //programa que muestra los nmeros naturales de 1 hasta n for (int i = 1; i <= n; i++) { System.out.println(i); }
El problema se reduce a conocer cuantas veces se ejecuta la cabecera del for. Veamos algunos pasos para saber este valor: 1. Conocer la distancia que recorre la variable i. Como i se mueve desde 1 hasta n, entonces la distancia sera n-1. 2. Conocer el valor que actualiza. La variable i se incrementa de 1 en 1, entonces el valor que actualiza es 1. 3. Reemplazar en la frmula el valor de la distancia y el valor que actualiza: distancia n1 2 ==> x= 2 ==> x=n1 valor que actualiza 1 Tfor(n) = x + Tc(n)*(x-1) Tfor(n) = (n-1) + 1*( (n-1) 1 ) Tfor(n) = 2n-3
x=
83
WHILE
Sintaxis:
Cabecera: while(<expresin lgica>) Cuerpo:
{ //instrucciones }
Semntica: Se evala la expresin lgica, si sta es verdad se ejecutan las instrucciones de su cuerpo y luego se regresa a evaluar la cabecera nuevamente. Esto se repite mientras la expresin lgica sea verdadera.
Para calcular el tiempo de ejecucin de un while, tambin es importante conocer las veces que se ejecuta su cabecera y las veces que entrar a realizar su cuerpo ser una vez menos.
x Tc(n) *(x-1)
Twhile(n) = x + Tc(n)*(x-1)
84
DO - WHILE
Sintaxis:
do {
Semntica: Se ejecutan las instrucciones del cuerpo y luego recin se eval la expresin lgica de la cabecera, si sta es verdad se ejecutan las instrucciones de su cuerpo nuevamente. Esto se repite mientras la expresin lgica sea verdadera.
Una estructura de control do-while se diferencia de un while en que las veces que entra a su cuerpo y las veces que evala su cabecera siempre van a ser lo mismo.
do {
*x x
Tdo-while(n) = x + Tc(n)*x
85
86
c*g(n)
T(n)
f(n)
El orden de magnitud es ampliamente utilizado para caracterizar los tiempos de ejecucin en trminos de la longitud de entrada n, el cual vara de problema en problema, pero es usualmente una nocin intuitiva del tamao del problema. Asimismo, el orden de magnitud nos permite ignorar factores constantes y trminos de orden menor y apuntar a los componentes principales de una funcin que influyen en su crecimiento. Cuando se dice que f(n) es del O(g(n)), se est garantizando que la funcin f(n) crece a una velocidad no mayor que g(n); as g(n) es una cota superior de f(n).
87
Estructuras de Datos
Definicin
Una estructura de datos es un conjunto de elementos, del mismo tipo, que se relacionan entre s y que se pueden operar como un todo. El componente bsico de la estructura de datos es la celda; las estructuras de datos se implementan a travs de los lenguajes (en nuestro caso, lo haremos con Java), y son un modelo que caracteriza y permite almacenar y utilizar una determinada organizacin de datos.
Operaciones
Sobre una estructura de datos se puede efectuar diferentes tipos de operaciones, entre las ms importantes estn:
Bsqueda.
Permite determinar si un elemento se encuentra o no en la estructura.
Consulta de la informacin.
Permite obtener informacin de uno o ms elementos de la estructura.
88
Prueba.
Permite determinar si uno o varios elementos cumplen determinadas condiciones.
Modificacin.
Permite variar parcial o totalmente el contenido de la informacin de los elementos de la estructura.
Insercin.
Es aquella mediante la cual se incluye un nuevo elemento en la estructura.
Eliminacin.
Como su nombre lo indica, es la que permite suprimir elementos de la estructura.
Verificar si es vaca
Permite determinar si existen o no elementos sobre la estructura.
89
Clasificacin
Estructuras de Datos Interna y Externa
Si una estructura de datos reside en la memoria central de la computadora se denomina estructura de datos interna. Recprocamente, si reside en un soporte externo, se denomina estructura de datos externa. Las estructuras de datos internas pueden ser de dos tipos:
La reorganizacin de sus elementos, si sta implica mucho movimiento puede ser muy costosa. Ejemplo: insertar un dato en un arreglo ordenado. Son estructuras de datos estticas, es decir, el tamao ocupado en memoria es fijo, el arreglo podra llenarse y si se crea un arreglo de tamao grande se estara desperdiciendo memoria.
90
A su vez, este tipo de estructuras se pueden dividir en dos grandes grupos segn la forma en la cual se ordenan sus elementos.
Lineales No lineales
LINEALES
NO LINEALES
rboles Grafos
Objetivos
El objetivo del presente captulo es hacer nfasis en tres aspectos:
Presentar las diferentes estructuras de datos. Desarrollar habilidades necesarias en ti, para construir los algoritmos que manipulan de manera eficiente estas estructuras. Y por ltimo, que seas capaz de seguir una metodologa para disear (definir y justificar) las estructuras de datos ms adecuadas para resolver un problema.
91
Listas: podemos acceder (insertar y eliminar) por cualquier lado. Pilas: slo tiene un nico punto de acceso fijo a travs del cual se aaden, se eliminan o se consultan elementos. Colas: tiene dos puntos de acceso, uno para aadir y el otro para consultar o eliminar elementos.
Listas
Una lista en su sentido amplio, es un conjunto de elementos del mismo tipo donde cada elemento tiene un nico predecesor (excepto el primero) y un nico sucesor (excepto el ltimo) y cuyo nmero de elementos es variable. S = {a, b, c, d,. . . z} Ejemplo: Una lista de letras
Operaciones
Entre las operaciones permitidas estn: Verificar si es vaca. Insertar, eliminar o localizar un elemento. Determinar el tamao de la lista. Etc. En fin, una lista podra tener todo tipo de operaciones que le permitan ser manipulada como un arreglo por ejemplo.
92
Veamos dos maneras de definir e implementar a una lista. La primera, trata de una definicin recursiva de la lista y la segunda, se basa en el concepto de celda o nodo1.
Definicin recursiva.
En esta forma de implementacin, una lista puede definirse como un dato seguido de otra lista o como vaca. Ejemplo: La lista [1, 2, 3] de manera recursiva puede verse as: [1, 2, 3] = 1 -> [2,3] : 1 seguido de la lista [2, 3] [2, 3] = 2 -> [3] : 2 seguido de la lista [3] [3] = 3 -> [ ] : 3 seguido de una lista vacia De manera grfica: a) Lista vaca
b) Lista no vaca
dato
Lista siguiente
Entonces una lista tiene como atributos a un dato 2 y la referencia a la siguiente lista. Lista vaca: Cuando el dato y la referencia siguiente no existen (son null). Lista no vaca: Cuando existe el dato y la siguiente lista por lo menos es vaca.
1 Algo que explicaremos ms adelante. 2 Que puede ser de cualquier tipo, dependiendo de que tipos de datos querramos almacenar en nuestra lista (nmeros, caracteres, etc)
93
Ahora pensemos en la implementacin; si quisieramos una lista de nmeros enteros, entonces el tipo de dato del dato de la lista sera int o Integer. De igual manera si quisieramos que la lista almacene cadenas, entonces el tipo sera String, y si quisieramos objetos personas, pues sera Persona y as sucesivamente. Nos conviene colocar el tipo de dato como Object1 ya que de esa manera permitimos que pueda almacenarse todo tipo de elementos (nmeros, caracteres, objetos en general). El modelo UML sera el siguiente:
Y su implementacin:
public class Lista { private Object dato; private Lista sig; public Lista() { dato = null; sig = null; } public boolean vacia() { return sig == null; } public void insertarFinal(Object x) { if (vacia()) { dato = x; sig = new Lista(); } else sig.insertarFinal(x); } [...] } 1 Esto se debe a que Object es la superclase de todas las clases en Java.
94
La clase Lista.java
Constructores
/** * Constructor por defecto, crea una lista vacia. */ public Lista() { dato = null; sig = null; } /** * Crea una lista con un slo dato. * @param d es el nico dato de la lista. */ public Lista(Object d) { dato = d; sig = new Lista(); } /** * Crea una lista a partir de otra * @param otra */ public Lista(Lista otra) { dato = otra.dato; sig = otra.sig; }
Mtodos
Verificar si es vaca
/** * Verifica si la lista est vaca. * Una lista est vaca, cuando el dato * y la referencia a la siguiente lista son null. */ public boolean vacia() { return dato==null&&sig == null; }
95
96
97
98
99
Podramos parar ahi la implementacin de mtodos y ver un ejemplo de utilizacin de la lista. Por ejemplo, crear una lista y llenarla. con qu?, pues con lo que sea, recuerda que es una lista de objetos.
[...] Lista lista = new Lista(); lista.insertarFinal("Hola Nena"); lista.insertarFinal(13); lista.insertarFinal(true); System.out.println(lista); [...]
Y con esto tendramos una lista, parecida a esto: [ "Hola Nena", 13, true] 0 1 2 Como ves, podemos insertar cualquier tipo de objeto sobre sta lista, y vemos que cada elemento, ocupa una posicin dentro de la lista siguiendo el estndar de Java para los ndices, el primer elemento est en la posicin 0, el segundo en la posicin 1 y as sucesivamente. Pero que tal si quisieramos obtener un elemento de la lista, por ejemplo el primero. Entonces nuestro cdigo inocente sera algo como esto:
[...] String x = lista.obtener(0); -> Error, un object no es un String [...]
Tendramos un error, pues recordemos que lo que devuelve el mtodo obtener, es un Object y no un String como pensabamos, bueno, pero eso se puede arreglar as:
[...] String x = (String)lista.obtener(0); [...]
Lo arreglamos haciendo una simple conversin de tipos (casting). La ventaja de tener una lista de objetos, es tener una lista que puede 100
almacenar todo tipo de datos, nmeros, caracteres, etc. La desventaja es a la hora de acceder a esos datos, no saber exactamente a que tipo de dato estamos accediendo. La siguiente lnea muestra un ejemplo claro de esto:
[...] String x = (String)lista.obtener(1); [...]
Este cdigo compila correctamente, intentamos obtener el segundo elemento de la lista, pero al ejecutar el cdigo nos aparece el siguiente error:
java.lang.ClassCastException: java.lang.Integer [...]
Que significa que el casting que intentabamos hacer no es vlido. Esto es debido a que si nos fijamos que elemento realmente est en la posicin 1, vemos que no es una cadena sino un entero y lo estamos obligando a que sea cadena, esto no lo permite Java. Una solucin no muy buena (psima) para el anterior problema, sera tener una implementacin especfica para cada tipo de dato. Si quisieramos una lista de nmeros enteros, entonces en nuestra anterior implementacin modificar el tipo de dato de Object a int y trabajar todas las operaciones para este tipo de dato; el problema de hacerlo de esta manera es que tendramos una implementacin de lista para cada diferente tipo de dato. Una solucin mejor, y ahora posible de hacerlo en Java desde la versin 1.5 es parametrizar el tipo de dato de nuestra estructura.
101
Haremos otra implementacin de lista con parametrizacin de tipo. O sea una Lista<E> donde E1 es el parmetro genrico formal de cualquier tipo.
public class Lista<E> { private E dato; private Lista<E> sig; public Lista() { dato=null; sig=null; } public boolean vacia(){ return sig==null; } public void insertarFinal(E x) { if(vacia()) { dato = x; sig = new Lista<E>(); } else sig.insertarFinal(x); } public int tamao() { if(vacia())return 0; return 1 + sig.tamao(); } public E obtener(int pos) { if(vacia())return null; if(pos==0)return dato; return sig.obtener(pos-1); } [...] }
Ahora, si necesitamos tener una lista para manejar enteros y que todas sus operaciones sean para enteros, escribimos lo siguiente:
1 Podra haber sido cualquier letra o palabra, es una variable.
102
[...] Lista<Integer> lista = new Lista<Integer>(); lista.insertarFinal(13); lista.insertarFinal("Hola"); -> Error de compilacin, el mtodo insertarFinal [...] de Lista<Integer> slo acepta nmeros enteros
13
21
Y dependiendo de los enlaces y como se los tenga, podemos tener una lista de simple enlace, lista de doble enlace, lista de simple enlace circular o lista de doble enlace circular.
13
inicio
17
23
Los nodos de la lista son enlazados por medio de los campos enlaces. El ltimo nodo de una lista de simple enlace, por definicin no tiene siguiente o no existe o en trminos de programacin es NULL. 103
A continuacin se muestra la implementacin de un Nodo de simple enlace genrico, esto para poder parametrizar el tipo de dato de dato.
class Nodo<E> { private E dato; private Nodo<E> sig; public Nodo(E n) { dato = n; sig = null; } public E getDato() { return dato; } public Nodo<E> getSig() { return sig; } public void setDato(E x) { dato=x; } public void setSig(Nodo<E> x) { sig=x; } }
104
Para tener una lista enlazada con estos nodos, basta con tener la referencia solamente del primero, al igual que para sostener un conjunto de pelotitas enlazadas solo tenemos que agarrarnos de la primera pelotita.
105
Estructuras de Datos en Java Estructuras de Datos Lineales class ListaSE<E> { private Nodo<E> inicio; [...] }
La clase ListaSE.java
Constructor
/** * Crea una lista vacia * */ public ListaSE() { inicio = null; }
Mtodos
Verificar si es vaca
/** * Verifica si la lista est vacia * @return el resultado de ver si la lista est vaca */ public boolean vacia(){ return inicio==null; }
106
107
108
Algo que cabe resaltar en esta nueva implementacin es el hecho de que no usamos recursividad para realizar los mtodos ya que no es necesario, algo que no se puede evitar en la definicin recursiva de Lista.
13
inicio
23
17
33
fin
Los nodos de la lista son enlazados por medio de los campos enlaces. El ltimo nodo de una lista de doble enlace, no tiene siguiente y el primer nodo de la lista no tiene anterior. Veamos una implementacin de nodo de doble enlace:
109
Estructuras de Datos en Java Estructuras de Datos Lineales class NodoD<E> { private E dato; private NodoD<E> sig; private NodoD<E> ant; public NodoD(E n) { dato = n; sig = null; } public E getDato() { return dato; } public void setDato(E x) { dato=x; } public NodoD<E> getSig() { return sig; } public void setSig(NodoD<E> x) { sig=x; } public NodoD<E> getAnt() { return ant; } public void setAnt(NodoD<E> ant) { this.ant = ant; } }
110
La clase ListaDE.java
class ListaDE<E> { private NodoD<E> inicio, fin; [...] }
Constructor
/** * Constructor por defecto, crea una lista vacia. */ public ListaDE() { inicio = null; fin = null; }
Mtodos
Insertar un elemento al inicio
/** * * @param x El elemento a insertar */ public void insertarInicio(E x) { NodoD<E> nuevo = new NodoD<E>(x); if(vacia()) fin = nuevo; else { nuevo.setSig(inicio); inicio.setAnt(nuevo); } inicio = nuevo; }
111
112
113
114
13
inicio
17
23
7
fin
Las listas circulares presentan las siguiente ventajas respecto de las listas enlazadas simples:
Cada nodo de una lista circular es accesible desde cualquier otro nodo de ella. Es decir, dado un nodo se puede recorrer toda la lista completa. Las operaciones de concatenacin y divisin de listas son ms eficaces con listas circulares.
115
La clase ListaSEC.java
Constructor
/** * Crea una lista vacia * */ public ListaSEC() { inicio = fin = null; }
Mtodos
Verificar si es vaca
/** * Verifica si la lista est vacia * @return el resultado de ver si la lista est vaca */ public boolean vacia(){ return inicio==null&&fin==null; }
116
117
13
inicio
23
17
33
fin
La clase ListaDEC.java
Constructor
/** * Crea una lista vacia * */ public ListaDEC() { inicio = fin = null; }
118
Mtodos
Verificar si es vaca
/** * Verifica si la lista est vacia * @return el resultado de ver si la lista est vaca */ public boolean vacia() { return inicio==null&&fin==null; }
119
/** * * @param x El nuevo elemento */ public void insertarFinal(E x) { NodoD<E> nuevo = new NodoD<E>(x); if(vacia()) { inicio = nuevo; fin = nuevo; } else { fin.setSig(nuevo); nuevo.setAnt(fin); fin = nuevo; } inicio.setAnt(fin); fin.setSig(inicio); }
120
Pilas
Una pila es un concepto aplicable sobre estructuras de datos lineales, en la que la insercin y eliminacin de datos se realiza slo por un extremo denominado cima o tope. Podemos hacernos una imagen ms grfica, pensando en una pila de bandejas en una cafetera, una pila de platos en un fregadero, una pila de latas en un expositor de un supermercado: en cualquiera de estos ejemplos, los elementos se retiran y se aaden por un mismo extremo. En una pila de platos podramos intentar retirar uno de los intermedios con el consiguiente peligro de derrumbe. Sin embargo, en una estructura de datos de tipo pila, esto no es posible. El nico elemento de la pila que podemos retirar es el situado en el tope de la misma, y si queremos retirar otro, ser necesario previamente haber borrado todos los situados "por encima" de l. Las pilas siguen la filosofa LIFO (Last In First Out), porque su caracterstica principal es que el ltimo en Entrar es el Primero en Salir (UEPS). Se define el tope o cima de la pila al nico dato visible de la estructura que sera el ltimo que se coloc (el que est encima).
Operaciones
Entre las operaciones permitidas estn: Verificar si es vaca (empty) Insertar un dato sobre la pila (push) Eliminar un dato de la pila (pop) Inspeccionar la cima (top)
121
Veamos mediante un ejemplo grfico, como cambia el contenido de una pila conforme aplicamos sucesivamente las operaciones de insercin y eliminacin: a) Pusheando (apilando) elementos sobre la pila
En el ejemplo anterior podemos observar que el tope (el elemento que est encima de todos) vara si operamos sobre la pila (si aadimos o eliminamos elementos). Si la pila est vaca, es decir, si no tiene ningn elemento, no hay tope o no est definido. Las operaciones sobre las pilas deberan tardar una cantidad constante de tiempo en ejecutarse, independientemente del nmero de elementos apilados. De forma anloga, encontrar el peridico de hoy en una pila de peridicos es rpido, independientemente de lo alta que se la pila. Sin embargo, el acceso arbitrario a una pila no se soporta de forma eficiente, por lo que no se cataloga como opcin. Lo que hace que las pilas sean tiles es que hay muchas aplicaciones en las que slo es necesario acceder al elemento ms recientemente insertado.
122
A continuacin se muestra una implementacin de Pila dinmica, recursiva, genrica y adems no heredable (esto por hacer respetar el concepto de pila).
public final class Pila<E> { private E tope; private Pila<E> resto; public Pila() { tope = null; resto = null; } private Pila(Pila<E> otra) { tope = otra.tope; resto = otra.resto; } public boolean empty() { return tope==null&&resto==null; } public void push(E x) { resto = new Pila<E>(this); tope = x; } public E pop() { E res=null; if(!empty()) { res = tope; tope = resto.tope; resto = resto.resto; } return res; } public E top() { return tope; } }
123
Llamadas a mtodos.- Cuando se realizan llamadas a mtodos, el programa principal debe recordar el lugar donde se hizo la llamada, de modo que pueda retornar all cuando el mtodo se haya terminado de ejecutar. Almacenamiento temporal de pginas Web.- Los navegadores de Internet almacenan las direcciones de las pginas recientemente visitadas en una pila. Cada vez que un usuario visita un nuevo sitio, las direcciones son introducidas en la pila de direcciones. El navegador despus permite al usuario volver a las pginas visitadas previamente usando un botn. El mecanismo de deshacer-rehacer en los editores de texto.- Los editores de texto utilizan usualmente un mecanismo de deshacer (undo) que cancela las operaciones editadas actualmente para volver a las operaciones previas. Para ello se utiliza una pila.
En general, las aplicaciones de esta estructura de datos sern aquellas en las que los datos se manejen de modo dinmico siguiendo una poltica LIFO.
124
Colas
El concepto de cola es ampliamente utilizado en la vida real. Cuando nos situamos ante la taquilla del cine para obtener nuestra entrada, o cuando esperamos en el autoservicio de un restaurante solemos hacerlo en una cola. Esto significa que formamos una fila en la que el primero que llega es el primero en obtener el servicio y salir de la misma. Esta poltica de funcionamiento se denomina FIFO (First In First Out), es decir, el primer elemento en entrar es el primer elemento en salir (PEPS).
En la vida real puede perfectamente ocurrir que alguien pretenda saltarse su turno en una cola, o incluso que abandone la misma antes de que le toque el turno. Sin embargo, en ambos casos se est incumpliendo la poltica de funcionamiento de la cola y, estrictamente hablando, sta deja de serlo. Las colas son otro tipo de concepto tambin aplicables sobre estructuras de datos lineales. En una cola las eliminaciones se realizan por el principio (inicio) y las inserciones se realizan en el otro extremo (fin). Se usan para almacenar datos que necesitan ser procesados segn el orden de llegada.
125
Existen varias formas de implementar a una cola , de forma esttica utilizando arreglos o bien, de manera dinmica utilizando el concepto de listas. De cualquier manera las operaciones sobre colas tambin deberan tardar una cantidad de tiempo constante en ejecutarse, independientemente del nmero de elementos que existan sobre ella.
Operaciones
Entre las operaciones permitidas estn: Verificar si es vaca Insertar un dato sobre la cola (encolar) Eliminar un dato de la cola (decolar) Inspeccionar el primero (primero) A continuacin se muestra la implementacin de Cola siguiendo el concepto de lista en base a nodos:
final class Cola<E> { private Nodo<E> inicio, fin; public Cola() { inicio = fin = null; }
public boolean vacia() { return inicio==null; } public void encolar(E n) { Nodo<E> nuevo = new Nodo<E>(n); if(vacia()) inicio = nuevo; else fin.setSig(nuevo); fin=nuevo; } public E decolar() { if(vacia())return null; E res=inicio.getDato(); inicio = inicio.getSig(); return res; } public E primero() { return vacia()?null:inicio.getDato(); } }
126
127
rboles: los elementos estn organizados como un verdadero rbol. Grafos: los elementos estn organizados como una red de datos.
rboles
En su sentido amplio, un rbol permite almacenar informacin y organizarla de forma que tengan sucesores o elementos siguientes, como hijos en una forma de las ramas de un rbol.
13 21 4
128
Todo el mundo tiene claro el concepto de rbol, al menos en su aspecto botnico. Sin embargo, los rboles no son slo eso de lo que estamos rodeados cuando nos perdemos en un bosque, sino que tambin se usan en otros muchos mbitos. As por ejemplo, todos hemos manejado alguna vez el concepto de rbol genealgico, o hemos visto clasificaciones jerrquicas como las del reino animal. En todos esos casos manejamos el concepto de rbol.
rbol genealgico
Algunos Conceptos
Raz.-Es el primer nodo del rbol y es por donde se accede a l (slo tiene sucesores), es decir, la cabeza del rbol siempre ser la raz. Nodo Hoja: Aquel nodo que no tiene hijos o sucesores. Nodo Interno.-Aquel nodo que tiene un antecesor y por lo menos un sucesor (ni raz ni hojas). Altura.- Es la cantidad de nodos que se recorren para llegar desde la raz hasta el nodo hoja ms alejado de todo el rbol.
129
Grado.- Cantidad mxima de hijos que puede tener cualquier nodo. Nivel.- Nmero de generaciones que se est de la raz. La raz est en un nivel = 0. Ruta.- Camino que se recorre para llegar de un nodo a otro. Subrbol.- Cualquier nodo puede ser considerado como la raz de un subrbol. Peso.- Es la cantidad de nodos hoja del rbol. Visita.- Cuando se accede al dato de un nodo. Recorrido.- Cuando se visita todos los nodos de un rbol en algn orden en especial. Nodo completo.- Un nodo es completo cuando tiene todos sus hijos o no tiene a ninguno. Arbol Completo.- Un rbol es completo cuando tiene todos sus nodos completos. Ejemplo:
raz La lnea punteada es una ruta.
A
B es el padre de D y E E es el hijo derecho de B
nivel 0
D es el hijo izquierdo de B
nivel 1
E
Un subrbol con F como su raz
nivel 2
nivel 3
H, E, I, J Y G son nodos hoja. La altura del anterior rbol es 4. De acuerdo al grado de un rbol, podemos hacer una clasificacin en: rboles binarios (grado=2) y n-arios (grado>2).
130
rboles Binarios
Los rboles binarios son un tipo especial de rbol donde cada nodo puede tener a lo mucho 2 hijos (grado = 2). Los dos hijos de cada nodo en un rbol binario son llamados hijo izquierdo e hijo derecho.
raz
izq
der
Operaciones
Entre las operaciones permitidas estn: Verificar si es rbol vaco. Insertar, eliminar o localizar un elemento. Determinar el tamao (nmero de elementos) de la estructura. Etc. Al igual que en listas, vamos a ver dos maneras de definir e implementar a un rbol. La primera, trata de una definicin recursiva y la segunda, se basa en el concepto de nodo.
Definicin recursiva.
En esta forma de implementacin, un rbol puede definirse como un dato (al que llamamos raz) seguido de un subrbol izquierdo y otro subrbol derecho.
131
13
1
rbol vaco: Cuando el rbol no tiene raz, ni izquierdo ni derecho. rbol no vaco: Cuando existe una raz y tiene 2 subrboles (por lo menos vacos). El modelo:
La clase ArbolB.java
public class ArbolB<E> { private E raiz; private ArbolB<E> izq; private ArbolB<E> der; [...] }
132
Constructor
/** * Construye un rbol binario vaco */ public ArbolB() { raiz = null; izq = null; der = null; }
Mtodos
Verificar si el rbol est vaco
/** * * @return El resultado de verificar si est vaco */ public boolean vacio() { return raiz==null&&izq==null&&der==null; }
133
134
Estas tres acciones repartidas en diferentes rdenes proporcionan los diferentes recorridos del rbol: preorden, enorden y postorden. Su nombre refleja el momento en que se visita el nodo raz.
Recorrido preorden
Visitar la raz Recorrer el subrbol izquierdo en preorden Recorrer el subrbol derecho en preorden
135
Recorrido enorden
Recorrer el subrbol izquierdo en enorden Visitar la raz Recorrer el subrbol derecho en enorden
Recorrido postorden
Recorrer el subrbol izquierdo en postorden Recorrer el subrbol derecho en postorden Visitar la raz
136
izq
der
137
raz
izq
der
NOTA P ara cualquier reclamo, sugerencia o jaln de orejas escrbeme al correo del proyecto ayukin@ gmail.com o a mi correo xjkwak@ gmail.com. E sta es una versin borrador y necesito de tu colaboracin para poder terminarlo as que no dudes en escribirme (es en serio). Atte. CD MT ltima actualizacin: 01-01-2009 (Feliz ao nuevo!!!)
138
Bibliografa
1. Data Structures and Algorithms in Java Mitchell Waite y Robert Lafore (1998) 2. Estructura de Datos y Algoritmos Allen Weiss Mark. Addison-Wesley (1995) 3. Estructuras de Datos y de la Informacin Andrs Muoz (Universidad de Chile 2003) 4. San Google - http://www.google.com
139