Sie sind auf Seite 1von 50

Fascículo

Lenguaje de
Programación

Semestre 2
Lenguaje de programación

Lenguaje de
programación Semestre 2
Lenguaje de programación

Tabla de contenido Página

Introducción 1
Conceptos previos 1
Mapa conceptual Fascículo 2 3
Logros 4
Análisis de las soluciones 4
Metodología para la solución de problemas con el enfoque
de objetos 10
Ejemplos de problemas resueltos con objetos 17
Desarrollo de métodos para los objetos 21
Tipos de datos 26
Uso de funciones predefinidas 26
Ejemplos de conversión de algoritmos a métodos de clases
en Java 26
Resumen 31
Bibliografía recomendada 32
Nexo 32
Seguimiento al autoaprendizaje 33
Anexo 1 35
Anexo 2 37
Anexo 3 45

Créditos: 3
Tipo de asignatura: Teórica – Práctico

Semestre 2
Lenguaje de programación

Copyright©2008 FUNDICIÓN UNIVERSITARIA SAN MARTÍN


Facultad de Universidad Abierta y a Distancia,
“Educación a Través de Escenarios Múltiples”
Bogotá, D.C.

Prohibida la reproducción total o parcial sin autorización


por escrito del Presidente de la Fundación.

La redacción de este fascículo estuvo a cargo de


JAIME ALBERTO GUTIERREZ
Docente tutor – Programa de Ingeniería de Sistemas a Distancia.
Sede Bogotá, D.C.

Orientación a cargo de;


ELIZABETH RUIZ HERRERA
Directora Nacional de Material Educativo.

Diseño gráfico y diagramación a cargo de


SANTIAGO BECERRA SÁENZ
ORLANDO DÍAZ CÁRDENAS

Impreso en: GRÁFICAS SAN MARTÍN


Calle 61A No. 14-18 - Tels.: 2350298 - 2359825
Bogotá, D.C., Febrero de 2010

Lenguaje de
programación Semestre 2
Lenguaje de programación 1
Introducción
La programación requiere tener unos principios, que como se vio en el
fascículo 1 están fundamentados en un correcto análisis algorítmico de los
problemas. Ningún Software de computadora funciona apropiadamente si
no se establece un correcto algoritmo que defina de forma sucinta y clara
la satisfacción de los requerimientos del usuario y que explore de forma
detallada las funcionalidades que deben ser implementadas.

La interfaz gráfica, el acceso a los datos a través de las diferentes vías de


entrada y salida del sistema y la implementación de otros detalles pasan a
ser elementos secundarios si no se tiene una adecuada estructura de
programación.

A continuación analizaremos los principales elementos en el diseño de las


soluciones de Software basadas en el paradigma orientado a objetos,
considerando las etapas para la construcción de los objetos, el mapeo de
los algoritmos en los métodos de programación y finalmente la prueba de
la solución. Todo esto lleva a tener una cultura en el desarrollo de las
aplicaciones y lo más importante, a aplicar la disgregación y la modula-
ridad como la base de la construcción de aplicaciones informáticas bajo el
lenguaje de programación Java.

Conceptos previos
Recuerde que es importante tener claras las principales sentencias básicas
de la notación en pseudocódigo, la cual permite establecer las sentencias
lineales de ejecución de un procedimiento algorítmico. Es también impor-
tante recordar que en la programación debemos ajustarnos mucho al
entorno definido por el lenguaje. Finalmente, se propone el desarrollo de
la siguiente actividad como un repaso de lo abordado anteriormente,

Fascículo No. 2 Lenguaje de


Semestre 2 programación
Lenguaje de programación

 Identifique la diferencia entre variable y constante, y por qué son


importantes estos elementos para desarrollar un algoritmo.
 Explique la principal diferencia entre los símbolos rotacionales de un
diagrama de flujo de datos y las sentencias de pseudocódigo diseñadas
para armar y construir algoritmos de programación.
 Defina qué es un programa construido bajo el paradigma de progra-
mación estructurada y qué es un programa que se construye bajo el
modelo de orientación a objetos.
 ¿Para qué se hace necesario inicializar las variables de una rutina
algorítmica antes de iniciar su ejecución?
 ¿Para qué son importantes los ciclos de ejecución de una rutina
algorítmica como el ejecute mientras o el para?

Fascículo No. 2
Lenguaje de
programación
2 Semestre 2
Lenguaje de programación

Mapa conceptual fascículo 2

Fascículo No. 2
Semestre 2 3 Lenguaje de
programación
Lenguaje de programación

Logros

Al finalizar el estudio del presente fascículo, el estudiante estará en capacidad


de:

 Comprender el análisis como herramienta fundamental para la construcción


de soluciones informáticas.
 Visualizar la importancia de la definición gramatical de casos de uso y su
impacto en la construcción de objetos candidatos que implementen
posteriormente la funcionalidad sistémica de Software.
 Visualizar la esencia de dato y del tipo de dato como base para el
procesamiento de la información hecho por la aplicación informática.

Análisis de las soluciones


Antes que nada, tenga en cuenta que en la programación el punto de
partida de todo proceso se encuentra en el análisis. Entendiéndose éste
como la capacidad de entender claramente los tres aspectos básicos que
forman todo problema de programación: La especificación o requerí-
Un requerimiento o requi- miento, el mundo o contexto y el requerimiento no funcional. Estos tres
sito no funcional es, en la
ingeniería de sistemas y la elementos son claves para realizar un correcto proceso de implementación
ingeniería de software, un
requisito que especifica cri- de sistemas de Software informático.
terios que pueden usarse
para juzgar la operación de
un sistema en lugar de sus
comportamientos específi- La soluciones de Software requieren por tanto, de la especificación, la cual
cos, ya que éstos corres-
ponden a los requisitos fun- se traduce como un mecanismo que permite detallar con claridad los
cionales.
requerimientos del usuario, es fundamentalmente cualquier cosa que el
Sistema debe realizar para dar respuesta al usuario y a sus necesidades
de computación y de procesamiento de información. Imaginemos el
siguiente caso: Una Institución de Educación Superior (IES), como una
Universidad o un Instituto de Formación Tecnológica está implementando
su Sistema Software de Información y está desarrollando a su vez, un
módulo para manejar los cursos de educación continuada. Se requiere
que el Sistema ejecute las siguientes funcionalidades:

 Buscar registros de propuestas de capacitación


 Crear ficha académica de nuevos programas

Fascículo No. 2
Lenguaje de
programación
4 Semestre 2
Lenguaje de programación

 Crear registro de propuesta de Educación Continuada Abierta


 Crear registro de propuesta de Educación Continuada Cerrada
 Evaluar el estado de satisfacción del cliente

Donde cada funcionalidad hace alusión a un “pantallazo” o conjunto de


pantallas que guiarán al usuario a realizar las tareas que mapean
situaciones del mundo físico. Por ejemplo, “crear registro de propuesta de
educación continuada abierta” haría alusión a un proceso en el cual el
director del centro de educación continuada debe crear un documento en
un procesador de palabras en donde se condensen elementos tales como:
el nombre del curso, el nombre del capacitador o proveedor que lo
impartirá, el número de horas de duración, los contenidos de los módulos
que lo forman, la metodología de trabajo y el esquema de evaluación del
mismo.

Se busca ahora, por tanto, que el Sistema permita agilizar ese proceso, de
manera que no tenga que hacerse en una herramienta externa (procesador
de palabras), sino que sea el mismo Sistema quien al final produzca el
documento de manera automática sin tener que intervenir mucho el
usuario en su construcción, por medio, por ejemplo, de una plantilla
estandarizada que genere el documento y lo almacene en la base de datos
del sistema.

Un requerimiento como “Evaluar el estado de satisfacción del cliente”,


haría alusión a la capacidad del sistema de permitir la presentación de un
formulario de evaluación, que por criterios genere estadísticas rápidas y un
consolidado promedio de los resultados de evaluación de todo el curso,
para evitar al usuario del Sistema tener que llevar los datos a una hoja de
cálculo electrónica y tener que realizar los análisis estadísticos de forma
manual.

Fascículo No. 2
Semestre 2 5 Lenguaje de
programación
Lenguaje de programación

Para realizar este proceso de análisis, que finalmente lleve a la


visualización de un producto Software puntual con pantallas, botones y
herramientas de procesamiento, se hace necesario detallar de forma muy
puntual y granular, cada interacción entre lo que el usuario humano (o no
humano) va a hacer, versus lo que el Sistema debe generar para
responder a sus respuestas.

Dicho proceso se realiza mediante la implementación de una serie de

