Java Ejercicios y caso practico, Apuntes de Programación Java. Instituto Politécnico Nacional (IPN)
rodrigoh00per
rodrigoh00per

Java Ejercicios y caso practico, Apuntes de Programación Java. Instituto Politécnico Nacional (IPN)

PDF (2 MB)
168 páginas
18Número de descargas
535Número de visitas
100%de 4 votosNúmero de votos
2Número de comentarios
Descripción
Se muestra a detalle ejercicios en el lenguaje de programacion java
20 Puntos
Puntos necesarios para descargar
este documento
Descarga el documento
Vista previa3 páginas / 168
Esta solo es una vista previa
3 páginas mostradas de 168 páginas totales
Descarga el documento
Esta solo es una vista previa
3 páginas mostradas de 168 páginas totales
Descarga el documento
Esta solo es una vista previa
3 páginas mostradas de 168 páginas totales
Descarga el documento
Esta solo es una vista previa
3 páginas mostradas de 168 páginas totales
Descarga el documento
apuntes_cc10a_v1.4.doc

1

Java: del Grano a su Mesa

Andrréss Muñoz O..

Versión 1.4

Java: del Grano a su Mesa (Versión 1.4) Tabla de Contenidos

2

Tabla de Contenidos TABLA DE CONTENIDOS 2

INTRODUCCIÓN 3

AGRADECIMIENTOS 4 CAPÍTULO I: PRINCIPIOS BÁSICOS DE JAVA 5

CAPÍTULO II: CONCEPTOS BÁSICOS 21

CAPÍTULO III: ENTRADA Y SALIDA 26

CAPÍTULO IV: ASIGNACIONES, EXPRESIONES Y TIPOS DE DATOS 30 CAPÍTULO V: MÉTODOS Y FUNCIONES 33

CAPÍTULO VI: CONDICIONALES 37

CAPÍTULO VII: CICLOS DE PROGRAMA 44

CAPÍTULO VIII: CADENAS DE TEXTO Y LITERALES 48

CAPÍTULO IX: PATRONES DE PROGRAMACIÓN 53 CAPÍTULO X: ARREGLOS Y MATRICES 53

CAPÍTULO XI: RECURSIVIDAD 53

CAPÍTULO XII: CLASES Y OBJETOS 53

CAPÍTULO XIII: ORDENAMIENTO Y BÚSQUEDA 53 CAPÍTULO XIV: ARCHIVOS DE TEXTO 53

CAPÍTULO XV: INTERFACES GRÁFICAS AWT 53

CAPÍTULO XVI: INTERFACES GRÁFICAS SWING 53

CAPÍTULO XVII: EXCEPCIONES Y CONTROL DE ERRORES 53 CAPÍTULO XVIII: TIPOS Y ESTRUCTURAS DE DATOS 53

CAPÍTULO XIX: ARCHIVOS DE ACCESO ALEATORIO 53 CAPÍTULO XX: BASES DE DATOS 53

CAPÍTULO XXI: CONCURRENCIA 53 CAPÍTULO XXII: INTERNETWORKING 53

CAPÍTULO XXIII: PAQUETES DE CLASES 53 CAPÍTULO XXIV: DISEÑO DE SOFTWARE UML 53

REFERENCIAS 53

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Introducción

3

Introducción Este documento está orientado al apoyo de personas que no tengan conocimiento con el lenguaje Java, ni tampoco con conceptos de programación. Todos los capítulos están realizados con un formato de clases, plantenado primero una motivación que generalmente es un problema que es deseable resolver y que tiene su solución con los conceptos obtenidos a través del capítulo, luego el desarrollo del tema y por último algunos problemas resueltos y propuestos para practicar con los conceptos obtenidos. Como está recopilado por clases de cátedra de un profesor de la Universidad de Chile, existe una posibilidad que hayan inconsistencias entre los capítulos, que serán solucionados en posteriores ediciones de este apunte. Su uso es liberado a nivel académico, tanto por alumnos del curso de Computación I como profesores que deseen usar este material como apoyo a sus clases. También, la idea es dar más herramientas en español para aquellos programadores inexpertos que están ingresando en el mundo de Java.

Java: del Grano a su Mesa (Versión 1.4) Introducción

4

Agradecimientos A mi esposa, Verónica, quien comprendió eternamente las largas noches en los cuales preparaba las clases del año 2001, 2002 y 2003 (las que faltaban). Además, para mis alumnos del curso de CC10A – Computación I sección 03 del año 2001, de la Escuela de Ingeniería de la Universidad de Chile, quienes motivaron el desarrollo del contenido de este apunte. También a mis alumnos del curso de CC10A – Computación I sección 03 del año 2002, gracias a quienes logré mejorar, completar información y compilarla en este apunte. De manera especial, agradezco a Daniel Muñoz, quien me hizo reflexionar en el nombre de este apunte y cambiarlo desde su versión original “Java: Programación y Lenguaje” a “Java: del Grano a su Mesa”. A Giselle, Pablo, Claudia y Marko quienes hicieron control de calidad de mi apunte. Por último a los profesores y alumnos quienes utilizan este apunte, ya que gracias a ellos podré recibir comentarios y aportes a mi correo electrónico ([email protected]) para mejorar más aún su ayuda académica y computacional. A todos, gracias.

Andrés Muñoz O. Ingeniero de Software

Profesor Universidad de Chile

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

5

Capítulo I: Principios Básicos de Java

Principios Básicos

¿Qué es Java? JAVA es un lenguaje de programación creado por SUN Microsystems (http://www.sun.com), muy parecido al estilo de programación del lenguaje “C” y basado en lo que se llama Programación al Objecto.

Programación al Objeto Los principios de la programación al objeto es “modelar” y representar, a través de elementos de programación, objetos que existen en la realidad (tangible o intangibles). Por ejemplo, un lenguaje en donde se pueda modelar una calculadora con todas las operaciones que pueda realizar. Es así como se encapsula y representa un objeto de la siguiente forma (notación UML1): Este dibujo representa las funciones que uno puede realizar con una calculadora.

1 Unified Model Language: Un lenguaje para modelamiento orientado al objeto que veremos más adelante en el curso.

Calculadora Suma Resta Multiplica Divide ...

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

6

Programación en Java Los programas en Java son archivos de texto planos con extensión .java (se utiliza cualquier programa que escriba archivos de texto como son el Notepad de Windows, Wordpad, Textpad e inclusive Word cuando guarda en formato texto) que deben ser compilados con una JVM (Java Virtual Machine) y convertidos en un archivo .class, con el cuál pueden ser ejecutados. Los archivos .class son binarios, por lo que no se pueden abrir con ningún programa.

Un Archivo Java Un archivo .java debe contener la siguiente estructura base:

// Area de inclusión de librerías (package) [Opcional] import <package>.*; // Definición de la clase [public] class <nombre de la clase> { // Definición de métodos [static] [public/protected/private] <tipo de dato> <nombre> (<param1>, <param2>, ..., <paramN>) { ... } }

Clase La estructura anteriormente vista la llamaremos Clase y representará algún objeto o entidad, tangible o intagible que queramos modelar. En un principio escribiramos clases que sean nuestros Programas Principales, es decir, aquellos que resuelven los problemas que nos planteemos. Por ejemplo:

public class HolaMundo { static public void main (String[] args) { Console c = new Console(); c.println (“Hola Mundo”); } }

Esta clase representa mi programa llamado HolaMundo y solo escribe en pantalla la frase “Hola Mundo”.

x.java x.class

Escribe Compila Ejecuta

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

7

Tipos de Clases Existen 2 tipos básicos de clases: Las clases ejecutables y las que no lo son. La diferencia entre estas 2 clases radica físicamente en que algunas de ellas son invocadas desde otras clases. Por ejemplo, Console es una clase (Console.class) que es invocada o utilizada por la clase HolaMundo anteriormente vista. Esta clase puede tener muchos métodos o funcionalidades, que son utilizadas dentro de los otros programas.

public class Console { public void print(String s) { ... } public void println(String s) { ... } public int readInt() { ... } public double readDouble() { ... } public long readLong() { ... } ... }

La clase HolaMundo es del tipo que se puede ejecutar, es decir, al tener el método main significa que lo que está dentro de los paréntesis de llave corresponde a lo ejecutable:

public class HolaMundo { static public void main (String[] args) { // EJECUTABLE Console c = new Console(); c.println(“Hola Mundo”); } }

Instrucciones Cada línea en Java es conocida como una Instrucción, y significa que es lo que uno manda a realizar al computador en un determinado momento. Por ejemplo:

c.println(“Hola Mundo”); // Indica al computador que debe // imprimir en pantalla la frase // “HOLA MUNDO”

Todas las instrucciones llevan un separador al final: “;” (punto y coma). Este separador funciona como si se le indicara al computador DONDE termina una línea, ya que Java permite que en 1 línea física escribir más de una instrucción:

c.print(“Hola”); c.println(“ Mundo”);

Esta línea es equivalente a:

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

8

c.print(“Hola”); c.println(“ Mundo”);

ya que el “;” indica el fin de instrucción. También es normal que uno pueda escribir una instrucción en más de una línea física, ya que el “;” es nuestro fin de instrucción:

c.println(“Hola“ +

“ Mundo”);

Estas 2 línea son interpretadas por el computador como si fuesen una sola:

c.println(“Hola“ + “ Mundo”);

Bloques En Java se pueden agrupar las instrucciones en Bloques de instrucciones. Los bloques son delimitados por los paréntesis de llaves (“{“ y “}”). Los métodos son bloques de programas que se ejecutan al ser invocados:

static public void main (String[] args) { Console c = new Console(); c.println(“Hola Mundo”); BLOQUE }

Las clases se componen de 2 partes: un encabezado y un cuerpo:

public class HolaMundo { ENCABEZADO static public void main (String[] args) { Console c = new Console(); c.println(“Hola Mundo”); CUERPO } }

El cuerpo de una clase es considerado un bloque de programa, ya que almacena múltiples bloques (métodos) y otras instrucciones. Los bloques también pueden almacenar otros bloques como en este caso.

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

9

Ejecución de un Programa Java Definiremos plan de ejecución a las líneas que realmente son leídas y ejecutadas cuando uno invoca la clase que desea correr. La ejecución de un programa en Java es lineal, y comienza SIEMPRE por el bloque de programa escrito dentro del método main. Al momento de ejecutar la clase, el bloque main comienza a ejecutar. Luego se realizan las llamadas necesarias a cualquier bloque o método:

import java.io.*; class ejemplo{ //este programa calcula el factorial de un numero. static public int fact(int numero){ int factorial=1; for(int i=1; i<numero; i++){ factorial=factorial*i; } return factorial; } static public void main(String args[]){ Console c=new Console(); c.print("Ingrese el numero a calcular: "); int numero=c.readInt(); int factorial = fact(numero); c.print("El factorial de:"+ numero+ " es:"+ factorial); } }

En este ejemplo, el plan de ejecución sería el siguiente: 1) . [INICIO DEL PROGRAMA] 2) Console c=new Console(); 3) c.print("Ingrese el numero a calcular: "); 4) int numero=c.readInt(); 5) int factorial = [resultado del bloque siguiente]

