Vous êtes sur la page 1sur 34

UNIVERSIDAD DE CHILE FACULTAD DE CIENCIAS FSICAS Y MATEMTICAS DEPARTAMENTO DE CIENCIAS DE LA COMPUTACIN

Apuntes CC10A Introduccin a las ciencias de la computacin Andrs Faras R.

Tabla de contenidos

APUNTES CC10A..................................................................................1 INTRODUCCIN


A LAS CIENCIAS DE LA COMPUTACIN................................................1

ANDRS FARAS R..................................................................................1 TABLA


DE CONTENIDOS..............................................................................2

CAPTULO I FUNDAMENTOS DE LA PROGRAMACIN ORIENTADA

A OBJETOS..............................................................3

CAPTULO II EL LENGUAJE JAVA..................................................................................15 CAPTULO III ALGORITMOS DE CAPTULO IV ESTRUCTURAS

BSQUEDA........................................................................30

DE DATOS...........................................................................31

CAPTULO V TCNICAS AVANZADAS DE PROGRAMACIN ORIENTADAS

OBJETOS..........................................................32

NDICE.............................................................................................34

Captulo I
Fundamentos de la Programacin orientada a objetos
1 Introduccin
1.1 Un poco de historia Pero slo un poco!
En sus inicios, lo que hoy conocemos como Ciencias de la Computacin no era tal, es decir, no era una ciencia. En otras lenguas, tales como el francs, se refieren a esta ciencia utilizando la palabra informtica. En Espaa se les llama a los computadores ordenadoras, por que su principal objetivo es permitir la organizacin de la informacin de manera eficiente. La computacin giraba nicamente en torno a la informacin y a cmo manejarla de manera eficiente. Por supuesto, en aquella poca no era correcto referirse a la informtica como una ciencia. DEFINICIN I.1 CIENCIA DE LA COMPUTACIN La ciencia de la computacin es el estudio de las fundaciones tericas de la informacin y la computacin y sus implementaciones y aplicaciones en sistemas computacionales. La computacin es el acto de computar, de calcular, de estimar. La computacin ha estado fuertemente relacionada con lo que significa el realizar una serie de clculos de manera automatizada. La ciencia de la

computacin se refiere entonces a dos conceptos principales: el manejo de la informacin y la realizacin de clculos.

1.1.1 Computacin temprana


La herramienta ms antigua que se sabe que fue utilizada para el uso de la computacin es el baco, que se piensa fue inventado en Babilonia, alrededor del ao 2400 A.C. El estilo original de uso fue dibujando lneas en la arena con guijarros. Los bacos, en un diseo ms moderno, aun son usados en la actualidad como una herramienta de clculo. En 1115 A.C., fue inventado en la China anciana el carruaje con cambios. ste fue el primer mecanismo a cambios conocido que usara engranajes diferenciales, lo que sera mucho tiempo despus utilizado en los computadores anlogos. Los chinos tambin inventaron un baco ms sofisticado alrededor del segundo siglo A.C. durante la dinasta Han, que llamaron Suanpan (tambin conocido como el baco Chino). En el siglo 5 A.C. en la india antigua, el lingista Panini formul la gramtica de Sanskrit utilizando 3959 reglas conocidas como el Ashtadhyayi que era altamente sistematizado y tcnico. Panini utiliz meta-reglas, transformaciones y recursiones con tal sofisticacin que su gramtica tiene un poder de computacin (o de clculo) equivalente a una Mquina de Turing. El trabajo de Panini fue precursor de la teora formal de lenguajes modernos y precursor tambin a la computacin. En el ao 87 A.C. fue construido un mecanismo de engranajes llamado mecanismo de Antikythera. Se piensa que fue una calculadora para el movimiento de cuerpos celestes. Entre el ao 200 A.C. y el ao 400 D.C. matemticos de Jaina, en India, inventaron el logaritmo. Desde el siglo 13 D.C. las tablas de logaritmos fueron producidas por matemticos musulmanes. Alrededor del siglo 14 fueron inventados los nmeros flotantes por matemticos de Keralese, en el sur de India. Hoy los nmeros flotantes son utilizados para representar nmeros reales en un computador. Despus que Jhon Napier descubri los logaritmos con propsitos computacionales en los comienzos del siglo 16, hubo un perodo de progresos considerables por cientficos e inventores construyendo herramientas de clculo, es decir, calculadoras. El mismo Napier invent en 1617 lo que se llam los huesos de Napier, una especie de baco enriquecido. Muy poco despus apareci la primera regla de clculo.

Ninguno de los aparatos computacionales anteriores fueron realmente computadores en el sentido moderno de la palabra. Tom un avance considerable en matemticas y teora antes que los primeros computadores modernos fueran diseados.

1.1.2 Algoritmos
En el sptimo siglo, el matemtico hind Brahmagupta dio la primera explicacin del sistema numrico Hind-Arbico y utiliz el cero tanto como comodn y como un dgito decimal. Cerca del ao 835 D.C., el matemtico persa Al-Khwarizmi escribi el libro Sobre el clculo con nmeros Hinds que fue principalmente responsable por la difusin del sistema de numeracin Hind en el Medio-oriente y luego en Europa. Cerca del siglo XII, se tradujo este libro al latn: Algoritmi de numero Indorum. Estos libros presentaron nuevos conceptos para realizar una serie de pasos para lograr una tarea tal como la aplicacin sistemtica de la aritmtica al lgebra. Por la derivacin de su nombre se obtiene el trmino algoritmo.