En el Lenguaje de Modela- artefactos documentales, conocidos como Casos de Uso. Estos son
do Unificado, un diagrama
de casos de uso es una elementos que permiten capturar los requisitos de forma detallada,
especie de diagrama de
comportamiento del Sis- indicando las fronteras de operación del Sistema Software, los usuarios
tema. El Lenguaje de Mo-
delado Unificado define que interactúan con las funcionalidades y finalmente los resultados
una notación gráfica para
representar casos de uso generados por el procesamiento de las mismas, a partir del proceso de
llamada modelo de casos
de uso. interacción usuario-sistema. Dichos artefactos, se acompañan a su vez de
una serie de diagramas que permiten entender mejor la interacción del
usuario con el Sistema y de la responsabilidad que cada actor tiene en el
proceso. Dichos diagramas son conocidos igualmente como Diagramas
de Casos de Uso.

Figura 2.1
Ejemplo de diagramas de Casos de Uso de las
funcionalidades descritas en el problema de la
Universidad.

Fascículo No. 2
Lenguaje de
programación
6 Semestre 2
Lenguaje de programación

Como se observa en el ejemplo, cada óvalo representa la funcionalidad


sistémica que se desea que el Software provea, mientras que las pequeñas
figuras humanoides representan actores (en este caso de tipo humano)
que pueden interactuar con el sistema. Esto se ve reflejado en lo siguiente:

a) El asistente de educación continuada puede buscar en el Sistema


registros de propuestas de capacitación, para verificar si ya han sido
creadas o para identificar si no lo están. En caso de no existir, puede
proceder a crearlas para incluirlas en el sistema. Siempre habrá
necesidad de que existan nuevos cursos para vender por parte de la
Universidad.
b) Crear la ficha de un nuevo curso es responsabilidad del docente, tutor o
proveedor que imparte el curso. Una vez este ha ingresado los datos
del nuevo curso, el asistente puede entrar a verificar la propuesta para
dar su aval o visto bueno a la misma y ofertar el curso a través de los
medios de publicidad de la Universidad.
c) El asistente debe poder crear nuevas propuestas de educación
continuada tanto abiertas como cerradas (abiertas, son propuestas por
ejemplo que se abren al público en general, sin importar que tipo de
formación tengan previamente (podrían ser contadores, comerciantes,
ingenieros, etc.), por ejemplo, un curso de informática o de finanzas
para no financieros; mientras que una propuesta cerrada, es aquella
que se realiza sobre un tema en particular destinado a un público
objetivo específico, por ejemplo, un curso de fabricación de empaques
o un curso de sistemas de gestión de calidad para empresas del sector
ambiental).
d) Finalmente, el estudiante es quien debe evaluar los cursos, pues es él
quien realiza el curso una vez de abierto al público, ya sea la propuesta
en modalidad abierta o cerrada. Una vez evaluado un curso por el
compendio de todos sus estudiantes, el asistente debe poder entrar al

Fascículo No. 2
Semestre 2 7 Lenguaje de
programación
Lenguaje de programación

sistema para revisar las evaluaciones y generar la respectiva


retroalimentación, en aras de que el próximo curso sea mucho mejor.

Una vez se han identificado las funcionalidades, el siguiente paso es pasar


a documentar bien dicha interacción, para lo cual se emplea lo que se
conoce como Formatos Expandidos del Caso de Uso, los cuales contienen
los siguientes componentes:

1. Nombre detallado del Caso de Uso (se expresa mediante el uso de un


verbo en infinitivo o regular. Por ejemplo: Buscar registros, Imprimir
Documentos, Generar Listados, Crear usuarios, Eliminar cuentas
bancarias, etc.).
2. Descripción Breve: Ilustra en forma de resumen, lo que busca la
funcionalidad del sistema, el valor agregado que va a generar para el
usuario y los resultados que se espera que el sistema produzca una vez
ejecutada la función del Sistema.
3. Actores: Hace alusión a los actores humanos o no humanos (como por
ejemplo, otro Software u otro sistema informático) que interactúan con
la funcionalidad e instancian o despliegan el funcionamiento de la
misma. Sin actor no hay caso de uso que se pueda modelar.
4. Precondiciones: Indican el estado del Sistema antes de la ejecución de
la funcionalidad, es decir, cómo se encontrará el entorno de trabajo o
funcionalidades antes de que el actor despliegue la ejecución del caso
de uso. Por ejemplo, en un sistema de registro de pedidos, una
precondición puede ser que el usuario esté autenticado frente al sistema
o que existan registros de productos antes de que pueda generarse una
orden de pedido.
5. Flujo Básico de Eventos: Representa el conjunto lineal o algorítmico
secuencial de instrucciones e interacciones de procesamiento que se
realizan por el proceso de interacción usuario sistema. El flujo básico

Fascículo No. 2
Lenguaje de
programación
8 Semestre 2
Lenguaje de programación

de eventos describe el “caso ideal” o mejor de los casos donde toda la


secuencia correcta de pasos permite llegar a la completa ejecución de
toda la funcionalidad.
6. Flujos Alternativos: Permiten definir rutas alternas en la ejecución de
los procesos. Es decir, establecen alternativas que debe seguir el flujo
de interacción usuario-sistema a medida que se presentan otras
opciones para la ejecución del proceso en general. Por ejemplo, si
estuviéramos modelando un caso de uso relacionado con la compra de
productos, un flujo básico sería el que sigue el sistema al registrar la
compra en efectivo, mientras que flujos alternativos serían definidos en
la compra del mismo producto a través de tarjeta de crédito o pago con
cheque, opciones que harían que la interfaz gráfica de usuario con la
cual el usuario interactúa sea completamente diferente. Debe hacerse
la salvedad que el flujo alternativo lleva a una respuesta similar a la que
se genera en el flujo básico, solo que cambiando la forma de ejecutar
los procesos.
7. Flujos Excepcionales: Los flujos excepcionales hacen alusión a los
puntos de detención del sistema, donde al presentarse un error
producido ya sea por el usuario o por el Sistema, este debe reaccionar
para manejar y administrar dicho error. El flujo excepcional muestra
cómo debería validarse el error y qué mensaje deberá recibir el usuario
para entender y comprender la dificultad aceptada.
8. Puntos de Extensión: Definen la relación del requerimiento actual con
otros casos de uso, es decir, la vinculación que tiene la funcionalidad
con otras necesarias para el buen funcionamiento de todo el Sistema.
Por ejemplo, la funcionalidad de buscar registros de estudiantes está
relacionada con las funcionalidades de crear registros nuevos,
modificarlos y borrarlos también del Sistema.
9. Postcondiciones: Define cómo es el estado del sistema una vez ha
finalizado la ejecución de la funcionalidad sistémica. Indica cómo se

Fascículo No. 2
Semestre 2 9 Lenguaje de
programación
Lenguaje de programación

comportan tanto la aplicación como los datos, una vez han finalizado el
caso de uso, a través de su flujo básico de eventos o sus flujos
alternativos. Por ejemplo, si hablásemos de una aplicación de registro
de clientes en un hotel, la postcondición del caso de uso Reservar
Habitación, sería la de un registro de habitación separada, que fue
asignada a un usuario en particular (cliente del Hotel) y que ya no puede
ser dada a ningún otro cliente.
10. Reglas de Negocio: Define el conjunto de reglas matemáticas,
lógicas, de relaciones humanas y sociales que influyen en el desarrollo
de la lógica algorítmica del requerimiento funcional. Estas reglas son
muy importantes, precisamente porque establecen las bases del mundo
del problema que deben ser tenidas en cuenta para la posterior
implementación programática de las interacciones del usuario con el
sistema, a través de los objetos y las interfaces gráficas de usuario.

Metodología para la solución de problemas con el


enfoque de objetos
En la vida cotidiana estamos rodeados de objetos. Elementos físicos co-
mo automóviles, aviones, computadores, teléfonos, celulares, televisores, y
muchos otros que proveen servicios específicos para realizar tareas
cotidianas. ¿Qué comparten todos ellos en común? Pues el hecho de que
todos son elementos tangenciales que podemos tomar y utilizar para
realizar dichas tareas y que además tienen ciertas propiedades que se
alteran en el momento de hacer uso de ellos. Por ejemplo, cuando
usamos un televisor podemos cambiar de canal usando el control remoto
o subir y bajar el volumen del audio de lo que estamos viendo.
Identificamos, por tanto que el objeto televisor posee dos propiedades
internas (canal de televisión y volumen) y que existen operaciones que
podemos hacer sobre dicho objeto (cambiar el canal y subir o bajar el
volumen).

Fascículo No. 2
Lenguaje de
programación
10 Semestre 2
Lenguaje de programación

Bajo este precepto, durante la década de los 80 se analizó que la progra-


mación requería de mayor nivel de granularidad, puesto que los pro-
gramas de tipo estructurado estaban haciendo que el Software se hiciese
complejo y sobretodo, poco mantenible, y en el peor de los casos, com-
pletamente descartable. Se observó por tanto, con base en la experiencia
de lenguajes de programación como Simula 67 y posteriormente per-
feccionados por SmallTalk, que era posible definir estructuras de progra-
mación modulares que mostraran su propio comportamiento y pudieran
almacenar la información de persistencia de los objetos, entendiendo por
persistencia, como la capacidad de almacenar de forma permanente los
datos para su posterior visualización. Por lo tanto, definamos ahora con
mayor precisión los objetos.