a) int factorial=1; b) for(int i=1; i<numero; i++) [repite el siguiente bloque]

i) factorial=factorial*i; c) return factorial; [devuelve el valor del bloque al 4]

6) c.print("El factorial de:"+ numero+ " es:"+ factorial); 7) . [FIN DEL PROGRAMA]Podemos notar que la ejecución es muy distinta a el órden en el cual se han escrito las líneas de código (instrucciones).

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

10

En la Práctica La idea es que ahora que conocemos como se escriben los programas, podamos saber también como llegar a que se ejecuten también. Qué necesitas para programar Es muy necesario utilizar el Java Develpment Kit (JDK) adecuado para las necesidades que tengas. Para efectos del curso, nosotros utilizaremos el JDK 1.1.8 o 1.3.0, pero nada superior a eso, ya que las funcionalidades de la Console pueden verse afectadas por otras versiones2. El JDK es un compilador y ejecutor de programas Java a través de algo que se llama Java Virtual Machine (JVM) y que es como un computador pero que solo entiende Java. Para que tu computador tenga una JVM, es necesario que descargues el JDK y lo instales en tu computador. En el caso de la escuela se encuentra instalado el JDK 1.3.0 y las funcionalidades se ven bastante bien, pero recomendamos que instales el JDK 1.1.8 o 1.2.2. El JDK lo puedes descargar de la página oficial de Java de Sun Microsystems (http://java.sun.com) o desde la página de ayuda de la página del curso. Luego que lo tengas en tu computador, instala el software y “voila”. Con esto ya tienes lo necesario para comenzar tu aventura. Como escribir un programa Para escribir un programa lo primero que se necesita es un editor de texto. El mas simple y que viene de manera predeterminada con windows es Notepad (Bloc de Notas), pero cada quien es libre de usar el que mas le acomode (UltraEdit, Textpad, Jolie, etc). El icono de notepad se encuentra en el menú: MENU INICIO Ë ACCESORIOS Ë Bloc de Notas (Notepad)

Y el abrirlo se ve una ventana como la siguiente:

2 Si te atreves a probar en otra versión del JDK queda estrictamente bajo tu responsabilidad.

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

11

En esta ventana se puede escribir el código de algún programa. Por ejemplo el siguiente código podemos escribirlo dentro de Notepad, para que probemos:

class ejemplo{ static public void main(String args[]){ Console c=new Console(); c.print("Ingrese el numero a calcular: "); int numero=c.readInt(); int factorial=1; for(int i=1; i<numero; I++){ factorial=factorial*i; } c.print("El factorial de:"+ numero+ " es:"+ factorial); } }

Que en notepad quedaría como:

Luego, para guardar eso se debe ir al menú Archivo/Guardar como… Se guarda, para ahorrar confusión, con el mismo nombre de la clase ( class ejemplo{} ). Las comillas aquí son necesarias o de lo contrario el archivo se guardara con el nombre como: ejemplo.java.txt cosa que esta muy mal porque no podremos utilizarlo como programa Java.

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

12

Existen otros editores que puedes usar. Algunos conocidos son los llamados IDE. La mayoría debes pagarlos, pero puedes encontrar versiones en la internet. Estos son: ß IBM Visual Age for Java ß Borland JBuilder ß Sun Forte ß Jade ß JCreator (La versión Limited Edition es gratis) ß Jolie (un desarrollo gratis del profesor Kurt Schwarze) Algunos editores de texto que pueden ayudar marcando colores y estructura son: ß Textpad ß UltraEdit Como compilar un programa Una vez guardado el programa debemos asegurarnos que nuestro CLASSPATH este apuntando correctamente a las librerías de Java. Para ello debemos abrir una ventana de MS-DOS y poner: set CLASSPATH = .;C:\jdk1.1.8\lib el directorio jdk1.1.8 es, en este caso, la versión de Java que instalamos. Si tu versión es la 1.2.2, deberías cambiarlo en el CLASSPATH. Después debemos colocar los 4 archivos que usan la consola en el mismo directorio que el programa que hemos escrito llamado ejemplo.java: Console.class ConsoleCanvas.class Message.class FatalError.class

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

13

Luego debemos abrir una ventana de MS-DOS y colocarnos en el directorio donde se encuentra nuestro archivo ejemplo.java mediante el comando “cd”. Ejemplo:

Una vez ubicados en el directorio llamamos al comando compilador del programa:

El cual, si todo esta bien, y generalmente no lo esta (karma computin), generara el archivo ejemplo.class que contendrá el programa ya compilado, es decir, en un lenguaje que el computador si puede comprender. Si todo está bien, volverá a mostrar la línea de comando sin poner nada en pantalla: C:\WINDOWS\Desktop\temp> y en el directorio donde están los programas, generar el archivo ejemplo.class.

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

14

En caso de que no se ejecute el comando javac, es probable que sea o porque java no esta instalado en el computador, o porque nuestro PATH, no apunta al directorio donde esta el comando java. En este caso, deberás poner lo siguiente y volver a compilar: set PATH = %PATH%;C:\jdk1.1.8\bin Como ejecutar un programa. Una vez compilado el programa y ahora que tenemos el archivo “ejemplo.class”, podemos proceder a ejecutarlo. Aquí suelen ocurrir cosas inesperadas, pero con paciencia también se pueden arreglar.

Lo cual ejecutará el programa ejemplo. Debemos hacer hincapié en que el nuevo comando se llama java, y no javac (javac Û java compiler), y que no se ejecuta: “java ejemplo.class”, sino que solamente “java ejemplo”.

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

15

Los Errores en Java Lo más común cuando escribimos programas en Java es que tengamos errores. Existen 2 tipo de errores: de compilación y de ejecución:

Errores de Compilación Los errores de compilación son aquellos que salen cuando estamos compilando (usando javac) nuestro archivo .java. Por ejemplo, veamos el siguiente programa con errores:

clas EjemploDeError { static void main (String[] args) { Console c = new Console(); c.println ("Aquí le falta un punto y coma") c.println ("Esta línea está ok"); } }

Nótese que hemos deliberadamente puesto clas en vez de class en la definición de la clase, y en la línea 4 hemos dejado sin ; al final de ella. También no hemos puesto las clases de la consola para que veamos qué ocurre. Si lo escribimos y lo intentamos compilar en java obtendremos el siguiente error:

C:\WINDOWS\Desktop\temp>javac EjemploDeError.java EjemploDeError.java:1: 'class' or 'interface' expected clas EjemploDeError { ^ 1 error C:\WINDOWS\Desktop\temp>_

En general, los errores de compilación son aquellos que son causados por un problema en la sintaxis o que no dependen de los valores de variables, métodos e ingresos de datos que ocurran al momento de ejecutar. Al ver este caso podemos decier inmediatamente que “clas” está mal escrito. De hecho el compilador nos lo dice: EjemploDeError.java:1 Indica el archivo y el número de la línea del error. ‘class’ or ‘interface’ expected Éste es el error. El que nos salió en este momento nos dice que “esperaba un class o interface”, lo que significa que esperaba la palabra “class” que es claramente el error en que incurrimos. Lo que está abajo de la primera línea de error es la línea y está marcado el inicio de la palabra que está mal escrita:

clas EjemploDeError { Esta es la línea errada. ^ Indica dónde está el error en la línea.

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

16

Si lo corregimos y lo volvemos a compilar, el error cambiará:

C:\WINDOWS\Desktop\temp>javac EjemploDeError.java EjemploDeError.java:4: ';' expected c.println ("Aqui le falta un punto y coma") ^ EjemploDeError.java:3: cannot resolve symbol symbol : class Console location: class EjemploDeError Console c = new Console(); ^ EjemploDeError.java:3: cannot resolve symbol symbol : class Console location: class EjemploDeError Console c = new Console(); ^ 3 errors C:\WINDOWS\Desktop\temp>_

Ahora tenemos 3 errores (como dice la última línea). 2 de ellos ocurren por causa de la Console (2º y 3º) y otro ocurre por falta del ;.

EjemploDeError.java:4: ';' expected c.println ("Aqui le falta un punto y coma") ^

El primer error nos dice que en la línea 4 esperaba que hubiera un “;” al final de la línea. Este era el problema que habíamos dejado para probar.

EjemploDeError.java:3: cannot resolve symbol symbol : class Console location: class EjemploDeError Console c = new Console(); ^ EjemploDeError.java:3: cannot resolve symbol symbol : class Console location: class EjemploDeError Console c = new Console(); ^

En los otros dos casos aparece la frase “cannot resolve symbol” y destacando la palabra “Console”. Esto ocurre porque no encuentra el archivo Console.class en el CLASSPATH, es decir, o no está definido el CLASSPATH como indicamos anteriormente o faltan las clases. Corrijamos todos los errores y veamos como queda:

C:\WINDOWS\Desktop\temp>javac EjemploDeError.java C:\WINDOWS\Desktop\temp>_

Lo que significa que fue compilado satisfactoriamente.

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

17

Errores de Ejecución Los errores de ejecución creo que son los más difíciles de justificar y también los más complejos de leer en Java. El intérprete de java3 ejecuta un programa y al momento de encontrar un error (que no fue detectado por el compilador) lo envía a pantalla en forma de Excepción (Exception). Las excepciones son algo súmamente delicado, ya que pueden darnos dolores de cabeza como nos pueden salvar la vida en otros casos, ya que se pueden manipular, a diferencia de otros lenguajes de programación. Esto lo veremos más adelante en el curso. Veamos un programa ejemplo que tenga errores de ejecución:

class EjemploDeError { static void main (String[] args) { Console c = new Console(); c.println (“Ingresa una letra?”); int x = c.readInt(); String s = "Un texto"; c.println(s.charAt(-1)); } }

En este caso hay 1 error obvio que está en el charAt(-1), ya que no se puede sacar un valor menor a 0 de un string, pero veamos el otro que puede ocurrir también. Si ejecutamos este programa nos sale en pantalla:

Ingresa una letra?_ Si nosotros hacemos caso e ingresamos “a” ocurre:

Unable to convert to int Esto nos dice que está mal lo que intentamos ingresar y el programa se pega y debemos presionar Control-C en la ventana de MS-DOS que invocamos “java EjemploDeError”. Probemos ahora ingresando un número (correctamente) para que caiga en la otra línea:

C:\WINDOWS\Desktop\temp>java EjemploDeError Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.charAt(Unknown Source) at EjemploDeError.main(EjemploDeError.java:7)

y nuevamente debemos presionar Control-C para terminar la ejecución del programa. Ahora tenemos algo distinto al error de conversión, pero igualmente una excepción que debemos interpretar.

3 El Intérprete de Java (Linker) es quien se encarga de ejecutar el .class en la JVM.

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

18

Si notamos bien en la línea (ya que por tema de espacio, las 3 primera líneas son en realidad 1 sola) esta nos indica qué ocurrió: java.lang.StringIndexOutOfBoundsException Tipo de excepción que ocurrió. String index out of range Pequeña descripción de la excepción. -1 Valor que causó la excepción. Con estos valores podemos percatarnos que el error ocurrió porque traté de acceder con el –1 fuera del rango de un String. Sigamos más abajo. Lo que sigue es llamado Stack de Ejecución y nos indica cuántos métodos hemos llamado desde que se ejecutó el primer main. Su lectura es de abajo hacia arriba, comenzando por el main en la última línea y acabando por el método más interno en la primera. También, cada línea nos indica en qué archivo y línea ocurrió el error. En este caso, el stack es:

at java.lang.String.charAt(Unknown Source) at EjemploDeError.main(EjemploDeError.java:7)

Si lo analizamos detenidamente (de arriba hacia abajo) dice:

a) Se cayó en el método charAt de la clase java.lang.String. b) No tenemos el código fuente de esa clase. c) El que llamó a charAt es el main de la clase EjemploDeError. d) El archivo que posee esta clase es EjemploDeError.java . e) La línea que está haciendo esta invocación es la línea 7.

