Sie sind auf Seite 1von 147

1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Aprendiendo Java y Programacin Orientada a Objetos


Gustavo Guillermo Prez www.compunauta.com gustavo@compunauta.com *Hasta que esta leyenda no desaparezca el libro no ha sido terminado, revisar: http://compunauta.com/forums/linux/programa cion/java/ebook.html para las actualizaciones diarias o semanales y para descargar el cdigo de los ejemplos. ESTE LIBRO ES LIBRE Y GRATUITO, CONSIDERA HACER UNA PEQUEA DONACIN EN LA WEB INDICADA ARRIBA. *Para navegar el ndice con Adobe Acrobat Reader, abrir favoritos o bookmarks Ultima actualizacin, lunes 11 de febrero de 2008

Prlogo

2
24 Este libro se hizo con la idea de proveer a mis 25 alumnos y cursos un material didctico con 26 qu 27 trabajar (tambin es til para profesores y 28 otros cursos) y al mismo tiempo dar una idea 29 concisa de lo 30 que significan los objetos en Java. La 31 programacin orientada a objetos en Java no 32 es tratada y enfocada 33 en muchos textos tutoriales, manuales o libros 34 sobre el tema y considero que es la etapa 35 inicial del 36 aprendizaje donde se falla en muchos cursos 37 respecto a Java. Por otro lado los estudiantes 38 que recin se 39 inician en la programacin, no podrn ir muy 40 lejos si no se les inculca los conceptos 41 bsicos, entonces 42 este material no avanzara de lleno sobre la 43 programacin orientada a objetos, sino hasta 44 que los 45 conceptos de programacin bsicos, como 46 tomas de decisin, bucles, variables etc, estn 47 fijados lo 48 suficiente. 49 Java es un lenguaje muy til debido a la 50 opcin multiplataforma que provee (desde PC, 51 Linux, 52 Windows, hasta MAC, telfonos, pocket PCs, 53 etc.) y veremos en el transcurso de este texto 54 como se

3
55 puede optimizar la ejecucin de una aplicacin 56 Java para que se aproxime a la ejecucin de 57 un binario 58 nativo como los que se compilan con gcc. 59 Por lo tanto suponer que el alumno posee 60 conocimientos avanzados de programacin 61 orientada a 62 objetos o de otros lenguajes de programacin 63 no siempre suele ser la mejor opcin, en este 64 libro 65 dejaremos en claro que el lenguaje de 66 programacin Java tiene sus operadores 67 matemticos bsicos y 68 tipos de datos bsicos sin importar que estos 69 mismos existan o no en otros lenguajes de 70 programacin. 71 Este libro se distribuye bajo la licencia GNU 72 GPL v2, con la excepcin que est prohibido 73 hacer 74 impresiones modificadas del texto, si alguien 75 tiene una sugerencia o una modificacin para 76 sugerir, 77 puede enviar al correo electrnico indicado la 78 informacin, para una futura actualizacin o 79 correccin. 80 Las sugerencias son bienvenidas. 81 82 83 84 85 86

I. TEMAS INTRODUCTORIOS
La Mquina Virtual de Java (JVM, Java Virtual Machine)
La mquina virtual de Java se denomina al procesador o entorno virtual que se utiliza para

4
87 interpretar los bytecodes de los binarios de 88 Java, ya que como sabemos Java se hizo 89 para correr en 90 cualquier plataforma sin recompilar los 91 binarios. De esta manera este entorno virtual 92 se puede obtener 93 para nuestra arquitectura y sistema operativo 94 sin modificaciones a nuestro programa original 95 (esto no es 96 cierto si utilizamos una mala dinmica de 97 programacin). 98 Podemos entonces generar un binario y este 99 podr Correr en Linux, MAC OSX, FreeBSD, 100 Solaris, o Windows, y para las arquitecturas 101 disponibles en las que podamos obtener la 102 JVM, como ser 103 AMD64, SPARC, PIV, etc. etc. 104 La mquina virtual de Java ha tenido la 105 caracterstica de ser un entorno de ejecucin 106 pesado en 107 trminos de recursos del procesador y 108 memoria, que por medio de una 109 administracin rigurosa del 110 sistema operativo estos podran llegar a ser 111 insuficientes y las aplicaciones ejecutarse de 112 manera muy 113 lenta. Esto no es cierto en la actualidad, 114 existen alternativas a la JVM provista por Sun 115 Microsystems 116 que permiten una velocidad comparable a una 117 aplicacin compilada en C++ nativa en la 118 arquitectura, un

5
119 ejemplo de esto es Kaffe, Kaffe 120 (www.kaffe.org) es una mquina de Java 121 OpenSource que puede 122 compilarse sin mayores modificaciones en 123 nuestra arquitectura necesaria y correr 124 increblemente ms 125 rpida que la distribucin estndar de JVM de 126 Sun Microsystems y consumir muchos 127 menos recursos. 128 Kit de desarrollo y Entorno de 129 ejecucin (JDK, JRE) 130 El Kit de desarrollo conocido como JDK (Java 131 Development Kit) provee de un compilador, un 132 mecanismo para comprimir un proyecto en un 133 solo archivo de tipo JAR (que es compatible 134 con ZIP) y 135 un entorno de ejecucin para nuestros 136 binarios. 137 Cuando nuestro proyecto terminado se 138 prepara para distribuir, no es necesario tener 139 el compilador 140 y la mayora de las herramientas que se 141 proveen en el JDK, entonces podemos 142 prescindir de dicho JDK 143 y utilizar el entorno de ejecucin que es ms 144 pequeo en cuestiones slo de espacio en 145 disco. Este JRE 146 (Java Runtime Environment) tambin puede 147 redistribuirse sin problemas de licencias. 148 En las plataformas basadas en Linux, existen 149 mejores herramientas de desarrollo y por 150 supuesto en

6
151 casi todas las distribuciones de Linux, se 152 encuentra disponible Kit de desarrollo o JDK. 153 As como 154 recomendamos Kaffe como JVM para 155 proyectos avanzados o de alto rendimiento, 156 recomendamos Jikes 157 como compilador de ByteCodes para Java, 158 Jikes no es interpretado como el compilador 159 proporcionado 160 en el JDK de Sun Microsystems. 161 Comandos que inician el JDK, JRE 162 Comando Descripcin 163 java Inicia el entorno de ejecucin recibiendo como 164 argumento el nombre del binario ejecutable 165 en formato ByteCodes sin la extensin de archivo .class 166 que identifica de manera visual un 167 binario java. Este comando es parte de JDK y JRE 168 javac Inicia el compilador Java recibiendo como 169 argumento todos los archivos de cdigo fuente 170 cuya terminacin es .java incluida dicha extensin. Este 171 comando no es parte de JRE. 172 jar Por medio de este comando iniciamos el 173 empaquetador de clases y archivos de Java que nos 174 permiten fabricar un nico archivo contenedor de 175 nuestras aplicaciones, multimedia y 176 grficos. Este comando es parte slo de JDK. 177 Salida por pantalla de los comandos 178 del JDK, JRE 179 Si abrimos una consola de comandos, y 180 ejecutamos estos comandos podremos 181 detectar la versin 182 del entorno de ejecucin y las rdenes de 183 entrada que estos soportan.

7
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220

En Linux, podemos abrir una XTerm, buscando el men ejecutar y escribiendo xterm. En Windows, podemos hacerlo abriendo el dilogo ejecutar y escribiendo command o cmd dependiendo si el sistema es basado en NT o 9X.
gus@gusgus ~ $ java Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args...] (to execute a jar file) where options include: -client to select the "client" VM -server to select the "server" VM -hotspot is a synonym for the "client" VM [deprecated] The default VM is client. -cp <class search path of directories and zip/jar files> -classpath <class search path of directories and zip/jar files> A : separated list of directories, JAR archives, and ZIP archives to search for class files. -D<name>=<value> set a system property -verbose[:class|gc|jni] enable verbose output -version print product version and exit -version:<value> require the specified version to run -showversion print product version and continue -jre-restrict-search | -jre-no-restrictsearch

8
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
include/exclude user private JREs in the version search -? -help print this help message -X print help on non-standard options -ea[:<packagename>...|:<classname>] enableassertions[:<packagename>...|:<clas sname>] enable assertions -da[:<packagename>...|:<classname>] disableassertions[:<packagename>...|:<cla ssname>] disable assertions -esa | -enablesystemassertions enable system assertions -dsa | -disablesystemassertions disable system assertions gus@gusgus ~ $ java -version java version "1.4.2-02" Java(TM) 2 Runtime Environment, Standard Edition (build Blackdown-1.4.2-02) Java HotSpot(TM) Client VM (build Blackdown-1.4.2-02, mixed mode) gus@gusgus ~ $

Usando Kaffe y Jikes


gus@gusgus ~ $ java -version java full version "kaffe-1.4.2" kaffe VM "1.1.6" Copyright (c) 1996-2005 Kaffe.org project contributors (please see the source code for a full list of contributors). All rights reserved. Portions Copyright (c) 1996-2002 Transvirtual Technologies, Inc. The Kaffe virtual machine is free software, licensed under the terms of the GNU General Public License. Kaffe.org is a an independent, free software

9
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
community project, not directly affiliated with Transvirtual Technologies, Inc. Kaffe is a Trademark of Transvirtual Technologies, Inc. Kaffe comes with ABSOLUTELY NO WARRANTY. Engine: Just-in-time v3 Version: 1.1.6 Java Version: 1.4 Heap defaults: minimum size: 5 MB, maximum size: unlimited Stack default size: 256 KB gus@gusgus ~ $ javac Usage: javac <options> <source files> where possible options include: -g Generate all debugging info -g:none Generate no debugging info -g:{lines,vars,source} Generate only some debugging info -nowarn Generate no warnings -verbose Output messages about what the compiler is doing -deprecation Output source locations where deprecated APIs are used -classpath <path> Specify where to find user class files -sourcepath <path> Specify where to find input source files -bootclasspath <path> Override location of bootstrap class files -extdirs <dirs> Override location of installed extensions -d <directory> Specify where to place generated class files -encoding <encoding> Specify character encoding used by source files -source <release> Provide source compatibility with specified release -target <release> Generate class files for specific VM version

10
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339
-help Print a synopsis of standard options gus@gusgus ~ $ gus@gusgus ~ $ jar Sintaxis: jar {ctxu}[vfm0Mi] [archivojar] [archivo-manifest] [-C dir] archivos ... Opciones: -c crear nuevo contenedor -t mostrar contenido de contenedor -x extraer archivos nombrados (o todos) del contenedor -u actualizar contenedor existente -v generar salida detallada en salida estndar -f especificar nombre de archivo contenedor -m incluir informacin de manifest del archivo manifest especificado -0 solo almacenar; no utilizar compresin ZIP -M no crear un archivo manifest para las entradas -i generar informacin de ndice para los archivos jar especificados -C cambiar al directorio especificado e incluir el archivo siguiente Si alguno de los archivos es un directorio, se procesar de forma recursiva. Se deben especificar los nombres del archivo manifest y del archivo contenedor en el mismo orden en que se especifiquen los indicadores 'm' y 'f'. Ejemplo 1: para archivar dos archivos de clase en un contenedor llamado classes.jar: jar cvf classes.jar Foo.class Bar.class Ejemplo 2: utilizar un archivo manifest existente, 'mymanifest', y archivar todos

11
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
los archivos del directorio foo/ en 'classes.jar': jar cvfm classes.jar mymanifest -C foo/ . gus@gusgus ~ $

Programacin Orientada a Objetos con Java


Como es sabido hay muchos lenguajes de programacin orientada a objetos POO que tienen muchas similitudes entre si, pero puntualmente nos enfocaremos en Java, utilizaremos para tal efecto un modelo de fbrica de objetos, para introducir los trminos clase, objeto, mtodo, propiedad, esttico, dinmico, donde la fbrica de objetos ser el entorno de ejecucin o JRE.
Ilustracin 1: La fbrica de Objetos dentro de JRE

Descripcin Emprica del funcionamiento del entorno JRE


Como podemos ver en la imagen anterior la fbrica de objetos utiliza memoria del sistema para fabricar los objetos, pero para fabricarlos necesita la informacin pregrabada llamada clases, las clases son las que almacenan las propiedades y mtodos que contendr un objeto. Un objeto cambiar sus propiedades o las propiedades de otros objetos por medio de los mtodos. Los mtodos que slo pueden

12
373 ejecutarse cuando el objeto existe, son los 374 denominados dinmicos, y los mtodos que 375 pertenecen a la 376 clase son denominados estticos, porque 377 pueden ser llamados sin necesidad de la 378 existencia de un 379 objeto. 380 En el ejemplo tenemos dos objetos, Reloj y 381 Lmpara los cuales tienen mtodos Cuerda e 382 Interruptor, que son los que cambiaran el 383 estado de las propiedades Hora e Iluminando. 384 La clase reloj, 385 podra tener un mtodo esttico llamado 386 poner_en_hora, para ajustar todos los relojes 387 fabricados. El 388 programa en ejecucin inicia en un mtodo 389 esttico ya que no existen inicialmente objetos 390 en nuestro 391 programa, este mtodo se llama main que se 392 define como: 393 static int main(String[] args){ 394 ..... 395 } 396 Donde args es un vector o arreglo 397 unidimensional que contendr los argumentos 398 que hayan sido 399 pasados al comando java despus de las 400 rdenes y el nombre de la clase principal que 401 alojar este 402 mtodo. El entorno de ejecucin o la JVM 403 fabricar objetos de sistema que podrn ser 404 utilizados

13
405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430

llamando a mtodos estticos de clases pertenecientes a la biblioteca de java.

RAM Objeto JVM Lmpara Clase Reloj Clase Lamp Objeto Reloj Propiedad Hora Propiedad Ilumina Mtodo Interruptor Mtodo Cuerda Programa en Ejecucin
Nota: Java provee una documentacin completa en ingls de toda la biblioteca incluida en la versin de JRE o JDK, una buena prctica es no utilizar las ms avanzadas y complejas funciones de la API (Application Programing Interface) ya que al querer

14
431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461

iniciar nuestro programa en una versin anterior que no tenga una biblioteca actualizada, se pueden producir problemas de mtodos faltantes.

Herencia soportada por Java


Java no soporta herencia mltiple, es decir no podemos fabricar un objeto ms complejo con dos diferentes ms simples, sino que slo podremos heredar objetos nuevos de un slo objeto padre, que proveer los mtodos y propiedades bsicas que sern extendidas y/o ampliadas por el nuevo objeto. Es decir no podramos tener un objeto Lmpara Reloj que derive del objeto Lmpara y del objeto Reloj, sino que tendramos que usar otros mecanismos para proporcionar esa funcionalidad, interfaces y alojamiento de objetos. Esto podra comprenderse como: Interfaces: Permiten que sean implementadas por objetos para adquirir comportamiento, pero el comportamiento no es provisto por la interfaz, sino que el programador debe proporcionar una manera eficaz de construir los mtodos definidos en dicha interfaz uno por uno. Pueden

15
462 implementarse varias interfaces al mismo 463 tiempo, en todos los casos es necesario 464 codificar 465 funciones o mtodos. 466 Alojamiento: Podemos pensar que al objeto 467 Lmpara le insertamos en su interior un objeto 468 Reloj 469 entonces podemos llamar a los mtodos del 470 Reloj que est en la Lmpara, esto lo veremos 471 ms 472 adelante en algunos ejemplos. Ya no sera la 473 Lmpara Reloj, pero sera una Lmpara con 474 Reloj. 475 Herencia: Nos permite crear un objeto nuevo 476 en base a uno existente, es una nueva clase 477 de 478 objeto, puede utilizar el alojamiento de otros 479 objetos como propiedades para adquirir 480 funcionalidad. 481 Tipos de datos Bsicos 482 En todos los lenguajes de programacin 483 existen tipos de datos bsicos con los que se 484 realizarn las 485 operaciones matemticas bsicas y las 486 operaciones booleanas de verdadero o falso. 487 Tipo de Datos Alcance o Rango 488 int de -2147483648 a 2147483647 (4bytes ) 489 byte de -128 a 127 (1Byete) 490 short de -32768 a 32767 (2Bytes) 491 long de -9223372036854775808 a 492 9223372036854775807 (8Bytes)

16
493 char de '\u0000' a '\uffff', ambos incluidos que 494 es lo mismo que de 0 a 65535, 1 letra 495 boolean 0 o 1 (1bit) 496 float 4Bytes, punto flotante 497 double 8Bytes, punto flotante 498 String No es un tipo de datos bsico, es un 499 objeto bsico, con propiedades y mtodos, 500 pero el lenguaje Java permite definir un nuevo 501 objeto con el delimitador (), por 502 lo que podemos concatenar (unir) texto 503 utilizando el operador (+) con los 504 nombres de los objetos de tipo String y los 505 trozos de texto delimitados con (). 506 Tabla 1: Tipos de datos bsicos 507 Operadores y Delimitadores Bsicos 508 Operador Datos Accin 509 + String Une texto (concatenador). 510 nmero Suma. 511 - nmero invierte el signo del nmero. 512 nmero Resta. 513 * nmero Multiplica y tiene prioridad sobre la suma y 514 resta. 515 / nmero Divide y tiene prioridad sobre la suma y resta. 516 % nmero Devuelve el resto de la divisin del operador 517 derecho por el izquierdo. 518 ! booleano El operador NOT booleano. 519 ~ nmero Invierte bit por bit el operando de la derecha 520 & entero o 521 booleano 522 El operador AND, booleano bit por bit del elemento a la 523 izquierda contra el de la 524 derecha. 525 && Cualquier El operador AND condicional. 526 | entero o

17
527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561
booleano El operador OR, booleano bit por bit del elemento a la izquierda contra el de la derecha. || Cualquier El operador OR condicional. << nmero Desplaza los bits hacia la izquierda la cantidad de la derecha. >> nmero Desplaza los bits hacia la derecha la cantidad de la derecha. >>> nmero Desplaza bits hacia la derecha pero no conserva el signo. == Cualquier El operador condicional de igualdad, devuelve verdadero si derecha e izquierda es lo mismo. < Bsicos Menor que, devuelve verdadero si izquierda es menor que derecha. <= Bsicos Menor o igual que, devuelve verdadero si izquierda es menor o igual que derecha. > Bsicos Mayor que, devuelve verdadero si izquierda es mayor que derecha. >= Bsicos Mayor o igual que, devuelve verdadero si izquierda es mayor o igual que derecha. = Cualquier Asigna al elemento de la izquierda, el de la derecha. (op)= Bsicos Hace la operacin op [+,-,*,/.etc..] entre los dos operandos y el resultado lo guarda en el de la izquierda. var++ Bsicos Incrementa en uno la variable var. var-- Bsicos Decrementa en uno la variable var. . objetos Separa los nombres de los objetos o propiedades o mtodos o nombres y jerarqua de clases. (int) tipo de datos Convierte un tipo de datos a entero, si reemplazamos int por una clase de objetos,

18
562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
podemos siempre y cuando sea correcto convertir al tipo de datos indicado entre parntesis. ; Cualquier Termina una lnea de orden. , Cualquier Separa argumentos de un mtodo o funcin. // Cualquier Empieza una lnea de comentario. /* */ Cualquier Delimitan un trozo de texto como comentario. /** */ Cualquier Delimitan un trozo de texto como documentacin para JavaDoc

Operador Datos Accin

{} Cualquier Delimitan un bloque de cdigo de una


estructura de datos.

( ) Cualquier Asocia una operacin teniendo prioridad,


o en caso de un mtodo agrupa los argumentos separados por comas. Tabla 2: Operadores Bsicos

Nombres de variables y funciones.


En Java los nombres de las variables y las funciones siguen ciertas reglas, por ejemplo las variables se acostumbra a nombrarlas con todas sus letras en minsculas, las funciones con la primer palabra que la identifica en minsculas y las palabras siguientes con la primer letra en maysculas y los nombres de las Clases de objetos con la primer letra de cada palabra que la define en maysculas. Ejemplos: Variables
int soles=3;

19
596 597 598 599 600 601 602 603 604 605
char salir='q';

Funciones:
public static int redondearPromedio(int[] valores){ ... }

Clases:
public class RelojAtomico{ .... }

606 607 Nota: En este captulo veremos como 608 codificar y compilar el primer programa, a 609 continuacin emplearemos los operadores 610 y tipos de datos bsicos y por ltimo 611 veremos las estructuras de datos bsicas 612 soportadas por Java. 613 El primer programa 614 Suponemos que nuestro sistema operativo ya 615 tiene instalado el kit de desarrollo (JDK) y 616 procedemos a abrir un editor de texto de 617 nuestro gusto. En KDE, podemos abrir kwrite 618 en otros sistemas 619 busquemos block de notas u otro editor como 620 EditPlus, de todas maneras cualquier editor 621 estar bien. 622 Dentro del editor de textos escribiremos lo 623 siguiente: 624 public class HolaMundo { 625 public static void main(String[] args) { 626 System.out.println("Hola, mi primer programa"); 627 } 628 }

II. Codificacin Inicial y Estructuras de Datos

20
629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661

El archivo debe guardarse como HolaMundo.java respetando las maysculas y minsculas, necesitamos compilar el programa para obtener el binario con extensin class, entonces procedemos a llamar al compilador con una consola de comandos para poder despus usar la JVM (comando java) para correr el programa, pero para trabajar mejor haremos una carpeta donde guardaremos los ejemplos, para los que usen Windows hganla en la unidad c:\ y nmbrenla ejemplos, para los que usamos un sistema mejor, en nuestra carpeta de usuario y la llamamos ejemplos tambin slo que en minsculas.
gus@gusgus ~ $ cd ejemplos gus@gusgus ~/ejemplos $ javac HolaMundo.java gus@gusgus ~/ejemplos $ java HolaMundo Hola, mi primer programa gus@gusgus ~/ejemplos $