Imagine un concepto del mundo real, por ejemplo, la cuenta bancaria de


un usuario. Esta es una entidad que como concepto hace alusión a un
registro de información financiero de una persona natural o jurídica que
permite almacenar el dinero de la persona como tal y realizar ciertas tareas
como transacciones como depósitos o retiros.

Figura 2.2
Objeto Cuenta Bancaria.

Imagen tomada de:


http://wiki.biensimple.com/download/attachments/5800278/siete-formas-llenar-cuenta.jpg).

¿Pero qué la hace realmente un objeto? Fundamentalmente el hecho de


que una cuenta bancaria no es una entidad que pueda ser asignada a una
sola persona, sino que por el contrario, cada persona (cada usuario del

Fascículo No. 2
Semestre 2 11 Lenguaje de
programación
Lenguaje de programación

banco) tiene su propia cuenta de manera individual e independiente.


Cuando tenemos al Señor Jaime Pérez, este muy seguramente en su
cuenta puede que no tenga saldo alguno ($0), mientras que la señorita
Martha Suárez podría tener $1000.000.000 en la de ella. Como se observa,
ambas cuentas son iguales en concepto, pero en su estado son diferentes
(el elemento saldo), el cual ya no se puede considerar como un objeto,
sino como una propiedad del mismo y que si observamos con profundidad
hace alusión a un dato de tipo numérico, en este caso un valor de clase
real (dado que el monto del saldo podría contener centavos. Ejemplo:
$50.500.35). Así encontramos que el objeto Cuenta Bancaria tendría
propiedades como estas, que harían una cuenta diferente a otra:
Cuenta de Jaime

20553335
Jaime Pérez
$0.00

Cuenta Bancaria

Número de Cuenta
Titular
Saldo

Cuenta de Martha

20553343
Martha Suárez
$1000.000.000.00
Figura 2.3
Concepto de la Cuenta Bancaria y ejemplos de la
cuenta en el mundo real.

¿Qué garantiza que cada cuenta sea individual? Muchas cosas. En primer
lugar que cuando se ejecute una transacción se haga hacia una cuenta
específica y que no afecte el saldo de los demás usuarios diferentes al del
interesado sobre el que se desea aplicar la transacción. También que sea
posible consultar el estado de cada uno o generar un reporte general del
estado de todos los usuarios en el sistema independientemente de que
sean 20 o 10000. ¿Pero, cómo llegamos a esto? Pues precisamente, a
través de la definición de una plantilla que permita especificar de forma

Fascículo No. 2
Lenguaje de
programación
12 Semestre 2
Lenguaje de programación

genérica, datos que sean comunes a todos los usuarios, y ahí es cuando
aparece el concepto de la Clase.

En el mundo real, normalmente se tiene muchos objetos del mismo tipo.


Por ejemplo: Un teléfono celular es sólo uno de los miles que hay en el
mundo. Si se habla en términos de la programación orientada a objetos, se
puede decir que el objeto celular de cualquier tipo es una instancia de una
clase conocida como “celular”. Los celulares tienen características (marca,
modelo, sistema operativo, pantalla, teclado, etc.) y comportamientos
(hacer y recibir llamadas, enviar mensajes multimedia, transmisión de
datos, etc.).

Cuando se fabrican los celulares, los fabricantes aprovechan el hecho de


que los celulares comparten características comunes y construyen
modelos o plantillas comunes, para que a partir de esas se puedan crear
muchos equipos celulares del mismo modelo. A ese modelo o plantilla se
le llama Clase, y a los equipos que se sacan a partir de esta se le llaman
objetos (Ejemplo: Celulares Motorola, celulares Nokia, Celulares Ericsson,
etc).

Esto mismo se aplica a los objetos de Software, se puede tener muchos


objetos del mismo tipo y mismas características. Por otro lado, una
instancia de una clase es otra forma de llamar a un objeto. No existe
diferencia entre un objeto y una instancia. Sólo que el objeto es un término
más general, pero los objetos y las instancias son ambas representación
de una clase.

Así, en nuestro ejemplo, tendríamos que la Cuenta Bancaria se convierte


por tanto, en una Clase, una plantilla aplicable a cualquier usuario del
banco:

Fascículo No. 2
Semestre 2 13 Lenguaje de
programación
Lenguaje de programación

Cuenta de Jaime
20553335
Jaime Pérez
$0.00
Cuenta Bancaria

Número de Cuenta
Titular
Saldo Cuenta de Martha
20553343
Martha Suárez
$1000.000.000.00

Figura 2.4
Clase Objetos
Representación de una Clase y de sus correspondientes objetos.

Así pues, en el momento en que se crea un nuevo objeto a partir de su


plantilla, estamos creando una entidad individual de información con sus
propias propiedades y comportamiento y dicho proceso se conoce como
Instanciación. Se dicen entonces, que un Objeto es una Instancia o un
nuevo tipo de dato generado a partir de una Clase que define su estructura
y comportamiento.

Con el objeto de hacer un proceso más detallado de diagramación de los


objetos, se ha desarrollado como acotamos en el Fascículo 1, el lenguaje
de modelado UML, que permite establecer a través de su notación, los
elementos estructurales de diseño de una solución de Software basada en
el paradigma orientado a objetos. Dichos diagramas de Clases, están
formados por los siguientes elementos:

 Propiedades: también llamados atributos o características, son valores


que corresponden a un objeto, como color, material, cantidad,
ubicación. Generalmente se conoce como la información detallada del
objeto. Suponiendo que el objeto es una puerta sus propiedades serían:
la marca, tamaño, color y peso.

Fascículo No. 2
Lenguaje de
programación
14 Semestre 2
Lenguaje de programación

 Operaciones: son aquellas actividades o verbos que se pueden realizar


con/para este objeto, como por ejemplo abrir, cerrar, buscar, cancelar,
acreditar, cargar. De la misma manera que el nombre de un atributo, el
nombre de una operación se escribe con minúsculas si consta de una
sola palabra. Si el nombre contiene más de una palabra, cada palabra
será unida a la anterior y comenzará con una letra mayúscula, a
excepción de la primera palabra que comenzará en minúscula. Por
ejemplo: abrirPuerta, cerrarPuerta, buscarPuerta, etc.

Figura 2.5
Ejemplo de un Diagrama de Clases.

Para nuestro caso de la Cuenta Bancaria, el diagrama de Clases


contendría los siguientes elementos:

Figura 2.6
Diagrama de Clases para el Objeto CuentaBancaria

Como podemos observar las propiedades caracterizan la información que


es manipulada por el objeto y que define la persistencia de los datos a lo
largo del ciclo de vida de ejecución del Software implementado por este
objeto y otros que puedan llegar a colaborar con él para desarrollar la
lógica de negocio

Se resumen las funcionalidades que pueden desarrollarse en la siguiente


tabla (2.1):

Fascículo No. 2
Semestre 2 15 Lenguaje de
programación
Lenguaje de programación

Operación Retorno Parámetros


Depositar Booleano (Indica Número de Es un dato
Dinero si se pudo o no se Cuenta alfanumérico que
pudo retirar el el usuario debe
dinero de la ingresar en el
cuenta) cajero para
reconocer su
número de cuenta
montoConsignar Es un valor real
que indica la
cantidad total de
dinero que va a
ser ingresado a la
cuenta
Retirar Real (Es el valor codigoCuenta Es el código de
Dinero total que fue identificación
retirado de la único de la cuenta
cuenta tras la aceptaRetirar Es un valor
ejecución de la booleano que
funcionalidad) indica si
efectivamente se
va a retirar el
dinero. Si llegare
a valer false es
porque el usuario
decidió no retirar
el dinero
montoRetirar Es un valor real
que indica la
cantidad de
dinero a retirar de
la cuenta
Consultar Real (El valor del codigoCuenta Es el código de la
Saldo saldo que va a ser cuenta que va a
consultado) ser consultado
Cerrar Booleano (Indica codigoCuenta Es el código de
Cuenta si la cuenta identificación
efectivamente fue único de la cuenta
cerrada o no) aceptaCierre Es un valor
booleano que le
ratifica a la
operación si
efectivamente se
va a realizar el
cierre de la cuenta
bancaria
Tabla 2.1

Fascículo No. 2
Lenguaje de
programación
16 Semestre 2
Lenguaje de programación

A partir del diagrama de Clases, mapeando los elementos presentes en la


Diagramación, tendríamos la implementación de la Clase en el lenguaje de
Programación Java.
(ver Anexo 1 - definición del problema del cajero bancario)

Como se puede observar, el diagrama de Clases define qué métodos se