1.1.3 Lgica Binaria


Alrededor del siglo III A.C. el matemtico indio Pingala invent el sistema numrico binario. En este sistema, utilizado aun hoy en da para procesos en todos los computadores modernos, una secuencia de ceros y unos (0s y 1s) pueden representar cualquier nmero. En 1703, Gottfried Leibniz desarroll la lgica en un sentido formal y matemtico con sus escritos sobre el sistema numrico binario. En este sistema, los 1s y 0s tambin representan los valores verdadero y falso o estados encendido y apagado. Sin embargo, tom ms de un siglo antes que George Boole publicara su lgebra buliana en 1854 con un sistema completo que permita modelar matemticamente los procesos computacionales. Para esta poca, el primer aparato mecnico guiado por un patrn binario ya haba sido inventado. La revolucin industrial haba apresurado la mecanizacin de muchas tareas, y esto incluy la tejedura. Las tarjetas perforadas controlaron el telar de Joseph Marie Jacquard en 1801, donde un hoyo perforado en la tarjeta indicaba un 1 binario y un punto no perforado indicaba un 0 binario. El telar de Jacquard estaba lejos de ser una computadora, pero ilustr que las mquinas conducidas por sistemas binarios.

1.1.4 El motor analtico


No fue sino hasta que Charles Babbage, considerado el padre de la computacin, que la era de los computadores modernos comenz a tomar forma con su trabajo en el Motor Analtico. El aparato, aunque nunca fuera construido exitosamente, tuvo todas las funcionalidades de un computador moderno en su diseo. Lo describi primero en 1837 ms de 100 aos antes que cualquier aparato similar fuera construido exitosamente. La diferencia entre el motor de Babbage y aparatos antecesores es simple: el lo dise para ser programado. Durante su colaboracin, el matemtico Ada Lovelace public el primer programa computacional en un comprensivo conjunto de notas en el motor analtico. Por este hecho, Lovelace es popularmente considerado el primer programador de computadores, aunque algunos estudios discuten que los programas publicados bajo su nombre fueron originalmente creados por Babbage.

1.1.5 Nacimiento de la ciencia de la computacin


Antes de 1920, los computadores eran operadores humanos que realizaban clculos. Usualmente ellos eran guiados por un fsico. Muchos miles de computadores fueron utilizados en el comercio, gobierno, e investigacin. La mayora de estos computadores eran mujeres, y ellas eran conocidas por tener un grado en clculo. Algunas realizaban cmputos astronmicos para calendarios. Despus de 1920, la expresin mquina computacional haca referencia a cualquier mquina que realizara el trabajo de un computador humano, especialmente aquellos en conformidad con mtodos efectivos de la Tesis de Church-Turing. Esta tesis establece que un mtodo matemtico es efectivo si ste pudiera ser determinado como una lista de instrucciones capaces de ser seguidas por un operador humano con un lpiz y un papel, por tanto tiempo como fuera necesario, y sin ingeniosidad o perspicacia. Las mquinas que computaron con valores continuos fueron conocidas como maquinarias anlogas. Usaban una mecnica que representaba cantidades numricas continuas, como el ngulo de un eje de rotacin o diferencia de potencial elctrico. La maquinaria digital, en contraste con la anloga, fue capaz de representar un estado de un valor numrico y almacenar cada dgito de ste. Las maquinarias digitales usaron diferentes motores o reguladores antes de la invencin de aparatos de memoria ms rpidos.

La frase mquina computacional se convirti gradualmente, despus de los fines de 1940, a slo computador en la medida que el principio de maquinaria electrnica fue comnmente utilizado. Estos computadores fueron capaces de realizar clculos que eran realizados anteriormente por los operadores humanos. Ya que los valores almacenados por mquinas digitales no estaban relacionados con propiedades fsicas como los aparatos anlogos, un computador lgico, basado en equipos digitales, fue capaz de hacer cualquier cosa que pudiera ser descrita como puramente mecnica. Alan Turing, conocido como el padre de la ciencia de la computacin, invent este tipo de computadores lgicos conocido como la Mquina de Turing, que evolucion posteriormente al computador moderno. Estos nuevos computadores tambin eran capaces de realizar computaciones no numricas, como la msica. Desde el tiempo cuando los procesos computacionales eran realizados por operadores humanos, el estudio de la computabilidad provoc el inicio de una ciencia cuyo objetivo consista en hacer evidente algo que no estaba explcitamente definido.

1.2 Programas y lenguajes de programacin


1.2.1 Programas computacionales e Instrucciones
Las operaciones bsicas o cmputos que poda realizar un computador en el contexto de un programa, son llamadas instrucciones. El diseo de los computadores modernos se definen considerando la existencia de una Unidad Central de Procesamiento1 (conocida popularmente como CPU) que es capaz de ejecutar un conjunto bien definido de instrucciones. Una instruccin hace referencia tpicamente a una operacin individual realizable por un procesador de un computador. El tipo de instrucciones que pueden ser ejecutadas por un procesador. No todos los computadores son iguales en cuanto a las instrucciones que pueden ejecutar. El conjunto de instrucciones que puede ejecutar un procesador est determinado por el conjunto de instrucciones arquitecturales2 de la plataforma. Este tipo de instrucciones son frecuentemente llamadas instrucciones de mquina, pues fueron
1

La Unidad Central de Procesamiento es una palabra cuyo origen es ingls: Central Process Unit, cuyo acrnimo es conocido universalmente: CPU.
2