Nota: Ms adelante veremos como utilizar un editor basado en Java para practicar este curso, antes de explicar lnea por lnea del programa, es necesario introducir un tema que ser utilizado con mucha frecuencia, estos son los paquetes, los cuales darn el concepto de Clase Pblica.

Paquetes

21
662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692

En el ejemplo anterior hemos omitido una parte esencial de la programacin en el lenguaje Java, estos son los Paquetes, se utilizan para diferenciar una clase respecto de otras con el mismo nombre, si nos ponemos a pensar sobre la cantidad de nombres diferentes de clases que podemos poner a los tipos de objetos en nuestros programas es infinita, pero dos programadores diferentes pueden llegar a usar dos veces el mismo nombre para una misma clase, de esta manera podemos hacer que slo las clases de objetos que haremos visibles a otros programadores o que ejecutarn el componente principal del programa (el mtodo esttico main) sean pblicas. Las clases de objetos que no queramos hacer visibles a otros componentes de nuestro proyecto, entonces se podrn declarar como privadas, de esa manera slo una clase de objetos que pertenezca al grupo de clases podr acceder a las dems privadas. Los paquetes suelen tener un nombre especial referente al de la organizacin que realiza el

22
693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723

proyecto, esto es una sugerencia, en realidad se puede utilizar casi cualquier nombre, as que por ejemplo si nuestra empresa es compunauta, y el nombre de dominio de los servicios que se proporcionan en Internet es compunauta.com, entonces nuestro paquete podra llamarse com.compunauta y a su vez si tenemos un subproyecto, este podramos nombrarlo como com.compunauta.aprendiendojava, slo tengamos en cuenta que es el orden inverso de como aparecera en Internet. Usamos puntos para separar los nombres y tenemos cuidado respecto de las maysculas y minsculas. Nota: El lenguaje Java es sensible a las maysculas y minsculas, es decir si tenemos el nombre del paquete com.compunauta.aprendiendojava no ser lo mismo si lo escribimos como com.compunauta.AprendiendoJava. De la misma manera no es lo mismo HolaMundo que holamundo.

Palabras clave o reservadas


Las palabras clave o reservadas son aquellas que definen o se combinan con una definicin de

23
724 datos de una variable o propiedad, clase de 725 objetos o mtodos, por ejemplo class es una 726 palabra clave y 727 nos indica que a continuacin pondremos el 728 nombre a la clase de objeto que vamos a 729 crear, si queremos 730 que dicha clase pueda ser accedida desde 731 dentro o fuera de nuestro paquete de clases 732 de objetos, 733 entonces la definiremos como public (pblica), 734 donde esta es otra palabra clave. 735 A veces las palabras claves son palabras 736 reservadas, por ejemplo goto es una palabra 737 clave 738 reservada en Java, ya que no tenemos 739 permitido saltar a una lnea en particular de 740 nuestro programa, 741 tenemos que trabajar con llamadas a 742 funciones y otras maneras de codificacin. 743 Tipos de datos 744 Definen tipos de datos que devolvern los 745 mtodos o los tipos de datos que definirn una 746 propiedad bsica. Estos ya los habamos visto 747 anteriormente pero ahora los describiremos 748 por el espacio 749 que ocupan en memoria. 750 Palabra Clave Significado 751 boolean Valores Booleanos (1bit*) 752 byte 1Byte, nmero entero (8bits) 753 short 2Bytes, nmero entero 754 int 4Bytes, nmero entero 755 long 8Bytes, nmero entero 756 char 2Bytes, (short) 1Caracter

24
757 float 4Bytes, punto flotante. 758 double 8Bytes, punto flotante, doble precisin 759 void Cuando no hay nada que devolver 760 null Tipo de datos Nulo, vaco, cualquier operacin 761 sobre null produce un error. 762 Tabla 3: Palabras claves - Tipos de datos 763 Permisos y declaracin de clases, 764 propiedades o mtodos. 765 Definen los permisos a un mtodo o clase de 766 objetos, haciendo visible u oculto un mtodo 767 propiedad o clase a otras clases de objetos u 768 otros objetos que quieran accederlas. 769 Palabra clave Significado 770 public Para una clase, que es accesible desde cualquier 771 parte, para un mtodo, que es 772 accesible por cualquier mtodo que pueda acceder a la 773 clase de objetos. Para que 774 una clase que deriva de otra tiene que ser pblica la 775 clase de objetos padre para 776 poder ser accecible. 777 private Slo se permite a la misma clase de objetos 778 acceder a sus propiedades o mtodos. 779 protected Slo se permite al paquete acceder a esta 780 clase. 781 package Define a que paquete pertenece una clase. 782 import Define que paquetes usaremos, para no escribir 783 el nombre completo de la clase a la 784 que hacemos referencia como: 785 com.compunauta.aprendiendojava.HolaMundo 786 class Inicia la declaracin de una Clase (tipo de datos). 787 new Instancia un objeto, crea un objeto partiendo de 788 una clase en particular. 789 Tabla 4: Palabras clave - Permisos y Declaraciones 790 Bucles y tomas de decisin 791 Se utilizan para el control de bucles y tomas 792 de decisin en un programa, se utilizan 793 parntesis ()

25
794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831

para encerrar las condiciones, y llaves {} para los bloques de datos


Palabra clave Significado if (condicion){ .... } else { .... } Ejecuta el bloque separado por {} siempre y cuando se cumpla la condicin, acompaada a esta estructura existe else (sin) que es para el caso contrario a la condicin, sin tener que evaluar la condicin negada. for (inicial;condicin;repeticin){ .... } Se ejecuta la sentencia inicial, y si se cumple la condicin se ejecuta el cdigo en el interior de la llaves, una vez que se termina se ejecuta la repeticin y se vuelve a comparar la condicin, mientras la condicin sea cierta el bloque encerrado entre llaves se seguir ejecutando. while (condicin){ .... } Mientras se cumpla la condicin entre parntesis, se ejecuta el cdigo en el interior de {} de manera infinita hasta. switch (varieblenumrica){ case num1: ..... break; case num2: ..... break; default: }

26
832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870
La sentencia switch es un tanto compleja y probabilsticamente poco usada ya que no puede usarse con objetos y las comparaciones son primitivas, en algunos trozos o segmentos de cdigo es crucial para optimizar la velocidad de nuestro programa, de acuerdo al contenido de la variable numrica se ejecuta la sentencia case que coincida, cada bloque de cdigo debe terminar con break, ya que en caso contrario se seguir ejecutando la siguiente clusula case, existe una opcin default que es para cuando ninguno de los casos resulta ser el correcto. do{ ... }while(condicin); El bloque dentro de la palabra clave do, se ejecutar al menos una vez y si la condicin de while se cumple, se repetir mientras sea cierta. break Interrumpe un bloque y se ejecuta la siguiente lnea fuera de l. continue Interrumpe el resto del cdigo del bloque y vuelve a empezar con la siguiente iteracin. return Interrumpe el mtodo entero y devuelve el tipo de datos de la derecha al punto donde se llam a la funcin. Tabla 5: Palabras Clave - Control de Flujos, tomas de decisin

Reservadas
Palabra clave Significado goto Palabra reservada en el lenguaje de programacin Java, no puede utilizarse pero el compilador en ciertas ocasiones es capaz de generar un comportamiento similar en las optimizaciones, de tal manera que los binarios si podran estar utilizando este

27
871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907
tipo de salto a una etiqueta. const Palabra reservada que no es utilizada por el momento en Java. Tabla 6: Palabras clave Reservadas

Excepciones, control de errores En casi todos los lenguajes de programacin existen mecanismos para actuar segn sucedan errores de cualquier tipo, desde accesos al disco hasta divisin por cero, los cuales de no ser manipulados por nuestro programa tendrn el comportamiento por defecto de la mquina virtual de java, que es reportarlos como excepciones y terminar el programa.
Palabra clave Significado throws Indica que tipo de excepciones lanzar este mtodo en caso de errores, es til para que los mtodos que llaman a este que lanzar una excepcin en caso de errores, se vean obligados a tratar esa situacin. throw Transfiere el control de errores al manejador de excepciones. try{ ... }catch(tipo excepcion){ ... }finally{ ... } Esta es la estructura de un manejador de excepciones o control de errores, try inicia el bloque de cdigo que ser manejado en caso de errores, la sentencia catch indica el tipo de excepcin que se capturar, esta ltima puede repetirse para hacer cosas

28
908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939
diferentes de acuerdo por ejemplo si el problema fue una divisin por cero o un error de acceso de disco. La sentencia finally se ejecutar de todas maneras al salir del cdigo. Si una excepcin no es capturada por el listado de clusulas catch, entonces es probable que la JVM inicie el reporte y la salida de la instancia completa de la JVM, interrumpiendo todos los hilos de ejecucin. Tabla 7: Palabras clave - Control de errores

Secuencias de escape
Las secuencias de escape son aquellas combinaciones de caracteres que nos permiten insertar un caracter especial que no es posible tipear con el teclado estndar o que no es posible utilizar porque denota un trozo de texto, por ejemplo las comillas dobles en el ejemplo hola mundo que estn dentro de la funcin println.
System.out.println("Hola, mi primer programa");