van a implementar, más no cómo se van a implementar. Dicha función
corresponde al programador, considerando los criterios principales de la
lógica de negocio asociada al problema. El código como se observa en el
ejemplo anterior está definido para no generar errores en el IDE, pero aún
no implementa ninguna funcionalidad concreta.

Ejemplos de problemas resueltos con objetos


Considerando el anterior análisis de la cuenta bancaria, imagine que se
solicita realizar la siguiente implementación: Generar una aplicación que
desarrolle un cajero electrónico que permita ingresar dinero y retirar del
mismo un valor determinado por el usuario. El sistema debe tener en
cuenta las siguientes características:

 Cuando se realiza una consignación mayor a $10.000.00, el Banco


genera un bono de contribución para el cuenta habiente del 20% del
valor depositado.
 Cuando el usuario retira cualquier cantidad de dinero mayor a
$500.000.00, se genera una retención del 5% sobre el monto retirado.
 El Sistema debe generar un mensaje de error que no permite retirar si el
saldo actual del cuentahabiente es menor o igual a $5000.00.

Teniendo esto en cuenta, el Sistema implementaría los siguientes casos de


uso:
a) Consignar monto en cuenta
b) Retirar monto de cuenta
c) Consultar Saldo de la Cuenta

Fascículo No. 2
Semestre 2 17 Lenguaje de
programación
Lenguaje de programación

Lo que nos lleva a las siguientes especificaciones de los casos de uso y a


generar, por supuesto, el siguiente diagrama de UML:

Figura 2.7
Diagrama de Casos de Uso del Caso
de la Cuenta Bancaria.

Las especificaciones del caso de uso: Consignar monto de cuenta,


rezarían bajo el siguiente tenor:
Caso de Uso: Consignar monto en cuenta
1. Descripción breve: Este caso de uso hace alusión a la capacidad del sistema de
poder ingresar un valor específico de dinero a la cuenta bancaria y con ello
incrementar el valor actual del saldo consignado en dicha cuenta. Para ello el
usuario debe ingresar el código de la cuenta y el valor total que desea consignar.
2. Actor: Cuentahabiente o usuario
3. Precondición: Contar con una cuenta habilitada en el Sistema y tener un saldo y
un titular asignado a la misma.
4. Flujo Básico de Eventos
1. El usuario ingresa el código de la cuenta
2. El sistema solicita el valor total que va a ser consignado
3. El usuario ingresa el valor del total a depositar
4. El sistema incrementa el valor del saldo de la cuenta
5. El sistema informa al usuario que el valor ha sido consignado
6. El usuario recibe el desprendible de confirmación del monto consignado.
5. Flujos Excepcionales
5.1 Primer flujo excepcional: Si en el paso 1 el usuario ingresa mal el código, el
Sistema genera un mensaje de error informándole que dicha cuenta no existe. El
Sistema regresa a pedir nuevamente el código.
5.2 Segundo flujo excepcional: Si en el paso 2, el usuario presiona el botón
Cancelar, el Sistema genera un mensaje de error indicando que la operación de
consignación ha sido cancelada. El sistema se cierra por seguridad.
6. Postcondición: Una vez finalizado el ingreso del nuevo monto, el Sistema
actualiza el saldo del cuentahabiente.
7. Lógica de Negocio: Cuando se realiza una consignación mayor a $10.000.00, el
Banco genera un bono de contribución para el cuentahabiente del 20% del valor
depositado.

Fascículo No. 2
Lenguaje de
programación
18 Semestre 2
Lenguaje de programación

Una vez establecidos los casos de uso (para el ejemplo sólo se establece
el caso de uso: Consignar monto de cuenta) se procede al análisis
gramatical de los mismos, para identificar los objetos candidatos, los
nombres de las operaciones potenciales (métodos) y los datos críticos
para el diseño de los objetos (atributos):
Caso de Uso: Consignar monto en cuenta
1. Descripción breve: Este caso de uso hace alusión a la capacidad del sistema de
poder ingresar un valor específico de dinero a la cuenta bancaria y con ello
incrementar el valor actual del saldo consignado en dicha cuenta. Para ello el
usuario debe ingresar el código de la cuenta y el valor total que desea consignar.
2. Actor: Cuentahabiente o usuario
3. Precondición: Contar con una cuenta habilitada en el Sistema y tener un saldo y
un titular asignado a la misma.
4. Flujo Básico de Eventos
1. El usuario ingresa el código de la cuenta
2. El sistema solicita el valor total que va a ser consignado
3. El usuario ingresa el valor del total a depositar
4. El sistema incrementa el valor del saldo de la cuenta
5. El sistema informa al usuario que el valor ha sido consignado
6. El usuario recibe el desprendible de confirmación del monto consignado.

5. Flujos Excepcionales
5.1 Primer flujo excepcional: Si en el paso 1 el usuario ingresa mal el código, el
Sistema genera un mensaje de error informándole que dicha cuenta no existe. El
Sistema regresa a pedir nuevamente el código.
5.2 Segundo flujo excepcional: Si en el paso 2, el usuario presiona el botón
Cancelar, el Sistema genera un mensaje de error indicando que la operación de
consignación ha sido cancelada. El sistema se cierra por seguridad.
6. Postcondición: Una vez finalizado el ingreso del nuevo monto, el Sistema
actualiza el saldo del cuentahabiente.
7. Lógica de Negocio: Cuando se realiza una consignación mayor a $10.000.00, el
Banco genera un bono de contribución para el cuentahabiente del 20% del valor
depositado.

Considerando esto, se tendría como objeto candidato para la implemen-


tación al concepto Cuenta y como atributos de información de la misma,
los elementos Código (número de identificación de la cuenta) y saldo
(valor total consignado actualmente en dicha cuenta). Como operaciones,
tendríamos los posibles métodos consignarDinero, retirarDinero y
consultarSaldo, los cuales se especializarían a través de los distintos datos
que son necesarios para lograr la realización de las operaciones. Acto

Fascículo No. 2
Semestre 2 19 Lenguaje de
programación
Lenguaje de programación

seguido, se procede a elaborar el diagrama de clases para modelar el


objeto con el cual se realizará el desarrollo de la solución de programación
bajo el lenguaje seleccionado: el lenguaje Java de Sun Microsystems.

Figura 2.8
Diagrama de Clases para la solución del Banco.

Lo que nos llevaría a la siguiente implementación bajo Java, que siguiendo


la lógica de negocio y la lógica establecida en los flujos de los casos de
uso, sería así.
(Ver Anexo 2 – implementación del problema del cajero bancario).

A continuación, veamos el funcionamiento del Programa:


Flujo básico de Eventos del Caso de Uso Consignar monto en
Cuenta

Figura 2.9
Secuencia de eventos del caso de Uso
Consignar monto en cuenta.

Fascículo No. 2
Lenguaje de
programación
20 Semestre 2
Lenguaje de programación

Tenga en cuenta que el ejemplo explicado a continuación no es


una plantilla absoluta ni definitiva en la definición de los procesos
de desarrollo de Software que actualmente son manejados a nivel
internacional. No obstante, si es una buena aproximación de
cómo el desarrollador de Software debe considerar todos los
criterios en los procesos de análisis, diseño e implementación en
la construcción de la solución. Recuerde que independientemente
de las herramientas de diseño y de programación escogidas,
debe existir una total trazabilidad entre las fases con el objeto de
que la aplicación de Software final esté fuertemente construida y
soporte los posibles errores y excepciones, consideradas en una
nutrida y granular descripción de las especificaciones funcionales
de los Casos de Uso (Funcionalidades del Sistema), y lo más
importante, que respete la esencia de la lógica de negocio
(mundo del problema).

Desarrollo de métodos para los objetos


En el ejemplo anterior se definieron funcionalidades implementadas por el
objeto y que hemos denominado convenientemente a estas operaciones,
según la jerga de la orientación a objetos, como métodos de programa-
ción. Igualmente observamos que dichos métodos tiene una estructura de
la siguiente forma:
public double retirarDinero (String codigoCuenta, boolean
aceptaRetirar, double montoRetirar)

Ahora veamos que significa cada elemento en la construcción del método:


Elemento Significado
public Visibilidad. Es una palabra reservada que le indica al
compilador de Java que el método es accesible desde el
interior del objeto y desde otros objetos que interactúen con
él.
double Tipo de retorno del método. Establece el valor que ha de ser
regresado al punto de ejecución en el programa principal
una vez el método ha sido ejecutado o a otro método
cuando el actual es invocado dentro del primero. En Java se
pueden retornar tres tipos de elementos: Datos primitivos,
otros objetos o no retornarse nada (por lo que se debe
emplear la palabra reservada void (vacío)).

Fascículo No. 2
Semestre 2 21 Lenguaje de
programación
Lenguaje de programación

retirarDinero Es el nombre que el programador asigna al método. Es