El conjunto de instrucciones arquitecturales es conocido en ingls como Instructio Set Architecture, cuyo acrnimo es popularmente conocido como ISA.

diseadas para ser entendidas directamente por el procesador del computador. Una instruccin de mquina es representada por un nmero binario, es decir, una secuencia de 1s y 0s. Una parte de la instruccin, llamada opcode3, designa la instruccin que debe ser ejecutada por el procesador. Dado que el valor numrico de un opcode no es significativo para los humanos, los programadores pueden usar una breve abreviacin en vez del valor numrico para programar. EJEMPLO 1.1 INSTRUCCIN
EN

ASSEMBLER

La siguiente lnea de cdigo representa una instruccin perteneciente al conjunto de instrucciones para una arquitectura x86:
SHL AX, 01

La operacin se llama SHL, y AX, 01 son los llamados operandos. AX es el nombre de un registro de memoria, y 01 es una constante. En este ejemplo, SHL es una abreviacin mnemotcnica para Shift Left. Esta instruccin tiene como finalidad modificar el valor almacenado en el registro AX desplazndolo a la izquierda en el valor binario del segundo operando, es decir, 014. Arquitecturas x86 x86 o 80x86 es el nombre genrico de la primera arquitectura de un microprocesador desarrollada y manufacturada por Intel. La arquitectura x86 domina actualmente el mercado de los computadores de escritorio, computadores porttiles, y pequeos servidores. La arquitectura es llamada x86 porque los procesadores anteriores en esta familia fueron identificados por nmeros de modelos que terminaban con la secuencia 86: el 8086, el 80186, el 80286, el 386, y el 486. Debido a que Luego, habiendo construido un computador con un conjunto especfico de instrucciones, lo nico que queda es indicarle a la computadora lo que tiene que hacer en trminos de este conjunto de instrucciones. Las instrucciones que la computadora deba ejecutar eran especificadas una
3

La palabra opcode es la abreviacin de operation code, que hace referencia al cdigo de una operacin.
4

No es necesario entender el significado concreto de esta operacin, lo importante es comprender que las instrucciones tienen un valor que define la operacin y operandos.

despus de las otras, constituyendo una secuencia de instrucciones que recibe el nombre de programa. Como las computadoras modernas eran en un inicio construidas por distintos fabricantes no exista un estndar que indicara ni el nombre de las instrucciones ni la manera en que stas eran especificadas al computador. En consecuencia, cada computadora defina su propio conjunto de instrucciones y la manera en que stas podan ser utilizadas. Al proceso que permita especificarle al computador las instrucciones y el orden en que ste deba ejecutarlas se le llam programacin. Como este conjunto de instrucciones permitan hablar de cierta manera con la computadora, programndola, a fin de indicarle lo que deba realizar, a este conjunto de instrucciones se le llam: lenguaje de programacin. DEFINICIN I.2 LENGUAJE DE PROGRAMACIN Un lenguaje de programacin es una tcnica de comunicacin estandarizada para describir instrucciones que sern ejecutadas por un computador. Cada lenguaje de programacin es definido por un conjunto de reglas sintcticas y semnticas utilizadas para definir programas. Los primeros lenguajes de programacin, que consistan en el conjunto de instrucciones que la mquina saba ejecutar, eran de muy bajo nivel. Esto significa que las instrucciones realizaban operaciones muy especficas con respecto a la computadora para la que fueron construidos. Como vimos en el Ejemplo 1.1, una instruccin puede especificar, por ejemplo, espacios de memoria especficos, que son propios de una arquitectura de computadora particular. Por supuesto, un programa escrito para una computadora iba difcilmente a funcionar en otra computadora con una arquitectura diferente. Este fenmeno ocurra seguido puesto que existan pocas computadoras y stas eran hechas por diversos fabricantes. Dado que en un comienzo las computadoras eran capaces de realizar operaciones muy elementales, realizar ciertos clculos era realmente una tarea difcil y compleja que requera a personal especializado para realizarlas. Por ejemplo, la multiplicacin fue una operacin que no eran capaces de hacer las computadoras sino hasta muchos aos despus de haber sido inventadas. La multiplicacin era una funcionalidad que deba ser programa para ser utilizada. Los primeros lenguajes de programacin consistan en miles y miles de instrucciones. Por la naturaleza especfica del lenguaje utilizado para programar, en relacin a la mquina en que se ejecutaba el programa, se deca que estos lenguajes eran lenguajes de bajo nivel.

La extrema complejidad y altos costos que significaba escribir un programa sencillo, motiv a los cientficos de la poca a inventar lenguajes de programas que tuvieran un cierto nivel de abstraccin respecto a las caractersticas particulares de la computadora en donde las instrucciones eran ejecutadas. En otras palabras, se quera definir un programa que realizara instrucciones que no requirieran especificar por ejemplo los espacios de memoria en que se almacenaban o escriban los datos. Se habl entonces de lenguajes de programacin de ms alto nivel. Estos lenguajes no exigan al programador que indicara el lugar en la memoria donde se deba almacenar cierta informacin, sino que la computadora misma se encargaba de administrarlo. Los lenguajes fueron evolucionando hasta el punto en que el programador ya no programaba utilizando instrucciones de la mquina, sino lenguajes cada vez de ms alto nivel que le permitan escribir los mismos programas con un nmero considerablemente menor de instrucciones. Esto se logr gracias a un traductor cuya tarea consista en traducir el programa escrito por el programador con un lenguaje de alto nivel, en un programa equivalente en el lenguaje de la mquina. Este traductor recibe el nombre hoy de compilador. El proceso de transformar un programa escrito en un lenguaje especfico al lenguaje de mquina se llamaba recibe el nombre de compilacin. La Figura 1 ilustra este proceso. En la figura, el proceso comienza con un programa escrito en un lenguaje particular, como por ejemplo C o Java. El compilador procesa este programa y lo transforma en un programa de ms bajo nivel, como por ejemplo Assembler o lenguaje de mquina.