Por lo que si vamos a la línea 7 del archivo encontraremos:

c.println(s.charAt(-1));

que es exactamente el problema que queríamos encontrar. Más adelante en el curso utilizaremos las excepciones como un apoyo a la programación en Java al momento de incurrir en errores de ejecución.

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

19

Principios Avanzados

Uso de PUBLIC/PROTECTED/PRIVATE: Estas sentencias (que pueden estar en las firmas de los métodos o en las definiciones de las clases) nos indican el nivel de "PRIVACIDAD" que tiene la clase. METODOS: La privacidad (a nivel de métodos) indica desde DONDE puedo llamar un método. Es decir: ß PUBLIC: Lo puedo llamar desde cualquier parte (clases dentro del mismo directorio o de

otro directorio). ß PROTECTED: Solo las clases "hijas" pueden llamarlo (concepto de herencia más avanzado

que veremos luego). ß PRIVATE: Solo la misma clase que lo define puede llamarlo. ß Sin nada: Para las clases del mismo directorio es pública, es decir la pueden llamar. Desde

otro directorio no existe. Estas palabras no son OBLIGATORIAS, ya que por definición si no ponemos nada, es accesible. CLASES: A nivel de clases, la privacidad se refleja casi de la misma forma que los métodos. Es decir: ß PUBLIC: Se puede utilizar esta clase desde cualquier lugar. OBLIGA a guardar la clase en

un archivo con el MISMO NOMBRE (ojo con las mayúsculas y minúsculas):

public class Ejemplo { ... }

se debe guardar en Ejemplo.java y no en ejemplo.java.

ß Sin nada: Se puede utilizar en el mismo directorio. Aquí el nombre del archivo JAVA no

importa, es decir:

class Ejemplo { ... }

se puede guardar en Ejemplo.java, ejemplo.java o miprograma.java

Java: del Grano a su Mesa (Versión 1.4) Capítulo I: Principios Básicos de Java

20

Uso de STATIC: El uso de STATIC en los métodos solo nos explica cuando utilizamos un "OBJETO" o cuando utilizamos una "CLASE" para invocar el método. OBJETO: Un objeto es una variable de un tipo Clase que es creada con un new:

Console c = new Console();

en este caso "c" es un objeto de tipo "Console". Todos los métodos de la clase Console están declarados sin la palabra STATIC, por ejemplo, la firma de "println" sería:

public void println(String s) { ... }

y es por esta razón que necesitamos al objeto "c" para invocarlo como:

c.println("Esto usa un objeto");

CLASE: Las llamadas a métodos que se realizan a través del nombre de la clase REQUIEREN la palabra "static" en su definición. Por ejemplo, en la clase Math tenemos el método:

public static double random() { ... }

y como posee el "static", su invocación sería del tipo:

double x = Math.random();

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo II: Conceptos Básicos

21

Capítulo II: Conceptos Básicos

Motivación

Escribir un programa que instruya al computador para que establezca el siguiente diálogo con una persona (usuario):

Por favor ingresa un N°: 123Gano yo con el 124

