República Bolivariana de Venezuela Ministerio del Poder Popular para la Educación Universitaria Instituto Universitario de Tecnología de Cumaná Departamento de Informática Cumaná – Estado Sucre Objetivo 2.- Desarrollo de Programas usando la estructura general de un lenguaje de Programación Orientado a Objetos Recopilado por: Ing. Leonardo Malavé MSc Unidad Curricular: Programación Orientada Objetos Semestre: IV Sección: Única Cumaná, Agosto 2010 a El desarrollo de programas usando cualquier lenguaje de programación necesita de parámetros o lineamientos bien definidos que van desde la forma principal de un programa hasta como manejar arreglos unidimensionales y de diferentes dimensiones. Aquí desarrollaremos los siguientes ítems: • Estructura General de un programa realizado en JAVA • Tipos de datos manejados por JAVA • Sentencias de Lectura y Escritura • Sentencias de Control I (Estructuras de Decisión) • Sentencias de Control II (Estructuras de Repetición) • Métodos I (Generalidades) • Métodos II (Uso de ellos) • Arreglos I (Generalidades) • Arreglos II (Unidimensionales) • Arreglos III (Bidimensionales) Estructura General de un Programa desarrollados en JAVA Cuando se habla de las generalidades se entiende por los elementos esenciales y que contiene un programa desarrollado en JAVA, para mostrarlos, definirlos y ejemplificarlos tomaré el siguiente ejemplo: import java.io.*; (a) import java.lang.*; (b) class Ambito (1) { public static void main (String args[]) (2) { int x; (3) x = 10; (4) if(x==10) (5) { int y=20; (3) System.out.println(“x e y:”+ x + “ “ + y); (6) x = y * 2; (7) } System.out.println(“ x es:” + x); } } (a) (b) Todo programa de Java debería de tener las importaciones de los paquetes necesarios para su normal desarrollo, en este ejemplo se importan los paquetes java.io y sus subsecuentes paquetes al igual que java.lang y sus subsecuentes paquetes, a veces se pueden obviar cuando estos paquetes forman parte esencial y elemental del programa. (1) Todo programa de Java debe contener la clase principal para poder trabajar dicho programa. En el caso del programa principal el nombre de la clase y el archivo de extensión java deben de poseer el mismo nombre. En nuestro ejemplo la clase principal se denomina Ambito, por lo tanto deberá existir un programa físico denominado Ambito.java. (2) Debe seguirse con el método main que indica que es el programa principal. En este caso se debe considerar que: public static void main (String args[]) , en donde public indica el ámbito del método static indica si el método puede invocarse sin instanciarse previamente void indica que no devolverá ningún valor. Los argumentos en este caso son de tipo String. (3) Todo programa de Java debería contener declaraciones de tipos datos que van usarse en un determinado programa, esa declaración comienza con el tipo de dato y luego el identificador que representa el nombre de la variable o constante definida previamente. En nuestro ejemplo se definió una variable denominada x de tipo int y también una variable y de tipo entero y se le asignó el valor 20. (4) Como se indicó previamente luego de una declaración de una variable o constante se debería inicializarse dicha variable o asignársele un valor de acuerdo a su tipo de dato definido previamente. En nuestro caso x se le asigna un valor de 10. (5) Como se indicó previamente luego de una declaración de una variable o constante se debería inicializarse o asignársele un valor de acuerdo a su tipo de dato definido previamente. En nuestro caso x se le asigna un valor de 10. (6) Para desplegar ya sea mensajes de texto encerrado entre comillas doble o mostrar el valor de una determinada variable o constante, se utiliza esta sentencia ya sea en esta versión que luego de mostrar dicho valor inmediatamente se System.out.print desplaza que solo a la imprime línea el siguiente valor sin o la versión inmediatamente posicionarse en la línea siguiente. (7) Aquí se presenta la asignación de un valor de la variable x derivado de una operación aritmética previa. Algo que debe tomarse muy en consideración es el hecho de debe existir una identación acorde como también percatarse del abrir y cerrar llaves que indica el comienzo y final de un bloque del programa. Veamos otros elementos que se consideran esenciales: • Operadores Aritméticos: Operador Resultado + Suma - Resta * Multiplicación / División • • % Módulo ++ Incremento += Suma y asignación -= Resta y asignación *= Multiplicación y asignación /= División y asignación %= Módulo y asignación -- Decremento Operadores Relacionales: Operador Resultado == Igual a != Distinto de > Mayor que < Menor que >= Mayor o igual a <= Menor o igual a Operadores Lógicos Booleanos Operador Resultado & AND lógico | OR lógico ^ XOR lógico (OR exclusivo) || OR en cortocircuito && AND en cortocircuito ! NOT lógico unario &= Asignación AND |= Asignación OR ^= Asignación XOR == Igual a != Distinto de ?: If-then-else ternario Tipos de Datos en JAVA Java define ocho (8) tipos simples o elementales de datos: byte, short, int, long, char, float, double y bolean, que se pueden agrupar en cuatro grupos: • Enteros: En este grupo se incluye byte, short, int y long, para números con signos. • Números en coma flotante: Este grupo incluye float y double, que representan números con precisión decimal. • Caracteres: Este grupo incluye el tipo char, que representa símbolos en un conjunto de caracteres, como letras y números. • Booleano: Este grupo incluye bolean, que es un tipo especial para representar los valores verdadero/falso. • Nombre Enteros Anchura Rango Descripción -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 Adecuado para cuando el en bits long 64 tipo int no es suficiente largo para almacenar un determinado muy valor. amplio, números útil muy Es para grandes. Posee signo int 32 -2.147.483.648 a 2.147.483.647 Es el tipo más usado. Empleado para cálculos, control de ciclos e índices de arreglos. Posee signo short 16 -32.768 a 32.767 Es el menos usado en Java. Posee signo byte 8 -128 a 127 Útil para manejo de flujos provenientes de archivos o de la red. Útil para trabajar con datos binarios • Nombre Números con coma flotante Anchura Rango Descripción 1.7e-308 a 1.7e+308 Adecuado para cuando se necesita almacenar y en bits double > 64 a su vez mantener la exactitud en cálculos iterativos o cuando se trabajan con números demasiados grandes. float > 32 -3.4e-038 a 3.4e+038 Es el tipo más usado. Empleado para cálculos, control de ciclos e índices de arreglos. Posee signo • Nombre Caracteres Anchura Rango Descripción 0 a 127 / 0 a 255 Almacenamiento de caracteres usando UNICODE en bits char 16 para su representación. • Nombre Booleano Anchura Rango Descripción S/D Almacenamiento de valores trae o false, se usa en bits char S/D para trabajar o evaluar expresiones de este tipo. Promoción de Tipos de Datos: Existen dos tipos la automática y la forzada o cast. La primera se da cuando el molde de dato a recibir es más grande que los datos orígenes. En el segundo caso se da cuando el molde dato a recibir es más pequeño que los datos orígenes, por tanto se antepone a los datos orígenes entre paréntesis el tipo de dato que se piensa convertir y se hace la conversión. Sentencias de Entrada y Salida Estas sentencias son las que permiten entrada de datos y su respectiva visualización por pantalla. En este objetivo manejaremos el System.in.read() considerando entrada de un carácter por vez, lo cual se asocia una variable a este método. En cuanto a las sentencias para visualizar por pantalla se tiene el System.out.print y System.out.println. Ambas imprimen valores de las variables pero también si algo esta encerrado en comillas dobles se mostrará por pantalla. La diferencia entre el primero y el segundo es simplemente que el segundo después de imprimir o visualizar el contenido de una variable se posiciona luego en la siguiente línea, cosa totalmente opuesta que hace la primera opción. Sentencias de Control I (Estructuras de Decisión) • If • If..Else • Switch El if permite la bifurcación del código derivado de la evaluación de una expresión condicional, cuando es simple si la expresión evaluada es verdadera se realiza la acción o las acciones correspondientes, en su versión if..else permite que si la evaluación de la expresión es verdadera se realiza las acciones correspondientes de lo contrario se ejecutarán otras acciones que debería ser totalmente diferentes a las cuando la expresión es verdadera. En el caso del Switch, se utiliza con la idea de cuanto la variable evaluada arrojará múltiples valores y todos ellos conllevan a acciones diferentes, tomando también en consideración que puede haber una opción por defecto cuando es la última opción que no amerita ser evaluada. Sentencias de Control II (Estructuras de Repetición) • While • Do..While • For Como sabemos las estructuras de repetición permiten por un lapso definido o no la ejecución de sentencias o acciones que estén englobadas o encerradas entre ellas. A la final la decisión de usar una sentencia o estructura de control repetitivo quedará a criterio del programador, el cual basado en el análisis del problema a desarrollar se inclinará por una estructura en particular. Comentemos en forma breve cada una de ellas: • While: Es una estructura cerrada que permite la repetición definida o no de antemano la ejecución de una o varias acciones que ella englobe. Su funcionamiento radica en la evaluación en primer lugar de la condición de control del ciclo, si el resultado de dicha evaluación es verdadera se procederá a ejecutar las acciones que ella encierra, en caso contrario se sale del ciclo o no lo ejecuta dependiendo cual sea el caso. • Do..While: Es una estructura abierta, cerrada que permite aunque sea una vez la ejecución de las acciones que encierra y luego permite la validación que deberá ser verdadera para seguir funcionando. Esta estructura en comparación con la anterior es más débil en el sentido de que • For: Es una estructura cerrada, pero muy sólida en el sentido de que posee tres momentos a saber: (a) La inicialización y/o comienzo del ciclo que marca el inicio del mismo (b) La condición que rige el ciclo y que permitirá en algún momento su parada (c) Aumento o decremento de la variable que se inicializó en el primer momento y que es controlada en el segundo momento. Esta estructura es la más popular por ser sencilla de implementar y a su vez por tener esos momentos descritos que han constituido su solidez y robustez a la hora de programar. Métodos (I) Una definición acorde a métodos serían que son un cuerpo de programa independiente el cual tiene un tipo de dato asociado, un identificador, una serie de parámetros (si es el caso) y que podrían retornar un valor o no después de haberse ejecutado. El detalle del asunto radica que su uso facilita de muchas maneras la ejecución de nuestro programa como también su mantenimiento debido a que como es un cuerpo independiente del programa principal su mantenimiento es más sencillo y por lo tanto más hace que la eficacia de nuestro programa sea aún mayor. Una sintaxis adecuada sería la siguiente: Tipo de dato identificador (lista de parámetros) { Acciones; return valor o variable; } Ejemplo: double promedio (int a, int b) { float prom=0.00; prom = (a+b) / 2; return prom; } Métodos (II) Como lo mencioné anteriormente, los métodos de acuerdo a su comportamiento o acción pueden o no aceptar parámetros como también pueden o no devolver valores, por lo tanto eso da pié a la siguiente clasificación: a) Teniendo parámetros y no devuelven valor b) Teniendo parámetros y devuelven valor c) Sin tener parámetros y devuelven valor d) Sin tener parámetros y no devuelven valor En el caso a) el método tiene una lista de parámetros realiza sus acciones correspondientes y no devuelve valor alguno, por tanto este método dentro de sus acciones tendrá contemplado una línea que permitirá visualizar el resultado o los resultados de las acciones emprendidas por el método. Un ejemplo sería el siguiente: void promedio (int valora, int valor b) { float prom=0.00; prom = (a+b) / 2; System.out.println(“El valor promedio es:”+prom); } En el caso b) el método tiene una lista de parámetros realiza sus acciones correspondientes y devuelve un valor, por tanto en el programa principal deberá haber una línea en donde se invoque el método y que contenga una variable que sirva de recipiente para el valor que devolverá el método. Un ejemplo sería el siguiente: float promedio (int valora, int valor b) { float prom=0.00; prom = (a+b) / 2; return prom; } En el caso c) el método no tiene parámetros pero realiza sus acciones correspondientes y devuelve un valor, por tanto en el programa principal deberá haber una línea en donde se invoque el método y que contenga una variable que sirva de recipiente para el valor que devolverá el método. Un ejemplo sería el siguiente: float promedio ( ) { float prom=0.00; int a= 10, b=5; prom = (a+b) / 2; return prom; } En el caso d) el método no tiene parámetros pero realiza sus acciones correspondientes y no devuelve un valor, por tanto en el programa principal deberá haber una línea en donde se invoque el método. Un ejemplo sería el siguiente: float promedio ( ) { float prom=0.00; int a= 10, b=5; prom = (a+b) / 2; System.out.println(“El valor promedio es:”+prom); } Arreglos (I) Es una colección finita de datos del mismo tipo y que permite almacenar en forma lineal dichos datos. En todos o en la mayoría de los lenguajes de programación existen arreglos, lo cual han facilitado el trabajo del programador en muchos sentidos, porque disminuyen el uso de muchas variables debido a que una sola se resume la declaración de varias. Arreglos (II) Hay arreglos denominados unidimensionales que como se definen poseen una sola dimensión, conocidos también como vectores los cuales permiten almacenar en forma lineal o gradual varios tipos de valores del mismo tipo. Podemos tomar en consideración los siguientes elementos esenciales: • Declaración: int vector [ ] = new int [100]; • Lectura: for(i=0; i<=99; i++) { vector[i] = System.in.read(); } • Escritura: for(i=0; i<=99; i++) { System.out.println(vector[i]); } Arreglos (III) Hay otros tipos de arreglos denominados bidimensionales que como se definen poseen dos dimensiones, conocidos también como matrices o tablas al igual que los vectores, permiten almacenar en forma lineal o gradual varios tipos de valores del mismo tipo pero trabajando con una ubicación determinada por la intersección entre una fila y una columna. Podemos tomar en consideración los siguientes elementos esenciales: • Declaración: int matriz [ ] [ ] = new int [100] [100]; • Lectura: for(i=0; i<=99; i++) { for(j=0; j<=99; j++) { matriz[i][j] = System.in.read(); } } • Escritura: for(i=0; i<=99; i++) { for(j=0; j<=99; j++) { System.out.println(matriz[i][j]); } }