Programa escrito en C

Compilador

Programa escrito en Asembler

Computador

Figura 1: El proceso de compilacin transforma un programa escrito en un lenguaje en otro programa, equivalente escrito en el lenguaje de la mquina donde se ejecutara.

Los lenguajes de programacin comenzaron a evolucionar rpidamente y surgieron en gran variedad y con distintos fines. En funcin del tipo de programa que se deseaba escribir los lenguajes eran ms especficos al dominio de aplicacin. Hoy en da, los programadores escriben programas en lenguajes de alto nivel, que hacen abstraccin casi total

10

de la mquina en donde se ejecutaran, pudiendo tener stas incluso arquitecturas diferentes.

11

2 El paradigma de orientada a objetos

la

programacin

2.1 Paradigmas de programacin


La Programacin Orientada a Objetos (en ingls, object-oriented programming cuya abreviacin es popularmente conocida como OOP) se adecua, como muchos otros lenguajes de programacin lo hacen, a un paradigma de programacin. Un paradigma es una manera de ver las cosas, de ver el mundo, o analizar un problema. Con bastante frecuencia se compara un paradigma con un catalejo, que distorsiona la visin del mundo y la muestra segn el tipo de prismtico adaptado en el borde del aparato. El prismtico puede contener varios elementos, y entonces el mundo nos aparece solo bajo estas formas. En los catalejos tradicionales podemos encontrar prismas con cuadrados, o crculos, u otras figuras. EJEMPLO 2.2 EL
PARADIGMA DE LA ECONOMA

Tomemos como ejemplo a los economistas, que modelan el mundo bajo un paradigma de economa donde todas las cosas son representadas en trminos de costos. Bajo este paradigma todos los elementos deben llevarse a trminos de costos. La construccin de una plaza es separada en sus partes y a cada parte le es asociado un costo de realizarlo. Paralelamente, la construccin de la plaza es un beneficio para la sociedad, puesto que la gente es ms feliz. Esta felicidad se traduce en un costo de beneficio que compensa los costos de construccin de una plaza. En general, los lenguajes de programacin responden a un paradigma de programacin en particular. Tal es el caso de la programacin funcional donde el mundo es modelado en trminos de funciones y valores. En la programacin lgica los modelos son hechos a partir de proposicin lgicas y valores de verdad. En la programacin orientada a objetos cada parte del mundo real es modelado como un objeto

mientras que las acciones son modeladas como mensajes enviados a los objetos. Objetos y mensajes son los pilares fundamentales de la programacin orientada a objetos. A lo largo de estos apuntes consideraremos de manera transversal el juego de ajedrez para estudiarlo y aplicar lo aprendido. En el paradigma orientado a objetos, un juego de ajedrez se modela como un conjunto de objetos que interactan entre s. Para escribir un programa de ajedrez, utilizando un lenguaje orientado a objetos, se debe modelar el problema en trminos de objetos que interactan entre s. La primera etapa de este proceso consiste en reconocer cada uno de los objetos que son parte del problema y que tienen una participacin relevante para el problema estudiado. Una vez que se han identificado los objetos relevantes del problema, se debe determinar la manera en que stos interactan, pues es la precisamente la interaccin entre stos lo que define un sistema como dinmico. EJEMPLO 2.3 LOS
OBJETOS Y MENSAJES DEL JUEGO DE AJEDREZ

Un juego de ajedrez est constituido por numerosos objetos que interactan entre s. Entre ellos se encuentran los dos jugadores, el tablero de ajedrez, los peones (cada uno de ellos), las torres, los caballos, los alfiles, las reinas, los reyes, etc. Estos objetos fciles de distinguir son los objetos fsicos de nuestro mundo, pero tambin existen objetos intangibles tales como la partida de ajedrez, el turno, las jugadas realizadas, una jugada en particular, una movida como un enroque, etc. Luego de haber identificado los objetos relevantes de un juego de ajedrez se debe identificar la manera en que stos interactan. Por ejemplo, un jugador hace una mueve una pieza durante su turno, una pieza se mueve de una posicin del tablero a otra, el rey y la torre pueden enrocar, etc. Las acciones realizadas por los objetos definen los mensajes que stos reciben. Existen otras acciones implcitas del juego de ajedrez tales como cuando la partida determine que es el \emph{turno} de otro jugador, o cuando hay un ganador y la partida debe \emph{terminar}. Un objeto se comunica con otro objeto mediante \emph{acciones}, que en el paradigma orientado a objetos se traduce en \emph{envos de mensajes}. El primer paso que se debe realizar al modelizar un sistema del mundo real al mundo de los objetos es de distinguir cada objeto

del sistema y cada accin que stos puedan realizar. A continuacin se describir con ms profundidad lo que es un objeto y las principales caractersticas del paradigma orientado a objetos.