Conceptos

Algoritmo Se define como “Algoritmo” a la serie de pasos o “Etapas” (que debe realizar el computador) para resolver un problema

En el problema planteado arriba, un “algoritmo” para resolverlo se describe a continuación:

1. Escribir (mostrar) en la pantalla la frase “Por favor ingresa un N°:” 2. Leer (obtener, recuperar) el n° ingresado por la persona usando el teclado. 3. Escribir en la pantalla:

• “Gano yo con el “ • el número (ingresado por la persona en el paso 2) sumándole uno.

4. Terminar el programa

Computador

Usuario

COMPUTACION • Algoritmos y Estructuras de Datos • Lenguajes de Programación • Ingeniería de Software • Comunicación Humano-Computador • Computación Numérica y Simbólica • Bases de Datos • Inteligencia Artificial • Arquitectura de Computadores • Sistemas Operativos

Problemas Soluciones

Razonamientos: • algorítmico • lógico • capacidad para resolver

problemas

Java: del Grano a su Mesa (Versión 1.4) Capítulo II: Conceptos Básicos

22

Programa Traducción de un “Algoritmo” en un lenguaje de programación que el computador pueda interpretar para resolver el problema.

Para efectos de estudio en este curso, el lenguaje de programación utilizado para interpretar nuestros algoritmos es Java. Traduzcamos el algoritmo que definimos para el problema inicial y veamos como queda en lenguaje Java:

C.print(“Por favor ingresa un N°:”); int n; n = C.readInt(); C.print(“Gano yo con el “); C.print(n+1);

Para comprender mejor el lenguaje, iremos línea a línea analizando qué significa y cómo se utilizó para traducir el algoritmo anterior. C.print(“Por favor ingresa un N°:”);

• Escribe en la pantalla la frase encerrada entre comillas (“”). • C es un objeto que representa la consola (pantalla y teclado) del computador. • print es un método (función) que se aplica al objeto C y que escribe su argumento

en la pantalla. int n;

• Declara n como una variable entera. • Variable

• Representación simbólica de un valor (número). • Representa una ubicación (celda) en la memoria del computador. • Posee un nombre que la identifica (letra seguida de latras, dígitos o _). • Capacidad: un valor del tipo indicado. • int indica que el tipo de número que puede almacenar la variable es un entero

(números sin punto decimal). n = C.readInt();

• Lee un número entero desde el teclado y lo asigna (guarda) a (en) la variable n. • readInt() es un método (función sin argumentos) que:

• Espera que el usuario ingrese un número (tecleando dígitos y ENTER). • Lee (obtiene, reconoce) el número. • Entrega (retorna) el número como resultado.

• Para abreviar las dos líneas anteriores se puede utilizar int n = C.readInt();C.print(“Gano yo con el “);

• Escribe en la pantalla la frase “Gano yo con el”. C.print(n+1);

• Escribe en la pantalla el valor de la variable n más uno. • n+1 Expresión aritmética (n: variable, 1: constante, +: operador).

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo II: Conceptos Básicos

23

• Operadores Aritméticos válidos: • Adición: (+) • Substracción: (-) • Producto: (*) • Cuociente: (/)

• Para abreviar las dos líneas anteriores se puede utilizar C.print(“Gano yo con el “ + (n+1)); • (+) : Este operador se convierte en un concatenador (añade) de caracteres.

• Mejora: C.println(“Gano yo con el “ + (n+1)); escribe y después posiciona el cursor al comienzo de la siguiente línea en la pantalla

Con estos conceptos, se pueden realizar muchos más programas que este sencillo ejemplo. La mayor cantidad de los problemas planteados a la computación se basan en esta básica interacción entre usuario-computador, para hacerla sencilla y que el computador pueda obtener la información necesaria para resolver el problema.

Solución al Problema Una solución completa al problema planteado, la cual sería fácilmente probada en el laboratorio, se presenta a continuación.

// Jalisco: programa que nunca pierde import java.awt.*; class Jalisco {

static public void main(String[] args) { Console C = new Console(); C.print(“Por favor ingresa un N°:”); int n = C.readInt(); C.println(“Gano yo con el “+ (n+1));

} }

De la misma forma que en la anterior explicación se presentó, se detalla línea a línea la ejecución del programa con la traducción que el computador realiza. // Jalisco: programa que nunca pierde

• Comentario hasta el final de la línea. • El computador no traduce esta línea, puesto que es solo una línea informativa y no

influye en la ejecución del programa.

import java.awt.*; • Inserta declaraciones necesarias para que programa lea/escriba

class Jalisco {…} • Define la clase de nombre Jalisco. • Todo programa Java debe estar contenido en una clase.

static public void main(String[] args) {…} • Método que contiene instrucciones del programa principal (main). • Encabezamiento estándar (significados se explicarán posteriormente).

Console C = new Console();

Java: del Grano a su Mesa (Versión 1.4) Capítulo II: Conceptos Básicos

24

• Abre una ventana para leer y escribir. • C: objeto de clase Console. • Console: clase de interacción predefinida con métodos para leer y ecribir.

Problemas Escribir un programa que establezca el siguiente diálogo.

Calcular perímetro y area de circulo Diametro ? 3 Perimetro = ... Area = ...

Solución 1. Esta solución considera que el diámetro es un número entero y que PI es un número real:

// Se declara la constante pi final double pi = 3.1416; // Se crea una Consola para entrada y salida de datos Console C = new Console(); // Se obtiene el valor del diámetro del círculo C.println(“Calcular perímetro y area de circulo”); C.print(“Diametro ? ”); int d = C.readInt(); // Se calcula y despliega los resultados de la operación C.println(“Perímetro = ” + (pi * d)); C.println(“Area = ” + ( pi * Math.pow(d/2, 2));

Solución 2 Esta solución considera que el diámetro es un número real y que PI es un número real:

// Se declara la constante pi final double pi = 3.1416; // Se crea una Consola para entrada y salida de datos Console C = new Console(); // Se obtiene el valor del diámetro del círculo C.println(“Calcular perímetro y area de circulo”); C.print(“Diametro ? ”); double d = C.readDouble(); // Se calcula y despliega los resultados de la operación C.println(“Perímetro = ” + (pi * d)); C.println(“Area = ” + ( pi * Math.pow(d/2, 2));

Los resultados que se obtienen para el perímetro son iguales, sin embargo para el área son complétamente distintos:

Caso d entero: Perímetro = 9.4248

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo II: Conceptos Básicos

25

Area = 3.1416 Caso d real:

Perímetro = 9.4248 Area = 7.0686

Este fenómeno ocurre normalmente en Java, puesto que al operar un cuociente (caso que puede dar un resultado con decimales) con ambos valores enteros, el resultado SIEMPRE será entero. Por ejemplo: 3 / 2 = 1 entero 3 / 2.0 = 1.5 real

Problemas Propuestos 1. Programa para el siguiente diálogo

Calcular perímetro y area de rectángulo Largo ? 2 Ancho ? 3 Perímetro = ... Area = ...

2. Diseñar el diálogo y escribir un programa que calcule la velocidad de un móvil en km/hora,

dadas la distancia (en metros) y el tiempo (en segundos). 3. Inventar un problema, diseñar el diálogo y escribir.

Java: del Grano a su Mesa (Versión 1.4) Capítulo III: Entrada y Salida

26

Capítulo III: Entrada y Salida

Motivación La I/O (Entrada/Salida) estándar es, por definición, cómo se comunica nativamente Java con el usuario. Es así como clases hechas como Console evitan que uno conozca realmente donde está el ingreso de datos y el despliegue de ellos en la pantalla o interfaz (gráfica de texto) que Java provee. De hecho, Console es un Applet que utiliza un Canvas en donde se escriben las líneas de texto para la salida estándar y que permite el ingreso de datos a través del teclado, para luego pasárselo a los programas que la utilizan.

Sintaxis

Clase Console4 Esta clase es simplemente un encapsulamiento de la Entrada y Salida estándar de Java. En este documento se utiliza la mayor parte de los capítulos por simplicidad, no obstante la utilización de System para entrada y salida estándar también se detalla en caso de desear utilizarla. Le definición de Console permite realizar las siguientes funcionalidades:

Método Descripción public Console(); public Console(String); public Console(int,int, String);

Constructores de la clase Console por defecto, con título, y con tamaño y título respectivamente.

public int maxcol(); public int maxrow();

Obtener el tamaño de columnas y filas que puede contener la consola abierta.

public void clear(); Limpiar la consola. public void showCursor(); public void hideCursor();

Mostrar y ocultar el cursor.

public void print(String); public void println(String);

Imprimir en la consola.

public boolean readBoolean(); public byte readByte(); public short readShort(); public int readInt(); public long readLong(); public double readDouble(); public float readFloat();