Si quisiramos incluir las comillas dobles en la ejecucin deberamos incluirlas con una secuencia de escape, para ello se utiliza la barra invertida \ seguida de las comillas dobles \.
System.out.println("\Hola, mi primer programa\");

De esa manera el compilador entiende que el trozo de texto contendr las comillas dobles, pero

29
940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974

que pasara si quisiramos escribir el caracter \ que en algn sistema operativo distinto de Linux podra significar divisin de directorios o carpetas, bueno para esto usaramos una \ seguida de otra \, es decir \\ para insertar el caracter \.
System.out.println("Hola, mi primer programa, est en c:\\");

Aqu hay una lista de las secuencias de escape ms usadas y una breve explicacin de su utilidad, ya que Java soporta Unicode, una representacin extensa de lo que es un caracter que permite inclusin de varios idiomas.
Secuencia Significado \b Retroceder un espacio (backspace) \t Tabulador Horizontal, sirve para alinear texto en la salida estndar de datos cuando es una terminal o consola de comandos. \n Salto de lnea, es el caracter usado incluso en las viejas impresoras que necesitaban avanzar de lnea para escribir en el prximo rengln. \r Retorno de carro, es el caracter que devuelve el cursor o el cabezal de la imprezora al inicio del rengln, Linux, usa \n para un nuevo rengln en los archivos de texto, Windows utiliza una combinacin \n\r. \ Insertan las comillas dobles \' Insertan la coma simple. \\ Insertan la misma barra invertida que usamos como escape. \DDD Las tres D son dgitos y representan un caracter en su versin octal.

30
975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008
\uDDDD Las cuatro D son dgitos y representan un caracter unicode en hexadecimal.

Concatenacin y conversiones a texto


La concatenacin de texto se denomina a la unin de trozos o fragmentos de textos y comnmente se utiliza la conversin de nmeros o de objetos a su representacin en texto, Java convierte automticamente los tipos de datos bsicos a texto antes de unirlos y llama por cada objeto al mtodo especial toString() para realizar la conversin de objetos nuestros o de la biblioteca de la JVM. Veamos un ejemplo:
1. public class SumaSimple { 2. public static void main(String[] args) { 3. int a=1; 4. System.out.println("el valor de a="+a); 5. a=a+10; 6. System.out.println("ahora sumndole 10 es a="+a); 7. } 8. }

En la lnea 1, definimos el nombre de la clase, que es pblica y se llama SumaSimple, en la segunda lnea definimos el mtodo esttico main que es el que la JVM ejecutar para iniciar nuestros programas. Nota: El arreglo o vector args se utiliza para recibir todas las rdenes de la JVM, los

31
1009 vectores en Java son objetos que tienen 1010 propiedades. 1011 En la lnea 3, se define una variable de tipo 1012 entero llamada a que inicialmente guardar 1013 un 1 1014 positivo, la 4ta lnea ejecuta el mtodo 1015 println(String line) que pertenece al objeto out 1016 que a su vez es 1017 propiedad del objeto System, tener un objeto 1018 de salida, se imprimir en pantalla el trozo de 1019 texto el 1020 valor de a= seguido del valor (el contenido de 1021 a). 1022 En la lnea 5, al contenido de la variable a, le 1023 agregamos el resultado de sumar a+10, eso 1024 no tiene 1025 que dar un total de 11 que se ver reflejado en 1026 la lnea 6, cuando volvemos a llamar al 1027 mtodo println 1028 del objeto out que pertenece al objeto System. 1029 En las lneas 7 y 8 se cierran las llaves que 1030 iniciaron los bloques de cdigo del mtodo 1031 main o la 1032 declaracin de la clase SumaSimple. 1033 Nota: Slo como comentario lo que en 1034 realidad el compilador est haciendo al 1035 llamar a 1036 println, es concatenar texto, para ello es 1037 necesario convertir el nmero en texto, 1038 internamente el compilador estar 1039 llamando a una clase que es parte de la 1040 biblioteca

32
1041 cuyo nombre es Integer y posee un mtodo 1042 toString() que convertir el nmero, a su 1043 vez, el trozo de texto pertenecer a la 1044 propiedad de un objeto String el cual tiene 1045 un 1046 mtodo concat() que es el encargado de 1047 producir un nuevo objeto igual a la suma 1048 de 1049 los dos trozos de texto. 1050 El ejemplo podra escribirse as: 1051 1. public class SumaSimple2 { 1052 2. public static void main(String[] args) { 1053 3. int a=1; 1054 4. System.out.println("el valor de 1055 a=".concat(Integer.toString(a))); 1056 5. a=a+10; 1057 6. System.out.println("ahora sumndole 10 es 1058 a=".concat(Integer.toString(a))); 1059 7. } 1060 8. } 1061 Donde se ha reemplazado la concatenacin 1062 del compilador por su equivalente, 1063 recordemos que no es 1064 necesario hacer esto, vemos que despus de 1065 las comillas dobles encontramos un punto, 1066 eso es porque de 1067 esa manera se representa un objeto String, 1068 cualquier trozo de texto entre comillas dobles 1069 es un objeto 1070 String y tiene propiedades y el punto separa 1071 objetos de otros objetos, propiedades o 1072 mtodos.

33
1073 Nota: Las lneas que no empiezan con 1074 nmero representan la continuacin de la 1075 anterior 1076 que por cuestiones de espacio no entra en 1077 la misma lnea, esa representacin es la 1078 misma que en muchos editores de cdigo, 1079 al guardarse estos archivos se guardarn 1080 como una nica lnea, sin importar cuantos 1081 renglones sean necesarios para ver todo 1082 su contenido. 1083 En ambos casos la salida por pantalla ser la 1084 misma y la siguiente: 1085 gus@gusgus ~ $ cd ejemplos 1086 gus@gusgus ~/ejemplos $ javac 1087 SumaSimple.java 1088 gus@gusgus ~/ejemplos $ java SumaSimple 1089 el valor de a=1 1090 ahora sumndole 10 es a=11 1091 gus@gusgus ~/ejemplos $ javac 1092 SumaSimple2.java 1093 gus@gusgus ~/ejemplos $ java SumaSimple2 1094 el valor de a=1 1095 ahora sumndole 10 es a=11 1096 gus@gusgus ~/ejemplos $ 1097 Salida por pantalla y entrada por 1098 teclado 1099 Para los siguientes ejemplos ya tenemos casi 1100 todo discutido, excepto que por cuestiones 1101 educativas sera interesante que el programa 1102 no solo contenga los valores que interactuarn 1103 almacenados, sino que tambin sea posible 1104 preguntar al usuario. 1105 System.out

34
1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137

El objeto System es parte de la biblioteca de Java y es instanciado o fabricado al iniciar la JVM mucho antes que se comience a ejecutar nuestro programa. Este almacena 3 objetos, son out, in y err. El objeto out es del tipo o clase Printstream que tiene las siguientes propiedades y mtodos importantes, no listaremos todos:

Resumen de Mtodos
boolean checkError() Enva todo el buffer y devuelve verdadero si hay error o falso. void close() Cierra el flujo de datos void flush() Enva todo el buffer. void print(boolean b) Imprime una variable booleana void print(char c) Imprime un caracter. void print(char[] s) Imprime un arreglo de caracteres. void print(double d) Imprime un numero de tipo double. void print(float f) Imprime un nmero de punto flotante. void print(int i) Imprime un entero. void print(long l) Imprime un entero largo.

35
1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168
void print(Object obj) Imprime un objeto, invocando su funcin toString() void print(String s) Imprime un objeto de tipo String void println() Imprime una separador de nueva lnea. void println(boolean x) Imprime un valor booleano y termina la lnea. void println(char x) Imprime un caracter y termina la lnea. void println(char[] x) Imprime un arreglo de caracteres y termina la lnea. void println(double x) Imprime un nmero de precisin doble y termina la lnea. void println(float x) Imprime un nmero de punto flotante y termina la lnea. void println(int x) Imprime un entero y termina la lnea. void println(long x) Imprime un entero largo y termina la lnea. void println(Object x) Imprime un objeto invocando su mtodo toString() y termina la lnea. void println(String x) Imprime un trozo de texto y termina la lnea. Tabla 8: Resumen de mtodos importantes para out.

System.in

36
1169 El objeto in que es una propiedad de System 1170 es de la clase o tipo InputStream, que tambin 1171 es 1172 parte de la biblioteca de Java. Aqu vemos los 1173 mtodos que nos interesan. 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199

Resumen de Mtodos
int available()

Devuelve la cantidad de bytes que se pueden leer (o pasar por alto) desde esta entrada sin bloquear la prxima llamada a lectura. void close() Cierra esta entrada de datos y libera todos los recursos asociados.
abstract int

read() Lee el prximo byte de datos desde la entrada, espera por los datos. int read(byte[] b) Lee de la entrada los bytes que llenan el arreglo b, devuelve la cantidad de bytes que se almacenaron. int read(byte[] b, int off, int len) Lee hasta len bytes de datos adentro del arreglo de bytes b empezando en off. long skip(long n) Salta y destrulle los n caracteres de datos.
Tabla 9: Resumen de mtodos importantes del tipo de objetos in.

System.err

37
1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235

Este objeto es del mismo tipo que out (Printstream) y tiene las mismas propiedades, en los sistemas operativos derivados de Unix como ser Linux, existe mucho la diferencia entre salida estndar de datos (System.out) y la salida estndar de errores (System.err), por ejemplo al imprimir todos los carteles de errores en un tipo de salida no afectaramos a los resultados, un ejemplo sera el siguiente:
public class SumaSimple3 { public static void main(String[] args) { int a=1; System.err.println("el valor de a="+a); System.out.println(a); a=a+10; System.err.println("ahora sumndole 10 es a="+a); System.out.println(a); } }

Si este cdigo lo compilamos al ejecutarlo podemos separar los comentarios de los valores de a.
gus@gusgus ~ $ cd ejemplos gus@gusgus ~/ejemplos $ javac SumaSimple3.java gus@gusgus ~/ejemplos $ java SumaSimple3 el valor de a=1 1 ahora sumndole 10 es a=11 11 gus@gusgus ~/ejemplos $ java SumaSimple3 > resultados.txt el valor de a=1

38
1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268
ahora sumndole 10 es a=11 gus@gusgus ~/ejemplos $ java SumaSimple3 2> errores.txt 1 11 gus@gusgus ~/ejemplos $

De esa manera generamos y almacenamos por separado los errores y los resultados. Nota: Es muy buena prctica acostumbrarse a separar los datos de errores a cada flojo de datos err y out, ya que si el flujo fuera un protocolo de comunicacin mezclaramos los datos con los errores.

System.exit(int cod);
El mtodo esttico exit(cod) de la clase System interrumpe la ejecucin total del programa y devuelve el control al sistema operativo, es decir la JVM termina por completo liberando los recursos. Un cdigo de salida igual a cero es considerado como una ejecucin satisfactoria del programa, un cdigo diferente a este, se considera un error y sirve para que el sistema operativo u otro programa que llame al nuestro sepa de alguna manera que ocurri.

Leer lneas de la entrada estndar.


Para leer lneas de la entrada estndar podemos utilizar una combinacin de objetos de la

39
1269 biblioteca que nos permitirn simplemente 1270 esperar a que el usuario ingrese texto y 1271 presione enter, o 1272 podemos codificar la lectura secuencial de 1273 caracteres uno en uno hasta que se detecte 1274 un salto de lnea, 1275 tengamos en cuenta que java es 1276 multiplataforma, y si el sistema operativo no es 1277 Linux, es probable que 1278 se introduzca ms de un caracter para el salto 1279 de lnea lo cual incrementa la complejidad del 1280 problema. 1281 1. package com.compunauta.aprendiendojava; 1282 2. import java.io.*; 1283 3. public class LeerRenglones { 1284 4. public static void main(String[] args) { 1285 5. BufferedReader br=new BufferedReader(new 1286 InputStreamReader(System.in)); 1287 6. System.out.println("Hola, ingresa tu nombre"); 1288 7. String nombre; 1289 8. try {nombre = br.readLine();} 1290 9. catch (IOException ex) 1291 {ex.printStackTrace();System.exit(-1);} 1292 10. System.out.println("Hola, "+nombre+" ten un buen 1293 da"); 1294 11. System.exit(0);} 1295 12.} 1296 Nota: Queda como ejercicio para el lector 1297 ver los mtodos y propiedades de la 1298 documentacin de la api proporcionada 1299 por Sun Microsystems (java.sun.com) para 1300 las clases BufferedReader, 1301 InputStreamReader y Exception. 1302 Crear Objetos (de la biblioteca de 1303 Java)

40
1304 En java para crear objetos utilizamos una 1305 palabra clave, new, esta misma crea un objeto 1306 del tipo 1307 indicado a su derecha, repasemos del ejemplo 1308 anterior la siguiente lnea: 1309 BufferedReader br=new BufferedReader(new 1310 InputStreamReader(System.in)); 1311 La clase BufferedReader, pertenece a la 1312 biblioteca de Java java.io la cual fue 1313 importada antes de la 1314 declaracin de la clase LeerRenglones, 1315 InputStreamReader, pertenece a la misma 1316 biblioteca. 1317 Nota: En este punto, estamos utilizando y 1318 creando objetos pertenecientes a la 1319 biblioteca, 1320 como podemos ver la declaracin de 1321 nuestra clase LeerRenglones no tiene 1322 propiedades ni mtodos dinmicos que 1323 puedan llegar a ser mtodos de algn 1324 objeto, 1325 slo el mtodo esttico main que es el que 1326 nos permite iniciar la ejecucin de cdigo. 1327 Tambin podramos haber usado 1328 DataInputStream. 1329 Veamos que significa cada parte de esta 1330 lnea, el concepto de BufferedReader br= es 1331 una 1332 asignacin y una declaracin simultnea, 1333 como vimos antes el signo = asigna a la 1334 variable u nombre

41
1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366

de objeto de la izquierda el contenido de la derecha. Eso quiere decir que br ser una variable que apuntar a un objeto del tipo BufferedReader, br no ser un objeto, ser el nombre con el que accederemos al objeto en memoria ram, si en la siguiente lnea repitiramos otra asignacin a br, es decir br=.... sin la declaracin porque ya se sabe que es del tipo BufferedReader, entonces la variable br apuntar a otro objeto del tipo BufferedReader, el anterior sigue existiendo en memoria, pero ser eliminado en la prxima ejecucin del recolector de basura de la JVM. Cada vez que se crea un objeto nuevo el nombre de la clase se utiliza como el de una funcin, en realidad esta funcin especial es el mtodo llamado constructor de la clase que es el que fabricar e inicializar de acuerdo a las variables que recibe como argumentos uno nuevo del tipo de su clase. Esto lo veremos ms adelante, por el momento slo haremos mencin de que el objeto BufferedReader, necesita otro objeto que no es del tipo InputStream como lo es el objeto System.in, En cambio necesita

42
1367 uno del tipo InputStreamReader, que es el que 1368 es capaz de transformar un objeto 1369 InputStream, en 1370 InputStreamReader que es requerido para que 1371 el constructor de BufferedReader fabrique un 1372 objeto 1373 BufferedReader, a partir de uno 1374 InputStreamReader. 1375 Nota: Todo este procedimiento tiene el 1376 nico fin de tener una variable llamada br 1377 que 1378 apunta a un objeto de tipo BufferedReader 1379 que es capaz de leer lneas desde la 1380 entrada, como lo construimos con la 1381 entrada del teclado, nos leer los 1382 renglones que 1383 pretendamos sin codificar la entrada del 1384 salto de lnea. 1385 El bloque de control de errores, 1386 try{}catch(){} 1387 Como podemos ver en este ejemplo 1388 utilizamos la estructura de control de errores 1389 que es 1390 obligatoria para esa conversin que hicimos 1391 para poder leer lneas con el mtodo 1392 readLine(), la 1393 estructura try{} encierra entre las llaves el 1394 cdigo que puede producir una excepcin (un 1395 error grave) 1396 que debe ser manejado por el bloque 1397 catch(Exception ex){}, en este caso solo 1398 capturamos la excepcin

43
1399 que puede surgir y cualquier otra que no sea 1400 IOException no ser capturada. 1401 try {nombre = br.readLine();} 1402 catch (IOException ex) {ex.printStackTrace();} 1403 Catch captura un tipo de error dentro del 1404 bloque try{}, y el bloque encerrado entre llaves 1405 ejecutar 1406 cdigo que debera manejar la excepcin, en 1407 este caso ignoramos todo tipo de accin que 1408 podramos 1409 llevar a cabo y usamos la variable ex del tipo 1410 IOException para imprimir en pantalla los 1411 errores con el 1412 mtodo printStackTrace de dicho objeto. 1413 Ejercicios 1414 En esta y todas las secciones de ejercicios 1415 veremos la solucin a uno o dos, y el resto 1416 quedarn 1417 para ejercitacin del lector, en el material 1418 multimedia que se adjunta con este libro tal 1419 vez se encuentren 1420 otras soluciones a los dems problemas. 1421 2.1. Entrada de Datos y 1422 conversiones. [if, try, catch] 1423 Preguntar el nombre del usuario y su edad, 1424 mostrar cuantos aos tendra en una dcada 1425 ms y 1426 clasificar segn su edad en A[0-25], B[26-50], 1427 C[51-...]. La salida por pantalla debera ser 1428 algo como la 1429 siguiente: 1430 Nombre:? 1431 Gustavo

44
1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468
Edad:?29 Usuario Gustavo de Categora B, en una dcada tendr 39 aos.

Nota: Al preguntar por el nombre el cursor debe quedar debajo y al preguntar por la edad junto, utilizar la estructura try{ }catch(){ } y los bloques if(){ }. Tambin buscar en la documentacin de la API los mtodos parseInt( ) de la clase Integer. Solucin:
1. package com.compunauta.aprendiendojava; 2. import java.io.*; 3. /** 4. * <p>Ttulo: Aprendiendo Java</p> 5. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de Compunauta</p> 6. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p> 7. * <p>Empresa: COMPUNAUTA</p> 8. * @author Gustavo Guillermo Prez 9. * @version 2006.01.01 10. */ 11. 12.public class Cap2Ej1 { 13. public static void main(String[] args) { 14. //Definimos el objeto br para leer lneas de la entrada 15. BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 16. //Definimos variables nombre, edad y categora dndole valores por defecto 17. String nombre=""; 18. int edad=0; 19. char categoria='A'; 20. //Iniciamos el bloque que podr producir errores

45
1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502
21. try { 22. System.out.println("Nombre:?"); 23. nombre = br.readLine(); 24. System.out.print("Edad:?"); 25. edad=Integer.parseInt(br.readLine());} 26. //capturamos cualquier excepcin que se pueda producir y la reportamos 27. catch (Exception ex) {ex.printStackTrace(System.err);System.exit(-1);} 28. //Como por defecto la categora es A, revisamos si aumentamos a B o C 29. if(edad>25){categoria='B';} 30. if(edad>50){categoria='C';} 31. //Imprimimos en pantalla la respuesta solicitada 32. edad+=10; 33. System.out.println("El usuario "+nombre+" de categora "+categoria+" en una dcada tendr "+edad+ " aos"); 34. System.exit(0); 35. }//final de main 36.}//final de la clase

Comentarios: Capturamos Exception, porque pueden producirse dos tipos de errores, uno el de IOException, como vimos en el ejemplo de lectura de renglones de este captulo y el otro al ingresar texto en vez de un nmero. Utilizamos System.exit(-1); para salir del programa inesperadamente. Es conveniente que el alumno reemplace la doble creacin de objetos por la de DataInputStream, que para nuestro caso es el

46
1503 mismo comportamiento, pero tengamos en 1504 cuenta que la funcin readLine() de 1505 DataInputStream no est 1506 recomendada por los nuevos kits de desarrollo 1507 solo existe por compatibilidad. 1508 2.2 NumberFormatException 1509 while(){} 1510 Basados en el enunciado del ejemplo anterior, 1511 capturar correctamente los errores de entrada 1512 de 1513 datos respecto de los de conversin de texto 1514 en nmeros. Imprimir en pantalla con 1515 printStackTrace, para 1516 el caso de entrada, y avisar al usuario que la 1517 edad no fue ingresada correctamente. 1518 Idea: Utilizar un bloque while para forzar al 1519 usuario a ingresar denuevo su nombre y 1520 edad 1521 si se detecta un error. 1522 2.3 Mezcla de bucles do{} while(); y 1523 for(;;){} 1524 Pedir por teclado el nombre al usuario, y a 1525 continuacin solicitar 10 puntuaciones de 1526 supuestos 1527 exmenes, para promediarlos, la salida por 1528 pantalla debera ser algo as: 1529 Nombre?Csar 1530 Examen 1? 10 1531 Examen 2? 7 1532 Examen 4? 8.5 1533 .... 1534 Examen 10? 9.3 1535 Csar, tu promedio es de 8.93

47
1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571

Nota: Utilizar variables que permitan almacenar decimales, revisar en la documentacin las otras Clases que proveen mtodos de conversin con decimales de texto a nmeros. Y Buscar en la clase Math, los mtodos estticos que permitan redondear los decimales. Y por supuesto repetir el ingreso de los Exmenes que que hayan sido ingresados incorrectamente. Solucin:
1. package com.compunauta.aprendiendojava; 2. import java.io.*; 3. /** 4. * <p>Ttulo: Aprendiendo Java</p> 5. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de Compunauta</p> 6. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p> 7. * <p>Empresa: COMPUNAUTA</p> 8. * @author Gustavo Guillermo Prez 9. * @version 2006.01.01 10. */ 11. 12.public class Cap2Ej3 { 13. public static void main(String[] args) { 14. //Definimos el objeto br para leer lneas de la entrada 15. BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 16. //Definimos variables nombre, error y acumulador dndole valores por defecto 17. String nombre="";

48
1572 18. float acumulador=0; 1573 19. boolean error; 1574 20. //Iniciamos el bloque que podr producir errores, 1575 slo para el nombre 1576 21. try { 1577 22. System.out.println("Nombre:?"); 1578 23. nombre = br.readLine();} 1579 24. catch (Exception ex) 1580 {ex.printStackTrace(System.err);} 1581 25. //iniciamos una iteracin del 0 al 9 1582 26. for(int i=0;i<10;i++){ 1583 27. error=false; 1584 28. //iniciamos el bloque do{} while(); que se repetir en 1585 caso de error 1586 29. do{ 1587 30. error=false; 1588 31. //iniciamos el bloque try que podr dar error de 1589 conversin numrica 1590 32. try{ 1591 33. //ponemos i+1 entre (), caso contrario se 1592 concatenarn como texto 1593 34. System.out.print("Examen "+(i+1)+"? "); 1594 35. acumulador+=Float.parseFloat(br.readLine()); 1595 36. }catch(NumberFormatException 1596 ex){System.out.println("Error, ingresar 1597 denuevo");error=true;} 1598 37. catch(IOException 1599 ex){ex.printStackTrace();System.exit(-1);} 1600 38. }while (error); 1601 39.} 1602 40. //Tenemos lista la suma parcial y calculamos su 1603 promedio. 1604 41. acumulador/=10; 1605 42. //Redondeamos el resultado a dos digitos. 1606 43.acumulador=(float)Math.round(acumulador*100)/100 1607 ; 1608 44. System.out.println(nombre+", tu promedio es de: 1609 "+acumulador); 1610 45. System.exit(0);

49
1611 46.} 1612 47.} 1613 2.4 Switch Select 1614 Hacer un programa que utilice la estructura 1615 switch() para mostrar una frase de acuerdo a 1616 un 1617 nmero, pedir por teclado un nmero del 1 al 1618 10, exigir que no se pase de esos valores, 1619 capturar errores 1620 y repetir hasta que se introduzca el 0 que ser 1621 que sale del programa. Las frases inventarlas. 1622 Prctica Complementaria Resuelta 1623 (sin procedimientos, sin arreglos) 1624 Esta prctica se aadi con el objeto de que el 1625 alumno cuente con problemas resueltso para 1626 practicar la sintaxis del lenguaje, estn 1627 resueltos y no utilizan bucles ni arreglos (que 1628 los veremos en el 1629 prximo captulo). 1630 P.C.E1 1631 1. package com.compunauta.aprendiendojava.ex; 1632 2. import java.io.BufferedReader; 1633 3. import java.io.InputStreamReader; 1634 4. import java.io.IOException; 1635 5. 1636 6. /** 1637 7. * <p>Ttulo: Aprendiendo Java</p> 1638 8. * <p>Descripcin: Ejemplos del Libro Aprendiendo 1639 Java de Compunauta</p> 1640 9. * <p>Copyright: Copyright (c) 2006 1641 www.compunauta.com</p> 1642 10. * <p>Empresa: julioduarte@gmail.com</p> 1643 11. * @author Julio Csar Duarte 1644 12. * @version 2006.01.01 1645 13. */

50
1646 14. 1647 15.public class Comp0Ej1 { 1648 16. /** 1649 17. * Ejercicio1: Un programa que carga por teclado dos 1650 nmeros y obtiene y 1651 18. * muestra la suma de ambos 1652 19. */ 1653 20. 1654 21. public static void main(String[] args) { 1655 22. int numero1 = 0; 1656 23. int numero2 = 0; 1657 24. int resultado; 1658 25. BufferedReader br = new BufferedReader(new 1659 InputStreamReader(System.in)); 1660 26. System.out.print("Ingrese el primer numero: "); 1661 27. try { 1662 28. numero1 = Integer.parseInt(br.readLine()); 1663 29. } 1664 30. catch (IOException e) { 1665 31. e.printStackTrace(System.err); 1666 32. System.out.println("el programa se debe finalizar"); 1667 33. System.exit( -1); 1668 34. } 1669 35. catch (Exception e) { 1670 36. e.printStackTrace(System.err); 1671 37. System.out.println("Error imprevisto"); 1672 38. System.exit( -1); 1673 39. } 1674 40. System.out.print("Ingrese el segundo numero: "); 1675 41. try { 1676 42. numero2 = Integer.parseInt(br.readLine()); 1677 43. } 1678 44. catch (IOException e) { 1679 45. e.printStackTrace(System.err); 1680 46. System.out.println("el programa se debe finalizar"); 1681 47. System.exit( -1); 1682 48. } 1683 49. catch (Exception e) { 1684 50. e.printStackTrace(System.err);

51
1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724
51. System.out.println("Error imprevisto"); 52. System.exit( -1); 53. } 54. resultado = numero1 + numero2; 55. System.out.print("El resultado es: " + resultado); 56. } 57. }

P.C.E2
1. package com.compunauta.aprendiendojava.ex; 2. import java.io.BufferedReader; 3. import java.io.InputStreamReader; 4. import java.io.IOException; 5.
6. /** 7. * <p>Ttulo: Aprendiendo Java</p> 8. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de Compunauta</p> 9. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p> 10. * <p>Empresa: julioduarte@gmail.com</p> 11. * @author Julio Csar Duarte 12. * @version 2006.01.01 13. */

14. 15. 16.public class Comp0Ej2 {


17. /** 18. * Ejercicio2: Un programa que carga por teclado el nombre de una persona y le 19. * muestra un saludo 20. */

21. 22. public static void main (String[] args) 23. { 24. String nombre=new String(""); 25. BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 26. System.out.print("Ingrese su nombre: "); 27. try 28. {

52
1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763
29. nombre=br.readLine(); 30. } 31. catch(IOException e) 32. { 33. e.printStackTrace(System.err); 34. System.out.println("el programa se debe finalizar"); 35. System.exit(-1); 36. } 37. System.out.println("Hola "+nombre); 38. } 39. }

P.C.E3
1. package com.compunauta.aprendiendojava.ex; 2. import java.io.BufferedReader; 3. import java.io.InputStreamReader; 4. import java.io.IOException; 5. 6. /** 7. * <p>Ttulo: Aprendiendo Java</p> 8. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de Compunauta</p> 9. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p> 10. * <p>Empresa: julioduarte@gmail.com</p> 11. * @author Julio Csar Duarte 12. * @version 2006.01.01 13. */ 14. 15.public class Comp0Ej3 {
16. /** 17. * Ejercicio3: Dado el valor de los tres lados de un tringulo, calcular el 18. * permetro 19. */

20. 21. public static void main(String[] args) { 22. int lado1 = 0; 23. int lado2 = 0;

53
1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802
24. int lado3 = 0; 25. int perimetro; 26. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 27. System.out.print("Ingrese el primer lado del triangulo: "); 28. try { 29. lado1 = Integer.parseInt(br.readLine()); 30. } 31. catch (IOException e) { 32. e.printStackTrace(System.err); 33. System.out.println("el programa se debe finalizar"); 34. System.exit( -1); 35. } 36. catch (Exception e) { 37. e.printStackTrace(System.err); 38. System.out.println("Error imprevisto"); 39. System.exit( -1); 40. } 41. System.out.print("Ingrese el segundo lado del triangulo: "); 42. try { 43. lado2 = Integer.parseInt(br.readLine()); 44. } 45. catch (IOException e) { 46. e.printStackTrace(System.err); 47. System.out.println("el programa se debe finalizar"); 48. System.exit( -1); 49. } 50. catch (Exception e) { 51. e.printStackTrace(System.err); 52. System.out.println("Error imprevisto"); 53. System.exit( -1); 54. } 55. System.out.print("Ingrese el tercer lado del triangulo: "); 56. try { 57. lado3 = Integer.parseInt(br.readLine()); 58. }

54
1803 59. catch (IOException e) { 1804 60. e.printStackTrace(System.err); 1805 61. System.out.println("el programa se debe finalizar"); 1806 62. System.exit( -1); 1807 63. } 1808 64. catch (Exception e) { 1809 65. e.printStackTrace(System.err); 1810 66. System.out.println("Error imprevisto"); 1811 67. System.exit( -1); 1812 68. } 1813 69. perimetro = lado1 + lado2 + lado3; 1814 70. System.out.println("El Perimetro del triangulo es: " + 1815 perimetro); 1816 71. } 1817 72.} 1818 P.C.E4 1819 1. package com.compunauta.aprendiendojava.ex; 1820 2. import java.io.BufferedReader; 1821 3. import java.io.InputStreamReader; 1822 4. import java.io.IOException; 1823 5. 1824 6. 1825 7. /** 1826 8. * <p>Ttulo: Aprendiendo Java</p> 1827 9. * <p>Descripcin: Ejemplos del Libro Aprendiendo 1828 Java de Compunauta</p> 1829 10. * <p>Copyright: Copyright (c) 2006 1830 www.compunauta.com</p> 1831 11. * <p>Empresa: julioduarte@gmail.com</p> 1832 12. * @author Julio Csar Duarte 1833 13. * @version 2006.01.01 1834 14. */ 1835 15. 1836 16. 1837 17.public class Comp0Ej4 { 1838 18. /** 1839 19. * Ejercicio4: Se conocen dos nmeros. Determinar y 1840 mostrar el mayor 1841 20. */

55
1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880
21. public static void main(String[] args) { 22. int numero1 = 0; 23. int numero2 = 0; 24. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 25. System.out.print("Ingrese el primer numero: "); 26. try { 27. numero1 = Integer.parseInt(br.readLine()); 28. } 29. catch (IOException e) { 30. e.printStackTrace(System.err); 31. System.out.println("el programa se debe finalizar"); 32. System.exit( -1); 33. } 34. catch (Exception e) { 35. e.printStackTrace(System.err); 36. System.out.println("Error imprevisto"); 37. System.exit( -1); 38. } 39. System.out.print("Ingrese el segundo numero: "); 40. try { 41. numero2 = Integer.parseInt(br.readLine()); 42. } 43. catch (IOException e) { 44. e.printStackTrace(System.err); 45. System.out.println("el programa se debe finalizar"); 46. System.exit( -1); 47. } 48. catch (Exception e) { 49. e.printStackTrace(System.err); 50. System.out.println("Error imprevisto"); 51. System.exit( -1); 52. } 53. if (numero1 > numero2) { 54. System.out.println("El numero mayor es: " + numero1); 55. } 56. else { 57. if (numero1 < numero2) {

56
1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919
58. System.out.println("El numero mayor es: " + numero2); 59. } 60. else { 61. System.out.println("Los dos numeros son iguales: " + numero1); 62. } 63. } 64. } 65.}

P.C.E5
1. package com.compunauta.aprendiendojava.ex; 2. import java.io.BufferedReader; 3. import java.io.InputStreamReader; 4. import java.io.IOException; 5. 6. /** 7. * <p>Ttulo: Aprendiendo Java</p> 8. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de Compunauta</p> 9. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p> 10. * <p>Empresa: julioduarte@gmail.com</p> 11. * @author Julio Csar Duarte 12. * @version 2006.01.01 13. */ 14. 15.public class Comp0Ej5 {
16. /** 17. * Ejercicio5: Se conocen dos nmeros distintos. 18. * Determinar si el primero de ellos es el mayor 19. */

20. public static void main(String[] args) { 21. int numero1 = 0; 22. int numero2 = 0; 23. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 24. System.out.print("Ingrese el primer numero: "); 25. try {

57
1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958
26. numero1 = Integer.parseInt(br.readLine()); 27. } 28. catch (IOException e) { 29. e.printStackTrace(System.err); 30. System.out.println("el programa se debe finalizar"); 31. System.exit( -1); 32. } 33. catch (Exception e) { 34. e.printStackTrace(System.err); 35. System.out.println("Error imprevisto"); 36. System.exit( -1); 37. } 38. System.out.print("Ingrese el segundo numero distinto del primero: "); 39. try { 40. numero2 = Integer.parseInt(br.readLine()); 41. } 42. catch (IOException e) { 43. e.printStackTrace(System.err); 44. System.out.println("el programa se debe finalizar"); 45. System.exit( -1); 46. } 47. catch (Exception e) { 48. e.printStackTrace(System.err); 49. System.out.println("Error imprevisto"); 50. System.exit( -1); 51. } 52. if (numero1 > numero2) { 53. System.out.println("Se confirma que el primer numero es mas grande"); 54. } 55. else { 56. System.out.println("El primer numero no resulta ser el mas grande"); 57. } 58. 59. } 60. }

58
1959 P.C.E6 1960 1. package com.compunauta.aprendiendojava.ex; 1961 2. import java.io.BufferedReader; 1962 3. import java.io.InputStreamReader; 1963 4. import java.io.IOException; 1964 5. 1965 6. /** 1966 7. * <p>Ttulo: Aprendiendo Java</p> 1967 8. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de 1968 Compunauta</p> 1969 9. * <p>Copyright: Copyright (c) 2006 1970 www.compunauta.com</p> 1971 10. * <p>Empresa: julioduarte@gmail.com</p> 1972 11. * @author Julio Csar Duarte 1973 12. * @version 2006.01.01 1974 13. */ 1975 14. 1976 15.public class Comp0Ej6 { 1977 16. /** 1978 17. * Ejercicio6: Se conocen dos nmeros distintos. Calcular 1979 la superficie de un 1980 18. * cuadrado, suponiendo como lado del mismo al mayor de 1981 los nmeros 1982 19. * dados y la superficie de n crculo suponiendo como radio 1983 del 1984 20. * mismo al menor de los nmeros dados. 1985 21. */ 1986 22. 1987 23. public static void main(String[] args) { 1988 24. int numero1 = 0; 1989 25. int numero2 = 0; 1990 26. int mayor = 0; 1991 27. int menor = 0; 1992 28. int cuadrado = 0; 1993 29. double circulo = 0; 1994 30. BufferedReader br = new BufferedReader(new 1995 InputStreamReader(System.in)); 1996 31. System.out.print("Ingrese el primer numero: "); 1997 32. try { 1998 33. numero1 = Integer.parseInt(br.readLine());

59
1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036
34. } 35. catch (IOException e) { 36. e.printStackTrace(System.err); 37. System.out.println("el programa se debe finalizar"); 38. System.exit( -1); 39. } 40. catch (Exception e) { 41. e.printStackTrace(System.err); 42. System.out.println("Error imprevisto"); 43. System.exit( -1); 44. } 45. System.out.print("Ingrese el segundo numero distinto del primero: "); 46. try { 47. numero2 = Integer.parseInt(br.readLine()); 48. } 49. catch (IOException e) { 50. e.printStackTrace(System.err); 51. System.out.println("el programa se debe finalizar"); 52. System.exit( -1); 53. } 54. catch (Exception e) { 55. e.printStackTrace(System.err); 56. System.out.println("Error imprevisto"); 57. System.exit( -1); 58. } 59. if (numero1 > numero2) { 60. mayor = numero1; 61. menor = numero2; 62. } 63. else { 64. mayor = numero2; 65. menor = numero1; 66. } 67. cuadrado = mayor * mayor; 68. circulo = Math.PI * menor * menor; 69. System.out.println("La supercie del cuadrado es: " + cuadrado);

60
2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075
70. System.out.println("La supercie del circulo es: " + circulo); 71. } 72.}

P.C.E7
1. package com.compunauta.aprendiendojava.ex; 2. import java.io.BufferedReader; 3. import java.io.InputStreamReader; 4. import java.io.IOException; 5. 6. /** 7. * <p>Ttulo: Aprendiendo Java</p> 8. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de Compunauta</p> 9. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p> 10. * <p>Empresa: julioduarte@gmail.com</p> 11. * @author Julio Csar Duarte 12. * @version 2006.01.01 13. */ 14. 15.public class Comp0Ej7 {
16. /** 17. * Ejercicio7: Se conocen tres nmeros distintos. Determinar el menor de ellos y 18. * cacular el cuadrado y el cubo del mismo 19. */

20. 21. public static void main(String[] args) { 22. int numero1 = 0; 23. int numero2 = 0; 24. int numero3 = 0; 25. int menor; 26. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 27. System.out.print("Ingrese el primer numero: "); 28. try { 29. numero1 = Integer.parseInt(br.readLine()); 30. }

61
2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114
31. catch (IOException e) { 32. e.printStackTrace(System.err); 33. System.out.println("el programa se debe finalizar"); 34. System.exit( -1); 35. } 36. catch (Exception e) { 37. e.printStackTrace(System.err); 38. System.out.println("Error imprevisto"); 39. System.exit( -1); 40. } 41. System.out.print("Ingrese el segundo numero: "); 42. try { 43. numero2 = Integer.parseInt(br.readLine()); 44. } 45. catch (IOException e) { 46. e.printStackTrace(System.err); 47. System.out.println("el programa se debe finalizar"); 48. System.exit( -1); 49. } 50. catch (Exception e) { 51. e.printStackTrace(System.err); 52. System.out.println("Error imprevisto"); 53. System.exit( -1); 54. } 55. System.out.print("Ingrese el tercer numero: "); 56. try { 57. numero3 = Integer.parseInt(br.readLine()); 58. } 59. catch (IOException e) { 60. e.printStackTrace(System.err); 61. System.out.println("el programa se debe finalizar"); 62. System.exit( -1); 63. } 64. catch (Exception e) { 65. e.printStackTrace(System.err); 66. System.out.println("Error imprevisto"); 67. System.exit( -1); 68. } 69. if (numero1 < numero2) {

62
2115 70. menor = numero1; 2116 71. } 2117 72. else { 2118 73. menor = numero2; 2119 74. } 2120 75. if (menor > numero3) { 2121 76. menor = numero3; 2122 77. } 2123 78. System.out.println("El numero menor es: " + menor); 2124 79. System.out.println("El cuadrado es: " + menor * 2125 menor); 2126 80. System.out.println("El cubo es: " + menor * menor * 2127 menor); 2128 81. } 2129 82.} 2130 P.C.E8 2131 1. package com.compunauta.aprendiendojava.ex; 2132 2. import java.io.BufferedReader; 2133 3. import java.io.InputStreamReader; 2134 4. import java.io.IOException; 2135 5. 2136 6. /** 2137 7. * <p>Ttulo: Aprendiendo Java</p> 2138 8. * <p>Descripcin: Ejemplos del Libro Aprendiendo 2139 Java de Compunauta</p> 2140 9. * <p>Copyright: Copyright (c) 2006 2141 www.compunauta.com</p> 2142 10. * <p>Empresa: julioduarte@gmail.com</p> 2143 11. * @author Julio Csar Duarte 2144 12. * @version 2006.01.01 2145 13. */ 2146 14. 2147 15.public class Comp0Ej8 { 2148 16. /** 2149 17. * Ejercicio8: Se ingresan por teclado las notas obtenidas 2150 por tres alumnos en 2151 18. * un parcial de ciertas materia. Se desea saber cules de 2152 estos

63
2153 19. * alumnos resultaron aplazados, y adems se pide 2154 determinar cul 2155 20. * fue la mayor nota, y cul fue el alumno que la obtuvo. 2156 21. */ 2157 22. public static void main(String[] args) { 2158 23. int nota1 = 0; 2159 24. int nota2 = 0; 2160 25. int nota3 = 0; 2161 26. int mejor; 2162 27. int alumno; 2163 28. BufferedReader br = new BufferedReader(new 2164 InputStreamReader(System.in)); 2165 29. System.out.print("Ingrese la nota del primer alumno: 2166 "); 2167 30. try { 2168 31. nota1 = Integer.parseInt(br.readLine()); 2169 32. } 2170 33. catch (IOException e) { 2171 34. e.printStackTrace(System.err); 2172 35. System.out.println("el programa se debe finalizar"); 2173 36. System.exit( -1); 2174 37. } 2175 38. catch (Exception e) { 2176 39. e.printStackTrace(System.err); 2177 40. System.out.println("Error imprevisto"); 2178 41. System.exit( -1); 2179 42. } 2180 43. System.out.print("Ingrese la nota del segundo 2181 alumno: "); 2182 44. try { 2183 45. nota2 = Integer.parseInt(br.readLine()); 2184 46. } 2185 47. catch (IOException e) { 2186 48. e.printStackTrace(System.err); 2187 49. System.out.println("el programa se debe finalizar"); 2188 50. System.exit( -1); 2189 51. } 2190 52. catch (Exception e) { 2191 53. e.printStackTrace(System.err);

64
2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230
54. System.out.println("Error imprevisto"); 55. System.exit( -1); 56. } 57. System.out.print("Ingrese la nota del tercer alumno: "); 58. try { 59. nota3 = Integer.parseInt(br.readLine()); 60. } 61. catch (IOException e) { 62. e.printStackTrace(System.err); 63. System.out.println("el programa se debe finalizar"); 64. System.exit( -1); 65. } 66. catch (Exception e) { 67. e.printStackTrace(System.err); 68. System.out.println("Error imprevisto"); 69. System.exit( -1); 70. } 71. System.out.println("Alumno Aplazados: "); 72. if (nota1 < 4) { 73. System.out.println("-Primer alumno aplazado"); 74. } 75. if (nota2 < 4) { 76. System.out.println("-Segundo alumno aplazado"); 77. } 78. if (nota3 < 4) { 79. System.out.println("-Tercer alumno aplazado"); 80. } 81. System.out.println("Alumno que obtuvo la mejor nota: "); 82. if (nota1 > nota2) { 83. mejor = nota1; 84. alumno = 1; 85. } 86. else { 87. mejor = nota2; 88. alumno = 2; 89. } 90. if (mejor < nota3) {

65
2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270
91. mejor = nota3; 92. alumno = 3; 93. } 94. System.out.println("El alumno" + alumno + " fue quien obtuvo un: " + mejor); 95. } 96.}

P.C.E9
1. package com.compunauta.aprendiendojava.ex; 2. import java.io.BufferedReader; 3. import java.io.InputStreamReader; 4. import java.io.IOException; 5. 6. /** 7. * <p>Ttulo: Aprendiendo Java</p> 8. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de Compunauta</p> 9. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p> 10. * <p>Empresa: julioduarte@gmail.com</p> 11. * @author Julio Csar Duarte 12. * @version 2006.01.01 13. */ 14. 15.public class Comp0Ej9 {
16. /** 17. * Ejercicio9: Un comerciante tiene la venta de 4 tipos de productos principales 18. * Conociendo la cantidad vendida de cada artculo, y el precio 19. * unitario de cada artculo, hacer un programa que determine cul 20. * fue el producto que realiz el mayor aporte en los ingresos. 21. * Calcular adems, el porcentaje que dicho aporte significa en el 22. * ingreso absoluto por los cuatro artculos sumados. 23. */

24.

66
2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309
25. public static void main(String[] args) { 26. String buf = new String(""); 27. float precio1 = 0; 28. int cantidad1 = 0; 29. float aporte1 = 0; 30. float precio2 = 0; 31. int cantidad2 = 0; 32. float aporte2 = 0; 33. float precio3 = 0; 34. int cantidad3 = 0; 35. float aporte3 = 0; 36. float precio4 = 0; 37. int cantidad4 = 0; 38. float aporte4 = 0; 39. float aportetotal = 0; 40. float mayor = 0; 41. int id = 0; 42. float porcentaje = 0; 43. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 44. System.out.print("Ingrese el precio producto1: "); 45. try { 46. //precio1=Double.valueOf(br.readLine()); 47. precio1 = Float.valueOf(br.readLine()).floatValue(); 48. } 49. catch (IOException e) { 50. e.printStackTrace(System.err); 51. System.out.println("el programa se debe finalizar"); 52. System.exit( -1); 53. } 54. catch (Exception e) { 55. e.printStackTrace(System.err); 56. System.out.println("Error imprevisto"); 57. System.exit( -1); 58. } 59. System.out.print("Ingrese el precio producto2: "); 60. try { 61. precio2 = Float.valueOf(br.readLine()).floatValue(); 62. }

67
2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347
63. catch (IOException e) { 64. e.printStackTrace(System.err); 65. System.out.println("el programa se debe finalizar"); 66. System.exit( -1); 67. } 68. catch (Exception e) { 69. e.printStackTrace(System.err); 70. System.out.println("Error imprevisto"); 71. System.exit( -1); 72. } 73. System.out.print("Ingrese el precio producto3: "); 74. try { 75. precio3 = Float.valueOf(br.readLine()).floatValue(); 76. } 77. catch (IOException e) { 78. e.printStackTrace(System.err); 79. System.out.println("el programa se debe finalizar"); 80. System.exit( -1); 81. } 82. catch (Exception e) { 83. e.printStackTrace(System.err); 84. System.out.println("Error imprevisto"); 85. System.exit( -1); 86. } 87. System.out.print("Ingrese el precio producto4: "); 88. try { 89. precio4 = Float.valueOf(br.readLine()).floatValue(); 90. } 91. catch (IOException e) { 92. e.printStackTrace(System.err); 93. System.out.println("el programa se debe finalizar"); 94. System.exit( -1); 95. } 96. catch (Exception e) { 97. e.printStackTrace(System.err); 98. System.out.println("Error imprevisto"); 99. System.exit( -1); 100. }

68
2348 101. System.out.print("Ingrese la cantida vendida del 2349 producto1: "); 2350 102. try { 2351 103. cantidad1 = Integer.parseInt(br.readLine()); 2352 104. } 2353 105. catch (IOException e) { 2354 106. e.printStackTrace(System.err); 2355 107. System.out.println("el programa se debe finalizar"); 2356 108. System.exit( -1); 2357 109. } 2358 110. catch (Exception e) { 2359 111. e.printStackTrace(System.err); 2360 112. System.out.println("Error imprevisto"); 2361 113. System.exit( -1); 2362 114. } 2363 115. System.out.print("Ingrese la cantida vendida del 2364 producto2: "); 2365 116. try { 2366 117. cantidad2 = Integer.parseInt(br.readLine()); 2367 118. } 2368 119. catch (IOException e) { 2369 120. e.printStackTrace(System.err); 2370 121. System.out.println("el programa se debe finalizar"); 2371 122. System.exit( -1); 2372 123. } 2373 124. catch (Exception e) { 2374 125. e.printStackTrace(System.err); 2375 126. System.out.println("Error imprevisto"); 2376 127. System.exit( -1); 2377 128. } 2378 129. System.out.print("Ingrese la cantida vendida del 2379 producto3: "); 2380 130. try { 2381 131. cantidad3 = Integer.parseInt(br.readLine()); 2382 132. } 2383 133. catch (IOException e) { 2384 134. e.printStackTrace(System.err); 2385 135. System.out.println("el programa se debe finalizar"); 2386 136. System.exit( -1);

69
2387 137. } 2388 138. catch (Exception e) { 2389 139. e.printStackTrace(System.err); 2390 140. System.out.println("Error imprevisto"); 2391 141. System.exit( -1); 2392 142. } 2393 143. System.out.print("Ingrese la cantida vendida del 2394 producto4: "); 2395 144. try { 2396 145. cantidad4 = Integer.parseInt(br.readLine()); 2397 146. } 2398 147. catch (IOException e) { 2399 148. e.printStackTrace(System.err); 2400 149. System.out.println("el programa se debe finalizar"); 2401 150. System.exit( -1); 2402 151. } 2403 152. catch (Exception e) { 2404 153. e.printStackTrace(System.err); 2405 154. System.out.println("Error imprevisto"); 2406 155. System.exit( -1); 2407 156. } 2408 157. aporte1 = precio1 * cantidad1; 2409 158. aporte2 = precio2 * cantidad2; 2410 159. aporte3 = precio3 * cantidad3; 2411 160. aporte4 = precio4 * cantidad4; 2412 161. aportetotal = aporte1 + aporte2 + aporte3 + 2413 aporte4; 2414 162. if (aporte1 > aporte2) { 2415 163. mayor = aporte1; 2416 164. id = 1; 2417 165. } 2418 166. else { 2419 167. mayor = aporte2; 2420 168. id = 2; 2421 169. } 2422 170. if (mayor < aporte3) { 2423 171. mayor = aporte3; 2424 172. id = 3; 2425 173. }

70
2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459
174. if (mayor < aporte4) { 175. mayor = aporte4; 176. id = 4; 177. } 178. porcentaje = (mayor / aportetotal) * 100; 179. System.out.println("El producto" + id + " fue el que mas aporto con: " + 180. mayor); 181. System.out.println("El porentaje de aporte sobre el total es de: " + 182. porcentaje + "%"); 183. 184. } 185.}

Prctica Complementaria (bucles sin arreglos)

III Mtodos estticos y Mecanismos de Programacin.


Este captulo pretende proporcionar al usuario final las herramientas para solucionar problemas del tipo programacin estructurada, de pilas, colas, vectores, rboles, etc. Que es necesario para formar correctamente al alumno en cualquier ambiente de programacin, incluida la programacin orientada a objetos, no pretendemos ir a la P.O.O todava sino hasta ms adelante, de esta manera este captulo puede utilizarse para afianzar los conocimientos necesarios para un curso de fsica o matemticas donde

71
2460 se desee aplicar a problemas en general. 2461 La P.O.O. en este captulo ser 2462 completamente bsica, y ni siquiera la 2463 mencionaremos en muchos 2464 caso hasta el final del captulo a menos que 2465 sea necesario. 2466 Mtodos estticos (funciones o 2467 procedimientos) 2468 En el capitulo anterior no utilizamos nada de la 2469 programacin estructurada, slo seguimos un 2470 orden de ejecucin secuencial, es decir paso 2471 a paso y no planteamos el problema de la 2472 reutilizacin de 2473 cdigo. 2474 Problema: necesitamos ingresar datos por 2475 teclado, hacer varios clculos y volver a 2476 ingresar datos 2477 por teclado y hacer otros clculos diferentes, y 2478 este mismo proceso, repetidas veces, como 2479 vimos en los 2480 ejemplos anteriores tendramos que repetir el 2481 bloque try{}catch(){} varias veces, y si 2482 quisiramos 2483 repetir un bloque de clculos para ciertos 2484 datos... Que pasara si quiero cambiar 2485 esas rdenes las 2486 veces que se hayan repetido?. 2487 Entonces comenzamos con las funciones, o 2488 mtodos estticos en Java, se les denomina 2489 estticos

72
2490 porque pertenecen a la Clase o tipo de datos y 2491 no es necesario crear un objeto para 2492 invocarlos o 2493 llamarlos, para nosotros en este momento nos 2494 servirn para solucionar el problema de 2495 repeticin y 2496 mantenimiento de cdigo. 2497 Ejemplo 3.1: 2498 Se requiere ingresar los datos de 3 valores y 2499 calcular su promedio, paso seguido, preguntar 2500 el 2501 nombre del usuario e imprimir de manera 2502 personalizada Usuario, el promedio de tus 2503 tres valores es: 2504 XXX, es un problema muy similar a los 2505 anteriores, pero utilizaremos una funcin 2506 llamada leer que 2507 fabricaremos para no repetir el cdigo de 2508 lectura del teclado. 2509 1. package com.compunauta.aprendiendojava; 2510 2. import java.io.*; 2511 3. /** 2512 4. * <p>Ttulo: Aprendiendo Java</p> 2513 5. * <p>Descripcin: Ejemplos del Libro Aprendiendo 2514 Java de Compunauta</p> 2515 6. * <p>Copyright: Copyright (c) 2006 2516 www.compunauta.com</p> 2517 7. * <p>Empresa: COMPUNAUTA</p> 2518 8. * @author Gustavo Guillermo Prez 2519 9. * @version 2006.01.01 2520 10. */ 2521 11. 2522 12.public class MetodoLeer { 2523 13. public static void main(String[] args) {

73
2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559
14. BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 15. int acumulador=0; 16. for(int i=0;i<3;i++){ 17. System.out.println("Ingrese el valor "+(i+1)+" de 3?"); 18. acumulador=acumulador+=Integer.parseInt(leer(br)); 19. } 20. acumulador/=3; 21. System.out.println("Ingrese su nombre?"); 22. String nombre=leer(br); 23. System.out.println("Usuario: "+nombre+" tu promedio es:"+acumulador); 24. } 25. 26.public static String leer(BufferedReader buff){ 27. String lee=""; 28.try{lee=buff.readLine();} 29.catch(Exception ex){ 30. ex.printStackTrace(System.err);} 31.return lee; 32.}//final de la funcion leer 33.}//final de la clase

Como podemos ver desde la lnea 26 a la 32 se define la funcin esttica leer, que es pblica y devolver datos de tipo String, esta funcin para poder procesar la lectura necesita que le pasemos como argumento un objeto del tipo BufferedReader que es el encargado de leer las lneas, esta funcin tiene como objetivo que no se repita el cdigo de control de errores y en el futuro podremos modificar esta

74
2560 funcin o fabricar otra para leer nmeros que 2561 revise una correcta entrada de datos. 2562 Bien, ahora veamos el cdigo mejorado 2563 utilizando una funcin para leer texto y otra 2564 para los 2565 nmeros enteros: 2566 1. package com.compunauta.aprendiendojava; 2567 2. import java.io.*; 2568 3. /** 2569 4. * <p>Ttulo: Aprendiendo Java</p> 2570 5. * <p>Descripcin: Ejemplos del Libro Aprendiendo 2571 Java de Compunauta</p> 2572 6. * <p>Copyright: Copyright (c) 2006 2573 www.compunauta.com</p> 2574 7. * <p>Empresa: COMPUNAUTA</p> 2575 8. * @author Gustavo Guillermo Prez 2576 9. * @version 2006.01.01 2577 10. */ 2578 11. 2579 12.public class MetodoLeer { 2580 13. public static void main(String[] args) { 2581 14. BufferedReader br=new BufferedReader(new 2582 InputStreamReader(System.in)); 2583 15. int acumulador=0; 2584 16. for(int i=0;i<3;i++){ 2585 17. System.out.println("Ingrese el valor "+(i+1)+" de 2586 3?"); 2587 18. 2588 acumulador=acumulador+=Integer.parseInt(leerTexto(br 2589 )); 2590 19. } 2591 20. acumulador/=3; 2592 21. System.out.println("Ingrese su nombre?"); 2593 22. String nombre=leerTexto(br); 2594 23. System.out.println("Usuario: "+nombre+" tu 2595 promedio es:"+acumulador); 2596 24. } 2597 25.

75
2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633
26.public static String leerTexto(BufferedReader buff){ 27. String lee=""; 28.try{lee=buff.readLine();} 29.catch(Exception ex){ 30. ex.printStackTrace(System.err);} 31.return lee; 32.}//final de la funcion leer 33. 34.public static int leerInt(BufferedReader buff){ 35. int lee=0; 36. boolean error; 37. do { 38. error=false; 39. try {lee = Integer.parseInt(buff.readLine());} 40. catch (NumberFormatException ex) { 41. System.out.println("Entrada erronea, repetir:?"); 42. error=true;} 43. catch (Exception ex){ex.printStackTrace(System.err);} 44. } while (error); 45.return lee; 46.}//final de la funcion leer 47. 48.}

Arreglos (Arrays) o Vectores.


Los arreglos son como un vector, con varias componentes incluso en programacin un arreglo puede representar una matriz de varias dimensiones. Por ejemplo si tenemos 10 frases que ensearemos segn un nmero del 1 al 10, podemos utilizar un vector de una sola dimensin, donde indicaremos con un subndice a los elementos que este mismo almacene.

76
2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667

En Java un arreglo se representa por un objeto que tiene un lmite de elementos al ser definido, o en alguna parte de nuestro programa le asignaremos un objeto arreglo de cierto tipo. Los elementos que pondremos en nuestro arreglo de datos deben estar definidos en cantidad, no en valor, si creemos que podemos necesitar ms o menos 10+/-3 elementos asignaremos 13 por ms que a veces usemos 7. Los arreglos tienen una cantidad de elementos, pero el subndice que usaremos para acceder al contenido de cada elemento ir del 0 a ELEMENTOS-1. Veamos un ejemplo: Problema: Se desea ingresar por teclado tres resultados de exmenes, e imprimir el 1 y ltimo, utilizamos la funcin leerInt() que ejemplificamos anteriormente.
1. package com.compunauta.aprendiendojava; 2. import java.io.*; 3. /** 4. * <p>Ttulo: Aprendiendo Java</p> 5. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de Compunauta</p> 6. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p> 7. * <p>Empresa: COMPUNAUTA</p> 8. * @author Gustavo Guillermo Prez 9. * @version 2006.01.01

77
2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706
10. */ 11. 12.public class Arreglos { 13. public static void main(String[] args) { 14. BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 15. int[] examenes=new int[3]; 16. System.out.println("La longitud de datos de mi arreglo es:"+examenes.length); 17. for (int i=0;i<examenes.length;i++){ 18. System.out.println("Ingrese el valor para el examen "+(i+1)+" de "+examenes.length); 19. examenes[i]=leerInt(br); 20. } 21. System.out.println("El resultado del primer examen es:"+examenes[0]); 22. System.out.println("El resultado del ltimo examen es:"+examenes[examenes.length-1]); 23. } 24. public static int leerInt(BufferedReader buff){ 25. int lee=0; 26. boolean error; 27. do { 28. error=false; 29. try {lee = Integer.parseInt(buff.readLine());} 30. catch (NumberFormatException ex) { 31.System.out.println("Entrada erronea, repetir:?"); 32. error=true;} 33. catch (Exception ex){ex.printStackTrace(System.err);} 34. } while (error); 35.return lee; 36.}//final de la funcion leer 37. 38.}

La salida por pantalla ser algo como esto:


La longitud de datos de mi arreglo es:3

78
2707 Ingrese el valor para el examen 1 de 3 2708 23 2709 Ingrese el valor para el examen 2 de 3 2710 21 2711 Ingrese el valor para el examen 3 de 3 2712 12 2713 El resultado del primer examen es:23 2714 El resultado del ltimo examen es:12 2715 La clase Math de procedimientos y 2716 constantes matemticas 2717 A continuacin veremos la utilidad de la Clase 2718 de la biblioteca ms til, que provee algunas 2719 cuantas funciones matemticas que usaremos 2720 para resolver nuestros problemas en este 2721 captulo. 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738

Resumen de Campos
static double E

El valor double que es el mas cercano a e, la base de los logaritmos naturales. static double PI El valor double que es ms cercano a pi, la relacin de una circunferencia con su dimetro.

Resumen de Mtodos
static double abs(double a) Devuelve el valor absoluto de un valor double. static float abs(float a) Devuelve el valor absoluto de un valor float. static int abs(int a) Devuelve el valor absoluto de un valor int. static long abs(long a)

79
2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770

Devuelve el valor absoluto de un valor long. static double acos(double a) Devuelve el arcocoseno de un ngulo, en el rango de 0.0 hasta pi. static double asin(double a) Devuelve el arcoseno de un ngulo, en el rango de -pi/2 hasta pi/2. static double atan(double a) Devuelve el arcotangente de un ngulo, en el rango de -pi/2 hasta pi/2. static double atan2(double y, double x) Convierte coordenadas rectangulares (x, y) a polares (r, theta). static double cbrt(double a) Devuelve la raz cuadrada de un valor double. static double ceil(double a) Devuleve el ms pequeo (cercano al infinito negativo) valor double que es ms grande o igual al argumento a y es igual a un entero matemtico. static double cos(double a) Devuelve el coseno trigonomtrico de un ngulo. static double cosh(double x) Devuelve el coseno hiperblico de un valor value. static double exp(double a) Devuelve el valor e de Euler elevado a la potencia del valor double a. static double expm1(double x) Devuelve ex -1. static double floor(double a)

80
2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802

Devuelve el ms largo (cercano al positivo infinito) valor double que es menor o igual al argumento a y es igual a un entero matemtico. static double hypot(double x, double y) Devuelve sqrt(x2 +y2) sin el overflow o underflow intermedio. static double IEEEremainder(double f1, double f2) Computa la operacin prescripta por el estndar IEEE 754 entre los dos argumentos f1 y f2. static double log(double a) Devuelve el logaritmo natural (base e) de un valor double. static double log10(double a) Devuelve el logaritmo en base 10 de un valor double. static double log1p(double x) devuelve ex+1. static double max(double a, double b) Devuelve el ms grande de los dos valores double a y b. static float max(float a, float b) Devuelve el ms grande de los dos valores float a y b. static int max(int a, int b) Devuelve el ms grande de los dos valores int a y b. static long max(long a, long b) Devuelve el ms grande de los dos valores long a y b.

81
2803 static double min(double a, double b) 2804 Devuelve el ms pequeo de los dos valores 2805 double a y b. 2806 static float min(float a, float b) 2807 Devuelve el ms pequeo de los dos valores 2808 float a y b. 2809 static int min(int a, int b) 2810 Devuelve el ms pequeo de los dos valores 2811 int a y b. 2812 static long min(long a, long b) 2813 Devuelve el ms pequeo de los dos valores 2814 long a y b. 2815 static double pow(double a, double b) 2816 Devuelve el valor del argumento a elevado a 2817 la potencia de b: ab . 2818 static double random() 2819 Devuelve un valor de tipo double con signo 2820 positivo,mayor o igual que cero 2821 y menor que uno 1.0. 2822 static double rint(double a) 2823 Devuelve el valor double que es ms cercano 2824 al valor a y es igual a un 2825 entero matemtico. 2826 static long round(double a) 2827 Devuelve el valor long ms cercano al 2828 argumento. 2829 static int round(float a) 2830 Devuelve el valor int ms cercano al 2831 argumento. 2832 static double signum(double d) 2833 La funcin signo, cero si el argumento es cero, 2834 1.0 si el argumento es mayor

82
2835 que cero y -1.0 si el argumento es menor que 2836 cero. 2837 static float signum(float f) 2838 La funcin signo, cero si el argumento es cero, 2839 1.0 si el argumento es mayor 2840 que cero y -1.0 si el argumento es menor que 2841 cero. 2842 static double sin(double a) 2843 Devuelve el seno trigonomtrico de un ngulo. 2844 static double sinh(double x) 2845 Devuelve el seno hiperblico de un valor 2846 double. 2847 static double sqrt(double a) 2848 Devuelve la raz cuadrada positiva 2849 redondeada de un valor double. 2850 static double tan(double a) 2851 Devuelve la tangente trigonomtrica de un 2852 ngulo. 2853 static double tanh(double x) 2854 Devuelve la tangente hiperblica de un valor 2855 double. 2856 static double toDegrees(double angrad) 2857 Convierte un ngulo medido en radianes al 2858 aproximado en grados.. 2859 static double toRadians(double angdeg) 2860 Convierte un ngulo medido en grados al 2861 aproximado en radianes. 2862 static double ulp(double d) 2863 Ver definicin en la documentacin completa. 2864 static float ulp(float f) 2865 Ver definicin en la documentacin completa. 2866 Tabla 10: La Clase Math - mtodos y constantes

83
2867 Buffering Memoria temporal 2868 Algunas veces es necesario procesar datos 2869 con cierta velocidad o cantidad conocida, la 2870 lectura de 2871 datos de 1 en 1 puede producir que en un 2872 cierto momento nuestro programa se quede 2873 sin hacer nada, o 2874 simplemente es ms efectivo leer un archivo 2875 por bloques de datos grandes que de byte en 2876 byte 2877 (sobrecarga de llamadas a la misma funcin). 2878 En otras ocasiones podemos estar recibiendo 2879 datos por la red y si nuestro programa es lento 2880 para 2881 procesarlos o necesita atencin por parte de 2882 un usuario para decidir que hacer, puede 2883 suceder que 2884 lleguen ms datos de los que se pueden 2885 procesar, en este caso podemos utilizar un 2886 segmento de memoria 2887 temporal para almacenar estos datos y que no 2888 se pierdan y as aprovechar el tiempo en el 2889 que no llegan 2890 datos. 2891 El criterio para implementar estos tipos de 2892 memorias temporales (buffers de aqu en 2893 adelante) es 2894 variable, siempre se tomar en cuenta el 2895 promedio de datos que lleguen a nuestro 2896 programa o la cantidad

84
2897 de veces que es necesario llamar a una 2898 funcin que lee datos si lo hacemos con 2899 bloques ms pequeos o 2900 ms grandes, el valor ptimo siempre es 2901 emprico. 2902 Para determinar este valor siempre tendremos 2903 en cuenta que bloques ms grandes de datos 2904 consumen ms memoria del sistema 2905 operativo, y que muchas veces para mover 2906 bloques grandes de 2907 datos se puede perder mucho tiempo, por otra 2908 parte si nuestro archivo del disco no dispone 2909 de datos para 2910 llenar esos bloques, estaramos 2911 desperdiciando memoria si abriramos 2912 muchos archivos ms pequeos 2913 que el buffer, por otro lado si el buffer es muy 2914 pequeo, entonces el efecto es contrario, 2915 estaramos 2916 llamando innumerables cantidades de veces a 2917 la funcin leer, por lo que produciramos un 2918 desperdicio 2919 de recursos del procesador, enlenteceramos 2920 el sistema operativo, entonces queda claro 2921 que no leeremos 2922 archivos en bloques de 1MB ni lo haremos 2923 byte por byte. 2924 Usando arreglos para un buffer, 2925 colas de espera, pilas y listas. 2926 Bien, pongamos el siguiente ejemplo, se 2927 quieren enviar datos de una mquina a otra en 2928 un slo

85
2929 sentido, una telefonista debe llamar a ciertos 2930 telfonos que llegan desde otro punto de una 2931 red y no 2932 puede ver el siguiente telfono hasta que haya 2933 terminado su llamada, del otro lado una 2934 secretaria que 2935 revisa el correo con una frecuencia de 5 2936 minutos enva los telfonos del soporte 2937 tcnico que deben ser 2938 atendidos por la telefonista, teniendo en 2939 cuenta que las llamadas suelen durar entre 10 2940 a 30 minutos y 2941 que los correos que pueden llegar al mismo 2942 tiempo no son ms de 6 y que existen lapsos 2943 de hasta 60 2944 minutos sin recibir ni un slo correo, y que no 2945 quedan llamadas pendientes en el transcurso 2946 del da. 2947 Criterios: 2948 1. Sobredimensionar es sobrecargar 2949 2. Minimizar es sobrecargar 2950 3. Si llenamos el buffer, no se podrn ingresar 2951 ms dtos. 2952 4. Supondremos que en el peor de los casos 2953 llegan 10 correos 2954 5. Supondremos que en el peor de los casos 2955 duran 30 minutos 2956 6. Supondremos que en el peor de los casos 2957 el lapso es de 20 minutos durante 4 perodos. 2958 Los ltimos tres criterios son suposiciones, 2959 que en la vida real son la telefonista y 2960 secretaria

86
2961 quienes pueden proveer este tipo de 2962 estadstica sobre los horarios ms saturados, 2963 tenemos que tener en 2964 cuenta que el problema es humanamente 2965 soluble ya que no quedan pendientes sin 2966 tratar as que durante 2967 el da se resuelven todos los llamados: 20min 2968 x 4p = 80min => 1) se resuelven en 80 2969 minutos 2 llamados 2970 y 2) se acumularon casi 40 tel 3 tel = 37 2971 tel 2972 Entonces en el peor de los casos la 2973 acumulacin mxima probable y el despacho 2974 de telfonos ms 2975 tardado producen un mximo de 37 telfonos. 2976 Entonces nuestro buffer ptimo es de 37 2977 elementos. 2978 Como almacenar un telfono no consume 2979 tanta cantidad de recursos de un sistema 2980 utilizaremos un 2981 buffer de 40 elementos. 2982 Nota: el manejo de memoria RAM en el 2983 sistema para valores o tipos de datos de 2984 almacenamiento fijo, como son todos los tipos 2985 de datos bsicos excluyendo String, es 2986 de potencias de 2n y a veces de mltiplos de 2987 estas potencias, siendo recomendable elegir 2988 siempre un valor cercano pero no igual porque 2989 si la JVM utiliza bloques de 64enteros 2990 como buffer interno si usramos 65enteros 2991 estaramos obligando a usar el espacio de 2992 128enteros.

87
2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026

Implementacin del buffer tipo FIFO (Cola de espera, el primero es primero en salir) El ejemplo anterior necesita conocimientos de ejecucin paralela de dos procesos, uno para leer del socket (conexin de red) y otro para atender a la telefonista, eso no lo veremos todava as que cambiaremos el enunciado para implementar esta cola de espera. La telefonista recibe los telfonos y tardar solo 1 minuto como mximo por llamada, es decir los nmeros saldrn de a 1 por minuto, pudiendo descansar en el tiempo sobrante, si no hay nmeros esperar, y si hay muchos guardarlos temporalmente. Utilizaremos una conexin de red, donde la telefonista tendr un programa en espera que escuchar en la red y la secretaria el que enviar los datos al establecer una conexin. Telefonista:
gus@gusgus ~$ java com.compunauta.aprendiendojava.Cap3_sock_ tel Escuchando el puerto:4567 Esperando conexin... Conectado... Esperando telfonos Secretaria llamando al tel:123 Secretaria llamando al tel:432 Ultima llamada, nos vamos... programa terminado gus@gusgus ~$

88
3027 Secretaria: 3028 gus@gusgus ~$ java 3029 com.compunauta.aprendiendojava.Cap3_sock_ 3030 sec 3031 Intentando conectar con la telefonista 3032 Nos conectamos con la 3033 telefonista:127.0.0.1:4567 3034 Ingrese nmeros -1 termina 3035 123 3036 432 3037 -1 3038 Programa terminado 3039 gus@gusgus ~$ 3040 Codificacin: 3041 Como dijimos antes la implementacin y 3042 codificacin de este ejemplo necesitar de 3043 una conexin 3044 de red para poder comprender mejor el uso de 3045 este tipo de estructuras, no es necesario que 3046 dispongamos 3047 de una red para llevar a cabo este programa, 3048 ya que una PC puede actuar como una red de 3049 1 sola 3050 mquina, en este caso usaremos la direccin 3051 de red local (loopback) que existe en casi 3052 todos los sistemas 3053 operativos en los que corre Java. Esta 3054 direccin especial, permite conectarse por 3055 medio de los protocolos 3056 de red a la misma mquina en caso que 3057 estemos en un laboratorio de informtica y 3058 dispongamos de la 3059 informacin de las direcciones ip de las otras 3060 PCs de la red sera interesante que se 3061 trabajara en grupos

89
3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093

de dos, para poder apreciar la conexin remota. Nota: Queda como tarea para el lector revisar los mtodos y propiedades de la clase o tipo de datos Socket y ServerSocket. Para establecer una conexin de red es necesario que alguien est escuchando en un puerto, estos puertos son un concepto abstracto que podemos asimilarlo comparndolo con un puerto real donde llegan barcos, dichos barcos una vez que llegan son atendidos y siempre que haya quien atenderlos podr entrar otro. En este caso solo esperaremos una nica conexin en el puerto, y cuando esta se establezca no esperaremos ninguna otra. La clase ServerSocket nos permitir fabricar un objeto que podr esperar una conexin, y cuando esta llegue podemos abrirla por medio del objeto resultante Socket (conexin). El puerto de escucha en este ejemplo ser: 4567, muchos firewalls y mecanismos de proteccin de red pueden bloquear el acceso a estos puertos, as que cualquier cosa preguntamos al administrador de la red, por otro lado no podemos

90
3094 usar un puerto ms bajo inferior a los 1024 3095 porque ser necesario por lo general permisos 3096 especiales en 3097 el sistema operativo. 3098 Telefonista: 3099 1. package com.compunauta.aprendiendojava; 3100 2. import java.io.*; 3101 3. import java.net.*; 3102 4. /** 3103 5. * <p>Ttulo: Aprendiendo Java</p> 3104 6. * <p>Descripcin: Ejemplos del Libro Aprendiendo 3105 Java de Compunauta</p> 3106 7. * <p>Copyright: Copyright (c) 2006 3107 www.compunauta.com</p> 3108 8. * <p>Empresa: COMPUNAUTA</p> 3109 9. * @author Gustavo Guillermo Prez 3110 10. * @version 2006.01.01 3111 11. */ 3112 12. 3113 13.public class Cap3_sock_tel { 3114 14.//Declaramos unas variables globales a este tipo de 3115 datos 3116 15.public static int PORT=4567; 3117 16.public static int BUFF_SIZE=40; 3118 17.public static int TIMER_SLEEP=60*1000; 3119 //60sx1000ms 3120 18.public static int buff_elem=0; 3121 19.public static int[] buffer=new int[BUFF_SIZE]; 3122 20. 3123 21. public static void main(String[] args) { 3124 22. //Declaramos la variable socket (ser un puntero a 3125 objeto) 3126 23. Socket skt=(Socket)null; 3127 24. //Declaramos vaco el servidor de sockets para 3128 inicializarlo 3129 25. ServerSocket Ss=(ServerSocket)null; 3130 26.

91
3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168
27. //Tratamos de escuchar el puerto definido por la variable PORT 28. System.err.println("Escuchando el puerto:"+PORT); 29. try {Ss = new ServerSocket(PORT);} 30. catch (IOException ex) { 31. System.out.println("El sistema no permite abrir el puerto"); 32. System.exit(-1);} 33. 34. //Si no ocurri error arriba entonces esperamos a la secretaria 35. System.err.println("Esperando conexin..."); 36. try {skt = Ss.accept();} 37. catch (IOException ex1) { 38. ex1.printStackTrace(System.err); 39. System.exit(-1);} 40. 41. //Si no ocurri error arriba la secretaria est lista para enviar 42. System.err.println("Conectado... Esperando telfonos"); 43. try { 44. ObjectInputStream datos = new ObjectInputStream(skt.getInputStream()); 45. long timer=0; 46. boolean timer_on=false; 47. while (true){ 48. if((skt.isClosed() && (buff_elem<1)) || (buffer[0]==1)){ 49. //Terminamos el programa si la secretaria termin 50. System.err.println("Ultima llamada, nos vamos... terminado"); 51. System.exit(0); 52. } 53. //si hay telfonos los guardamos 54. if(datos.available()>0){ 55. put_tel(datos.readInt());} 56. if(timer_on){

92
3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207
57. //si el timer funciona no hacer nada, si se pas pararlo 58. if ((timer+TIMER_SLEEP)<System.currentTimeMillis()){ti mer_on=false;} 59. }else{ 60. //Si el timer est apagado, mostramos un tel si es que hay 61. if (buff_elem>0){System.out.println("Secretaria llamando al tel:"+get_tel()); 62. //Encendemos el timer y guardamos la hora en que empez 63. timer_on=true; 64. timer=System.currentTimeMillis();} 65. } 66. //Pausamos 100ms para no sobrecargar el procesador 67. try {Thread.sleep(100);} 68. catch (InterruptedException ex3) {} 69. }//fin del bloque eterno 70. }catch (IOException ex2) { 71. ex2.printStackTrace(System.err); 72. System.exit(-1); 73. } 74. 75. }//fin del mtodo principal 76. 77.//Funciones o mtodos auxiliares 78.public static void put_tel(int tel){ 79.//Si se supera el espacio producir un error 80.if (BUFF_SIZE<(buff_elem+1)){ 81.System.err.println("Buffer overrun: El buffer se llen demasiado rpido"); 82.System.exit(-1);} 83.//guardamos el tel y aumentamos en uno el contador 84.buffer[buff_elem++]=tel; 85.} 86.

93
3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240
87.public static int get_tel(){ 88. //almacenamos el primer telfono 89. int tel=buffer[0]; 90. //quitamos uno al contador de elementos 91. buff_elem--; 92. //recorremos los otros elementos 93. for (int i=0;i<buff_elem;i++) buffer[i]=buffer[i+1]; 94. //devolvemos el primer telfono 95. return tel; 96.} 97. 98.}//final de la clase

De las lneas 15 a la 19 se declaran las variables globales que sern accesibles por todos los mtodos estticos de la clase como ser el puerto de escucha, el tamao del buffer y el verdadero buffer donde utilizamos el tamao definido para crearlo, recordemos que una vez definido el arreglo que actuar de buffer no podemos expandirlo o reducirlo, por ello el clculo previo para estimar su mxima cantidad de datos. Tambin se define el tiempo en milisegundos que esperaremos antes de mostrar en pantalla el siguiente telfono. A partir de la lnea 21 comienza el mtodo principal, el cual se ejecutar paso seguido de inicializar las variables globales. Revisemos la lnea 23, la declaracin de la variable skt, no estamos

94
3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272

inicializando el objeto de la biblioteca, sino que lo estamos apuntando a un objeto especial de tipo nulo, este objeto llamado null es un objeto vaco que no posee propiedades de ningn tipo y cada vez que queramos operar sobre el producir un error de puntero nulo, entonces porqu lo necesitamos?. El compilador no es lo suficientemente inteligente como para detectar que lo inicializaremos en un bloque de cdigo futuro y necesitamos declararlo en este punto de nuestro mtodo principal, porque todo lo que se declara en bloques especiales como try{}catch(){} es local y desaparece fuera de ellos. En la lnea 25 declaramos el objeto de la biblioteca ServerSocket que escuchar y devolver un objeto del tipo Socket, usamos el mismo objeto nulo para inicializarlo. Desde la lnea 27 a la 32 intentamos crear el objeto ServerSocket y lo que es ms importante, detectar si hubo o no un error por parte del sistema ya que no podremos continuar si se produce un error, como podemos ver en nuestro bloque de control de errores salimos si el sistema no nos permite abrir

95
3273 dicho puerto, en el caso que tengamos algn 3274 tipo de proteccin de red tendremos que 3275 desactivarla 3276 temporalmente para poder trabajar. 3277 Entre las lneas 34 y 39 nos encargamos de 3278 esperar una conexin remota, nuevamente es 3279 necesario 3280 capturar las posibles excepciones de error que 3281 puedan producirse, es obligatorio por el 3282 compilador 3283 manejar las excepciones declaradas por 3284 ServerSocket, como podemos ver, la funcin 3285 accept(); de 3286 ServerSocket aceptar una conexin y esa 3287 conexin la almacenaremos en el apuntador 3288 skt, teniendo 3289 ahora correctamente inicializado dicho 3290 apuntador podemos usar las caractersticas 3291 de la conexin. 3292 A partir de la lnea 42 comenzamos la 3293 operacin de lectura de la conexin de red y 3294 de la impresin 3295 en pantalla de los telfonos. 3296 Ya habamos visto los objetos del tipo 3297 InputStream para la lectura de texto desde el 3298 teclado, en 3299 este caso lo usaremos para la lectura desde la 3300 conexin, solo que para practicar, utilizaremos 3301 un objeto 3302 de la misma familia pero del tipo 3303 ObjectInputStream que nos permitira enviar 3304 objetos a travs del

96
3305 canal o flujo de datos. 3306 El objeto skt provee la funcin 3307 getInputStream(); que nos devolver el Objeto 3308 del tipo 3309 InputStream que necesita el objeto de la 3310 biblioteca del tipo ObjectInputStream para 3311 ser construido. 3312 En la lnea 45 declaramos una variable de tipo 3313 entero largo (long) timer que utilizaremos para 3314 medir el tiempo y as crear nuestro 3315 temporizador, le damos un valor inicial. 3316 En la lnea 46 declaramos una variable 3317 booleana timer_on que nos servir de 3318 bandera para saber 3319 el estado del temporizador, si es que est 3320 activo (true) o parado (false). Lo inicializamos 3321 en parado 3322 porque no tenemos telfonos hasta que la 3323 secretaria los comience a escribir. 3324 En la lnea 47 se comienza un bloque del tipo 3325 mientras, while(){} el cual deseamos que sea 3326 infinito porque leeremos datos hasta que la 3327 secretaria enve la seal de fin, pero mientras 3328 tengamos 3329 telfonos para mostrar en el buffer no 3330 podremos dejar de mostrarlos, as que para 3331 mejor comprensin del 3332 cdigo, el bloque while(true){} se ejecutar 3333 por siempre a menos que el programa decida 3334 terminar. 3335 Revisemos el cdigo de la lnea 48 a la 52, en 3336 este bloque comparamos dos condiciones

97
3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368

importantes para decidir si el programa debe salir o no, la primera es una condicin doble, por eso est encerrada entre parntesis, es decir si la conexin est cerrada y la cantidad de elementos del buffer es inferior a 1 o sucede que el elemento cero del buffer es el nmero -1 que indica la secretaria que termin entonces nos vamos porque es el ltimo elemento y no es necesario mostrarlo. El siguiente bloque desde la lnea 54,55 almacenamos un nmero entero desde la conexin de red datos, slo si es que hay datos disponibles, eso lo revisamos con la funcin available(); que no se quedar esperando, si existen o no datos disponibles de todas maneras el programa sigue su curso. El timer, entre las lneas 58 a la 65, funciona de la siguiente manera, cuando queremos comenzar a medir el tiempo, almacenamos dentro de la variable timer la hora actual medida en milisegundos, ese dato lo obtenemos con la funcin del objeto system, currentTimeMillis(), si al timer, le sumamos la cantidad de tiempo que queremos esperar, ese valor siempre ser ms grande que la hora actual, hasta

98
3369 que se pase el tiempo, eso es lo que 3370 comparamos en el bloque if(){}, caso contrario 3371 nos preparamos para 3372 ver si es necesario encender el timer y mostrar 3373 telfonos, que slo suceder si hay ms de 1 3374 elemento en 3375 el buffer, recordemos que en buff_elem 3376 almacenamos la cantidad de elementos de 3377 nuestra memoria 3378 temporal. 3379 En las lneas 67,68 incluimos otro bloque de 3380 control de errores obligatorio porque 3381 utilizaremos 3382 otra funcin de la biblioteca de Java que 3383 pertenece a la clase Thread (hilo) esa funcin 3384 detiene la 3385 ejecucin del programa una cierta cantidad de 3386 milisegundos, el uso de este pequeo retardo 3387 de 100 3388 milisegundos es para no sobrecargar el 3389 procesador, ya que estaramos ejecutando 3390 nuestro bucle 3391 while(true){} infinidades de veces en 1 nico 3392 segundo lo cual no es necesario ya que la 3393 secretaria no es 3394 tan veloz y dejamos libre el procesador para el 3395 sistema operativo. 3396 En la lnea 69 termina el bloque eterno 3397 while(true){} y el bloque de control de errores 3398 que lo

99
3399 contiene, dado el caso que se produzca un 3400 error dentro del bloque ser necesario 3401 terminar el programa. 3402 Los mtodos auxiliares: 3403 public static void put_tel(int tel){ 3404 Esta funcin agregar un telfono en la 3405 memoria temporal, en nuestro buffer, 3406 haciendo una cierta 3407 deteccin de errores, en el caso que el buffer 3408 no sea lo suficientemente grande como para 3409 almacenar el 3410 prximo dato, en este caso el programa se 3411 sale con error. 3412 Si esto no sucede, la lnea ms importante de 3413 esta funcin es: 3414 buffer[buff_elem++]=tel; 3415 Donde como vimos al principio de este libro el 3416 signo ++ a la derecha de buff_elem simboliza 3417 que 3418 primero se utilizar el valor y despus se 3419 incrementar, entonces en una sola lnea 3420 representamos las dos 3421 operaciones buffer[buff_elem]tel; buff_elem++; 3422 public static int get_tel(){ 3423 Esta funcin extraer un elemento del buffer, 3424 pero al mismo tiempo que lo extrae debe 3425 posicionar 3426 los dems elementos hacia el inicio del 3427 arreglo. 3428 Tampoco hacemos la comprobacin de que 3429 no haya elementos en el buffer porque la 3430 hacemos en

100
3431 el cdigo cada vez que vemos si hay telfonos 3432 para mostrar, aunque deberamos por buena 3433 prctica 3434 porque si este es un prototipo y nuestro 3435 programa ir creciendo, entonces tal vez se 3436 nos escape revisar. 3437 Almacenamos de manera temporal el telfono 3438 prximo antes de recorrer los datos: 3439 int tel=buffer[0]; 3440 Despus de eso quitamos uno al apuntador de 3441 elementos, y lo quitamos antes porque para 3442 subir los 3443 datos sumaremos uno al ndice que 3444 recorremos para acomodar los datos y 3445 tendramos que estar 3446 revisando que el ndice no supere buff_elem3447 1, como esa condicin se comparara cada 3448 vez que pasamos 3449 por un valor del ndice estaramos ejecutando 3450 innecesariamente una resta que podramos 3451 hacer antes. 3452 Una vez terminado devolvemos el telfono 3453 que almacenamos antes que desapareciera. 3454 Nota: Es incorrecto el manejo de error en la 3455 funcin put_tel, ya que en Java existe un 3456 modelo de excepciones que deben ser 3457 lanzadas y capturadas como en cualquier 3458 bloque de control de errores, si no 3459 corroboramos el ndice Java producir una 3460 IndexOutOfBoundException que de todas 3461 maneras terminar el programa. 3462 Secretaria: 3463 1. package com.compunauta.aprendiendojava;

101
3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502
2. import java.io.*; 3. import java.net.*; 4. /** 5. * <p>Ttulo: Aprendiendo Java</p> 6. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de Compunauta</p> 7. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p> 8. * <p>Empresa: COMPUNAUTA</p> 9. * @author Gustavo Guillermo Prez 10. * @version 2006.01.01 11. */ 12. 13.public class Cap3_sock_sec { 14.//Declaramos unas variables globales a este tipo de datos 15.public static int PORT=4567; 16.public static String HOST="127.0.0.1"; 17. 18. public static void main(String[] args) { 19. System.err.println("Intentando conectar con la telefonista"); 20. Socket skt=(Socket)null; 21. try {skt = new Socket(HOST, PORT);} 22. catch (Exception ex) { 23. System.err.println("La telefonista no est en lnea"); 24. System.exit(-1); 25. } 26. 27. int tel; 28. BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in)); 29. try { 30. ObjectOutputStream datos = new ObjectOutputStream(skt.getOutputStream()); 31. System.err.println("Nos conectamos con la telefonista:"+HOST +":"+PORT); 32. System.err.println("Ingrese nmeros -1 termina");

102
3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538
33. while (true){ 34. if((tel=leerInt(teclado))==-1){ 35. System.err.println("Programa terminado"); 36. datos.writeInt(-1); 37. datos.flush(); 38. datos.close(); 39. skt.close(); 40. System.exit(0); 41. }else{ 42. datos.writeInt(tel); 43. datos.flush(); 44. } 45. }//fin de la lectura eterna 46. }catch (IOException ex1) {ex1.printStackTrace(System.err);} 47. 48. }//fin del mtodo principal 49. 50.//Funciones o mtodos auxiliares 51.public static int leerInt(BufferedReader buff){ 52. int lee=0; 53. boolean error; 54. do { 55. error=false; 56. try {lee = Integer.parseInt(buff.readLine());} 57. catch (NumberFormatException ex) { 58. System.err.println("Entrada erronea, repetir:?"); 59. error=true;} 60. catch (Exception ex){ex.printStackTrace(System.err);} 61. } while (error); 62. return lee; 63. }//final de la funcion leer 64. 65.}//final de la clase

Descripcin del funcionamiento:

103
3539 En las lneas 15 y 16 declaramos las variables 3540 globales que almacenarn el puerto y la 3541 direccin 3542 de red donde nos conectaremos, en este caso 3543 la direccin 127.0.0.1 es universal y permite 3544 conectarse a 3545 la misma mquina as que podremos ejecutar 3546 el programa de la secretaria y la telefonista en 3547 la misma 3548 PC en consolas de comandos diferentes, si 3549 estamos en el laboratorio con ms de 1 PC en 3550 RED, entonces 3551 en ese nmero pondremos el que nos 3552 comente el administrador del sistema para 3553 conectarnos a la PC que 3554 correr la telefonista. 3555 En la lnea 18 comienza nuestro mtodo 3556 principal y de la misma manera que en el 3557 programa 3558 anterior definimos el Socket (skt) como un 3559 elemento vaco sin inicializar, ya que estamos 3560 obligados a 3561 revisar errores. 3562 Entre las lneas 21 a 25 comprobamos que se 3563 pueda hacer una conexin al puerto y 3564 direccin de 3565 red indicados, puede suceder que el error no 3566 sea exactamente que la telefonista no est en 3567 lnea y que el 3568 sistema operativo est denegando el acceso a 3569 conectarse al exterior, por ello revisar el 3570 firewall del

104
3571 sistema o los permisos necesarios. 3572 Si nos pudimos conectar el programa sigui 3573 adelante y procedemos a crear un objeto 3574 BufferedReader para manipular la entrada por 3575 teclado y declaramos una variable tel que 3576 almacenar un 3577 telfono para enviar. 3578 En la lnea 29 comienza el bloque donde 3579 abriremos la conexin de datos remota por 3580 medio de un 3581 flujo de datos del tipo ObjetOutputStream. 3582 Como en el componente anterior utilizamos un 3583 bucle eterno para la ejecucin del programa 3584 que 3585 saldr por otros mecanismos. (lnea 33). 3586 En la lnea 34, asignamos el valor que se lee 3587 por teclado a la variable tel, ese segmento 3588 est entre 3589 parntesis porque porque ese mismo valor 3590 asignado lo compararemos antes de 3591 proseguir, podramos 3592 haber hecho primero la asignacin y despus 3593 la comparacin. 3594 Si la secretaria escribi -1 enviamos el -1 a la 3595 telefonista para avisarle que terminamos, 3596 (lnea 36), 3597 la orden datos.fluxh(); vaca los datos de 3598 memoria RAM al flujo de datos 3599 inmediatamente y en las 3600 lneas 38 y 39 cerramos debidamente el flujo 3601 de datos y la conexin de red antes de salir 3602 sin producir

105
3603 error, salir con el cdigo 0 es no producir error. 3604 En la lnea 41 comienza el bloque de datos 3605 que se ejecutar caso contrario a que la 3606 secretaria 3607 ingrese un -1. Donde podemos ver que 3608 escribimos en el flujo de datos el nmero 3609 entero correspondiente 3610 al telfono y obligamos la escritura inmediata 3611 con la orden flush();. 3612 Termina el bucle etenro while(true){} termina 3613 el bloque de control de errores y el mtodo 3614 principal, a continuacin estn la funcin 3615 auxiliar leerInt que no explicaremos porque es 3616 la misma que 3617 vimos en el captulo anterior. 3618 Nota: Veremos con ms detalles el uso de 3619 sockets durante el transcurso del libro, no 3620 ahondaremos en ello ahora. Queda como 3621 ejercicio para el lector producir el error de 3622 Buffer Overrun y revisar en la 3623 documentacin electrnica los mtodos y 3624 objetos 3625 utilizados de la biblioteca de Java. 3626 Implementacin del buffer tipo LIFO (La 3627 pila, ltimo en llegar es primero en salir) 3628 Modifiquemos el ejemplo anterior para que 3629 ahora sean una bibliotecaria y su asistente, la 3630 bibliotecaria recibir libros nuevos para 3631 catalogar y los enviar a apilar en el escritorio 3632 de la asistente, la

106
3633 asistente tendr un minuto para leer el nombre 3634 de la etiqueta que envi la bibliotecaria a 3635 travs de la red 3636 y ordenarlo, es visto que los libros ahora 3637 saldrn en forma de pila y no cola de espera, 3638 el lmite ser la 3639 altura de la asistente que hace las tarjetas 3640 sentada, pero no lo calcularemos :p. 3641 Libros en total 24, se enva el contenido de la 3642 tarjeta en modo texto. 3643 Asistente: 3644 gus@gusgus ~$ java 3645 com.compunauta.aprendiendojava.Cap3_lifo_ 3646 asis 3647 Escuchando el puerto:4567 3648 Esperando conexin... 3649 Conectado... Esperando ttulos 3650 Libro:Introduccin a la fsica 3651 No hay ms, nos vamos cuando 3652 terminemos... 3653 Libro:Aprendiendo Java 3654 Libro:Lectura I 3655 Libro:Asambleas 3656 Ya no es necesario esperar, terminado... 3657 gus@gusgus ~$ 3658 Bibliotecaria: 3659 gus@gusgus ~$ java 3660 com.compunauta.aprendiendojava.Cap3_lifo_ 3661 bib 3662 Intentando conectar con la asistente 3663 Nos conectamos con la 3664 asistente:127.0.0.1:4567 3665 Ingrese Ttulos (lnea vaca termina) 3666 Introduccin a la fsica 3667 Asambleas 3668 Lectura I 3669 Aprendiendo Java

107
3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708
Programa terminado gus@gusgus ~$

Asistente:
1. package com.compunauta.aprendiendojava; 2. import java.io.*; 3. import java.net.*; 4. /** 5. * <p>Ttulo: Aprendiendo Java</p> 6. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de Compunauta</p> 7. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p> 8. * <p>Empresa: COMPUNAUTA</p> 9. * @author Gustavo Guillermo Prez 10. * @version 2006.01.01 11. */ 12. 13.public class Cap3_lifo_asis { 14.//Declaramos unas variables globales a este tipo de datos 15.public static int PORT=4567; 16.public static int BUFF_SIZE=24; 17.public static int TIMER_SLEEP=60*1000; //60sx1000ms 18.public static int buff_elem=0; 19.public static String[] buffer=new String[BUFF_SIZE]; 20. 21. public static void main(String[] args) { 22. //Declaramos la variable socket (ser un puntero a objeto) 23. Socket skt=(Socket)null; 24. //Declaramos vaco el servidor de sockets para inicializarlo 25. ServerSocket Ss=(ServerSocket)null; 26. 27. //Tratamos de escuchar el puerto definido por la variable PORT 28. System.err.println("Escuchando el puerto:"+PORT);

108
3709 29. try {Ss = new ServerSocket(PORT);} 3710 30. catch (IOException ex) { 3711 31. System.out.println("El sistema no permite abrir el 3712 puerto"); 3713 32. System.exit(-1);} 3714 33. 3715 34. //Si no ocurri error arriba entonces esperamos a la 3716 secretaria 3717 35. System.err.println("Esperando conexin..."); 3718 36. try {skt = Ss.accept();} 3719 37. catch (IOException ex1) { 3720 38. ex1.printStackTrace(System.err); 3721 39. System.exit(-1);} 3722 40. 3723 41. //Si no ocurri error arriba la secretaria est lista 3724 para enviar 3725 42. System.err.println("Conectado... Esperando ttulos"); 3726 43. try { 3727 44. BufferedReader datos = new BufferedReader(new 3728 InputStreamReader((skt.getInputStream()))); 3729 45. long timer=0; 3730 46. boolean timer_on=false; 3731 47. boolean ultimo=false; 3732 48. while (true){ 3733 49. if(!ultimo && (skt.isClosed() || ((buff_elem>0) && 3734 buffer[buff_elem-1]!=null && buffer[buff_elem3735 1].equals("fin")))){ 3736 50. //Terminamos el programa si la bibliotecaria termin 3737 51. System.err.println("No hay ms, nos vamos cuando 3738 terminemos..."); 3739 52. //el libro fin no se debe guardar es el aviso 3740 53. buff_elem--; 3741 54. ultimo=true; 3742 55. } 3743 56. if(ultimo && (buff_elem==0)){ 3744 57. System.err.println("Ya no es necesario esperar, 3745 terminado..."); 3746 58. System.exit(0);} 3747 59. //si hay ttulos los guardamos

109
3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786
60. if(!ultimo && datos.ready()){ 61. put_tit(datos.readLine());} 62. if(timer_on){ 63. //si el timer funciona no hacer nada, si se pas pararlo 64. if ((timer+TIMER_SLEEP)<System.currentTimeMillis()) {timer_on=false;} 65. }else{ 66. //Si el timer est apagado, mostramos un tel si es que hay 67. if (buff_elem>0){System.out.println("Libro:"+get_tit()); 68. //Encendemos el timer y guardamos la hora en que empez 69. timer_on=true; 70. timer=System.currentTimeMillis();} 71. } 72. //Pausamos 100ms para no sobrecargar el procesador 73. try {Thread.sleep(100);} 74. catch (InterruptedException ex3) {} 75. }//fin del bloque eterno 76. }catch (Exception ex2) { 77. ex2.printStackTrace(System.err); 78. System.exit(-1); 79. } 80. 81. }//fin del mtodo principal 82. 83. 84.//Funciones o mtodos auxiliares 85.public static void put_tit(String tit){ 86.//Si se supera el espacio producir un error 87.if (BUFF_SIZE<(buff_elem+1)){ 88.System.err.println("Buffer overrun: El buffer se llen demasiado rpido"); 89.System.exit(-1);} 90.//guardamos el tel y aumentamos en uno el contador

110
3787 91.buffer[buff_elem++]=tit; 3788 92.} 3789 93. 3790 94.public static String get_tit(){ 3791 95. //quitamos uno al contador de elementos 3792 96. //devolvemos el ltimo libro 3793 97. return buffer[--buff_elem]; 3794 98.} 3795 99. 3796 100.}//final de la clase 3797 Descripcin del funcionamiento: 3798 La declaracin de variables globales a la clase 3799 o tipo de datos se realiza entre las lneas 15 y 3800 19. 3801 El mtodo principal comienza en la lnea 21, y 3802 declaramos los objetos del tipo Socket y 3803 ServerSocket como en el apartado anterior. 3804 Desde la lnea 28 a la 32 intentamos abrir el 3805 puerto para escuchar conexiones entrantes, si 3806 sucede 3807 un error nos salimos. 3808 Si no hay errores, entre la lnea 35 y 38 3809 esperamos una conexin entrante con su 3810 respectivo bloque 3811 de control de errores. 3812 Como la funcin accept();detendr el 3813 programa hasta que arribe una conexin, si 3814 estamos 3815 ejecutando el bloque principal entre las lneas 3816 43 y siguientes, es porque se recibi una 3817 conexin. En el 3818 respectivo bloque de control de errores 3819 iniciamos el flujo de datos que usaremos para 3820 ir recibiendo

111
3821 renglones, en este caso usamos el mismo tipo 3822 de objeto que nos permite leer lneas desde el 3823 teclado, solo 3824 que ahora las leeremos desde la conexin de 3825 red. 3826 Declaramos algunas cuantas variables para 3827 crear nuestro temporizador de 1 minuto igual 3828 que en el 3829 ejemplo anterior, y definimos una variable 3830 ultimo que nos avisar cuando los libros son 3831 todos. 3832 En este caso la bandera que usamos para 3833 saber que hemos terminado por parte de la 3834 bibliotecaria 3835 es la palabra clave fin, y por supuesto 3836 revisamos que la conexin no est cerrada, 3837 que haya elementos 3838 y todo eso antes de proceder a retirar un libro 3839 del buffer y ensearlo en pantalla. La bandera 3840 binaria 3841 ultimo solo se activar en la condicin 3842 anterior para asegurar que seguiremos 3843 mostrando ttulos 3844 mientras, es una variacin respecto del 3845 ejemplo anterior para ver otras maneras de 3846 resolver algo similar. 3847 Si, el ultimo elemento ya lleg y no hay ms 3848 en la memoria temporal, entonces nos salimos 3849 del 3850 programa. (lneas 56-58).

112
3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885

Si no es el ultimo elemento y hay datos disponibles en el flujo de datos de red, entonces leer una lnea y ponerla en la memoria temporal. Si el timer est encendido entonces procedemos igual que antes, el nico cambio sustancial sern las funciones que guardan y extraen los datos del buffer. La nica funcin que cambia es la que quita elementos del buffer, que es mucho ms simple que antes.
return buffer[--buff_elem];

Donde estamos decrementando el contador de elementos antes (el -- est a la izquierda) y como sabemos que los arreglos se acceden desde el 0 a cantidad-1 entonces es correcto el resultado devuelto. Bibliotecaria:
1. package com.compunauta.aprendiendojava; 2. import java.io.*; 3. import java.net.*; 4. /** 5. * <p>Ttulo: Aprendiendo Java</p> 6. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de Compunauta</p> 7. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p> 8. * <p>Empresa: COMPUNAUTA</p> 9. * @author Gustavo Guillermo Prez 10. * @version 2006.01.01 11. */ 12.

113
3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924
13.public class Cap3_lifo_bib { 14.//Declaramos unas variables globales a este tipo de datos 15.public static int PORT=4567; 16.public static String HOST="127.0.0.1"; 17. 18. public static void main(String[] args) { 19. System.err.println("Intentando conectar con la asistente"); 20. Socket skt=(Socket)null; 21. try {skt = new Socket(HOST, PORT);} 22. catch (Exception ex) { 23. System.err.println("La asistente no est en lnea"); 24. System.exit(-1); 25. } 26. 27. String titulo; 28. BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in)); 29. try { 30. PrintWriter datos = new PrintWriter(skt.getOutputStream()); 31. System.err.println("Nos conectamos con la asistente:"+HOST+":"+PORT); 32. System.err.println("Ingrese Ttulos (lnea vaca termina)"); 33. while (true){ 34. if((titulo=leerLinea(teclado)).length()==0){ 35. System.err.println("Programa terminado"); 36. datos.println("fin"); 37. datos.flush(); 38. datos.close(); 39. skt.close(); 40. System.exit(0); 41. }else{ 42. datos.println(titulo); 43. datos.flush(); 44. } 45. }//fin de la lectura eterna

114
3925 46. }catch (IOException ex1) 3926 {ex1.printStackTrace(System.err);} 3927 47. 3928 48. }//fin del mtodo principal 3929 49. 3930 50.//Funciones o mtodos auxiliares 3931 51.public static String leerLinea(BufferedReader buff){ 3932 52. try {return buff.readLine();} 3933 53. catch (Exception 3934 ex){ex.printStackTrace(System.err);} 3935 54. return ""; 3936 55. }//final de la funcin leer 3937 56. 3938 57.}//final de la clase 3939 Esta implementacin es idntica a la de la 3940 secretaria del ejemplo anterior, solo que para 3941 variar 3942 utilizamos otro tipo de Objeto para el flujo de 3943 datos. 3944 Implementacin de una Lista de datos. 3945 En este caso la memoria temporal ser una 3946 simple lista, se pretender que el usuario 3947 ingrese una 3948 lista de nombres y que en cualquier momento 3949 se pueda buscar, borrar, o agregar elementos. 3950 Salida por pantalla: 3951 gus@gusgus ~$ java 3952 com.compunauta.aprendiendojava.Cap3_lista 3953 SELECCIONE UNA OPCIN: 3954 1) Ingresar un elemento al listado 3955 2) Listar los elementos de la lista 3956 3) Borrar un elemento de la lista 3957 0) Salir 3958 opcin? 3959 1 3960 Dato:? 3961 Azul

115
3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000
opcin? 1 Dato:? Celeste opcin? 1 Dato:? Caffe opcin? 1 Dato:? Osos opcin? 2 Item[0]:[Azul] Item[1]:[Celeste] Item[2]:[Caffe] Item[3]:[Osos] SELECCIONE UNA OPCIN: 1) Ingresar un elemento al listado 2) Listar los elementos de la lista 3) Borrar un elemento de la lista 0) Salir opcin? 3 Item a borrar:? 2 SELECCIONE UNA OPCIN: 1) Ingresar un elemento al listado 2) Listar los elementos de la lista 3) Borrar un elemento de la lista 0) Salir opcin? 2 Item[0]:[Azul] Item[1]:[Celeste] Item[2]:[Osos] gus@gusgus ~$

Ahora veamos el cdigo:

116
4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039
1. package com.compunauta.aprendiendojava; 2. import java.io.*; 3. 4. /** 5. * <p>Ttulo: Aprendiendo Java</p> 6. * <p>Descripcin: Ejemplos del Libro Aprendiendo Java de Compunauta</p> 7. * <p>Copyright: Copyright (c) 2006 www.compunauta.com</p> 8. * <p>Empresa: COMPUNAUTA</p> 9. * @author Gustavo Guillermo Prez 10. * @version 2006.01.01 11. */ 12. 13.public class Cap3_lista { 14. //Variables globales 15. public static int MAX=15; 16. public static String[] lista=new String[MAX]; 17. public static int lista_elem=0; 18. 19. public static void main(String[] args) { 20. BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in)); 21. int op=-1; 22. while(true){ 23. switch (op){ 24. case 1: 25. System.out.println("Dato:?"); 26. ingresa(leerLinea(teclado)); 27. break; 28. case 2: 29. listar(); 30. break; 31. case 3: 32. System.out.println("Item a borrar:?"); 33. borrar(opcion(teclado)); 34. break; 35. case 0: 36. System.out.println("Terminado..");

117
4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078
37. System.exit(0); 38. break; 39. } 40. if(op!=1)imprimir_menu(); 41. System.out.println("opcin?"); 42. op = opcion(teclado); 43. }//fin del bucle eterno 44. }//fin del mtodo principal 45. 46. //Funciones auxiliares 47. public static void ingresa(String dato){ 48. lista[lista_elem++]=dato; 49. } 50. 51. public static void listar(){ 52. for (int i=0;i<lista_elem;i++){ 53. System.out.println("Item["+i+"]:["+lista[i]+"]"); 54. } 55. } 56. 57. public static void borrar(int item){ 58. lista_elem--; 59. for (int i=item;i<lista_elem;i++){ 60. lista[i]=lista[i+1]; 61. } 62. } 63. 64. public static void imprimir_menu(){ 65. System.out.println("SELECCIONE UNA OPCIN:"); 66. System.out.println("1) Ingresar un elemento al listado"); 67. System.out.println("2) Listar los elementos de la lista"); 68. System.out.println("3) Borrar un elemento de la lista"); 69. System.out.println("0) Salir"); 70. } 71. 72. public static int opcion(BufferedReader buff){

118
4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113
73. int lee=0; 74. boolean error; 75. do { 76. error=false; 77. try {return lee = Integer.parseInt(buff.readLine());} 78. catch (NumberFormatException ex) { 79.System.err.println("Entrada erronea, repetir:?"); 80. error=true;} 81. catch (Exception ex){ex.printStackTrace(System.err);} 82. } while (error); 83.return lee; 84.}//final de la funcion leer 85. 86.public static String leerLinea(BufferedReader buff){ 87. try {return buff.readLine();} 88. catch (Exception ex){ex.printStackTrace(System.err);} 89. return ""; 90. }//final de la funcion leer 91. 92.}//fin de la clase

En esta implementacin agregamos un men de usuario en pantalla que nos permitir interoperar un poco mejor el programa para probar todas las opciones e incluso hacer experimentos y expandirlo con los ejemplos que seguirn a este. Como antes entre las lneas 15 y 17 declaramos globalmente la lista, sus lmites y el apuntador de elementos. Nuestro mtodo principal (lnea 20) crear un objeto como antes hicimos para leer desde el

119
4114 teclado (o podra ser una fuente externa como 4115 la red en los ejemplos anteriores). 4116 Definimos de manera local al mtodo principal 4117 la variable op que almacenar la opcin de 4118 men 4119 que haya escogido el usuario (lnea 21). 4120 De la misma manera que antes ejecutamos 4121 indefinidamente el bloque while(true){} aunque 4122 podramos igual que en todos los casos 4123 anteriores proponer una condicin viable que 4124 tambin sea vlida 4125 para terminar el programa como por ejemplo 4126 (op==0). 4127 Cada clusula case ejecutar la funcin 4128 correcta, para no producir una reimpresin 4129 excesiva 4130 molesta en la pantalla del men de usuario 4131 slo lo reimprimiremos si la opcin de men 4132 no fue la de 4133 agregar datos (lnea 40). 4134 En las lneas 41 y 42 imprimimos la leyenda 4135 para solicitar la opcin. Podemos utilizar print 4136 en vez 4137 de println para que el ingreso de datos quede 4138 junto al signo de interrogacin. 4139 Funcin ingresa (lnea 47), muy simple antes 4140 de aumentar en uno el contador de elementos 4141 se 4142 utiliza el valor del ndice para almacenar el 4143 valor del dato que se desea ingresar a la lista.

120
4144 Funcin listar (lnea 51), listamos todos los 4145 elementos de la lista en pantalla indicando su 4146 ndice en 4147 el arreglo de texto lista[]. 4148 Funcin borrar (lnea 57), decrementamos en 4149 uno el contador de elementos y recorremos 4150 todos los 4151 elementos restantes a la posicin que 4152 queremos eliminar. 4153 Funcin imprimir_menu() (lnea 64), slo 4154 imprime en pantalla las opciones que compara 4155 el 4156 mtodo principal para realizar acciones. 4157 Funcin opcin (lnea 72), idntica a leerInt 4158 que hemos estado viendo en todos estos 4159 ejemplos. 4160 Funcin leerLinea (lnea 86), idntica a 4161 leerLinea de todos estos ejemplos anteriores. 4162 Nota: a partir de aqu aadiremos 4163 funciones para experimentar con la lista, es 4164 ejercicio 4165 para el lector agregar a este ejemplo las 4166 entradas del men y los correctos 4167 mecanismos para ejecutar esa 4168 funcionalidad en los bloques case del 4169 mtodo principal. 4170 Bsqueda de datos 4171 Veremos tres maneras diferentes de encontrar 4172 un elemento en una lista de datos, el primero 4173 es el

121
4174 ms lgico, el secuencial, el opuesto, 4175 aleatorio, y el binario cuando la lista lleva 4176 algn tipo de orden. 4177 Bsqueda secuencial 4178 La bsqueda secuencial es el equivalente a 4179 recorrer todos los elementos de la lista y 4180 compararlos 4181 del primero al ltimo de manera que cuando 4182 encontramos el elemento terminamos la 4183 bsqueda. 4184 public static String search(String patron){ 4185 for (int i=0;i<lista_elem;i++){ 4186 if(lista[i].indexOf(patron)!=-1) return lista[i]; 4187 } 4188 return null; 4189 } 4190 Nota: Recordemos que lista_elem siempre 4191 almacenar la cantidad de elementos y al 4192 comprarar i<lista_elem estamos 4193 asegurndonos que jams se llegar a este 4194 valor, ya 4195 que los arreglos se acceden desde 0 hasta 4196 lista_elem-1. 4197 Bsqueda aleatoria, desordenar lista. 4198 Este mtodo es completamente probabilstico 4199 y es funcional cuando el mtodo binario u otro 4200 mtodo ms eficaz no visto sea aplicable. Es 4201 factible si el acceso a los datos es 4202 extremadamente lento, es 4203 decir si la bsqueda secuencial podra tardar 4204 horas para encontrar el ltimo entre unos 4205 cuantos y

122
4206 queremos probar suerte (ya que las 4207 probabilidades de la bsqueda secuencial son 4208 las mismas), tambin 4209 sirve para desordenar una lista, por ejemplo 4210 para repartir cartas mezcladas de un juego 4211 virtual. 4212 Ejemplo: En una situacin donde la consulta 4213 en lnea de archivos clasificados depende de 4214 personal 4215 humano para deducir la respuesta y la 4216 respuesta humana puede tardar minutos en 4217 encontrar por ejemplo 4218 un sello en una carpeta, la bsqueda se 4219 minimizara de manera aleatoria si tenemos 4220 suerte, otro ejemplo 4221 sera buscar dentro de los archivos de una 4222 lista de archivos alojados en un servidor 4223 remoto 4224 completamente saturado y con escasas 4225 posibilidades de transferencia a alta velocidad, 4226 tambin 4227 minimizaramos el tiempo de bsqueda de 4228 manera que en el peor de los casos nuestra 4229 respuesta estara 4230 entre el 50% y el 100% de los ltimos 4231 registros y en el mejor de los casos entre el 4232 0% y el 50% de los 4233 primeros registros, de todas maneras es la 4234 misma probabilidad que la bsqueda 4235 secuencial as que solo 4236 el azar es el que influye. 4237 Bsqueda desordenada de la lista:

123
4238 1. public static String buscar_desordenado(String 4239 patron){ 4240 2. int[] indice=new int[lista_elem]; 4241 3. int aleatorio; 4242 4. for (int i=0;i<lista_elem;i++) indice[i]=i; 4243 5. for (int i=lista_elem;i>0;i--){ 4244 6. aleatorio=(int)(Math.random()*i); 4245 7. if(lista[indice[aleatorio]].indexOf(patron)!=-1) return 4246 lista[indice[aleatorio]]+":"+(lista_elem-i); 4247 8. for (int j=aleatorio;j<i-1;j++)indice[j]=indice[j+1]; 4248 9. } 4249 10. return null; 4250 11. } 4251 Fabricamos un ndice para acceder a la lista, 4252 con la cantidad de elementos actual y no la 4253 mxima 4254 que es su capacidad, ya que ser de manera 4255 temporal y local a la funcin, todos los objetos 4256 y variables 4257 declarados dentro de una funcin a menos 4258 que sean declarados estticos se perdern y 4259 se liberar 4260 memoria del sistema. 4261 Rellenamos el ndice con los elementos desde 4262 el 0 al mximo menos uno. Extraemos al azar 4263 un 4264 elemento del ndice y recorremos los dems 4265 hasta el que quitamos, as comparamos un 4266 elemento de la 4267 lista al azar y terminamos si lo encontramos. 4268 Nota: El tipo de bsqueda no es exacto ya 4269 que usamos indexOf en vez de equals. 4270 Queda 4271 para el lector agregar esta funcin en el 4272 ejemplo anterior y probarla.

124
4273 Desordenar la lista: 4274 12. public static void desordenar(){ 4275 13. int[] indice=new int[lista_elem]; 4276 14. String[] desordenado=new String[lista_elem]; 4277 15. int des_elem=0; 4278 16. int aleatorio; 4279 17. for (int i=0;i<lista_elem;i++) indice[i]=i; 4280 18. for (int i=lista_elem;i>0;i--){ 4281 19. aleatorio=(int)(Math.random()*i); 4282 20. desordenado[des_elem++]=lista[indice[aleatorio]]; 4283 21. for (int j=aleatorio;j<i-1;j++)indice[j]=indice[j+1]; 4284 22. } 4285 23. for (int i=0;i<lista_elem;i++) lista[i]=desordenado[i]; 4286 24.} 4287 Para desordenar la lista estamos usando una 4288 lista temporal, con su respectivo contador e 4289 ndice 4290 variable de elementos. 4291 Nota: Queda como tarea para el lector 4292 optimizar esta funcin para que no sea 4293 necesaria la 4294 lista temporal que en caso de escasos 4295 recursos y enormes listas no sera algo 4296 permitido, utilizando slo 1 objeto temporal 4297 del tipo String para intercambiar valores 4298 y eliminar el uso del ndice temporal. 4299 Bsqueda Binaria (lista ordenada) 4300 La bsqueda binaria es un mtodo simple que 4301 se usa para encontrar datos en una lista 4302 ordenada, el 4303 mecanismo es el siguiente... 4304 Si tenemos una lista de n datos, ordenados de 4305 mayor a menor y queremos encontrar uno en

125
4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334

particular, haremos una bsqueda con dos ndices, o sea almacenaremos el valor del elemento comparado ms grande y ms pequeo hasta arrinconar el resultado o llegar a un punto donde no existe tal elemento pero los dos mas cercanos son estos ndices mayor y menor. Veamos ahora un trozo de cdigo para cuando la lista est ordenada de manera creciente y decreciente, estas dos funciones utilizan la frmula que vimos en la ilustracin anterior para calcular el ndice superior e inferior, de esa manera y teniendo en cuenta que la operacin de divisin ser redondeada y slo tendremos un nmero entero veamos como quedaran nuestras funciones. Orden ascendente de Texto:
1. public static String buscar_ordenado_az(String inicio){ 2. int Is=lista_elem-1; Ilustracin 2: Bsqueda binaria en una lista ordenada

0123456789
IINFERIOR ISUPERIOR (9-0)/2+0

126

4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352

456789

IINFERIOR ISUPERIOR (9-4)/2+4 6 Se busca el elemento 7 de una lista ordenada, los contenidos pueden ser nombres de una agenda. IINFERIOR ISUPERIOR

6789
(9-6)/2+6 7

PComp= [ IS II ] 2 II
Si el punto de comparacin es mayor

127
4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 que dato que buscamos se actualiza el ndice superior al punto de comparacin, si es menor se actualiza el inferior, hasta que el punto de comparacin sea el resultado buscado
3. int Ii=0; 4. int cmp=0; 5. int old_cmp=-1; 6. int compare; 7. while (cmp!=old_cmp){ 8. old_cmp=cmp; 9. cmp=(Is-Ii)/2+Ii; 10. compare=lista[cmp].compareTo(inicio); 11. if(compare==0){return lista[cmp];} 12. if(compare<0){Ii=cmp;} 13. if(compare>0){Is=cmp;} 14. } 15. return lista[Is]; 16. }

Orden descendente de texto:


17. public static String buscar_ordenado_za(String inicio){ 18. int Is=lista_elem-1; 19. int Ii=0; 20. int cmp=0; 21. int old_cmp=-1; 22. int compare; 23. while (cmp!=old_cmp){ 24. old_cmp=cmp; 25. cmp=(Is-Ii)/2+Ii; 26. compare=lista[cmp].compareTo(inicio); 27. if(compare==0){return lista[cmp];} 28. if(compare>0){Ii=cmp;} 29. if(compare<0){Is=cmp;} 30. } 31. return lista[Ii]; 32. }

128
4390 En estas dos funciones iguales, slo cambian 4391 las comparaciones, el problema en este 4392 ejemplo es la 4393 manera en la que la funcin de la biblioteca 4394 efecta la comparacin, podemos crear 4395 nuestras propias 4396 funciones de comparacin y evitar usar las de 4397 la biblioteca, pero, la biblioteca suele tener 4398 funciones 4399 optimizadas al nivel del sistema operativo y no 4400 la mquina virtual de Java, por lo tanto las 4401 usaremos 4402 siempre que podamos. 4403 Nota: Queda para el lector agregar esta 4404 funcin al ejemplo de las listas y 4405 reconstruirla para 4406 el caso que los elementos sean nmeros 4407 cualesquiera enteros en vez de objetos de 4408 texto. 4409 Mtodos para ordenar listas 4410 Veremos a continuacin algunos pocos 4411 mtodos para ordenar listas de datos, esto 4412 nos servir para 4413 poder aplicar la bsqueda binaria sobre una 4414 lista de datos, aunque en la actualizad esto ya 4415 casi no se 4416 utiliza debido a que los motores de bases de 4417 datos ordenan los resultados (resultsets) de 4418 manera que ya 4419 no es necesario ordenar, se delega la tarea a 4420 programas optimizados para hacer eso de 4421 manera

129
4422 extraordinariamente rpida como MySQL 4423 compilado para el procesador de la PC. 4424 Mtodo de la burbuja o Mtodo de 4425 Ordenacin por Seleccin 4426 Este mtodo es antiguo y obsoleto, pero sirve 4427 para aprender, por su simpleza y porque para 4428 pocos 4429 elementos no consume muchos recursos, la 4430 idea es la siguiente: tenemos una lista de 4431 datos desordenada 4432 y comparamos los dos primeros y slo esos 4433 dos los ordenamos de mayor a menor, el paso 4434 siguiente es 4435 comparar el que sigue con el anterior y as 4436 sucesivamente hasta llegar al final, si 4437 contamos las 4438 comparaciones, fueron el total de los datos de 4439 la lista, menos una porque son de dos en dos. 4440 Con cada 4441 pasada por la lista un dato queda ordenado, y 4442 el nombre de burbuja es porque podramos 4443 imaginarnos 4444 una burbuja que se lleva nuestro dato ms 4445 grande hacia abajo o hacia arriba 4446 dependiendo como estemos 4447 recorriendo la lista y como estemos 4448 ordenando, si de mayor a menor o menor a 4449 mayor. 4450 Como podemos ver, para que la lista quede 4451 ordenada en el ejemplo de la ilustracin 4452 anterior,

130
4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475

debemos repetir el procedimiento N-1 veces, pero tambin como podemos ver ya que el elemento ms grande qued ordenado, podemos reducir el espacio de la burbuja desde el primer elemento al N-1-i donde i es el nmero de veces que se ha recorrido la lista para ordenarla, de esa manera reducimos la cantidad de comparaciones, que hace la burbuja para quedarse con el elemento ms grande.
Ilustracin 3: Mtodo de la burbuja o Mtodo de Ordenacin por Seleccin, para ordenar datos

2<0 34 10 4 89 100 23 45 12 15 20 90 47
<

20 34 10 4 89 100 23 45 12 15 20 90 47 20 10 34 4 89 100 23 45 12 15 20 90 47 20 10 4 34 89 100 23 45 12 15 20 90 47

131

4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498

20 10 4 34 89 100 23 45 12 15 20 90 47 20 10 4 34 89 100 23 45 12 15 20 90 47 20 10 4 34 89 23 100 45 12 15 20 90 47 20 10 4 34 89 23 45 100 12 15 20 90 47 20 10 4 34 89 23 45 12 15 20 90 47 100


Veamos un ejemplo:
1. public static void burbuja_mayormenor(int[] listado){ 2. int temporal; 3. for (int j = 0; j < listado.length - 1; j++) { 4. for (int i = 0; i < listado.length - 1; i++) { 5. if (listado[i] < listado[i + 1]) { 6. temporal = listado[i + 1]; 7. listado[i + 1] = listado[i]; 8. listado[i] = temporal; 9. } 10. } 11. }

132
4499 12. } //final metodo ordenar burbuja mayor menor 4500 la funcin descrita arriba ordena de mayor a 4501 menor los elementos de la lista, la lista es un 4502 arreglo 4503 de nmeros enteros que se recorre de la 4504 misma manera que en la Ilustracin 3 slo que 4505 se compara de 4506 manera que el ms pequeo sea el que se 4507 queda, en la linea 3 repetimos el proceso N 4508 cantidad de veces, 4509 ya que la burbuja ordena de 1 elemento por 4510 pasada y el proceso de recorrido empieza en 4511 la lnea 4, en la 4512 lnea 5 se hace la comparacin y dado el caso 4513 se dan vuelta los elementos utilizando una 4514 variable 4515 temporal del mismo tipo que almacena el 4516 arreglo. 4517 Ahora veamos como acotar los recorridos para 4518 reducir la cantidad de comparaciones: 4519 13.public static void ordenar_burbuja_mayormenor(int[] 4520 listado){ 4521 14. int temporal; 4522 15. for (int j = listado.length - 1; j > 0; j--) { 4523 16. for (int i = 0; i < j; i++) { 4524 17. if (listado[i] < listado[i + 1]) { 4525 18. temporal = listado[i + 1]; 4526 19. listado[i + 1] = listado[i]; 4527 20. listado[i] = temporal; 4528 21. } 4529 22. } 4530 23. } 4531 24. }//final metodo ordenar burbuja mayor menor

133
4532 Este ejemplo es idntico al anterior slo que 4533 ahora la lnea 3 no slo se utiliza para contar 4534 la 4535 cantidad de veces que tenemos que recorrer 4536 el arreglo sino que va decreciendo para que el 4537 recorrido 4538 siempre sea un elemento menos, es decir el 4539 que qued ordenado no se vuelve a comparar. 4540 Nota: Queda como ejercicio para el lector 4541 construir las dos funciones inversas, las 4542 que 4543 ordenan de menor a mayor, y la que ordena 4544 de menor a mayor acotando las 4545 comparaciones. 4546 Mtodo QuickSort Recursivo 4547 Este mtodo para ordenar, es recursivo, si 4548 entendimos el ejemplo anterior, pudimos ver 4549 que la 4550 ejecucin del algoritmo era secuencial, es 4551 decir 1 sola funcin hizo todo el trabajo en si 4552 misma. 4553 Este algoritmo implementa la divisin en dos 4554 grupos del arreglo a ordenar y por lo tanto la 4555 misma 4556 operacin se realiza con cada subgrupo que a 4557 su vez se vuelve a dividir, y como es la misma 4558 operacin 4559 se llama a la misma funcin varias veces. 4560 Esto tiene una desventaja, la plataforma que 4561 corre nuestra implementacin debe producir 4562 una

134
4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598

interrupcin del proceso de ejecucin para llamar a otra funcin, esto no tiene nada de malo excepto que cuando sean demasiados elementos la cantidad de veces que una funcin llam a la misma funcin que llam a la misma funcin puede ser tan larga que podra producir un agotamiento de recursos que ralentice o impida la ejecucin de este tipo de algoritmos, en conclusin este mtodo es muy difcil implementarlo de manera secuencial pero la cantidad de comparaciones se reduce notablemente.{1}{2}
1. public static void quicksort_menormayor(int[] listado,int i,int j){ 2. if (i>=j){return;} 3. int p = dividiren_menormayor(listado,i,j); 4. quicksort_menormayor(listado,i,p-1); 5. quicksort_menormayor(listado,p+1,j); 6. }//final del mtodo principal de quicksort 7. 8. public static int dividiren_menormayor(int[] listado,int i,int j){ 9. int p= i; i++; 10. while (true){ 11. while (i < j && listado[i]<=listado[p]){i++;} 12. while (i < j && listado[j]>=listado[p]){j--;} 13. if (i == j) break; 14. swap(listado,i,j); 15. } 16. if (listado[p]<listado[i]){i--;} 17. swap(listado,p,i); 18. return i; 19. }//final del mtodo que divide y ordena

135
4599 En el cdigo de ejemplo vemos que se 4600 declararon varias funciones, la funcin swap 4601 hace el 4602 intercambio con la variable temporal como en 4603 el mtodo anterior, la funcin dividiren es la 4604 ms 4605 importante de este procedimiento, es no solo 4606 la que divide sino la que intercambia los 4607 elementos que se 4608 van ordenando. Y por supuesto quicksort se 4609 llama as misma por cada subsegmento. 4610 Cada segmento se recorre hacia arriba y 4611 hacia abajo saltndose los menores e iguales 4612 y mayores e 4613 iguales que el elemento inferior, cuando no 4614 hay nada que saltar, se intercambian los 4615 valores de manera 4616 que quedan por encima y debajo de p los 4617 mayores y los menores. 4618 Ahora veamos la misma funcin pero 4619 ordenando de mayor a menor, como podemos 4620 ver slo 4621 cambian los signos de comparacin referentes 4622 a los contenidos del listado. 4623 1. public static void quicksort_mayormenor(int[] 4624 listado,int i,int j){ 4625 2. if (i>=j){return;} 4626 3. int p = dividiren_mayormenor(listado,i,j); 4627 4. quicksort_mayormenor(listado,i,p-1); 4628 5. quicksort_mayormenor(listado,p+1,j); 4629 6. }//final del mtodo principal de quicksort 4630 7. 4631 8. public static int dividiren_mayormenor(int[] 4632 listado,int i,int j){

136
4633 9. int p= i; i++; 4634 10. while (true){ 4635 11. while (i < j && listado[i]>=listado[p]){i++;} 4636 12. while (i < j && listado[j]<=listado[p]){j--;} 4637 13. if (i == j) break; 4638 14. swap(listado,i,j); 4639 15. } 4640 16. if (listado[p]>listado[i]){i--;} 4641 17. swap(listado,p,i); 4642 18. return i; 4643 19. }//final del mtodo que divide y ordena 4644 Otros mecanismos para ordenar. 4645 Existen otros mecanismos que no podemos 4646 tratar en este momento porque es necesario 4647 implementar objetos, as que ese ser el 4648 prximo tema, algunos son, por insercin, por 4649 fusin, de shell y 4650 con un rbol binario. 4651 Ejercicios 4652 Los ejercicios del captulo III son los ltimos 4653 antes de proceder con objetos, es 4654 recomendable que 4655 todo aquello que se ha visto hasta el momento 4656 quede perfectamente asimilado ya que en el 4657 prximo 4658 tema los objetos comenzarn a ser la 4659 herramienta principal. 4660 Ejercicio 3.1 4661 Realizar un programa cuyo mtodo principal 4662 pida 10 valores numricos y los asigne a un 4663 arreglo, 4664 posteriormente imprimir en pantalla el 4665 resultado ordenado creciente, y decreciente 4666 utilizando el mtodo