importante que el nombre del método vaya asociado a las
acciones descritas en los flujos descritos en los casos de
uso (básicos, alternos y excepcionales), con el fin de que
sea mucho más claro el desarrollo de dichas funcionali-
dades. No debe olvidarse que dichos métodos deben
nomenclarse con un verbo regular o en infinitivo (Por
ejemplo: calcularRenta, evaluarProveedor, consignarMonto,
designarArbitro, etc., considerando que la primera letra del
nombre del método va en minúsculas y las restantes de los
sustantivos sobre los que se aplica la acción deben ir en
mayúsculas iniciales). NO USAR ESPACIOS EN BLANCO NI
CARACTERES ORTOGRÁFICOS DEL ESPAÑOL PARA
NOMENCLAR LOS MÉTODOS, PUESTO QUE SE GENERA
UN ERROR DE SINTAXIS PARA EL COMPILADOR.
(String Dentro de los paréntesis de la firma o signatura del método
codigoCuenta, se deben colocar los argumentos o parámetros del método.
boolean Estos son los valores de entrada o información que el
aceptaRetirar, método requiere para poder hacer realidad la descripción
double algorítmica descrita en los flujos básicos, alternos y
montoRetirar) excepcionales de los casos de uso. La sintaxis de la
nomenclatura de parámetros debe seguir la forma TipoDato
NombreParametro, separado cada valor por comas y sin
incluir a diferencia de otras sentencias, el separador de
punto y coma (;) al final.
Ej:
public double calcularImpuestoVentas (double valor, double
porcentajeImpuesto, double retencion)
{
}

Veamos más ejemplos de la signatura de los métodos en Java:

Retorno de un dato entero

public int calcularSuma (int n1, int n2)


{
//Tipo de dato del retorno
int resultado = 0;

//Algoritmo de cálculo
resultado = n1 + n2;

//Retorno del método


return (resultado);
}

Fascículo No. 2
Lenguaje de
programación
22 Semestre 2
Lenguaje de programación

Retorno de un dato real

public double calcularIVAProducto (double precio, double porcentaje)


{
double ivaProducto = 0.0;
ivaProducto = precio * porcentaje;
return (ivaProducto);
}

Retorno de un dato booleano

public boolean determinarSiSePagaImpuesto (double precio, double


retencion)
{
boolean sePagaImpuesto = false;
double pago = 0.0;
pago = precio * 0.16;
if (pago > 5000)
{
sePagaImpuesto = true;
}
return (sePagaImpuesto);
}

Retorno de un dato caracter (char)


public char obtenerInicialNombre (String nombre)
{
char caracterInicial = ‘\0’;
caracterInicial = nombre.charAt(0);
return (caracterInicial);
}

Retorno de un dato de cadena de caracteres (String)


public String obtenerNombreMes (int numeroMes)
{
String nombreMes = "";

switch (numeroMes)
{
case 1:
nombreMes = "Enero";
break;
case 2:
nombreMes = "Febrero";
break;
case 3:
nombreMes = "Marzo";

Fascículo No. 2
Semestre 2 23 Lenguaje de
programación
Lenguaje de programación

break;
case 4:
nombreMes = "Abril";
break;
case 5:
nombreMes = "Mayo";
break;
case 6:
nombreMes = "Junio";
break;
case 7:
nombreMes = "Julio";
break;
case 8:
nombreMes = "Agosto";
break;
case 9:
nombreMes = "Septiembre";
break;
case 10:
nombreMes = "Octubre";
break;
case 11:
nombreMes = "Noviembre";
break;
case 12:
nombreMes = "Diciembre";
break;
}//Fin del switch

return (nombreMes);
}

Retorno de un valor de tipo Objeto (En el ejemplo, existe una clase llamada
Empleado, que es el objeto que el método va a retornar) – (VER ANEXO 3 –
IMPLEMENTACIÓN DE LA CLASE EMPLEADO):

Método de retorno:
public Empleado obtenerDatosEmpleado (String codigo,
String nombre, String apellido, int edad, double salario)
{
Empleado datosEmpleado = null;
//Instanciamos el objeto a retornar
datosEmpleado = new Empleado();

/*Establecemos los valores de los atributos mediante


los métodos de encapsulamiento de la clase y tomados de los
valores de los parámetros*/

Fascículo No. 2
Lenguaje de
programación
24 Semestre 2
Lenguaje de programación

datosEmpleado.setCodigo(codigo);
datosEmpleado.setNombre(nombre);
datosEmpleado.setApellido(apellido);
datosEmpleado.setEdad(edad);
datosEmpleado.setSalario(salario);

return (datosEmpleado);
}

Los métodos de encapsulamiento son métodos que permiten definir la


accesibilidad hacia el objeto, entendiendo por accesibilidad como la
capacidad de los demás objetos de interactuar con el objeto diseñado. Un
ejemplo claro lo tenemos por ejemplo con las propiedades de un objeto
como teléfono celular, tales como el número de llamadas que puede
manejar, el valor del saldo de la cuenta de pago y el listado de teléfonos de
su agenda. Estos datos cuando están escondidos no pueden ser alterados
por otros objetos. Otro teléfono celular no puede alterar la agenda del
teléfono actual ni alterar el saldo del mismo. No obstante las funciones
como llamar, recibir llamadas, mandar mensajes de texto, que son fun-
ciones genéricas a todos los teléfonos, si se encuentran expuestas al uso
de los usuarios. El cambio en el estado de las variables de instancia o
atributos del objeto teléfono celular (saldo, número de llamadas, etc.) se da
por el accionar de dichas operaciones que se exponen a los usuarios de
los teléfonos como la capa de servicios por ellos implementados. Enten-
damos esto mejor a través de la siguiente tabla:
Elemento Visibilidad
Número de llamadas Privada (private en Java y signo (-) en UML)
Listado de Llamadas Privada (private en Java y signo (-) en UML)
Saldo de la Cuenta del Teléfono Privada (private en Java y signo (-) en UML)
hacerLlamada (int numeroDestino) Pública (public en Java y signo (+) en UML)
recibirLlamada () Pública (public en Java y signo (+) en UML)
enviarMensaje (String mensaje, int Pública (public en Java y signo (+) en UML)
numeroDestino)

Por lo tanto, cuando se crea una nueva clase en Java, se puede especificar
el nivel de acceso que se quiere para las variables de instancia y los
métodos definidos en la clase:

Fascículo No. 2
Semestre 2 25 Lenguaje de
programación
Lenguaje de programación

public: Cualquier clase desde cualquier lugar puede acceder a las


variables y métodos de instancia públicos.
public void cualquieraPuedeAcceder()
{
}

protected: Sólo las subclases de la clase y nadie más puede acceder a


las variables y métodos de instancia protegidos. Ya veremos este tema
con más detalle en el fascículo de Herencia.
protected void SoloSubClases()
{
}

private: Las variables y métodos de instancia privados sólo pueden ser


accedidos desde dentro de la clase. No son accesibles desde las
subclases.

//Ejemplo de un atributo de encapsulamiento privado


private String NumeroDelCarnetDeIdentidad;

friendly (sin declaración específica): Por defecto, si no se especifica el


control de acceso, las variables y métodos de instancia se declaran friendly
(amigas), lo que significa que son accesibles por todos los objetos dentro
del mismo paquete, pero no por los externos al paquete. Es lo mismo que
protected.
void MetodoDeMiPaquete()
{
}

Tenga claro que gracias al elemento de la accesibilidad, los métodos y los


datos de los atributos pueden ser accedidos con el fin de proveer
funcionalidad a la programación orientada a objetos en el momento de la
implementación.

Tipos de datos.
Uso de funciones predefinidas.
Ejemplos de conversión de algoritmos a métodos de clases en Java
Los datos en Java son el punto de partida fundamental para la
construcción de los algoritmos. Gracia a ellos, es posible caracterizar la

Fascículo No. 2
Lenguaje de
programación
26 Semestre 2
Lenguaje de programación

información del mundo real, en términos de lo que deseamos que el


programa procese a través de sus cálculos y funciones. Finalmente,
gracias a estos tipos, podemos construir variables en nuestros programas,
las cuales se catalogan en las siguientes:
a) Variables de instancia o atributos: en la esencia del paradigma
orientado a objetos, constituyen la fuente de información primaria de
procesamiento de cualquier clase. Dichas variables poseen una
visibilidad privada, lo que indica que sólo la clase que las implementa
puede manipular a través de sus métodos, la información contenida en
ellas. Tienen alcance, es decir, se pueden usar por todo el código del
programa, pero siempre dentro de los métodos de lógica de negocio
implementados por la clase. Ejemplos:
/*
* Atributos de la clase o variables de instancia
* Tienen alcance por todo el código de la aplicación,
* específicamente al interior de los métodos de
* programación, responsables de la alteración de su estado
* */
private int numero1;
private int numero2;
private int resultado;