Captulo II
El lenguaje Java
1 Introduccin
JAVA es un lenguaje multiplataforma orientado a objetos. La palabra multiplataforma hacer referencia a los distintos sistemas operativos que corren en distintas arquitecturas, como por ejemplo: LINUX, WINDOWS, MACINTOSH, etc. Una vez compilado, un programa Java debiera poder en cualquier sistema que cuente con una mquina virtual Java. AGREGAR MAS BLABLA

1.1 Como funciona un programa

JAVA?

Un programa escrito en Java consiste en un conjunto de instrucciones que se almacenan en distintas unidades modulares. Para dar una pequea idea digamos que para escribir un programa en JAVA es necesario definir unos mdulos llamados clases que son guardadas en archivos de texto, cuya extensin es .java. Las clases definen tipos de datos abstractos que van a permitir la creacin de objetos. En consecuencia, se dice que JAVA es basado en clases5. Se revisarn estos conceptos en detalles ms adelante a lo largo de estos apuntes. Dado que JAVA es un lenguaje de alto nivel, una vez que se han definido todas las clases, los archivos son compilados, es decir, son transformados a un lenguaje de ms bajo nivel llamado JAVA BYTECODE. El JAVA BYTECODE es un lenguaje de ms bajo nivel que JAVA, que puede ser interpretado por una Mquina Virtual de Java. La Mquina Virtual de Java es un concepto importante puesto que propone una plataforma en la

El trmino basado en clases es conocido popularmente como class based.

cual escribir programas que hace abstraccin de la arquitectura bajo la cual se ejecutar. La Mquina Virtual de Java es abreviada popularmente como JVM. Para hacerse una idea ms clara, el BYTECODE se parece bastante al lenguaje de mquina, pero no contiene informacin especfica de la arquitectura del sistema donde ser ejecutado. La Mquina Virtual de JAVA es capaz de leer e interpretar el BYTECODE para indicar a la mquina donde se encuentra lo que debe hacer. Esta mquina virtual, hace entonces posible que un programa pueda ser ejecutado en cualquier plataforma donde existe una mquina virtual de Java que la interprete.

1.2 Un programa Java


1.2.1 Requisitos para poder compilar y ejecutar un programa Java
Para poder compilar y ejecutar un programa escrito en JAVA es necesario tener una instalacin del paquete de desarrollo de JAVA, conocido popularmente en ingls como JAVA STANDARD DEVELOPMENT KIT (JSDK). Este software puede ser descargado desde el sitio de Sun Microsystems6. Para verificar si JAVA est instalado en el sistema y conocer mas precisamente cul versin, se debe abrir una consola de comandos (ya sea en WINDOWS, LINUX o UNIX) y escribir el siguiente comando: java -version. A continuacin veremos como escribir y ejecutar un programa muy simple en JAVA. Se ver en particular que el ms pequeo y simple de los programas, que consiste en imprimir una cadena de caracteres en la pantalla del usuario puede ser no trivial. Veremos ms adelante que la creacin de programas puede verse altamente simplificada con la ayuda de ambientes integrados de desarrollo, cuya abreviacin es popularmente conocida como IDE. En JAVA, as como en otros lenguajes tales que C, no as PASCAL, existe una nocin de salida estndar que permite especificar donde es desplegada la informacin que se le enva al usuario.

1.2.2 Mi primer programa: Hola mundo!


Esta no ser ni la primera ni la ltima vez que escuche hablar de un programa llamado Hello World, u Hola Mundo. Para comenzar a entender un lenguaje de programacin, el ejemplo cannico consiste en
6

http://java.sun.com/j2se/1.5.0/download.jsp

lograr desplegar al usuario una cadena de caracteres con el mensaje Hola Mundo. Para comenzar, es necesario crear un archivo en donde se escribirn el programa. Se definir una clase llamada Programa que utilizaremos para escribir las instrucciones que compondrn el programa que nos interesa hacer. El archivo que contenga esta clase debe tener el mismo nombre que la clase seguido por .java, es decir, el archivo debe llamarse Programa.java. Es muy importante poner atencin a las minsculas o maysculas por que una diferencia de este tipo har que el programa no funcione. Ms adelante se ver que este detalle pierde importancia cuando se trabaja con IDEs, sin embargo, es importante realizar este ejercicio para entender cabalmente como suceden las cosas detrs del teln. Como se trata de un programa de prueba, El contenido del archivo es como se lista a continuacin:
public class Programa { /* Metodo principal para ejecutar el programa*/ public static void main(String args[ ]) { System.out.println("Hola Mundo!"); } }

Este programa, que imprime la cadena de caracteres Hola Mundo!, se ve particularmente complejo de entender, pero pierda cuidado, es slo una primera impresin. Una vez que avance en la lectura podr apreciar la simpleza del programa. Por ahora, nos conformaremos con saber que la clase se define con un nombre, Programa, en la lnea public class Programa, y que esta contiene un mtodo llamado main cuyo alcance est determinado por los smbolos { y }. El paso siguiente es compilar el archivo para obtener un segundo archivo que contiene el BYTECODE correspondiente a la definicin que se escribi del programa. Para esto es necesario abrir una lnea de comandos y ubicarse en el mismo directorio donde se encuentra el archivo Programa.java y ejecutar el siguiente comando7:
c:\javac Programa.java

Para este ejemplo suponemos que el archivo se encuentra en la raz del disco C.