137
4667 de la burbuja, computar la cantidad de 4668 comparaciones realizadas entre elementos del 4669 arreglo y 4670 mostrarlas al final como estadstica. 4671 1. package com.compunauta.aprendiendojava; 4672 2. import java.io.*; 4673 3. /** 4674 4. * <p>Ttulo: Aprendiendo Java</p> 4675 5. * <p>Descripcin: Ejemplos del Libro Aprendiendo 4676 Java de Compunauta</p> 4677 6. * <p>Copyright: Copyright (c) 2006 4678 www.compunauta.com</p> 4679 7. * <p>Empresa: COMPUNAUTA</p> 4680 8. * @author Gustavo Guillermo Prez 4681 9. * @version 2007.10.01 4682 10. */ 4683 11. 4684 12.public class Cap3_ej1 { 4685 13. public static int comparaciones=0; 4686 14. public static void main(String[] args) { 4687 15. BufferedReader br=new BufferedReader(new 4688 InputStreamReader(System.in)); 4689 16. int[] listado=new int[10]; 4690 17. System.out.println("Ingrese 10 nmeros, de a uno 4691 presionando ENTER"); 4692 18. for(int i=0;i<10;i++){ 4693 19. listado[i]=leerInt(br); 4694 20. } 4695 21. 4696 22. burbuja_mayormenor(listado); 4697 23. for(int i=0;i<10;i++){ 4698 24. System.out.println("NRO >:["+i+"] "+listado[i]); 4699 25. } 4700 26. 4701 System.out.println("Comparaciones:"+comparaciones); 4702 27. burbuja_menormayor(listado); 4703 28. for(int i=0;i<10;i++){ 4704 29. System.out.println("NRO <:["+i+"] "+listado[i]);

138
4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743
30. } 31. 32. } 33. public static int leerInt(BufferedReader buff){ 34. int lee=0; 35. boolean error; 36. do { 37. error=false; 38. try {lee = Integer.parseInt(buff.readLine());} 39. catch (NumberFormatException ex) { 40. System.out.println("Entrada erronea, repetir:?"); 41. error=true;} 42. catch (Exception ex){ex.printStackTrace(System.err);} 43. } while (error); 44. return lee; 45. }//final de la funcin leer 46. 47. public static void ordenar_burbuja_mayormenor(int[] listado){ 48. int temporal; 49. for (int j = listado.length - 1; j > 0; j--) { 50. for (int i = 0; i < j; i++) { 51. comparaciones++; 52. if (listado[i] < listado[i + 1]) { 53. temporal = listado[i + 1]; 54. listado[i + 1] = listado[i]; 55. listado[i] = temporal; 56. } 57. } 58. } 59. }//final mtodo ordenar burbuja mayor menor 60. 61. public static void burbuja_mayormenor(int[] listado){ 62. int temporal; 63. for (int j = 0; j < listado.length - 1; j++) { 64. for (int i = 0; i < listado.length - 1; i++) { 65. comparaciones++;

139
4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782
66. if (listado[i] < listado[i + 1]) { 67. temporal = listado[i + 1]; 68. listado[i + 1] = listado[i]; 69. listado[i] = temporal; 70. } 71. } 72. } 73. } //final mtodo ordenar burbuja mayor menor 74. 75. public static void ordenar_burbuja_menormayor(int[] listado){ 76. int temporal; 77. for (int j = 0; j < listado.length - 1; j++) { 78. for (int i = listado.length - 1; i > j; i--) { 79. comparaciones++; 80. if (listado[i] < listado[i - 1]) { 81. temporal = listado[i - 1]; 82. listado[i - 1] = listado[i]; 83. listado[i] = temporal; 84. } 85. } 86. } 87. }//final mtodo ordenar burbuja menor mayor 88. 89. public static void burbuja_menormayor(int[] listado){ 90. int temporal; 91. for (int j = 0; j < listado.length - 1; j++) { 92. for (int i = listado.length - 1; i > 0; i--) { 93. comparaciones++; 94. if (listado[i] < listado[i - 1]) { 95. temporal = listado[i - 1]; 96. listado[i - 1] = listado[i]; 97. listado[i] = temporal; 98. } 99. } 100. } 101. } //final mtodo ordenar burbuja menor mayor 102.}