//Métodos de lógica de la clase


/*
* Métodos que emplean las variables de instancia
* para la realización de cálculos. Como se observa
* en el código, el IDE pinta las variables de color azul
* para indicar al compilar el alcance de estas, dentro
* de los métodos
* */
public int calcularSuma ()
{
resultado = numero1 + numero2;
return (resultado);
}

public void imprimirResultado (String mensaje, int valor)


{
resultado = valor;
JOptionPane.showMessageDialog(null,mensaje + resultado);
}

Fascículo No. 2
Semestre 2 27 Lenguaje de
programación
Lenguaje de programación

b) Variables locales a los métodos: Son variables que el compilador


utiliza únicamente durante la ejecución de dichos métodos. Una vez se
ha finalizado la ejecución del método y el retorno (si ha sido
implementado) se genera, el garbage collector (recolector de basura de
Java) libera las referencias de memoria de dichas variables. Ejemplo:
/*
* Métodos que emplean variables con alcance solo
* local a dichos métodos. A diferencia de los métodos
* anteriores, como se observa acá, en el momento de
* declarar una variable de tipo entero, local al método
* calcularProducto y calcularCociente, esto hace que el IDE la coloque
* de color negro, indicándole con ello a compilador, de que
* a pesar de llamarse igual al atributo de la clase, esta
* variable solo tiene alcance local en el método y solo
* va a ser utilizada en el procesamiento algorítmico del mismo
* */
public int calcularProducto (int n1, int n2)
{
int resultado = 0;
resultado = n1 * n2;
return (resultado);
}
public int calcularCociente (int n1, int n2)
{
int resultado = 0;
if (n2 != 0)
{
resultado = n1/n2;
}

return (resultado);
}

c) Variables locales a las instrucciones o sentencias: Son variables que


únicamente se emplean dentro de instrucciones como ciclos para o en
bloques de instrucciones definidos por llaves, como las que puede tener
la parte verdadera o falsa de una decisión. Si durante la ejecución del
programa, por ejemplo, la condición lógica hace que no se ejecute la
parte (falsa o verdadera) en donde se encuentren esas variables, eso
significa que la máquina virtual de Java jamás libera memoria para la
instanciación de dichas variables. Ejemplos:

/*

Fascículo No. 2
Lenguaje de
programación
28 Semestre 2
Lenguaje de programación

* En los siguientes métodos, observaremos


* la declaración de variables con alcance únicamente
* en instrucciones. Esto significa, que una vez
* la variable ha sido utilizada, no puede ser invocada
* en otros sectores del código donde la variable
* no es visible
* */
public void calcularPromedioNotas (int numero_notas)
{
//Alcance de la variable solo dentro de un ciclo para
double promedio = 0.0;
double nota = 0.0;

for (int i = 0; i < numero_notas; i++)


{
nota =
Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese el
valor de la nota: "));
promedio = promedio + nota;
}
//Esta instrucción no podría ejecutarse, puesto que la variable i
//tiene alcance solo en el for
//JOptionPane.showMessageDialog(null,"Valor del contadori i: " + i);

//En cambio, promedio como tiene alcance en el método


//si puede ser accesada fuera del for, pero no antes de
//su declaración
promedio = promedio/numero_notas;
JOptionPane.showMessageDialog(null,"Promedio de notas: " +
promedio);
}

Ejemplo
Desarrollar un algoritmo para ingresar una cadena de caracteres y obtener
su equivalente inverso (la cadena al revés). Obramos de igual forma:
Retorno Una cadena de caracteres (en este caso, la cadena al revés).
Esto nos lleva a declarar un retorno de tipo String.
Nombre del método Vamos a realizar la conversión de una cadena para obtener su
equivalente inverso. Por lo tanto, el mejor nombre para el
método sería invertirCadenaCaracteres()
Parámetros Tenemos como insumo para este problema, la cadena original,
por lo tanto, nuestro parámetro de ingreso al método sería String
cadenaOriginal

Fascículo No. 2
Semestre 2 29 Lenguaje de
programación
Lenguaje de programación

La implementación, por tanto sería:


public String invertirCadenaCaracteres (String cadenaOriginal)
{
//Variables locales
String cadenaInvertida = "";
int i = 0;
char caracter = '\0';

//Recorremos la cadena de atrás hacia adelante


for (i = cadenaOriginal.length()-1; i >= 0; i--)
{
//Sacamos el caracter actual de la cadena
caracter = cadenaOriginal.charAt(i);
//Lo agregamos a la cadena que va a tener la
//palabra
//invertida
cadenaInvertida += caracter;
}

//Retornamos la cadena invertida


return (cadenaInvertida);
}

2.1

1) Desarrolle un algoritmo para calcular el salario mensual neto de un


empleado que tiene las siguientes condiciones:

 Si el empleado trabaja entre las 8:00 am y las 10:00 pm se le paga


un recargo de horas extra equivalente al 10% del total de su sueldo
bruto.
 Si el empleado trabaja entre las 10:00 p.m y las 6:00 a.m. del
siguiente día se le paga un recargo de horas extras más horas
nocturnas equivalente al 20% del salario bruto (las horas extra
representan el 10% y las nocturnas el otro 10%).
 Si el empleado trabaja entre las 6:00 a.m y las 8:00 a.m no se le da
ningún recargo adicional.

A todos los sueldos brutos, independientes del recargo, deben


cobrárseles las siguientes deducciones:
15% por salud
14.5% por pensiones y cesantías
1.25% por Riesgos profesionales si está en nivel I
2.25% por Riesgos profesionales si está en nivel II
3.25% por Riesgos profesionales si está en nivel III
4.25% por Riesgos profesionales si está en nivel IV
5.25% por Riesgos profesionales si está en nivel V

Fascículo No. 2
Lenguaje de
programación
30 Semestre 2
Lenguaje de programación

2) Desarrolle un algoritmo que sume todos los números de un rango


dado de valores y calcule sobre ellos los siguientes valores:

X = (2 * Suma)/5;
Y = (Suma^3) + 1/3 * (Suma*sqrt(Suma))
Z = 1/2 * (Suma) + sqrt(LN(Suma+1/Suma))

Así, si los valores están entre 1 y 5, la suma debe dar 15 y el algoritmo


debe dar los resultados de los cálculos arriba mencionados.

3) Desarrolle un algoritmo para calcular el número total de días que


contiene un grupo de años dado. Así si se introducen 40 años, el
algoritmo debe mostrar 14610 días. Recuerde que algoritmo debe
tener en cuenta los años que son bisiestos.

4) Desarrolle un algoritmo para imprimir los números necesarios que se


necesitan para llegar a un valor dado. Es decir, si al algoritmo se le
introduce un 20, el algoritmo debe mostrar los números necesarios
para llegar a 20, es decir, 1,2,3,4,5,6 y mostrar la diferencia que hace
que dicha suma sea igual al número dado.

1 + 2 + 3 + 4 + 5 + 6 = 21
21 – 20 = 1

Como se estudió, la esencia de la programación orientada a objetos se


encuentra en la modularidad. Podemos tomar un problema simple o
complejo de programación y desglosarlo en unidades funcionales cono-
cidas como métodos, las cuales están encargadas de implementar la
lógica algorítmica de la solución.

Por otro lado, se abordó la importancia de analizar los requerimientos del


usuario, antes de proceder a cualquier implementación programática,
puesto que estableciendo adecuadamente los requerimientos es más fácil
modelar los objetos y finalmente los objetos que darán vida a los
algoritmos.

Fascículo No. 2
Semestre 2 31 Lenguaje de
programación
Lenguaje de programación

Algo muy importante es que cualquier problema de programación,


indepen-dientemente del lenguaje utilizado, debe ser completamente
analizado antes de su programación puntual bajo el lenguaje y la
plataforma de ejecución. Esto evitará errores tanto en la compilación como
en la ejecu-ción y garantizará el correcto funcionamiento del algoritmo, en
aras de dar completa y total satisfacción a los requerimientos funcionales
de los usua-rios y con el objetivo a largo plazo, de optimizar los costos en
el proceso de mantenimiento del Software.

Allen Weiss, M. (2000). Estructuras de Datos en Java. México, D.F.:


Pearson Education.
Deitel, H. M., & Deitel, P. J. (2004). CÓMO PROGRAMAR EN JAVA. México,
D.F.: PEARSON EDUCATION.
Format, E. C. (1999). Java Enterprise In A Nutshell. New York.
Lemay, L. y. (1998). Aprendiendo Java 1.1 en 21 días. México, D.F.: 1998.
Villalobos S., J. A., & Casallas G., R. (2006). FUNDAMENTOS DE
PROGRAMACIÓN - APRENDIZAJE ACTIVO BASADO EN CASOS. México,
D.F.: PEARSON, Prentice Hall.

En el próximo fascículo se profundizará en la construcción de métodos, en