Leer un valor desde el teclado utilizando la consola.

4 Ver http://www.holtsoft.com/java/hsa_package.html#Console para mayor información.

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo III: Entrada y Salida

27

public char readChar(); public String readString(); public String readLine(); public void setFont(Font); public void setTextBackgroundColor(Color); public void setTextColor(Color);

Dar tipografía (Font) y color al texto de la consola5.

Y también existen formas de utilizarla como un lienzo gráfico para dibujar6:

Método Descripción public int maxx(); public int maxy();

Obtener tamaño del lienzo.

public void setColor(java.awt.Color); Dar color al pincel. public void clearRect(int, int, int, int); Limpiar un trozo del lienzo. public void copyArea(int, int, int, int, int, int); Copiar un trozo del lienzo. public void draw3DRect(int, int, int, int, boolean); public void drawArc(int, int, int, int, int, int); public void drawLine(int, int, int, int); public void drawMapleLeaf(int, int, int, int); public void drawOval(int, int, int, int); public void drawPolygon(int[], int[], int); public void drawRect(int, int, int, int); public void drawRoundRect(int, int, int, int, int, int); public void drawStar(int, int, int, int); public void drawString(String, int, int); public void fill3DRect(int, int, int, int, boolean); public void fillArc(int, int, int, int, int, int); public void fillMapleLeaf(int, int, int, int); public void fillOval(int, int, int, int); public void fillPolygon(int[], int[], int); public void fillRect(int, int, int, int); public void fillRoundRect(int, int, int, int, int, int); public void fillStar(int, int, int, int);

Dibujar todo tipo de figuras.

Clase System En algún lado ya se ha utilizado la clase System, la cual se basa en una serie de funcionalidades estáticas (definidas como static) que permiten interactuar nativamente entre el sistema y el usuario (o los periféricos que tenga). Por ejemplo: System.out es un objeto que posee una referencia a la pantalla de salida estándar de Java.

5 Para ver cómo funcionan los colores, referirse a Canvas en página 53. 6 Para ver cómo funcionan algunos de los métodos gráficos, ver sección Canvas en página 53.

Java: del Grano a su Mesa (Versión 1.4) Capítulo III: Entrada y Salida

28

Ahondando en este ejemplo, System.out posee las funcionalidades de imprimir en pantalla que han trascendido a objetos como la Console o PrintWriter:

System.out.println(...): Imprime en pantalla lo que está entre paréntesis (literal o expresión) y salta una línea después de hacerlo.

System.out.print(...): Imprime en pantalla lo que está entre paréntesis (literal o expresión) pero sin saltar la línea al final.

Por ejemplo, lo que con Console imitaba el siguiente diálogo:

Hola mucho gusto. era:

Console c = new Console(); c.println(“Hola mucho gusto”);

con System.out es mucho más sencillo: al ser una variable estática de la clase System, no necesita de una referencia a dicha clase:

System.out.println(“Hola mucho gusto”); Bastante sencillo. Veamos ahora como se leen datos con System. El caso de entrada de datos es más complejo y es lo que lleva a los programadores a crear objetos como Console. Es decir, no es tan sencillo como poner:

System.in.readInt(); // ESTO ESTA MALO Aunque les gustaría mucho. J System.in es una referencia estándar a la entrada desde el teclado. Sin embargo su uso es un poco distinto, pero similar a lo que pasa con los archivos de lectura, ya que también son entradas, esto es:

BufferedReader in = new BufferedReader( new InputStreamReader(System.in));

Esta línea reemplazaría a la declaración de la consola en el caso de utilizar Console. Es decir, lo que antes imitaba a:

Cómo te llamas? Juan Hola Juan, mucho gusto

y que con Console quedaba más o menos así:

Console c = new Console(); c.print(“Como te llamas?”);

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo III: Entrada y Salida

29

String nombre = c.readLine(); c.println(“Hola “ + nombre + “, mucho gusto”);

Ahora cambiaría un poquito como:

BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); System.out.print(“Como te llamas?”); String nombre = in.readLine(); System.out.println(“Hola “ + nombre + “, mucho gusto”);

Hey, no es tan distinto. Pero el cambio viene al trabajar con números, ya que BufferedReader solo puede leer líneas de texto, por lo que métodos readInt y readDouble quedan completamente fuera de lugar. Solo se puede utilizar readLine() y leer solo Strings (hay que hacer un cast o conversión explícita7).

Problema Propuesto Tenemos el siguiente programa desarrollado con Console:

Console c = new Console(); while (true) { c.print(“Pregunta: “); String p = c.readLine(); c.print(“Respuesta: “); switch (p.charAt(0).toUpperCase()) { case “A”: c.println(“Si, toda la razón”); case “E”: c.println(“No es cierto”); case “I”: c.println(“Es muy probable”); case “O”: c.println(“Nunca”); case “U”: c.println(“Siempre”); default: c.println(“Quizás”); } }

Trate de convertir este código para que utilice System.out y System.in como entrada y salida de datos

7 Conversiones String > int y String > double.

Java: del Grano a su Mesa (Versión 1.4) Capítulo IV: Asignaciones, Expresiones y Tipos de Datos

30

Capítulo IV: Asignaciones, Expresiones y Tipos de Datos

Motivación Nos gustaría mucho realizar el cálculo de porcentajes de elección de 2 candidatos instruyendo al computados para que establezca el siguiente diálogo con el usuario:

Calcular porcentajes Votos candidato 1? _ Votos candidato 2? _ Total de votos = Nº Candidato 1 = xxx % Candidato 2 = xxx %

Concepto A continuación haremos las definiciones básicas necesarias para comenzar con los conceptos de programación y que nos serán útiles a través del curso:

Expresión Es una combinación de operadores, variables y constantes del lenguaje que, al ser evaluada, permite la obtención de un valor reutilizable en otro lugar del programa.

Para ver claramente esto, la siguiente línea es una expresión:

((6 * a) – (5 + b) / c) * x2 La evaluación de las expresiones sigue las mismas reglas del álgebra. Estas son:

1. Expresiones Parentizadas 2. Operadores Unarios 3. Operadores Multiplicativos (*, /) 4. Operadores Aditivos (+, -)

Y en el caso de existir operadores de igual prioridad, se evalúan de izquierda a derecha.

Asignación La asignación es una instrucción en la cual el computador da un valor para ser almacenado dentro de una variable o espacio de memoria física.

La sintaxis de una asignación es:

<variable> = <expresión>; En donde:

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo IV: Asignaciones, Expresiones y Tipos de Datos

31

<expresión> se escribe en una línea (hacia el lado) y no en varios niveles. La comprenden variables, constantes, operadores binarios (+, -, *, /), operadores unarios (+, -), métodos y expresiones entre paréntesis. Antes de ser asignada a una variable, esta expresión es EVALUADA y el valor obtenido reside en el espacio reservado de memoria para dicha variable. Por ejemplo, podemos realizar las siguientes asignaciones

a = v1 + v2; a = (5 – a) * 3 / v1; a = 2;

Tipos de Datos Son definiciones de espacios de memoria en los cuales se almacenan valores específicos.

Esta definición es bastante técnica, por lo que simplificaremos un poquito a la siguiente definición de tipo de dato:

Es una clase de números (o datos) con los cuales se pueden definir las variables que los almacenarán.

En Java existen los tipos de datos numéricos:

Tipo Nº Bits Mayor Valor Menor Valor Precisión (dígitos) Byte 8 127 -128 3 Short 16 32.767 -32.768 5 Int 32 2.147.483.647 -2.147.483.648 10 Long 64 263 – 1 -263 19 Float 32 3,4 x 1038 -3,4 x 1038 7 Double 64 1,7 x 10301 -1,7 x 10301 15 Para definir o declarar una variable con cierto tipo, se debe utilizar la siguiente sintaxis:

<tipo de dato> <nombre de la variable> ; en donde <nombre de la variable> es un nombre cualesquiera que le permita identificar a ese espacio de memoria separado para el tipo de dato indicado. Por ejemplo:

int i; i = 5;

Java: del Grano a su Mesa (Versión 1.4) Capítulo IV: Asignaciones, Expresiones y Tipos de Datos

32

Conversión de Datos Para convertir tipos de datos se usa un CAST explícito o implícito que transforma, convierte y/o trunca desde un tipo de dato a otro.

Los cast implícitos se pueden hacer desde tipos de más pequeño tamaño (ver tabla) hacia tipos más grandes. Por ejemplo:

int a = 6; double b = a; // Cast implícito

Los cast explícitos se deben hacer desde tipos de más grande tamaño (ver tabla) hacia tipos más pqueños. Por ejemplo:

double a = 10.0; double b = (double) a; // Cast explícito