El compilador de JAVA es un programa que se llama javac, abreviacin de java compiler. Al ejecutar este programa se genera como resultado, si la compilacin se desarroll sin errores, un nuevo archivo llamado Programa.class que contiene la definicin de la clase en BYTECODE, que no miraremos ahora. Este proceso es similar para cualquier archivo JAVA, es decir, se genera un archivo con el mismo nombre del archivo .java cuya extensin es .class. Slo queda el ltimo paso: ejecutar el programa. Para esto utilice la misma lnea de comando que abri hace algunos momentos y escriba la siguiente lnea de comando:
C:\java Programa

Acto seguido, podr verificar que en la consola comandos se ha desplegado el siguiente mensaje:
Hello World

1.3 Un ambiente Eclipse

de

trabajo

para

Java:

Existen muchos ambientes integrados de desarrollo IDE que permiten desarrollar aplicaciones en Java ms fcilmente, como por ejemplo Eclipse, JBuilder, NetBeans, etc. Durante este curso utilizaremos un IDE llamado ECLIPSE8. ECLIPSE es una aplicacin open source, y se puede obtener de manera gratuita desde el sitio oficial de eclipse9 y obtener la ultima versin estable (en ingls, latest release). ECLIPSE es distribuido en un archivo comprimido (que eventualmente puede estar firmado electrnicamente), que generalmente es de extensin .zip. Para instalarlo es necesario descomprimir el contenido del archivo y ejecutar el archivo eclipse.exe. Dado que ECLIPSE esta escrito en JAVA, es necesario tener una distribucin de JAVA instalada. La versin actual de eclipse (3.1.3) almacena la informacin del ambiente de trabajo en un directorio por defecto al interior del directorio de eclipse llamado workspace. Es posible tener
8

El sitio oficial de Eclipse es http://www.eclipse.org. puede obtener es:

La direccin de donde se http://download.eclipse.org/downloads/index.php.

ms de un workspace y pueden estar ubicados en cualquier lugar accesible a travs del sistema de archivos.

2 Tipos en java
Los tipos en JAVA permiten definir abstracciones. El lenguaje JAVA provee entonces dos tipos de abstracciones: los tipos primitivos y los tipos referenciados. Los tipos primitivos pueden ser utilizados para definir tipos referenciados. Los tipos referenciados sirven para poder definir tipos de datos abstractos, es decir, entidades con estado interno y operaciones. JAVA provee dos clases de tipos referenciados: las interfaces y las clases. Tanto los tipos primitivos como los tipos referenciados sern estudiados en detalle durante el transcurso de esta seccin.

2.1 Los tipos primitivos de Java


Java no es un lenguaje puramente orientado a objetos. Esto quiere decir que es posible encontrar en el lenguaje diferentes entidades que no son objetos. Este es el caso en particular de los tipos primitivos de Java. Un tipo primitivo es una entidad que define un tipo particular de datos que dispone de un conjunto de operadores provistos por el lenguaje.

2.1.1 Sumario de tipos primitivos


El lenguaje \Java{} provee un conjunto finito de tipos primitivos que son utilizados en la definicin de clases. Entre los ms importantes se encuentran el \mycode{boolean}, \mycode{byte}, \mycode{short}, \mycode{int}, \mycode{long}, \mycode{char} (ver la seccin \ref{javabasic:tiposPrimitivos:char}), \mycode{float} y \mycode{double}.

\begin{itemize}

\item \mycode{boolean}. Una variable de tipo boolean puede contener solamente dos valores: \mycode{true} o \mycode{false}. Para este tipo de datos existen ciertos operadores:

\begin{itemize}

\item \emph{Negacin \mycode{!bool}}. Cuando esta expresin es evaluada, su valor corresponde a la negacin del valor de \mycode{bool}. \mycode{!true} es evaluado como \mycode{false} y \mycode{!false} es evaluado como \mycode{true}.

\item \emph{Comparacin \mycode{bool == bool}}. Este operador compara los valores de dos expresiones buleanas y se evala en verdadero (\mycode{true}) si los valores son iguales y en falso (\mycode{false}) sino. El operador \mycode{!=} es utilizado para evaluar si dos expresiones son diferentes (el contrario del operador \mycode{==}).

\item \emph{Conjuncin \mycode{bool \&\& bool}}. Este operador compara los valores de dos expresiones buleanas y se evala en verdadero (\mycode{true}) si los valores son verdaderos y en falso (\mycode{false}) sino. Este operador evala primero la expresin buleana de la izquierda, si sta no se evala en \mycode{false} entonces procede a evaluar la expresin buleana de la derecha.

\item \emph{Disyuncin \mycode{bool || bool}}. Este operador compara los valores de dos expresiones boleanas y se evala en verdadero (\mycode{true}) si al menos una de las expresiones buleanas es verdadera (\mycode{true}) y false si ambas expresiones son falsas. Este operador evala primero la expresin buleana de la izquierda, si sta no se evala en \mycode{verdadera} entonces procede a evaluar la expresin buleana de la derecha.

\end{itemize}

\item \mycode{int}. El tipo \mycode{int} es utilizado para definir variables pudiendo contener nmeros enteros que pueden ir desde 2147483648 hasta el 2147483647. Una variable de tipo entero es almacenada en la memoria en un espacio de 32 bits. Para nmero ms grandes es necesario usar otro tipo de datos, como por ejemplo los tipos primitivos \mycode{long} (de 64 bits) y double o bien los tipos \mycode{Ingeger}, \mycode{LongInteger}. El lenguaje \Java{} provee un conjunto de operadores para el tipo \mycode{int}, entre los cuales podemos destacar (para una lista extensiva referirse a \cite{Gosling-all00Java1.4}):

