Mostrando las entradas con la etiqueta Bytecodes. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Bytecodes. Mostrar todas las entradas

6 de marzo de 2017

Ejercicios selectos (transición).

  1. Investigue más acerca del concepto de máquina virtual y de los bytecodes ¿Fue Java el primer lenguaje de programación en incorporar dichos conceptos?
  2. Para el programa del Ejemplo Bienvenido2 pruebe lo que sucede si elimina el espacio que aparece al final de la cadena Bienvenid@. No olvide volver a compilar.
  3. Considere el Ejemplo Bienvenido3 e investigue qué otras secuencias de escape existen, también infórmese si dichas secuencias coinciden o no con las que se utilizan en el lenguaje de programación C.
  4. En base a lo expuesto para el Ejemplo Bienvenido4 investigue qué otros especificadores de formato existen. Infórmese también si dichos especificadores coinciden o no con los que se utilizan en el lenguaje de programación C.
  5. Escriba un programa que imprima en la salida estándar su nombre (el nombre del lector). El nombre o nombres deberá aparecer en el primer renglón, el primer apellido en el segundo renglón y el segundo apellido en el tercer renglón.
  6. Utilice el Ejemplo Lectura y cambie la clase Integer por el tipo primitivo int. Compruebe si es necesario o no hacer algún otro tipo de cambio para que el programa funcione.
  7. En base a lo descrito en el Ejemplo Lectura modifique dicho ejemplo para agregar las cuatro operaciones aritméticas: suma, resta multiplicación y división. Los operadores aritméticos son los tradicionales: +, -, * y /. Realice lo anterior para números enteros representados como objetos (Integer), y como tipos de datos primitivos.
  8. Modifique el Ejemplo Lectura para procesar ahora números Float y Double. Tome en cuenta que deberá consultar el API para cambiar el método nextInt por el método apropiado. Investigue también si existen los tipos de datos primitivos correspondientes (float y double).
  9. Con base en lo descrito en el Ejemplo Lectura, modifique dicho ejemplo para que solicite al usuario su nombre completo. Tome en cuenta que deberá leer tres cadenas como se describe a continuación, y que su programa deberá imprimir el nombre completo por apellidos en una sola línea:
    1. Su nombre o nombres.
    2. Su primer apellido.
    3. Su segundo apellido

 10. Para el Ejemplo If, ¿qué sucede si cambia la estructura de selección if por if-else? ¿Se obtiene el mismo funcionamiento? Si cambia el funcionamiento, ¿por qué? Determine su respuesta y después corroborela haciendo los cambios correspondientes. No olvide volver a compilar.

 11. Escriba un programa que presente un menú con las cuatro operaciones aritméticas y una opción para salir. Su programa deberá procesar la opción y realizar la operación correspondiente, así como mantenerse repitiendo el menú hasta que se proporcione la opción de "Salir". Investigue también si el lenguaje Java incorpora una estructura de selección múltiple (switch) como la del lenguaje C. Para este ejercicio, basta con utilizar una estructura if-else anidada. El menú deberá ser como se describe a continuación:

  • Suma.
  • Resta.
  • Multiplicación.
  • División
  • Salir.

 12. Modifique el Ejemplo Arreglo para que, utilizando el procesamiento de argumentos en la línea de comandos como el que se hizo en el Ejemplo MainArgs acepte tres argumentos. Su programa deberá generar un arreglo de n enteros con un valor inicial para el primer elemento y un incremento para los demás. Observe que los elementos de args son cadenas, por lo que tendrá que consultar el API para utilizar métodos de conversión de cadenas a números enteros.

Sugerencia: consulte el método parseInt de la clase Integer. Los argumentos a procesar en la línea de comandos son:

  • Tamaño del arreglo (n).
  • Valor inicial (valor).
  • Incremento (incremento).

 13. Siguiendo la idea del ejercicio anterior, escriba un programa que procese el tamaño (n) de un arreglo desde la línea de comandos y:

  • Genere un arreglo de enteros de tamaño n.
  • Solicite y almacene n enteros en el arreglo.
  • Determine, haciendo un recorrido del arreglo, el número mayor.
  • Determine, haciendo un recorrido del arreglo, el número menor.
  • Determine, haciendo un recorrido del arreglo, el promedio (media aritmética).
  • Determine, haciendo un recorrido del arreglo, la moda (el número que más veces aparece).
  • Determine, haciendo un recorrido del arreglo, si un número determinado está o no en el arreglo (búsqueda lineal).

 14. Consulte al menos la entrada Excepciones para introducirse en el tema y ampliar un poco más su conocimiento respecto al uso y manejo básico de excepciones en Java.
 15. Considere el Ejemplo Coleccion. Investigue en el API las colecciones, particularmente la colección ArrayList y determine el funcionamiento del programa antes de compilarlo y ejecutarlo en la máquina virtual de Java. Compruebe su deducción respecto al funcionamiento con la salida real del programa. 


