1
Fundamentos de Programación Ingeniería en Tecnologías de la Información y Comunicaciones
Objetivo del curso: Analizar y solucionar problemas informáticos y representar su solución mediante herramientas de software orientado a objetos. Competencias previas
Habilidad para el manejo de la computadora.
Navegación en Internet.
Capacidad de análisis y síntesis.
Manejar herramientas de software mediante menús.
Manejar comandos y funciones básicas en algún sistema operativo de computadora.
Aplicar lógica matemática en la solución de problemas informáticos. Aportación del curso al perfil profesional: La asignatura de Fundamentos de Programación aporta al perfil del Ingeniero en Tecnologías de la Información y Comunicaciones, los conocimientos, habilidades, metodología, así como capacidades de análisis y síntesis, para plantear la solución de problemas susceptibles de ser computarizados, a través de diagramas de flujo, pseudocódigo, algoritmos y el paradigma de programación orientada a objetos. Temario: I. Fundamentos de programación orientada a objetos.
I.1. Evolución de la programación I.2. Conceptos fundamentales de la Programación Orientada a Objetos I.3. Lenguajes orientados a objetos I.4. Relaciones entre clases y objetos I.5. Papel de clases y objetos en el análisis y el diseño
II. Metodología de Solución de Problemas.
II.1. Descripción del problema (enunciado) II.2. Definición de solución (especificaciones) II.3. Diseño de la solución (modelado) II.4. Desarrollo de la solución (codificación) II.5. Depuración y pruebas (pruebas) II.6. Documentación (manuales)
III. Herramientas de programación.
III.1. Simbología III.2. Reglas para la construcción de diagramas III.3. Pseudocódigo III.4. Tipos de datos y expresiones III.5. Estructuras lógicas
2
IV. Programación orientada a objetos y modelado. IV.1. Características del modelo orientado a objetos IV.2. Elementos primordiales en el modelo de objetos IV.3. Representación gráfica del diseño IV.4. Relación entre la programación orientada a objetos y la estructurada
V. Implementación Orientada a Objetos.
V.1. Estructura de una clase V.2. Elementos de una clase V.3. Clase principal V.4. Crear objetos
VI. Modularidad.
VI.1. Declaración de métodos VI.2. Métodos de clase VI.3. Métodos de instancia
Bibliografía 1. Hjalmar Jacobson, Ivar. El Lenguaje Unificado de Modelado Guía del Usuario. 2a.
edición. Ed. Addison Wesley. 2. Flores Cueto, Juan José. Método de las 6’D UML – Pseudocódigo – Java Enfoque
Algorítmico, Serie Textos Universitarios Facultad de Ingeniería y Arquitectura. ed. Universidad de San Martín de Porres, (http://books.google.com/).
3. Joyanes Aguilar, Luis; Fernández Azuela, Matilde y Rodríguez Baena, Luis. Fundamentos de Programación Libro de Problemas Algoritmos Estructura de Datos y Objetos. 2a. edición. Ed. McGraw Hill.
4. Ramírez, Felipe. Introducción a la Programación, Algoritmos y su Implementación en Vb.Net, C#, Java y JAVA. 2a. edición. Ed. Alfaomega Grupo Editor.
5. Cairo Battistutti, Osvaldo. Metodología de la Programación, Algoritmos Diagramas de Flujo y Programas. 3a. edición. Ed. Alfaomega Grupo Editor.
6. Martin Robert, C. UML for Java(TM) Programmers. Ed. Robert C. Martin Series, Pearson. 2003.
7. Grady Booch, James. Rumbaugh E., Greg Perry. Aprendiendo Principios de Programación en 24 horas. Ed. Prentice Hall.
8. Sintes, Anthony. Aprendiendo Programación Orientada a Objetos en 21 Lecciones Avanzadas. Ed. Pearson Educación, 2002.
Fechas de Exámenes
Examen Fecha Unidades
1er I y II
2º. III y IV
3er V y VI
2ª Oportunidad
Calificación Final
3
Criterios de evaluación y acreditación
Exámenes 60%
Productos de Aprendizaje 40% (Tareas, Trabajos, Investigaciones, etc.) Otras Observaciones:
Personificador
Hora de entrada
Asistencia a clase
2ª Oportunidad
Revisión equitativa
4
I. Fundamentos de programación orientada a objetos.
El paradigma orientado a objetos nació en 1969 de la mano del
doctor noruego Kristin Nygaard que intentando escribir un
programa que describiera el movimiento de los barcos a través de
un fiordo, descubrió que era muy difícil simular las mareas, los
movimiento de los barcos, y las formas de las líneas costeras con
los métodos de programación existentes en ese momento.
Además descubrió que los elementos del entorno que trataba de
modelar (Barcos, Mareas y Líneas de la costa de los fiordos) así
como las acciones de cada elemento eran más fácil de manejar
utilizando otro modelo, es aquí donde surge la Programación
Orientada a Objetos (OOP de sus siglas en ingles).
I.1. Evolución de la programación
La evolución de la programación se puede sintetizar en tres modelos o paradigmas Un
paradigma es una forma establecida de pensar acerca de cómo hacer algo. En el libro “La
Revolución Científica Estructural” de Thomas Kuhn describe los paradigmas como un
conjunto de teorías, estándares y métodos que juntos representa un medio de
organización de conocimiento, es decir un medio de visualizar el mundo.
Los tres modelos o paradigmas de la evolución de la programación son:
La programación mediante procedimientos (procedural o modular)
La programación estructurada
La programación orientada a objetos
Programación Procedural o Modular
Los programas se dividen módulos (partes independientes), cada una de las cuales
ejecuta una única actividad o tarea y se codifican independientemente uno de otro. Cada
uno de estos módulos se analiza, codifica y pone a punto por separado.
5
Cada programa contiene un modulo denominado programa principal (por ejemplo en el
lenguaje c se llama main al igual que en Java) que controla todo que sucede,
transfiriendo el control a los submódulos (subprogramas o procedimientos) y estos al
terminar transfieren el control a modulo principal. Si la tarea asignada a cada submódulo
es demasiado compleja, este podrá dividirse en otros submódulos más pequeños. Estas
tares pueden ser procesos de entrada, salida, manipulación de datos, control de otros
módulos o alguna combinación de estas.
Programación Estructurada
Se refiere a un conjunto de técnicas que han ido evolucionando
desde los primeros trabajos de Edgar Dijkstra. Esta técnica
aumenta la productividad del programa reduciendo el tiempo para
escribir, verificar, depurar y mantener los programas. La
programación estructurada utiliza un número limitado de
estructuras de control que minimiza la complejidad de los
problemas y, por consiguiente reduce los errores.
El conjunto de técnicas que incorpora la programación estructurada son:
Diseño descendente (TopDown)
Recursos Abstractos
Estructuras básicas
Diseño descendente (TopDown)
Es el proceso mediante el cual un problema se descompone en una serie de niveles o
pasos sucesivos de refinamiento. Para establecer un refinamiento pasamos de qué hace
a cómo lo hace.
Raíz
Modulo 1
Modulo 1.1
Modulo 1.2
Modulo 2
Modulo 2.1
Modulo 2.2
Modulo 2.2.1
Modulo 2.2.2
Modulo 3
Modulo 3.1
Modulo 4
Modulo 4.1
Modulo 4.2
6
¿Qué hace?
¿Cómo lo hace?
Diseño descendente
Recursos Abstractos
La abstracción es el proceso de extraer las propiedades relevantes de un objeto al tiempo
que se ignora los detalles no esenciales. Las propiedades extraídas definen una vista del
objeto. En esencia la abstracción supone la capacidad de encapsular y aislar la
información del diseño.
Según Dijkstra, la abstracción descompone un programa en términos de recursos
abstractos, es decir, descompone una acción compleja en una serie de acciones más
simples, capaces de ser implementadas en una computadora.
Estructuras básicas
En mayo de 1966 Böhm y Jacopini demostraron que un programa puede ser escrito
utilizando solamente tres tipos de estructura de control:
Secuenciales
Selectivas
Repetitivas
7
Secuenciales
La estructura secuencial es aquella en la que una acción (instrucción) sigue a otra en
secuencia.
Diagrama de Flujo Diagrama NassiSchneiderman
(NS) Pseudocódigo
Inicio Acción 1 Acción 2 … Acción n
Fin
Selectivas
Diagrama de Flujo
Acción 1
Acción 2
...
Acción n
Inicio
Fin
Inicio
Acción 1
Acción 2
...
Acción n
Fin
Condición
Acción 1
Verdadero Falso
8
Diagrama NassiSchneiderman (NS)
Pseudocódigo
Si Condición
Acción 1 Fin Si
Diagrama de Flujo
Diagrama NassiSchneiderman (NS)
Acción 1
Condición
FalsoVerdadero
Condición
Acción 1
Verdadero Falso
Acción 2
Acción 1
Condición
FalsoVerdadero
Acción 2
9
Pseudocódigo
Si Condición
Acción 1 En otro caso
Acción 2 Fin Si
Repetitivas
Diagrama de Flujo
For/Next
While/Mientras
Repeat/Repite
Diagrama NassiSchneiderman (NS)
For/Next
While/Mientras
Condición
Inc/Dec
Inicio
Proceso
Condición
Proceso Verdadero
Falso
Condición
Proceso
Verdadero
Falso
Inc/Dec
Inicio
Proceso
While Condición
Proceso
10
Repeat/Repite
Pseudocódigo
For/Next
Para I = VI Hasta VF Proceso
Fin Para
While/Mientras
Mientras Condición Proceso
Fin Mientras
Repeat/Repite Repite
Proceso Hasta Condición
I.2. Conceptos fundamentales de la Programación Orientada a Objetos
La programación orientada a objetos, tal vez el paradigma de programación más utilizado
en el mundo del desarrollo de software y de la ingeniería de software del siglo XXI, trae un
nuevo enfoque a los retos que se plantean en la programación estructurada cuando los
problemas a resolver son complejos. Al contrario que la programación procedimental que
enfatiza en los algoritmos, la programación orientada a objetos (POO) enfatiza en los
datos. En lugar de intentar ajustar un problema al enfoque procedimental de un lenguaje,
POO intenta ajustar el lenguaje al problema. La idea es diseñar formatos de datos que se
correspondan con las características esenciales de un problema.
La idea fundamental de los lenguajes orientados a objetos es combinar en una única
unidad o módulo, tanto los datos como las funciones que operan a esos datos. Tal unidad
se llama “Objeto”. A las operaciones que realiza un objeto se les llama “Métodos” y es el
Repeat Condición
Proceso
11
único medio para acceder a sus datos. Los datos de un objeto, se conocen también como
“Atributos”. Si se desea leer datos de un objeto, se invoca a uno de sus Método. No se
puede acceder a los datos directamente, se debe de realizar por medio de los
mecanismos de “Comportamiento” (Métodos). Los datos son ocultos, de modo que
están protegidos de alteraciones accidentales. Los datos y los Métodos se dice que están
“Encapsulados” en una única entidad. El “Encapsulamiento” de datos y la “Ocultación”
de los datos son términos clave en la descripción de lenguajes orientados a objetos.
Si se desea modificar los datos de un objeto, se debe de conocer exactamente cuáles son
funciones que interactúan con los Métodos para poder realizar esta acción. Un programa
en Java se compone normalmente de un número de objetos que se comunican unos con
otros mediante “Mensajes” funciones miembro (Métodos). La organización de un
programa en Java se muestra en la siguiente figura. La llamada a una función miembro de
un objeto se denomina enviar un mensaje a otro objeto.
En el paradigma orientado a objetos, el programa se organiza como un conjunto finito de
objetos que contiene datos y operaciones (función miembro o Métodos) que llaman a esos
datos y que se comunican entre sí mediante Mensajes.
Datos
Función Miembro(Método)
Función Miembro(Método)
Objeto A
Datos
Función Miembro(Método)
Función Miembro(Método)
Objeto B
Datos
Función Miembro(Método)
Función Miembro(Método)
Objeto C
Mensaje
Mensaje
Mensaje
12
Propiedades fundamentales de la orientación a objetos
Existen diversas características ligadas a la orientación a objetos. Todas las propiedades
que se suelen considerar, no son exclusivas de este paradigma, ya que pueden existir en
otros paradigmas, pero en su conjunto definen claramente los lenguajes orientados a
objetos. Estas propiedades son:
Abstracción
Clase
Objeto
Encapsulación
Ocultamiento
Herencia
Polimorfismo
Mensajes
Abstracción
La abstracción es la propiedad de los objetos que consiste en tener en cuenta sólo los
aspectos más importantes desde un punto de vista determinado y no tener en cuenta los
restantes aspectos. El término abstracción que se suele utilizar en programación se
refiere al hecho de diferenciar entre las propiedades externas de una entidad y los
detalles de la composición interna de dicha entidad. Es la abstracción la que permite
ignorar los detalles internos de un dispositivo complejo tal como una computadora, un
automóvil, una lavadora o un horno de microondas, etc., y usarlo como una única unidad
comprensible. Mediante la abstracción se diseñan y fabrican estos sistemas complejos en
primer lugar y, posteriormente, los componentes más pequeños de los cuales están
compuestos. Cada componente representa un nivel de abstracción en el cual el uso del
componente se aísla de los detalles de la composición interna del componente. La
abstracción posee diversos grados denominados niveles de abstracción.
Nivel de abstracción Externo:
13
Nivel de abstracción Conceptual:
Nivel de abstracción Interno:
En consecuencia, la abstracción posee diversos grados de complejidad que se
denominan niveles de abstracción que ayudan a estructurar la complejidad intrínseca que
poseen los sistemas del mundo real. En el modelado orientado a objetos de un sistema
esto significa centrarse en qué es y qué hace un objeto y no en cómo debe
implementarse. Durante el proceso de abstracción es cuando se decide qué
características y comportamiento debe tener el modelo.
Aplicando la abstracción se es capaz de construir, analizar y gestionar sistemas de
computadoras complejos y grandes que no se podrían diseñar si se tratara de modelar a
un nivel detallado. En cada nivel de abstracción se visualiza el sistema en términos de
componentes, denominados herramientas abstractas, cuya composición interna se ignora.
Esto nos permite concentrarnos en cómo cada componente interactúa con otros
componentes y centrarnos en la parte del sistema que es más relevante para la tarea a
realizar en lugar de perderse a nivel de detalles menos significativos.
14
En estructuras o registros, las propiedades individuales de los objetos se pueden
almacenar en los miembros. Para los objetos es de interés cómo están organizados sino
también qué se puede hacer con ellos. Es decir, las operaciones que forman la internan
de un objeto son también importantes. El primer concepto en el mundo de la orientación a
objetos nació con los tipos abstractos de datos (TAD). Un tipo abstracto de datos describe
no sólo los atributos de un objeto, sino también su comportamiento (las operaciones).
Esto puede incluir también una descripción de los estados que puede alcanzar un objeto.
Un medio de reducir la complejidad es la abstracción. Las características y los procesos
se reducen a las propiedades esenciales, son resumidas o combinadas entre sí. De este
modo, las características complejas se hacen más manejables.
Clase
En términos prácticos, una clase es un tipo definido por el usuario. Las clases son los
bloques de construcción fundamentales de los programas orientados a objetos. Booch
define una clase como “un conjunto de objetos que comparten una estructura y un
comportamiento comunes”. Una clase contiene la especificación de los datos que
describen un objeto junto con la descripción de las acciones que un objeto conoce cómo
ha de ejecutar. Estas acciones se conocen como servicios o métodos. Una clase incluye
también todos los datos necesarios para describir los objetos creados a partir de la clase.
Estos datos se conocen como atributos, variables o variables instancia. El término atributo
se utiliza en análisis y diseño orientado a objetos, y el término variable instancia se suele
utilizar en programas orientados a objetos.
Declaración de un a clase
Antes de que un programa pueda crear objetos de cualquier clase, ésta debe ser definida.
La definición de una clase significa que se debe dar a la misma un nombre, dar nombre
también a los elementos que almacenan sus datos y describir los métodos que realizarán
las acciones consideradas en los objetos.
Las definiciones o especificaciones no son un código de programa ejecutable. Se utilizan
para asignar almacenamiento a los valores de los atributos usados por el programa y
reconocer los métodos que utilizará el programa. Normalmente, se sitúan en archivos
formando los denominados packages, se utiliza un archivo para varias clases que están
relacionadas.
Formato:
class NombreClase
{
lista_de_miembros
}
15
En el Lenguaje Unificado de Modelado (UML, Unifield Modeling Language), una clase es
representada por un rectángulo que posee tres divisiones:
En donde:
La parte superior: Contiene el nombre de la Clase
La intermedia: Contiene los atributos (o variables de instancia) que
caracterizan a la Clase.
La parte Inferior: Contiene los métodos u operaciones, los cuales son la forma
como interactúa el objeto con su entorno.
Atributos y Métodos:
Atributos:
Los atributos o características de una Clase pueden ser de tres tipos, los que definen el
grado de comunicación y visibilidad de ellos con el entorno, estos son:
public (+, ): Indica que el atributo será visible tanto dentro como fuera de
la clase, es decir, es accesible desde todos lados.
private (-, ): Indica que el atributo sólo será accesible desde dentro de la
clase (sólo sus métodos lo pueden accesar).
protected (#, ): Indica que el atributo no será accesible desde fuera de la
clase, pero si podrá ser accesado por métodos de la clase
además de las subclases que se deriven (herencia).
defecto Si no especifica ningún tipo de acceso, se utiliza el acceso
por defecto, esto significa que la variable es accesible a
todas las clases contenidas en le mismo paquete.
Nombre de la clase
Atributos
Comportamiento
16
Métodos:
Cada método tiene asociado un tipo que se utiliza para controlar el acceso al método.
Entre estos se encuentra:
public (+, ): Indica que el método será visible tanto dentro como fuera de
la clase, es decir, es accsesible desde todos lados.
private (-, ): Indica que el método sólo será accesible desde dentro de la
clase (sólo otros métodos de la clase lo pueden accesar).
protected (#, ): Indica que el método no será accesible desde fuera de la
clase, pero si podrá ser accesado por métodos de la clase
además de métodos de las subclases que se deriven
(herencia).
defecto Si no especifica ningún tipo de acceso, se utiliza el acceso
por defecto, esto significa que el método es accesible a
todas las clases contenidas en el mismo paquete.
Ejemplo:
class Punto
{
private int x; // coordenada x
private int y; // coordenada y
+ Punto()+ Punto(int valorX, int Valory)+ int regresaX()+ int regresaY()+ void asignaX(int valorX)+ void asignaY(int valorY)
Punto
- int x;- int y;
17
public Punto() // constructor sin argumentos
{
x = 0;
y = 0;
}
public Punto(int valorX , int valorY) // constructor
{
x = valorX;
y = valorY;
}
public int regresaX() // devuelve el valor de x
{
return x;
}
public int regresaY() // devuelve el valor de y
{
return y;
}
void asignaX(int valorX) // establece el valor de x
{
x = valorX;
}
void asignaY(int valorY) // establece el valor de y
{
y = valorY;
}
}
Objeto
En el mundo real, las personas identifican los objetos como cosas que pueden ser
percibidas por los cinco sentidos. Los objetos tienen propiedades específicas, como
posición, tamaño, color, forma, textura, etc. que definen su estado. Los objetos también
poseen ciertos comportamientos que los hacen diferentes de otros objetos.
Booch define un objeto como “algo que tiene un estado, un comportamiento y una
identidad”.
Imaginemos una máquina de una fábrica. El estado de la máquina puede estar
funcionando/ parando (“on/off”), hay que tener en cuenta su potencia, velocidad máxima,
velocidad actual, temperatura, etc. Su comportamiento puede incluir acciones para
arrancar y parar la máquina, obtener su temperatura, activar o desactivar otras máquinas,
conocer las condiciones de señal de error o cambiar la velocidad. Su identidad se basa en
18
el hecho de que cada instancia de una máquina es única, tal vez identificada por un
número de serie. Las características que se eligen para enfatizar el estado y el
comportamiento se apoyarán en cómo un objeto máquina se utilizará en una aplicación.
En un diseño de un programa orientado a objetos, se crea una abstracción (un modelo
simplificado) de la máquina basada en las propiedades y en el comportamiento que son
útiles en el tiempo.
Martin y Odell definen un objeto como “cualquier cosa, real o abstracta, en la que se
almacenan datos y aquellos métodos (operaciones) que manipulan los datos”.
Para realizar esa actividad, se añaden a cada objeto de la clase los propios datos
asociados con sus propios métodos miembro que pertenecen a la clase.
Un mensaje es una instrucción que se envía a un objeto y que, cuando se recibe, ejecuta
sus acciones. Un mensaje incluye un identificador que contiene la acción que ha de
ejecutar el objeto junto con los datos que necesita el objeto para realizar su trabajo. Los
mensajes, por consiguiente, forman una ventana del objeto al mundo exterior.
El usuario de un objeto se comunica con el objeto mediante su interfaz, un conjunto de
operaciones definidas por la clase del objeto de modo que sean todas visibles al
programa. Una interfaz se puede considerar como una vista simplificada de un objeto. Por
ejemplo, un dispositivo electrónico como una máquina de fax tiene una interfaz de usuario
bien definida; por ejemplo, esa interfaz incluye el mecanismo de avance del papel,
botones de marcado, el receptor y el botón “enviar”. El usuario no tiene que conocer cómo
está construida la máquina internamente, el protocolo de comunicaciones u otros detalles.
De hecho, la apertura de la máquina durante el periodo de garantía puede anularla.
La representación gráfica de un objeto en UML:
Objeto : Clase X
Atributo1 = Expresión…
Método ()…
Objeto : Clase X
(b) Notación reducida de un objeto
(a) Notación completa de un objeto
19
Encapsulación
El encapsulado o encapsulación de datos es el proceso de agrupar datos y operaciones
relacionadas bajo la misma unidad de programación. En el caso de los objetos que
poseen las mismas características y comportamientos se agrupan en clases, que no son
más que unidades o módulos de programación que encapsulan datos y operaciones.
Ocultamiento
La ocultación de datos permite separar el aspecto de un componente, definido por su
interfaz con el exterior, de sus detalles internos de implementación.
Diferencia entre Encapsulación y Ocultamiento
Los términos ocultación de la información y encapsulación de datos se suelen utilizar
como sinónimos, pero no siempre es así, y muy al contrario, son términos similares pero
distintos. En Java no es lo mismo, ya los datos internos están protegidos del exterior y no
se pueden acceder a ellos más que desde su propio interior y por tanto, no están ocultos.
El acceso al objeto está restringido sólo a través de una interfaz bien definida.
Herencia
Las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de
clasificación. Los objetos heredan las propiedades y el comportamiento de todas las
clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el
encapsulamiento permitiendo a los objetos ser definidos y creados como tipos
especializados de objetos preexistentes. Estos pueden compartir (y extender) su
comportamiento sin tener que volver a implementarlo. Esto suele hacerse habitualmente
agrupando los objetos en clases y estas en árboles o enrejados que reflejan un
Porsche911 : Carro
Color = “Amarillo”…
ArrancarMotor ()…
Marco : Alumno
(d) Objeto Marco de la clase Alumno
(c) Objeto Porsche911 de la clase Carro
20
comportamiento común. Cuando un objeto hereda de más de una clase se dice que hay
herencia múltiple.
Polimorfismo
La quinta propiedad significativa de los lenguajes de programación orientados a objetos
es el polimorfismo. Es la propiedad que indica, literalmente, la posibilidad de que una
entidad tome muchas formas. En términos prácticos, el polimorfismo permite referirse a
objetos de clases diferentes mediante el mismo elemento de programa y realizar la misma
operación de diferentes formas, según sea el objeto que se referencia en ese momento.
Por ejemplo, cuando se describe la clase mamíferos se puede observar que la operación
comer es una operación fundamental en la vida de los mamíferos, de modo que cada tipo
de mamífero debe poder realizar la operación o función comer. Por otra parte, una cabra o
una vaca que pastan en un campo, un niño que se come un caramelo y un león que
devora a otro animal, son diferentes formas que utilizan diferentes mamíferos para realizar
la misma función (comer).
El polimorfismo adquiere su máxima expresión en la derivación o extensión de clases, es
decir, cuando se obtiene una clase a partir de una clase ya existente, mediante la
propiedad de derivación de clases o herencia.
I.3. Lenguajes orientados a objetos
Históricamente el lenguaje Simula (1967) es aceptado como el primer lenguaje que posee
las características principales de un lenguaje orientado a objetos. Fue creado para hacer
programas de simulación, en donde los "objetos" son la representación de la información
más importante. Smalltalk (1972 a 1980) es posiblemente el ejemplo canónico, y con el
que gran parte de la teoría de la programación orientada a objetos se ha desarrollado.
El lenguaje de programación C fue desarrollado por Dennis Ritche de AT&T en los
Laboratorios Bell que se utilizó para escribir y mantener el sistema operativo UNIX (hasta
que apareció C, el sistema operativo UNIX fue desarrollado por Ken Thompson en AT&T
mediante en lenguaje ensamblador o en lenguaje B). C es un lenguaje de propósito
COBOL ALGOL APL PASCAL
GPSS PROLOG
Lenguaje Maquina
1950 1960 1970 1980 2000
Declarativos
Imperativos
Orientados a Objetos
Funcional
FORTRAN BASIC C ADA
SMALLTALK VISUAL BASIC JAVA
C#
LISP LM SCHEMA
1990
C++
21
general que se puede utilizar para escribir cualquier tipo de programa, pero su éxito y
popularidad está especialmente relacionado con el sistema operativo UNIX. Fue
desarrollado como lenguaje de programación de sistemas, es decir, un lenguaje de
programación para escribir sistemas operativos.
Entre los lenguajes orientados a objetos se destacan los siguientes:
Ada
C#
Clipper
Object Pascal (Delphi)
Gambas
Eiffel
Java
JavaScript
ObjectiveC
R
Perl
PHP
PowerBuilder
Python
Ruby
Smalltalk
VB.NET
Visual FoxPro
Visual Basic
Visual Objects
XBase++
I.4. Relaciones entre clases y objetos
Ahora ya definido el concepto de Clase, es necesario explicar cómo se pueden
interrelacionar dos o más clases (cada uno con características y objetivos diferentes).
Antes es necesario explicar el concepto de cardinalidad de relaciones: En UML, la
cardinalidad de las relaciones indica el grado y nivel de dependencia, se anotan en cada
extremo de la relación y éstas pueden ser:
uno o muchos: 1..* (1..n)
0 o muchos: 0..* (0..n)
número fijo: m (m denota el número).
Ejemplo:
Un cliente puede tener asociadas muchas Órdenes de Compra, en cambio una orden de
compra solo puede tener asociado un cliente.
22
Ejercicios:
En los Institutos Tecnológicos cuenta con una plantilla de Catedráticos de entre 30 a 350
maestros y una población Estudiantil de entre 100 y 500 alumnos. Cada Catedrático
imparte clase a grupos de entre 5 a 45 Estudiantes.
Análisis Orientado a Objetos (AOO)
a) Identifique las clases y proporcione una breve descripción
Clases Descripción
b) Por cada clase describa los atributos o características, descripción de cada
concepto y el conjunto de valores permitidos (Dominio).
Clase Atributo Descripción Dominio
c) Describa el comportamiento que tendrá cada clase y su descripción
Clase Comportamiento Descripción
23
Diseño Orientado a Objetos (DOO)
d) Ahora desarróllelos como clase
e) Establezca la relación entre las clases
Producto de Aprendizaje 1:
De los siguientes conceptos seleccione 10 y desarróllelo como clase, una vez
desarrolladas como clase relacione tres mediante cardinalidad, entregarlo de forma
impresa (25 puntos). Exponer en clase las tres clases relacionadas (15 puntos).
1 Actor 21 Empleado 41 Notebook
2 Avión 22 EquipoSonido 42 Pantalón
3 Blusa 23 Escuela 43 Periódico
4 Camión 24 Estadio 44 Persona
5 Camioneta 25 Estudiante 45 Pickup
6 Camisa 26 Fabrica 46 Pluma
7 Carro 27 Farmacia 47 Portafolio
8 Casa 28 Fraccionamiento 48 Profesionista
9 Catedrático 29 Hospital 49 ProgramaRadio
10 CertificadoMédico 30 Ingeniero 50 ProgramaTV
11 CertificadoCalifiaciones 31 Lápiz 51 Revista
12 Coche 32 Laptop 52 Supermercado
13 Computadora 33 Libro 53 Teléfono
14 Cuaderno 34 Licenciado 54 Terreno
15 Cuenta 35 Maestro 55 Tienda
16 CuentaAhorros 36 Mascota 56 Universidad
17 CuentaBancaria 37 Medico 57 Vehículo
18 CuentaCrédito 38 Mochila 58 Ventana
19 Director 39 Modulo 59 Vestido
20 Doctor 40 Museo 60 Zapato
24
Cada clase deberá tener los siguientes términos:
Nombre de clase
Atributos y Descripción
Comportamiento y Descripción
Para las tres clases establezca:
Relación de las Clases
Programación Orientada a Objetos (POO)
Programar las clases en un lenguaje orientado a objetos.
I.5. Papel de clases y objetos en el análisis y el diseño
Durante el análisis y las primeras etapas del diseño, el desarrollador tiene dos tareas
principales:
Identificar las clases y objetos que forman el vocabulario del dominio del
problema.
Idear los comportamientos de las clases para que satisfagan los requerimientos
del problema.
En conjunto, se llama a esas clases y objetos las abstracciones del problema, y se
denomina a esas estructuras cooperativas los mecanismos de la implantación. Durante
estas fases del desarrollo, el interés principal del desarrollo debe estar en la vista externa
de estas abstracciones y mecanismos.
Esta vista representa el marco de referencia lógico del sistema y, por tanto, abarca la
estructura de clases y la estructura de objetos del mismo. En las etapas finales del diseño
y entrando ya en la implantación, la tarea del desarrollador cambia: el centro de atención
está en la vista interna de estas abstracciones y mecanismos, involucrando a su
representación física. Pueden expresarse estas decisiones de diseño como parte de la
arquitectura de módulos y la arquitectura de procesos del sistema.
La experiencia de algunos analistas nos lleva a aplicar en primer lugar el criterio orientado
a objetos porque esta aproximación es mejor a la hora de servir de ayuda para organizar
la complejidad innata de los sistemas de software, al igual que ha servido de ayuda para
describir la complejidad organizada de sistemas complejos tan diversos como las
computadoras, plantas, galaxias o grandes instituciones sociales.
25
Básicamente los productos del análisis orientado a objetos (AOO) sirven como modelos
de los que se puede partir para un diseño orientado a objetos (DOO); los productos del
diseño orientado a objetos pueden utilizarse entonces como anteproyectos para la
implementación completa de unos sistemas utilizando métodos de programación
orientado a objetos (POO), de esta forma se relacionan AOO, DOO y POO.
26
II. Metodología de Solución de Problemas.
La principal razón por lo que las personas aprenden a programar es para solucionar
problemas utilizando como herramienta la computadora. El proceso de resolución de un
problema con una computadora conduce a la escritura de un programa y a su ejecución.
Aunque el proceso de diseñar programas es, esencialmente, creativo, se puede
considerar una serie de fases o pasos comunes, que generalmente deben seguir todos
los programadores.
Las fases de resolución de un problema con computadora son:
Análisis del problema El problema es analizado teniendo presente las
especificaciones de los requisitos dados por el cliente de la
empresa o la persona que encarga el programa. AOO
Diseño del algoritmo Una vez analizado el problema, se diseña una solución que
conducirá a un algoritmo que resuelva el problema. DOO
Codificación La solución se escribe en un lenguaje de alto nivel y se
obtiene el programa fuente. POO
Ejecución, verificación y depuración El programa se ejecuta (se corre), se verifica que
realice correctamente que realice lo que se analizo y diseño,
y se depuran todos los errores.
Implementación Se pone en producción el programa (gradual, parcial o total)
Mantenimiento El programa se actualiza realizando los cambios que sean
necesarios, de modo que cumpla con las necesidades del
usuario.
Documentación Escritura de las diferentes fases del ciclo de vida del
software esencialmente del análisis, diseño y codificación
(Manuales del usuario y Manuales del programador (o
Manuales del Sistema)).
II.1. Descripción del problema (enunciado)
La resolución de problemas se puede dividir en tres fases importantes:
Análisis del problema
Diseño del algoritmo
Resolución del algoritmo en la computadora
27
II.2. Definición de solución (especificaciones)
El propósito del análisis de un problema es ayudar al programador para llegar a una cierta
compresión de la naturaleza del problema. El problema debe estar bien definido, si se
desea llegar a una solución satisfactoria. Para poder definir con precisión el problema se
requiere de las especificaciones de entrada y salida descritas en detalle.
El análisis del problema requiere de una lectura previa del problema, a fin de obtener una
idea general de lo que solicita. La segunda lectura deberá servir para responder a las
siguientes preguntas:
¿Qué datos necesita para resolver el problema? (Entrada)
¿Qué información debe de proporcionar la resolución del problema? (Salida)
¿Qué pasos se requieren para que con los datos de entrada se transformen en
información de salida? (Algoritmo)
Resolución de un problema
Análisis del problema
Diseño del Algoritmo
Resolución del problema con la
computadora
Análisis del problema
Definición del problema
Especificaciones de entrada
Especificaciones de salida
28
Ejemplo:
Definición del problema: Obtenga la superficie y la longitud de un circulo.
Análisis:
Entrada: ¿Qué datos necesita para resolver el problema?
Radio
Salida: ¿Qué información debe de proporcionar la resolución del problema?
Superficie y Longitud
Algoritmo: ¿Qué pasos se requieren para que con los datos de entrada se
transformen en información de salida? (Unidad III)
II.3. Diseño de la solución (modelado)
Una computadora no tiene la capacidad para resolver problemas, más que cuando se le
proporcionan los pasos sucesivos a realizar para solucionar dicho problema. Estos pasos
indican las instrucciones a ejecutar por la maquina, conociéndoseles como algoritmo.
La información que se le proporciona al algoritmo constituye la entrada y la información
producida por el algoritmo constituye la salida.
Ejercicio: Desarrolle el diseño de la solución del siguiente problema.
Calcule el salario neto de un trabajador a partir de la lectura del nombre, horas trabajadas,
precio por hora y el cálculo de impuesto son el 25% del salario bruto (horas trabajadas por
precio por hora). Como resultado final imprima el nombre, salario bruto, impuestos y
salario neto.
Superficie y Longitud de
un circulo
Entrada de datos
Radio
Calculo de la Superficie
S=Radio2
Calculo de la longitud
L=2Radio
Salida de resultados
S y L
29
II.4. Desarrollo de la solución (codificación)
La codificación es la escritura en un lenguaje de programación de la representación del
algoritmo desarrollada en las etapas precedentes. Dado que el diseño de un algoritmo es
independiente del lenguaje de programación utilizado para la implementación, el código
puede ser escrito con igual facilidad en un lenguaje o en otro.
Para realizar la conversión del algoritmo en programa se debe utilizar las instrucciones y
sentencias diseñadas en el lenguaje de programación y siguiendo los pasos del algoritmo.
II.5. Depuración y pruebas (pruebas)
La prueba de los programas consiste en ejecutar el programa utilizando datos similares a
los reales o en su caso datos reales y observar los resultados arrojados por el sistema,
tratando de depurar los errores de sintaxis, los errores de ejecución y los errores lógicos:
Errores de sintaxis. Ocurren cuando una o varias sentencias violan una o más
reglas gramaticales de lenguaje de programación.
Errores de ejecución. Son errores que producen una terminación anómala o una
terminación no esperada en tiempo de ejecución, por ejemplo una división por
cero.
Error lógico. Es cuando un programa no realiza la operación que estaba prevista.
II.6. Documentación (manuales)
Todos los sistemas independientemente de su aplicación tienen una documentación
asociada. Esta se clasifica en 2 grupos:
Documentación del usuario
Documentación del sistema
Documentación del usuario
Contiene información relevante para la persona que manejara el sistema y contiene los
siguientes tópicos:
o Requerimientos de hardware y software
o Instalación y configuración del sistema
o Explicación del funcionamiento del sistema
o Manual de referencias (informes de errores en forma detallada)
30
Documentación del sistema
Son todos los documentos relacionados con la aplicación del sistema, desde las
especificaciones de los requisitos hasta el plan de pruebas de la depuración.
Este tipo de documentación puede incluir los siguientes temas:
o Lenguaje de programación utilizado para el desarrollo del sistema (Compañía,
versión, etc.)
o Por cada procedimiento, función o método, una descripción de su funcionamiento,
describiendo a detalle los parámetros que recibe así como la salida que produce.
o Plan de pruebas (por modulo, por unidad de programa, por sistema).
Los siguientes problemas realice su correspondiente análisis:
1. Obtenga la superficie de un triangulo
2. Obtenga el total a pagar aplicando un descuento del 5%.
3. Obtenga los valores de X1 y X2 para resolver ecuaciones de segundo grado:
4. De los valores a y b, obtenga cuantas veces cabe el valor b en el valor a.
5. Obtenga la suma de los números del 1 al 100
Producto de Aprendizaje 2: De los siguientes problemas realice el análisis (40
puntos).
1. Obtenga el cuadrado de 243
2. Obtenga el perímetro y la superficie de un cuadrado
3. Obtenga la suma de dos números
4. Obtenga el producto de dos números
5. Obtenga la resta de dos números
6. Obtenga la división de dos números
7. Obtenga el cuadrado de un numero
8. Obtenga el perímetro de un rectángulo
31
9. Obtenga la hipotenusa de un triangulo rectángulo
10. Obtenga el área y el volumen de un cilindro
11. Obtenga la conversión de grados Celsius a grados Fahrenheit
12. Obtenga la conversión de grados Fahrenheit a grados Celsius
13. Obtenga el área de un triangulo en función de las longitudes de sus lados:
Donde:
14. Dado x numero de metros convertirlos a pies y pulgadas (1 metro = 39.37
pulgadas, 1 pie = 12 pulgadas)
15. Obtenga el salario de un obrero en base a las horas extras trabajadas
16. Obtenga la fuerza de atracción entre dos masas m1 y m2 separadas por una
distancia d:
Donde G es la constante de gravitación universal:
32
III. Herramientas de programación.
Para la representación de algoritmos se debe utilizar algún método que permita la
independización del lenguaje de programación elegido para su ejecución. Para conseguir
este objetivo se precisa que el algoritmo sea representado gráficamente o
numéricamente. Los métodos más utilizados para la representación de algoritmos son:
Diagramas de Flujo
Diagrama NassiSchneiderman (NS)
Lenguaje de especificación de algoritmos (Pseudocódigo)
III.1. Simbología
Diagramas de Flujo
EL diagrama de flujo (Flowchart) es una de las técnicas de representación de algoritmos
más antigua y a la vez más utilizada. Un diagrama de flujo (DF) es un diagrama que utiliza
cajas y líneas que indican el flujo de la información.
Símbolo Función
Inicio/Fin. Comienzo y último símbolo de los diagramas de flujos.
Entrada. Se especifican los datos de entrada del algoritmo.
33
Símbolo Función
Salida. Se especifican los datos de salida del algoritmo.
Proceso. Se especifica cualquier tipo de operación expresión matemáticas (calculo, almacenamiento, transferencia)
Conector. Enlaza diferentes partes del diagrama de flujo
Fechas. Indican el flujo de datos en el algoritmo
Diagrama NassiSchneiderman (NS)
El diagrama NS también conocido como diagrama Chapin, es semejante al DF pero sin
flechas de dirección, por lo cual utiliza un rectángulo para representar los pasos del
algoritmo.
Pseudocódigo
Esta técnica es una combinación entre lenguaje natural y lenguaje de alto nivel.
Inicio
Acción 1
Acción 2
…
Acción n
Fin
III.2. Reglas para la construcción de diagramas
Diagramas de Flujo
Los diagramas de flujo comienzan con el símbolo de inicio/fin
indicando el comienzo del diagrama:
Y terminan con el símbolo de inicio/fin indicando el término del
diagrama:
Inicio
Fin
34
Entre los símbolos de inicio/fin se ponen las acciones (asignación, proceso, entrada,
salida, etc.) que forman parte del diagrama.
Diagrama NassiSchneiderman (NS)
Para este tipo de diagrama se utiliza un rectángulo, en el cual comienza con la leyenda
Inicio y termina con la leyenda Fin. Entre estos dos recuadros de desarrolla el contenido
del algoritmo.
Ejercicio:
Definición del problema: Obtenga la superficie y la longitud de un circulo.
Acción 1
Acción 2
...
Acción n
Inicio
Fin
Inicio
Acción 1
Acción 2
...
Acción n
Fin
35
Análisis:
Entrada: Radio
Salida: Superficie, Longitud
Algoritmo:
Diagrama de Flujo Diagrama NS
III.3. Pseudocódigo
En este tipo de representación se comienza con la leyenda Inicio y termina con Fin y entre
los términos de comienzo y terminación se escribe el desarrollo del algoritmo.
Inicio
Leer Radio
Superficie= *Radio^2
Longitud=2* *Radio
Imprimir Superficie, Longitud
Fin
Inicio
Fin
Superficie= π *Radio^2
Longitud=2*π *Radio
Leer Radio
Superficie, Longitud
Inicio
Leer Radio
Superficie=π *Radio^2
Longitud=2*π *Radio
Imprimir
Superficie, Longitud
Fin
36
Ejercicios:
1. Calcule el salario neto de un trabajador a partir de la lectura del nombre, horas
trabajadas, precio por hora y el cálculo de impuesto son el 25% del salario bruto
(horas trabajadas por precio por hora). Como resultado final imprima el nombre,
salario bruto, impuestos y salario neto.
2. Obtenga la superficie de un triangulo
3. Obtenga el total a pagar aplicando un descuento del 5%.
4. Obtenga los valores de X1 y X2 para resolver ecuaciones de segundo grado:
5. De los valores a y b, obtenga cuantas veces cabe el valor b en el valor a.
6. Obtenga la suma de los números del 1 al 100.
7. Diseñar el algoritmo que lea el valor correspondiente a una distancia en millas
marinas y las escriba expresadas en metros. Sabiendo que 1 milla marina equivale
a 1852 metros.
8. Elabore un algoritmo que lea dos valores y los intercambie.
Estructura selectivas
Las estructuras selectivas se utilizan para forma decisiones lógicas. En las estructuras se
evalúa una condición y en función del resultado se puede realizar una acción u otra.
Estructuras selectivas simples
Diagrama de Flujo Diagrama NS
Condición
Acción 1
Verdadero Falso
Acción 1
Condición
FalsoVerdadero
37
Pseudocódigo
Si Condición
Acción 1 Fin Si
9. La tienda “Artículos de Limpieza S.A. de C.V.” realiza un descuento del 5% a todas
las compras mayores a 2500.00 pesos. Elabore un algoritmo que resuelva este
problema.
10. La empresa “Electrónica Digital” desea un programa que determine si una persona
es solvente económicamente en base a los ingresos y los gastos; si los ingresos
son mayores a los gastos la persona es solvente. Elabore un algoritmo que
resuelva este problema.
11. En la clínica “Salud Eterna” desean un programa que determine si una persona
está enferma en base a su temperatura corporal; si la temperatura corporal es
mayor a 36.5 el programa debe mandar un mensaje que diga “Enfermo”.
Estructuras selectivas dobles
Diagrama de Flujo Diagrama NS
Pseudocódigo
Si Condición
Acción 1 En otro caso
Acción 2 Fin Si
12. Escriba un algoritmo que calcule el total a pagar en una tienda departamental, si la
compra excede de 15,000 pesos se concede un descuento del 10%, en caso
contrario el descuento es del 5%.
13. Elabora un algoritmo que en base a dos números imprima el mayor.
Condición
Acción 1
Verdadero Falso
Acción 2
Acción 1
Condición
FalsoVerdadero
Acción 2
38
14. Elabore un algoritmo que en base a tres números imprima el mayor.
15. Elabore un algoritmo que en base a cuatro números, los imprima en forma
descendente.
Estructuras de selección múltiple
En la vida se presentan problemas en los cuales presentan más de dos alternativas como
posibilidades y eso se soluciona con estructuras de selección múltiple.
Diagrama de Flujo
Diagrama NS
Pseudocódigo
Según sea Selector hacer
1: Acción 1 2: Acción 2
… n: Acción n
En otro caso: Acción OC
Fin Según
16. Elabore un algoritmo que en base al número del mes imprima el mes
correspondiente como cadena de caracteres.
Selector
Acción 1 Acción nAcción 2 Acción OC
1 2n
Otro Caso
…
Acción 1
Selector
Verdadero
Acción 2
1
Acción n Acción OC…
2 n
Otro
Caso
39
17. Elabore un algoritmo que en base a un número (entre 10 y 20) imprima su valor con letra.
18. Elabore un algoritmo que en base al número de día de la semana imprima que día
es. Estructuras de repetición
Cuando se requiere que un conjunto de instrucciones se repita varias veces se utiliza las
estructuras de repetición.
Diagrama de Flujo
For/Next
While/Mientras
Repeat/Repite
Diagrama NassiSchneiderman (NS)
For/Next
While/Mientras
Condición
Inc/Dec
Inicio
Proceso
Si
No
Condición
Proceso Verdadero
Falso
Condición
Proceso
Verdadero
Falso
Inc/Dec
Inicio
Proceso
While Condición
Proceso
40
Repeat/Repite
Pseudocódigo
For/Next Para I = VI Hasta VF [Inc Valor/Dec Valor]
Proceso Fin Para
While/Mientras
Mientras Condición Proceso
Fin Mientras
Repeat/Repite Repite
Proceso Hasta Condición
19. Elabore un algoritmo que lea 10 calificaciones e imprima el promedio.
20. Elabore un algoritmo que lea dos números e imprima la serie de números que
existe entre el número menor a el número mayor.
21. Elabore un algoritmo que lea una serie de valores e imprima el valor más grande
de la serie. El fin de la serie esta denotado por el valor 9999.
22. Calcular la media de una serie de números positivos. El valor cero como entrada
indican que se ha finalizado la serie de números positivos.
Producto de Aprendizaje 3.1: De los siguientes problemas elabore el análisis y
algoritmo (20 puntos).
1. Obtenga el cuadrado de 243
2. Obtenga el perímetro y la superficie de un cuadrado
3. Obtenga la suma de dos números
4. Obtenga el perímetro de un rectángulo
5. Obtenga la hipotenusa de un triangulo rectángulo
6. Diseñar el algoritmo que pida por teclado dos números enteros y muestre su suma, resta, multiplicación, división y el resto (módulo) de la división. Si la
Repeat Condición
Proceso
41
operación no es conmutativa, también se mostrará el resultado invirtiendo los operadores.
7. Lea las horas, minutos y segundos; calcule el tiempo total en segundos.
8. Suponiendo que una paella se puede cocinar exclusivamente con arroz y gambas, y que para cada cuatro personas se utiliza medio kilo de arroz y un cuarto de kilo de gambas, escribir un algoritmo que pida por pantalla el número de comensales para la paella, el precio por kilo de los ingredientes y muestre las cantidades de los ingredientes necesarios y el costo de la misma.
9. Obtenga el área y el volumen de un cilindro
10. Dado x grados Celsius obtenga su conversión a grados Fahrenheit
11. Obtenga el área de un triangulo en función de las longitudes de sus lados:
Donde:
12. Dado x numero de metros convertirlos a pies y pulgadas (1 metro = 39.37 pulgadas, 1 pie = 12 pulgadas)
13. Una tonelada métrica equivale a 35,273.92 onzas. Elabore un algoritmo que lea el
peso de un paquete de cereal para el desayuno en onzas y que obtenga como salida el número de cajas necesarias para llenar una tonelada métrica de cereal, así como deberá proporcionar cuantas onzas sobran. El algoritmo deberá permitir al usuario repetir este proceso las veces que desee.
14. Dado tres números, determinar si la suma de cualquier pareja de ellos es igual al
tercer número. Si se cumple la condición, escribir “iguales” en caso contrario “Distintos”.
15. Elabore un algoritmo lea 3 calificaciones de la materia de Fundamentos de
Programación y determine si el alumno “Aprobado” o “Reprobado” en base a su promedio.
16. Elabore un algoritmo que en base a un valor numérico determine si es Alto o Bajo.
Si el número es mayor a 100 imprima Alto, en caso contrario imprima Bajo.
17. Realice un algoritmo que calcule el monto a pagar por el servicio de estacionamiento, teniendo en cuenta que por la primera hora o fracción de estadía se tiene una tarifa de 10 pesos y las restantes tienen un costo de 6 pesos. Se tiene como datos: hora de entrada, hora de salida (formato militar).
42
18. Desarrolle un algoritmo que permita convertir calificaciones numéricas, según la
siguiente tabla:
A = 10, B =9, C = 8, D = 7, E = 6 y F= 5 a 0.
19. Elabore un algoritmo que lea 4 números e imprima el mayor de ellos.
20. Desarrolle un algoritmo que permita determinar a partir de un número de días, ingresado por teclado, ¿Cuántos años, meses, semanas y días; constituyen el número de días proporcionado?
21. Elabore un algoritmo que lea un número e imprima sus dígitos en forma individual: Ejemplo: Dame un número? 7539
9 3 5 7
22. Obtenga el salario de un obrero en base a las horas extras trabajadas. El salario
se calcula sumando al sueldo base las horas extra. El sueldo base es equivale a $450.00 y las horas extra se calculan en base a la siguiente tabla:
1 a 10 hrs $11.50 11 a 12 hrs $ 13.00 13 a 20 hrs $ 14.00 21 y más hrs $ 15.00
23. Elabore un algoritmo que lea un número decimal e imprima su representación en
binario.
24. Desarrolle un algoritmo para la empresa Constructora Tecnovivir Casas C.A., que le permita calcular e imprimir la nómina para un total de 50 obreros a quien se le paga por horas trabajadas, la cual se paga a 50 pesos.
25. Elabore un algoritmo que lea un número e imprima su factorial.
Ejemplo: 5 = 5 * 4 * 3 * 2 * 1 = 120
Nota: El factorial de 0 (cero) por notación es 1.
43
III.4. Tipos de datos y expresiones
Tipos de datos
Existen dos grupos de tipos de datos:
Simples (básicos, primitivos, sin estructura)
Compuestos (Estructurados, Complejos)
Dentro de los tipos de datos Simples se encuentran:
Numéricos
o Enteros
5, 15, 1350, 50000, etc.
o Punto Flotante (Reales)
0.00008, 3.7452, 8.72, 370000.0, etc.
En aplicaciones científicas se requiere una notación especial para manejar
números muy grandes (como la masa de la tierra) o muy pequeños (como la
masa de un electrón) esta notación es llamada notación exponencial o
notación científica:
367 520 100 000 000 000 00 3.675201E+20
0.000 000 000 030 257 3.0257E11
Lógicos (Booleanos)
Los datos tipo lógico es aquel que solo puede tomar dos valores:
Verdadero (True)
Falso (False)
Carácter (Char)
El tipo de datos carácter es un conjunto finito y ordenado de caracteres. Un dato
tipo carácter contiene un solo carácter. Un carácter se delimita por comillas
sencillas:
‘A’, ‘a’, ‘1’, ‘$’, etc.
Los grupos de caracteres son los siguientes:
o Caracteres alfabéticos: ‘A’, ‘B’,…,’Z’, ‘a’, ‘b’,…,’z’
o Caracteres numéricos: ‘0’, ‘1’, ‘2’,…,’9’
o Caracteres Especiales: +, , /, *, ^, ., ;, <, >, $, #, etc.
Y dentro los Compuestos o Estructurados se encuentran:
44
Cadena de caracteres (String)
Una cadena de caracteres es una sucesión de caracteres que se encuentra
delimitado por comillas dobles:
“Hola Mundo”
“30 de septiembre de 2010”
“Esta es una cadena de caracteres llamada también String”
Clases (Class)
Arreglos (Array)
Registros (Records)
Listas (LinkerList)
Conjuntos (Set)
Árboles (Tree)
Grafos (Graph)
Abstractos (Abstract)
Archivos (Files)
En la siguiente tabla presentamos los 8 tipos de dato primitivos de Java, el número de bits
que ocupan y el rango de valores que pueden tomar.
Tipo Tamaño en bits Rango de valores
boolean 1 true o false Nota: El No. de bits puede variar según la
plataforma
char 16 ‘\u0000’ hasta ‘\uFFFF' Conjunto Unicode de ISO
byte 8 128 a +127 27 a 27 – 1
short 16 32,768 a +32,767
215 a 215 – 1
int 32 2,147,483,648 a +2,147,483,647
231 a 231 – 1
long 64 9,223,372,036,854,775,808 a +9,223,372,036,854,775,807
263 a 263 – 1
float 32
Rango negativo: 3.4028234663852886E+38 hasta 1.40129846432481707E45
Rango positivo: 1.40129846432481707E45 hasta 3.4028234663852886E+38
double 64
Rango negativo: 1.797693134862157E308 hasta 4.94065645841246544E324
Rango positivo: 4.94065645841246544E324 hasta 1.797693134862157E308
45
Tokens elementos léxico de los programas
Existen 5 clase de tokens: identificadores, palabras reservadas, literales, operadores y
otros.
Identificadores
Los identificadores pueden representar variables, constantes, métodos, nombres de
archivos, etc.
Diagrama de contexto de los identificadores:
Regla para formar un identificador:
1. Debe comenzar por una letra 2. Después de la 1er. Letra puede contener letras, dígitos o guión de piso 3. No están permitidos los espacios en blanco 4. No deben formar palabras reservadas 5. Java es sensibles a las mayúsculas y minúsculas 6. En Java la longitud de los identificadores no tiene límite.
Expresiones
Las expresiones son combinaciones de constantes, variables, operadores, operandos,
paréntesis, funciones, etc.
c)(ba 3
Operando
Variable Operador
Constante Función
46
Expresiones aritméticas
Las expresiones aritméticas son análogas a las expresiones matemáticas.
Operadores aritméticos:
+ Suma Resta * Multiplicación / División
% Modulo
Ejemplos:
5 + 3 = 8
3 – 2 = 1
5 * 3 = 15
17/2 = 8
17/2.0 = 8.5
(double) 17/2 = 8.5
20 % 7 = 6
Transforme las siguientes formulas en expresiones computacionales:
47
III.5. Estructuras lógicas
Otro tipo de expresiones son las lógicas, o booleanas, cuyo valor puede ser true
(verdadero) o false (falso) y se denominan expresiones booleanas en honor a matemático
George Boole, quien desarrollo el álgebra booleana.
Mediante los operadores relacionales se pueden hacer comparaciones entre valores tipo
numérico y carácter.
Por ejemplo:
3 < 6 V 0 > 9 F
8 <= 5 F
A = 3 y B = 4 A>B F A<B V
A<=B V B==4 V
X=2 Y = 3 Z = 9 X>Z F Y<X F Z!=X V
Operadores Lógicas
Java cuenta con los operadores lógicos para formar condiciones más complejas. Los
operadores lógicos son:
Operador Descripción Corto Circuito
&& And condicional Si
|| Or condicional
& And lógico No
| Or lógico
^ Or exclusivo
! Negación
Tablas de verdad de los operadores lógico:
&& And Condicional
A B A && B
false false false
false true false
true false false
true true true
Con un operador && (And condicional) será true si y solo si todas sus entradas son true.
48
|| Or Condicional
A B A || B
false false false
false true true
true false true
true true true
Con un operador || (Or condicional) será true si por lo menos una de sus entradas es true.
Operadores & And lógico y | Or lógico funcionan de manera idéntica a los operadores &&
And condicional y || Or condicional, con la excepción de de que los operadores lógicos
siempre se evaluaran todas las expresiones (es decir, no realizan una evaluación de corto
circuito).
^ Or Exclusivo
A B A ^ B
false false false
false true true
true false true
true true false
Con un operador ^ (Or exclusivo) es true si y solo si una de sus operandos es true y el
otro es false
! Negación
A !A
false true
true false
Por medio del operador ! (Negación) se invierte el significado de la condición. A diferencia
de los operadores &&, ||, &, | y ^ que son operadores binarios, el operador ! es unario.
Por ejemplo: Si A=3, B=2 y C=7
a) (A>5) || (B<C) V b) (A!=B) && (B==C) c) (A>=B) & (C>=5) d) !(A<=9) | (5>B)
Reglas de prioridad
Las expresiones que tienen dos o más operadores requieren de reglas matemáticas que
permitan determinar el orden de las operaciones, a estas reglas se les llama reglas de
prioridad.
49
Prioridad Operadores Asociatividad
1 () Agrupación ID
2 (tipo) Cast DI
3 * / % ID
4 + ID
5 < <= > >= ID
6 == != ID
7 & ID
8 ^ ID
9 | ID
10 && ID
11 || ID
12 = *= /= %= += = DI
¿Cuál es el valor de las siguientes expresiones?
a) 15 * 14 – 3 *7 b) (24 + 2 * 6) / 4 c) 3 + 4 * (8 * (4 – (9 + 31) / 4)) d) 15 + 3 – 10 – 40 / (23 % 6)
Estructura general de un programa en Java
import Importación de paquetes con clases predefinidas.
public class NombreDeLaClase {
Declaración de variables miembro de la clase
public static tipo main (String[] args) {
Declaración de variables locales
Sentencias de la función main()
[return tipo;]
}
acceso static tipo NombreDelMétodo1 (Lista de Argumentos) {
Declaración de variables del método 1
Sentencias del método 1
[return tipo;]
}
50
acceso static tipo NombreDelMétodo2 (Lista de Argumentos) {
Declaración de variables del método 2
Sentencias del método 2
[return tipo;]
}
}
Variables
Una variable es un identificador donde se almacena un valor con un cierto tipo de dato.
Las variables de tipos básicos almacena datos del tipo primitivos, las variables de clases o
variables de objetos, hacen referencias a objetos. Una constante es una variable cuyo
contenido no puede ser modificado.
Declaración de variables
Ejemplo:
int x, y;
float a, b, c;
char letra1;
Inicialización de variables
Una de las variantes que se puede hacer en una declaración es inicializar una variable
con un valor a ser declarada.
Ejemplos:
int x, y = 0;
float a, b, c = 100.0f;
char letra1 = ‘A’;
Se pueden declarar una variable en tres lugares:
En una clase, como miembro de clase
Al principio de un método o bloque de código
En el punto de utilización.
tipo identificador
,
;
tipo identificador
,
; Expresión =
;
51
Ejemplo de las tres formas de declarar una variable:
Objetos que permiten E/S por consola.
En Java, la entrada y salida se lee y escribe en flujos (streams). La fuente básica de
entrada de datos es el teclado y la fuente de salida es pantalla. La clase System define
dos referencias a objetos static para la gestión de entrada (in) y salida (out).
Salida (System.out)
El objeto out definida en la clase System está asociado con el flujo de salida, que dirige
los datos a consola y permite visualizarlos en pantalla, por ejemplo:
System.out.println(“Esta es una cadena”);
Se visualizará en pantalla: Esta es una cadena.
52
Descripción del método print:
void print(cadena) Despliega una cadena en pantalla.
void println(cadena) Despliega una cadena en pantalla y al final un carácter de nueva
línea (‘\n’).
Con estos métodos se puede escribir cualquier cadena o dato de los tipos primitivos,
como por ejemplo:
System.out.println( "Valores de las Variables: \n" +
"a=" + a +"\n" +
"b=" + b +"\n" +
"x=" + x +"\n" +
"y=" + y );
Entrada (System.in)
Por medio de un objeto Scanner se puede leer datos desde un programa, esta clase
pertenece al paquete java.util y debe ser importada. Para poder utilizarlo instancie un
objeto de la siguiente forma:
Scanner identificador = new Scanner (System.in);
Esta expresión crea un objeto Scanner y determina que leerá los datos desde teclado
mediante los siguientes métodos:
identificador.nextBoolean() Para Booleanos
identificador.nextByte() Para números Enteros tipo byte
identificador.nextShort() Para números Enteros tipo short
identificador.nextInt() Para números Enteros tipo int
identificador.nextLong() Para números Enteros tipo long
identificador.nextFloat() Para números flotantes
identificador.nextDouble() Para números doubles
identificador.next() Para el siguiente token
identificador.nextLine() Para una línea
53
Recordemos el siguiente ejemplo: Obtenga la superficie y la longitud de un círculo. Análisis:
Entrada: Radio Salida: Cálculos de Superficie y Longitud Algoritmo:
54
El siguiente ejemplo lee dos números enteros, los suma y muestra el resultado mediante ventanas de Windows.
Inicio
Fin
Superficie= π *Radio^2
Longitud=2*π *Radio
LeerRadio
Superficie, Longitud
55
Las instrucciones: num1 = Integer.parseInt(primerNumero); num2 = Integer.parseInt(segundoNumero); Convierten los datos tipo String a tipo int y en caso de que ocurra una un error envían una excepción de formato de numérico.
56
El método showMessageDialog de la clase JOptionPane tiene varias formas de enviarles parámetros: 1.
public static void showMessageDialog(Component componentePadre,
Object Mensaje)
Donde los parámetros:
componentePadre Determina la ventana en que se desplegara el mensaje, si es null,
se despliega en la ventana por defecto.
Mensaje Objeto a desplegar
2.
public static void showMessageDialog(Component componentePadre,
Object Mensaje,
String Titulo,
int TipodeMensaje)
Donde los parámetros:
componentePadre Determina la ventana en que se desplegara el mensaje, si es null,
se despliega en la ventana por defecto.
Mensaje Objeto a desplegar
Titulo Cadena de caracteres de la caja de dialogo
TipodeMensaje Valor entero que determina que imagen se despliega según la
siguiente tabla:
Tipo de cuadro de diálogo de mensaje Icono Descripción
JOptionPane.ERROR_MESSAGE
Ventana de Error
JOptionPane.INFORMATION_MESSAGE
Ventana Informativa
JOptionPane.WARNING_MESSAGE
Ventana de Advertencia
JOptionPane.QUESTION_MESSAGE
Ventana de introducción de datos o selección de alguna
alternativa
57
Tipo de cuadro de diálogo de mensaje Icono Descripción
JOptionPane.PLAIN_MESSAGE Sin Icono Ventana estándar
Ejercicios: Elabore los siguientes programa en Java
1. Calcule el salario neto de un trabajador a partir de la lectura del nombre, horas
trabajadas, precio por hora y el cálculo de impuesto son el 25% del salario bruto
(horas trabajadas por precio por hora). Como resultado final imprima el nombre,
salario bruto, impuestos y salario neto.
2. Obtenga la superficie de un triangulo
58
3. Obtenga el total a pagar aplicando un descuento del 5%.
4. Obtenga los valores de X1 y X2 para resolver ecuaciones de segundo grado:
5. De los valores a y b, obtenga cuantas veces cabe el valor b en el valor a.
6. Obtenga la suma de los números del 1 al 100.
7. Diseñar el algoritmo que lea el valor correspondiente a una distancia en millas
marinas y las escriba expresadas en metros. Sabiendo que 1 milla marina equivale
a 1852 metros.
8. Elabore un algoritmo que lea dos valores y los intercambie.
Sintaxis de la selección simple:
Estructuras selectivas simples
Diagrama de Flujo Diagrama NS
Pseudocódigo
Si Condición
Acción 1 Fin Si
if (Expresión) Acción;
o
if (Expresión)
Acción;
if (condición) {acción1; acción2,…,acción n} ;
o
Condición
Acción 1
Verdadero Falso
Acción 1
Condición
FalsoVerdadero
Nota: El if solo soporta una instrucción, si
desea poner más de una sentencia debe
utilizar un bloque de código ({..}).
59
if (condición) {
acción1;
acción 2;
.
.
acción n;
}
9. La tienda “Artículos de Limpieza S.A. de C.V.” realiza un descuento del 5% a todas
las compras mayores a 2500.00 pesos. Elabore un algoritmo que resuelva este
problema.
10. La empresa “Electrónica Digital” desea un programa que determine si una persona
es solvente económicamente en base a los ingresos y los gastos; si los ingresos
son mayores a los gastos la persona es solvente. Elabore un algoritmo que
resuelva este problema.
11. En la clínica “Salud Eterna” desean un programa que determine si una persona
está enferma en base a su temperatura corporal; si la temperatura corporal es
mayor a 36.5 el programa debe mandar un mensaje que diga “Enfermo”.
Sintaxis de la selección doble:
Estructuras selectivas dobles
Diagrama de Flujo Diagrama NS
Pseudocódigo
Si Condición
Acción 1 En otro caso
Acción 2 Fin Si
Condición
Acción 1
Verdadero Falso
Acción 2
Acción 1
Condición
FalsoVerdadero
Acción 2
60
if (condición)
acción 1;
else
acción 2;
if con más de una sentencia y usando un boque de código:
if (condición) {
acción1;
acción 2;
…
acción n;
}
else {
acción1’;
acción 2’;
…
acción n’;
}
12. Escriba un algoritmo que calcule el total a pagar en una tienda departamental, si la
compra excede de 15,000 pesos se concede un descuento del 10%, en caso
contrario el descuento es del 5%.
13. Elabora un algoritmo que en base a dos números imprima el mayor.
14. Elabore un algoritmo que en base a tres números imprima el mayor.
15. Elabore un algoritmo que en base a cuatro números, los imprima en forma
descendente.
Sintaxis de Selección múltiple:
Diagrama de Flujo
Selector
Acción 1 Acción nAcción 2 Acción OC
1 2n
Otro Caso
…
61
Diagrama NS
Pseudocódigo
Según sea Selector hacer
1: Acción 1 2: Acción 2
… n: Acción n
En otro caso: Acción OC
Fin Según
switch (selector) {
case constante 1: Acción 1;
break;
case constante 2: Acción 2;
break;
…
default: Acción n;
}
16. Elabore un algoritmo que en base al número del mes imprima el mes
correspondiente como cadena de caracteres.
17. Elabore un algoritmo que en base a un número (entre 10 y 20) imprima su valor
con letra.
18. Elabore un algoritmo que en base al número de día de la semana imprima que día
es.
Acción 1
Selector
Verdadero
Acción 2
1
Acción n Acción OC…
2 n
Otro
Caso
switch (letra) {
case ‘a’: case’A’: case ‘á’: case ‘A’:
case ‘e’: case’E’: case ‘é’: case ‘É’:
case ‘i’: case’I’: case ‘í’: case ‘Í’:
case ‘o’: case’O’: case ‘ó’: case ‘Ó’:
case ‘u’: case’U’: case ‘ú’: case ‘Ú:
System.out.println(letra + “ es vocal”);
}
62
Sintaxis de los ciclos Java:
Diagrama de Flujo
For/Next
While/Mientras
Repeat/Repite
Diagrama NassiSchneiderman (NS)
For/Next
While/Mientras
Repeat/Repite
Condición
Inc/Dec
Inicio
Proceso
Si
No
Condición
Proceso Verdadero
Falso
Condición
Proceso
Verdadero
Falso
Inc/Dec
Inicio
Proceso
While Condición
Proceso
Repeat Condición
Proceso
63
Pseudocódigo
For/Next Para I = VI Hasta VF [Inc Valor/Dec Valor]
Proceso Fin Para
While/Mientras
Mientras Condición Proceso
Fin Mientras
Repeat/Repite Repite
Proceso Hasta Condición
for
1. for (Inicialización; Condición; Incremento)
sentencia;
2. for (Inicialización; Condición; Incremento) {
sentencia 1;
sentencia 2;
…
sentencia n;
}
while
1. while (condición)
sentencia;
2. while (condición) {
sentencia 1;
sentencia 1;
…
sentencia n;
}
64
do while
1. do
sentencia;
while (condición);
2. do {
sentencia 1;
sentencia 2;
…
sentencia n;
} while (condición);
19. Elabore un algoritmo que lea 10 calificaciones e imprima el promedio.
20. Elabore un algoritmo que lea dos números e imprima la serie de números que
existe entre el número menor a el número mayor.
21. Elabore un algoritmo que lea una serie de valores e imprima el valor más grande
de la serie. El fin de la serie esta denotado por el valor 9999.
22. Calcular la media de una serie de números positivos. El valor cero como entrada
indican que se ha finalizado la serie de números positivos.
Clase String La Clase String proporciona los mecanismos para el manejo de cadenas.
Ya que no se puede cambiar el valor de un String una vez que se ha creado, esta clase se usa principalmente para analizar, manipular y obtener los valores de las cadenas. Aunque hay métodos que permiten modificar y añadir al valor de la cadena, estos métodos no modifican el String en si, sino que regresan un nuevo String con los valores deseado.
Métodos Descripción
String() Crea un Objeto String.
String(char ch[]) Crea un Objeto String basado en el arreglo ch[].
String(String s) Crea un Objeto String con el valor s especificado.
65
Métodos Descripción
char charAt(int pos) Regresa el carácter que se encuentra en la posición pos.
int compareTo(String otroString)
Regresa un int donde: < 0 El valor del String es menor al
otroString. 0 El valor del String es igual a
otroString > 0 El valor del String es mayor a
otroString.
String concat(String str) Regresa la concatenación del String y el str.
boolean equals(Object otroObjeto) Regresa true si otroObjeto es String y tiene el mismo valor.
boolean equalsIgnoreCase(String OtroString) Compara el String con otroString sin importar las mayúsculas y minúsculas.
int length() Regresa la longitud del String
int indexOf(String str) Regresa la posición donde se encuentra str en el String, en caso de no encontrarlo regresa -1.
int indexOf(String str, int ini) Regresa la posición donde se encuentra str en el String comenzando en la posición ini.
int indexOf(char ch) Regresa la primera posición donde se encuentra ch en el String.
int indexOf(char ch, int ini) Regresa la primera posición donde se encuentra ch en el String comenzando en la posición ini.
int lastIndexOf(String str) Regresa la última posición donde se encuentra str en el String.
int lastIndexOf(String str, int ini)
Regresa la última posición donde se encuentra str en el String que se encuentre antes de la posición ini.
66
Métodos Descripción
String replace(char viejoch, char nuevoch) Remplaza todos los caracteres viejoch por el carácter nuevoch.
String substring(int inicio, int fin) Regresa una subcadena desde inicio hasta fin.
String substring(int inicio) Regresa una subcadena desde inicio hasta final de la cadena.
String toLowerCase() Regresa el valor del String en minúsculas
String toString() Regresa el valor del String.
String toUpperCase() Regresa el valor del String en mayúsculas.
String trim() Regresa la String sin los espacios a la izq y der.
Static String valueOf(double d) static String valueOf(float f) static String valueOf(long l) static String valueOf(int i) static String valueOf(char ch) static String valueOf(boolean b)
Regresa un String que contiene el valor del tipo de dato especificado.
Static String valueOf(Object obj) Regresa un String que representa una cadena del Object.
23. Elabore un programa que lea su nombre, lo imprima Normal y en forma de espejo.
Ejemplo:
Dame tu nombre: José Pérez
José Pérez-zeréP éseJ
24. Elabore un programa que lea su nombre y lo despliegue por palabra.
25. Elabore un programa que lea su nombre y despliegue cuantas vocales, literales y
espacios tiene.
67
Producto de Aprendizaje 3.2: Desarrolle los siguientes programas en Java (20
puntos)
1. En la empresa Aceros Industrializados S.A. de C.V. los obreros recibieron un
incremento del 7.6% retroactivo a 6 meses. Elabore un programa que en base el salario mensual despliegue el monto total de incremento por los 6 meses.
2. Elabore un programa que lea 4 números e imprima el mayor de ellos. 3. Elabore un programa que lea los tres parciales de la materia de Fundamentos de
Programación y en base el Promedio despliegue si Acredita o No Acredita la materia.
4. Elabore un programa que lea un número e imprima sus dígitos en forma individual: Ejemplo: Dame un número? 7539 9 3 5 7 5. Obtenga el salario de un obrero en base a las horas extras trabajadas. El salario se
calcula sumando al sueldo base las horas extra. El sueldo base es equivale a $450.00 y las horas extra se calculan en base a la siguiente tabla:
1 a 10 hrs $11.50 11 a 12 hrs $ 13.00 21 y más hrs $ 15.00 6. Elabore un programa que lea un número decimal e imprima su representación en
binario. 7. Una empresa de autobuses hace viajes desde la Capital del País hacia ciudades del
interior, para lo cual dispone de dos tipos de vehículos, pequeños y grandes, con capacidad de 20 y 60 pasajeros respectivamente.
Cada vez que parte un autobús del terminal de la ciudad Capital es anotado el tipo de vehículo ( P o G) y el número de pasajeros que transporta. La empresa desea un reporte al final del día con la información siguiente:
a) El tipo de autobús: b) La cantidad de pasajeros. c) El mensaje "Ganancia" si en el autobús viaja un número de pasajeros igual o
mayor que el 50% de su capacidad, y "Pérdida" en caso contrario. 8. Elabore un programa que lea un número e imprima su factorial.
Ejemplo: 5 = 5 * 4 * 3 * 2 * 1 = 120
Nota: El factorial de 0 (cero) por notación es 1.
68
9. Pedir un número entre 0 y 9999 y decir cuántas cifras tiene. 10. Elabore un programa que lea serie de números e imprima su media. El final de los
números de denota con un -1. 11. Elabore un programa que lea 10 calificaciones e imprime el promedio. 12. Pedir 10 calificaciones entre 0 a 10 y mostrarla de la forma: Insuficiente (0 a 6),
Suficiente (7), Bien (8), Muy bien (9) y Excelente (10). 13. Elabore un algoritmo que lea dos números diferentes, he imprima el rango del
número más pequeño al número más grande. 14. Solicite un número y despliegue el valor individual de cada digito de la siguiente
forma: 7489 siete, cuatro, ocho, nueve. 15. Pedir un número de 0 a 99 y mostrarlo escrito. Por ejemplo, para 56 mostrar:
cincuenta y seis. 16. Elabore un programa que lea un número positivo diferente de cero e imprima la
secuencia de números en forma descendente hasta el cero. 17. Leer un número y mostrar su cuadrado, repetir el proceso hasta que se introduzca
un número negativo. 18. Elabore un programa que imprima la suma de los números impares del 1 al 100
utilizando ciclos. 19. Leer un número e indicar si es positivo o negativo. El proceso se repetirá hasta que
se introduzca un 0. 20. Realizar un juego para adivinar un número. Para ello pedir un número N, y luego ir
pidiendo números indicando “mayor” o “menor” según sea mayor o menor con respecto a N. El proceso termina cuando el usuario acierta.
21. Elabore un programa en Java que lea su nombre y lo despliegue en mayúscula cada palabra. Ejemplo: JOSÉ PÉREZ José Pérez
69
IV. Programación orientada a objetos y modelado. ¿Qué es un Modelo?
“Un Modelo es una simplificación de la realidad.”
¿Por qué Modelamos?
Construimos modelos para comprender mejor el sistema que estamos desarrollando.
El Modelado no es sólo para los grandes sistemas. Sin embargo, es absolutamente cierto
que, cuanto más grande y complejo es el sistema, el modelado se hace más importante,
por una simple razón:
Construimos modelados de sistemas complejos porque no
podemos comprender el sistema en su totalidad
IV.1. Características del modelo orientado a objetos
Hay un cierto desacuerdo sobre exactamente qué características de un método de
programación o lenguaje le definen como "orientado a objetos", pero hay un consenso
general en que las características siguientes que son las más importantes:
Abstracción: La abstracción es la propiedad de los objetos que consiste en tener
en cuenta sólo los aspectos más importantes desde un punto de vista
determinado y no tener en cuenta los restantes.
Encapsulamiento: Es el proceso de agrupar datos y operaciones relacionadas bajo la
misma unidad de programación. En el caso de los objetos que
poseen las mismas características y comportamientos se agrupan en
clases, que no son más que unidades o módulos de programación
que encapsulan datos y operaciones.
Herencia: La idea de la herencia es permitir la creación de nuevas clases basadas
en clases existentes. Cuando heredamos de una clase existente,
reusamos (o heredamos) métodos y campos, y agregamos nuevos
campos y métodos para cumplir con la situación nueva. Cada vez que
encontremos la relación "es-un" entre dos clases, estamos ante la
presencia de herencia.
La clase ya existente es llamada superclass, o clase base, o clase
padre, mientras que la clase nueva es llamada subclase, clase derivada,
o clase hija.
70
Polimorfismo: Es la propiedad que indica, literalmente, la posibilidad de que una
entidad tome muchas formas. En términos prácticos, el polimorfismo
permite referirse a objetos de clases diferentes mediante el mismo
elemento de programa y realizar la misma operación de diferentes
formas, según sea el objeto que se referencia en ese momento.
IV.2. Elementos primordiales en el modelo de objetos
La programación Orientada a Objetos trata de cumplir las necesidades de los usuarios
finales, estás tareas se realizan mediante el modelado del mundo real, el soporte
fundamental de este paradigma de programación.
Elementos primordiales:
Abstracción
Recordemos que la representación en UML de una clase es así:
Modele las siguientes clases, con sus atributos, constructores y métodos (cambia (set),
regresa (get) y un método general de desplegado)
Persona
Vehículo
Figura (Geométrica)
Encapsulamiento
De los modelos anteriores desarróllelas como clase utilizando la siguiente notación.
Nombre de la clase
Atributos
Comportamiento
71
public class NombreDeLaClase {
Declaración de variables miembro de la clase
Constructores…
acceso static tipo NombreDelMétodo1 (Lista de Argumentos) {
…
}
acceso static tipo NombreDelMétodo2 (Lista de Argumentos) {
…
}
}
Herencia
Al crear una clase, en vez de declarar miembros (variables y métodos) completamente
nuevos, el programador puede designar que la nueva clase herede los miembros de una
clase existente. Esta clase existente se conoce como superclase, y la nueva clase se
conoce como subclase. En otros lenguajes de programación, como C++ se refieren a la
superclase como clase base y a la subclase como clase derivada. Una vez creada, cada
subclase se puede convertir en superclase de futuras subclases. Una subclase
generalmente agrega sus propias variables y métodos, por lo tanto, una subclase es más
específica que una superclase y representa un grupo más concreto de objetos.
La herencia explícita es cuando una subclase hereda en forma directa los atributos y
comportamiento de la superclase, mientras que la herencia implícita es cuando una
subclase hereda atributos y comportamientos de dos o más niveles arriba de las
jerarquías de clase.
Préstamo
Hipotecario Personal Prendario
Superclase
Subclases
72
A veces es difícil decidir cuál es la relación de herencia más óptima entre el diseño de
clases. Consideremos por ejemplo el caso de empleados de una empresa, existen
diferentes tipos de clasificación según sea el criterio de discriminación, por ejemplo por
tipo de empleado:
Por tipo de percepción:
Por tiempo de dedicación laboral:
Por tipo de contratación:
Empleado
Directivo Administrativo Obrero
Empleado
Confianza Comisión Asalariado
Empleado
Discontinuo TiempoFijo Horas
Empleado
Base Anual Mensual
73
Como se darán cuenta es difícil establecer cuál de estos modelos es el más adecuado, lo
mejor es decidirse hasta que tenga la aplicación real y el usuario le diga cuál es la mejor
forma de organización de su empresa y así trasladarla al diseño jerárquico de clases.
En una clase existen secciones públicas, privadas, protegidas y visibilidad amigable (por defecto). Los elementos públicos son accesibles a todos los métodos de cualquier clase; los elementos privados son accesibles sólo a los miembros de la clase en la que están definidos, los elementos protegidos pueden ser accedidos clases del mismo paquete y clases derivadas del mismo o de otro debido a la propiedad de la herencia; y los elementos de la visibilidad por defecto son accesibles desde cualquier clase del mismo paquete. En general, herencia pública significa que una subclase tiene acceso a los elementos públicos y protegidos de la superclase. Los elementos públicos se heredan como públicos, los elementos protegidos permanecen protegidos. En java la herencia siempre es pública, las clases para ser visibles desde otros paquetes se deben declarar con e modificador public, en caso contrario la clase está restringida al paquete donde se declaro. Es necesario hacer una diferencia entre la relación “es un” y la relación “tiene un”. La relación “es un” representa la herencia, por ejemplo considere la siguiente jerarquía de clases:
En este caso el Automóvil es un Vehículo, mientras que la relación “tiene un” sería el Automóvil tiene un volante, lo cual marca la diferencia, todos los automóviles son Vehículos pero no todos los Vehículos son Automóviles y finalmente todos los Automóviles tiene un volante. Por lo tanto una clase base (o superclase) es una clase más general de la cual se derivan clases derivadas (o subclases). Una clase derivada (o subclase) es una clase que hereda los atributos y comportamiento de una clase base (o superclase). Sintaxis: public class Subclase extends Superclase { acceso nuevoMiembro ... public tipo NuevoMétodo (Lista de Parámetros) … }
Vehículo
Automóvil Camión Bicicleta
74
Una subclase es una especialización de una superclase. En consecuencia el constructor de la superclase debe ser llamado antes de crear un objeto de la superclase y el constructor de la subclase debe ser invocado después. Haciendo un comparativo, lo mismo ocurre con los objetos de la subclase, el objeto de la superclase debe de existir antes de convertir en un objeto a la subclase. En el siguiente ejemplo se tiene la clase A y B, con sus respectivos constructores, la clase D hereda todas las características de la clase A, mientras que la clase E hereda las características de la clase B. Dentro de la clase principal EjemploConstructores, al instanciar el objeto d1 del tipo D, primero se creará el objeto A mediante su constructor y posteriormente se ejecutara el constructor de D, al instanciar el objeto e1 del tipo E, ocurrirá algo similar, ejecutándose primero el constructor de B y posteriormente el constructor de E.
75
Resultado de la ejecución:
En el ejemplo anterior vimos como los constructores se invocan implícitamente, pero que pasaría si queremos invocar un constructor con argumentos, entonces lo invocaríamos de forma explícita por medio del comando:
super(lista de argumentos) Si es un método de la super clase sería:
super.metodo(lista de argumentos). Ejemplo: public class Persona { protected String nombre; public Persona(String nombre) { // Constructor de Persona this.nombre = new String(nombre); } } public class Estudiante extends Persona { private long numeroControl; public Estudiante(String nom, long nc) { // Constructor de Estudiante super(nom); // llamada al constructor de la superclase (Persona). numeroControl = nc; } … } Ejercicio: Desarrolle el siguiente diseño en Java y cree una clase principal donde instancie un objeto de cada clase.
76
Una vez implementado en BlueJ se tendrá un diseño así:
+ Presamo()+ void Prestamo (float M, float I)+ float calculaIntereses()+ void actualizaMonto(float M)+ void actualizaInteres(float I)+ String muestra()
- float Monto- float Interes
Prestamo
Hipotecario Personal Prendario
-String Inmueble-int AniosHipo
+ Hipotecario()+ Hipotecario(float M, float I, String In, int A)+ String muestra()
-String TipoDocumento-String FechaVen
+ Personal()+ Personal(float M, float I, String D, String F)+ String muestra()
-String Prenda- float ValorPrenda
+ Prendario()+ Prendario(float M, float I, String P, float V)+ String muestra()
77
78
79
Resultado de la ejecución:
80
Polimorfismo
En programación orientada a objetos se denomina polimorfismo a la capacidad del código
de un programa para ser utilizado con diferentes tipos de datos u objetos. También se
puede aplicar a la propiedad que poseen algunas operaciones de tener un
comportamiento diferente dependiendo del objeto (o tipo de dato) sobre el que se aplican.
Se puede clasificar el polimorfismo en dos grandes clases:
Polimorfismo dinámico (herencia-redefinición) es aquél en el que el código no
incluye ningún tipo de especificación sobre el tipo de datos sobre el que se trabaja.
Así, puede ser utilizado a todo tipo de datos compatible.
Implementación en BlueJ:
Animal
dormir()
León
dormir()
Oso
dormir()
Tigre
dormir()
dormir (){System.out.println(“Zzzzz”);
}
dormir (){System.out.println(“Sobre el vientre”);
} dormir (){System.out.println(“Sobre la espalda”);
}
dormir (){System.out.println(“En un árbol”);
}
81
82
Clase abstracta. Cuando pensamos en un tipo de clase, suponemos que los programas crearán objetos de ese tipo, sin embargo, existen casos en los que es conveniente declarar clases para las cuales el programador no pretende instanciar objetos. Dichas clases se denominan clases abstractas, debido a que estas solo se utilizan como superclases en la jerarquía de herencias, nos referiremos a ellas como superclases abstractas. Estas clases no pueden utilizarse para instanciar objetos, porque las clases abstractas se declaran incompletas, las subclases deben declarar las partes faltantes. El propósito de una clase abstracta es proporcionar una superclase apropiada, a partir de la cual se puedan heredar otras clases. Las clases que pueden usarse para instanciar objetos se conocen como clases concretas, dichas clases proporcionan implementaciones de todos los métodos que declaran. Podríamos tener una superclase llamada Bidimensional y derivar a partir de ella clases concretas como Cuadrado, Circulo y Triangulo. También podríamos tener una superclase abstracta llamada Tridimensional y derivar de ella clases concretas como Cubo, Esfera y Tetraedro. Las clases abstractas son demasiado genéricas como para crear objetos reales; sólo especifican lo que las subclases tienen en común. Necesitamos ser más específicos antes de poder crear objetos. Por ejemplo, si alguien le dice “dibuje una figura”, ¿Qué figura dibujaría?. Las clases específicas proporcionan los aspectos específicos que hacen que sea razonable el crear instancias de objetos.
83
Una jerarquía de clases no necesita contener clases abstractas, sin embargo, comúnmente se utilizan jerarquías de clases encabezadas por superclases abstractas para reducir las dependencias de código cliente en un tipos de subclases específicas. Por ejemplo considere la siguiente jerarquía de clases:
En este jerarquía de clases la superclase abstracta Figura, en el siguiente nivel tenemos otros dos clases abstractas Bidimensional y Tridimensional y en el último nivel se declaran clases concretas las cuales son para las figuras bidimensionales Circulo, Cuadrado y Triangulo, mientras que las figuras tridimensionales son Esfera, Cubo y Tetraedro. Para que una clase sea abstracta se debe declarar con la palabra reservada abstract. Una clase abstracta por lo general tiene uno o más métodos abstractos (los métodos static no pueden ser abstractos). Un método abstracto es un método con la palabra reservada abstract en su declaración.
public abstract class NombreDeClase {
public abstract tipo Método ();
…
}
Los métodos abstractos no proporcionan implementaciones. Una clase que contiene métodos abstractos debe declararse como clase abstracta. Cada subclase concreta de una clase abstracta debe proporcionar implementaciones concretas de los métodos abstractos de la superclase. Los constructores no se heredan, por los que no pueden declararse como abstractos. Aunque no podemos crear instancias de objetos de superclases abstractas, podemos utilizar superclases abstractas para crear variables que puedan guardar referencias de subclases concretas derivadas de la superclases. Ejemplo de polimorfismo Considere la siguiente jerarquía de clases:
Figura
Bidimensional Tridimensional
Circulo Cuadrado Triangulo Esfera Cubo Tetraedro
84
Comenzaremos con la superclase abstracta Figura, la cual declara la interfaz para la jerarquías (es decir, el conjunto de métodos que puede invocar un programa en todos los objetos Figura), observe también que en el diagrama de clases, el nombre de la clase abstracta Figura aparece en cursivas.
Métodos
regresaArea regresaVolumen regresaNombre toString
Figura 0.0 0.0 abstract Predeterminado
de Object
Punto 0.0 0.0 “Punto” [x,y]
Circulo r2 0.0 “Circulo” [x,y]; Radio = r
Cilindro 2 r h + 2 r2 r2 h “Cilindro” [x,y]; Radio = r;
Altura = h
La clase Figura proporciona los métodos regresaArea, regresaVolumen y regresaNombre, además como es una extensión de la clase Object, hereda los 11 métodos, entre ellos se encuentran toString, por lo que tendrá que ser redefinido. Implementación de BlueJ:
Figura
Punto
Circulo
Cilindro
85
86
87
Resultado de la ejecución:
Polimorfismo estático (sobrecarga) es aquél en el que los tipos a los que se aplica
el polimorfismo deben ser explicitados y declarados uno por uno antes de poder
ser utilizados.
Ejemplo: El siguiente programa declara una clase llamada Sobrecarga con cuatro
métodos llamados “despliega” que se encuentran sobrecargados. El primer método no
recibe parámetros, el segundo recibo solo un parámetro tipo int, el tercero recibo dos
parámetros tipo int y por último el cuarto método recibe dos parámetros tipo float. El
funcionamiento de cada método depende de los parámetros que reciba, desplegando en
pantalla el número de argumentos recibidos, los tipos y valores (con excepción del
método sin parámetros, el cual solo despliega en pantalla un mensaje).
88
El programa principal EjemploSobrecarga1 instancia un objeto llamado Sob1, posteriormente invoca a los métodos “despliega” enviando varios números y tipos de argumentos diferentes, incluso ningún.
El siguiente programa declara una clase principal llamada EjemploSobrecarga2, con
cuatro métodos llamados “Area” que se encuentran sobrecargados. El primer y segundo
método calcula el área de un cuadrado y reciben un argumento cada uno, el primer de
ellos recibe un tipo int y el segundo lo recibe tipo float. El tercer y cuarto método calcula
en área de un rectángulo, reciben dos argumentos, los parámetros del tercer método son
de tipo int y el cuarto método sus parámetros son de tipo float. Regresan un valor tipo long
(primer y tercer método) y un valor tipo double (el segundo y cuarto método). Además se
utiliza la clase DecimalFormat para formatear los datos de salida.
89
+ Area (int L): long+ Area (float l): double+ Area (int b, int a): long+ Area (float b, float a): double
EjemploSobrecarga2
90
IV.3. Representación gráfica del diseño
IV.4. Relación entre la programación orientada a objetos y la estructurada
Investigar este tema y entregarlo como producto de aprendizaje
91
Producto de Aprendizaje 4: Desarrolle los siguientes programas en Java (40 puntos)
1. Implemente el ejercicio de Figura/Punto/Circulo/Cilindro donde se puedan capturar
las variables de cada clase.
2. Elabore una clase principal que tenga 6 métodos sobrecargados llamado areaTriangulo, que realizaran el cálculo del área de un triangulo en base a lo siguiente:
Con un parámetro, se asume que es un triangulo Equilátero y el área se calcula:
Donde a es el lado del triangulo
Con dos parámetros, el área se calcula:
Donde b es la base y a es la altura del triangulo
Con tres parámetros, el área se calcula::
Donde a, b y c son los valores de las longitudes de los lados del triangulo y p se calcula así:
92
Los primeros 3 métodos sobrecargados recibirán datos tipo int y los restantes 3, datos tipo double. El valor de retorno de todos los métodos será double. Mande a imprimir a pantalla los resultados de todos los métodos.
3. Elabore una clase principal que tenga 6 métodos sobrecargados llamado areaCuadrilatero, que realizaran el cálculo del área de un cuadrilátero en base a lo siguiente:
Dos parámetros, área de un romboide y se calcula:
Donde b es la base y a es la altura del romboide
Tres parámetros, área de un trapezoide o cualquier cuadrilátero y se calcula así:
Donde y son las diagonales y es el ángulo que lo conforma (Ver figura).
O seis parámetros y se calcula así:
Siendo: ángulo comprendido entre los lados . ángulo comprendido entre los lados
93
Los primeros 3 métodos sobrecargados recibirán datos tipo long y los restantes, datos tipo double. El valor de retorno de todos los métodos será double. Mande a imprimir a pantalla los resultados de todos los métodos.
4. Investigar el tema IV.4 Relación entre la programación orientada a objetos y la
estructurada
94
V. Implementación Orientada a Objetos.
V.1. Estructura de una clase
V.2. Elementos de una clase
Nombre. Cada clase debe tener un nombre distintivo y único. Una clase se puede
representar solo con el nombre.
Atributos. Un atributo es una propiedad de una clase y se identifica por un nombre. La
clase puede tener cualquier número de atributos o carecer de estos.
Figura
Origen
Mover()Dibujar()Tamaño()
Nombre
Atributos
Operaciones
Figura
95
Operaciones. Una operación es la implementación de un servicio que puede ser
requerido para que muestre un comportamiento, en otras palabras, una
operación es una abstracción de algo que se puede hacer a un objeto. Al
igual que los atributos una clase puede tener cualquier número de
operaciones e incluso ninguna.
Organización de atributos y operaciones
Cuando se dibuja una clase, no hay por qué mostrar todos sus atributos y todas sus
operaciones, de hecho, en la mayoría de los casos solo se presentan los atributos y
operaciones más relevantes o importantes. Si se quiere decir que existen más de uno de
estos elementos se pueden poner puntos suspensivos (“…”).
Cliente
NombreDireccionTelefono
Fecha_Nac
Atributos
Rectángulo
Mover()Dibujar()Tamaño()
Operaciones
96
Declaración en Java:
Declaración de una clase en general Declaración de una clase principal
public class NombreDeLaClase {
Declaración de variables miembro de la clase
acceso tipo NombreDelMétodo1 (Lista de parámetros) {
Declaración de variables del método 1
Sentencias del método 1
[return tipo;]
}
acceso static tipo NombreDelMétodo2 (Lista de parámetros) {
Declaración de variables del método 2
Sentencias del método 2
[return tipo;]
}
}
public class NombreDeLaClase {
Declaración de variables miembro de la clase
public static tipo main (String[] args) {
Declaración de variables locales
Sentencias de la función main()
[return tipo;]
} acceso static tipo NombreDelMétodo1 (Lista de parámetros) {
Declaración de variables del método 1
Sentencias del método 1
[return tipo;]
}
acceso static tipo NombreDelMétodo2 (Lista de parámetros) {
Declaración de variables del método 2
Sentencias del método 2
[return tipo;]
}
V.3. Clase principal
En la programación orientada a objetos los componentes principales son las clases y los
objetos.
La clase principal es aquella que contiene el método principal llamado main.
Estructura de una clase principal en Java:
Auditor
Constructor yDestructorBuscar_inf()Confrontar()…
97
V.4. Crear objetos
Por medio del operador new se crean objetos en Java y la sintaxis en la siguiente:
Ejemplo:
1. La empresa Aceros Industrializados SA de CV requiere de un programa que
controle a sus Directivos (2), Empleados (5) y Obreros (10). Los Directivos tienen
las siguientes características: Nombre, Dirección, Edad, Teléfono, Puesto, Sueldo
Mensual y Metas, mientras que los Empleados tienen los atributos: Nombre,
Dirección, Edad, Teléfono, Puesto, Sueldo Mensual y Departamento y los Obreros
tiene las siguientes variables: Nombre, Dirección, Edad, Teléfono, Puesto, Sueldo
Semanal y Responsabilidades. Modele las clases y elabore un programa en Java
que las implemente, además cree un objeto de cada una, capturando los datos de
cada objeto.
2. La compañía Alextra paga a sus empleados en forma semanal. La compañía tiene
cuatro tipo de empleados: empleados Asalariados que reciben un salario fijo,
empleados por horas, que según las horas trabajadas recibirá su sueldo de la
siguiente forma: las primeras 40 horas se pagan a un precio y las excedentes se
pagan 1.5 veces el precio normal. Empleados por comisión, que su sueldo es el
10% de sus ventas y empleados asalariado por comisión, que recibe un salario
public class NombreDeLaClasePrincipal{ public static void main(String[] args){
instrucciones;…
}}
Cuerpo de la clase principalCuerpo de
main
1.clase identificador;identificador = new clase();
2.clase identificador = new clase();
98
base más el 6% de sus ventas. Cada empleado tiene Nombre, Domicilio, Teléfono
y Número de Seguro Social. Modele las clases y elabore un programa en Java que
las implemente, además cree un objeto de cada una, capturando los datos de
cada objeto.
Producto de Aprendizaje 5:
1. El Instituto tecnológico de Aguascalientes desea un programa que controle a sus
alumnos de Licenciatura, Maestría y Doctorado. Los alumnos de Licenciatura tiene
los Atributos: Nombre, Domicilio, Teléfono, Edad, Especialidad y Promedio,
mientras que los alumnos de Maestría tiene los siguientes variables miembro:
Nombre, Domicilio, Teléfono, Edad, Investigación Maestría y Fecha de entrega.
Los estudiantes de Doctorado tiene las siguientes variables: Nombre, Domicilio,
Teléfono, Edad, Proyecto de Doctorado y Monto de la Investigación. Modele las
clases y elabore un programa en Java que las implemente, además cree un objeto
de cada una, capturando los datos de cada objeto.
2. De las siguientes clases realice su modelado y cree un programa en Java
instanciando un objeto de cada clase capturando los datos para cada variable
miembro. Se desea representar un triangulo, el cual está definido por tres puntos,
cada uno de los cuales tiene dos coordenadas X, Y. El triangulo tiene además
color de línea y un color de relleno, un color por su parte está definido por tres
valores numéricos entre 0 y 255 (estándar RGB por Red-Green-Blue). El primer
valor numérico define la intensidad del rojo, el segundo el verde y el tercero el
azul. Además el triangulo tendrá las funciones de calcular el perímetro del
triangulo y calcular el área.
99
VI. Modularidad.
La modularidad es la capacidad que tiene un sistema de ser estudiado, visto o entendido como la unión de varias partes que interactúan entre sí y que trabajan para alcanzar un objetivo común, realizando cada una de ellas una tarea necesaria para el cumplimiento de dicho objetivo. Cada una de esas partes en que se encuentre dividido el sistema recibe el nombre de módulo. Idealmente un módulo debe poder cumplir las condiciones de caja negra, es decir, ser independiente del resto de los módulos y comunicarse con ellos (con todos o sólo con una parte) a través de unas entradas y salidas bien definidas. Las programación modular aplicada a la programación orientada a objetos se le denomina Modularidad a la propiedad que permite subdividir una aplicación en partes más pequeñas (llamadas módulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las restantes partes. En Java existen dos clases de módulos: las clases y los métodos. Para escribir un programa se tienen que combinar estos dos módulos. Los métodos (también llamados funciones o procedimientos en otros lenguajes de programación) son mini programas dentro de un programa. Por medio de los métodos se realizar tareas de un proyecto. Los métodos tienen las siguientes propiedades:
Un bloque de código que tiene un nombre,
Recibe unos parámetros o argumentos (opcionalmente),
Contiene sentencias o instrucciones para realizar algo (opcionalmente) y
Devuelve un valor (opcionalmente).
VI.1. Declaración de métodos
Un método es un conjunto de instrucciones a las que se les da un determinado nombre de tal manera que sea posible ejecutarlas en cualquier momento sin tenerlas que reescribir sino usando sólo su nombre. A estas instrucciones se les denomina cuerpo del método, y a su ejecución a través de su nombre se le denomina llamada al método. La ejecución de las instrucciones de un método puede producir como resultado un objeto de cualquier tipo. A este objeto se le llama valor de retorno del método y es completamente opcional, pudiéndose escribir métodos que no devuelvan ninguno. La ejecución de las instrucciones de un método puede depender del valor de unas variables especiales denominadas parámetros del método, de manera que en función del valor que se dé a estas variables en cada llamada la ejecución del método se pueda realizar de una u otra forma y podrá producir uno u otro valor de retorno.
100
Al conjunto formado por el nombre de un método y el número y tipo de sus parámetros se le conoce como firma del método. La firma de un método es lo que verdaderamente lo identifica, de modo que es posible definir en un mismo tipo varios métodos con idéntico nombre siempre y cuando tengan distintos parámetros. Cuando esto ocurre se dice que el método está sobrecargado.
VI.2. Métodos de clase
La sintaxis:
acceso static tipo NombreDelMétodo ([Lista de Argumentos]) {
Declaración de variables del método
Sentencias del método
[return tipo;]
Donde: acceso Cada método tiene asociado un tipo que se utiliza para controlar el
acceso al método. Entre estos se encuentran: public Este método público se puede llamar de cualquier código que
tenga acceso a la clase.
private Este método privado solo puede ser llamado desde otros métodos dentro de la clase en que se definió el método privado.
protected Este método protegido se puede llamar desde otros métodos de la clase en que el método está definido y por cualquier otro método de las clases que heredan de la clase en que está definido el método. También está disponible en cualquier objeto de las clases pertenecientes al mismo paquete en donde está definida la clase.
defecto Si no especifica ningún tipo de acceso, se utiliza el acceso por defecto, esto significa que el método es accesible a todas las clases contenidas en el mismo paquete, pero no está accesible fuera de ese paquete.
static Declara el método como método de la clase y no como método del objeto (no hereda el método).
101
Nota: Un método declarado como static solo puede ser llamado por otro método static y hacer referencia a variables static.
tipo Es el tipo de datos que regresara el método. Si se estipula un tipo de
dato void indica el método no regresa ningún valor (void indica ausencia de valor). Dentro del método para retornar el valor se utiliza la palabra reservada return y posteriormente el valor, si el tipo de dato del método se declara void no es necesario utilizar la sentencia return.
NombreDelMétodo Es el nombre que distingue al método y debe estar formado
por un identificador. Lista de Argumentos Son los valores que se pasarán al método para que realice
su tarea. Para cada argumento se tiene que declarar su tipo de dato. Por ejemplo, el siguiente método se llama suma2Numeros, recibe como argumento dos valores tipo long y regresa un valor long con la suma de los valores que recibe como parámetro.
public static long suma2Numeros( long a, long b ) {
return (a + b);
}
Llamadas a métodos (mensajes) Los objetos interactúan enviándose mensajes unos a otros. Tras la recepción de un mensaje el objeto actuará. La acción puede ser el envío de otros mensajes, el cambio de su estado, o la ejecución de cualquier otra tarea que se requiera que haga el objeto. Tipos de métodos Un método es una abstracción de una operación que puede hacer o realizarse con un objeto. Una clase puede declarar cualquier número de métodos que lleven a cabo operaciones de lo más variado con los objetos. Los métodos se clasifican en dos grupos: los métodos de instancia y los métodos de clase. Para acceder a las variables o métodos de clase se utiliza el operador punto (.). nombreClase.nombreVarClase; nombreClase.nombreMetodoClase();
102
VI.3. Métodos de instancia
Los métodos de instancia o variables de instancia, los adquieren los objetos al ser instanciados (creados). Para declarar un método de instancia se declara sin la palabra reservada static: acceso tipo nombreMetodoInstancia (Lista de Argumentos) {
103
Declaración de variables del método
Sentencias del método
[return tipo;]
Para acceder a las variables o métodos de instancia se utiliza el operador punto (.). Objeto.nombreVarInstancia; Objeto.nombreMetodoInstancia();
104
Forma de pasar argumentos. Los argumentos son los valores que se pasan al método para que realice un proceso o tarea y el método recibe estos argumentos en los parámetros designados (variables). En el paso de parámetros a funciones hay dos aproximaciones clásicas: el paso por valor y paso por referencia.
Por valor: En el paso por valor se realiza una copia de los valores que se pasan, trabajando dentro del método con la copia. Es por ello que cualquier cambio que sufran dentro, no repercute fuera del método.
Por referencia: En el paso por referencia no se realiza dicha copia, por lo que las modificaciones de dentro de los métodos afectan a los parámetros y esos cambios permanecen al final del método.
En Java el paso por parámetro es por valor, aunque los efectos son de paso por referencia cuando los argumentos son objetos. ¿Cómo sucede eso? Pues es muy fácil, si un método tiene como argumento un tipo primitivo (int, float, etc...), en Java se realiza una copia para la función y cualquier cambio a dicho argumento no afecta a la variable original. Este paso de parámetros en Java está orientado a utilizar el valor de la variable para otros cálculos. En el caso de los objetos es distinto. En realidad lo que sucede es que en Java siempre tenemos referencias a los objetos. Por eso al pasar a un método como argumento un objeto, pasamos la referencia al mismo, es decir, aunque se hace una copia para el paso por valor, como lo que se copia es una referencia, los cambios al objeto referenciado sí son visibles y afectan fuera de método. La única excepción es la clase String , cuyos objetos no son mutables. Cualquier modificación de un objeto String lleva aparejada la creación de una nueva
105
instancia del objeto. Si deseamos el mismo comportamiento para el paso de parámetros del resto de objetos, tenemos que recurrir al objeto StringBuffer. En el siguiente programa se declaran 2 variables, la primera es un arreglo de caracteres (char) y el segundo es un dato tipo int, dentro del método main se despliegan los datos antes de enviar las variables como parámetros al método Cambia. En el método Cambia, se modifica el arreglo en el subíndice 2 por el carácter ‘@’ y se multiplica el valor de la variable int por 4. Cuando termina de ejecutar el método Cambia se vuelven a desplegar las variables y se puede observar que el arreglo cambió en el subíndice 2 debido a que fue enviado como por referencia, sin embargo la variable tipo int no sufrió cambios, debido a que se mando por valor.
106
Devolver un valor desde un método. En Java es imprescindible que a la hora de la declaración de un método, se indique el tipo de dato que ha de devolver. Si no devuelve ningún valor, se indicará el tipo void como retorno. Los métodos pueden devolver una variable u objeto, bien sea por valor (se devuelve una copia), por puntero o por referencia. Java no soporta punteros, así que no puede devolver nada por puntero. Todos los tipos primitivos en Java se devuelven por valor y todos los objetos se devuelven por referencia. El retorno de la referencia a un objeto en Java es similar a devolver un puntero a un objeto situado en memoria dinámica en C++, excepto que la sintaxis es mucho más simple en Java, en donde el item que se devuelve es la dirección de la posición en memoria dinámica donde se encuentra almacenado el objeto. Para devolver un valor se utiliza la palabra clave return. La palabra clave return va seguida de una expresión que será evaluada para saber el valor de retorno. Esta expresión puede ser compleja o puede ser simplemente el nombre de un objeto, una variable de tipo primitivo o una constante.
107
Ejercicio 6.1: El siguiente programa lee un valor en grados Celsius y por medio de un método llamado convierteAFahrenheit convierte los grados Celsius a grados Fahrenheit.
108
Ejercicio 6.2: El siguiente programa lee una cantidad en metros y por medio de
los métodos conversionAPies y converionApulgadas cambia el valor en metros a
pies y a pulgadas (donde 1 metro = 39.37 pulgadas y 1 pie = 12 pulgadas)
109
Ejercicio 6.3: Una tonelada métrica equivale a 35,273.92 onzas. El siguiente
programa lee el peso de un paquete de cereal para el desayuno en onzas y
mediante el método calculaCajas determina cuantas cajas se pueden llenar con
una tonelada métrica de cereal.
110
Ejercicio 6.4: El siguiente programa lee tres calificaciones y mediante un método
estatusPromedio determina si el alumno esta “Aprobado” o “Reprobado”.
111
Ejercicio 6.5: El siguiente programa lee un número entero y mediante el método
NegativoCeroPositivo regrese “Positivo” si el número es positivo, “Negativo” si fue
negativo y “Cero” si fue cero.
Producto de Aprendizaje VI: Elabore los siguientes ejercicios utilizando
métodos de clase y métodos de instancia.
1. Escriba un programa que dado el total a pagar de la compra de X productos
y la cantidad de dinero entregada, calcule el vuelto que hay que dar al
cliente.
112
2. Escriba un programa que mediante un método determine si una cadena es
palíndromo (un palíndromo es una palabra que se lee igual en sentido
directo como inverso, por ejemplo radar).
3. Escriba un programa que lea dos enteros positivos n y b que llame a un
método cambiarBase para calcular y visualizar la representación del
número n en la base b.
4. Escriba un programa que mediante un método que tome como argumentos
las longitudes de los tres lados de un triangulo (a, b y c), devuelva el área
del triangulo.
2
))()((
cbapdonde
cpbpappArea
5. Una empresa de autobuses hace viajes desde la Capital del País hacia
ciudades del interior, para lo cual dispone de dos tipos de vehículos,
pequeños y grandes, con capacidad de 20 y 60 pasajeros respectivamente.
Cada vez que parte un autobús del terminal de la ciudad Capital es anotado
el tipo de vehículo (Pequeño (P) o Grande (G)) y el número de pasajeros
que transporta.
La empresa desea un reporte al final del día con la información siguiente:
Para cada viaje:
a. El tipo de autobús: b. La cantidad de pasajeros. c. El mensaje "Ganancia" si en el autobús viaja un número de pasajeros
igual o mayor que el 50% de su capacidad, y "Pérdida" en caso contrario.
6. Elabore un programa que lea dos números y mediante un método
determine si un numero divide al otro exactamente regresando true, en
caso contrario regrese false.
7. Escriba un programa que mediante un método determine si una cadena es
palíndromo (un palíndromo es una palabra que se lee igual en sentido
directo como inverso, por ejemplo radar).
113
8. Escriba un programa que lea dos enteros positivos n y b que llame a un
método cambiarBase para calcular y visualizar la representación del
número n en la base b.
9. Escriba un programa que tenga un método inverso que se le envíe un
argumento numérico y regrese su inverso, por ejemplo 1847, el inverso es
7481.
10. Escriba un programa que lea un valor x != 0 y por medio de método regrese
el valor de la siguiente expresión:
1
1435.1
5
x
ex
11. Escriba un programa que mediante un método que reciba dos argumentos x
y n devuelva el siguiente valor:
011
02
11
2
xsin
x
n
x
xsix
x
n
xx
nn
nn