\begin{itemize}

\item Operaciones \mycode{>}, \mycode{>=}, (utilizado y

de los

comparacin: operadores

\mycode{<}, y

\mycode{<=}, \mycode{!=}

\mycode{==}

para la igualdad).

\item Operaciones numricas: \mycode{+}, \mycode{-}, \mycode{*}, \mycode{/}, \mycode{++} y\mycode{--}.

\end{itemize}

\item \mycode{float}. El tipo \mycode{float} es utilizado para definir variables pudiendo contener nmeros flotantes que pueden ir desde ... hasta el .... Cada variable de tipo \mycode{float} es almacenada en la memoria en un espacio de 32 bits. Para almacenar nmeros mas grandes se puede usar el tipo de datos \mycode{double} (de 64 bits) o bien el tipo \mycode{BigDecimal}. El lenguaje \Java{} provee un conjunto de operadores para el tipo \mycode{int}: \mycode{+}, \mycode{-}, \mycode{*} y \mycode{/}.

\end{itemize}

Es interesante notar sin embargo, que en JAVA, para cada tipo primitivo existe un tipo referenciado cuyas instancias representan elementos de esos tipos. Por ejemplo, y como veremos posteriormente, para el tipo primitivo int existe el tipo referenciado Integer.

3 Excepciones
3.1 Introduccin
Ms de alguna vez debe haber presenciado algn cajero electrnico que se encuentra inoperante y con una pantalla azul. En algunos casos se trata de un error que ha ocurrido en el programa del cajero y ste ha de ser reiniciado para poder volver a funcionar. Por qu suceden estas situaciones? Por qu es necesario que el programa sea iniciado para poder funcionar nuevamente? Cul es la causa de que un programa deje de funcionar como se supone que funciona? La mayora de las veces la razn por la que un programa interrumpe abruptamente su ejecucin se debe a errores de programacin. Al escribir un programa, el programador trabaja en general con ciertos supuestos sobre la utilizacin del programa. A veces el programador no ha sido informado adecuadamente de los supuestos, y otras veces simplemente no son tomados en cuenta. Cuando un programa est siendo ejecutado y algo pasa que produce un error en ste, se habla de un error de ejecucin. Un error de ejecucin se puede producir por diversas razones, por ejemplo, si el usuario ingresa un nmero donde se esperaba una palabra, si el programa intenta abrir un archivo que no existe, si intenta guardar un archivo en una unidad de almacenamiento que no posee el espacio libre necesario, etc. Suponiendo que en general no es posible prever todos los errores de ejecucin que pudieran ocurrir mientras que se ejecuta un programa, algunos lenguajes de programacin permiten interceptar estos errores y proveen mecanismos que permiten atraparlos y realizar acciones para evitar que el programa termine abruptamente su ejecucin. Si se produce un error de ejecucin y el programa es capaz de continuar su ejecucin, se dice que el programa se ha recuperado del error. Si un programa es capaz de recuperarse de errores de ejecucin se dice que el programa es tolerante a fallas.

En Java es posible incluir instrucciones en un programa que permiten atrapar los errores que se producen en tiempo de ejecucin, reaccionar ante ellos. En esta seccin se explicar el concepto de excepcin, que representa un error de ejecucin, y como manejarlas en Java.

3.2 Declaracin de excepciones


Un error de ejecucin en Java es conceptualizado por una excepcin. Una excepcin es un objeto de tipo Exception cuyo fin es almacenar la informacin relacionada con un error que se ha producido al ejecutar mtodo de un Java. En consecuencia, es posible instanciar objetos que representen una excepcin de la manera tradicional:
Exception unaExcepcion; unaExcepcion = new Exception();

El principal objetivo de instanciar las excepciones, es decir, de tener una representacin de ellas en un objeto, es de poder agregar informacin sobre el error que ha ocurrido durante la ejecucin de un programa. Una excepcin puede ocurrir nicamente durante la ejecucin de una instruccin que se encuentra en un mtodo o un constructor de una clase. Cuando se dice que la ejecucin del mtodo o del constructor es interrumpida, se debe entender que el mtodo o constructor no terminan su ejecucin. Si se trata de un mtodo que debe retornar un valor, entonces ningn valor ser retornado.

3.3 Declarando excepciones

mtodos

que

lanzan

Si se detecta que un error ha sucedido y se crea una excepcin para almacenar la informacin relativa a este error, es posible detener la ejecucin del mtodo o constructor en ese punto y lanzar esta excepcin al objeto que ha invocado el mtodo donde ocurri el error. Para lanzar una excepcin es necesario realizar dos pasos: declarar que el mtodo en donde puede ocurrir la excepcin lanza ese tipo de excepciones, y lanzar la excepcin propiamente tal. Para declarar que un mtodo lanza una excepcin se debe indicar en el encabezado del mtodo el tipo de la excepcin que lanza precedido por

la palabra reservada throws, que en espaol significa justamente lanzar10. EJEMPLO 2.4 EXCEPCIN
DEL MTODO PARSEINT

