Quedan rigurosamente prohibidas, sin la autorizacin escrita
de los titulares del Copyright, bajo las sanciones establecidas en las leyes, la reproduccin total o parcial de esta obra por cual- quier medio o procedimiento, comprendidos la reprografa y el tratamiento informtico, y la distribucin de ejemplares de ella mediante alquiler o prstamo pblicos. Dirjase a CEDRO (Centro Espaol de Derechos Reprogrficos, www.cedro.org) si necesita fotocopiar o escanear algn fragmento de esta obra. INICIATIVA Y COORDINACIN Qualiform COLABORADORES Realizacin: ITACA (Interactive Training Advanced Computer Aplications, S.L.) Colaboradores: Miguel ngel Lozano Licenciado en Matemticas Profesor de Informtica y Coordinador de Calidad en el Instituto Ribera Baixa del Prat de Llobregat Supervisin tcnica y pedaggica: Departamento de Enseanza de Planeta DeAgostini Formacin Coordinacin editorial: Departamento de Creacin de cursos de Planeta DeAgostini Formacin Planeta DeAgostini Formacin, S.L.U. Barcelona (Espaa), 2012 Primera edicin: 2012 ISBN: 978-84-394-8675-6 1 INTRODUCCIN El camino a recorrer en este mdulo pasa por una serie de captulos que nos irn introduciendo poco a poco, pero de manera intensa, en el mundo de la progra- macin. En concreto, aprenderemos herramientas del lenguaje Java, el ms usado por los programadores en todos los niveles, sobre todo en el mbito empresarial. En programacin se utilizan dos metodologas: la programacin estructurada y la programacin orientada a objetos, aunque esta segunda necesita la primera. En este mdulo vamos a profundizar en la primera de ellas, la programacin relacio- nada con las estructuras. En el aprendizaje de cualquier lenguaje de programacin se siguen los pasos que iremos viendo a lo largo de los captulos de este mdulo. Comenzamos con un pri- mer captulo general, explicando los conceptos ms signicativos de los programas. Continuaremos con una descripcin de la sintaxis del lenguaje, viendo cmo se codican en Java las instrucciones que son comunes a todos los lenguajes de pro- gramacin, con especial nfasis en la estructuras de control. Al nal, habremos aprendido la primera de las dos tipologas de programacin existentes, la programacin estructurada y tendremos la base necesaria para em- prender el aprendizaje de la programacin orientada a objetos. 2 3 1. Identifcacin de los elementos de un programa informtico 1.1 Estructura y bloques fundamentales 1.2 Utilizacin de los entornos integrados de desarrollo 1.3 Proyectos y soluciones 1.4 Datos: naturaleza y tipos 1.5 Operadores 1.6 Expresiones 1.7 Conversiones de tipo 1.8 Comentarios 2. Uso de estructuras de control 2.1 Estructuras de seleccin 2.2 Estructuras de repeticin 2.3 Estructuras de salto 2.4 Control de excepciones 2.5 Prueba y depuracin 2.6 Documentacin 3. Aplicacin de las estructuras de almacenamiento 3.1 Estructuras 3.2 Creacin de arrays 3.3 Inicializacin 3.4 Arrays multidimensionales 3.5 Cadenas de caracteres 3.6 Listas 3.7 Colecciones 4. Lectura y escritura de la informacin 4.1 Concepto de ujo 4.2 Tipos de ujos: ujos de bytes y de caracteres 4.4 Clases relativas a ujos 4.3 Flujos predenidos 4.5 Utilizacin de ujos 4.6 Entrada desde teclado 4.7 Salida a pantalla 4.8 Aplicaciones del almacenamiento de informacin en cheros 4.9 Ficheros de datos. Registros 4.10 Apertura y cierre de cheros. Modos de acceso 4.11 Escritura y lectura de informacin en cheros 4.12 Almacenamiento de objetos en cheros. Persistencia. Serializacin 4.13 Utilizacin de los sistemas de cheros 4.14 Creacin y eliminacin de cheros y directorios Esquema de contenido 4 4.15 Creacin de interfaces grcos de usuario utilizando asistente y herramientas del entorno integrado 4.16 Interfaces 4.17 Concepto de evento 4.18 Creacin de controladores de eventos 4.19 Generacin de programas en entorno grco Identifcacin de los elementos de un programa informtico 5 1. IDENTIFICACIN DE LOS ELEMENTOS DE UN PROGRAMA INFORMTICO El concepto programacin consiste en denir una serie de directrices con las que se obtiene un resultado que responde a la resolucin de un problema. Un pro- grama informtico sigue exactamente esta premisa. A travs de los lenguajes de programacin, podremos denir las directrices que indicarn al ordenador, de un modo comprensible para su procesador, cmo llegar a la resolucin de un proble- ma expuesto. Existen numerosos lenguajes de programacin, todos con sus propias caracte- rsticas y, por lo tanto, destinados a resolver diferentes tipos de problemas. Cada lenguaje est especializado en un mbito determinado de la informtica, sin em- bargo todos ellos parten de una base comn. Segn su complejidad, podemos distinguir entre lenguajes de alto nivel (C++ o Java) y de bajo nivel (assembler). Los de alto nivel, permiten desarrollar programas simplicando el modo en que dirigimos las instrucciones al ordenador, mientras que los de bajo nivel se basan en instrucciones dirigidas directamente al hardware interno del ordenador, por lo que presentan una complejidad de control y organi- zacin muy elevada. Tanto por su mayor facilidad de aprendizaje y manejo como por su uso ms exten- dido, este mdulo est centrado en los lenguajes de alto nivel. A lo largo de los siguientes apartados, aprenderemos a aplicar las instrucciones comunes a todos los lenguajes de programacin, lo que nos permitir disear un programa informtico. 1.1 Estructura y bloques fundamentales Un programa informtico es una secuencia lgica de instrucciones escritas en un lenguaje de programacin determinado que, al ser interpretadas por un ordena- dor, dan solucin a un problema mediante la manipulacin de un conjunto de datos. Una vez denidas, dichas instrucciones dan lugar a lo que denominamos cdigo fuente. Todo lenguaje de programacin est sujeto a una serie de normas sintcticas y estructurales propias. La eleccin del lenguaje que vayamos a usar depender de Ir a Puesta en situacin del captulo (e-learning). Programacin I 6 1.2 Utilizacin de los entornos integrados de desarrollo El entorno de desarrollo integrado (IDE, Integrated Development Environment) es un programa informtico que, de una manera atractiva para el usuario, ofrece un conjunto de herramientas y recursos necesarios para el desarrollo de aplicaciones informticas en uno o ms lenguajes de programacin (Figura 1.2). Figura 1.1 Esquema de la estructura bsica de un programa informtico. los requerimientos del problema a resolver. Cualquier programa informtico, in- dependientemente del lenguaje en el que est escrito, puede dividirse en dos bloques principales (Figura 1.1) que denen su estructura base: Bloque de declaraciones. Conjunto de datos proporcionados al programa infor- mtico destinados a ser manipulados a travs de las instrucciones denidas en l. Dichos datos pueden ser de diferente origen y naturaleza. Bloque de instrucciones. Conjunto de acciones que usar el programa para manipular los datos proporcionados y obtener los resultados necesarios para la resolucin del problema propuesto. El bloque de instrucciones, por tanto, debe resolver los siguientes problemas:
Entrada. Recogida de los datos externos al programa necesarios para resolver el problema.
Transformacin. Transformacin de los datos para conseguir el resultado.
Salida. Enviar a su destinatario la solucin al problema, de modo que lo pueda entender. Identifcacin de los elementos de un programa informtico 7 El objetivo de un IDE es facilitar el desarrollo de aplicaciones y programas inform- ticos empaquetando los recursos en un marco de trabajo estable y visual. Cualquier IDE est formado por los siguientes bloques:
Editor de cdigo. Entorno sobre el que se escribe el cdigo fuente de nuestro programa. Ofrece ayudas visuales, como el formato textual para resaltar los as- pectos relevantes del cdigo.
Compilador o intrprete. Herramienta destinada a interpretar el cdigo escrito y mostrar el resultado del programa.
Depurador. Detecta y solventa los errores que pueden surgir en la escritura del cdigo.
Constructor de interfaz grfca. Acta como un conjunto de opciones visuales que permiten la comunicacin entre el usuario y el ordenador a la hora de escri- bir e interpretar el cdigo escrito. Figura 1.2 Interfaz de desarrollo de un IDE. 1.3 Proyectos y soluciones Durante el proceso de desarrollo de una aplicacin entran en juego muchos fac- tores y elementos, adems del cdigo fuente, todos importantes para el correcto funcionamiento del programa. Por esa razn debern organizarse de un modo que facilite el acceso a ellos. Para tales efectos, los IDE ofrecen soluciones, como la creacin de proyectos. Ir a contenido prctico (e-learning). Recuerda Independientemente del lenguaje de programacin que usemos, la estructura organizativa del cdigo fuente ser siempre la misma. Programacin I 8 1.4 Datos: naturaleza y tipos Todos los datos destinados a ser manipulados por un programa informtico se almacenan en nuestro ordenador dentro de espacios de memoria determinados. Segn su naturaleza, podemos diferenciar tres clases de datos: variables, constan- tes y literales. Todos ellos debern estar denidos en el bloque de declaraciones de nuestro programa. Para saber ms Los lenguajes de programacin ms utilizados para el desarrollo de aplicaciones informticas son C++ y Java. Se trata de lenguajes estables y verstiles, ya que son capaces de tratar los datos a un nivel muy especfco. A efectos prcticos, un proyecto es la organizacin de los archivos que intervie- nen en la ejecucin de un programa (Figura 1.3). Cuando creamos un proyecto para nuestra aplicacin, lo que en realidad estamos haciendo es denir un cuadro organizativo para todos los recursos que vayamos a necesitar. As pues, podremos denir una carpeta para archivar las imgenes, otra para archi- vos de texto, otra para el resto de archivos con cdigo necesario para la aplicacin, etc... Algunas de las carpetas vendrn denidas por defecto, ya que irn destinadas a datos internos del programa sobre los que no deberemos actuar. Otras, en cam- bio, las podremos denir nosotros, bien durante la creacin del proyecto o bien a medida que sea necesario. Figura 1.3 Ejemplo de estructura de un proyecto para lenguaje de programacion C++. Ir a contenido prctico (e-learning). Identifcacin de los elementos de un programa informtico 9 Figura 1.4 Ejemplo de declaracin de variables denidas en diferentes lenguajes de programacin. 1.4.1 Variables Denominamos variable a todo aquel espacio de memoria reservado e identica- do que, a lo largo de la ejecucin del programa, puede ver alterado el valor que almacena (Figura 1.4). Podemos usar una variable tanto para almacenar un valor destinado a ser manipu- lado, como para almacenar el resultado de una manipulacin de datos. Para declarar una variable deberemos tener en cuenta los siguientes aspectos:
Toda variable deber estar denida en el bloque de declaraciones del programa, pero no necesariamente deber contener un valor inicial.
Toda variable deber tener un nombre que la identique como nica en el pro- grama, es decir, nunca dos variables podrn llamarse de igual modo aun conte- niendo valores distintos. 1.4.2 Constantes La constante es aquel espacio de memoria reservado e identicado mediante un nom- bre que almacenar un valor jo e inalterable a lo largo de la ejecucin del programa. Por lo general, una constante corresponde a un dato ubicado en la memoria prin- cipal del ordenador. Como ejemplo podramos tomar el valor numrico Pi (Figura 1.5), que en algunas mquinas viene predenido en una zona de memoria con el valor jo 3,14159. Asimismo, y siguiendo las mismas reglas que se aplican a las variables, podemos crear nuestras propias constantes asignndoles los valores deseados. No obstante, y a diferen- cia de una variable, una constante nunca puede declararse sin asignarle un valor inicial. Programacin I 10 1.4.3 Literales Una literal es un tipo de dato al que se le asigna un valor con un sentido estricto. Los compiladores informticos tienen diferentes maneras de interpretar los datos que in- tervienen en la ejecucin de un programa. Supongamos, por ejemplo, que queremos almacenar el valor numrico 100 en una variable. Al ejecutar el programa, segn el lenguaje en el que estemos trabajando, este dato puede ser interpretado por el compi- lador como 4 en base binaria. Para evitar este tipo de confusiones a la hora de ejecutar un programa, dichos lenguajes incluyen la posibilidad de denir los datos de un modo estricto, es decir, si en una literal almacenamos el numeral 100, signicar 100 exactamente, sin posibilidad de que sea interpretado de otro modo por el ordenador. Otro ejemplo de valor literal sera un dato destinado a almacenar un nombre, un con- junto de letras, o varias palabras. Toda letra o palabra hace referencia a un dato que no puede interpretarse de otra manera, se trata pues de un dato literal (Figura 1.6). Figura 1.5 Declaracin y uso de una constante en lenguaje de programacin C++. Recuerda Para mantener el cdigo organizado, es imprescindible dotar a los datos con nombres que nos ayuden a reconocer cmo estn destinados a ser manipulados. Recuerda Cada lenguaje de programacin tiene una sintaxis propia para declarar los datos que intervendrn durante la ejecucin de un programa. Por tanto, la manera de defnirlos y de asignarles valores variar segn el lenguaje que estemos usando. Figura 1.6 Valores literales asignados a diferentes variables. Identifcacin de los elementos de un programa informtico 11 1.4.4 Tipos de datos Segn el tipo de datos que se dena para guardar un valor, el ordenador reservar un espacio de memoria y de tamao para su correcto almacenaje. Veamos a continuacin los tipos de datos principales:
Entero (integer). valores numricos positivos y negativos no decimales.
Real (foat). valores numricos positivos y negativos con parte decimal.
Caracter (char). valores alfanumricos simples, es decir, una letra, un nmero o un smbolo, siempre que estos tengan una longitud unitaria.
Cadena de caracteres (string). valores alfanumricos que pueden estar com- puestos por ms de un caracter. Un valor de tipo string, as como uno de tipo char, hace la funcin de una palabra, es decir, en caso de ser un nmero, ste no podr actuar en operaciones matemticas.
Valores lgicos (boolean). se utilizan para datos que disponen slo de dos po- sibles valores: verdadero (true) o falso (false).
Es importante denir el tipo del valor que queremos almacenar (Figura 1.7), pues de ello depender la cantidad de memoria utilizada por la mquina al ejecutar el programa. Figura 1.7 Ejemplo de declaracin de variables que almacenan distintos tipos de datos en lenguaje de programacin C++. 1.5 Operadores Un operador es aquel elemento que permite manipular los datos declarados en nuestro programa. El operador tiene asociado un smbolo que indica el modo en que ste manipular los datos. Ir a contenido prctico (e-learning). Programacin I 12 Existen diferentes clases de operadores (Figura 1.8):
Operadores aritmticos binarios: -Suma (+). Suma entre valores. -Resta (-). Resta entre valores. -Multiplicacin (*). Multiplicacin entre valores. -Divisin (/). Cociente de la divisin entre valores. -Mdulo (resto) (%). Resto de la divisin entre valores.
Operadores aritmticos unarios: -Incremento (++). Aumenta el valor en una unidad. -Decremento (--). Disminuye el valor en una unidad. -Cambio de signo (-). Invierte el signo de un valor de positivo a negativo o viceversa.
Operadores de asignacin (Figura 1.9): -Asignacin simple (=). Almacena el valor a la derecha del smbolo en el dato de la izquierda. -Suma (+ =). Incrementa un valor tantas unidades como se denan a la derecha del smbolo. -Resta (- =). Disminuye un valor tantas unidades como se denan a la de- recha del smbolo. -Multiplicacin (* =). Multiplica un valor por el valor de la derecha del smbolo. -Divisin (/ =). Divide un valor entre el valor de la derecha del smbolo. -Mdulo (% =). Calcula el resto de la divisin entre los valores a ambos lados. Figura 1.8 Tabla de los diferentes operadores aritmticos. Figura 1.9 Tabla de los diferentes operadores de asignacin. Identifcacin de los elementos de un programa informtico 13
Operadores de comparacin (Figura 1.10): -Igualdad (= =). Compara si dos datos contienen el mismo valor. -Desigualdad (! =). Compara si dos datos contienen valores distintos. -Menor que (<). Compara si el valor de la izquierda es menor que el de la derecha. -Mayor que (>). Compara si el valor de la izquierda es mayor que el de la derecha. -Menor o igual que (<=). Compara si el valor de la izquierda es menor o igual que el de la derecha. -Mayor o igual que (>=). Compara si el valor de la izquierda es mayor o igual que el de la derecha. -Divisin (/ =). Divide un valor entre el valor de la derecha del smbolo. -Mdulo (% =). Calcula el resto de la divisin entre los valores a ambos lados.
Operadores lgicos: -Y (&& =). La operacin es cierta si los dos valores que tiene a ambos lados son ciertos, y falsa en cualquier otro caso. -O (|| =). La operacin es cierta si cualquiera de los dos valores que tiene a ambos lados es cierto, y falsa en caso de que ambos valores sean falsos. -NO (! =). Si el valor que tiene a la derecha es falso el resultado de la operacin ser cierto, si el valor es cierto el resultado ser falso. Figura 1.10 Tabla de los diferentes operadores de comparacin. Para saber ms Algunos lenguajes de programacin, como por ejemplo Java o C++, pueden manipular los datos a niveles muy bajos, incluso de bits, por lo que incluyen operadores especfcos para tales efectos. 1.6 Expresiones En programacin, una expresin es una combinacin de datos que, al ser evaluada por el ordenador con la ayuda de operadores, ofrece un resultado en funcin del valor y el tipo de los datos. El resultado obtenido podr utilizarse para almacenarlo en un nuevo dato o para realizar una accin determinada segn su valor. Existen tres tipos bsicos de expresiones de programacin:
Aritmticas. Hacen referencia a todas las operaciones matemticas como su- mas, restas y divisiones.
Relaciones. Se usan para comparar el valor de dos datos y denir si estos son iguales, diferentes o, si siendo diferentes, uno es mayor o menor que el otro. Este tipo de expresiones slo tienen dos resultados posibles: verdadero o falso. Programacin I 14
Lgicas. Sirven para comprobar si se cumplen dos o ms premisas expuestas. Igual que las expresiones relacionales, este tipo de expresiones slo tienen dos resultados posibles: verdadero o falso (Figura 1.11). Figura 1.11 Tabla referencial de los distintos tipos de expresiones de programacin con sus respectivos resultados. 1.7 Conversiones de tipo Cada tipo de datos es almacenado de una manera diferente en el ordenador y per- mite realizar diferentes operaciones, pero a veces es necesario realizar operaciones sobre un dato que no se corresponde con su tipo. Por ejemplo, un valor numrico que el usuario ha introducido en forma de cadena debe ser tratado como un n- mero para participar en una operacin aritmtica. Las conversiones de tipo (en ingls Cast) nos permiten transformar el valor que contiene un dato en un valor de tipo distinto. Una conversin de tipo puede ser implcita si el compilador o intrprete es capaz de realizarla automticamente. Normalmente se trata de conversiones de un tipo particular a otro ms general. Una conversin es explcita si el programa de ordenador la pide expresamente. Supongamos por un momento que, tras una operacin matemtica, como por ejemplo una divisin, el resultado obtenido aparece con una parte decimal que queremos desechar. Dicho valor estar almacenado en una variable de tipo oat. Identifcacin de los elementos de un programa informtico 15 Usando una conversin de tipo podremos conseguir que el valor numrico alma- cenado como tipo oat pase a ser de tipo integer, desechando as directamente su parte decimal (Figura 1.12). Cada lenguaje de programacin tiene sus propias herramientas para realizar los cambios de tipo. La ms utilizada es el operador Cast, que utilizan el lenguaje C y sus derivados, adems de Java y PHP. Por ejemplo, UnNumeroEntero = (int)UnNu- meroDecimal; es una sentencia que convierte el valor de la variable UnNumeroDe- cimal en un nmero entero y almacena el resultado en la variable UnNumeroEnte- ro. El operador es el tipo entre parntesis antes del valor a procesar. En otros casos se utilizan funciones o mtodos, que son conceptos que veremos ms adelante. Figura 1.12 Esquema conceptual de conversin de un dato de valor real en otro de valor entero. Figura 1.13 Ejemplos de comentarios de cdigo segn diferentes lenguajes de programacin. 1.8 Comentarios Un comentario es una instruccin destinada a integrar informacin adicional dentro del cdigo fuente de un programa. Los comentarios no son interpretados por el compilador del lenguaje a la hora de ejecutar el programa. El uso de los comentarios es muy extenso, pueden emplearse tanto para introducir datos aclaratorios dentro del cdigo como para evitar que el programa active una cierta instruccin. Cada lenguaje de programacin tiene una sintaxis propia para denir comentarios dentro del cdigo (Figura 1.13). Recuerda Los comentarios no tienen ningn efecto durante la ejecucin de un programa, pero siempre nos ayudarn a mantener un cdigo organizado y comprensible. Programacin I 16 Resumen En este apartado hemos denido las normas y comportamientos bsicos que se aplican a todo len- guaje de programacin. A la hora de disear un programa informtico deberemos recordar los si- guientes pasos bsicos a seguir: identicacin de un problema, denicin de directrices, obtencin de resultados, depuracin de errores y resolucin del problema. El entorno de desarrollo integrado (IDE, Integrated Development Environment) nos facilitar las he- rramientas necesarias para comunicarnos con el ordenador a travs de instrucciones escritas en un lenguaje de programacin determinado. Para que nuestro programa sea gil y estable, deberemos tener en cuenta la cantidad de datos que necesitaremos y el modo en que los almacenaremos en la memoria del ordenador. Los diferentes tipos de datos nos ayudarn a crear parcelas de almacenaje para cada uno de los datos que usemos. Los operadores, las expresiones y la conversin de datos, son herramientas que nos permitirn ma- nipular los datos a lo largo de nuestro programa con el n de proporcionarnos una resolucin al problema planteado. Los lenguajes de programacin ofrecen, adems, ciertos recursos para hacer que nuestro cdigo sea ms versatil y comprensible. Recordemos que herramientas como los comentarios no inuyen en el resultado nal del programa, pero son imprescindibles para mantener organizado el cdigo de ste. Ir a los contenidos prcticos del captulo (e-learning). Uso de estructuras de control 17 2. USO DE ESTRUCTURAS DE CONTROL Hasta ahora hemos visto cules son los elementos principales que intervienen en la programacin y hemos aprendido cmo el uso de datos y objetos nos ayudan a organizar nuestro cdigo. Sin embargo, para la resolucin de problemas com- plejos, es preciso conocer cules son las sentencias o acciones que se ejecutan, y en qu momento se ejecutan. Las estructuras de control, o construcciones de control, controlan la secuencia o ujo de ejecucin de las acciones que realiza nuestro programa. A lo largo de este captulo, aprenderemos a controlar los suce- sos que desencadenarn las acciones que deniremos en nuestro cdigo durante la ejecucin de nuestros programas. La funcin de las estructuras de control es la de dirigir el ujo de las acciones a lo largo de un programa informtico con el objetivo de que ste reaccione de un modo u otro segn la situacin. Hay estruc- turas de varios tipos (seleccin, repeticin, salto y excepcin). Todas ellas gozan de caractersticas y utilidades distintas. Veamos pues, cules son y en qu situaciones deberemos usar unas u otras. 2.1 Estructuras de seleccin Las estructuras de seleccin denen diferentes comportamientos para nuestro programa basndose en la evaluacin de sentencias o premisas (condiciones) (Fi- gura 2.1). Existen tres tipos:
Seleccin simple. Su comportamiento se basa en la evaluacin de una senten- cia y reaccin en consecuencia. Si la premisa se cumple, se desencadenan las acciones denidas; de lo contrario, el programa sigue su curso. La instruccin usada es el condicional if (si).
Seleccin doble. Ampla la funcionalidad de las estructuras de seleccin simple aadiendo un camino alternativo si la premisa evaluada no se cumple. Las ins- trucciones que las denen son if / else (si / si no).
Seleccin mltiple. Se basan en la evaluacin de colecciones de premisas. El programa elegir el comportamiento adecuado segn sea la premisa que se cumpla. La instruccin que las dene se denomina switch (cambia a/seleccio- na), y los diferentes comportamientos vienen determinados segn las senten- cias case (caso). Para ejemplicar su uso, podramos proponer la siguiente situacin: imaginemos la pgina web de una marca de bebidas alcohlicas en la que el acceso est vetado a los menores de 18 aos. Cuando un usuario intenta acceder, se le pide la fecha de nacimiento para realizar la comprobacin de su edad segn el ao Ir a Puesta en situacin del captulo (e-learning). Programacin I 18 en curso. Una vez el programa dene que el usuario es mayor de 18 aos, se le permite el acceso al contenido de la web; de otro modo, seguir vetado. 2.1.1 Estructuras de seleccin en Java La sentencia if, o if-else: if ( <expresin lgica> ) { <lo que sea>; } [ else { <lo que sea>; } ] La expresin lgica tiene que producir un resultado lgico, es decir, true o false (Figura 2.2). La sentencia puede ser simple, acabada en punto y coma, o puede ser compuesta, siempre encerrada por llaves. Figura 2.1 Esquema conceptual de una estructura de seleccin simple. Figura 2.2 Esquema conceptual de una estructura de seleccin simple con doble bifurcacin. Uso de estructuras de control 19 La seleccin mltiple, sentencia switch case: switch( <expresin> ) { case valor1: <lo que sea>; break; case valor2: < lo que sea >; break; [default: < lo que sea >;] } La expresin, que puede ser una variable, debe dar como resultado int o char. Cada case acaba en un break y esto hace que, despus de cada evaluacin y ejecu- cin, se vaya al nal. No es obligatorio, lo que har que se ejecuten las siguientes sentencias hasta un break. Al nal, si hay un default, el cdigo de dentro se ejecutar cuando no se haya en- contrado coincidencia anterior (Figura 2.3). 2.2 Estructuras de repeticin Las estructuras de repeticin se basan en la reiteracin de una accin denida mientras se cumpla una premisa expuesta. Existen de varios tipos: Figura 2.3 Esquema conceptual de una estructura de seleccin mltiple. Programacin I 20
for. Determina un nmero mximo de repeticiones durante las que se ejecutar una accin denida. Cuando se alcanza el nmero de repeticiones indicado, el programa rompe el bucle de la estructura y pasa a la siguiente lnea de cdigo.
while. Su funcionamiento es muy parecido al de las estructuras for. El programa ejecuta una accin mientras se cumpla una condicin denida. Para que el bucle se rompa, deber existir en el interior de las acciones denidas, una instruccin que convierta la condicin en falsa, de otro modo el programa entrara en un bucle innito y se bloqueara.
do while. Muy prxima a la estructura while, la diferencia es que la comproba- cin de la premisa se realiza posteriormente a las acciones denidas, es decir, las acciones se ejecutarn como mnimo una vez.
Todas las estructuras tienen una utilidad y funcin segn la situacin; sin embargo, son las estructuras for y while las ms usadas de todas ellas (Figura 2.4). 2.2.1 Estructuras de repeticin en Java La sentencia for: for ( <inicializacin>; <nalizacin>; <iteracin> ) { <lo que sea>; } La sentencia for ejecuta un grupo de instrucciones repetidamente con las siguien- tes restricciones (separadas por punto y coma) (Figura 2.5): Figura 2.4 Esquema conceptual de una estructura de repeticin. Uso de estructuras de control 21
Inicializacin. Una expresin que inicializa la variable o variables que se utilizan en la iteracin. Por ejemplo, Integer i = 0.
Finalizacin. Mientras se cumplan las condiciones que se incluyen, se iran eje- cutando repetidamente las instrucciones contenidas en el for. Por ejemplo, i < 5.
Iteracin. Incremento o decremento de la variable o variables que a cada itera- cin se va a actualizar. Por ejemplo, i++ har que a cada vuelta se incremente en 1 la variable i, pero tambin podra ser i--, o i = i +2. La sentencia while: [ <inicializacin>; ] while ( <expresin condicional> ) { <lo que sea>; <iteracin>; } Esta estructura ejecuta repetidamente las sentencias que encierra mientras la ex- presin condicional sea verdadera; por lo que, si es inicialmente falsa, no se ejecu- ta. Por eso se suele inicializar, para que al menos entre una vez, y en las sentencias de iteracin es donde se cambia algo para que en algn momento no se cumpla la expresin condicional (Figura 2.6). Figura 2.5 Esquema conceptual de una estructura for. Programacin I 22 Figura 2.6 Esquema conceptual de una estructura while. Figura 2.7 Esquema conceptual de una estructura do-while. La sentencia do - while: [<inicializacin>;] do { <lo que sea>; [ <iteracin>; ] } while ( <expresin condicional> ); Esta estructura ejecuta repetidamente las sentencias que encierra mientras la ex- presin condicional sea verdadera. Sin embargo, como la condicin est al nal, a diferencia del while, la primera vez se ejecutar (Figura 2.7). Uso de estructuras de control 23 2.3 Estructuras de salto Las estructuras de salto sirven para interrumpir el ujo normal del programa y desviarlo hacia un punto diferente (Figura 2.8). Podemos destacar tres tipos:
break. Provoca una salida brusca de una sentencia switch o de un bucle for. Tras ella, contina la ejecucin del resto del programa.
continue. Interrumpe la ejecucin normal de un bucle. Sirve para crear una ex- cepcin en la sentencia que se evala rompiendo la ejecucin del bloque de acciones durante una de las repeticiones. Tras la excepcin, el bucle contina ejecutndose normalmente.
return. Slo se permite su uso dentro de funciones o bloques de instrucciones. Provoca la salida inmediata del bloque y retorna al punto desde donde haba sido activado, devolviendo un valor determinado. Es importante no usar estas acciones ms que en las situaciones denidas. Cual- quier otro uso forzado podra provocar el colapso del programa. 2.4 Control de excepciones El control de excepciones es una estructura que se utiliza para evitar que un pro- grama se colapse cuando intenta ejecutar un cdigo no vlido o que no pueda interpretar. Una estructura de control de excepciones se compone de tres instruc- ciones bsicas: Figura 2.8 Esquema conceptual de las diferentes estructuras de salto y sus usos permitidos. Programacin I 24
try. tras esta instruccin se denen las sentencias a ejecutar. En caso de xito, el programa sigue su ujo normal, en caso contrario pasa a la siguiente instruccin catch.
catch. es la instruccin encargada de recoger el error generado en la ejecucin de sentencias fallida.
throw. muestra el error recogido durante la sentencia catch para ser mostrado o actuar en consecuencia. Como ejemplo de uso para una estructura de control de excepciones podramos tomar una funcin cuyos parmetros sern usados para realizar una divisin. Si al parmetro denido como divisor se le asignara el valor 0, el programa podra co- lapsarse al no poder realizar la operacin. Gracias al control de excepciones (Figura 2.9) el programa podr determinar que ha ocurrido un error, actuar en consecuen- cia, advertir de lo ocurrido al usuario y seguir su curso normal. 2.4.1 Excepciones en Java try { <lo que sea>; } catch(Exception e) { <lo que sea>; } Al ejecutar las sentencias incluidas en el try, si se produce un error, Java crear un objeto de la clase Exception o de una de sus heredadas. Este objeto ser pasado al catch y se ejecutarn las sentencias que se incluyen en el mismo. Se pueden incluir varias clusulas catch con distintos tipos de excepciones. Siem- pre se deben poner de menor a mayor detalle. Es decir, como la clase Exception es de donde heredan todas, sta siempre ir la ltima y, por lo tanto, el grupo de sentencias de su catch siempre se ejecutar si no se ha cazado en una excepcin ms particular de un catch anterior del mismo trycatch. Figura 2.9 Esquema conceptual del proceso de control de excepciones en una funcin. Para saber ms Las estructuras de control son combinables entre s y, aunque no es aconsejable abusar de ello, si la ocasin lo requiere, pueden incluso anidarse las unas con las otras para crear nuevas estructuras. Recuerda Las estructuras de salto estn diseadas para ser introducidas en ciertos puntos concretos del cdigo en los que se requieren. Su uso fuera de esos puntos no es aconsejable, salvo que no se halle una mejor solucin. Uso de estructuras de control 25 2.5 Prueba y depuracin Una vez hemos acabado de escribir el cdigo de nuestro programa llega el mo- mento de someterlo al proceso de prueba y depuracin. La nalidad de las pruebas es denir si las acciones que realiza el programa durante su ejecucin dan como resultado la resolucin del problema para el que ha sido diseado. Si los resultados obtenidos no son satisfactorios deberemos revisar nuestro c- digo, detectar en qu puntos se producen errores y depurarlos. La prueba y la depuracin son procesos que deben hacerse tanto a lo largo de la escritura del programa, para comprobar la funcionalidad de pequeos bloques de cdigo, como al nalizar la aplicacin para comprobar su funcionalidad con respecto a los usuarios. Es en este proceso donde toma mayor importancia la consola de errores (Figura 2.10), ya que nos ayudar a detectar los puntos donde se produ- cen errores y conocer de qu tipo son. 2.6 Documentacin La documentacin es la gua o comunicacin escrita que ayuda a comprender el uso de un programa y facilita sus futuras modicaciones (mantenimiento). Debe recoger todos los elementos y material creado en las diferentes fases del desarro- llo, adems de las normas de instalacin y recomendaciones para su ejecucin. La documentacin se puede dividir en tres partes:
Documentacin interna. Son los comentarios que se aaden al cdigo fuente para claricarlo.
Documentacin externa. Es el documento que recoge todo el material creado y empleado en las diferentes fases del desarrollo del programa. Las bases de los puntos que debe incluir son: - Descripcin del problema - Explicacin de la solucin - Autores - Algoritmo (diagrama de ujo o pseudocdigo) Figura 2.10 Listado de errores mostrados por la consola durante la ejecucin de un programa. Programacin I 26 - Cdigo Fuente (programa) - Limitaciones del programa (funciones que puede y no puede realizar)
Manual del usuario. Es el documento que describe paso a paso de qu ma- nera funciona el programa. Su nalidad es que los usuarios entiendan el modo correcto de usarlo para obtener los resultados deseados. Recuerda La documentacin es uno de los procesos que suelen pasarse por alto; sin embargo, supone el complemento perfecto para un producto fnal usable y estable. Uso de estructuras de control 27 Resumen Como cualquier lenguaje de programacin, Java debe implementar las estructuras de control que per- miten cambiar la ejecucin secuencial del programa, y en denitiva, nos ayudan al implementar cual- quier tipo de algoritmo. Las estructura de control de seleccin, if else , ejecuta las instrucciones contenidas en el if siempre que se cumpla la condicin, en otro caso, ejecutar las del else, siempre que se haya explicitado esta palabra clave. La estructura de control switch case evala el valor de una variable y ejecuta las instrucciones que se encuentran en el case correspondiente al valor. Las estructuras de repeticin son estructuras de control que ejecutan un conjunto de instrucciones repe- titivamente. En la estructura while, se ejecuta el conjunto mientras se cumpla la condicin. La estructura do while, ejecuta primero el conjunto de instrucciones y despus evala, repitiendo el proceso mien- tras se cumpla la condicin. La estructura for(inicializacin;condiciones;incremento) ejecuta el conjunto inicializando unas variables, mientras se cumplan las condiciones e incrementando o decrementando las variables de la parte del incremento. En Java, se puede prever un error y ejecutar unas instrucciones cuando ocurre. Este proceso se denomina control de excepciones, y se realiza mediante la estructura try catch. Cuando las instrucciones dentro del try tienen un error mencionado en el catch, se ejecutarn las instrucciones contenidas en el catch. Los entornos de programacin integrados (IDE el acrnimo en ingls) tienen utilidades para depurar los programas, es decir, seguirlos paso a paso para encontrar un mal funcionamiento. Ir a los contenidos prcticos del captulo (e-learning). Programacin I 28 3. APLICACIN DE LAS ESTRUCTURAS DE ALMACENAMIENTO En programacin es tan importante mantener una organizacin estricta de los da- tos provenientes del exterior de nuestro programa, como de los datos denidos internamente en l. Para tal propsito, las estructuras de almacenamiento de la informacin son la mejor herramienta aliada que nos ofrecen los lenguajes de programacin. En oca- siones, veremos que las variables simples capaces de almacenar un nico tipo de dato no sern sucientes para conseguir que el programa cumpla sus propsitos. Las estructuras de almacenamiento nos ofrecen una serie de objetos capaces de almacenar varios datos a la vez e incluso que puedan ser stos de distinto tipo. Se trata de estructuras destinadas a almacenar bloques de informacin compleja de una manera estructurada y que permita un acceso sencillo y directo a los datos. Cuando la informacin externa a nuestro programa proviene de registros o bases de datos, es una buena praxis almacenarla dentro de nuestro programa con una estructura que imita la original. Para ello, las estructuras de almacenamiento estn provistas de toda una serie de caractersticas que facilitarn tanto su almacena- miento como su acceso posterior. Por otra parte, debemos gestionar vectores de elementos (arrays en Java) con un tipo de datos determinado. A veces, este tipo de datos ser simple (integer, char...); pero, en ocasiones, el vector puede contener elementos que son de un tipo de datos complejo, como por ejemplo objetos de una clase determinada. Tambin veremos un caso especial de arrays, el de las cadenas de caracteres. En diversos problemas se nos plantean operaciones con cadenas de caracteres, como comparacin de cadenas, bsqueda de cadenas dentro de cadenas, ordenacin de caracteres, y otras operaciones usuales con las que nos podemos encontrar. 3.1 Estructuras Una estructura es un grupo de elementos relacionados de forma conveniente con el programador y el usuario del programa. El resultado es un nuevo tipo de dato que permite una estructura organizativa considerablemente ms compleja que las que hemos visto hasta el momento. Se trata de una combinacin de varios tipos de datos, incluyendo otras estructuras que hayamos podido denir previamente. Ir a Puesta en situacin del captulo (e-learning). Aplicacin de las estructuras de almacenamiento 29 En el ejemplo de la gura 3.1, el programa empieza deniendo una estructura con la palabra clave struct seguida de tres variables sencillas, las cuales representan sus componentes. Seguidamente, encontramos una variable entrada que est denida como un vector de 30 posiciones cuyo tipo de datos es esa estructura. Es decir, cada uno de los elementos del vector entrada tendr en su contenido las tres variables de la estructura. En el main, podemos ver cmo asignar el valor de un elemento. Para ello, situados con ndice 0, se debe dar valor a todo el contenido del elemento; es decir, a todas las variables de la estructura, tal y como se ve en la gura dentro del main. En lenguajes orientados a objetos como Java, las estructuras se solucionan con clases y objetos, pues las propiedades de los mismos cumplen perfectamente con el cometido de las estructuras. 3.2 Creacin de arrays En programacin, el trmino ingls array (matriz o vector) dene una zona de almacenamiento continuo de datos de un mismo tipo. Desde un punto de vista lgico, una matriz puede entenderse como un conjunto de elementos ordenados en serie. Las matrices son adecuadas para situaciones en las que el acceso a los datos deba realizarse de forma aleatoria e impredecible (Figura 3.2). Todo vector o matriz se compone de un determinado nmero de elementos. Cada elemento est referenciado por un ndice o posicin que ocupa dentro del vector. Figura 3.1 Denicin de una estructura aplicada a dos variables en lenguaje C++. Programacin I 30 Existen tres formas de indexar los elementos de una matriz:
Indexacin base-cero (0). El primer elemento del vector recibe el ndice num- rico 0. En consecuencia, el ltimo elemento del vector recibir un ndice numri- co igual al nmero de elementos totales menos uno. El lenguaje C es un ejemplo tpico que utiliza este modo de indexacin.
Indexacin base-uno (1). En esta forma de indexacin, el primer elemento de la matriz tiene el ndice 1 y el ltimo tiene el ndice igual al nmero de elementos totales.
Indexacin base-n (n). Se trata de un modo de indexacin en la que el ndi- ce del primer elemento puede ser elegido libremente. En algunos lenguajes de programacin se permite que los ndices sean negativos e incluso tambin ca- denas de caracteres. Declaracin de arrays en Java: nombre = new <tipo>[dimensin]; Un ejemplo con un tipo simple. int[] notas; notas = new int[10]: Pero tambin se puede aplicar a objetos, es decir, a tipos de datos complejos: Persona[] personas = new Persona[]; Figura 3.2 Un array donde el ndice es la etiqueta y los valores lo que se guarda en el interior. Aplicacin de las estructuras de almacenamiento 31 Nota: en este caso, estamos utilizando memoria dinmica, es decir, la longitud del array (del vector) puede ir amplindose a medida que se necesite. 3.3 Inicializacin Como toda otra variable, cuando denimos una matriz en nuestro cdigo, sta se encuentra vaca. La inicializacin de una array es el proceso a travs del cual de- nimos el nmero de elementos que la conformarn y asignamos datos a cada uno de ellos. Existen diferentes mtodos para inicializar una matriz (Figura 3.3), todos ellos el resultado de una coleccin de datos ordenados de manera correlativa, de la que deberemos escoger el que mejor se ajuste a nuestras necesidades:
Inicializacin directa. Consiste en asignar los datos para cada ndice de la ma- triz de modo manual, esto es, asignar manualmente un valor a cada uno de los ndices de la matriz. En Java, por ejemplo: <tipo> [] nombreDeTabla = { valor1, valor2, valor3... }
Inicializacin dinmica. La losofa de la inicializacin dinmica es automati- zar el proceso de asignacin de datos para cada uno de los ndices de la matriz. Este proceso es especialmente til cuando los datos que debemos almacenar provienen de una fuente externa al programa, como por ejemplo de un do- cumento XML. Gracias a la ayuda de una estructura de repeticin (for, while) seremos capaces de introducir y ordenar directamente los diferentes datos ex- ternos en la matriz. Figura 3.3 Inizializacin directa de un vector de String en Java. Recuerda La mejor manera de recorrer una tabla es la estructura de control for for(inte i=0;i<personas. length;i++) Programacin I 32 En Java, para referirnos a un elemento en concreto de la tabla, lo haremos como en el ejemplo siguiente que imprime el elemento 3 de una tabla de personas: System.out.println(personas[3]); Se debe tener en cuenta que el elemento 3, es el de posicin 4 dentro de la tabla, pues el ndice empieza en 0. 3.4 Arrays multidimensionales Los arrays multidimensionales son unas estructuras de datos capaces de alma- cenar valores en diferentes niveles. Los arrays que hemos visto hasta ahora alma- cenan valores en una nica dimensin, es decir, con un ndice asignado para cada una de sus posiciones y elementos. Los arrays de dos dimensiones (Figura 3.4) guardan sus valores en una estructura similar a las las y las columnas de una ta- bla, por ello se requieren dos ndices para acceder a cada una de las posiciones de sus datos. En un sentido amplio, podemos entender un array multidimensional como un array que contiene otro array indexado en cada una de sus posiciones (Figura 3.5). Para referenciar un dato contenido en un array multidimensional deberemos in- dicar dos posiciones numricas, la primera har referencia al ndice de la matriz principal y la segunda al ndice de la posicin del dato de la matriz contenida en l. Recuerda La inicializacin dinmica de arrays resulta una herramienta valiossima en cuanto a almacenaje de datos se refere debido al sistema de automatizacin que ofrece. Figura 3.4 Un array de dos dimensiones necesita dos ndices (la la y la columna). Ir a contenido prctico (e-learning). Aplicacin de las estructuras de almacenamiento 33 En Java, la declaracin de un array bidimensional del tipo hoja de clculo, es decir, con las y columnas, se efecta de la manera siguiente: <UnTipo> tabla [][] = new <UnTipo> [unaDimensin][]; En este caso, slo se sabe que los elementos sern del tipo UnTipo y que tendr un nmero de las igual a unaDimensin. Pensemos en un hotel que tenga 4 plantas (0, 1, 2 y 3) y en cada planta tiene 5 habitaciones (de la 0 a la 4). Pequeo, pero til para la explicacin. En cada habitacin podemos tener huspedes alojados de un tipo de datos deter- minado. Podramos guardar enteros, y entonces tendramos: int hotel[][] = new int [3][]; hotel[0] = new int [4]; hotel[1] = new int [4]; hotel[2] = new int [4]; hotel[3] = new int [4]; Y para saber el husped de la planta 2 (la 2) segunda habitacin (columna 1) podemos hacer: habitacionElegida = hotel[2][1]; Figura 3.5 Un array de tres dimensiones necesita tres ndices: la, columna y piso. Programacin I 34 3.5 Cadenas de caracteres Las cadenas de caracteres (string) nos permiten almacenar conjuntos seriados de caracteres. En ese sentido, podemos entender la mayora de datos que almacena- mos en una variable de tipo string como palabras o texto en general. Sin embargo, para el compilador de un lenguaje de programacin, una string es tratada como una serie de caracteres colocados en serie, a los cuales se les asigna una posicin propia dentro de la variable contenedora. As pues, las cadenas de caracteres son entendidas por el compilador del lenguaje, no como una entidad en s, sino como un array de caracteres o letras con posiciones individuales para cada una de ellas. Del mismo modo que podemos acceder a un dato indexado dentro de una matriz, podremos tambin acceder a un caracter concreto dentro de una variable de tipo string indicando su posicin dentro de ella (Figura 3.6). Las cadenas en Java Declaracin En Java, una cadena de caracteres es un String. Su declaracin es: String str1; Inicializacin habitual Caso ms usual: String str1 = Hola; Figura 3.6 Los textos son cadenas de caracteres en las que podremos buscar y comparar. Para saber ms De todas las matrices multidimendionales, las de uso ms comn son las de dos dimensiones. Sin embargo, a medida que dotemos un array de mayores dimensiones, podremos conseguir efectos ms complejos para nuestro programa, ya sea para almacenar datos o para representar objetos grfcos por pantalla. Aplicacin de las estructuras de almacenamiento 35 String inicializado a partir de una cadena de caracteres char t[]={a,b,c}; String str1 = new String(t); Operaciones (mtodos) En Java, la clase String proporciona a los objetos creados con dicha clase, es decir a las variables con ese tipo, operaciones (mtodos) de comparacin, copia y reem- plazo entre otras. 3.6 Listas Una lista es un tipo de matriz capaz de incrementar o reducir de forma dinmica el nmero de elementos que contiene. Al mismo tiempo, los elementos conteni- dos dentro de una lista no tienen necesidad de ser del mismo tipo (Figura 3.7). La ventaja principal de una lista con respecto a una matriz corriente, es que sta puede contener tantos tipos de objetos de datos como el programador necesite. La instruccin que dene una lista dentro del cdigo es ArrayList. Para inicializar una lista podemos utilizar dos mtodos, bien denindola como vaca y, por tanto, sin nmero inicial de elementos, o bien deniendo un nmero determinado de posiciones iniciales. Ambos sistemas son completamente vlidos, pero es reco- mendable que, para economizar memoria, si conocemos de antemano el nmero de elementos mnimos que vayamos a necesitar, lo denamos al declarar la lista. Figura 3.7 En las listas ,cada elemento puede ser de un tipo diferente, incluyendo objetos. Programacin I 36 En Java, la gestin de listas comprende los siguientes aspectos: Declaracin Una lista en Java es un vector de la clase List. Como esta clase es abstract (es decir no se puede instanciar), entonces debemos utilizar la clase ArrayList a la manera del ejemplo. List losTelefonos = new ArrayList(); En este caso, losTelefonos ser un array de string. Pero si, por ejemplo, tenemos una clase Persona y queremos crear una lista de personas, debemos insertar la clase a la que nos referimos entre < >. De esta forma: List<Persona> unasPersonas = new ArraList<Persona>(); Inicializacin habitual En cualquier caso, se emplea el mtodo add. Por ejemplo: Persona laPersona = ....; unasPersonas.add(laPersona); Operaciones (mtodos) En Java, un objeto del tipo List, aparte de la operacin aadir descrita, tiene operacio- nes de borrado, cuenta del nmero de elementos, bsqueda de un elemento, etc. Por otra parte, la lista proporciona la propiedad Iterator que se utiliza para reco- rrer la lista. 3.7 Colecciones Una coleccin, llamada comnmente en ingls Collection, es todo aquel objeto que se puede recorrer o iterar, y del cual conocemos su tamao (Figura 3.8). Las operaciones bsicas de una coleccin son las siguientes:
add(T). Aade un elemento.
Iterator(). Obtiene un iterador que permite recorrer la coleccin visitando cada elemento una vez.
Size(). Obtiene la cantidad de elementos almacenados dentro de una coleccin. Aplicacin de las estructuras de almacenamiento 37
contains(t). Devuelve un valor booleano (cierto o falso) segn si el elemento entre parntesis (t) se encuentra dentro de la coleccin o no. La caracterstica principal de un objeto Collection es la de poder ser recorrido. Si bien en este punto del proceso no est denido un orden, la nica manera de denirlo es usando una instruccin iteradora de repeticin, mediante el mtodo iterator(). Un iterador es un objeto que recorre la extensin de la coleccin y nos permite obtener todos los objetos contenidos en ella, invocando progresivamente un mtodo llamado next(). Si la coleccin es modicable, podremos eliminar un objeto durante el recorrido mediante el mtodo llamado remove() del iterador. En Java la gestin de colecciones se efecta a travs de la clase Collection, con declaracin, inicializacin y mtodos similares a las explicadas para la clase List. Figura 3.8 En las colecciones podemos aadir elementos diversos con control. Programacin I 38 Resumen Una estructura es un grupo de elementos relacionados entre s, que es el resultado de un nuevo tipo de dato considerablemente ms complejo que los que hemos utilizado hasta ahora. Se trata de una combinacin de varios tipos de datos, incluyendo otras estructuras que hayamos denido previamente. Un array dene una zona de almacenamiento continuo de datos de un mismo tipo. Desde un punto de vista lgico, una matriz puede entenderse como un conjunto de elementos ordenados en serie. Las matrices son adecuadas para situaciones en las que el acceso a los datos deba realizarse de forma aleatoria e impredecible. La inicializacin de una array es el proceso a travs del cual denimos el nmero de elementos que la conformarn y asignamos datos a cada uno de ellos. Los arrays multidimensionales son estructuras de datos capaces de almacenar valores en diferen- tes niveles. En ellos se almacenan los valores en una estructura similar a las las y las columnas de una tabla. Las cadenas de caracteres (string) nos permiten almacenar conjuntos seriados de caracteres. Para el compilador de un lenguaje de programacin, una string es tratada como una serie de caracteres co- locados en serie con una posicin propia para cada uno de ellos. As pues, las cadenas de caracteres son entendidas como un array de caracteres o letras. Una lista es un tipo de matriz capaz de incrementar o reducir de forma dinmica el nmero de ele- mentos que contiene. La ventaja de una lista frente a un array comn, es la capacidad de almacenar elementos de distinto tipo en su estructura. Un objeto Collection es el concepto base del que derivan la mayora de las estructuras de almacena- miento de informacin. Su caracterstica principal es la de poder obtener datos de l y modicarlos a la vez que se recorre su extensin. Ir a los contenidos prcticos del captulo (e-learning). Lectura y escritura de la informacin 39 4. LECTURA Y ESCRITURA DE LA INFORMACIN Cuando se empieza en el mundo de la programacin, lo primero que se debe tener claro es que un programa es la resolucin de un algoritmo cuyo esquema ms general puede ser:
Entrada de datos
Transformacin de datos
Salida de datos Por cuestiones pedaggicas, el aprendizaje de la programacin pasa por un pri- mer momento donde la entrada de datos es siempre por el teclado y la salida es en la consola (en la pantalla). Pero existe un gran nmero de situaciones donde nos interesa cambiar la entrada y/o la salida de datos por cheros. Es decir, leer los datos desde un chero del sistema y escribir los resultados de nuestro programa en un chero del sistema. Pero esto no es todo, pues nos dejaramos otro gran nmero de situaciones don- de la entrada de datos debe realizarse desde un formulario en una ventana del sistema operativo y, en la salida de nuestro programa, deseamos mostrarla en esa u otra ventana del sistema operativo. En este captulo vamos a abordar estos dos tipos de entrada y salida de datos. En primer lugar, nos dedicaremos a estudiar la entrada y salida de datos sobre cheros del sistema operativo. En Java, la comunicacin entre nuestro programa y los cheros se efecta abriendo un ujo de datos (stream) y todo ello se gestio- na con las clases InputStream y OutputStream (Reader y Writer para caracteres). Con estas clases y sobre todo, las clases que heredan de ellas. En segundo lugar, trataremos la entrada y salida grca, es decir hacia y desde ventanas, estudiando adems los formularios, sus controles y eventos, como por ejemplo, un botn y el evento al hacer clic. En Java lo haremos mediante las clases contenidas en paquetes de AWT (Abstract Window Toolkit), un sistema que permite a nuestros programas Java ser independiente del sistema de grcos y ventanas del sistema operativo. Ir a Puesta en situacin del captulo (e-learning). Programacin I 40 4.1 Concepto de ujo En programacin, denimos fujo (stream) a la conexin existente entre un pro- grama y una fuente o destino de datos. Un fujo dene el protocolo usado por los lenguajes de programacin para controlar y tratar la entrada (input) y salida (output) de datos (Figura 4.1). Los fujos de entrada (input) controlan los datos que uyen hacia un programa para ser procesados. Los fujos de salida (output) controlan los datos que uyen desde un programa despus de ser procesados. En programacin, entendemos por dato aquella parte representativa de informa- cin proporcionada u obtenida del programa. Como ejemplo de entrada de datos podramos tomar instrucciones del teclado o el ratn, y como ejemplo de salida de datos podramos tomar la informacin mostrada a travs de la pantalla o un documento obtenido por impresora. 4.2 Tipos de ujos: ujos de bytes y de caracteres Existen dos tipos bsicos de ujos de datos y ambos estn destinados a permitir el uso de cheros externos a nuestro programa:
Flujos de bytes. Incluyen los mtodos e instrucciones usados para manipular da- tos binarios, es decir, legibles slo por un ordenador (por ejemplo un chero .exe).
Flujos de caracteres. Incluyen los mtodos e instrucciones usados para ma- nipular datos legibles por humanos (por ejemplo un chero .txt). Un ujo de caracteres se encarga de traducir los datos emergentes de un chero de texto Figura 4.1 Esquema conceptual de entrada y salida de datos en un programa informtico. Lectura y escritura de la informacin 41 en datos comprensibles por el ordenador (bytes) para que estos puedan ser uti- lizados en el programa. 4.3 Flujos predenidos En Java, los fujos predefnidos, o estndar, denen procesos a nivel interno que permanecen abiertos a lo largo de la ejecucin de un programa (Figura 4.2). Di- chos procesos estn dispuestos tanto a recibir datos de entrada como a dirigir datos de salida hacia el dispositivo (pantalla, impresora...) o elemento (archivo) designado. Por defecto, el dispositivo de ujo estndar de entrada es el teclado, y la clase y mtodo para referirnos a l es System.in. Asimismo, el ujo estndar de salida por defecto es la pantalla, y para referirse a l se usa la clase y mtodo System.out. Un tercer mtodo de la clase System, llamado System.err, se encarga de recoger y gestionar los posibles errores generados durante el proceso de ujos de entrada y salida de datos. 4.4 Clases relativas a ujos Existen en Java una serie de clases dedicadas a controlar los ujos de entrada y salida de datos, y que se conocen con el nombre de clases relativas a fujos. Las Figura 4.2 Los ujos de datos entre el programa y el exterior son como los buses de un ordenador. Recuerda El fujo es el concepto que defne el proceso de entrada y salida de informacin en un programa informtico. Programacin I 42 clases diseadas para tales propsitos son cuatro: dos para ujos de entrada y sa- lida de bytes y dos para ujos de entrada y salida de caracteres. De ellas se derivan otras subclases destinadas a realizar funciones ms especcas. Veamos cules son:
Clases relativas a fujos de bytes: - InputStream. Engloba las funciones y clases encargadas de leer los ujos de entrada de bytes y convertirlos en los denominados caracteres Unicode para que puedan ser interpretados por el ordenador. - OutputStream. Engloba las funciones y clases encargadas de enviar los ujos de salida de bytes hacia los dispositivos designados, y convertirlos en caracteres comprensibles por el cerebro humano.
Clases relativas a fujos de caracteres: - Reader. Implementa todas las funcionalidades de lectura de ujos de caracteres para que estos puedan ser interpretados y procesados por el programa. - Writer. Implementa todas las funcionalidades de escritura de ujos de caracteres para que estos puedan ser mostrados por pantalla o almacenados en archivos. 4.5 Utilizacin de ujos La utilizacin de fujos dene un protocolo a seguir a la hora de trabajar con u- jos de datos. Este protocolo vara segn sea el ujo de lectura o de escritura:
Lectura de datos: - Creacin del llamado objeto stream, que se encarga de abrir un ujo a una fuente entrada de datos (teclado, archivo, socket). - Lectura de los datos desde el inicio de su ujo hasta su n. - Fin del proceso, uso del llamado mtodo close, que se encarga de cerrar el ujo de datos y terminar el proceso, liberando as los sectores de memoria destinados a l.
Escritura de datos: - Creacin de un objeto stream para abrir un ujo a una fuente salida de datos (pantalla, archivo). - Escritura de los datos desde el inicio hasta el nal de su ujo. - Fin del proceso con el llamado mtodo close, que se encarga de cerrar el ujo de datos y terminar el proceso liberando as los sectores de memoria utiliza- dos para l. Ir a contenido prctico (e-learning). Lectura y escritura de la informacin 43 Los ujos estndar son gestionados a nivel interno por el sistema: l se encarga de su apertura y de su cierre segn sea necesario. 4.6 Entrada desde teclado En trminos generales, se considera el teclado como el dispositivo principal de entrada de datos al sistema o al programa. Los datos enviados desde el teclado del ordenador se gestionan con los paquetes de clases System.in y InputStream. Ambos sern los encargados de traducir los u- jos de bytes recogidos cada vez que se pulse una tecla, y de traducirlos a caracteres interpretables por el ordenador para que puedan ser procesados. En lenguaje Java se incluyen ya una serie de clases designadas para tales efectos, sin embargo tenemos tambin la posibilidad de crear nuestras propias clases de control a partir de ellas, para obtener resultados ms especcos cuando se detec- te una entrada de teclado en nuestro programa. La combinacin de todo esto hace que las instrucciones para leer desde el teclado sean como en el ejemplo siguiente: BuferedReader br = new BuferedReader(new InputStreamReader(System.in)); String frase = br.readLine(); 4.7 Salida a pantalla Generalmente, se considera la pantalla como el dispositivo principal de salida de datos del sistema o programa. Los datos enviados hacia la pantalla por el programa se gestionan con los paque- tes de clases System.out y OutputStream. Ambos sern los encargados de traducir los ujos de bytes enviados, y de traducirlos a caracteres o resultados interpreta- bles por una persona. Igual que para los ujos de entrada, en lenguaje Java se incluyen una serie de cla- ses designadas para tales efectos; sin embargo, tenemos tambin la posibilidad de crear nuestras propias clases de control a partir de ellas. Por defecto, los ujos de datos de salida se muestran por pantalla a travs de la consola (Figura 4.3) de nuestro sistema operativo. No obstante, una vez termina- Para saber ms Combinando las funciones que ofrecen la clases relativas a fujos, seremos capaces de crear nuevas funcionalidades adaptadas a las necesidades de nuestros programas. Programacin I 44 do el programa, podremos denir que dichos datos sean mostrados por pantalla representados de un modo ms visual (como, por ejemplo, en grcos) e incluso ofrecer la posibilidad de que sean manipulados por el usuario a travs de entradas de teclado. En la prctica, lo ms habitual en Java para escribir en la consola es tal y como se muestra en el siguiente ejemplo: System.out.println(Hola mundo); 4.8 Aplicaciones del almacenamiento de informacin en cheros La losofa de almacenar informacin en fcheros externos a nuestro progra- ma es la de separar la programacin de la informacin (Figura 4.4). De este modo, pueden modicarse los datos de entrada a nuestro programa independiente- mente de cul sea su cdigo. Imaginemos que tenemos un programa diseado para mostrar una galera de fotos. Para indicar al programa cul es la ubicacin de cada uno de los archivos de imagen, deberemos especicar una ruta para cada uno de ellos. Una primera posibilidad es la de incluir la ruta de cada imagen dentro del mismo cdigo. De este modo, el programa no dejar de ser funcional, pero su usabilidad y mantenimiento perdern ecacia, ya que cualquier modi- cacin de la informacin, como el cambio del nombre de un archivo, afectar directamente al cdigo de la aplicacin. De otro modo, si almacenamos la lista de rutas en un archivo de texto independiente, realizar el mantenimiento de la aplicacin se limitar a modicar la informacin de dicho archivo, luego el cdi- go se encargar de procesarla segn proceda. Figura 4.3 Informacin mostrada por pantalla a travs de la consola de Java. Recuerda Se considera que el teclado y la pantalla son los dispositivos principales de entrada y salida de datos en un programa informtico; sin embargo, en este proceso pueden intervenir muchos ms dispositivos, como la impresora, una webcam o el ratn. Lectura y escritura de la informacin 45 4.9 Ficheros de datos. Registros Las versiones de Java a partir de la versin 1.4 aaden una funcionalidad que permite controlar, dar formato y publicar mensajes a travs de los llamados re- gistros (log). Los registros pertenecen a un paquete de clases llamado java.util. logging. Los registros pueden ser usados para lanzar mensajes de informacin, estados de los datos o incluso errores ocurridos durante la ejecucin del progra- ma. Estos procesos pueden beneciar a los usuarios de la aplicacin sea cual sea su perl. El proceso de utilizacin de los registros de Java es muy simple, slo hay que seguir los siguientes pasos (Figura 4.5):
Incluir las sentencias de importacin para el paquete de clases logging.
Creacin de una referencia a la clase Logger.
Indicar el mensaje que desea mostrarse y su tipologa. Figura 4.4 Datos organizados en un chero externo con formato de marcado XML. Programacin I 46 Figura 4.5 Ejemplo de implementacin de la clase Logger en cdigo Java. Figura 4.6 Ejemplo de cdigo Java con implementacin de apertura y cierre de un archivo. 4.10 Apertura y cierre de cheros. Modos de acceso Igual que en los procesos designados para controlar la apertura y cierre de ujos de informacin, existen tambin unos protocolos que rigen la apertura y cierre de los cheros externos usados en nuestro programa. A travs del paquete de clases FileReader, Java proporciona toda una serie de funciones destinadas a la apertura (lectura) y cierre de cheros (Figura 4.6). Por medio de una ruta denida por un archivo alojado en nuestro disco duro, o por una URL de Internet, se indica a la clase FileReader cul es el origen de los datos. Otras clases y funciones como BuferedReader o readLine se encargarn de re- coger en forma de datos la informacin contenida en los cheros y almacenarla en variables de nuestro programa. Una vez terminado el proceso, nalizaremos cerrando el chero y liberando de la memoria todos los recursos que haban sido utilizados para su tratamiento. Recuerda El almacenado de informacin en archivos externos de nuestro programa nos proporcionar un mayor control de nuestras aplicaciones al dejar de depender nicamente del cdigo fuente. Lectura y escritura de la informacin 47 4.11 Escritura y lectura de informacin en cheros Gracias a las clases FileReader, FileWriter y algunas derivadas de InputStream y OutputStream de Java, seremos capaces de acceder al contenido almacenado en archivos externos a nuestro programa para obtener o modicar su informa- cin (Figura 4.7). Este proceso nos permitir tener informacin almacenada externamente para poder acceder a ella en puntos determinados del programa. Tal y como expli- cbamos en apartados anteriores, este proceso nos permitir separar la progra- macin de la informacin, pudiendo modicar as los datos de entrada indepen- dientemente de cul sea nuestro cdigo. La tipologa de archivos que podr ser utilizada y manipulada por nuestros pro- gramas es muy diversa, puede tratarse de simples documentos de texto con extensin .txt, o archivos de informacin estructurada como un .xml, archivos de imagen, o incluso archivos ejecutables. Cuando manejamos archivos de texto, se utilizan FileReader y FileWriter, junto con otras clases tipo Buered para leer y escribir datos (en este caso texto). En el caso de otro tipo de cheros, donde manejamos bytes, se utilizan las clases InputStream y OutputStream, adems de sus derivadas. Figura 4.7 Ejemplo de cdigo Java con implementacin de lectura y escritura de un archivo. Programacin I 48 4.12 Almacenamiento de objetos en cheros. Persistencia. Serializacin La serializacin es el proceso a travs del cual pueden almacenarse objetos directamente en una secuencia de bytes. Se trata de un proceso basado en el concepto de la persistencia, que permite la posterior reconstruccin de los ob- jetos guardados como secuencias de bytes (Figura 4.8). Las clases encargadas de controlar estos procesos son ObjectOuputStream y ObjectInputStream. La primera se encarga de serializar el objeto convirtindolo en una secuencia de bytes, la segunda es la encargada de leer e interpretar la secuencia de bytes de un objeto y reconstruirlo. A travs de estos mtodos podremos realizar operaciones complejas con nues- tros objetos como, por ejemplo, enviarlos a travs de la red en formato de bytes y reconstruirlos de nuevo una vez lleguen a su destinatario. 4.13 Utilizacin de los sistemas de cheros Un sistema de fcheros es la representacin de todos los elementos incluidos en nuestro ordenador, ya sean archivos, programas o dispositivos externos, como impresoras o escners (Figura 4.9). Java incluye una serie de funcionalidades para poder interactuar con todos ellos. Igual que podemos detectar una entrada de teclado y registrar una accin a partir de ello, podremos tambin acceder a mtodos que activen funciones de impresin, modica- cin de archivos o ejecucin de otros programas complementarios de apoyo. El sistema de archivos proporciona tambin al lenguaje la organizacin de nues- tros archivos y directorios en el disco duro, de este modo tendremos la posibilidad de poder seleccionar un archivo concreto para que sea procesado en tiempo de ejecucin del programa. Figura 4.8 Cdigo Java con ejemplo del proceso de serializacin y persistencia. Para saber ms Los fcheros de registros son una herramienta muy valiosa en cuanto a diseo de aplicaciones se refere. Suponen el complemento perfecto, ya sea para otros programadores que intervengan en su desarrollo como para los usuarios fnales. Lectura y escritura de la informacin 49 4.14 Creacin y eliminacin de cheros y directorios El lenguaje Java ofrece una serie de operativas que permiten la creacin y elimina- cin de fcheros fsicos en el disco duro. La clase encargada de llevar a cabo estos procesos se llama File y est incluida dentro del paquete de clases llamado Java IO. El mtodo que deberemos utilizar es createNewFile, incluido dentro de las funcionalida- des de dicha clase. El proceso es bien simple, tan slo deberemos incluir dos parme- tros: el primero indicar la ruta fsica del disco duro donde se quiera crear el archivo; el segundo indicar el nombre que recibir el archivo creado (Figura 4.10). El nico factor a tener en cuenta es que la ruta denida para la creacin del archivo deber existir previamente en nuestro sistema. Hay que sealar que la doble barra usada en la sentencia es la que le indicar a nuestro cdigo la jerarqua o separacin de los directorios en la ruta indicada. Una vez creado el chero, bastar con invocar el mtodo createNewFile, deniendo una estructura de excepcin (IOException), que se encargar de recoger los posibles errores que aparezcan a lo largo del proceso. Figura 4.9 Esquema conceptual de un sistema de cheros. Figura 4.10 Cdigo Java que adems de crear identica los permisos. Programacin 50 Como se ha explicado, en Java, la gestin de un chero o de un directorio se efec- ta mediante la clase File. Adems del mtodo explicado, otra manera de trabajar es con los constructores que podemos ver en los ejemplos siguientes: File f1 = new File(c:\\windows\\notepad.exe); // La barra \ se escribe \\ File f2 = new File(c:\\windows); // Un directorio File f3 = new File(f2, notepad.exe); // Es igual a f1 La propiedad esttica File.separator nos proporciona el carcter separador del sistema de archivos donde se est ejecutando nuestro programa. En el ejemplo anterior, si queremos que nuestro programa funcione en Linux y en Windows, de- beramos utilizar esta propiedad en cualquier referencia a una ruta del sistema de cheros. Por ejemplo: File f1 = new File(directori+File.separator+directori+ Otra utilidad que nos ofrece Java, es la ventana de dilogo del sistema de cheros para seleccionar un chero o directorio concretos. La gestin de estas ventanas de dilogo en Java se efecta mediante la clase FileDialog del paquete java.awt. Una vez se ha creado el objeto File con xito, ya sea un directorio o un chero, el mtodo delete permite la eliminacin de dicho directorio o chero del disco. El siguiente ejemplo elimina el chero a.txt del disco, controlando si se ha efectua- do con xito. En el caso del directorio, se procedera igual: File c = new File(a.txt); if (c.delete()) System.out.println(El chero ha sido borrado satisfactoriamente); else System.out.println(El chero no puede ser borrado por algn motivo); 4.15 Creacin de interfaces grcos de usuario utilizando asistentes y herramientas del entorno integrado En un contexto de interaccin persona-ordenador, la interfaz grfca de usuario (IGU), se reere al conjunto de herramientas tecnolgicas que posibilitan, a travs de un lenguaje visual, la interaccin con un sistema informtico. La interfaz grfca de usuario (en ingls Graphical User Interface, GUI), a travs de un conjunto de imgenes y objetos grcos (iconos y ventanas), es capaz de representar la informacin y acciones disponibles en una aplicacin informtica. Lectura y escritura de la informacin 51 La losofa de una GUI es facilitar la interaccin del usuario con el ordenador a travs de acciones realizadas mediante la manipulacin directa de los elementos en pantalla. Una GUI surge de la evolucin de la consola de los primeros sistemas operativos, que representa la pieza fundamental de todo entorno grco. Como ejemplo de GUI podemos citar el escritorio del sistema operativo Windows (Figura 4.11). En general, una GUI es el entorno visual que se muestra cuando ejecutamos un programa informtico. En Java hay diversas utilidades, paquetes de clases o herramientas, que nos permi- ten implementar aplicaciones con entorno grco. Estas utilidades nos ofrecen la gran ventaja con respecto a otros lenguajes de hacer nuestro programa indepen- diente del GUI del sistema operativo. Entre otras, podemos utilizar la herramienta AWT (Abstract Window Toolkit) y Swing, aunque por cuestiones pedaggicas, la entrada para aprender a programar con in- terfaces grcas es conveniente hacerla por AWT, y eso es lo que desarrollaremos en los siguientes puntos. 4.16 Interfaces En programacin, denimos interfaz a aquel entorno que permite establecer una conexin, a distintos niveles, entre ordenadores y dispositivos de cualquier tipo (Figura 4.12). El concepto de interfaz puede ser utilizado en diferentes contextos:
Interfaz como instrumento: desde esta perspectiva, se considera una interfaz una extensin de nuestro cuerpo. Si tomamos el ejemplo de un ratn, podra de- nirse como un instrumento que extiende las funciones de nuestra mano y las lleva a la pantalla bajo la forma del cursor. Asimismo, la pantalla de un ordenador fun- ciona como la interfaz que conecta el usuario con la informacin del disco duro. Figura 4.11 Escritorio del sistema operativo Windows como ejemplo de interfaz grca de usuario. Programacin I 52
Interfaz como superfcie: en ocasiones se considera que una interfaz funciona como transmisora de informacin. La supercie de un objeto, por ejemplo, nos puede proporcionar informacin acerca de su forma, textura, color, etc.
Interfaz como espacio: desde esta perspectiva, una interfaz es el entorno en el que tiene lugar la interaccin con un programa, el espacio en el que se desa- rrollan las instrucciones y los intercambios de informacin. En AWT de Java, el primer concepto para la interfaz grca es la separacin entre contenedor y componente. La ventana es un contenedor (Frame) y un botn es un componente (Figura 4.13). Recuerda Las Interfaces Grfcas de Usuario (GUI) son el soporte principal de comunicacin sobre el que se apoyarn los usuarios para manejar nuestras aplicaciones. Su diseo debe ser intuitivo y estable. Figura 4.13 Imagen de una ventana de AWT con una muestra de todos los componentes de este entorno. Figura 4.12 Esquema grco en el que se muestran distintos tipos de interfaces fsicas para la comunicacin dispositivo- usuario. Lectura y escritura de la informacin 53 Los contenedores de AWT: Frame (classe java.awt.Frame) Panel (classe java.awt.Panel) Como hemos visto, Frame es una ventana y Panel es un contenedor que podemos colocar dentro de una ventana con el simple propsito de agrupar componentes dentro de l. Para organizar los contenidos (contenedores y componentes) dentro de una ven- tana se utilizan los layout managers. Pensemos que, a diferencia de otros entornos, no podemos ubicar libremente un componente dentro de una ventana, pero por el contrario, nuestro programa grco funcionar en cualquier sistema operativo. Los principales layout managers de AWT: java.awt.BorderLayout java.awt.FlowLayout java.awt.GridLayout Un BorderLayout divide el contenedor en cinco reas, norte, este, oeste, sur y cen- tro. En un FlowLayout, los componentes se van aadiendo a la derecha del anterior y, si no cabe en la anchura de la ventana, entonces se mostrar en la lnea siguiente. Un GridLayout corresponde a una tabla con n las por m columnas. Cada compo- nente que se aade se mostrar en la siguiente columna, empezando nueva la cuando aquellas se hayan acabado. Los componentes de AWT, bsicamente controles, son: Etiqueta (classe java.awt.Label) Botn (classe java.awt.Button) Radiobutton / Checkbox (classe java.awt.Checkbox), agrupados o no en un checkboxgroup (classe java.awt.CheckboxGroup) Lista (classe java.awt.List) Desplegable para seleccionar (classe java.awt.Choice) Campos de texto (classe java.awt.TextField) reas de texto (classe java.awt.TextArea) Programacin I 54 4.17 Concepto de evento El concepto de evento dene toda aquella accin iniciada por un usuario durante la ejecucin de un programa. Cuando el programa detecta un evento, se crea un objeto designado a realizar una accin relacionada con l. En Java, la clase dedi- cada al control de los eventos est incluida dentro del paquete java.awt.Event (Fi- gura 4.14). Existen muchos tipos de eventos para controlar los diferentes tipos de interacciones entre el usuario y el programa en ejecucin. Veamos los principales:
Eventos de teclado (KeyEvent). Encargados de registrar acciones lanzadas a partir del pulsado de una tecla.
Eventos de texto (TextEvent). Encargados de registrar acciones lanzadas a par- tir del cambio de un texto en alguno de los campos de la aplicacin.
Eventos de ratn (MouseEvent). Encargados de registrar acciones lanzadas a partir de acciones del ratn (clic, rollOver, rollOut...).
Eventos de foco (FocusEvent). Encargados de registrar acciones lanzadas a par- tir del cambio de la posicin del foco del cursor en pantalla.
Eventos de accin (ActionEvent). Encargados de registrar acciones lanzadas a par- tir de la activacin de elementos del programa, como, por ejemplo, pulsar un botn. 4.18 Creacin de controladores de eventos Un controlador de eventos es un mtodo o funcin designado a lanzar una ac- cin determinada cuando se registra un evento a lo largo de la ejecucin de un programa. Los controladores de eventos se aplican directamente sobre los obje- Figura 4.14 Esquema del proceso de escucha y activacin de funcin de un controlador de eventos. Lectura y escritura de la informacin 55 tos denidos en nuestro cdigo. Al aplicar un controlador sobre un objeto, ste recibe una funcin de escucha para dicho evento determinado. Por este motivo los controladores de eventos reciben el nombre de listener. Por ejemplo, si queremos detectar un clic de ratn en nuestra aplicacin, deberemos recurrir a los eventos de ratn (MouseEvent) denidos en las clases del lenguaje. El proceso es el siguiente:
Denicin de un objeto.
Asignacin de un controlador de evento (listener) sobre el objeto.
Denicin de la funcin designada a realizar por el evento. 4.19 Generacin de programas en entorno grco La funcin de los entornos grfcos de usuario o GUI, es ofrecer un abanico de herramientas para los programadores destinadas a disear aplicaciones de un modo visual e intuitivo. La generacin de programas a partir de entornos grcos nos permite programar una aplicacin al tiempo que evaluamos visualmente como ser la experiencia nal del usuario al que ir destinada. Gracias al entorno visual que facilitan las GUI podremos crear fcilmente una apli- cacin con slo arrastrar botones y otros componentes de las barras de opciones del entorno. No obstante, muchas veces el programador lo hace sin recurrir a estos entornos visuales, pues copia cdigo que ya tiene realizado. El esquema general para realizar una aplicacin en Java AWT es:
Crear un proyecto Java normal, como se ha hecho hasta ahora, por ejemplo con NetBeans. No crearemos la clase principal Main.java.
Aadir una nueva clase, por ejemplo Ventana pero tipo Otros / de interfaz gr- co o AWT GUI y seleccionamos Formulario Frame. Hagamos que se cree tambin el paquete con el nombre que deseemos.
Ya podemos ejecutar el programa. Si nos pide la clase principal, le decimos el nombre que le hemos dado a nuestro Formulario Frame. NetBeans nos ha aa- dido el cdigo necesario.
En este momento, podramos aadir los componentes que nos hicieran falta, y los eventos sobre ellos. Podramos cambiar el layout, aadir otros contenedo- res como paneles e incluso otras ventanas. En la parte prctica, haremos algn ejemplo de ello. Para saber ms El dominio de las clases de los controladores de eventos es uno de los pilares de la programacin de aplicaciones informticas, ya que nos permitir tener un control preciso de todas las acciones que tengan lugar en un programa. Programacin I 56 El cdigo generado por NetBeans es el siguiente: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /* * Ventana.java * * Created xxx */ package as; /** * * @author yyy */ public class Ventana extends java.awt.Frame { /** Creates new form Ventana */ public Ventana() { initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate=collapsed desc=Generated Code> private void initComponents() { addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } }); pack(); }// </editor-fold> /** Exit the Application */ private void exitForm(java.awt.event.WindowEvent evt) { System.exit(0); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { Lectura y escritura de la informacin 57 Podemos observar lo siguiente:
Nuestra clase principal Ventana hereda de Frame.
Se ha creado un mtodo main, por donde entrar a ejecutarse nuestra aplica- cin. El cdigo generado (Runnable ...) es para que la ventana se ejecute en un proceso diferente (Thread). Se ver en un captulo posterior. Debemos dejarlo as y pensar que se crea un objeto de nuestra clase Ventana.
El constructor se ejecuta cuando creamos el objeto anterior y, por lo tanto, se llama a initComponents().
El mtodo initComponents aade un listener (el controlador de eventos, el escu- chador) al contenedor Ventana y caza el evento windowClosing que se produce cuando cerramos la ventana. Al cazar el evento, llamamos a exitForm.
El mtodo exitForm llama System.exit(0); con lo que el programa naliza. Pues esto que nos ha creado NetBeans contiene todos los aspectos a considerar en una aplicacin grca. Se crea un objeto de tipo contenedor, se visualiza, se le aade un listener y se cazan eventos y adems se ejecutan mtodos cuando se ha cazado el evento. Y esto se puede ir repitiendo con otros contenedores y compo- nentes. La estructura es la misma. new Ventana().setVisible(true); } }); } // Variables declaration - do not modify // End of variables declaration } Programacin I 58 Resumen El concepto de fujo es una referencia amplia del proceso por el que pasa toda la informacin que interviene en nuestro programa, desde un punto de entrada hasta un punto de salida. Este proceso gestiona el estado de dicha informacin en cada uno de los puntos de nuestro programa. En todos los lenguajes de programacin existe un control de dicho proceso, sin embargo, slo en algunos de ellos, como Java, se incluye una serie de herramientas destinadas a la gestin de los datos por parte del programador. Operar con cheros no es una tarea sencilla de controlar, sin embargo es de gran utilidad en cuanto a tratamiento de la informacin se reere. El uso de archivos de apoyo en nuestros programas, tanto para la entrada como para la salida de datos, es una herramienta indispensable que debe dominar todo programador, sea cual sea el lenguaje en el que se especialice. El uso de cheros nos ofrece unas ventajas inestimables tanto para organizar la informacin entrante en nuestro programa como para gestionar la salida de datos o el reporte de errores con respecto a los usuarios nales de la aplicacin. Gracias a los controladores de eventos podremos controlar de forma precisa qu acciones se desen- cadenan en puntos concretos de nuestro cdigo, obteniendo as un acceso directo a posibles errores que puedan surgir en l. Las interfaces grcas de usuario (GUI) representan una herramienta muy verstil a la hora de disear aplicaciones, ya que, gracias al entorno visual que ofrecen, permiten programar de un modo slido y, al mismo tiempo, evaluar la experiencia nal y la usabilidad de la aplicacin diseada. Ir a los contenidos prcticos del captulo (e-learning). ndice 59 Introduccin al mdulo 1 Esquema de contenido 3 1. Identifcacin de los elementos de un programa informtico 5 1.1 Estructura y bloques fundamentales ........................................................................................................................................... 5 1.2 Utilizacin de los entornos integrados de desarrollo ........................................................................................................ 6 1.3 Proyectos y soluciones .......................................................................................................................................................................... 7 1.4 Datos: naturaleza y tipos ...................................................................................................................................................................... 8 1.4.1 Variables .............................................................................................................................................................................................. 9 1.4.2 Constantes ........................................................................................................................................................................................ 9 1.4.3 Literales ............................................................................................................................................................................................. 10 1.4.4 Tipos de datos .............................................................................................................................................................................. 11 1.5 Operadores ................................................................................................................................................................................................. 11 1.6 Expresiones ................................................................................................................................................................................................ 13 1.7 Conversiones de tipo ........................................................................................................................................................................... 14 1.8 Comentarios .............................................................................................................................................................................................. 15 2. Uso de estructuras de control 17 2.1 Estructuras de seleccin .................................................................................................................................................................... 17 2.1.1 Estructuras de seleccin en Java ...................................................................................................................................... 18 2.2 Estructuras de repeticin ................................................................................................................................................................... 19 2.2.1 Estructuras de repeticin en Java .................................................................................................................................... 20 2.3 Estructuras de salto ............................................................................................................................................................................... 23 2.4 Control de excepciones ..................................................................................................................................................................... 23 2.4.1 Excepciones en Java ................................................................................................................................................................. 24 2.5 Prueba y depuracin ............................................................................................................................................................................ 25 2.6 Documentacin ...................................................................................................................................................................................... 25 3. Aplicacin de las estructuras de almacenamiento 28 3.1 Estructuras .................................................................................................................................................................................................. 28 3.2 Creacin de arrays .................................................................................................................................................................................. 29 3.3 Inicializacin .............................................................................................................................................................................................. 31 3.4 Arrays multidimensionales ............................................................................................................................................................... 32 3.5 Cadenas de caracteres ........................................................................................................................................................................ 34 3.6 Listas ............................................................................................................................................................................................................... 35 3.7 Colecciones ................................................................................................................................................................................................ 36 ndice Programacin I Programacin I 60 ndice 4. Lectura y escritura de la informacin 39 4.1 Concepto de ujo .................................................................................................................................................................................. 40 4.2 Tipos de ujos: ujos de bytes y de caracteres .................................................................................................................... 40 4.4 Clases relativas a ujos ........................................................................................................................................................................ 41 4.3 Flujos predenidos ................................................................................................................................................................................ 41 4.5 Utilizacin de ujos ............................................................................................................................................................................... 42 4.6 Entrada desde teclado ........................................................................................................................................................................ 43 4.7 Salida a pantalla ....................................................................................................................................................................................... 43 4.8 Aplicaciones del almacenamiento de informacin en cheros ................................................................................ 44 4.9 Ficheros de datos. Registros ............................................................................................................................................................. 45 4.10 Apertura y cierre de cheros. Modos de acceso .............................................................................................................. 46 4.11 Escritura y lectura de informacin en cheros .................................................................................................................. 47 4.12 Almacenamiento de objetos en cheros. Persistencia. Serializacin .................................................................. 48 4.13 Utilizacin de los sistemas de cheros ................................................................................................................................... 48 4.14 Creacin y eliminacin de cheros y directorios ............................................................................................................. 49 4.15 Creacin de interfaces grcos de usuario utilizando asistentes y herramientas del entorno integrado ....................................................................................................................................................................... 50 4.16 Interfaces .................................................................................................................................................................................................. 51 4.17 Concepto de evento .......................................................................................................................................................................... 54 4.18 Creacin de controladores de eventos .................................................................................................................................. 54 4.19 Generacin de programas en entorno grco ................................................................................................................. 55