Ejercicios de la materia de Programación I F.FCCA PARADIGMAS DE LA PROGRAMACIÓN BASES DE LA POO M. A. Bruno Ramos Ortiz 1 Ejercicios de la materia de Programación I F.FCCA CONCEPTOS BÁSICOS DE LA POO M. A. Bruno Ramos Ortiz 2 Ejercicios de la materia de Programación I F.FCCA CARACTERÍSTICAS DE LA POO HISTORIA DE JAVA El lenguaje Java así como la máquina virtual, comenzaron como un proyecto interno de Sun Microsystems en 1990. Los ingenieros de Sun no estaban satisfechos con el rendimiento del lenguaje C++, por lo que James Gosling, Mike Sheridan y Patrick Naughton, junto con otros más, comenzaron a desarrollar un nuevo lenguaje, que en principio pensaron dedicar a la programación de todo tipo de aparatos, tales como microondas, neveras, teléfonos móviles, etc.. Ellos pensaban que éstos generarían muchas e importantes aplicaciones para la tecnología del futuro. El lenguaje tendría que obviar problemas que presenta C++, en campos tales como la programación distribuída, las aplicaciones multihilo, el manejo de la memoria y ser más sencillo de manejar que C++. Finalmente se deseaba que los programas fueran portables a todo tipo de aparatos. Inicialmente el lenguaje se llamó Oak (en español 'roble'), en honor de un roble que había frente a la oficina. En 1992, se presentó como demostración una PDA con interface gráfica y un asistente inteligente representado mediante un muñeco llamado Duke. Oak fue presentado a concurso, como solución tecnológica, en varios proyectos para la industria del cine y la televisión, pero no fue elegido. En 1994 John Gage, James Gosling, Bill Joy, Patrick Naughton, Wayne Rosing, y Eric Schmidt se se reunieron para reorientar Oak. Decidieron orientarlo hacia la tecnología de la Web, pues se pensaba que tras la aparición del navegador Mosaic, ésta evolucionaría hacia la misma clase de interactividad, que la televisión por cable, para la cual habían estado preparando Oak. M. A. Bruno Ramos Ortiz 3 Ejercicios de la materia de Programación I F.FCCA Fue asimismo en 1994 cuando se cambió el nombre de Oak a Java. Poco después, aún en 1994, la plataforma Java 1.0, estaba disponible para descarga en la Web. En 1995 Netscape anunció que incluiría soporte para Java en sus navegadores, dando con esto un buen apoyo a Java. CARACTERÍSTICAS DE JAVA JDK JDK es el acrónimo de "Java Development Kit", es decir Kit de desarrollo de Java. Se puede definir como un conjunto de herramientas, utilidades, documentación y ejemplos para desarrollar aplicaciones Java. Para la realización de este tutorial se ha trabajado con la versión 1.2.0 del JDK. Componentes del JDK a.) Introducción JDK consta de una serie de aplicaciones y componentes, para realizar cada una de las tareas de las que es capaz de encargarse A continuación se explican más en profundidad cada uno de ellos, así como su sintaxis, indicando entre corchetes aquellos elementos que sean opcionales. Se observará que todos los programas permiten la inclusión de una serie de opciones sobre su ejecución antes del primer argumento. Estas opciones se indican precedidas de un menos(-): M. A. Bruno Ramos Ortiz 4 Ejercicios de la materia de Programación I F.FCCA programa -opcion1 -opcion2 Parametro1 Todas las opciones que los ejecutables del JDK presentan se muestran llamando al programa sin parámetros o con las opciones -? o -help: programa programa -help programa -? b.) Intérprete en tiempo de ejecución (JRE) Permite la ejecución de los programas Java (*.class) no gráficos (aplicaciones). La sintaxis para su utilización es la siguiente: java [Opciones] ClaseAEjecutar [Argumentos] · Opciones: Especifica opciones relacionadas con la forma en que el intérprete Java ejecuta el programa. · ClaseAEjecutar: Especifica el nombre de la clase cuyo método main() se desea ejecutar como programa. Si la clase reside en un paquete se deberá especificar su ruta mediante en forma paquete.subpaquete.clase_a_ejecutar. · Argumentos: Especifica los argumentos que se recibirán en el parámetro s del método main(String s), por si el programa necesita de parámetros de ejecución. Si por ejemplo el programa realiza el filtrado de un archivo, probablemente nos interese recibir como argumento la ruta del fichero a filtrar, y una ruta destino. c). Compilador Se utiliza para compilar archivos de código fuente Java (habitualmente *.java), en archivos de clases Java ejecutables (*.class). Se crea un archivo de clase para cada clase definida en un archivo fuente. Este compilador es una utilidad en línea de comandos con la siguiente sintaxis: javac [Opciones] ArchivoACompilar · Opciones: Especifica opciones de cómo el compilador ha de crear las clases ejecutables. · ArchivoACompilar: Especifica la ruta del archivo fuente a compilar, normalmente una fichero con extensión ".java". d.) Visualizador de applets Es una herramienta que sirve como campo de pruebas de applets, visualizando cómo se mostrarían en un navegador, en lugar de tener que esperar. Al ser activado desde una línea de órdenes abre una ventana en la que muestra el contenido de la applet. Se activa con la sintaxis: appletviewer [Opciones] Applet · Opciones: Especifica cómo ejecutar la applet Java. · Applet: Indica un URL o una ruta de disco que contiene una página HTML con una applet Java empotrada. M. A. Bruno Ramos Ortiz 5 Ejercicios de la materia de Programación I F.FCCA e.) Depurador Es una utilidad de línea de comandos que permite depurar aplicaciones Java. No es un entorno de características visuales, pero permite encontrar y eliminar los errores de los programas Java con mucha exactitud. Es parecido en su funcionamiento al depurador gdb que se incluye con las distribuciones del compilador gcc/g++ para C/C++. Se activa con la sintaxis: jdb [Opciones] · Opciones: Se utiliza para especificar ajustes diferentes dentro de una sesión de depuración. f.) Desensamblador de archivo de clase Se utiliza para desensamblar un archivo de clase. Su salida por defecto, muestra los atributos y métodos públicos de la clase desensamblada, pero con la opción -c también desensambla los códigos de byte, mostrándolos por pantalla. Es útil cuando no se tiene el código fuente de una clase de la que se quisiera saber cómo fue codificada. La sintaxis es la siguiente: javap [Opciones] [NombresClases] · Opciones: Especifica la forma en la que se han de desensamblar las clases. · NombresClase: Especifica la ruta de las clases a desensamblar, separadas por espacios. g.) Generador de cabecera y archivo de apéndice Se utiliza para generar archivos fuentes y cabeceras C para implementar métodos Java en C (código nativo). Esto se consigue mediante la generación de una estructura C cuya distribución coincide con la de la correspondiente clase Java. El generador de cabeceras javah, crea los ficheros de cabecera C/C++ para implementar en esos lenguajes los métodos nativos que presente un programa Java. La sintaxis es la siguiente: javah [Opciones] NombreClase · NombreClase: Nombre de la clase desde la cuál se van a generar archivos fuente C. · Opciones: Forma en la que se generarán los archivos fuente h.) Generador de documentación Es una herramienta útil para la generación de documentación API directamente desde el código fuente Java. Genera páginas HTML basadas en las declaraciones y comentarios javadoc, con el formato /** comentarios */: /** Comentarios sobre la clase */ class MiClase { } La documentación que genera es del mismo estilo que la documentación que se obtiene con el JDK. M. A. Bruno Ramos Ortiz 6 Ejercicios de la materia de Programación I F.FCCA Las etiquetas, que se indican con una arroba (@), aparecerán resaltadas en la documentación generada. Su sintaxis es: javadoc Opciones NombreArchivo · Opciones: Opciones sobre qué documentación ha de ser generada. · NombreArchivo: Paquete o archivo de código fuente Java, del que generar documentación. i.) Applets de demostración El JDK incluye una serie de applets de demostración, con su código fuente al completo. j.) Código fuente la API El código fuente de la API se instala de forma automática, cuando se descomprime el JDK, aunque permanece en formato comprimido en un archivo llamado "scr.zip" localizado en el directorio Java que se creó durante la instalación. COMPONENTES DE UNA APLICACIÓN EN JAVA En un programa de Java, destacan los siguientes elementos: 1. Comentarios: sirven para documentar los programas, en ellos se escriben anotaciones sobre cómo funciona el programa o sobre cómo se ha construido. Los comentarios no son sentencias de programación y son por consiguiente ignorados por el compilador. Ejemplos: // este es un comentario de una sola línea /* estos son comentarios de Varias líneas */ 2. Palabras reservadas: son palabras que tienen un determinado significado para el compilador y no pueden ser utilizadas por otros fines. Ejemplos: abstract char final int boolean class float null byte default for package case do if public catch else import true M. A. Bruno Ramos Ortiz 7 Ejercicios de la materia de Programación I F.FCCA 3. Sentencias: representa una acción o una secuencia de acciones. Cada sentencia termina con un punto y coma (;) Ejemplos: Z = 15; //sentencia que asigna un valor a una variable println(“Bienvenido a Java”); //sentencia que imprime un texto a pantalla 4. Bloques: son una estructura que agrupa sentencias. Los bloques comienzan con una llave de apertura ({) y termina con una llave de cierre (}). Un bloque puede estar dentro de otro bloque y se dice que el bloque interior está anidado dentro del exterior. Los bloques también limitan el alcance tanto de las clases como de los métodos. Ejemplo: { x=10; x=x+100; if (x > 225) { x=x-5; } println(“El valor de x es:”+x); } 5. Clases: constituyen una plantilla o modelo para fabricar objetos. Un programa consta de una o más clases y cada una de ellas contiene declaraciones de datos y métodos. Ejemplo: public class Imprimir { String texto=”Bienvenidos”; public void Imprime() { System.out.println(“La frase a imprimir es:” +texto); } } 6. Métodos: son una colección de sentencias que realizan una serie de operaciones determinadas. Ejemplo: JOptionPane.showMessageDialog(null, “Ejemplo de un método”); //método que manda un mensaje a través de la interfaz gráfica Método main( ): cada aplicación en Java debe tener un método principal, el cual define dónde comienza el flujo del programa. M. A. Bruno Ramos Ortiz 8 Ejercicios de la materia de Programación I F.FCCA Sintaxis: Public static void main (String [ ] args) { //sentencias; } 7. Paquetes: son una colección de clases que proporcionan un medio adecuado para organizar las clases. La clase puede pertenecer a un paquete o importar un paquete para acceder a las clases que lo integran. Ejemplo: · Para pertenecer a un paquete se utiliza la siguiente sintaxis: package nombrepaquete; · Para importar un paquete se emplea la siguiente sintaxis: import nombrepaquete; ETAPAS PARA CREAR UN PROGRAMA EN JAVA 1. Crear una carpeta de proyecto; en la que se almacenan todas las clases y archivos significativos. 2. Utilizar un programa editor que introduzca cada línea del programa fuente en memoria y lo guarde en la carpeta proyecto como un archivo con extensión .java 3. utilizar el programa compilador para traducir el programa fuente en bytecode (código en bytes). Si existen errores de sintaxis (error gramatical de una línea en un programa Java), el compilador visualiza esos errores en una ventana. 4. utilizar el programa editor para corregir esos errores, modificando y volviendo a guardar el programa fuente. Cuando el programa fuente está libre de errores, el compilador guarda su traducción en bytecode como un archivo con extensión .class 5. El intérprete de Java (JVM) traduce y ejecuta cada instrucción en bytecode. 6. si el código no funciona correctamente se puede utilizar el depurador para ejecutar el programa paso a paso y examinar el efecto de las instrucciones individuales. ERRORES DE PROGRAMACIÓN Los errores de programación son inevitables, incluso para programadores experimentados. El proceso de corregir un error se denomina depuración del programa. Cuando se detecta un error en Java, se visualiza un mensaje de error que devuelve la posible causa del error. Tipos de errores: M. A. Bruno Ramos Ortiz 9 Ejercicios de la materia de Programación I F.FCCA Ø Errores de sintaxis; ocurren cuando el código viola una ó más reglas gramaticales de Java. Los errores de sintaxis se detectan y visualizan por el compilador cuando se intenta traducir el programa, por esta razón se denominan errores de compilación. Éstos errores provienen de errores en la construcción del código tales como escribir mal una palabra reservada, omitir algún signo de puntuación o bien utilizar una llave de apertura sin su correspondiente llave de cierre. Son fáciles de detectar ya que el compilador suele indicar dónde se producen las posibles causas. Ø Errores de ejecución; son errores que producen una terminación anormal y que se detectan y visualizan durante la ejecución del programa. Un error de ejecución se produce cuando el usuario instruye a la computadora para que ejecute una operación no valida, tal como dividir un número por cero o manipular datos indefinidos o no válidos en la entrada. Un error de entrada ocurre cuando el usuario introduce un valor imprevisto que el programa no puede manejar. Por ejemplo si el programa espera leer un número, pero el usuario introduce una cadena de caracteres. Ø Errores lógicos; ocurren cuando un programa realiza un algoritmo incorrecto y no ejecuta la operación que estaba prevista. Existen muchos tipos de razones para que se produzcan errores lógicos. Son difíciles de detectar, ya que no producen errores en tiempo de ejecución y no visualizan mensajes de error. El único síntoma de que se ha producido un error lógico puede ser la salida incorrecta del programa. Se pueden detectar errores lógicos comprobando el programa en su totalidad y comparando su salida con los resultados calculados. La prevención de éstos errores se puede realizar verificando el algoritmo y el programa correspondiente antes de comenzar el proceso de ejecución. VARIABLES Una variable es un nombre que se asocia con una porción de la memoria del ordenador, en la que se guarda el valor asignado a dicha variable. Hay varios tipos de variables que requieren distintas cantidades de memoria para guardar datos. Todas las variables han de declararse antes de usarlas, la declaración consiste en una sentencia en la que figura el tipo de dato y el nombre que asignamos a la variable. Una vez declarada se le podrá asignar valores. Java tiene tres tipos de variables: · de instancia · de clase · locales Las variables de instancia o miembros dato como veremos más adelante, se usan para guardar los atributos de un objeto particular. Las variables de clase o miembros dato estáticos son similares a las variables de instancia, con la excepción de que los valores que guardan son los mismos para todos los objetos de una determinada clase. En el siguiente ejemplo, PI es una variable de clase y radio es una M. A. Bruno Ramos Ortiz 10 Ejercicios de la materia de Programación I F.FCCA variable de instancia. PI guarda el mismo valor para todos los objetos de la clase Circulo, pero el radio de cada círculo puede ser diferente class Circulo{ static final double PI=3.1416; double radio; //... } Las variables locales se utilizan dentro de las funciones miembro o métodos. En el siguiente ejemplo area es una variable local a la función calcularArea en la que se guarda el valor del área de un objeto de la clase Circulo. Una variable local existe desde el momento de su definición hasta el final del bloque en el que se encuentra. class Circulo{ //... double calcularArea(){ double area=PI*radio*radio; return area; } } En el lenguaje Java, las variables locales se declaran en el momento en el que son necesarias. Es una buena costumbre inicializar las variables en el momento en el que son declaradas. Veamos algunos ejemplos de declaración de algunas variables int x=0; String nombre="Angel"; double a=3.5, b=0.0, c=-2.4; boolean bNuevo=true; int[] datos; Delante del nombre de cada variable se ha de especificar el tipo de variable que hemos destacado en letra negrita. Las variables pueden ser · · · Un tipo de dato primitivo El nombre de una clase Un array El lenguaje Java utiliza el conjunto de caracteres Unicode, que incluye no solamente el conjunto ASCII sino también carateres específicos de la mayoría de los alfabetos. Así, podemos declarar una variable que contenga la letra ñ int año=1999; Se ha de poner nombres significativos a las variables, generalmente formados por varias palabras combinadas, la primera empieza por minúscula, pero las que le siguen llevan la M. A. Bruno Ramos Ortiz 11 Ejercicios de la materia de Programación I F.FCCA letra inicial en mayúsculas. Se debe evitar en todos los casos nombres de variables cortos como xx, i, etc. double radioCirculo=3.2; Las variables son uno de los elementos básicos de un programa, y se deben · Declarar · Inicializar · Usar TIPOS DE DATOS PRIMITIVOS Tipo boolean char byte short int long float double Descripción Tiene dos valores true o false. Caracteres Unicode de 16 bits Los caracteres alfa-numéricos son los mismos que los ASCII con el bit alto puesto a 0. El intervalo de valores va desde 0 hasta 65535 (valores de 16-bits sin signo). Tamaño 8 bits. El intervalo de valores va desde -27 hasta 27 -1 (-128 a 127) Tamaño 16 bits. El intervalo de valores va desde -215 hasta 215-1 (-32768 a 32767) Tamaño 32 bits. El intervalo de valores va desde -231 hasta 231-1 (-2147483648 a 2147483647) Tamaño 64 bits. El intervalo de valores va desde -263 hasta 263-1 (9223372036854775808 a 9223372036854775807) Tamaño 32 bits. Números en coma flotante de simple precisión. Estándar IEEE 7541985 (de 1.40239846e–45f a 3.40282347e+38f) Tamaño 64 bits. Números en coma flotante de doble precisión. Estándar IEEE 7541985. (de 4.94065645841246544e–324d a 1.7976931348623157e+308d.) CARACTERES En Java los caracteres no están restringidos a los ASCII sino son Unicode. Un carácter está siempre rodeado de comillas simples como 'A', '9', 'ñ', etc. El tipo de dato char sirve para guardar estos caracteres. Un tipo especial de carácter es la secuencia de escape, similares a las del lenguaje C/C++, que se utilizan para representar caracteres de control o caracteres que no se imprimen. Una secuencia de escape está formada por la barra invertida (\) y un carácter. En la siguiente tabla se dan las secuencias de escape más utilizadas. M. A. Bruno Ramos Ortiz 12 Ejercicios de la materia de Programación I F.FCCA Carácter Secuencia de escape retorno de \r carro tabulador \t horizontal nueva línea \n barra invertida \\ Variables booleanas En el lenguaje C/C++ el valor 0 se toma como falso y el 1 como verdadero. En el lenguaje Java existe el tipo de dato boolean. Una variable booleana solamente puede guardar uno de los dos posibles valores: true (verdadero) y false (falso). boolean encontrado=false; {...} encontrado=true; Variables enteras Una variable entera consiste en cualquier combinación de cifras precedidos por el signo más (opcional), para los positivos, o el signo menos, para los negativos. Son ejemplos de números enteros: 12, -36, 0, 4687, -3598 Como ejemplos de declaración de variable enteras tenemos: int numero=1205; int x,y; long m=30L; int es la palabra reservada para declarar una variable entera. En el primer caso, el compilador reserva una porción de 32 bits de memoria en el que guarda el número 1205. Se accede a dicha porción de memoria mediante el nombre de la variable, numero. En el segundo caso, las porciones de memoria cuyos nombres son x e y, guardan cualquier valor entero si la variable es local o cero si la variable es de instancia o de clase. El uso de una variable local antes de ser convenientemente inicializada puede conducir a consecuencias desastrosas. Por tanto, declarar e inicializar una variable es una práctica aconsejable. En la tercera línea 30 es un número de tipo int por defecto, le ponemos el sufijo L en mayúsculas o minúsculas para indicar que es de tipo long. Existen como vemos en la tabla varios tipos de números enteros (byte, short, int, long), y también existe una clase denominada BigInteger cuyos objetos pueden guardar un número entero arbitrariamente grande. Variables en coma flotante Las variables del tipo float o double (coma flotante) se usan para guardar números en memoria que tienen parte entera y parte decimal. double PI=3.14159; double g=9.7805, c=2.9979e8; M. A. Bruno Ramos Ortiz 13 Ejercicios de la materia de Programación I F.FCCA El primero es una aproximación del número real p, el segundo es la aceleración de la gravedad a nivel del mar, el tercero es la velocidad de la luz en m/s, que es la forma de escribir 2.9979 108. El carácter punto '.', separa la parte entera de la parte decimal, en vez del carácter coma ',' que usamos habitualmente en nuestro idioma. Otras ejemplos son los siguientes float a=12.5f; float b=7f; double c=7.0; double d=7d; En la primera línea 12.5 lleva el sufijo f, ya que por defecto 12.5 es double. En la segunda línea 7 es un entero y por tanto 7f es un número de tipo float. Y así el resto de los ejemplos. Conceptualmente, hay infinitos números de valores entre dos números reales. Ya que los valores de las variables se guardan en un número prefijado de bits, algunos valores no se pueden representar de forma precisa en memoria. Por tanto, los valores de las variables en coma flotante en un ordenador solamente se aproximan a los verdaderos números reales en matemáticas. La aproximación es tanto mejor, cuanto mayor sea el tamaño de la memoria que reservamos para guardarlo. De este hecho, surgen las variables del tipo float y double. Para números de precisión arbitararia se emplea la clase BigDecimal. Valores constantes Cuando se declara una variable de tipo final, se ha de inicializar y cualquier intento de modificarla en el curso de la ejecución del programa da lugar a un error en tiempo de compilación. Normalmente, las constantes de un programa se suelen poner en letras mayúsculas, para distinguirlas de las que no son constantes. He aquí ejemplos de declaración de constantes. final double PI=3.141592653589793; final int MAX_DATOS=150; SENTENCIA IF Permite en un programa tomar la decisión sobre la ejecución/no ejecución de una acción o de un grupo de acciones, mediante la evaluación de una expresión lógica o booleana. La acción o grupo de acciones se ejecutan cuando la condición es cierta y en caso contrario no se ejecutan y se saltan. Sintaxis: if (condición) sentencia; M. A. Bruno Ramos Ortiz if (condición) { //secuencia de sentencias } 14 Ejercicios de la materia de Programación I F.FCCA SENTENCIA IF-ELSE Ofrece dos alternativas a seguir, basadas en la comprobación de la condición. La palabra reservada else separa las sentencias utilizadas para ejecutar cada alternativa. Sintaxis: if (condición) sentencia1; else sentencia2; if (condición) { //secuencia de sentencias1 } else { //secuencia de sentencias2 } Si la evaluación de la condición es verdadera, se ejecuta la sentencia1 o la secuencia de sentencias1, mientras que si la evaluación es falsa se ejecuta la sentencia2 o la secuencia de sentencias2. Es decir, que las sentencias a realizar tanto cuando se cumple como cuando no se cumple la condición podrán ser simples o compuestas. SENTENCIAS IF-ELSE ANIDADAS La construcción if-else-if múltiple, es muy habitual en programación y se suele escribir de la forma siguiente: if (condición1) sentencia1; else if (condición2) sentencia2; else if (condición3) sentencia3; … else if (condiciónN) sentenciaN; else sentenciaX; //opcional la sentencia anterior realiza una serie de test en cascada hasta que se produce una de las siguientes condiciones: M. A. Bruno Ramos Ortiz 15 Ejercicios de la materia de Programación I · · F.FCCA Una de las cláusulas especificadas en las sentencias if se cumple; en ese caso la sentencia asociada se ejecuta y no se tiene en cuenta el resto. Ninguna de las cláusulas especificadas se cumple y entonces, si existe, se ejecuta la última sentencia else. SENTENCIA SWITCH Cuando se tienen muchas alternativas posibles a elegir, el uso de sentencias if-else-if puede resultar bastante complicado, siendo recomendable emplear la sentencia switch. Sintaxis: switch (expresión) { case constante1: sentencias1; //no se requiere cerrarlas entre llaves break; case constante2: sentencias2; break; …. case constanteN sentenciasN; break; default senteciasX; } En la sentencia switch la expresión a evaluar debe ser de tipo entero o carácter. La sentencia break se utiliza con la sentencia switch para abandonar dicha sentencia tras la ejecución de las sentencias asociadas a una determinada cláusula case. El funcionamiento de la sentencia switch es el siguiente: · · Cuando el valor de la expresión coincide con una constante de case, se ejecutan el grupo de sentencias asociadas y si la última sentencia de un grupo es break, tras llegar a ella, el programa sale de la sentencia switch. Si la sentencia break se omite, la ejecución sigue en el siguiente grupo de sentencias. La cláusula default es un caso especial de case. Las sentencias que vienen a continuación de ella se ejecutan si ninguna de las constantes que siguen a las diferentes sentencias case coincide con el valor de la expresión de switch. M. A. Bruno Ramos Ortiz 16 Ejercicios de la materia de Programación I F.FCCA SENTENCIA FOR Está diseñado para ejecutar una secuencia de sentencias un número fijo de veces. Sintaxis: for (inicialización; condición de terminación; incremento) sentencias; //desde 1 a un bloque delimitado por { } · · · · · Las sentencias podrán ser cero, una única sentencia o un bloque y serán lo que se repita durante el proceso del ciclo. La inicialización fija los valores iniciales de la variable o variables de control antes de que el ciclo se procese y ejecute solo una vez. Cuando no se tiene que inicializar, se omite este apartado; sin embargo, nunca se debe omitir el punto y coma que actúa como separador. La condición de terminación se comprueba antes de cada iteración del ciclo y éste se repite mientras que dicha condición se evalúe a un valor verdadero. Si se omite no se realiza ninguna prueba y se ejecuta siempre la sentencia for. Cuando la condición es verdadera, el ciclo ejecuta la iteración (todas sus sentencias) y a continuación la variable de control del ciclo se incrementa. El incremento se ejecuta después de que se ejecuten las sentencias y antes de que se realice la siguiente prueba de la condición de terminación. Normalmente esta parte se utiliza para incrementar o decrementar el valor de la(s) variable(s) de control y al igual que en la inicialización, se puede usar en ella el operador coma para pegar sentencias. Cuando no se tienen valores a incrementar se puede omitir este apartado. Las variables de control que pertenecen a la sentencia for pueden ser de cualquier tipo de datos simples. SENTENCIA WHILE Ejecuta una sentencia o bloque de sentencias mientras se cumple una determinada condición; es decir, la acción o acciones se repiten mientras la condición es verdadera. Sintaxis: while (condición) sentencia1 while (condición) { //secuencia de sentencias } Si la condición es verdadera, la sentencia o grupo de sentencias se ejecutan. Cuando la condición es falsa, el ciclo while se termina y el programa reanuda su ejecución en la primera sentencia después del ciclo. M. A. Bruno Ramos Ortiz 17 Ejercicios de la materia de Programación I F.FCCA La sentencia while es adecuada para muchas tareas. Un uso típico en programación es asegurar entradas de usuario válidas. Un problema frecuente en programación se produce cuando aparecen ciclo infinitos. Un ciclo infinito es aquel que nunca termina. Los ciclo infinitos se producen debido a que la condición que se comprueba nunca se hace falsa, de modo que el ciclo while ejecuta repetidamente sus sentencias una y otra vez. SENTENCIA DO-WHILE Es similar a la sentencia while, excepto que la condición se comprueba después de que el bloque de sentencias se ejecute (mientras que la sentencia while realiza la prueba antes de que se ejecute el bloque de sentencias). Sintaxis: do sentencia; while (condición); do { sentencias; } while (condición); La(s) sentencia(s) se ejecutan y a continuación se evalúa la condición. Si la condición se evalúa a un valor verdadero, las sentencias se ejecutan de nuevo. Este proceso se repite hasta que la expresión tenga un valor falso, en cuyo momento se sale de la sentecia dowhile. Dado que el test condicional se realiza al final del ciclo la sentencia o bloque de sentencias se ejecuta al menos una vez. MÉTODOS Definición: son una colección de sentencias que realizan una serie de operaciones determinadas. Declaración del método: [private|protected|public] [static] [abstract] [final] [native] [synchronized] TipoDevuelto NombreMétodo ( [tipo1 nombre1[, tipo2 nombre2 ]…] ) [throws excepción1 [,excepción2]… ] Cabecera del método M. A. Bruno Ramos Ortiz 18 Ejercicios de la materia de Programación I F.FCCA { // Declaración de las variables //Asignación a variables //Operaciones matemáticas // Sentencias de control //Llamadas a otros métodos: · Dentro de la clase · De instancia, de otras clases · De clase, de cualquier clase //Excepciones Cuerpo del método [return valor de retorno;] } Explicación de la declaración: Básicamente, los métodos implementan operaciones y estructuras de control, el cálculo de algún parámetro que es el que devuelven al objeto que los llama. Sólo pueden devolver un valor (del tipo TipoDevuelto), aunque pueden no devolver ninguno (en ese caso TipoDevuelto es void). El valor de retorno se especifica con la instrucción return, dentro del método. Los métodos pueden utilizar valores que les pasa el objeto que los llama (parámetros), indicados con tipo1 nombre1, tipo2 nombre2… en el esquema de la declaración. Estos parámetros pueden ser de cualquiera de los tipos ya vistos. Si son tipos básicos, el método recibe el valor del parámetro; si son arreglos, clases o interfases, recibe un puntero a los datos (referencia). Java tiene 4 tipos de acceso diferente a las variables o métodos de una clase: privado, protegido, público o por paquete (si no se especifica nada). De acuerdo a la forma en que se especifica un atributo y método, objetos de otras clases tienen distintas posibilidades de accederlos: Acceso desde: La propia clase Subclase en el mismo paquete Otras clases en el mismo paquete Subclases en otros paquetes Otras clases en otros paquetes private S protected S public S (Package) S N S S S N S S S N X S N N N S N M. A. Bruno Ramos Ortiz 19 Ejercicios de la materia de Programación I F.FCCA S: puede acceder N: no puede acceder X: puede acceder al atributo en objetos que pertenezcan a la subclase, pero no en los que pertenecen a la clase madre. Los métodos estáticos (static), son, métodos de clase; si el método no es static es un método de instancia. El significado es: un método static es compartido por todas las instancias de la clase. Los métodos abstractos (abstract) son aquellos de los que se da la declaración pero no la implementación (o sea que consiste sólo del encabezamiento). Cualquier clase que contenga al menos un método abstracto (o cuya clase madre contenga al menos un método abstracto que no esté implementado en la hija) es una clase abstracta. Es final un método que no puede ser redefinido por ningún descendiente de la clase. Las clases native son aquellas que se implementan en otro lenguaje (por ejemplo C o C++) propio de la máquina. Sun aconseja utilizarlas bajo riesgo propio, ya que en realidad son ajenas al lenguaje. Pero la posibilidad de usar viejas bibliotecas que uno armó y no tiene ganas de reescribir existe!. Las clases synchronized permiten sincronizar varios threads para el caso en que dos o más accedan concurrentemente a los mismos datos. Finalmente, la cláusula throws sirve para indicar que la clase genera determinadas excepciones. CONSTRUCTORES Es un método especial dentro de una clase cuyo objetivo es el de inicializar un objeto cuando éste es creado. El constructor se llama automáticamente cada vez que se crea un objeto de esa clase. Características especiales: · Se llama igual que la clase. · No devuelve nada, ni siquiera void. · Pueden existir varios, pero siguiendo las reglas de la sobrecarga de métodos explicadas en el apartado de abajo del documento. · De entre los que existan, tan sólo uno se ejecutará al crear un objeto de la clase. · Dentro del código de un constructor generalmente suele existir inicializaciones de variables y objetos, para conseguir que el objeto sea creado con dichos valores iniciales. M. A. Bruno Ramos Ortiz 20 Ejercicios de la materia de Programación I F.FCCA Constructor por defecto Un constructor por defecto es un constructor sin parámetros que no hace nada. Sin embargo será invocado cada vez que se construya un objeto sin especificar ningún argumento, en cuyo caso el objeto será iniciado con los valores predeterminados por el sistema (los atributos numéricos a ceros, los alfanuméricos a nulos, y las referencias a objetos a null). Ejemplo Un constructor por defecto, para la clase Suma quedaría así: public Suma() {} Como se observa el constructor no posee ningún parámetro, ya que como no ha sido definido propiamente por el programador, Java lo hace por default. Si se define un constructor con parámetros, (definido explícitamente) el constructor por default se reemplaza por éste, quedando el siguiente ejemplo: public Suma { private int numero1,numero2; //variables de la clase public Suma (int primero,int segundo){ //parámetros recibidos por el constructor numero1=primero; //inicialización de la variable numero1, asignándole el primer parámetro numero2=segundo; //inicialización de la variable numero2, asignándole el segundo parámetro } //fin del constructor Para invocarlo a la hora de declarar y construir el objeto se mandarán los parámetros necesarios, ejemplo: Suma objeto = new Suma (4,10); Esto indica que el objeto creado tendrá por valores de inicio 4 y 10 asignados a sus variables respectivas. SOBRECARGA DE MÉTODOS En Java es posible definir dos o más métodos dentro de la misma clase que compartan el mismo nombre pero las declaraciones de sus parámetros deben ser diferentes. A esto es a lo que se conoce como Sobrecarga de Métodos. La Sobrecarga es uno de los procedimientos mediante el cual Java implementa el polimorfismo (en programación orientada a objetos es la capacidad que tienen los objetos de una clase de responder al mismo mensaje o evento en función de los parámetros utilizados durante su invocación) M. A. Bruno Ramos Ortiz 21 Ejercicios de la materia de Programación I F.FCCA ORIENTACIÓN A OBJETOS ¿Qué es un objeto?. La mejor forma de entenderlo es mediante una analogía. Consideremos una computadora, por ejemplo. Si la abrimos y lo observamos detenidamente, podemos comprobar que está formada por la placa base, el procesador, la memoria, el disco duro, etc. Si, a su vez, examinamos por separado cada parte, veremos que el disco duro está compuesto por varios discos superpuestos, las cabezas lectoras, un circuito controlador, etc. Podemos ver también que cada módulo de memoria está construido a partir de circuitos integrados de memoria más pequeños interconectados entre sí, y lo mismo ocurre con todas las demás partes de la computadora. El todo está formado por piezas, y cada pieza está compuesta por partes más pequeñas. Supongamos que se nos estropea el disco duro y necesitamos comprar otro. Si cada fabricantede PCs diseñara discos duros para sus computadoras basándose en especificaciones propias, estos serían incompatibles entre sí, y nos veríamos obligados a buscar el modelo de disco adecuado para nuestra computadora. Por suerte, existen en la industria estándares gracias a los cuales cada empresa puede fabricar internamente los discos duros como mejor les parezca, siempre y cuando la interfaz de conexión con la computadora cumpla con un estándar determinado y aceptado por todos los fabricantes (IDE,SCSI, etc.). De este modo, tenemos un objeto (el disco duro) que realiza una función determinada (almacenar información) sobre unos atributos (los datos), y que se comunica con el resto del sistema mediante una interfaz determinada y bien conocida. Si no quedo claro usaremos un ejemplo más sencillo. Cualquier juego de construcción como los de Lego o Tente está formado por elementos básicos (las piezas). Cada pieza, por sí sola, no tiene mucha utilidad, pero podemos juntarlas para construir lo que nos dé la gana. Si podemos construir cosas es porque cada pieza trae una serie de hendiduras que encajan en las de las demás. Así que tenemos una serie de objetos (las piezas) con una interfaz común (las hendiduras) y que nos permiten realizar una construcción (el programa). Mediante estos ejemplos ya podemos vislumbrar algunas de las características de los objetos: Ø Realizan una tarea por sí solos. Ø Proporcionan encapsulación: Es posible ocultar las partes internas de la implementación de un objeto, permitiendo el acceso sólo a través de una interfaz bien conocida y definida. Ø Son reutilizables. Ø Proporcionan escalabilidad (el programa puede crecer) y modularidad (el programa se puede dividir en bloques que faciliten su comprensión). M. A. Bruno Ramos Ortiz 22 Ejercicios de la materia de Programación I F.FCCA En Java ocurre lo mismo que en los ejemplos anteriores. Programaremos una serie de objetos independientes con una funcionalidad determinada, y los juntaremos para crear un programa. Pero, para crear objetos, primero debemos hablar de las clases. Cuando se escribe un programa en un lenguaje orientado a objetos, no estamos definiendo objetos, sino clases. Una clase es la unidad fundamental en programación, la pieza de Lego. El problema es... que no existe. Es una abstracción. Es la plantilla que utilizaremos posteriormente para crear un conjunto de objetos con características similares. Y para entenderlo se utilizará el ejemplo de los coches. Supongamos que definimos una clase Coche. No tiene entidad física. Hablamos de un coche en general, sin especificar de qué tipo de coche se trata. Podemos asignarle un comportamiento y una serie de características, como se muestra en la siguiente figura. A partir de esa clase Coche, podremos crear nuestros objetos (también llamados instancias), que serán las realizaciones ”físicas” de la clase. En el ejemplo, se muestran un Seat Panda, un Opel Corsa, y un Renault Megane. Todos ellos comparten una serie de características comunes por las que podemos identificarlos como coches. Analicemos ahora nuestra figura: - Las clases se definen con la palabra reservada class. Todo el código que pertenezca a esa clase se encierra entre dos llaves. Los nombres de las clases, por norma, comienzan con mayúscula. A continuación tenemos tres atributos, definidos por las variables estadoMotor, color y modelo. Los atributos nos definen las características que tendrá cada objeto de esa clase, y que podrán ser distintas para cada uno de ellos. Es decir, cada coche será de M. A. Bruno Ramos Ortiz 23 Ejercicios de la materia de Programación I - F.FCCA un modelo determinado, de un color, y su motor estará encendido o apagado. Por ahora no nos interesa que los tipos sean String o boolean. Por último, tenemos dos métodos, arrancar() y detener(). Los métodos nos definen el comportamiento que tendrán los objetos de esa clase. Para poder implementar dicha clase tendremos que declarar y crear los objetos mostrados en la figura de arriba mediante la siguiente sintaxis: nombreClase nombreObjeto = new constructorClase( ) ; Las sentencias en Java quedarían así: Coche SeatPanda = new Coche( ); Coche OpelCorsa = new Coche( ); Coche RenaultMegane = new Coche( ); Con ellas podemos accesar a cualquiera de los componentes que integran la clase, recordando que la sintaxis que nos permite hacerlo es: nombreAtributo nombreObjeto . nombreMetodo punto Ejemplos: SeatPanda.color = ”Rojo Manzana”; RenaultMegane.arrancar( ); OpelCorsa.modelo = “2010”; RenaultMegane.detener( ); HERENCIA En orientación a objetos la herencia es el mecanismo fundamental para implementar la reusabilidad y extensibilidad del software. A través de ella los diseñadores pueden construir nuevas clases partiendo de una jerarquía de clases ya existente (comprobadas y verificadas) evitando con ello el rediseño, la remodificación y verificación de la parte ya implementada. La herencia facilita la creación de objetos a partir de otros ya existentes, obteniendo características (métodos y atributos) similares a los ya existentes. Todas las clases en Java existen dentro de una jerarquía. Cada clase tiene una (y sólo una) clase por encima de ella, denominada superclase, y cualquier número de clases (o ninguna) por debajo. A estas últimas se las denomina subclases. Una clase heredará los métodos y variables de su superclase. Del mismo modo, sus subclases heredarán los métodos y variables de esa clase. M. A. Bruno Ramos Ortiz 24 Ejercicios de la materia de Programación I F.FCCA Veamos la siguiente notación UML para ejemplificar la herencia en Java: En ella se muestran 5 clases y su relación de herencia. Por encima de todas tenemos una superclase Animal, con un atributo peso y un método comer( ) (todos los animales tienen peso y comen). Debajo de ésta aparecen otras dos clases con tipos de animales: Ovíparos y Mamíferos. Los Ovíparos pueden ponerHuevos( ). Los Mamíferos pueden parir( ) y amamantar() a sus crías, y pueden tener la sangreCaliente, o no. Estas dos clases, aparte de tener su propio comportamiento y sus características, heredan también los métodos y atributos de su superclase. Por ello, tanto los Mamíferos como los Ovíparos pueden comer() y tienen un peso. Así mismo, la clase Mamífero tiene dos subclases que heredan de ella. Son las subclases Perro y Delfín. El perro, por ejemplo, tendrá un color de pelo determinado, y podrá ladrar. Y además, debido a la herencia, tendrá un peso, podrá comer, tendrá la sangre caliente y amamantará a sus crías. Cada subclase extiende y concreta la funcionalidad y características de su superclase. Es decir, se ”especializa” más. La manera de especificar que una clase es subclase de otra se hace en la cabecera de la clase utilizando la palabra reservada extends. La sintaxis es la siguiente: nombreClase extends nombreSuperclase Cuando en una clase no se especifique nada, heredarán de la clase Object. Esta clase es la superior en la jerarquía de clases de Java, y es la única que no hereda de nadie. El hecho de que una clase de Java sólo pueda heredar de su superclase se denomina herencia simple. Todas las clases heredan de una, y sólo una clase (excepto la clase Object, claro, que no hereda de nadie). En otros lenguajes, como C++, existe el concepto de herencia múltiple, en el que una clase puede heredar de dos o más superclases. Pero no en Java, lo cual simplifica enormemente la programación sin restarle potencia. M. A. Bruno Ramos Ortiz 25 Ejercicios de la materia de Programación I F.FCCA FUNDAMENTOS BÁSICOS Ejercicio1: Ofrecer el primer contacto de Java, a través de conceptos esenciales como son: la construcción de una clase, el método main, declaración de variables, operadores aritméticos y lógicos, uso de comentarios, operación de asignación y muestra de resultados mediante un método de salida. public class MiPrimeraClase { //cuerpo de la clase public static void main (String []args) { //cuerpo del método principal System.out.println("Mi primer programa en Java"); //esta sentencia manda a la consola un mensaje de texto int resultado; resultado=5-9*7/(2+2)%6*4%(4+9-3)*4-3+8; //operadores aritméticos System.out.println("El resultado de la expresion aritmética es "+resultado); boolean A,B,C; A=false; //inicio de secuencia de operaciones de asignación y operadores lógicos B=(9<=4+10/2); C=!(A||B); C= C&&(15!=6*5-15); B=((C||A)&&A); A=!(A&&B&&C); System.out.println("Los resultados de las variables logicas son \nA= "+A+"\nB= "+B+"\nC= "+C); } //fin del método principal } //fin de la clase Ejercicio2: Conocer las dos formas usadas por Java para ofrecer programas interactivos, mediante la entrada de datos por parte del usuario y la salida que muestra el resultado del proceso hecho por el programa. import javax.swing.JOptionPane; //importación de la clase adecuada para tener el ambiente gráfico public class EntradaSalida { public static void main(String [] args) { int primernumero,segundonumero; //variables que guardarán los valores introducidos por el usuario Scanner objetoScanner = new Scanner(System.in); M. A. Bruno Ramos Ortiz 26 Ejercicios de la materia de Programación I F.FCCA //declaracion del objeto de la clase Scanner que nos permite leer datos por parte del usuario mediante un ambiente de consola System.out.println("Introduce el primer número entero"); primernumero=objetoScanner.nextInt(); System.out.println("Introduce el segundo número entero"); segundonumero=objetoScanner.nextInt(); System.out.println("El resultado de la suma de los numeros es:"+(primernumero+segundonumero)); String numero; //esta variable recibirá el flujo de caracteres representado por los numeros a sumar numero=JOptionPane.showInputDialog("Introduce el primer numero entero:"); //el metodo showInputDialog muestra una ventana grafica en donde el usuario puede introducir valores desde el teclado primernumero=Integer.parseInt(numero); //el metodo parseInt convierte a un valor entero un flujo de caracteres numero=JOptionPane.showInputDialog("Introduce el segundo numero entero:"); //el metodo showInputDialog muestra una ventana grafica en donde elusuario puede introducir valores desde el teclado segundonumero=Integer.parseInt(numero); //el metodo parseInt convierte a un valor entero unflujo de caracteres JOptionPane.showMessageDialog(null,"La suma es:"+(primernumero+segundonumero) ,"Suma de enteros", JOptionPane.INFORMATION_MESSAGE); //el metodo showMessageDialog muestra una ventana con texto para informarle al usuario de algun proceso o actividad } } Ejercicio3: Mostrar el uso de la sentencia de control selectiva if-else, que permita entender su funcionamiento por medio de un juego de azar sencillo. import javax.swing.JOptionPane; public class SeleccionIfElse { public static void main (String []args) { String numero;//variable que almacenará el número introducido por parte del usuario int compu,usuario; //la variable usuario guardará el numero ya convertido del usuario y la variable compu el generado por la computadora numero=JOptionPane.showInputDialog("Introduce un número entero entre 1 y 5"); usuario=Integer.parseInt(numero); compu=(int)(Math.random()*5)+1; //el método random genera valores aleatorios flotantes entre un rango de 0 a 1 if(usuario == compu) M. A. Bruno Ramos Ortiz 27 Ejercicios de la materia de Programación I F.FCCA JOptionPane.showMessageDialog(null, "Acertaste", "Resultados",JOptionPane.ERROR_MESSAGE); else JOptionPane.showMessageDialog(null, "Fallaste", "Resultados", JOptionPane.WARNING_MESSAGE); System.exit(0); //con esta sentencia se la indica a la JVM que la terminación del programa se ha dado } } Ejercicio4: Enseñar el uso de la sentencia múltiple switch, eficaz en el manejo de menús que dan la posibilidad al usuario de elegir de un grupo de alternativas la que requiera. import javax.swing.JOptionPane; public class SeleccionMultiple { public static void main (String[]args) { String opcion; int opcion2; do{ //inicio del ciclo que se ejecuta por lo menos una vez opcion = JOptionPane.showInputDialog("Menu de Iconos\n1.Error\n2.Información\n3.Advertencia\n4.Pregunta\n5.Sin icono\n6.Salir\nElige una opción:"); //creamos el menu de iconos mediante el metodo showInputDialog y el caracter de edicion \n para tener opciones en renglones independientes opcion2=Integer.parseInt(opcion); switch(opcion2){ //inicio del switch case 1: JOptionPane.showMessageDialog(null,"Icono del Error","Iconos",JOptionPane.ERROR_MESSAGE); break; //sentecia que concluye con el flujo del programa del switch case 2: JOptionPane.showMessageDialog(null,"Icono de Información","Iconos",JOptionPane.INFORMATION_MESSAGE); break; //sentecia que concluye con el flujo del programa del switch case 3: JOptionPane.showMessageDialog(null,"Icono de Advertencia","Iconos",JOptionPane.WARNING_MESSAGE); break; //sentecia que concluye con el flujo del programa del switch case 4: M. A. Bruno Ramos Ortiz 28 Ejercicios de la materia de Programación I F.FCCA JOptionPane.showMessageDialog(null,"Icono de Pregunta","Iconos",JOptionPane.QUESTION_MESSAGE); break; //sentecia que concluye con el flujo del programa del switch case 5: JOptionPane.showMessageDialog(null,"Sin icono","Iconos",JOptionPane.PLAIN_MESSAGE); break; //sentecia que concluye con el flujo del programa del switch case 6: JOptionPane.showMessageDialog(null, "Hasta luego!!!!!!"); break; default: JOptionPane.showMessageDialog(null,"No elegiste ninguna opcion del menú"); }//termino del switch }while(opcion2!=6); System.exit(0); la } } Ejercicio5: Brindar pequeños ejemplos del uso y manejo de la sentencia repetitiva for para que el alumno reconozca su valor e importancia. public class EjemplosSentenciaFor { public static void main(String []args) { int i; for(i=1;i<=10;i++) System.out.print(i+" "); System.out.println();//nos da un nuevo renglon en la consola for(--i;i>0;i--) System.out.print(i+" "); System.out.println();//nos da un nuevo renglon en la consola for(char a='A';a<='Z';a++) System.out.print(a+" "); System.out.println();//nos da un nuevo renglon en la consola for(double b=10.0;b>=1;b-=0.5) System.out.print(b+" "); } } M. A. Bruno Ramos Ortiz 29 Ejercicios de la materia de Programación I F.FCCA Ejercicio6: Demostrar como mediante el empleo de la sentencia repetitiva while, el alumno es capaz de resolver problemas matemáticos simples como determinar si un número es primo o no. import javax.swing.JOptionPane; public class EjemploSentenciaWhile { public static void main (String []args) { String numero; int primo,i; boolean bandera=true; numero=JOptionPane.showInputDialog("Introduce un número entero y positivo"); primo=Integer.parseInt(numero); i=2; while(i<primo&&bandera) { if(primo%i==0) bandera=false;//al cambiar el valor lógico de la bandera permitimos terminar el ciclo anticipadamente i++; } if(bandera)//condición para determinar si es o no primo JOptionPane.showMessageDialog(null,"El numero "+primo+" es primo" ); else JOptionPane.showMessageDialog(null, "El número "+primo+" no es primo"); }//fin del método principal }//fin de la clase MÉTODOS Ejercicio7: Mostrar como en Java se realiza la construcción de métodos estáticos para uso de la clase propia, enseñar el paso de parámetros por valor y su invocación mediante el método principal. import javax.swing.JOptionPane; public class OperacionesBasicasPorValor { static void suma(int numero1,int numero2,int resultado) { M. A. Bruno Ramos Ortiz 30 Ejercicios de la materia de Programación I F.FCCA resultado=numero1+numero2; JOptionPane.showMessageDialog(null,"Numero1="+numero1+"\nNumero2="+numero2+" \nResultado="+resultado); } static int resta(int numero1,int numero2, int resultado) { resultado=numero1-numero2; return resultado; } public static void main(String [] args) { int a=1,b=3,c=0; suma(a,b,c);//invocamos el metodo mediante el pase de parametros por valor JOptionPane.showMessageDialog(null,"Numero1="+a+"\nNumero2="+b+"\nResultado="+ c); c=resta(a,b,c);//invocamos el metodo mediante el paso de parametros por valor pero recuperamos la acción del metodo mediante una operacion de asignacion JOptionPane.showMessageDialog(null,"Numero1="+a+"\nNumero2="+b+"\nResultado="+ c); } } Ejercicio8: Demostrar el funcionamiento de Java al usar métodos por medio del paso por referencia empleando objetos de clases previamente programadas. import javax.swing.JOptionPane; public class OperacionesBasicasPorReferencia { private int numero1,numero2,resultado; //estas variables pertenecen a la clase OperacionesBasicasPorReferencia()//metodo constructor { numero1=10; numero2=5; resultado=numero1*numero2; } M. A. Bruno Ramos Ortiz 31 Ejercicios de la materia de Programación I F.FCCA void suma(OperacionesBasicasPorReferencia aux) { aux.resultado=aux.numero1+aux.numero2; //mediante el objeto aux de la clase OperacionesBasicas, utilizamos todos los componentes que integran la clase } void resta(OperacionesBasicasPorReferencia aux) { aux.resultado=aux.numero1-aux.numero2; } public static void main(String []args) { OperacionesBasicasPorReferencia objeto = new OperacionesBasicasPorReferencia(); //creamos el objeto para poder trabajar tanto con los metodos suma y resta, así como las variables de la clase JOptionPane.showMessageDialog(null,"Los valores iniciales del objeto son:\nNumero1 ="+objeto.numero1+"\nNumero2 ="+objeto.numero2+"\nResultado ="+objeto.resultado); objeto.suma(objeto); JOptionPane.showMessageDialog(null,"Numero1 ="+objeto.numero1+"\nNumero2 ="+objeto.numero2+"\nResultado de la suma ="+objeto.resultado); objeto.resta(objeto); JOptionPane.showMessageDialog(null,"Numero1 ="+objeto.numero1+"\nNumero2 ="+objeto.numero2+"\nResultado de la resta ="+objeto.resultado); } } Ejercicio9: Dar a conocer la gran cantidad de métodos existentes en Java, que el usuario puede emplear con sencillez y eficacia. import javax.swing.JOptionPane; public class MetodosdeJava { public static void main(String []args) { //metodo toHexString, pertenece a la clase Integer y convierte un valor entero a una hexadecimal M. A. Bruno Ramos Ortiz 32 Ejercicios de la materia de Programación I F.FCCA JOptionPane.showMessageDialog(null,"El valor entero 15 es en valor hexadecimal: "+Integer.toHexString(15)); //metodo toBinaryString, pertenece a la clase Integer y convierte un valor entero a un valor binario JOptionPane.showMessageDialog(null,"El valor entero 15 es en valor binario: "+Integer.toBinaryString(15)); //método abs, pertenece a la clase Math y devuelve el valor absoluto de un numero JOptionPane.showMessageDialog(null, "El valor absoluto del número -5.68 es: "+Math.abs(-5.68)); //método max,pertenece a la clase Math y éste regresa el mayor de 2 numeros JOptionPane.showMessageDialog(null,"El mayor entre 5 y 3 es: "+Math.max(3,5)); //método pow,pertence a la clase Math y eleva a la potencia un valor base JOptionPane.showMessageDialog(null,"El valor 2 elevado a la 8 es igual a: "+Math.pow(2,8)); //método ceil,pertenece a la clase Math y redondea un valor al próximo valor superior JOptionPane.showMessageDialog(null,"El valor 2.2 redondeado al valor próximo superior es: "+Math.ceil(2.2)); String nombre1="Ana",nombre2="ana"; //método equals, pertenece a la clase String ycompara dos cadenas de caracteres,devuelve un valor true si son iguales if(nombre1.equalsIgnoreCase("ana")) JOptionPane.showMessageDialog(null,"Son tocayos"); else JOptionPane.showMessageDialog(null,"Tienen nombres diferentes"); //método compareTo,pertenece a la clase String y compara 2 cadenas de caracteres y regresa un valor entero //si es igual 0 las cadenas son iguales, si es positivo el objeto que invoco al metodo es mayor y si es negativo //el objeto que invoco al metodo es menor if(nombre1.compareTo(nombre2)<0) JOptionPane.showMessageDialog(null,nombre1+"es menor que "+nombre2); else if(nombre1.compareTo(nombre2)==0) JOptionPane.showMessageDialog(null,nombre1+"es igual a"+nombre2); else JOptionPane.showMessageDialog(null,nombre1+ "es mayor que "+nombre2); //método length, pertenece a la clase String y devuelve la cantidad de caracteres que conforman la cadena JOptionPane.showMessageDialog(null,"La longitud del nombre Ana es: "+nombre1.length()); //metodo charAt, pertenece a la clase String ydevuelve el caracter según la posición entera que nosotros indiquemos M. A. Bruno Ramos Ortiz 33 Ejercicios de la materia de Programación I F.FCCA JOptionPane.showMessageDialog(null,"El caracter que se encuentra en la posición 0 de Ana es: "+nombre1.charAt(0)); } } Ejercicio10: Usar el concepto de sobrecarga de métodos, cómo el programarlo, usarlo y comprenderlo, mediante la declaración de dos clases, en la primera se construyen los métodos y en una segunda se declaran objetos de la misma y se invocan cada uno de ellos. import javax.swing.JOptionPane; public class DatosPersonales { void imprimir() //primer método de la sobrecarga { JOptionPane.showMessageDialog(null,"Bienvenido a la clase que imprime tus datos"); } void imprimir(String nombre) //segundo método de la sobrecarga { JOptionPane.showMessageDialog(null,"Tu nombre es: "+nombre); } void imprimir(String direccion,int edad, double estatura) //tercer método de la sobrecarga { JOptionPane.showMessageDialog(null,"Vives en: "+direccion+"\nTienes "+edad +"años\n Mides "+estatura); } void imprimir(char sexo, boolean nacionalidad) //último método de la sobrecarga { String auxiliar; if(nacionalidad) auxiliar="Mexicana"; else auxiliar="Extranjera"; JOptionPane.showMessageDialog(null,"Tu sexo es: "+sexo+"\nY tu nacionalidad es: "+auxiliar); } } M. A. Bruno Ramos Ortiz 34 Ejercicios de la materia de Programación I F.FCCA //inicio de la segunda clase en la cual se invocará la sobrecarga de métodos public class PruebaDatosPersonales { public static void main(String []args) { DatosPersonales objeto = new DatosPersonales(); //declaracion del objeto que nos permitirá realizar la sobrecarga de métodos objeto.imprimir("Bruno Ramos Ortiz"); objeto.imprimir(); objeto.imprimir("Hda.Villachuato 92",32,1.70); objeto.imprimir('M',false); } } ARREGLOS Ejercicio11: Utilizar el tipo de dato estructurado llamado arreglo, declarar algunos de ellos y emplearlos a través de una segunda clase para resolver problemas de la vida real. import javax.swing.JOptionPane; public class Arreglos1 { //declaración de la variable y arreglos de la clase private String nombreMateria; private String [] nombresAlumnos; private double [] promediosAlumnos; Arreglos1(int longitud) //declaración del método constructor para inicializar los arreglos de la clase { nombresAlumnos = new String[longitud]; promediosAlumnos = new double[longitud]; } void setInformacion()//método que solicitará la inf. requerida para el programa { String calif; nombreMateria=JOptionPane.showInputDialog("Introduce el nombre de la materia"); for(int i=0;i<nombresAlumnos.length;i++) { nombresAlumnos[i]=JOptionPane.showInputDialog("Nombre del alumno"); M. A. Bruno Ramos Ortiz 35 Ejercicios de la materia de Programación I F.FCCA calif=JOptionPane.showInputDialog("Promedio del alumno"); promediosAlumnos[i]=Double.parseDouble(calif); } } void calcularPromedioSeccion()//método que obtendrá el promedio del grupo, según las calificaciones de los alumnos de la seccion { double promedioSeccion=0.0; for(int i=0; i<promediosAlumnos.length;i++) promedioSeccion+=promediosAlumnos[i]; JOptionPane.showMessageDialog(null,"El promedio de la materia "+nombreMateria+" es: "+(promedioSeccion/promediosAlumnos.length)); } void getInformacion()//método que obtiene los valores almacenados en los arreglos y los muestra a pantalla { String resultado="Listado de promedios finales de alumnos de la materia "+nombreMateria; for(int i=0; i<nombresAlumnos.length;i++) resultado+="\nEl promedio de "+nombresAlumnos[i]+ " es "+ promediosAlumnos[i]; JOptionPane.showMessageDialog(null,resultado); } } //segunda clase que invocará los arreglos declarados en la clase anterior public class PruebaArreglos1 { public static void main(String []args) { Arreglos1 objeto = new Arreglos1(5); objeto.setInformacion(); objeto.calcularPromedioSeccion(); objeto.getInformacion(); } } Ejercicio12: Demostrar el impacto del uso de arreglos de objetos para la administración de información a través de acciones como altas, bajas, modificaciones y consultas. public class Trabajador { M. A. Bruno Ramos Ortiz 36 Ejercicios de la materia de Programación I F.FCCA public String clave,nombre,departamento; public double salario; public void setDatosLaborales(String clave, String nombre, String departamento) { this.clave=clave; this.nombre=nombre; this.departamento=departamento; } public void calcularSalario(double pagoHr, int hrsTrabajadas) { salario=pagoHr*hrsTrabajadas; } public String getDatosLaborales() { return "Clave del empleado "+clave+"\nNombre: "+nombre+"\nDepartamento: "+departamento+"\nSalario: "+salario; } public void limpiarDatosLaborales() { clave=""; nombre=""; departamento=""; salario=-1.0; } } //segunda clase que declara el arreglo de objetos de la clase anterior y los invoca mediante un menú de opciones. import javax.swing.JOptionPane; public class PruebaTrabajador { public static void alta(Trabajador arrayTrabajador[], int indice) { String clave,nombre,dpto; JOptionPane.showMessageDialog(null,"Alta del trabador"+(indice+1)); clave=JOptionPane.showInputDialog("Teclea la clave del trabajador"); nombre=JOptionPane.showInputDialog("Teclea el nombre del trabajador"); M. A. Bruno Ramos Ortiz 37 Ejercicios de la materia de Programación I F.FCCA dpto=JOptionPane.showInputDialog("Teclea el departamento donde labora"); arrayTrabajador[indice].setDatosLaborales(clave, nombre, dpto); JOptionPane.showMessageDialog(null,"El trabajador arrayTrabajador[indice].nombre+" se ha dado de alta"); } "+ public static int buscar(Trabajador arrayTrabajador[], int tamaño) { String busqueda; int index=0; busqueda=JOptionPane.showInputDialog("Escribe la clave del trabajador"); while (index < tamaño && !busqueda.equals(arrayTrabajador[index].clave)) index++; return index; } public static void baja(Trabajador arrayTrabajador[], int indice) { arrayTrabajador[indice].limpiarDatosLaborales(); JOptionPane.showMessageDialog(null,"El trabador se dio de baja"); } public static void imprimir(Trabajador arrayTrabajador[],int indice) { JOptionPane.showMessageDialog(null,arrayTrabajador[indice].getDatosLaborales()); } public static void salario(Trabajador arrayTrabajador[],int indice) { String datoEntrada; double pagoHrs; int hrsLaboradas; datoEntrada=JOptionPane.showInputDialog("Teclea el pago por hora"); pagoHrs=Double.parseDouble(datoEntrada); datoEntrada=JOptionPane.showInputDialog("Teclea la cantidad de horas que trabajo en la quincena"); hrsLaboradas=Integer.parseInt(datoEntrada); arrayTrabajador[indice].calcularSalario(pagoHrs, hrsLaboradas); } public static void main(String []args) { Trabajador arrayTrabajador[]= new Trabajador[10];//declaracion del arreglo de objetos int indice=0,i; M. A. Bruno Ramos Ortiz 38 Ejercicios de la materia de Programación I String opcion; do { opcion=JOptionPane.showInputDialog("Menu Trabajador\n<A>lta\n<B>aja\n<C>onsulta\n<O>btener salario\n<S>alir\nElige opción:"); switch(opcion.charAt(0)) { case 'A': arrayTrabajador[indice]= new Trabajador();//inicializar el objeto alta(arrayTrabajador,indice); indice++; break; case 'B': i = buscar(arrayTrabajador,indice); if (i>=indice) JOptionPane.showMessageDialog(null,"El trabajador no existe"); else baja(arrayTrabajador,i); break; case 'C': i = buscar(arrayTrabajador,indice); if (i>=indice) JOptionPane.showMessageDialog(null,"El trabajador no existe"); else imprimir(arrayTrabajador,i); break; case 'O': i = buscar(arrayTrabajador,indice); if (i>=indice) JOptionPane.showMessageDialog(null,"El trabajador no existe"); else salario(arrayTrabajador,i); break; case 'S': JOptionPane.showMessageDialog(null,"Hasta luego"); } } while(opcion.charAt(0)!='S'); } F.FCCA una } M. A. Bruno Ramos Ortiz 39 Ejercicios de la materia de Programación I F.FCCA HERENCIA Ejercicio13: Enseñar el empleo de la herencia en Java para obtener sus beneficios, en el ejercicio se declara una superclase de la cual se heredarán dos clases derivadas añadiéndoles tanto sus atributos como métodos propios, los cuales se comprueban en una última clase en donde se declaran y crean un par de objetos, uno de cada clase para hacer efectivo las propiedades de las mismas. import javax.swing.JOptionPane; //superclase del árbol de herencia public class Miembro_Facultad { private String identificador,nombre,direccion,sexo; private int edad; //constructor de la superclase, en donde se inicializan las variables public Miembro_Facultad() { identificador="040011-84"; nombre="Bruno Ramos Ortiz"; direccion="Hacienda Villachuato 92"; sexo="Masculino"; edad=31; } //método que solicitará de manera dinámica la captura de los datos del miembro de la facultad public void setDatos() { identificador=JOptionPane.showInputDialog("Introduce el identificador del integrante de la facultad: "); nombre=JOptionPane.showInputDialog("Introduce el nombre completo: "); direccion=JOptionPane.showInputDialog("Introduce su dirección: "); sexo=JOptionPane.showInputDialog("Introduce su sexo:"); edad=Integer.parseInt(JOptionPane.showInputDialog("Introduce la edad:")); } //método que mostrará toda la información relacionada con el miembro public String getDatos() { return "\nNombre del integrante: " + nombre + "\nIdentificador: " + identificador +"\nDirección: " + direccion + "\nSexo: " + sexo + "\nEdad: " + edad; } } M. A. Bruno Ramos Ortiz 40 Ejercicios de la materia de Programación I F.FCCA import javax.swing.JOptionPane; //clase derivada que agrega sus propios atributos y metodos public class Empleado extends Miembro_Facultad { private String profesion, puesto; private double salario; public Empleado() { super();//sentecia que invoca al contructor de la superclase para después inicializar las variables de la clase profesion="Licenciado en Informática"; puesto="Profesor"; salario=40*92.60; //se multiplica las horas a la semana por el pago de la hora } public void setDatos() { super.setDatos(); //invocación del método de la superclase que solicita los datos previos profesion=JOptionPane.showInputDialog("Introduce la profesión del empleado: "); puesto = JOptionPane.showInputDialog("Selecciona de las siguientes opciones el puesto del empleado, escribiéndolo: \nAdministrativo\nAcademico"); } public String getDatos() { return super.getDatos()+ "\nProfesión "+puesto+"\nSalario quincenal: "+salario; } del empleado: "+profesion+"\nPuesto: //método que obtiene el cálculo del salario del empleado según su puesto public void calcularSalario() { int horas; if(puesto.equalsIgnoreCase("Administrativo")) //el método equals compara el contenido de los cadenas si son iguales regresa true en caso contrario false salario=6500;//se establece un salario fijo quincenal según tabulador else if(puesto.equalsIgnoreCase("Académico")) //si es académico se solicitarán las horas de clase a la quincena { M. A. Bruno Ramos Ortiz 41 Ejercicios de la materia de Programación I F.FCCA horas=Integer.parseInt(JOptionPane.showInputDialog("Teclea las horas clases dadas a la quincena:")); salario=horas*92.60; } else JOptionPane.showMessageDialog(null,"El puesto del empleado es incorrecto"); } } import javax.swing.JOptionPane; //clase derivada que agrega sus propios atributos y métodos public class Alumno extends Miembro_Facultad { private int seccion, semestre; private double promedio; public Alumno() { super();//sentencia que invoca al constructor de la superclase para después inicializar las variables de la clase seccion=44; semestre=5; promedio=0.0; } //método que solicita la información del alumno más la información de la clase Miembro_Facultad public void setDatos() { super.setDatos(); //invocación del método de la superclase que solicita los datos previos seccion=Integer.parseInt(JOptionPane.showInputDialog("Introduce la sección del alumno: ")); semestre=Integer.parseInt(JOptionPane.showInputDialog("Introduce el semestre: ")); } //método que regresa los datos relacionados con el alumon public String getDatos() { return super.getDatos()+ "\nSección: "+semestre+"\nPromedio semestral: "+promedio; } M. A. Bruno Ramos Ortiz "+seccion+"\nSemestre: 42 Ejercicios de la materia de Programación I F.FCCA //método que obtiene el cálculo del promedio semestral del alumno public void calcularPromedio() { int cantidad_mat; double []calif_materias; //declaración del arreglo que guardará las calificaciones del semestre cantidad_mat=Integer.parseInt(JOptionPane.showInputDialog("Escribe la cantidad de materias que llevo en el semestre: ")); calif_materias=new double[cantidad_mat]; //creación del arreglo con el tamaño de las materias que cursó el alumno //ciclo que obtiene cada una de las calificaciones del alumno y las almacena en el arreglo for (int i=0; i<calif_materias.length;i++) calif_materias[i]=Double.parseDouble(JOptionPane.showInputDialog("Calificación materia "+(i+1))); //ciclo que hace la sumatoria total de las calificaciones del alumno for (int i=0; i<calif_materias.length;i++) promedio=promedio+calif_materias[i]; promedio=promedio/calif_materias.length; } } import javax.swing.JOptionPane; //última clase en la cual se declaran los objetos de las clases derivadas public class prueba_herencia { public static void main (String [] args) { Alumno bruno = new Alumno();//objeto que empleará los métodos de la clase Alumno bruno.setDatos(); bruno.calcularPromedio(); JOptionPane.showMessageDialog(null, bruno.getDatos()); Empleado ross = new Empleado();//objeto que usará los métodos de la clase Empleado ross.setDatos(); ross.calcularSalario(); JOptionPane.showMessageDialog(null, ross.getDatos()); } } M. A. Bruno Ramos Ortiz 43 Ejercicios de la materia de Programación I F.FCCA POLIMORFISMO Ejercicio14: Vincular las ventajas del polimorfismo mediante clases y métodos abstractos que posteriormente nos permitirán generar las implementaciones de clases derivadas, se concluye con una clase de prueba para verificar su uso. //clase abstracta que dará la base del polimorfismo abstract public class Objeto_Geometrico { public double altura,base,lado; abstract public double Calcular_Area(); abstract public double Calcular_Perimetro(); } //clase derivada en la cual se implementa el polimorfismo public class Cuadrado extends Objeto_Geometrico { public Cuadrado(double a) { lado = a; } public double Calcular_Area() { return lado*lado; } public double Calcular_Perimetro() { return lado*4; } } //clase derivada en la cual se implementa el polimorfismo public class Triangulo extends Objeto_Geometrico { public Triangulo(double a, double b) { altura = a; base = b; } public double Calcular_Area() { return (base*altura)/2; } M. A. Bruno Ramos Ortiz 44 Ejercicios de la materia de Programación I F.FCCA public double Calcular_Perimetro() { return base*3; } } import javax.swing.*; public class Prueba { public static void main(String[] args) { String resultado; Triangulo triangulo = new Triangulo(13.5,6.7); Cuadrado cuadrado = new Cuadrado(12.3); resultado= "ÁREAS"+"\nTriangulo: "+triangulo.Calcular_Area(); resultado+="\nCuadrado: "+ cuadrado.Calcular_Area(); resultado+="\n\nPERIMETROS"+"\nTriángulo: "+ triangulo.Calcular_Perimetro(); resultado+="\nCuadrado: "+cuadrado.Calcular_Perimetro(); JOptionPane.showMessageDialog(null,resultado); System.exit(0); } } M. A. Bruno Ramos Ortiz 45