Un vistazo al lenguaje Java.

   El lenguaje de programación Java (Java es una marca registrada de Oracle Corporation) es amado por muchos y odiado por otros y no participaré en un debate estéril y ocioso. Sólo diré que, como casi todo en la vida, Java tiene sus ventajas y desventajas; lo que es innegable es que es un lenguaje de programación ampliamente difundido y utilizado y en ese sentido, resulta importante conocerlo y familiarizarse con él, independientemente de las posturas ideológicas y preferencias personales.

   Esta entrada del blog no es un tratado del lenguaje; es más, ni siquiera se acerca a un resumen, es más bien un compendio de referencia a la mano para el lector familiarizado con algún lenguaje de programación.

   La referencia obligada para esta entrada y para todo el blog en general es el API (Application Programming Interface) correspondiente a la versión 8 del lenguaje.

Orígenes y características.
   Java es un lenguaje de programación originalmente desarrollado por James Gosling cuando trabajaba en la desaparecida empresa Sun Microsystems, la cual fue adquirida por Oracle Corporation en el año 2009.
 
   El lenguaje fue publicado oficialmente en 1995 y deriva su sintaxis de C y C++; sin embargo, cuenta con menos facilidades de bajo nivel que cualquiera de ellos. Por otro lado, las aplicaciones o programas de Java son generalmente compiladas a bytecodes, los cuales pueden procesarse en cualquier máquina virtual Java (JVM) sin importar la arquitectura de la computadora, permitiendo así una mayor portabilidad del software entre plataformas.
 
   Java es un lenguaje de programación de propósito general, concurrente, basado en clases, y orientado a objetos, diseñado específicamente para tener tan pocas dependencias de implementación como fuera posible. Su intención es permitir que los desarrolladores de aplicaciones escriban el programa una vez, y lo ejecuten en cualquier dispositivo (WORA - Write Once, Run Anywhere).

Estructura general de una clase.
   La estructura general de la definición de una clase en Java es como la que se muestra en el Ejemplo EstructuraJava.

   Las líneas 1-5 muestran el uso de comentarios, se recomienda ampliamente iniciar la definición de cada clase con un comentario que describa el propósito de la clase. También es posible definir comentarios de la forma que se muestra en las líneas 10, 13, 17, y 18.

   La línea 6 muestra la definición de paquetes. Un paquete es un conjunto de clases relacionadas y la palabra reservada package, especifica a qué paquete pertenecen todas las clases definidas en el archivo fuente.

   En Java es posible definir más de una clase por archivo pero sólo una de ellas puede ser pública, y su nombre (identificador) debe corresponder con el nombre del archivo que la contiene. Para el caso del ejemplo anterior, el nombre de la clase es EstructuraJava y el del archivo EstructuraJava.java.

   La línea 7 muestra la importación de clases. Las clases se encuentran ubicadas en paquetes dentro del API, y cuando una clase utiliza alguna clase definida en algún otro paquete, ésto se especifica con la palabra reservada import.

   Las clases se definen por medio de la cláusula class y un identificador. En general, Java define tres niveles de acceso:
  1. public (público) hace que una clase, método o atributo sea accesible para cualquier otra clase.
  2. protected (protegido) hace a un método o atributo accesible únicamente por las clases del mismo paquete, o por subclases de la clase.
  3. private (privado) hace a un método o atributo accesible únicamente desde su propia clase.
   La línea 11 muestra la definición de atributos, los cuales están compuestos por un identificador para el objeto (objeto), y el nombre de la clase de la que se derivará o instanciará. La definición de todos los atributos necesarios para la clase, siguen la misma estructura.

   Las líneas 14-15 muestran la definición de constructores. En la instanciación o generación de nuevos objetos, los objetos se construyen, por lo que no es posible crear un nuevo objeto sin un constructor. Un constructor es el código que se procesa cuando se crea un objeto a través de la cláusula new. La construcción de un objeto es un mecanismo mucho más elaborado del que aquí se describe, pero la explicación a detalle queda fuera de los alcances de esta entrada, y con la generalidad que se ha comentado antes, basta por ahora.

   Finalmente, las líneas 19-20 muestran la definición de métodos. Los métodos siguen los niveles de acceso descritos con anterioridad, pueden o no regresar un objeto de alguna clase (ClaseR) o un tipo de dato primitivo; y puede haber tantos como servicios quiera proporcionar la clase que los define.