Solución Console c = new Console(); c.println(“Calcular porcentajes”); c.print(“Votos candidato 1”); int v1 = c.readInt(); c.print(“Votos candidato 2”); int v2 = c.readInt(); int total; total = v1 + v2; c.println(“Total de votos = “ + total); c.println(“Candidato 1 = “ + 100.0*v1/total); c.println(“Candidato 2 = “ + 100.0*v2/total)

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo V: Métodos y Funciones

33

Capítulo V: Métodos y Funciones

Motivación Existen muchas funciones matemáticas y no matemáticas en Java que se encuentran pre- definidas. Estas funciones están escritas para que los programadores las utilicen en sus códigos sin volver a escribir los subprogramas que realizan esas funcionalidades.

Concepto

Funciones/Métodos Trozos de código que pueden ser reutilizados a través de una llamada a su definición con ciertos parámetros. También reciben el nombre de Métodos.

En Java por ejemplo existe una gran librería matemática que incluye métodos para la raíz cuadrada, potencias, exponenciales, logaritmos, senos, cosenos, tangentes, máximos, mínimos, redondeo de valores y números aleatorios.

Invocación o Llamada de un Método La llamada es la forma en que el lenguaje invoca o permite la ejecución del trozo de código escrito dentro de un método. En general, requiere de un nombre (del método) y sus parámetros (si es que tiene).

Para que veamos como se invocan los métodos, veamos aquellos que se encuentran en la librería matemática:

Función Significado Tipo Argumento

Tipo Resultado

Ejemplo Resultado

sqrt(x) √ x, x ≥ 0 double double sqrt(4.0) 2.0 abs(x) |x| i, l, f, d del arg abs(-3) 3 pow(x,y) xy d d pow(2.0,3) 8.0 exp(x) ex d d exp(1) Math.E8 log(x) logex d d log(Math.E) 1.0 sin(x) seno de < x

(x en radianes) d d sin(Math.PI/2) 1.0

cos(x) coseno de < x d d cos(Math.PI) -1.0 tan(x) tangente de < x d d tan(Math.pi/4) 1.0 asin(x) arco-seno de x d d asin(1.0) Math.PI9/2 acos(x) arco-coseno de x d d acos(-1.0) Math.PI 8 Math.E está definida en la librería matemática. 9 Math.PI está definida en la librería matemática.

Java: del Grano a su Mesa (Versión 1.4) Capítulo V: Métodos y Funciones

34

Función Significado Tipo Argumento

Tipo Resultado

Ejemplo Resultado