la esencia del encapsulamiento y se visualizará la importancia de la acce-
sibilidad de clases, métodos y atributos, como parte del buen diseño de
una aplicación informática. Por último, se recordarán algunos conceptos
de lógica algorítmica y se diseñarán programas más sofisticados que
muestren la esencia del paradigma y de la algoritmia como herramientas
que permiten el buen desarrollo de Software para la computadora.

Fascículo No. 2
Lenguaje de
programación
32 Semestre 2
Lenguaje de programación

Seguimientoal autoaprendizaje

Lenguaje de Programación - Fascículo No. 2


Nombre_______________________________________________________
Apellidos ________________________________ Fecha: _________________
Ciudad___________________________________Semestre: _______________

1. Desarrolle un algoritmo y su implementación bajo una Clase Java, que permita


calcular el volumen de un cubo, un cilindro y una pirámide de 4 facetas o
caras. Recuerde diseñar los diagramas de casos de uso (puede emplear
Microsoft Visio 2003 o 2007 para diseñar los diagramas), luego diseñar las
especificaciones de los requerimientos funcionales y posteriormente
implementar el diagrama de clases y el código Fuente en Java que permita
realizar la implementación, siguiendo los ejemplos vistos en esta guía de
estudio.

2. Siguiendo las premisas del punto 1, desarrolle una aplicación Java que calcule
el promedio de notas de un estudiante (máximo 5 notas) con base en la
siguiente lógica de negocio:

 Si el promedio del estudiante está entre 1 y 2, está reprobado


 Si el promedio está entre 2 y 3, está en período de prueba
 Si el promedio está entre 3 y 4, el estudiante está aprobado
 Si la nota es mayor a 4, el estudiante está becado

El programa debe imprimir las cinco notas, el promedio y el mensaje de su


estado. Considere estas especificaciones muy bien, en el momento de diseñar
los atributos del Objeto que vaya a modelar para diseñar la solución.

3. Desarrolle una aplicación con sus casos de uso, especificaciones, diagrama de


clases e implementación bajo Java, que calcule la facturación de una empresa
de gas, que utiliza la siguiente lógica de negocio:

Toda facturación debe tener una lectura de medición de gas del mes anterior y
del mes actual y de la diferencia se obtiene el consumo en el mes. Por ejemplo,
si el período es febrero-marzo, entonces si la lectura anterior fue de 200 m3 de
gas y la del mes actual 450, entonces eso quiere decir que vamos a facturar el
mes de febrero con un consumo de 250 m3.

El cargo fijo de la tarificación está fijado por los siguientes estratos:

Fascículo No. 2
Semestre 2 33 Lenguaje de
programación
Lenguaje de programación

Estrato Cargo Fijo


1 $2500.00
2 $3800.00
3 $4500.00
4 $6500.00
5 $7200.00

La fórmula de tarificación es la siguiente:


C arg oFijo  C arg oVariable
ValorFactu rado 
2  Consumo  1500
C arg oVariable  Consumo  3  Consumo

Finalmente, cada metro cúbico de gas consumido, tiene un valor también que
depende del estrato
Estrato Valor del metro cúbico
1 $500.00
2 $650.00
3 $800.00
4 $1000.00
5 $2500.00
El programa debe mostrar el nombre del cliente, el consumo, las lecturas de los
meses, el período facturado, el valor del metro cúbico, el cargo fijo, el cargo
variable y el total de la factura para ese usuario del SPD (Servicio Público
Domiciliario).

Fascículo No. 2
Lenguaje de
programación
34 Semestre 2
Lenguaje de programación

Anexo 1
Definición de la clase para el problema del cajero
bancario
/**
* @author Ingeniero Jaime Alberto Gutiérrez Mejía
* Fundación Universitaria San Martín
* Espacio Académico: Lenguaje de Programación
* Fascículo II: UNIDAD II: CARACTERIZACIÓN DEL LENGUAJE DE
PROGRAMACIÓN
*
* Ejemplo de una Clase Java implementada a partir del Diagrama
* de Clases en UML
* Objeto Cuenta Bancaria
*
* Define una serie de operaciones y atributos relacionados
* con el manejo de la cuenta bancaria de un usuario de un banco
*/

public class CuentaBancaria


{//Inicio de la clase
/**********************************************/
/**********************************************/
/**********************************************/
//Atributos o características de la cuenta bancaria
private String numeroCuenta;
private String titular;
private double saldo;

/**********************************************/
/**********************************************/
/**********************************************/
//Método Constructor
public CuentaBancaria()
{
super();
// TODO Auto-generated constructor stub
}

/**********************************************/
/**********************************************/
/**********************************************/
/*
* Operaciones o métodos que operan la lógica de comportamiento
* de la clase
* */

Fascículo No. 2
Semestre 2 35 Lenguaje de
programación
Lenguaje de programación

/*
* Método para consignar un monto de dinero contra el saldo
* de la cuenta bancaria
*
* Recibe como argumentos, el código de la cuenta y el total
* que va a ser consignado. Una vez se ha ejecutado la
* consignación
* devuelve un valor booleano (verdadero si se pudo consignar o
* false si se generó un error.
* */
public boolean consignarDinero (String numeroCuenta,
double montoConsignar)
{
boolean seConsigno = false;
return (seConsigno);
}

/*
* Método para retirar un monto de dinero del saldo
* de la cuenta bancaria
*
* Recibe como argumentos, el código de la cuenta, una variable
* booleana de confirmación o aceptación sobre el retiro y por
* supuesto el monto total a retirar
*
* Cuando el método se ejecuta, devuelve como resultado
* el monto retirado
* */
public double retirarDinero (String codigoCuenta,
boolean aceptaRetirar, double montoRetirar)
{
double valorRetirado = 0.0;
return (valorRetirado);
}

/*
* Método para consultar el valor del saldo que actualmente está
* cuenta bancaria
*
* Recibe como argumento el código de la cuenta para poder
* consultar un saldo en particular del usuario
* */
public double consultarSaldo (String codigoCuenta)
{
double valorSaldo = 0.0;
return (valorSaldo);
}

Fascículo No. 2
Lenguaje de
programación
36 Semestre 2
Lenguaje de programación

/*
* Método para hacer el cierre de la cuenta bancaria
*
* Recibe como argumentos el código de identificación de
* la cuenta y una marca boolean que confirma por parte del
* usuario la disponibilidad de cerrarla
* */
public boolean cerrarCuenta (String codigoCuenta,
boolean aceptaCierre)
{
boolean seCerroCuenta = false;
return (seCerroCuenta);
}
/**********************************************/
/**********************************************/
/**********************************************/
}//Fin de la clase

Anexo 2
Implementación del problema del cajero bancario
import javax.swing.JOptionPane;

/**
* @author Ingeniero Jaime Alberto Gutiérrez Mejía
* Fundación Universitaria San Martín
* Espacio Académico: Lenguaje de Programación
* Fascículo II: UNIDAD II: CARACTERIZACIÓN DEL LENGUAJE
DE PROGRAMACIÓN
*
* Considerando nuestro anterior análisis de la cuenta bancaria,
* imaginemos que se nos solicita como ingenieros de desarrollo
* realizar la siguiente implementación: Generar una
* aplicación que desarrolle un cajero electrónico que
* permita ingresar dinero y retirar del mismo un valor
* determinado por el usuario. El sistema debe tener en
* cuenta las siguientes características:
*
* a) Cuando se realiza una consignación mayor a $10.000.00,
* el Banco genera un bono de contribución para el cuentahabiente
* del 20% del valor depositado.
*
* b) Cuando el usuario retira cualquier cantidad de dinero
* mayor a $500.000.00, se genera una retención del 5%
* sobre el monto retirado.

Fascículo No. 2
Semestre 2 37 Lenguaje de
programación
Lenguaje de programación

*
* c) El Sistema debe generar un mensaje de error que no permite
* retirar si el saldo actual del cuentahabiente es menor o igual a
* $5000.00.
*/

public class Cuenta