En Java para obtener un nmero entero, representado por un objeto de tipo int, es posible invocar el mtodo parseInt(String) de la clase Integer que recibe un objeto de tipo String con la representacin del entero. La cadena 15383 seria convertida al entero 15383. La declaracin de este mtodo es: public int parseInt(String number) throws NumberFormatException Esto significa que si la cadena pasada como argumento al mtodo no es un nmero entero, entonces la ejecucin del mtodo ser interrumpida y una excepcin de tipo NumberFormatException ser lanzada. Como la ejecucin del mtodo ha sido interrumpida ningn valor ser retornado. Es natural preguntarse en este momento: cmo hace un mtodo para lanzar una excepcin? El lenguaje Java provee una instruccin que permite lanzar una excepcin, deteniendo as la ejecucin del programa. La sintaxis de esta instruccin es la siguiente: throw unaExcepcion Donde throw es una palabra reservada del lenguaje y unaExcepcion representa a un objeto de tipo Exception. En el siguiente ejemplo vemos como es posible utilizar esta instruccin para lanzar una excepcin. EJEMPLO 2.5 LANZANDO
UNA EXCEPCION

Supongamos que se desea escribir un mtodo que reciba dos arreglos de enteros y deje el contenido del primero en el segundo. Definiremos como precondicin de este mtodo que el segundo arreglo debe ser al menos del mismo tamao del primero, de manera de poder dejar en el segundo todos los enteros que se encuentran en el primer arreglo. Si esta precondicin no llegara a satisfacerse, el mtodo lanzara una excepcin indicando el error.

10

Notemos que throws es el verbo lanzar conjugado para la tercera persona singular (he, she e it). Esto es debido a que se quiere expresar que es el mtodo lanza una excepcin.

En consecuencia con lo anunciado anteriormente, la declaracin de este mtodo sera: public void copiaArreglo(int[] arreglo1, int[] arreglo2) throws Exception Por otro lado, en el cuerpo del mtodo ser necesario verificar si se cumple la precondicin y en caso de no ser as, arrojar la excepcin:
1 public void copiaArreglo(int[] arreglo1, int[] arreglo2) throws Exception { if (arrego1.length > arreglo2.lenght) { Excepcion laExcepcion = new Excepcion(Destino menor que origen); throw laExcepcion; } }

Por otro lado,.

3.4 Subclases de Exception


Extendiendo la clase Exception es posible definir excepciones especficas y adecuadas al error que se desea encapsular.

3.5 Ejercicios
3.5.1 Propuestos
Problema 1.1 Captura NumberFormatException de excepcin

Escriba un programa que usando excepciones pida un nmero de la pantalla y sea tolerante a fallas, es decir, si el usuario no ingresa un nmero el programa debe pedrselo nuevamente. Para esto, utilice el mtodo readLine() de la clase Console para leer lo ingresado por el usuario y el mtodo parseInt(String s) de la clase Integer para transformarlo a entero.

Problema 1.2
Escriba un programa tolerante a fallas que pida al usuario dos nmeros enteros desde la consola y despliegue la suma de los nmeros ingresados. Para esto, utilice el mtodo readLine() de la clase Console para leer lo ingresado por el usuario y el mtodo parseInt(String s) de la clase Integer para transformarlo a entero. El siguiente texto ejemplifica la manera en que el programa debe comportarse:
Ingrese el primer nmero: 10 Ingrese el segundo nmero: tres No en palabras por favor, Ingrese el segundo nmero: 3 Suma de los nmeros ingresados: 13

Captulo III
Algoritmos de bsqueda

Captulo IV
Estructuras de datos

1 Introduccin 2 Listas
Una lista es (textual del Larousse): Catlogo, enumeracin. (SINN. Cuadro, estado, ndice, inventario, tabla, etc.). Sirvi? Bueno, en palabras ms ingenieriles podemos decir que una lista es un conjunto de elementos (ordenados o no) que tienen asignada una posicin que les caracteriza. Por ejemplo, en una lista de alumnos, el primer alumno ocupa el lugar uno (por muy trivial que parezca), el segundo alumno ocupa el lugar nmero dos y as sucesivamente.

Captulo V
Tcnicas avanzadas de Programacin Orientadas a Objetos
1 Envo doble de mensajes
El envo doble de mensajes, conocido en ingls como double dispatch es una tcnica de programacin que permite aprovechar el mecanismo de seleccin de mtodos para ejecutar un mtodo especfico en funcin del tipo dinmico de alguno de los argumentos del mensaje recibido. El siguiente ejemplo describe la problemtica que se desea abordar.

EJEMPLO 1.6

DESCUENTO

EN EL

CINE

Supongamos que se quiere modelar un cine en el cual la cajera debe aplicar un descuento a cada cliente, dependiendo si el cliente es estudiante, socio del cine o simplemente una persona. El modelo de clases considerado en este ejemplo es descrito en la Figura 2.
Boleteria - cola : Cola - precioTicket (Persona cliente) : int + atenderCola () : void 0..1 0..* Persona

Estudiante

Socio

Figura 2: Diagrama de clases de entidades de Cine.

La clase Boletera define un mtodo de instancia pblico llamado atenderCola() que procesa la cola de gente para comprar entradas. El mtodo atenderCola() tiene el siguiente cuerpo:

ndice
A
Algoritmo.....................................................5

L
Lenguaje de programacin.........................9 Lenguajes de alto nivel.............................10 Lenguajes de bajo nivel..............................9

C
Ciencia de la computacin..........................3 Compilacin..............................................10

M
Mquina Virtual de Java............................15

D
Double dispatch........................................32

P
Paradigma de programacin.....................12

E
Error de ejecucin.....................................25 Excepcin..................................................26

S
Salida estndar.........................................16 Sistema numrico binario...........................5

J
JVM............................................................16

T
Tipos primitivos.........................................20 Tolerancia a fallas.....................................25