atan(x) arco-tangente de x d d atan(1.0) Math.PI/4 round(x) redondear x d, f l, i round(4.5) 5L floor(x) n / n ≤ x < n+1 d d floor(4.9) 4.0 ceil(x) n / n-1 < x ≤n d d ceil(4.1) 5.0 max(x,y) mayor entre x e y i,l,f,d de arg max(4.1, 6.5) 6.5 min(x,y) menor entre x e y i,l,f,d de arg min(4.1, 6.5) 4.1 random( ) Nº al azar en [0,1[ d random( ) 0.x... Veamos unos ejemplos de utilización de funciones de la librería matemática:

// Cálculo de Area y Perímetro c.print(“Ingrese el radio de la circunferencia?”); double r = c.readDouble(); c.print(“El perímetro de la circunferencia es: ”); c.println(2 * Math.PI * r); c.print(“El area de la circunferencia es: “); c.println(Math.PI * Math.pow(r, 2));

En este ejemplo podemos ver como utilizamos un método de la clase matemática dentro de una expresión.

// Cálculo de un radio a partir del área c.print(“Ingrese ahora un Area de circunferencia?”); double a = c.readDouble(); c.print(“El radio de la circunferencia es: “); c.println(Math.sqrt(a / Math.PI));

En este ejemplo podemos ver como se puede utilizar una expresión como argumento de un método de la clase matemática.

// Cálculo de la tangente a partir de otras funciones c.print(“Ingrese un ángulo en radianes? “); double ang = c.readDouble(); c.print(“La tangente original es: “); c.println(Math.tan(ang)); c.print(“La tangente calculada es: “); c.println(Math.sin(ang)/Math.cos(ang));

En este ejemplo podemos ver que se pueden componer en una misma expresión distinto métodos matemáticos sin necesidad de utilizar variables adicionales.

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo V: Métodos y Funciones

35

Motivación Quisiéramos escribir trozos de código que permitan realizar las operaciones básicas de la aritmética (sumar, resta, división y multiplicación), para utilizarlos a distintos niveles. Es por eso que nos gustaría crear una estructura de programación que nos permita almacenar subprogramas pre-hechos para ser utilizados dentro de nuestros propios programas.

Concepto

Declaración de un Método La declaración de un método es la escritura del subprograma que resuelve la funcionalidad del mismo.

La forma general de declaración de un método es la siguiente:

static <tipo> <nombre> (<arg1>, <arg2>, ...) { <instrucciones> return <valor de retorno>; }

En donde: <tipo> Tipo de dato del valor que se retorna al final de la ejecución del método. <nombre> Nombre con el cuál es identificado el método. <argn> Argumento n-ésimo del método. Puede tener entre 0 y cualquier número

de argumentos. <instrucciones> Trozo de código que se procesa durante la ejecución del método. <valor de retorno> Valor que retorna el método a su línea llamadora y que es resultado del

procesamiento realizado en el trozo de código o cuerpo del método. La combinación entre tipo, nombre y argumentos se le llama Firma del Método. Por ejemplo, definamos un método que retorne el valor de una raíz quinta:

static double raizQuinta (double x) { return Math.pow(x, 1/5); }

y su llamada será (en negritas):

double rq = raizQuinta(26);

Solución Con esto definido, podemos escribir el código de los métodos de la segunda motivación:

Java: del Grano a su Mesa (Versión 1.4) Capítulo V: Métodos y Funciones

36

static double suma (double a, double b) { return a + b; } static double resta (double a, double b) { return suma(a, -b); } static double multiplica (double a, double b) { return a * b; } static double division (double a, double b) { return multiplica (a, 1/b); }

Y para utilizar esta divertida versión es:

double val1 = 5; double val2 = 10; c.println (val1 + “ + “ + val2 + “ = “ + suma (val1, val2)); c.println (val1 + “ - “ + val2 + “ = “ + resta (val1, val2)); c.println (val1 + “ * “ + val2 + “ = “ + multiplica (val1, val2)); c.println (val1 + “ / “ + val2 + “ = “ + division (val1, val2));

Problema Escribir una función que calcule el máximo de 3 números y otra el mínimos de 3 números reales.

static double max3 (double val1, double val2, double val3) { return Math.max(val1, Math.max(val2, val3)); } static double min3 (double val1, double val2, double val3) { return Math.min(val1, Math.min(val2, val3)); }

Desafíate: Saca ahora el de en medio

Propuesto Escribir una función que calcule el número aleatorio entre una cota inferior x y otra cota superior y. Es decir, que tenga la siguiente firma:

static int aleatorio (int x, int y) el resultado ∈ [x, y]

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo VI: Condicionales

37

Capítulo VI: Condicionales

Motivación Escribir subprogramas que realicen los operaciones de adición y cuociente de número reales, considerando que no se puede dividir por 0.

Algoritmo Veamos primero el algoritmo para la adición a modo de práctica: 1. Recibir los valores de los sumandos dentro del subprograma (llamada del método). 2. Guardar temporalmente el valor de la suma de los valores obtenidos en la llamada. 3. Retornar el resultado guardado en el paso 2. Para este algoritmo no hay problema de escribir la solución:

static double suma (double a, double b) { double r = a + b; return r; }

Una versión alternativa y avanzada sería:

static double suma (double a, double b) { return a + b; }

Ok. Veamos el algoritmo para la división: 1. Recibir los valores de los operandos del cuociente. 2. Verificar si el dividendo es igual a 0

a. Retornar 0 (indicando que era 0 para que no haya error) 3. Guardar temporalmente el valor de la división de los valores obtenidos en la llamada. 4. Retornar el resultado guardado en el paso 3. Como podemos ver, necesitamos algo que nos permita ejecutar (a) solo si el dividendo es 0.

Concepto

Condicionales Un condicional es una instrucción que permite ejecutar un trozo de código si y solo si cumple con una condición o valor de verdad.

Java: del Grano a su Mesa (Versión 1.4) Capítulo VI: Condicionales

38

El concepto de condicional es bastante básico. Las condiciones son expresiones que retornan valores de verdad (verdadero o falso) y que condicionan la ejecución de instrucciones indicadas en el condicional. Algo como:

Si la condición es cierta Ejecuta las instrucciones cuando es cierta Si no es cierta Ejecuta estas otras instrucciones.

Sintaxis Los condicionales utilizan un comando especial llamado if ... else. Su forma general es como sigue:

if (<condición>) { <instrucciones si es verdadero> } else { <instrucciones si es falso> }

La primera parte del condicional corresponde a la condición, la segunda parte (o else) corresponde a decir “si la condición NO se cumple” o el famoso “si no” o “de lo contrario”. Esta segunda parte es opcional. Antes de continuar, debemos insertar dos nuevos concepto:

Valor de Verdad Todos saben cuál es la definición e este concepto. Así que abordaremos un nuevo tipo de dato que soporta almacenar esto: bolean. El bolean es un tipo de dato especial que solo puede almacenar VERDADERO o FALSO. Por ejemplo:

boolean var1 = true; boolean var2 = false;

Es sumamente sencillo. La gracia es que se puede usar como condición sola en un if. Por ejemplo:

if (var1) ... else ...

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo VI: Condicionales

39

Operadores Lógicos Un operador lógico es un comparador que permite operar valores, variable o expresiones y retornar un valor de verdad (verdadero o falso).

Existe muchos operadores lógicos que describiremos a continuación: Comparador de Valores Numéricos: Permite comparar valores numéricos indicando si es mayor, menor, mayor o igual, menor o igual, distinto o simplemente igual.

A > 5 OPERADOR MAYOR QUE A < 3 OPERADOR MENOR QUE A >= 1 OPERADOR MAYOR O IGUAL QUE A <= 0 OPERADOR MENOR O IGUAL QUE A == 4 OPERADOR IGUAL QUE A != 4 OPERADOR DISTINTO QUE

Operador de Negación: Este operador permite NEGAR un valor de verdad, es decir cambiar el valor de VERDADERO a FALSO o de FALSO a VERDADERO.

! (A == 5) SE TRADUCE POR A != 5 Conjunciones: Son operadores especiales que permiten unir distintos valores de verdad. Hablando un poco en español sería como el Y y el O (bueno, son eso).

A > 5 && A < 10 A mayor que 5 y menor que 10 A < 9 || A > 10 A menor que 9 o mayor que 10

Un ejemplo que utiliza todo lo anterior sería condicionar si es par o impar un número:

c.print(“Número?”); int n = readInt(); if ( n % 2 == 0 ) { c.println(n + “Es par”); } else { c.println(n + “Es impar”); }

Esto es muy fácil de visualizar. Veamos un ejemplo más complejo considerando 3 casos distintos:

c.print(“Número?”); int n = readInt(); if ( n > 0 ) { c.println(n + “ es mayor que 0”); } else if ( n < 0 ) { c.println(n + “ es menor que 0”); } else { c.println(n + “ es igual que 0”); }

Java: del Grano a su Mesa (Versión 1.4) Capítulo VI: Condicionales

40

En este ejemplo podemos ver 3 casos y como se pueden mezclar los distintos if ... else. Por último un ejemplo sencillo de que hacer solo si se cumple la condición:

c.print(“Número?”); int n = readInt(); if ( n == 123 ) { c.println( “BINGO”); }

En este último ejemplo podemos ver que el ELSE era completamente opcional.

Solución La solución con este concepto se pone muuuuy sencilla y queda como:

static double division (double a, double b) { if (b == 0) { return 0; } double r = a / b; return r; }

También, podemos utilizar una solución alternativa como:

static double division (double a, double b) { double r; if (b == 0) { r = 0; } else { r = a / b; } return r; }

O una muy similar, pero algo mas inteligente:

static double division (double a, double b) { double r = 0; if (b != 0) { r = a / b; } return r; }

Caso Especial Hay un problema muy claro, cuando se utilizan muchos IF para distinguir distintos trozos con comparadores de igualdad. Por ejemplo:

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo VI: Condicionales

41

c.print(“Opcion?”); int op = c.readInt(); if (op == 1) <instrucciones 1> else if (op == 2) <instrucciones 2> else if (op == 3) <instrucciones 3> else if (op == 4) <instrucciones 4> else if (op == 5) <instrucciones 5> else if (op == 6) <instrucciones 6> else <instrucciones 7>

Al observar con detención esto, se puede tornar engorroso, pues si indentáramos quedaría realmente asqueroso. Existe una instrucción que nos puede salvar: switch.

c.print(“Opcion?”); int op = c.readInt(); switch op { case 1: <instrucciones 1> break; case 2: <instrucciones 2> break; case 3: <instrucciones 3> break; case 4: <instrucciones 4> break; case 5: <instrucciones 5> break; case 6: <instrucciones 6> break; case: <instrucciones 7> break; }

en donde los case deben tener valores constantes (es decir, que no sean variables).

Problemas (a) Se desea escribir un método que calcula la raíz n-ésima de un número considerando que

solo se pueden calcular raíces para números > 0 (caso de raíces pares). La firma del método es:

public static double raizN (double base, int raiz)

Java: del Grano a su Mesa (Versión 1.4) Capítulo VI: Condicionales

42

public static double raizN (double base, int raiz) { if (raiz % 2 = 0 && base < 0) return 0; // Indica que no se puede calcular

return Math.pow(base, 1/raiz); }

(b) Escriba un programa que imite el siguiente diálogo:

Escriba el número que desea obtener raíz? _ Indique la raíz? _ La raíz <n-ésima> del número es = XXXX.XXX

Considere que el término “<n-ésima>” debe indicar: ß “cuadrada” si la raíz es 2 ß “cuarta” si la raíz es 4 ß “quinta” si la raíz es 5 ß “n-ésima” en cualquier otro caso, reemplazando “n” por el valor de la raíz

import java.io.*; public class Raices { // Aquí se inserta el método raizN public static double raizN (double base, int raiz) { if (raiz % 2 = 0 && base < 0) return 0; // Indica que no se puede calcular return Math.pow(base, 1/raiz); } // Programa principal (solución parte b) public static void main (String[] args) { Console c = new Console(“Raices”); // Se imprime en pantalla el diálogo c.print(“Ingrese el número que desea obtener raiz?”); double x = c.readDouble(); c.print(“Ingrese la raiz?”); int n = c.readInt(); // Se calcula la raiz double raiz = raizN(x, n); // Se escribe el resultado switch r { case 2: c.print(“La raíz cuadrada ”); case 4: c.print(“La raíz cuarta ”); case 5: c.print(“La raíz quinta ”); case:

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo VI: Condicionales

43

c.print(“La raíz “ + n + “-ésima ”); } c.println(“ del número es = “ + raiz); } }

Java: del Grano a su Mesa (Versión 1.4) Capítulo VII: Ciclos de Programa

44

Capítulo VII: Ciclos de Programa

Motivación Escriba un programa que permita calcular el valor de la hipotenusa de triángulos con los valores de los catetos dados por el usuario, según la fórmula de pitágoras.

a2 + b2 = c2 Para ello, trate de realizar el siguiente diálogo:

Cálculo de la Hipotenusa de un Triángulo Triángulo 1 a?_ b?_ Hipotenusa = ... Desea Continuar (1=Si/2=No)? _ Suponemos que pone 1 Triángulo 2 a?_ b?_ Hipotenusa = ... Desea Continuar (1=Si/2=No)? _ Suponemos que pone 2 Se han calculado 2 triángulos Gracias por usar el programa

Algoritmo: 1. Escribir texto de bienvenida en pantalla 2. Iniciar contador del nº de triángulos calculados en 1 3. Iniciar ciclo de programa 4. Escribir texto “Triángulo” con el valor del triángulo (1) 5. Pedir y almacenar cateto “a” 6. Pedir y almacenar cateto “b” 7. Calcular e escribir en pantalla el valor de la hipotenusa del triángulo (1) 8. Incrementar el contador 9. Escribir en pantalla la pregunta “Desea Continuar (1=Si/2=No)?” 10. Pedir y almacenar el resultado a la pregunta del punto 9 11. Si el usuario ingresa 1, volver al punto 4 para el triángulo (contador+1) 12. Escribir en pantalla la cantidad de triángulos calculados 13. Escribir en pantalla “Gracias por usar el programa” Este algoritmo se ve un poco más largo de lo común, pero lo más importante son los items 3 y 11 destacados, porque esto definen un ciclo.

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo VII: Ciclos de Programa

45

Conceptos

Ciclo Un Ciclo es un trozo de programa que se repite según una Condición que evaluada puede entregar verdadera o falsa.

En Java existe una instrucción para realizar este tipo de código, y se llama While.

Sintaxis while (<condición>) { <trozo de código que se repite> }

en donde: <condición> Valor de verdad que debe ser verdadero para que se ejecute el trozo de código escrito dentro del while. Por ejemplo, el siguiente código se repite mientras (while) a sea mayor o igual a 0:

Console C = new Console(); int a = 10; while (a >= 0) { C.println(“Se repite este texto en pantalla”); a--; // esto es lo mismo que escribir a=a-1; }

Otra forma de representar un ciclo es con un for (por o para) que es más completo que el anterior:

for (<inicio>; <condición>; < incremento>) { <trozo de código que se repite> }

en donde: <inicio> Es una instrucción que se ejecuta solo al comenzar el for. <condición de salida> Es la condición que debe ser TRUE para que el for no termine. <incremento> Es una instrucción que se ejecuta cada vez que el ciclo es realizado (en cada iteración). Por ejemplo, el siguiente código se repite por (for) 10 veces:

Console C = new Console(); for (int a=10; a>0; a--) { C.println(“Se repite este texto en pantalla”); }

Observa la equivalencia directa entre el for y el while de ejemplo, ya que ambos hacen exactamente lo mismo.

Java: del Grano a su Mesa (Versión 1.4) Capítulo VII: Ciclos de Programa

46

Solución import java.awt.*; public class Triangulos { public static void main (String[] args) { Console C = new Console(); C.println(“Cálculo de la Hipotenusa de un Triángulo”); int respuesta = 1; int contador = 1; while (respuesta == 1) { C.println(“Triángulo “ + contador); C.print(“a?”); double a = C.readDouble(); C.print(“b?”); double b = C.readDouble(); C.println(“Hipotenusa = “ +

Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2)) ); contador++; C.print(“Desea continuar (1=Si/2=No)?”); respuesta = C.readInt();

} C.println(“Se han calculado “ + (contador – 1) + Triángulos”); C.println(“Gracias por usar el programa”); } }

Problemas (a) Escribir un programa que pida al usuario 2 número enteros y que luego los multiplique

utilizando SOLO sumas.

Nota: Recuerda que X por Y es lo mismo que sumar Y veces el valor de X. Se recomienda que utilices un ciclo for para resolver este problema

import java.awt.*; public class Producto { public static void main (String[] args) { // Se crea la consola Console c = new Console(); // Se piden los valores de los operandos c.print(“Ingrese el operando X?”); int X = c.readInt(); c.print(“Ingrese el operando Y?”); int Y = c.readInt();

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo VII: Ciclos de Programa

47

// Se calcula el producto entre X e Y como sumas int producto = 0; for (int i=1; i<=Y; i++) { producto = producto + X; } // Se despliega el resultado c.println(“X por Y = “ + producto); } }

(b) Propuesto. Haz lo mismo que en el problema anterior (X por Y) pero ahora considerando las

potencias (Xy) y utilizando solo PRODUCTOS. Recuerda que esta operación es lo mismo que multiplicar Y veces el valor de X.

(c) Desafío. ¿Puedes hacer lo mismo a b pero solo con sumas? Trata de hacerlo con tus

palabras, y luego compáralo con la siguiente solución:

import java.awt.*; public class Potencias { public static int productoXY (int X, int Y) { int producto = 0; for (int i=1; i<=Y; i++) { producto = producto + X; } return producto; } public static int potenciaXY (int X, int Y) { int potencia = 0; for (int i=1; i<=Y; i++) { potencia = productoXY(X, X); } return potencia; } public static void main (String[] args) { Console c = new Console(); c.print(“Ingrese la base X?”); int X = c.readInt(); c.print(“Ingrese el exponente Y?”); int Y = c.readInt(); c.println(“X elevado a Y = “ + potenciaXY(X, Y)); } }

Java: del Grano a su Mesa (Versión 1.4) Capítulo VIII: Cadenas de Texto y Literales

48

Capítulo VIII: Cadenas de Texto y Literales

Motivación Hasta ahora conocemos los números y todo. Pero, ¿cómo utilizar las cadenas de caracteres? Queremos realizar el juego del “repondón” simulando el siguiente diálogo:

Hazme preguntas y YO respondo. P? Esto es un entero R: NO P? Eres un computador R: SI P? Yo soy un usuario R: NO P? Sabes computación R: SI

Concepto

Cadena de Texto Las Cadenas de Texto son un grupo de caracteres uno tras otro y que representan palabras, frases u oraciones (gramaticales) con y sin sentido.

Según esta definición:

“Ana” es una Cadena de Texto. • “Yo soy genial” es una Cadena de Texto. • “23499 ldslñññsdfñ” también es una Cadena de Texto.

Sintaxis En Java, las cadenas de texto tiene un nombre especial y se llaman String. Existen 2 tipos de Strings, los Literales y los tipos de dato String. Literales: Son aquellos Strings, representados por cadenas dentro de comillas dobles (“ “), y que representan fielmente su contenido. Por ejemplo:

c.print(“Este es un LITERAL”); Claramente el parámetro del método print es un literal. String: Es un tipo de dato especial que permite almacenar literales en variables. Por ejemplo:

String a = “Esta es una variable STRING”; c.print(a);

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Java: del Grano a su Mesa (Versión 1.4) Capítulo VIII: Cadenas de Texto y Literales

49

Al igual que en el anterior ejemplo, print recibe en este caso una variable String en vez de un literal. Mucha atención, que al inicializar una variable String, es necesario hacerlo con un LITERAL. Algunas funcionalidades útiles de los Strings son:

Concatenación de Strings Para concatenar o juntar dos o más Strings se utiliza el operador aritmético de adición (+). Por ejemplo:

String a = “”; // VACIO a = a + “ primero” a = a + “ segundo” a = a + “ otro” + a + “otro”;

Esto concatenaría al final en a la frase: “primero segundo otro primero segundo otro”.

Lectura de un String desde el Teclado Para comenzar, debemos saber como leer un String desde la entrada de datos. Para ello utilizaremos el método de la CONSOLA llamado readLine():

String a; a = c.readLine();

Este ejemplo guardaría lo ingresado por el usuario en la variable a, sin importar si son número o letras. Al igual que los readInt() y readDouble(), readLine() no posee parámetros y su forma general sería la siguiente:

<variable String> = c.readLine();

Largo de un String Es muy util conocer cuántos caracteres posee un String (variable o literal). Para ello existen un método dentro de la clase String que se utiliza, llamado length:

String a = “Hola mundo”; c.print (a + “ posee “ + a.length() + “ caracteres”);

Este ejemplo mostraría en la consola “Hola mundo posee 10 caracteres” Como podemos ver en el ejemplo, length se utiliza con la variable punto el método length (sin parámetros). Es decir:

<variable String>.length();

Java: del Grano a su Mesa (Versión 1.4) Capítulo VIII: Cadenas de Texto y Literales

50

Obtención de un Carácter Al igual que para el largo, existe la forma de sacar 1 sola letra del String. Esto se realizar con el método de la clase String charAt(i) en donde i es el i-ésimo menos 1 carácter de la cadena. Por ejemplo:

String alfabeto = “abcdefghijklmnopqrstuvwxyz”; c.println(“La letra 3 es “ + alfabeto.charAt(3));

Como podemos ver, este ejemplo muestra en la consola la frase: “La letra 3 es d”. Ooooops. ¿Qué está mal? No hay nada malo. Lo que pasa es que las posiciones comienzan desde 0, es decir, si quiero la 5 letra, esta sería alfabeto.charAt(4) y no alfabeto.charAt(5) como sería lo común. Su forma general queda como:

<variable String>.charAt(<posición i>);

Búsqueda de un Carácter o Texto Para buscar un trozo de texto o carácter dentro de otro se utiliza el método indexOf(“texto”) el cual retorna la posición i-ésima menos uno (es decir retorna el índice del carácter correcto dentro del String). Por ejemplo:

String s = “Texto contiene un ; dentro del cuerpo”; c.println(“En “ + s.indexOf(“;”) + “ hay un punto y coma”);

Este ejemplo retorna “En 18 hay un punto y coma”. Pero si contamos el número desde 1, es el 19avo carácter. Su forma general que busca la primera ocurrencia de un texto, es:

<variable String>.indexOf(<texto buscado>); Nota: Si el String buscado no está dentro del String s, la posición retornada es –1. Existen algunas variantes de esté método. Para buscar una ocurrencia de un texto a partir de una posición específica, se utiliza:

<variable String>.indexOf(<texto buscado>, <posición a buscar>); Con esto entonces podemos buscar desde una posición específica. Por ejemplo:

String s = “esta es una casa”; int n = s.indexOf(“es”); // es lo mismo decir: s.indexOf(“es”, 0)

Esto retorna la posición 0, pero si buscamos desde otra posición

int n = s.indexOf(“es”, 2);

Printed with FinePrint - purchase at www.fineprint.com PDF created with pdfFactory trial version www.pdffactory.com

Muy bien
Esas ventanas, se ven como del siglo pasado... :3
Esta solo es una vista previa
3 páginas mostradas de 168 páginas totales
Descarga el documento