{ //Inicio de la clase
/**********************************************/
/**********************************************/
/**********************************************/
//Atributos de la clase
private String numeroCuenta;
private double saldo;
private String [] cuentas =
{
"123456",
"567890",
"112233",
"224455"
};

//Método constructor de la clase


public Cuenta()
{
super();
}
/**********************************************/
/**********************************************/
/**********************************************/

/*
* Método para consignar un monto de dinero contra el
* saldo
* de la cuenta bancaria
*
* Recibe como argumentos, el código de la cuenta y el total
* que va a ser consignado. Una vez se ha ejecutado la consignación
* devuelve un valor booleano (verdadero si se pudo
* consignar o
* false si se generó un error.
* */
public boolean consignarDinero (String codigoCuenta,
double montoConsignar)
{
//Variables locales del método
boolean seConsigno = false;
boolean existeCuenta = false;

Fascículo No. 2
Lenguaje de
programación
38 Semestre 2
Lenguaje de programación

double bonoAporte = 0.0;


int i = 0;

//Verificamos que la cuenta exista en el sistema


numeroCuenta = codigoCuenta;
for (i = 0; i < cuentas.length; i++)
{
if (numeroCuenta.equals(cuentas[i]))
{
existeCuenta = true;
}
}

//Si existe, realizamos la consignación


if (existeCuenta == true)
{
//Verificamos si el valor del saldo es mayor a
//10.000, para
//incrementar al saldo el bono de aporte
bonoAporte = 0.0;
if (montoConsignar > 10000)
{
bonoAporte = montoConsignar * 0.20;

JOptionPane.showMessageDialog(null,
"Se otorgará un bono del 20% del valor a
consignar en la cuenta");
}

//Incrementamos el saldo
saldo = saldo + montoConsignar;

//Si el saldo fue incrementado y se generó bono


//de aporte
//lo agregamos al saldo
if (bonoAporte > 0)
{
saldo = saldo + bonoAporte;
}

//Dado que toda la transacción se realizó


//confirmamos exitosamente
seConsigno = true;
}
else
{
//Generamos un mensaje de error, tal como se
//especificó

Fascículo No. 2
Semestre 2 39 Lenguaje de
programación
Lenguaje de programación

//En el flujo excepcional de eventos


JOptionPane.showMessageDialog(null,"La
//cuenta no existe en el Sistema");
seConsigno = false;
}

return (seConsigno);
}

/*
* Método para retirar un monto de dinero del saldo
* de la cuenta bancaria
*
* Recibe como argumentos, el código de la cuenta, una
* variable
* booleana de confirmación o aceptación sobre el retiro y por
* supuesto el monto total a retirar
*
* Cuando el método se ejecuta, devuelve como resultado
* el monto retirado
* */
public double retirarDinero (String codigoCuenta,
boolean aceptaRetirar, double montoRetirar)
{
//Variables locales al método
double valorRetirado = 0.0;
double retencionFuente = 0.0;
double totalRetirado = 0.0;
boolean existeCuenta = false;
int i = 0;
String confirmarRetiro = "";

//Verificamos que la cuenta exista en el sistema


numeroCuenta = codigoCuenta;
for (i = 0; i < cuentas.length; i++)
{
if (numeroCuenta.equals(cuentas[i]))
{
existeCuenta = true;
}
}

//Si la cuenta existe, procedemos a realizar el retiro


if (existeCuenta == true)
{

//Verificamos el monto a retirar y vemos


//que se pueda retirar efectivamente

Fascículo No. 2
Lenguaje de
programación
40 Semestre 2
Lenguaje de programación

if (saldo > 5000)


{

confirmarRetiro =
JOptionPane.showInputDialog(null,
"Digite Si para confirmar el retiro o no
para cancelar la operación: ");

if (confirmarRetiro.equals("Si"))
{
//Verificamos el monto a retirar para
aplicar la //retención
if (montoRetirar > 500000)
{
retencionFuente =
montoRetirar * 0.05;

JOptionPane.showMessag
eDialog(null,"Se hará una
retención sobre el retiro del
5%");
}

//Decrementamos el saldo en el
//monto solicitado
//y la retención si fue mayor a cero. Si no
hubo //retención
//no hay problema alguno
totalRetirado = montoRetirar +
retencionFuente;
saldo = saldo - totalRetirado;
//Informamos cuanto se retiró
valorRetirado = totalRetirado;
}
else
{
//El usuario canceló la operación

JOptionPane.showMessageDialog
(null,"La operación
ha sido cancelada por el usuario");
}
}
else
{
//No se puede retirar nada, porque los
//fondos son insuficientes

Fascículo No. 2
Semestre 2 41 Lenguaje de
programación
Lenguaje de programación

JOptionPane.showMessageDialog(null,"
No se puede retirar:
Fondos insuficientes");
valorRetirado = 0.0;
}

}
else
{
//La cuenta no existe, por lo que el retiro se
//cancela
JOptionPane.showMessageDialog(null,"La
//cuenta no existe en el Sistema");
valorRetirado = 0.0;
}

return (valorRetirado);
}

/*
* Método para consultar el valor del saldo que actualmente
* está
* cuenta bancaria
*
* Recibe como argumento el código de la cuenta para poder
* consultar un saldo en particular del usuario
* */
public double consultarSaldo (String codigoCuenta)
{
double valorSaldo = 0.0;
boolean existeCuenta = false;
int i = 0;

//Verificamos que la cuenta exista en el sistema


numeroCuenta = codigoCuenta;
for (i = 0; i < cuentas.length; i++)
{
if (numeroCuenta.equals(cuentas[i]))
{
existeCuenta = true;
}
}

if (existeCuenta == true)
{
valorSaldo = saldo;
}
else

Fascículo No. 2
Lenguaje de
programación
42 Semestre 2
Lenguaje de programación

{
JOptionPane.showMessageDialog(null,"La cuenta no
existe en el Sistema");
}

return (valorSaldo);
}

/**********************************************/
/**********************************************/
/**********************************************/
/*
* Método principal de la aplicación
* */
public static void main(String[] args)
{
/**********************************************/
/**********************************************/
/**********************************************/
//Instanciación del objeto de tipo Cuenta. El objeto
//se denomina nuevaCuentaBancaria
Cuenta nuevaCuentaBancaria = new Cuenta();

//Variables locales al método principal


String codigoCuenta = "";
double valor = 0.0;
double saldo = 0.0;
double valorRetirar = 0.0;
boolean seConsigno = false;

//Solicitamos los datos al usuario en el cajero


codigoCuenta = JOptionPane.showInputDialog(null,"Ingrese el
código de su cuenta: ");
valor =
Double.parseDouble(JOptionPane.showInputDialog(null,"Ingrese
el valor a consignar: "));

/*********************************************/
/*********************************************/
/*********************************************/
//Caso de uso Consignar Monto en Cuenta
seConsigno =
nuevaCuentaBancaria.consignarDinero
(codigoCuenta,valor);
if (seConsigno == true)
{
JOptionPane.showMessageDialog(null,"El dinero se

Fascículo No. 2
Semestre 2 43 Lenguaje de
programación
Lenguaje de programación

consignó satisfactoriamente");
}
/*********************************************/
/*********************************************/
/*********************************************/

/*********************************************/
/*********************************************/
/*********************************************/
//Caso de uso Retirar monto de cuenta
//Luego realizamos un retiro
valorRetirar =
Double.parseDouble(JOptionPane.showInputDialog(null,"Ingr
es el valor a retirar de la cuenta: "));
saldo =
nuevaCuentaBancaria.retirarDinero
(codigoCuenta,true,valorRetirar);
JOptionPane.showMessageDialog(null,"El valor
retirado fue de " + saldo);
/*********************************************/
/*********************************************/
/*********************************************/

/*********************************************/
/*********************************************/
/*********************************************/
//Caso de uso Consultar Saldo de Cuenta
saldo =
nuevaCuentaBancaria.consultarSaldo
(codigoCuenta);
JOptionPane.showMessageDialog(null,"El saldo actual en la
cuenta es de: " + saldo);
/**********************************************/
/**********************************************/
/**********************************************/
}
/**********************************************/
/**********************************************/
/**********************************************/
}//Fin de la clase

Fascículo No. 2
Lenguaje de
programación
44 Semestre 2
Lenguaje de programación

Anexo 3
Implementación de la clase empleado
Clase Empleado:

/**
* @author Ingeniero Jaime Alberto Gutiérrez Mejía
* Fundación Universitaria San Martín
* Espacio Académico: Lenguaje de Programación
* Fascículo II: UNIDAD II: CARACTERIZACIÓN DEL LENGUAJE
* DE PROGRAMACIÓN
*
* Ejemplos de un objeto de valores (value object)
* para representar la entidad Empleado
*/

public class Empleado


{
/******************************************/
/******************************************/
/******************************************/
//Atributos
private String nombre;
private String apellido;
private double salario;
private int edad;
private String codigo;

/******************************************/
/******************************************/
/******************************************/
public Empleado() {
super();
// TODO Auto-generated constructor stub
}

/******************************************/
/******************************************/
/******************************************/
//Métodos de Encapsulamiento
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public int getEdad() {
return edad;

Fascículo No. 2
Semestre 2 45 Lenguaje de
programación
Lenguaje de programación

}
public void setEdad(int edad) {
this.edad = edad;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public double getSalario() {
return salario;
}
public void setSalario(double salario) {
this.salario = salario;
}
public String getCodigo() {
return codigo;
}

public void setCodigo(String codigo) {


this.codigo = codigo;
}
/******************************************/
/******************************************/
/******************************************/
}

Fascículo No. 2
Lenguaje de
programación
46 Semestre 2

Das könnte Ihnen auch gefallen