CONTENIDO CONCEPTUALIZACION...3 1. LA CLASE ...3 2. LOS ATRIBUTOS ...8 3. LOS MÉTODOS ...11 3.1 Parámetros:...13 3.2 Tipos de Parámetros:...14 4. Encapsulado ...14
LA IMPLEMENTACION DE LOS MÉTODOS Y LA INSTANCIAS DE LAS CLASES...23
ASIGNACIÓN :...23 Asignación Directa:...23 Asignación Indirecta : ...23 2. ESTRUCTURAS CONDICIONALES:...27 3. INSTANCIANDO CLASES...45 CICLOS Y ARREGLOS ...55 1. CICLO FOR ...55 2. CICLO WHILE...56 3. ARREGLOS...59
INTRODUCCION
En el ámbito de la ingeniería de sistemas, la programación es una herramienta primordial, debido a esto es indispensable que el estudiante de ingeniería tenga sólidas bases de pensamiento lógico computacional que le permita en futuros cursos desempeñarse eficientemente, para ello tiene que comprender la forma como se resuelven problemas reales a través de la aplicación de los objetos. Además comprender todos los datos y operaciones implícitas y explicitas que se plantean en un problema y que son necesarios para su solución.
En este curso se llevará a la práctica los conceptos teóricos fundamentales de programación utilizando como herramienta un lenguaje de programación como Java y la técnica de programación orientada a objetos. El estudiante afianzando los conocimientos de la lógica computacional debido a que realizará programas en el computador iniciando el ciclo de cursos de desarrollo de software.
CONCEPTUALIZACION
La programación orientada a objetos es una técnica que permite optimizar los recursos usados en el desarrollo de un software, que satisface una necesidad, utilizando en el modelamiento de los problemas una herramienta de diseño llamadas clases, haciendo énfasis en el problema en general para resolverlo de manera particular para una mejor eficiencia y mantenimiento futuro.
Hay que resaltar que la base de esta programación es el proceso de diseño, que permite modelar la posible solución antes de escribir la primera línea de código que lo empiece a resolver. En el transcurso de este libro trataremos de enfocarnos en el concepto de diseño, dejando algunos temas del lenguaje para que el lector los estudie a satisfacción y no desenfocarnos del objetivo que nos concierne.
1. LA CLASE
Es un ente que se usa para modelar un problema de la realidad, caracterizado por unos atributos (propiedades) y unos métodos (acciones) que le permiten resolver dicho problema.
Es debido anotar que es el problema quien genera la clase y no lo contrario, dado que de las particularidades del problema y de su contexto mismo es de donde se abstraen las propiedades (atributos) y métodos (acciones) de la clase. Donde los atributos son las características propias del problema (datos necesarios) y los métodos son las acciones que debe ejecutar la clase para resolver el problema (manipulando los datos con las operaciones necesarias).
Así por ejemplo:
Se quiere diseñar una clase que permita calcular el área y el perímetro de un rectángulo.
Recordemos que el Área es igual a la base por altura y el Perímetro es igual a 2 veces la base mas 2 veces la altura.
Base
Caracterizamos los atributos y los métodos identificando cada uno de ellos con un nombre.
Atributos:
Para el problema son necesarios dos: Los llamaremos Base y Altura que son los datos básicos y suficientes para realizar los cálculos.
Tenemos que para calcular el Área:
Es necesario un método que se encargue de hacer la operación (multiplicación) Base por Altura y lo llamaremos Calcular área.
Para calcular el Perímetro:
Se debe crear un método que se encargue de hacer la operación: 2 veces la Base más 2 veces la altura, a este método lo llamaremos Calcular perímetro.
Para poder tener la información correspondiente a los valores que se guardan el los atributos es necesario pedirla, para ello creamos un método llamado pedirdatos y para mostrar el resultado de las operaciones que realiza la clase creamos el método mostrarresultados Podemos observar que los datos que se pueden calcular (Área, Perímetro) no se convierten en atributos sino en métodos, además que los atributos correspondientes a la clase no pueden ser más que los datos básicos requeridos para resolver el problema, en este caso los datos necesarios son los de los lados, y como el rectángulo tiene 2 lados iguales (Base) y otros dos lados iguales (altura) podemos diseñar la clase de la siguiente manera:
Nota:
Al asignarle un nombre a un atributo o a un método recuerde no dejar espacios entre los caracteres de dicho nombre. Los métodos se diferencia porque presentan (), al final del nombre.
Clase Rectángulo Base
Pedir_datos() calcular_area() calcular_perimetro() mostrar_resultados()
Plantearemos otro problema para aclarar un poco más.
Se quiere calcular el sueldo a pagar de un empleado, se tiene para ello las horas trabajadas y el valor de la hora. Hay que tener en cuenta los descuentos ocasionados por el seguro social y por la retención en la fuente, calculados a partir del básico ganado, además hay que determinar si recibe subsidio o no.
Solución:
Número de horas: Genera un atributo que llamaremos NumHoras. Valor de la hora: Genera un atributo que llamaremos ValHoras.
Estos son los datos que el problema nos ofrece y que utilizaremos para poder diseñar la y que utilizaremos en los métodos.
Las operaciones a realizar:
Básico: Genera un método para calcular número de horas por Valor de la hora, Lo llamaremos Básico.
Descuento seguro social: Genera un método para calcular un descuento a partir del valor del básico. Lo llamaremos DescuentoIss. Descuento por retención en la fuente: Genera un método para calcular otro descuento que se hace sobre el rango del valor del básico. Lo llamaremos DescuentoRetencion.
Subsidio: Genera método que evalúa el valor del básico y determina si recibe subsidio para asignarle el valor correspondiente sino asignara cero. Lo llamaremos Subsidio.
Total a pagar: Este concepto es implícito al problema y genera un método que se usará para calcular el pago final a partir del valor básico restándole los dos descuentos. Lo llamaremos Neto.
Observación:
Volvemos a resaltar, los valores que se pueden calcular no son atributos (tenga eso en cuenta) sino que se pueden considerar como métodos. Observemos que algunos métodos necesitan utilizar no los atributos sino otros métodos para poder realizar sus operaciones como es el caso de descuentoIss que necesita del método básico para poder calcular su propio valor, de igual manera el método neto necesita de los otros para efectuar la operación. (Esto es una característica del diseño de clases). Además diseñamos los métodos de pedirdatos y mostrardatos.
Nótese que aunque podríamos haber diseñado un solo método (Neto) para hacer todos los cálculos correspondientes, no lo hacemos con el fin de acogernos a una regla que más adelante explicaremos (Encapsulado).
Veamos el diseño de la clase:
ClaseTrabajador Valhoras Numhoras Pedirdatos() Basico() Descuentoiss() Descuentoretencion() Subsidio() Neto() Mostrarresultados() Nota:
Los problemas cómo tales tienen unas propiedades que serían las causas de él, los atributos.
Los métodos, que son acciones del problema, se modelan de tal forma que se piensa en ellos como lo que se hace con los atributos.
Ejercicios Resueltos
A continuación se plantean 3 problemas y se diseña la solución de ellos, haga un análisis de cada solución.
1. Diseñe una clase que permita conocer el resultado de una elección de alcalde puesto que el resultado es el siguiente:
El candidato A tiene el 35% de los votos validos, el candidato B tiene el 12% de los votos validos y el candidato C tiene el 42% de votos validos. Los votos en blanco corresponden al resto de los votos validos. Los votos totales son X y el 78% de estos votos son validos.
Clase Votación Votos Pedirdatos() Calcularvotosvalidos() calcularvotoscanA() calcularvotoscanB() calcularvotoscanC() calcularvotosblanco() mostrarresultados ()
2. Diseñar una clase que permita calcular el total de estudiantes de un colegio teniendo en cuenta que el colegio tiene 6 salones los cuales se distribuyen de la siguiente manera.
El grado primero tiene X estudiantes, el grado segundo tiene 1/3 que el grado primero, el grado tercero es dos veces el grado 2, el grado cuarto tiene Y estudiantes, el quito grado tiene ½ de cuarto grado mas el total de segundo, 6º tiene1/8 de la población estudiantil anterior.
Clase Colegio E_1 E_4 pedir_datos() calcular_Est_2() calcular_Est_3() calcular_Est_5() calcular_Est_6() calcular_Total_Est() mostrar_Resultados()
3. Dados A, B, C y D que corresponden a medidas de trozos de madera diseñe una clase que determine si se puede construir una mesa de: 2 patas, 3 patas y 4 patas.
Clase Mesa A, B, C, D pedir_datos() calcular_mesa_2() calcular_mesa_3() calcular_mesa_4() mostrar_Resultados() 2. LOS ATRIBUTOS
Pueden contener datos que toman valores diferentes, los cuales pertenecen a un conjunto o rango determinado que a su vez pueden ser datos discretos o continuos de una naturaleza específica, dependiendo del lenguaje de programación con el que se trabaja.
Dado que un atributo posee un dato de un tipo determinado, es necesario diferenciar entre el identificador del atributo y el contenido que albergará, veamos:
Crearemos un atributo Sueldo y le daremos un valor de 1500 Identificador
sueldo 1500 Contenido Actual |
Observemos que el identificador (Sueldo) hace referencia a un valor dado (1500) que es el contenido que en este momento le fue asignado, tengamos en cuenta que podemos asignarle otro valor (en Sueldo guarde ahora el valor de 300).
Identificador
Sueldo 300 Contenido Actual
Esto caracteriza el contenido como el valor cambiante que depende de las operaciones que se hagan en el, pero el identificador que se le asigno no cambia nunca. Para poder accesar al contenido del atributo hay que hacer referencia a su identificador. El concepto de es asociado en programación estructurada con el concepto de variable.
Hay que tener en cuenta al momento de darle un identificador (nombre) a un atributo es recomendable relacionarlo con el concepto que queremos referenciar (mnemotécnica).
Como regla general no es permitido mezclar los tipos de datos, es decir, un atributo puede manejar solo un tipo de dato a la vez, tomando valores que no deben “violar” el rango o dominio que se define para dicho tipo de dato.
En términos generales existen tres tipos: Numéricos
Alfanuméricos (todo tipo de carácter).
Y booleanos (valores lógicos 0 y 1; True, False).
Otra característica de los tipos de datos que podemos mencionar es que tienen definida una serie de operaciones, es decir, tienen definido lo que podemos hacer con ellos; operaciones que requieren el uso de operadores. Finalmente cabe anotar que el usuario (programador)
puede definir sus propios datos a partir de los datos “primitivos” definidos por el lenguaje de programación (Tema que abordaremos mas adelante).
Tipos de datos elementales en java
Tipos Numéricos (sin valores decimales) Palabra
reservada Rango de Valores Byte Desde - 128 hasta 127 Short Desde -32768 hasta 32767 Int Desde -2147483648 hasta
2147483647
Long Desde
-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 Tipos de Datos Carácter
Palabra
reservada Rango de Valores
String cadena de caracteres según usuario
Tipos de datos Lógicos Palabra
reservada Rango de Valores
Boolean Valor lógico True o False
Aplicando el concepto de tipos de datos, sobre los atributos al definir éstos se le debe indicar su dominio, es decir, el tipo de dato que va a manipular.
Tipo de Dato Identificador; Ejemplo:
String nombres; Int Sueldo;
Observaciones generales sobre los identificadores de los atributos en cualquier lenguaje:
• No deben comenzar con números
• No deben ser palabras reservadas del lenguaje de
programación.
• No deben contener espacios
• Por cuestiones prácticas deben ser claros y no tan largos.
• Deben ser mnemotécnicos o sea deben caracterizar al dato que
manipularan.
Podríamos enunciar otras pero dejaremos que la experiencia y la práctica con los compiladores les enseñe más.
Comenzaremos ahora un estudio de los métodos y su Caracterización en Java.
3. LOS MÉTODOS
Son acciones que le dan la funcionalidad a la clase, y como tal definen el comportamiento que éstos exhiben al momento de ser activados (usados). De este modo cada método debe realizar una tarea específica de acuerdo al problema que se quiere solucionar con la clase en mención.
En una clase podemos definir cuatro tipos de métodos:
a) Constructores:
Estos métodos constituyen operaciones de inicialización de valores para los atributos, como también la inicialización de las estructuras internas de las clases (direccionamiento de memoria), por ende deben ser los primeros en ser activados al momento de utilizar la clase.
Palabra reservada: Nombre clase () Ejemplo: personas();
En Java los constructores tiene el mismo nombre de la clase y una clase puede tener varios constructores cambiando solamente los parámetros que se le pasan.
b) Destructores :
Estos tienen como funcionalidad liberar los recursos de memoria utilizados por la clase para su trabajo. Su activación implica que el objeto no podrá ser usado para tareas posteriores en el ámbito del programa que esté haciendo uso de él .
Sintaxis:
Palabra reservada : finalize()
ejemplo: protected void finalize()
Otras características de los destructores en el lenguaje java es que no es necesario declararlos.
Procedimientos :
Estos métodos se caracterizan por la ejecución de una o más acciones (operaciones) sobre unos datos o valores que tienen un tipo (dominio) determinado y que se obtienen en algunos casos leyéndose de los atributos, tomándose a partir de parámetros (concepto que definiremos más adelante) o utilizando otros métodos de la clase .
Sintaxis:
Palabra reservada : Void Idenfificador;
ejemplo: void Pedirdatos();
Al igual que los procedimientos, una función constituye un método que realiza operaciones sobre datos de un tipo específico; datos que son leídos desde los atributos, otros métodos de la clase y/o pasados por parámetros, pero que a diferencia de los procedimientos, las operaciones efectuadas sobre dichos datos devuelven uno y solo un valor que por supuesto tiene un tipo definido y el cual caracteriza el tipo de la función.
Sintaxis:
Palabra reservada : Tipo de dato Identificador;
Ejemplo: int calculararea()
Ahora procederemos a complementar los conceptos anteriores con la definición de parámetros.
3.1 Parámetros:
Para que los métodos puedan ejecutarse deberán tomar valores ya sea a la clase misma o a elementos externos.
Cuando un método necesita valores que son externos y estos valores pueden variar al momento de ser manipulados en los procesos mismos del método, estos valores reciben el nombre de parámetros.
Observemos el siguiente ejemplo que corresponde a una función matemática:
f(x) = 3x + 10
Podemos observar que x es un valor que no hemos definido, pero que se hace necesario al momento de calcular la función, es decir, f es el identificador del método y “x” es el valor que f necesita para poder realizarla operación (parámetro).
Ahora bien si le asignamos algunos valores a “x” (parámetro) de f, tenemos que:
f(3)= 3*3+10 f(5) = 3*5+10
f(10)=3*10+10
De ésta manera vemos que la estructura del método no varía lo único que varía es el valor de x (parámetro) para calcular la función.
Los valores (3,5,10) asignados en el ejemplo son remplazados en la referencia que en la función tiene “x” .
Observación:
Cada vez que necesitamos valores cambiantes en un método y no conocemos su contenido, debemos hacer la referencia en el método con un parámetro.
3.2 Tipos de Parámetros:
Dependiendo que los parámetros retornen un valor o no al ser manipulados en un método, se clasifican en :
a) Parámetros por valor :
Cuando el parámetro es utilizado solamente para introducir valores al método que lo procesa.
b) Parámetros por referencia:
Cuando el parámetro al ser asignada al método puede cambiar o modificar su valor durante su utilización en el método, manteniendo esos cambios de allí en adelante para dar a conocer dicho cambio a los demás miembros de la clase, quienes pueden utilizarlo y modificar de nuevo dicho valor.
Para ver cómo trabajan conjuntamente los atributos y los métodos, debemos comprender primeramente el concepto de encapsulado.
El encapsulamiento define dos reglas, Una aplicada sobre los atributos que establece que para acceder a ellos (asignarles valores o leer los mismos), se deben definir métodos especializados en dichas operaciones de tal manera que los atributos son manejados por medio de la activación de dichos métodos .
La Otra regla está referida sobre los métodos, determinando sobre éstos un criterio de unicidad funcional, es decir, que un método debe encargarse de realizar una tarea (proceso) única ; De esta forma una clase define tantos métodos como tareas deba efectuar.
Como notamos en el encapsulado la esencia de proteger los datos con la utilización de métodos implica diferenciar diversas secciones dentro de una clase:
Sección Privadas: En esta sección se declaran los atributos y métodos que solo pueden ser accedida por los métodos de la misma clase, los descendientes no tienen acceso a ellos.
Sección Protegida: Aquí se declaran los atributos y métodos de la clase que pueden ser accedidos por sus propios métodos y por los métodos de sus descendientes.
Sección Pública: Se declaran los métodos que la clase a poner a disposición de quien lo necesite.
clase Sección Privada Atributos, Métodos Sección Protegida Atributos, Métodos Sección Publica Métodos Sintaxis Class Identificador
{ private
Tipo de dato Identificador de Atributos; public
Tipo dato Identificador del metodo() {implementación del método}
}
Ahora retomaremos los ejercicios planteados al principio y veremos su respectiva solución aplicando todos los conceptos estudiados hasta este momento, la parte de implementación de los métodos la abordamos mas adelante en este capitulo, por ahora nos enfocamos en el diseño de la clase. Para respetar la aplicación del encapsulado los métodos de pedir información y mostrar información se diseñan en la sección pública.
Primer ejemplo, hallar el área y el perímetro de un cuadrado . Class rectangulo
{ private
int base, altura public
rectangulo() { implementación};
void pedirdatos (int valbase;int valaltura) { implementación }; void MostrarResultados () { implementación };
int Obtenerbase() { implementación }; int Obteneraltura() { implementación } int Calculararea() { implementación } int Calcularperimetro() { implementación }; };
Explicación:
En la estructura definida en la clase notamos varios aspectos de importancia:
• Existen dos atributos (base, altura) que como se definió deben poseer un dominio (tipo de dato) que para el caso es int, la razón para ello es que deben ser valores enteros.
• Los dos atributos se encuentran en la sección privada atendiendo a la regla del encapsulamiento que nos dice que debemos proteger todos los atributos.
• Trabajamos con un constructor al cual le llamamos como la clase “rectangulo” ,Se diseñan tres métodos para acceder a los atributos :
• Para llevar información a los atributos diseñamos el método pedirdatos el cual utilizan dos parámetro un valbase y el otro valaltura los cuales van dentro de los paréntesis del método; y dos para traer información de los atributos que son “Obtenerbase “ y “Obteneraltura” .
• Seguidamente se diseñan los métodos que han de ser las acciones para lo cual se ha diseñado la clase, siendo éstos “Calculararea” y “Calcularperimetro”, además un método para mostrar resultados.
• Cabe anotar hacer referencia en la sintaxis del lenguaje java definición de los métodos en java implica la implementación del código de los mismo dentro de la clase, algo que omitimos ahora pero mas adelante atenderemos..
Nota: por sintaxis es recomendable en JAVA escribir todo el código en minúsculas ya que el compilador diferencia entre mayúsculas - minúsculas y nos puede ocasionar un mal rato. Cuando este escribiendo código olvídese de escribir alguna tilde.
Trataremos ahora el segundo ejemplo planteado al comienzo del capitulo.
Se quiere calcular el sueldo a pagar de un empleado, se tiene para ello las horas trabajadas y el valor de la hora. Hay que tener en cuenta los descuentos ocasionados por el seguro social y por la retención en la fuente, calculados a partir del básico ganado, además hay que determinar si recibe subsidio o no.
class trabajador { private: int numerohoras; float valorhora; public trabajador(){};
void asignarnhoras(int valhoras){};
void asignarvalor(float valvalor){}; int obtenernhoras (){};
float obtenervalor(){}; float Basico(){}; float descuentoiss(){};
float descuentoretencion(){}; float Subsidio(){}; float Neto(){};
};
Explicación:
En este ejemplo utilizamos 2 atributos con dominio distinto, numerohoras de tipo entero y valorhora de tipo real, esto con el fin de especificar el valor que puede contener cada atributo.
Observe la sintaxis de los métodos, además tenga en cuenta que para los métodos asignarnhoras y asignarvalor se usan parámetros, esto debido a que se hace necesario que estos métodos interactúen con el medio, para poder adquirir un valor exterior, los parámetros utilizados en dichos métodos son del mismo dominio del atributo ya que ellos lo que harán será guardar los valores que tomen en los atributos.
¿Analice porque no diseñamos un solo método (pedirdatos)?
Nótese que para cada acción de la clase, (tarea a realizar), hemos diseñado un método específico con el fin de mantener el encapsulado y poder organizar el diseño.
Bien ahora planteáremos algunos ejemplos y diseñaremos su solución, pero la explicación y entendimiento corre por cuenta del lector.
Ejemplo 3.
El almacén vende más desea en su aniversario hacer una promoción en su variedad de productos, para ello los ha clasificado en 3 categorías de la siguiente manera :
Categoría 1 : para los dispositivos de almacenamiento(discos duros, cintas ,tape backup etc..).
Categoría 2 : para los periféricos (impresoras, scanners, josticks etc..). Categoría 3 : para los computadores completos.
El almacén propone a sus compradores que lleven una cantidad de productos de una sola categoría hacer los siguientes descuentos; 5% para artículos de categoría 1, 8% para artículos de categoría 2 y 12% para artículos de categoría 3.
Diseñe una clase que permita al almacén saber cuanto debe pagar un comprador que lleva solamente artículos del mismo tipo.
Observación:
Tenga en cuenta los valores que le dan en el problema y las acciones que deben hacer para lograr el resultado.
class almacen{ Private int Cantidad ; int Valor; string Tipo ; public : almacen(){}; void Asignarcantidad(int valcant){}; void AsignarValor(int valvalor){}; void Asignatipo(string valtipo){}; int Obtenercantidad(){}; int ObtenerValor(){}; string Obtenertipo(){}; int Descuento(){}; int Valorneto(){}; int TotalaPagar(){}; }; Observaciones:
El método valorneto calculara el valor real de los artículos.
El método descuento evaluara el tipo de los articulo que se compra y calcula el valor del descuento utilizando el valorneto .
El método totalapagar calcula el valor que el usuario paga realmente. Ejemplo 4.
Un estudiante de informática desea controlar las notas de su asignatura de programación, el profesor va a hacer 3 evaluaciones dándole un porcentaje a cada nota de la siguiente manera:
Primera evaluación 30% Segunda evaluación 28%
tercera evaluación 42%
El profesor plantea que para aprobar la asignatura se debe tener un promedio de 3.5, el estudiante desea saber en que evaluación le fue mal para reforzar los temas evaluados.
class testudiante { private float primeranota; float segundanota; float terceranota; Public testudiante() { implementacion};
void AsignarNota1(float valnota1) { implementacion}; void AsignarNota2(float valnota2) { implementacion}; void AsignarNota3(float valnota3) { implementacion}; float obtenernota1(){ implementacion};
float obtenernota2(){ implementacion}; float obtenernota3(){ implementacion}; float calculapromedio(){ implementacion}; bool evaluaaprobacion(){ implementacion}; string notamenor(){ implementacion};
};
Observaciones
La función calculapromedio se encarga de tomar cada nota y multiplicarla por su porcentaje para luego sumarlas las tres.
La función evaluaaprobacion que devuelve un valor lógico determina si aprobó o no la asignatura.
La función notamenor evalúa cual de las tres notas fue la menor devolviendo el número de la nota y no su valor.
Para las clases votacion, colegio y mesa, escriba los diseños aplicando los conceptos vistos y la sintaxis de java.
Hasta el momento nos hemos detenido en el proceso de diseño de clases porque es la etapa más importante dentro del desarrollo de una aplicación con un enfoque orientado a objeto.
Ha podido observar que solamente con el diseño de la clase se entiende la solución del problema y mas aún se puede saber para que esta hecha dicha clase sin leer el problema como tal.
Las recomendaciones más importantes que se hacen entorno a la programación Orientada a Objetos son las siguientes
Dedíquele buen tiempo a entender el problema , esto quiere decir analice todos los factores que se involucran dentro del problema planteado. No se apresure recuerde la celebre frase de Napoleón “ Vístanme despacio que estoy de prisa”.
Analizado el problema proceda a identificar atributos y métodos ( recuerde que si un dato se puede calcular no es un atributo ).
Diseñe su clase.
Diseñado la clase hágase la siguiente pregunta. Satisface la clase todas las necesidades planteadas en el problema? Si su repuesta es SI ¡felicidades ha logrado diseñar una clase! Y si su respuesta es NO, no se preocupe rediseñe su clase total todavía no ha perdido tiempo escribiendo el código de implementación de los métodos.
.
Nunca se le olvide las reglas de encapsulado cúmplalas y comenzará a trabajar con una de las técnicas de programación mejor implementadas hoy en día.
Recuerde que hasta ahora estamos en diseño una las etapas de la programación orientada a objetos.
Taller 1. Que es un Clase?
2. Que importancia tiene el encapsulado en la Programación Orientada a Objetos ?
3. Cuál es la etapa más importante en la Programación Orientada a Objetos ?
4. Que es una clase ?.
5. Caracterice la sintaxis de java en cuanto a definición de atributos. 6. Diferencie entre identificador de un atributo y su contenido .
7. Haga un breve resumen de la sintaxis de java en los tipos de datos. 8. Que son los métodos ?
9. Determine la importancia de los constructores y destructores ? 10. Para que sirven los parámetros ?
11. Todos los métodos tienen parámetros ?
Diseñe las clases para resolver los siguientes problemas: 1. Se desea calcular el área y el perímetro de un círculo.
2. La empresa Cómputos S.A. desea controlar el inventario de los computadores que venden para así mantener en tiempo real información correspondiente a: tipo de computador, cantidad existente, cantidad mínima que debe haber y el valor de cada uno. Además se desea saber el costo total de los computadores existentes.
3. Se desea saber cual es el mayor de tres números dados .
CAPITULO II
LA IMPLEMENTACION DE LOS MÉTODOS Y LA INSTANCIAS DE LAS CLASES
Cuando se diseñan las clases y especifican los métodos se sabe cuales son las acciones que puede cumplir dicha clase. Bien ahora profundizaremos en cómo esos métodos son capaces de resolver su propia tarea usando el código necesario para que trabaje adecuadamente.
Recuerde que cada método en su diseño ya tiene proyectada una tarea a cumplir.
ASIGNACIÓN :
Cuando hay que guardar un valor en algún atributo o hacer operaciones con datos y saber sus resultados es necesario asignar dicho valor. La asignación consiste en guardar valores en los datos, estos se pueden de varias maneras:
Asignación Directa:
Consiste en guardar el valor de manera que no dependa sino del dato mismo.
Ejemplo: Guardemos 5 en el atributo Número. Numero = 5
Asignación Indirecta :
Ocurre cuando el valor de un dato depende de la operación de otros datos que interactúan.
Ejemplo: En a guarde la operación de x + y ,entonces a depende de los valores que tomen x , y.
a = x + y Nota:
Cuando usamos los parámetros asignamos al atributo o dato al cual le queremos pasar dicho valor, el identificador del parámetro esto es en tiempo diseño luego cuando se corre el programa se asigna el valor que el usuario le pase por el parámetro.
Regla :
Para asignar un valor se debe ubicar el identificador del dato en el que queremos guardar al lado izquierdo y los valores de los datos que se quieren guardar al lado derecho .
Sintaxis can=3; num = 10;
nombre = ’Juan Pérez’; suma = num + can
COMO IMPLEMENTAR LOS MÉTODOS
Dadas las características del primer ejemplo que calcula el área y el perímetro de un rectángulo (este ejemplo utiliza solo asignaciones para resolver su problema) lo utilizaremos para aplicar la implementación de los métodos .
Para efectuar operaciones cuando asignamos valores tengamos en cuenta los operadores aritméticos que los lenguajes nos presentan , ver cuadro
Operación Símbolo Ejemplo
Resta - x = 5-3
Suma + a = a + b
División / z = 3 / 9
Multiplicar * área = base * altura
{
Private
int base, altura; Public
rectangulo (){ base = 0; altura = 0; }
void asignarbase (int valbase ) { base = valvase;
}
void asignaraltura (int valaltura ) { altura = valaltura; } int obtenerbase () { return base; } int obteneraltura (){ return altura; } int calculararea () { int area;
area = Obtenerbase() * Obteneraltura() ; return area;
}
int calcularperimetro (){ int perímetro;
perímetro = (Obtenerbase() * 2 ) + (Obteneraltura() * 2); return perímetro;
}
}
ANALISIS :
1. Todos los métodos deben comenzar con el tipo de dato que devuelven seguido del nombre del método, entre paréntesis la lista de parámetros , si los hay , teniendo en cuenta que en la declaración de los parámetros va primero el tipo de dato y luego el identificador del
mismo. Si el método no devuelve ningún valor se usa la palabra reservada Void que indica que el método es un procedimiento .
Ejemplo:
Void Asignarbase (int valbase).
Si el método devuelve algún valor, entonces es una función, para esto se utiliza el tipo de dato y el identificador del método.
Ejemplo:
Int Trectangulo Obtenerbase() .
La palabra (return dato indica el valor que el método debe devolver). 2. Todos los métodos contienen un segmento principal que comienza con { y termina en }, dentro del cual se escriben las instrucciones que han de ejecutar dicho método.
En algunos casos es necesario declarar variables (datos) locales a un método. Una variable local es aquella que existe solo dentro del método en que se declara, es decir, solo puede ser usada entre el inicio y finalización de dicho método, específicamente entre los símbolos de llave de apertura ({ ) y llave de cierre ( }) del cuerpo del método. El uso de variables locales permite simplificar operaciones para que las instrucciones de una implementación sean menos complejas y consecuentemente más entendibles. Como ejemplo podemos mencionar el caso de la variable local : int área en la implementación de la función Calculararea, así la variable área recibe el valor calculado para el área (obtenerbase() * obteneraltura()) y posteriormente la función Calculararea devuelve dicho valor mediante la instrucción return area .
3. El constructor puede acceder directamente a los atributos.
4. Los métodos de asignación para los atributos utilizan el identificador del parámetro para asignarle su valor a dicho atributo.
Ejemplo: El método que le da un valor a la altura :
Void Asignaraltura(int valatura), utiliza la siguiente sentencia de asignación en su implementación : altura = valaltura.
2. ESTRUCTURAS CONDICIONALES:
En la implementación de los métodos se escriben una serie de instrucciones que son las que le dan operatividad, es decir, determinan en una forma organizada, detallada, precisa y lógica lo que cada método debe hacer, por lo tanto de acuerdo a cada método así debe ser cuerpo de instrucciones.
Hasta ahora hemos visto que estas instrucciones pueden consistir en la declaración de variables, en el llamado o activación de métodos dentro de otros, en la asignación de un dato a una variable, atributo o función y también hemos trabajado con operaciones de calculo matemático.
Todas estas instrucciones tratadas hasta el momento se ejecutan en forma secuencial una por una y en orden explícito. Sin embargo muchos casos de implementación nos plantean el rompimiento de esta “secuencialidad” de tal manera que podamos ejecutar o no ciertas instrucciones de acuerdo a unas condiciones determinadas; pudiendo así tomar decisiones dentro de la implementación de algún método de nuestras clases.
A estas instrucciones que nos permiten evaluar condiciones para tomar decisiones se les denomina Estructuras Condicionales .
Una estructura condicional requiere de una expresión o condición que al ser evaluada arrojará un único valor de verdad que puede se verdadero (true) o falso (false).
Si la expresión se evalúa como verdadero se ejecutarán las instrucciones que creamos necesarias para dicho caso, de lo contrario esas mismas instrucciones serán ignoradas. Sin embargo siendo la condición falsa, también podemos establecer la ejecución de otro bloque de instrucciones que alternativamente necesitemos ejecutar en el caso de que la expresión del condicional no sea verdadera.
Por ejemplo una frase como esta es una instrucción condicional: “Si mañana llueve, entonces me quedaré en casa”. En ella vemos que la expresión a evaluar es “si mañana llueve” y la acción a ejecutar si dicha condición es cierta será “me quedaré en casa”.
Sin embargo podemos hacer algo en caso de que la condición sea falsa, por ejemplo: “Si mañana llueve entonces me quedaré en casa,
sino iré a clases”. Aquí podemos apreciar que se incluye una nueva parte en el condicional (“sino”) que indica que se va expresar la acción a realizar cuando la expresión a evaluar sea falsa, que para el ejemplo sería “iré a clases”.
Veamos como se aplican estos conceptos en términos de programación.
La expresión o condición que se evalúa en una estructura condicional es una expresión booleana, que toma uno y solo uno de dos valores posibles, True o False. Una expresión booleana se construye por medio de operadores relacionales y/o lógicos que se aplican a unos operandos (datos, variables, atributos y funciones del mismo dominio).
Las expresiones lógicas están compuestas de la siguiente manera : operando1 Operador operando2
Donde operando1 y operando2 son datos sobre los cuales cae el peso de la comparación y el operador es la operación de la comparación que se ha de hacer.
Tipo de operadores relacionales básicos :
OPERADOR SIMBOLO Mayor que > Mayor o igual > = Menor que < Menor o igual < = Diferente != Igualdad = =
Estos son operadores binarios, es decir, necesitan dos operandos que serán los dos datos que ellos han de comparar. Si la expresión es cierta, la expresión booleana retorna el valor true, en caso contrario, asume un valor de false.
Por ejemplo, las siguientes son expresiones booleanas : a) 3 = = 3; b) 4+2 < 8; c) ‘A’ > = ‘B’
Veamos que cada operador requiere dos operandos que se ubican al lado izquierdo y derecho respectivamente. Las expresiones tomarán los siguientes valores de verdad:
a) 3 == 3 verdadero (true) b) 4+2 < 8 verdadero (true)
c) ‘A’> = ‘B’ falso (false) por que la letra ‘A’ tiene un valor Ascci menor que el de la letra ‘B’.
Como ejercicio intente determinar el valor de verdad de las siguientes expresiones booleanas:
a) 4*2+1 <> 3*3-2 b) 3/2 != 6/4
c) ‘m’ < ‘e’ d) 5 != (3-2)*2
Como es de esperar la expresión booleana también puede estar formada por operadores lógicos.
Un operador lógico no es más que un conectivo lógico que puede comparar (asociar) dos o más expresiones booleanas simples como las anteriores formando así expresiones booleanas compuestas. Los operadores lógicos requieren como operandos (datos a relacionar o comparar) valores y expresiones booleanas (datos que toman el valor true o false).
Los operadores lógicos en JAVA son los siguientes :
Operador Símbolo
“Y” Lógico && “O” Lógico ¡¡ Negación Lógica
A excepción de la negación lógica que es un operador unario (que requiere solo un operando) los demás operadores son binarios (requieren dos operandos) y como se ha dicho estos operandos son datos booleanos (true o false), cada operador lógico posee una tabla de verdad mediante la cual se establece que valor asume al relacionar el o los valores lógicos. Las tablas son las siguientes:
Tabla del “Y”
Expresión 1 Expresión 2 Expresión 1 Y Expresión 2
True True True
True False False
False Trae False
False False False
Tabla del “O”
Expresión 1 Expresión 2 Expresión 1 O Expresión 2
True True True
True False True
False True True
False False False
Tabla de la “Negacion”
Expresión Negacion Expresión
True False
False True
En estas tablas debemos anotar que “Expresión - uno” , “Expresión - dos” y “Expresión” representan indistintamente cualquier expresión u operando de tipo booleano y que los operadores se encargan de
relacionar por medio de su tabla de verdad los valores correspondiente u operandos, arrojando un único valor de verdad.
Por ejemplo:
(3 = 5) && (2 = 2) Existen dos expresiones booleanas (3 =5); (2 = 2). Debemos evaluar cada una independiente de la otra así :
(3 = 5) = false y (2 = 2) = true.
Con estos valores booleanos procedemos a aplicar el operador and así :(True) && (False).
Buscamos en la tabla de verdad la combinación true false para el Y (donde expresión - uno corresponde a true y expresión - dos a false). Así (true) And (false) = false.
Es decir, que la expresión booleana(3=5) Y (2=2) = false.
Nótese aquí el uso de paréntesis para indicar el comienzo y finalización de cada expresión booleana.
Miremos ahora este ejemplo : (‘A’ = ‘A’) ¡¡ (3-1 <> 2).
La primera expresión (‘A’ = ‘A’) es true. La segunda expresión (3-1 <> 2) es false.
El O entonces relacionará los valores así : (true) O (false).
Dándonos como resultado final el valor true para la expresión booleana planteada.
Trate de desarrollar el valor lógico para las siguientes expresiones booleanas:
a) (true) ¡¡ (2 <> 1) ; b) ! true ;
c) (3 != 3) && (4-1 < 0); d) (1>=2) && (2<=1); e) ! false; f) ! (true !! false) g) (‘A’ !=’B’) !! (true); h) !(5 != 5)
Como podemos pensar la construcción de expresiones booleanas compuestas requieren el uso de paréntesis. Existe un concepto llamado procedencia de operadores (lógicos y/o relacionales) que es afectada por el uso de los paréntesis. Esta procedencia indica que parte de la expresión booleana compuesta se empieza primero y en que orden se evalúan las siguientes así como también se van relacionando cada expresión simple conectada con otras por medio del operador lógico respectivo.
Bien , ahora estudiaremos las estructuras condicionales que presentan el siguiente formato :
a) Condicional Simple :
Palabra ( Expresión ) Por Verdadero Condicional Instrucción 1 Instrucción n
En caso que la expresión sea verdadera al momento de evaluarse se ejecutarán las instrucciones de 1..n , pero en caso de ser falso no ejecutará ninguna, el compilador seguirá ejecutando las otras instrucciones.
Estructura condicional simple
if (condición) {
instrucciones a ejecutar; };
El condicional también permite evaluar una expresión y determinar las acciones a seguir por verdadero o por falso de la siguiente manera : b) Condicional Compuesto :
Palabra ( Expresión ) Por Verdadero Por Falso Condicional Instrucción 1 Instrucción a Instrucción n Instrucción z
En dicho caso se ejecutarán las instrucciones que se encuentran en el condicional dependiendo del resultado de la evaluación ya sea por verdadero o por falso ( recuerde que se ejecutara un conjunto de instrucciones ). En el condicional simple si no era verdadero el compilador no ejecutaba ninguna de las instrucciones del condicional. Estructura condicional compuesta
if condición {
instrucciones a ejecutar por verdadero ; }
else {
instrucciones a ejecutar por falso; };
Nota :Observe la ausencia de punto y coma antes del else, esto se debe a la sintaxis del lenguaje.
Veamos la implementación de algunos ejemplos donde los métodos necesitan evaluar ciertas condiciones para poder ejecutarse adecuadamente.
Al resolver los problemas algunos métodos evalúan condiciones, analice la forma como se evalúa y luego identifique en la implementación del método el código correspondiente:
Repase los planteamientos de los problemas del capitulo anterior y observe el diseño de cada una de las clases para que puede
entender a cabalidad la implementación que iniciaremos a continuación.
TRABAJADOR :
Características de los métodos que necesitan evaluar condiciones.
• El método DescuentoIss deben saber el rango del salario para determinar el porcentaje a calcular como descuento y valor a descontar.
Estructura de evaluación:
if Condición Instrucción a ejecutar
Por Verdadero básico * 0.08
Por Falso básico * 0.12
Condición : Que basico sea menor de 280000
• El método DescuentoRetención debe determinar si el salario básico está en el rango para saber si tiene descuento o nó.
Estructura de evaluación:
If Condición Instrucción a ejecutar
Por verdadero básico * 0.10
Por falso 0
• El método Subsidio de igual manera debe determinar el rango del salario básico para poder asignar un subsidio o no.
Estructura de evaluación
if Condición Instrucción a ejecutar Por verdadero 25000 Por falso 0
Condición : Que básico sea menor de 280000.
Nótese que en este problema utilizamos el método llamado Básico en la mayoría de los otros métodos (imagínese que tendrá que hacer si no lo hubiese diseñado). class trabajador { private : int numerohoras ; float valorhora ; public trabajador(){};
void asignarnhoras(int valhoras){ numerohoras=valhoras;
}
void asignarvalor(float valvalor){ valorhora=valvalor; } int obtenernhoras (){ return numerohoras; } float obtenervalor(){ return valorhora;
} float basico(){ float sueldo;
sueldo = obtenerhoras ( ) * obtenervalor ( ); return sueldo; } float descuentoiss(){ float descuento; if básico() < 280000 { descuento = basico( ) * 0.08; } else { descuento = basico( ) * 0.12; }; return descuento; } float descuentoretencion(){ float retención; if basico() > 400000 { retención = basico( ) * 0.1; } else { retención = 0; }; return retencion; } float Subsidio(){ float valorsub; if basico( ) < 280000 { valorsub = 25000; } else { valorsub = 0; }; return valorsub; } float Neto(){
float sneto;
sneto = basico( ) - descuentoiss( ) - descuentoretención + subsidio; return sneto;
} }
Clase almacen
Características de los métodos que necesitan evaluar condiciones:
• En este clase el método Descuento debe determinar el tipo de artículo que se seleccionó para poder calcular el descuento a realizar.
Estructura de evaluación:
if condición Instrucción a ejecutar
Por Verdadero ValorNeto * 0.07
Por Falso If Condición2 Instr ucción a ejecutar
Por Falso ValorNeto * 0.12
Condicion1 : Si obtenertipo es igual a 1 Condicion2 : Si obtenertipo es igual a 2 Nota :
No es necesario evaluar si obtenertipo es igual a 3 dado que no existen mas tipos y el falso de Condicion2 asume que es de tipo 3.
class almacen{ Private int Cantidad ; float Valor; string Tipo ; public : almacen(){ cantidad=0; valor=0; tipo=’ ’; }
void Asignarcantidad(int valcant){ cantidad=valcant;
}
void AsignarValor(int valvalor){ valor=valvalor;
}
void Asignatipo(string valtipo){ tipo=valtipo;
int Obtenercantidad(){ return cantidad; } float ObtenerValor(){ return valor } string Obtenertipo(){ return tipo; } float Descuento(){ float desc; If obtenertipo( ) = = ‘1’ { desc = Valorneto( ) * 0.05; } Else If obtenertipo( ) = = ‘2’ { desc = valorneto ( )* 0.08 } Else { desc = valorneto( ) * 0.12; } return desc; } float Valorneto(){
return (obtenervalor( )*obtenercantidad( )); }
float TotalaPagar(){ float pago;
pago= valorneto( )-descuento( ); return pago;
}
}
Cabe destacar que en la implementación de método descuento es necesario declarar una variable de ámbito interno al método ( solo se conoce al interior de éste) para capturar el valor resultante de la operación valorneto por porcentaje de descuento con el fin de hacer mas legible y entendible el código que se escriba.
Clase estudiante
Características de los métodos que necesitan evaluar condiciones:
• El método EvaluarAprobación debe determinar si el promedio obtenido (CalcularPromedio) es mayor que 3.5 para saber si aprobó o no. Note que devuelve falso o verdadero.
Estructura de evaluación:
If Condición Instrucción a ejecutar
Por verdadero True
Por falso False
Condición : Si calculapromedio es mayor de 3.5.
• El método NotaMenor es algo un poco complejo por que debe evaluar cual de las notas es la menor; debido a que la evaluación debe comprobar varias condiciones, por ende se hace necesario utilizar conectores lógicos (&&) para facilitar la implementación .
If Condición1 Y Condición2
Por Verdadero instrucción 1
Por Falso if Condición3 Y Condición4
Por Verdadero Instr. 2
Por Falso instrucción 3
Condicion1: obtenernota1 es menor que obtenernota2. Condicion2: obtenernota1 es menor que obtenernota3. Condicion3: obtenernota2 es menor que obtenernota1. Condicion3: obtenernota2 es menor que obtenernota3.
Analice porque no es necesario evaluar si obtenernota3 es menor. Nota:
Observando la tabla Y, teniendo en cuenta la estructura del condicional compuesto, analice cuidadosamente el método NotaMenor y saque sus propias conclusiones . class testudiante { private float primeranota; float segundanota;
float terceranota; Public testudiante() { primeranota=0; segundadota=0; terceranota=0; }
void AsignarNota1(float valnota) { primeranota=valnota;
}
void AsignarNota2(float valnota) { segundadota=valnota;
}
void AsignarNota3(float valnota) { terceranota=valnota; } float obtenernota1(){ return primeranota; } float obtenernota2(){ return segundadota; } float obtenernota3(){ return terceranota; } float calculapromedio() { float suma;
suma = obtenernota1( ) + obtenernota2( ) + obtenernota3( ); return (suma /3);
}
bool evaluaaprobacion() {
return(true); else return(false); } int notamenor(){ if((obtenernota1()<obtenernota2())&&(obtenernota1()<obtenernota3( )) { return(1);} else if((obtenernota2()<obtenernota1())&& (obtenernota2()<obtenernota3()) { return(2);} else { return(3);} }
3. INSTANCIANDO CLASES
Hasta ahora nos hemos dedicado a diseñar e implementar clases que son solución a problemas, pero nos embargan unas preguntas:
bueno y como se usan esas clases? Si funcionan ?
Como las pruebo ?
Bien para poder utilizar una clase debemos :
Primero definir una instancia de la clase, lo cual es crear una o varias referencias a la clase a través de nombres o identificadores que definimos, como lo hacemos cuando definimos los atributos :
int sueldo;
Para definir una instancia seguimos la misma regla: testudiante alumno;
Donde testudiante es la clase y alumno es la instancia de la clase. Segundo crear la instancia alumno de la siguiente manera:
alumno= new testudiante();
Donde new es una palabra reservada de java que permite crear el espacio de memoria para la instancia.
Hay que tener en cuenta que en java cuando se crea la instancia automáticamente se llama el constructor y ejecuta las instrucciones que hallamos definido en el, lo cual indica que si lo definimos en la clase con parámetros debemos pasarle los valores en el mismo momento de crear dicha instancia.
Tercero hacer el llamado de los métodos asi: alumno.AsisgnarNota1(10);
alumno.AsisgnarNota2(50); alumno.AsisgnarNota3(17);
Cuando los métodos devuelven valores debemos guardar los valores que devuelven en variables previamente definidas:
float promedio;
El orden de llamado de los métodos depende exclusivamente de como se requiere resolver el problema, pero tenga en cuenta de llamar los métodos que guardan valores antes de llamar métodos que efectúen operaciones con dichos valores.
Ejemplo :
A continuación instaciamos la clase trabajador y activaremos sus métodos, y haremos análisis de lo que sucede.
trabajador empleado; float total;
empleado= new trabajador(); empleado.asignarhoras(36); empleado.asignavalor(3546); total=empleado.Neto();
Analisis
1. Definimos la instancia empleado de tipo de clase trabajador.
2. Creamos la instancia con new, nótese que el constructor no ejecuta instrucción alguna ni tampoco recibe valores como parámetros.
3. Enviamos el valor 36 al atributo numerohoras a través del método asignarhoras.
4. Enviamos el valor 3546 al atributo valor a través del método asignavalor.
5. A la variable total le asignamos el resultado de las operaciones que realiza el método neto.
Operaciones del método neto:
• llama al método basico, el cual obtiene el valor de los atributos por intermedio de sus métodos.
• Llama el método descuentoiss y se lo resta a basico.
• Llama a descuentoretencion y también se lo resta al valor devuelto por el básico.
• Llama al método subsidio y se lo suma al básico.
Después de analizar como se usan las clases a través de su instancia al lector le pueden embargar otras preguntas como:
Donde escribo el código que define y crea las instancias?
Por que se dan valores directamente o es que no se pueden ser definidos por el usuario?
Para responder la primera pregunta lo que se debe realizar es crear una clase en java que implemente el siguiente método:
public static void main(String args[])
Escribiendo dentro de el código correspondiente a la definición de la instancia y al llamado de los métodos respectivos.
Ejemplo de uso de la clase trabajador import java.io.*;
class Principal {
public static void main(String args[]) {
trabajador empleado = new trabajador(); empleado.asignarhoras(36);
empleado.asignavalor(3546);
System.out.println(empleado.Neto()); }
}
Nota: observe que encabezado incluye la instrucción import java.io.*; Esto es para poder utilizar las clases de entrada y salida. Además la instrucción System.out.println se usa para mostrar por pantalla el resultado de cualquier operación o para mostrar mensajes al usuario. Ahora planteamos un problema y desarrollamos su solución donde se involucren todos los elementos hasta ahora tratados y responda el interrogante de la segunda pregunta de interfaz con el usuario.
Diseñar una clase que permita manejar la información de llamadas en un sai teniendo como base la duración de la llamada y el valor del minuto. Solución class Llamada{ int ValMin,Tiempo; Llamada(){ }
public void LlevaMinuto(int Val) {
ValMin = Val; }
public void LlevaTiempo(int Ti) { Tiempo = Ti; } int TraeMinuto() { return ValMin; } int TraeTiempo() { return Tiempo; } int ValorLlamada() { int Calcula; Calcula = TraeMinuto()*TraeTiempo(); return Calcula;} }
Clase que instancia import java.io.*;
class Principal{
public static void main(String args[]){ Llamada Llamar = new Llamada(); int Vmin = 0;
int Tiem = 0;
BufferedReader Tecla = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.print("Digite el valor del minuto :"); Vmin =Integer.parseInt(Tecla.readLine());
Llamar.LlevaMinuto(Vmin);
System.out.print("Digite el tiempo :"); Tiem =Integer.parseInt(Tecla.readLine());
Llamar.LlevaTiempo(Tiem);
} catch (IOException varerror) {System.out.println("Error");} System.out.println(" ");//mostrar el valor de la llamada
System.out.println("El valor de la llamada "+Llamar.ValorLlamada()); System.out.println(" "); } } Análisis La instrucción try { }catch
Permite capturar algún error ocurrido al escribir los datos y evitamos que se bloquee el programa cuando estemos cargando datos desde el teclado.
BufferedReader Tecla = new BufferedReader(new InputStreamReader(System.in));
En esta instrucción se crea una instancia de la clase bufferedReader que java tiene implementada llamada tecla la cual es capaz de leer caracteres desde el teclado.
Tecla.readLine() Se hace un llamado al método readline que permite leer una línea de caracteres por pantalla y guardarla en los atributos donde se asigne.
Integer.parseInt Convierte la cadena leída en datos enteros y este valor convertido debe asignarse a un datos de tipo integer.
Todo esto se debe realizar dado que en java lo que se captura son cadenas de caracteres y debemos hacer las conversiones a sus valores numericos correspondientes.
Taller
1. Explique para que son los parámetros en los métodos. 2. Concluya para que sirve el encapsulado.
3. Que diferencias existen entre cada uno de los métodos. 4. Explique para que sirven los conectores lógicos
5. Para que se usan las estructuras condicionales. 6. ¿Que es una instancia?
7. ¿Hay diferencia entre instancia y clase?
8. ¿Se puede instanciar una clase varias veces?, ¿como? Diseñe e implemente:
1. Dados tres números calcular el mayor, el menor y el número medio, diseñar e implementar la clase pertinente.
2. Dado el nombre, la edad y sexo de una persona diseñe e implemente una clase en la que el constructor inicialice los atributos, además que determine si la persona es apta para votar teniendo en cuenta que solo votan las personas que cumplan las siguientes condiciones: mujeres mayores de 21 años, hombres mayores de 18 años.
3. diseñe e implemente una clase que dado el nombre, estatura, edad, peso. Determine si esa persona puede practicar o no los siguientes deportes teniendo en cuenta las restricciones:
a. Fútbol : estatura mínima 170, edad máxima 17 años
b. Básquet: estatura mínima 180, edad mínima 16 años máxima 19 años
c. Softbol : peso mínimo 70 kilos , edad mínima 18 años. d. Boxeo : peso máximo 100 kilos, estatura mínima 170. 4. Cree la instancia que utilice la solución del ejercicio 3.
5. Cree una clase que utilice y aplique dos instancias para le solución planteada en el ejercicio 2 y de valores que cumplan para cada condición.
Para consulta se presentan dos ejemplos de clases, una para manejo de ventanas y otra clase para manejo de texto y conversión de números que pueden usar y complementar en el futuro.
import java.awt.*; import java.lang.*; import java.awt.event.*; class MiVentana {
static Frame ventana=new Frame();
static Label Eventana=new Label("Digite un nombre"); static TextField Tventana=new TextField(15);
static Button boton1=new Button("Guardar"); static Button boton2=new Button("Otro"); static int dato=0;
public static void main(String args[]) { ventana.setTitle("manejo de ventanas"); ventana.setLayout(new FlowLayout()); ventana.add(Eventana); ventana.add(Tventana); ventana.add(boton1); ventana.add(boton2); ventana.pack(); ventana.setVisible(true);
boton1.addMouseListener( new MouseAdapter() {public void mousePressed(MouseEvent e) { dato=Integer.parseInt(Tventana.getText()); if (dato <100)
dato =dato+20; else
boton2.addMouseListener( new MouseAdapter() {public void mousePressed(MouseEvent e)
{Tventana.setText(String.valueOf(dato));}}); ventana.addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e) { System.exit(0);}});
} }
Import java.io.*;
public class LeeTeclado { InputStreamReader tecla; BufferedReader teclado; public LeeTeclado() {
tecla = new InputStreamReader(System.in); teclado = new BufferedReader( tecla ); }
public String leerString(){
String valor = new String(); try{
valor = teclado.readLine(); }catch(IOException ioe){
System.out.println("Error de lectura de datos"); valor = "";
}
return valor; }
public int leerEntero(){
int valor = 0; try{
String valorLeido = teclado.readLine(); Integer convierte = new Integer(valorLeido); valor = convierte.intValue();
}catch(IOException ioe){
System.out.println("Error de lectura de datos"); valor = 0;
}
return valor; }
CAPITULO III
CICLOS Y ARREGLOS
Una de las situaciones mas comunes que nos encontramos en el ámbito de la programación, consiste en la necesidad de repetir dentro de un método un conjunto de instrucciones o repetir varias veces la activación de un método. Todo esto se puede realizar utilizando instrucciones repetitivas llamadas ciclos, las cuales vamos a estudiar y analizar a continuación.
Ciclos con numero de iteraciones definidas:
1. CICLO FOR
Este se caracteriza por ejecutar las instrucciones que se encuentran dentro de a partir de un dato inicial, con un incremento automático de uno en uno hasta un valor final o sea el numero de iteraciones que necesitamos en el problema.
Sintaxis del ciclo for for (i=1;i<tamaño;i++) {
conjunto de instrucciones }
Estructura
i=1: Donde i es un controlador del ciclo que le inicializa con un valor. i<tamaño: Expresión que se evalúa automáticamente antes de cada vuelta de ciclo para determinar si repite nuevamente el conjunto de instrucciones teniendo en cuenta si es verdadero el resultado de la evaluacion.
i++: Expresión de auto incremento de uno en uno, esto con el objetivo de acercase a un valor false, que determine la parada del ciclo.
Ejemplo Mostrar los números del 1 al 10 for (i=1;i<=10;i++) { System.out.println(i); } El resultado será 12345678910. Preguntas
¿ Cual será el resultado si se remplazamos la expresión de condición i<= 10 por la expresión i>10 ?
¿ Cual seria el resultado si se cambiara el operador <= por el operador < ?
¿ Cual seria el resultado si se cambiara el operador <= por el operador == ?
Tenga en cuenta el operador que usa, dado que le puede hacer una o mas iteraciones de las presupuestadas.
Algunas veces no podemos definir explícitamente el numero de iteraciones que puede llegar a hacer un ciclo pero podemos contar con condiciones que deben cumplirse para que continúe iterando o para que deje de iterar un ciclo.
2. CICLO WHILE
Este ciclo tiene como característica que debe cumplirse una condición inicial de entrada (valor booleano true) y se repite el conjunto de instrucciones que se encuadran dentro de el mientras esta condición se mantenga en verdadero, esto quiere decir que es función de nosotros determinar dentro de el conjunto de instrucciones definidas dentro del ciclo, una que garantice que en algún momento ese valor booleano true se convierte en false para dar por terminado el ciclo.
While (condicion=true) {
conjunto de instrucciones condicion = false
}
Estructura del ciclo while
Condición =true : Es una expresión lógica que se argumenta con valor inicial de verdadero porque sino el ciclo no ejecutaría ninguna instrucción que se encuentre dentro de el.
Condición =false: Es una expresión lógica que debe resulta de evaluar alguna de las instrucciones dentro del ciclo y además debe tomar el valor del false en cualquier iteración del ciclo, para garantizar la terminación del ciclo y no convertir el proceso en algo indefinido. Esta puede ser la asignación de un valor determinado, el incremento de un contador o simplemente el resultado de una operación aritmética, asociadas con el operador utilizado en la condición de control del ciclo. Ejemplo:
Mostrar los primeros números que su suma sea menor o igual a 25
i=0; maximo=25; suma=0; while(suma<=maximo) { System.out.println(i); I++; suma=suma+i; } El resultado seria 0123456 Análisis
Con valores iniciales i=0, suma=0 , maximo =25 Evaluamos suma<=maximo (0<=25)
Como es verdadero mostramos el contenido de i que es 0, incrementamos el valor de i en 1, y a suma asignamos 1
Evaluamos suma<=maximo (1<=25)
Como es verdadero mostramos el contenido de i que es 1
Incrementamos i en 1(i es 2) ; en suma sumamos el 1 que tenia mas el valor de i que es 2 (suma 3).
Evaluamos suma<=maximo (3<=25)
Como es verdadero mostramos el contenido de i que es 2
Incrementamos i en 1 (i es 3) ; en suma sumamos el 3 que tenia mas el valor de i que es 3 (suma 6).
Evaluamos suma<=maximo (6<=25)
Como es verdadero mostramos el contenido de i que es 3
Incrementamos i en 1 (i es 4) ; en suma sumamos el 6 que tenia mas el valor de i que es 4 (suma 10).
Evaluamos suma<=maximo (10<=25)
Como es verdadero mostramos el contenido de i que es 4
Incrementamos i en 1 (i es 5) ; en suma sumamos el 10 que tenia mas el valor de i que es 5 (suma 15).
Evaluamos suma<=maximo (15<=25)
Como es verdadero mostramos el contenido de i que es 5
Incrementamos i en 1 (i es 6) ; en suma sumamos el 15 que tenia mas el valor de i que es 6 (suma 21).
Evaluamos suma<=maximo (21<=25)
Como es verdadero mostramos el contenido de i que es 6
Incrementamos i en 1 (i es 7) ; en suma sumamos el 21 que tenia mas el valor de i que es 7 (suma 28).