Bienvenid@ a Java.
   El Ejemplo Bienvenido1 muestra el primer programa en Java que se describirá. La línea 5 del ejemplo muestra el punto de entrada de cualquier programa en Java: el método main, éste método siempre tendrá la forma que se muestra, la cual se conoce en general como la firma del método. La explicación y los detalles de args se revisará en los Ejemplos selectos de transición.

   En Java sólo es posible enviar mensajes a objetos que definan métodos públicos; sin embargo, la clase Bienvenido1 establece que su método main es static, lo cual quiere decir que puede ser invocado (llamado) sin una instancia específica u objeto que lo reciba. De hecho ésto es un mecanismo que utiliza Java para poder generar clases de utilerías o servicios sin embargo su uso debería ser minimizado, ya que se incurre en el estilo de la programación estructurada al utilizar dichas clases como bibliotecas de funciones.

   Finalmente, la forma más común de imprimir mensajes en la salida estándar (pantalla), es la que aparece en la línea 6 del Ejemplo Bienvenido1. System es una clase de servicios que tiene Java, y entre dichos servicios está el método println del objeto out, el cual recibe como argumento un objeto que representa una cadena (String), y lo envía a la salida estándar imprimiendo un salto de línea al final. La salida del Ejemplo Bienvenido1 se muestra en la siguiente figura:

Salida del Ejemplo Bienvenido1.

   Una versión ligeramente modificada del Ejemplo Bienvenido1 se muestra en el Ejemplo Bienvenido2.

   Observe ahora que en la línea 6 se ha cambiado el método println por el método print. Este último hace lo mismo que el método println con la diferencia de que el método print no imprime un salto de línea al final, de ahí que se haya dejado un espacio al final de la cadena Bienvenid@. La salida del Ejemplo Bienvenido2 es idéntica a la del Ejemplo Bienvenido1.

   Un tercera variación del Ejemplo Bienvenido1 se muestra en el Ejemplo Bienvenido3, el cual muestra el uso de la secuencia de escape \n para introducir un salto de línea en cualquier parte de la cadena que se desea imprimir. La salida del Ejemplo Bienvenido3 se muestra en la siguiente figura:

Salida del Ejemplo Bienvenido 3.

   Finalmente se presenta el Ejemplo Bienvenido4, el cual hace uso de la función printf para imprimir un mensaje en la pantalla. Aquellos lectores que estén familiarizados con el lenguaje de programación C se sentirán cómodos utilizando dicha función.

   Sin entrar mucho en detalles, sólo se indicará que %s es un especificador de formato que le indica a la función printf que imprima una cadena, misma que tomará después de la primera coma (,). Es importante señalar que por cada especificador de formato (tres en el ejemplo) debe existir su correspondiente cadena. La salida del Ejemplo Bienvenido4 es idéntica a la salida del Ejemplo Bienvenido3.

Compilación.
   Existen diferentes entornos de programación o (IDE - Integrated Development Environment) que pueden ser utilizados para desarrollar programas en Java, tales como JavaBeans, JCreator, Eclipse, etc., se recomienda al lector buscar y familiarizarse con alguno de ellos o con algún otro IDE que sea de su preferencia.

   Esta sección describe muy brevemente los pasos para la compilación desde la línea de comandos, ya que los programas de ejemplo de todo el blog pueden ser visualizados y editados en cualquier editor de texto, y compilados con el compilador de Java (javac) sin necesidad de un IDE. Es importante aclarar que se asume que se tiene instalado el jdk (java development kit). Si tiene dudas al respecto, consulte los detalles de instalación del jdk en la página oficial de Java.

   Para saber la versión de Java que tiene instalada, puede escribir desde la línea de comandos:

   $ javac -version

   Lo que deberá aparecer en su pantalla es la versión correspondiente del compilador; si aparece un mensaje distinto, es probable que no tenga instalado el jdk o que las rutas de acceso no sean las correctas.

   Para compilar el programa del Ejemplo Bienvenido1 (descrito en párrafos anteriores), tiene que escribir:

   $ javac Bienvenido1.java

   Cuando un programa se compila siguiendo la idea planteada, se buscarán todas las clases requeridas dentro del directorio de trabajo actual, mismo que corresponde al directorio en donde se haya ejecutado el compilador de Java. Si alguna clase tuviera algún problema, se reportará dicha situación antes de volver a visualizar el símbolo del sistema ($); en otro caso, se visualiza de manera casi inmediata el símbolo del sistema y observará que se han creado nuevos archivos, los cuales corresponden a los nombres de las clases pero con extensión class, mismos que representan los bytecodes que interpreta la máquina virtual de Java.

   La máquina virtual de Java o JVM es la encargada de interpretar y procesar los bytecodes que representan las instrucciones del programa compilado. La JVM está representada por el programa java, por lo que, para ejecutar un programa en Java, se debe proporcionar a la JVM la clase principal, la cual es la que contiene el método main:

   $ java Bienvenido1

   La salida del comando anterior, debería ser el mensaje presentado en la siguiente figura:

Salida esperada después de compilar y ejecutar el Ejemplo Bienvenido1.