140
4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814

Lnea 1, declaracin del paquete, lnea 2 importamos java.io para usar los mtodos de lectura del teclado, Lnea 12 declaracin de la clase, lnea 13 declaramos la variable esttica a la clase comparaciones que es la que usaremos para computar la cantidad de comparaciones para ordenar el arreglo. El programa en s comienza en el mtodo principal lnea 14, lnea 15 se construye un objeto BufferedReader para lectura por teclado, lnea 16 se inicializa un arreglo de 10 elementos que ser el tamao del arreglo a trabajar. Lneas 17 a 20 es la entrada por teclado de los nmeros del arreglo utilizando la funcin leerInt(BufferedReader) utilizada en ejercicios anteriores. Lnea 22 se invoca a la funcin que ordena sobre el arreglo listado de nmeros enteros, y en las lneas 23 a 26 se imprime en pantalla la informacin correspondiente y la estadstica de las comparaciones. Lnea 33 a 45 Funcin leer. Lnea 47 59 la funcin ordenar de mayor a menor con la optimizacin de acotacin de ndices, y las dems variantes con y sin optimizacin.

141
4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828

Ejercicio 3.2
Realizar un programa cuyo fin sea el del ejercicio 3.1 pero utilizando el procedimiento quicksort.

Ejercicio 3.3
Integrar con un pequeo men en pantalla la seleccin del mtodo que se utilizar para ordenar el arreglo reutilizando el cdigo de los ejercicios anteriores 3.1 y 3.2, pero aadir al cmputo las comparaciones en total incluyendo las de los ndices en bucles.

4829 4830 En este captulo del libro comenzaremos a 4831 utilizar objetos para resolver problemas, la 4832 construccin eficiente del objeto tambin ser 4833 parte del problema, recordemos que un objeto 4834 puede 4835 tener, mtodos estticos y dinmicos y 4836 propiedades estticas y dinmicas, la 4837 seleccin de cada una 4838 depender del problema y del criterio utilizado. 4839 Lista con punteros para ordenar 4840 datos. 4841 ste es otro mtodo un poco ms complejo 4842 para ordenar datos mientras se insertan, lo 4843 propondremos como una variante a los 4844 mtodos vistos anteriormente pero 4845 construiremos un objeto que

IV- Primeros Objetos como mecanismo de programacin.

142
4846 almacenar el dato, proveer mtodos para 4847 compararlo con otros objetos iguales y tendr 4848 propiedades 4849 que nos permitir conectarlo con otros objetos 4850 del mismo tipo. El objeto y el procedimiento ir 4851 hacindose ms complejo conforme 4852 avancemos en el tema. 4853 Imaginemos una persona, tiene dos manos y 4854 cada mano puede unirse a otra persona, cada 4855 persona 4856 simboliza un objeto que almacena un dato o 4857 un conocimiento, entonces el objeto de 4858 nuestra lista puede 4859 vincularse por la izquierda y derecha o puede 4860 estar vinculado por solo uno de los dos lados, 4861 o ninguno 4862 en el estado inicial. 4863 Cuando queremos insertar un elemento en 4864 nuestra lista, compararemos el nuevo de 4865 manera binaria 4866 recorriendo la lista como hemos visto 4867 anteriormente, y desconectaremos el lugar 4868 donde le corresponde ir 4869 uniendo su lado derecho e izquierdo con los 4870 elementos de la ruptura. 4871 Este tipo de lista se maneja por apuntadores, 4872 vnculos entre objetos que no es lo mismo que 4873 tener 4874 un arreglo de datos que se puede acceder en 4875 cualquier momento a cualquier elemento por 4876 medio de su

143
4877 ndice. En este caso es necesario ir 4878 recorriendo cada elemento para saber a quien 4879 est conectado y seguir 4880 la cadena de datos de derecha a izquierda y 4881 viceversa.{3} 4882 Nuestro primer objeto 4883 Para poder realizar la lista ordenada que 4884 mencionamos utilizaremos un objeto que 4885 representar el 4886 nodo que puede conectarse por izquierda y 4887 por derecha y que almacena el dato, conforme 4888 podamos 4889 introduciremos funciones extra para realizar 4890 comparaciones. 4891 Propiedades 4892 Necesitamos la propiedad derecha e izquierda 4893 que sern punteros o variables que 4894 almacenarn 4895 objetos del mismo tipo nodo que sern como 4896 las manos que conectan los objetos 4897 adyacentes. 4898 Necesitamos la propiedad valor que 4899 almacenar una cantidad entera dentro del 4900 objeto, y esta 4901 cantidad se establecer al construir el objeto. 4902 1.package com.compunauta.aprendiendojava; 4903 2.public class Nodo { 4904 3. public Nodo izquierda=null; 4905 4. public Nodo derecha=null; 4906 5. public int Dato; 4907 6. public Nodo(int Dato) { 4908 7. this.Dato=Dato; 4909 8. } 4910 9.}

144
4911 Ahora para hacer pruebas construiremos un 4912 mtodo principal y como esta vez la 4913 informacin la 4914 almacenaremos en un arreglo sera 4915 interesante que tengamos un par de 4916 apuntadores principales que nos 4917 permitan acceder al primer y ltimo objeto de 4918 manera inmediata, as que incluiremos esos 4919 apuntadores 4920 para trabajar. Utilizaremos tambin las 4921 funciones que hemos visto anteriormente para 4922 leer enteros del 4923 teclado y recorreremos la lista del elemento 4924 inicial (el ms pequeo) al elemento final (el 4925 ms grande), 4926 despus incluiremos algunas modificaciones 4927 para mejorar la capacidad de insercin 4928 acortando las 4929 comparaciones y ms adelante redisearemos 4930 el mtodo para tener mayor control sobre los 4931 elementos 4932 que no pertenecen a un arreglo en concreto. 4933 1.package com.compunauta.aprendiendojava; 4934 2.import java.io.*; 4935 3./** 4936 4. * <p>Ttulo: Aprendiendo Java</p> 4937 5. * <p>Descripcin: Ejemplos del Libro Aprendiendo 4938 Java de Compunauta</p> 4939 6. * <p>Copyright: Copyright (c) 2007 4940 www.compunauta.com</p> 4941 7. * <p>Empresa: COMPUNAUTA</p> 4942 8. * @author Gustavo Guillermo Prez 4943 9. * @version 2007.10.02 4944 10. */ 4945 11.

145
4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984
12.public class Nodo { 13. public Nodo izquierda=null; 14. public Nodo derecha=null; 15. public int Dato; 16. public Nodo(int Dato) { 17. this.Dato=Dato; 18. } 19. public static Nodo ini=null; //inicio 20. public static Nodo fin=null; //final 21. public static int total=0; 22. public static void main(String[] args) { 23. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 24. System.out.println("Ingrese 10 nmeros, de a uno presionando ENTER"); 25. for (int i = 0; i < 10; i++) { 26. addObject(leerInt(br)); 27. } 28. printList(); 29. } 30. public static void addObject(int Dato){ 31. Nodo dato=new Nodo(Dato); 32. Nodo apuntador; 33. total++; 34. if (total==1){ 35. ini=dato; 36. fin=ini; 37. }else{ 38. if (fin.Dato <= Dato){ 39. fin.derecha=dato; 40. dato.izquierda=fin; 41. fin=dato; 42. return; 43. } 44. if (ini.Dato >= Dato){ 45. ini.izquierda=dato; 46. dato.derecha=ini; 47. ini=dato; 48. return;

146
4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022
49. } 50. apuntador=ini; 51. while (apuntador.Dato < Dato){ 52. apuntador=apuntador.derecha; 53. } 54. dato.izquierda=apuntador.izquierda; 55. apuntador.izquierda.derecha=dato; 56. dato.derecha=apuntador; 57. apuntador.izquierda=dato; 58. return; 59. } 60. } 61. 62. public static void printList(){ 63. Nodo apuntador=ini; 64. int elementos=0; 65. while (apuntador!=null){ 66. System.out.println("Elemento ["+(elementos++)+"]:"+apuntador.Dato); 67. apuntador=apuntador.derecha; 68. } 69. } 70. public static int leerInt(BufferedReader buff){ 71. int lee=0; 72. boolean error; 73. do { 74. error=false; 75. try {lee = Integer.parseInt(buff.readLine());} 76. catch (NumberFormatException ex) { 77. System.out.println("Entrada erronea, repetir:?"); 78. error=true;} 79. catch (Exception ex){ex.printStackTrace(System.err);} 80. } while (error); 81. return lee; 82. }//final de la funcion leer 83. 84.}

147
5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044

Como podemos ver la funcin printList() recorre la lista para impresin en pantalla y la funcin leer renglones, es como la que hemos visto anteriormente, la que realiza la operacin de insercin en la lista es addObject(int Dato) y tenemos en cuenta 4 casos. 1. El primer objeto es ini y fin y tiene nulas derecha e izquierda 2. Si no es el primer objeto y es ms grande que todos unir a la derecha 3. Si no es el primer objeto y es ms pequeo que todos unir a la izquierda 4. Si se encuentra en medio, recorremos desde el inicio hasta encontrar uno ms grande. Nota: Queda como ejercicio para el lector modificar el programa para recorrer la lista de menor a mayor o mayor a menor dependiendo del valor del dato a insertar.

Das könnte Ihnen auch gefallen