Apuntes
UNIDAD 1
1
Programación Orientada a Objetos
Tabla de Contenidos
2.5 Operaciones......................................................................................................................................................................23
2.5.1 Precedencia de operadores .........................................................................................................................................25
2.5.2 Overflow ....................................................................................................................................................................25
2
Programación Orientada a Objetos
3
Programación Orientada a Objetos
Capítulo 1 Preliminares
Un algoritmo (del árabe al-Jwarizmi, matemático del siglo IX) es un conjunto finito de instrucciones o
pasos que sirven para ejecutar una tarea o resolver un problema.
El término algoritmo no está exclusivamente relacionado con la matemática, ciencias de la
computación o informática. En realidad, en la vida cotidiana empleamos algoritmos en multitud de
ocasiones para resolver diversos problemas. Algunos ejemplos son el uso de una lavadora (se siguen
las instrucciones), pero no la preparación de una comida (porque no están perfectamente definidos
los pasos) o el mismo lenguaje humano que "transforma" nuestros pensamientos en sonidos y hace
que otro humano nos pueda entender. También existen ejemplos de índole matemática, como el
algoritmo de la división para calcular el cociente de dos números, el algoritmo de Euclides para
calcular el máximo común divisor de dos enteros positivos, o incluso el método de Gauss para
resolver Sistema lineal de ecuaciones.
Wikipedia
http://es.wikipedia.org/wiki/Algoritmo
Un programa computacional es uno o más algoritmos escritos en un lenguaje que una máquina (un
computador) puede "entender" y llevar a cabo.
Una característica general de los programas computacionales es que su objetivo es siempre el
procesamiento de información. Por lo general, un programa tiene flujos de información de entrada y
flujos de información de salida (I/O : Input/Output). La información o datos puede entrar y salir del
programa de y hacia diversos medios y dispositivos: almacenamiento físico (discos), almacenamiento
lógico (memoria RAM), teclado, mouse, pantalla, impresora, scanner, micrófono, tarjetas capturadoras,
red, modem, etc.
4
Programación Orientada a Objetos
Resulta natural pensar en la necesidad de lenguajes que permitan trabajar con estas instrucciones de
manera más natural, es decir un lenguaje más cercano al lenguaje humano.
Con respecto al qué tan cercano es un lenguaje de programación al lenguaje de máquina existen:
Cualquier programa escrito en un lenguaje distinto al lenguaje de máquina debe traducirse a éste. Este
proceso es realizado por otro programa llamado traductor.
5
Programación Orientada a Objetos
El código fuente (source code), nuestro programa escrito en un lenguaje de alto nivel, es traducido a
código objeto (object code), que es como se denomina al programa en código de máquina.
De acuerdo al proceso de traducción, los lenguajes de programación pueden clasificarse en dos tipos:
Lenguajes compilados
Naturalmente, un programa que se escribe en un lenguaje de
alto nivel también tiene que traducirse a un código que pueda
utilizar la máquina. Los programas traductores que pueden
realizar esta operación se llaman compiladores. Éstos, como
los programas ensambladores avanzados, pueden generar
muchas líneas de código de máquina por cada proposición del
programa fuente. Se requiere una corrida de compilación
antes de procesar los datos de un problema.
Los compiladores son aquellos cuya función es traducir un
programa escrito en un determinado lenguaje a un idioma que
la computadora entienda (lenguaje máquina con código
binario).
Al usar un lenguaje compilado (como lo son los lenguajes del
popular Visual Studio de Microsoft), el programa desarrollado
nunca se ejecuta mientras haya errores, sino hasta que luego
de haber compilado el programa, ya no aparecen errores en el
código.
Lenguajes interpretados
Se puede también utilizar una alternativa diferente de los
compiladores para traducir lenguajes de alto nivel. En vez de
traducir el programa fuente y grabar en forma permanente el
código objeto que se produce durante la corrida de
compilación para utilizarlo en una corrida de producción
futura, el programador sólo carga el programa fuente en la
computadora junto con los datos que se van a procesar. A
continuación, un programa intérprete, almacenado en el
sistema operativo del disco, o incluido de manera permanente
6
Programación Orientada a Objetos
7
Programación Orientada a Objetos
no sólo es sensible a la máquina física, si no que también al ambiente de software que define el sistema
operativo. A la combinación entre arquitectura física y sistema operativo se denomina Plataforma.
En la práctica, no sólo es necesario compilar un programa con tantos compiladores como plataforma
queremos que soporte, si no también, lo más seguro es que parte del código fuente deba ser modificado.
Este problema no es trivial, y dificulta y encarece el desarrollo de software.
S.O. Windows S.O. Unix S.O. Linux S.O. Unix MAC OSX
JAVA soluciona el problema haciéndose multiplataforma. La clave es poner una capa intermedia, la
máquina virtual, que sí es dependiente de la plataforma y que actúa como otra plataforma. De esta
manera, un programa JAVA se ejecuta siempre sobre la misma máquina virtual o plataforma JAVA.
Es evidente que existirán tantas versiones de la máquina virtual como plataformas de hardware-
software existan.
8
Programación Orientada a Objetos
"Un lenguaje simple. Orientado al objeto, distribuido, interpretado, sólido, seguro, de arquitectura
neutral, portable, de lato desempeño, de multihilos y dinámico"
1. Simple
Basado en el lenguaje C++ pero donde se eliminan muchas de las características OOP que se
utilizan esporádicamente y que creaban frecuentes problemas a los programadores. Esta
eliminación de causas de error y problemas de mantenimiento facilita y reduce el coste del
desarrollo de software.
• Java no da soporte a struct, union y pointer
• Java no ofrece typedef ni #define
• No permite la sobrecarga de operadores.
• No ofrece herencia múltiple.
• Maneja los comandos en línea de diferente manera que C++
• Java tienen una clase String, que permite un mejor manejo que los arrays de terminación
nula del C y C++.
• Java tiene un sistema automático de asignación y liberación de memoria (recolector de
basura) que mejora mucho los sistemas del C++
2. Orientado al objeto
Java da buen soporte a las técnicas de desarrollo OOP y en resumen a la reutilización de
componentes de software.
3. Distribuido
Java se ha diseñado para trabajar en ambiente de redes y contienen una gran biblioteca de
clases para la utilización del protocolo TCP/IP, incluyendo HTTP y FTP. El código Java se puede
manipular a través de recursos URL con la misma facilidad que C y C++ utilizan recursos locales
(archivos).
4. Interpretado
El compilador Java traduce cada fichero fuente de clases a código de bytes (Bytecode), que
puede ser interpretado por todas las máquinas que den soporte a un visualizador de que funcione
con Java. Este Bytecode no es especifico de una máquina determinada, por lo que no se compila y
enlaza como en el ciclo clásico, sino que se interpreta.
5. Sólido
El código Java no se quiebra fácilmente ante errores de programación. Así el relaje que existe
en la declaración y manejo de tipos en C y C++ se torna en restricciones en Java, donde no es
posible la conversión forzada (cast) de enteros en punteros y no ofrece soporte a los punteros que
permitan saltarse reglas de manejo de tipos. Así en Java no es posible escribir en áreas arbitrarias
9
Programación Orientada a Objetos
http://www.infor.uva.es/~jmrr/TAD2003/Sesiones/TADONJava/JAVA.html
En Diciembre de 1990, Patrick Naughton, un empleado de la empresa Sun, reclutó a sus colegas James
Gosling y Mike Sheridan para trabajar sobre un nuevo tema conocido como "El proyecto verde". Este
a su vez estaba auspiciado por la compañía "Sun founder Bill Joy" y tenía como objetivo principal
crear un lenguaje de programación accesible, fácil de aprender y de usar, que fuera universal, y que
estuviera basado en un ambiente C++ ya que había mucha frustración por la complejidad y las
10
Programación Orientada a Objetos
11
Programación Orientada a Objetos
12
Programación Orientada a Objetos
1.7.1 Introducción
La Programación Orientada a Objetos (POO u OOP según siglas en inglés) es un paradigma de
programación que define los programas en términos de "clases de objetos", objetos que son entidades
que combinan estado (es decir, datos), comportamiento (esto es, procedimientos o métodos) e
identidad (propiedad del objeto que lo diferencia del resto). La programación orientada a objetos
expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas.
Esto permite hacer los programas y módulos más fáciles de escribir, mantener y reutilizar.
De esta forma, un objeto contiene toda la información, (los denominados atributos) que permite
definirlo e identificarlo frente a otros objetos pertenecientes a otras clases (e incluso entre objetos de
una misma clase, al poder tener valores bien diferenciados en sus atributos). A su vez, dispone de
mecanismos de interacción (los llamados métodos) que favorecen la comunicación entre objetos (de
una misma clase o de distintas), y en consecuencia, el cambio de estado en los propios objetos. Esta
característica lleva a tratarlos como unidades indivisibles, en las que no se separan (ni deben
separarse) información (datos) y procesamiento (métodos).
Dada esta propiedad de conjunto de una clase de objetos, que al contar con una serie de atributos
definitorios, requiere de unos métodos para poder tratarlos (lo que hace que ambos conceptos están
íntimamente entrelazados), el programador debe pensar indistintamente en ambos términos, ya que no
debe nunca separar o dar mayor importancia a los atributos en favor de los métodos, ni viceversa.
Hacerlo puede llevar al programador a seguir el hábito erróneo de crear clases contenedoras de
información por un lado y clases con métodos que manejen esa información por otro (llegando a una
programación estructurada camuflada en un lenguaje de programación orientado a objetos).
Esto difiere de la programación estructurada tradicional, en la que los datos y los procedimientos están
separados y sin relación, ya que lo único que se busca es el procesamiento de unos datos de entrada
para obtener otros de salida. La programación estructurada anima al programador a pensar sobre todo
en términos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos
procedimientos manejan. En la programación estructurada se escriben funciones y después les pasan
datos. Los programadores que emplean lenguajes orientados a objetos definen objetos con datos y
métodos y después envían mensajes a los objetos diciendo que realicen esos métodos en sí mismos.
1.7.2 Origen
Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje
diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de
Cómputo Noruego en Oslo. Según se informa, la historia es que trabajaban en simulaciones de naves,
y fueron confundidos por la explosión combinatoria de cómo las diversas cualidades de diversas naves
podían afectar unas a las otras. La idea ocurrió para agrupar los diversos tipos de naves en diversas
clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y
comportamiento. Fueron refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox
PARC (y cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema
completamente dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de
tener un sistema basado en programas estáticos.
La programación orientada a objetos tomó posición como el estilo de programación dominante a
mediados de los años ochenta, en gran parte debido a la influencia de C++ , una extensión del lenguaje
de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de
usuario, para los cuales la programación orientada a objetos está particularmente bien adaptada. En
13
Programación Orientada a Objetos
14
Programación Orientada a Objetos
15
Programación Orientada a Objetos
http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos
16
Programación Orientada a Objetos
Para probar nuestro programa debemos primero escribirlo en una archivo de texto con el nombre
Bienvenido.java, y luego compilarlo y ejecutarlo.
Tener cuidado de:
- El nombre del archivo debe ser idéntico al del programa, el cual es definido en la línea 6
public class Bienvenido. En este caso el nombre del programa es Bienvenido, pero
podría ser cualquiera. Un programa definido como public class Hola, debe escribirse en
un archivo Hola.java.
- En JAVA, las letras minúsculas y mayúsculas son diferentes. JAVA es “case-sensitive”.
- En ambientes Windows, el sistema puede estar configurado para “Ocultar extensiones para
tipos de archivos conocidos”. Si esto está activado, debemos cuidar que el archivo creado sea
efectivamente Bienvenido.java y no Bienvenido.java.txt.
2.1.1 Comentarios
Un comentario es un texto dentro del programa para que el compilador ignora al encontrar cierto tipo
de marcas. Los comentarios son usados especialmente para explicar el programa “insitu”. En JAVA
pueden definirse comentarios usando “//”, lo cual marca como comentado (“comenta”) todo el texto
hacia la derecha hasta el fin de línea, o usando los delimitadores “/*” y “*/”, lo que comenta todo el
texto que esté entre ellos.
Notar como usando comentarios hemos explicado cada parte del programa.
17
Programación Orientada a Objetos
En general, las entradas y salidas de información son denominadas flujos, y pueden comunicar el
programa no sólo con la pantalla, sino que también, con otros medios o dispositivos: archivos
(almacenamiento), sonido, etc.
Los métodos (o funcionalidades) siempre llevan paréntesis. Probar invocar el método de la siguiente
manera
System.out.println;
El siguiente programa introduce la utilización de una variable. La variable String vtexto reserva
una localización de memoria donde el texto “Este es un texto cualquiera” es almacenado
(la variable se ha bautizado vtexto pensando en que es una variable de texto). Notar la diferencia
entre las líneas 9 y 10.
18
Programación Orientada a Objetos
La forma en que el programa funciona es modular. La tarea de desplegar el cuadro de diálogo (dibujarlo
y mostrarlo) es responsabilidad del método showMessageDialog() de la clase JOptionPane. La siguiente
figura muestra la relación entre nuestro programa y otras clases y objetos.
main() crear
String vtexto pasa
como
parámetro
invocar
JOptionPane showMessageDialog()
19
Programación Orientada a Objetos
Analicemos el programa:
- Línea 8: el método “arroja hacia fuera” los posibles errores de entrada salida (IOException).
JAVA posee un excelente mecanismo de manejo y control de errores, los cuales se denominan
excepciones. En este caso, la lectura de datos desde el teclado “puede” generar errores. Para
simplificar, obviamos el manejo de errores incluyendo la instrucción throws IOException
en el encabezado del método main().
- Línea 9: se crea el objeto stdin (el nombre podría ser cualquiera, lo hemos llamado asi por
Standar Input) de la clase BufferedReader. Esta clase define mecanismos de lectura de
información sobre flujos de entrada (InputStreamReader). System.in indica que se
utilizará la entrada estándar (la entrada podría ser otra, distinta del teclado: mouse, micrófono,
conexión a red, eventos de pantalla, etc.).
- Línea 11: usando el método readLine() del objeto stdin, el programa queda a la espera de
que el usuario presione la tecla enter. Todo lo que el usuario escribió en la pantalla antes de
presionar enter queda almacenado en la variable vnombre.
- Línea 12: Se ha utilizado el operador “+” entre textos. En este caso, el operador produce la
concatenación de los textos a su izquierda y derecha. El resultado de la concatenación es
almacenado en la variable vsaludo.
El siguiente ejemplo muestra la utilización de otro método de la clase JOptionPane para recibir la
información. Esto tiene varias ventajas: a) es más presentable y cómodo para el usuario, b) facilita la
programación, es más sencillo, y c) resuelve el problema de codificación de caracteres para mostrar
acentos y ‘ñ’s (probar imprimir acentos o ‘ñ’s con el métodos System.out.println()).
20
Programación Orientada a Objetos
Notar que:
- showInputDialog() muestra un cuadro de dialogo con una caja de texto.
- Hemos obviado crear la variable vsaludo y hemos concatenado el texto “Hola “ y la
variable vnombre inmediatamente al invocar el método showMessageDialog().
- La instrucción System.exit(0) termina el programa. En este caso, el programa termina
apenas el usuario cierra el cuadro de diálogo.
21
Programación Orientada a Objetos
Los tipos de datos primitivos se distinguen de los tipos definidos por el usuario a partir de Clases. La
creación de objetos de una Clase es análoga a la declaración de variables de un tipo de dato.
22
Programación Orientada a Objetos
En JAVA existe la clase String que permite crear y manipular cadenas de caracteres como objetos.
Sin embargo, la implementación de la clase String es especial y permite tratar objetos String casi
como variables de tipo primitivo.
Almacenamiento de una cadena
String saludo = "Hola!, este es un texto cualquiera";
H o l a ! , e s t e e s u n t e x t o c u a l q u i e r a
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
Una de las acciones básicas para procesar cadenas es recorrer un String. El siguiente programa muestra
como "recorrer" una cadena.
2.5 Operaciones
Para cada tipo de datos existen operaciones distintas. Las operaciones aritméticas básicas (suma, resta,
multiplicación y división) se aplican a tipos numéricos. Considerar que la división (/) es entera si los
operandos son ambos números enteros, y es con decimales si alguno de los operandos en float o
double. Las operaciones con cadenas de caracteres y caracteres
23
Programación Orientada a Objetos
Generalmente, el resultado de una operación es del tipo más genérico de los operandos. La suma entre
un int y un double dará como resultado un double. La concatenación de un String y un char devolverá
un String.
Las operaciones ==, <, >, etc., son llamadas operaciones de comparación y devuelven un valor
boolean (true o false).
El siguiente programa ayuda a comprender las operaciones con números y cadenas. Pruébelo
ingresando números enteros positivos y negativos.
24
Programación Orientada a Objetos
2.5.2 Overflow
Si tratamos de asignar un valor numérico a una variable cuyo tipo de datos no alcanza para representar
tal magnitud ocurre overflow. No podemos asignar el número 800 a una variable de tipo byte (que sólo
permite números en el rango -128 a 127) sin incurrir en un error. Para la mayoría de los casos, el
compilador de JAVA es suficiente para detectar posibles problemas y detener la compilación. Sin
embargo el overflow puede ocurrir fácilmente en operaciones como lo que se muestra a continuación:
En este caso, esperaríamos que el programa imprima 1000. Sin embargo imprime 5!!!
La explicación es overflow: a pesar que el tipo long permite almacenar el resultado de la operación
24 * 60 * 60 * 1000 * 1000
las multiplicaciones se realizan almacenando los susesivos resultados temporalmene en variables int.
Esto ocurre ya que, a menos que especifiquemos lo contrario, las operaciones con números enteros se
realizan como operaciones int y no long.
La solución es sencilla y consiste en incluir al lado derecho de la asignación, un número de tipo long.
Con esto, forzamos a que la operación se realice por completo con este tipo de datos (notar que la letra
L como sufijo del primer número, lo convierte a long):
25
Programación Orientada a Objetos
En el caso de operar números con cadenas, la operación posible es la concatenación donde los números
son automáticamente convertidos a su representación como cadenas de caracteres.
String hola = "Hola!";
String nombre = "Bart Simpson";
int edad = 10;
String saludo = hola + " Soy " + nombre + " y mi edad es " + edad + " años.";
El siguiente ejemplo muestra un programa que pide el nombre y la edad al usuario y muestra un
mensaje dependiendo del dato edad.
26
Programación Orientada a Objetos
Se realiza una conversión en la línea 12. El texto ingresado por el usuario y almacenado en la variable
vedad es convertido en un int. Este programa no verifica que lo que el usaurio ha ingresado sean sólo
dígitos, y en el caso que no lo hiciera, la conversión arrojará una excepción.
Al igual que en una Clase o un método, los símbolos "{" y "}" delimitan bloques de ejecución. Los
delimitadores de bloque pueden obviarse si el bloque sólo contiene una instrucción (no olvidar el punto
y coma luego de la instrucción).
27
Programación Orientada a Objetos
Considerar que en JAVA la indentación no tiene significado semántico. ¿Qué imprime este programa?
Pudiera parecer que el bloque else acompaña a la primera cláusula if. Sin embargo el programa no
imprime nada, ¿puedes explicarlo?
28
Programación Orientada a Objetos
Recomendación: indente adecuadamente sus programas. Cuide que los bloques dentro de otros
bloques tengan una sangría. Por ejemplo, el mismo programa anterior es presentado si identación. La
funcionalidad del programa es la misma, funciona igual, pero es difícil de entender:
29
Programación Orientada a Objetos
Solución 1:
Un número impar es un número que dividido por 2 da resto 1. Usando el operador de módulo '
%'
resolvemos esto fácilmente. El siguiente programa implementa este algoritmo.
¿Funciona bien? Pruebe con número negativos, por ejemplo el -5. ¿Qué ocurre? El programa se
comporta bien para todos los enteros positivos, en efecto si el resto de la división es 1, el núemro es
impar. Sin embargo, el resto de la división de un número impar negativo por 2 es -1!!!!
Solución 2:
El problema puede corregirse cambiando la comparación e invirtiendo los mensajes.
30
Programación Orientada a Objetos
2.8.2 Factor
Constuya un programa que verifique si unnúmero es factor de otro. El programa debe pedir al usuario
los números.
Solución 1:
El programa es similar al anterior mostrado y utiliza el operador '
%'para calcular el residuo de la
división de los números. Luego compara el residuo con 0.
¿Qué ocurre si ingresamos por segundo número un 0? Corrija el programa para que verifique esta
situación.
Solución 2:
Antes de preguntar por el resto de num1 dividido en num2, verificamos que num2 sea distinto de 0.
31
Programación Orientada a Objetos
Solución:
Usaremos JOptionPane.showInputDialog para pedir el valor de la temperatura y lo almacenaremos en
una variable (strtemp). Luego obtenemos el primer caracter de la cadena usando el método charAt de la
clase String. Para obtener la temperatura utilizamos el método substring que nos permite extraer una
porción de la cadena.
Modificaciones propuestas:
- Modifique el programa para que verifique rangos reales para la temperatura de entrada.
- Incluya un mensaje si la primera letra de lo ingresado no es '
C','
K'o '
F'.
- Modifique el programa para que permita ingresar las temperaturas anteponiendo '
c','
k'o '
f'
.
32
Programación Orientada a Objetos
2.9 Ejercicios
1. Especifique el tipo de datos que utilizaría para la siguiente información
a. La velocidad de la luz (m/s).
b. Nombres y apellidos
c. Separador decimal
d. Edad
e. Teléfonos
f. Estado civil (casado(a) / soltero(a))
g. RUTs
h. La calificación o nota en una prueba
i. Tasa de interés anual
j. Bits por segundos de una conexión por modems
k. Datos hexadecimales
l. Datos binarios
m. Poblaciones humanas
n. Posición de un pixel en una pantalla
o. Índice de la posición de un caracter en una cadena
p. Sexo femenino o masculino.
2. Indique los errores que existen en los siguienets trozos de código:
String nombre = "Fulano";
char ultimaletra = nombre.charAt(nombre.length());
short a = -12315;
int b = a*2;
short c = a*3;
int numero = 0.12*9.8;
byte misbits;
byte misbits = 200;
short n1 = -5;
int res = 9 + (n1 < 0)*2 + "10";
33
Programación Orientada a Objetos
6. Construya un programa que lea tres números enteros y que los reste si el primero es mayor que
el segundo, los multiplique si el primero es menor que el segundo y los sume si son iguales.
7. En un almacén se hace un 12% de descuento a los clientes cuya compra supere los $10000
¿Cuál será la cantidad que pagará una persona por su compra? Construya un programa que lea
el monto de la compra y calcule el precio final.
b. Si trabaja más de 40 horas se le paga $1600 por cada una de las primeras 40 horas y
$2000 por cada hora extra.
Construya un programa que lea las horas trabajadas e imprima en consola el salario semanal.
9. Una serie de impuestos específicos se aplican sobre el valor de un artículo. Al valor bruto se
descuentan un 10% del impuesto A y 5,5% del impuesto B. Al valor que queda se le aplica un
impuesto del 11,4%. Construya un programa que reciba el valor bruto y devuelva el valor neto
final.
34
Programación Orientada a Objetos
Por lo general, en un programa las instrucciones se ejecutan una después de otra en el orden en que
están escritas. Este proceso se conoce como ejecución secuencial. Varias instrucciones en Java
permiten al programador especificar que la siguiente instrucción a ejecutarse tal vez no sea la siguiente
en la secuencia. Esto se conoce como transferencia de control.
Durante la década del sesenta, se hizo evidente que el uso indiscriminado de las transferencia de
control era el origen de muchas de las dificultades que experimentan los grupos de desarrollo de
software. A quien se señaló como culpable fue a la instrucción goto (utilizada en varios lenguajes de
programación, incluyendo C y Basic), la cual permite al programador especificar la transferencia de
control a uno de los muchos posibles destinos dentro del programa. La noción de la llamada
programación estructurada se hizo casi sinónimo de la "eliminación del goto".
Las investigaciones de Bohn y Jacopini* demostraron que los programas podían escribirse sin las
instrucciones goto. El reto de la época para los programadores fue cambiar sus estilos a una
"programación sin goto". No fue hasta la década de los setenta que los programadores tomaron en
serio la programación estructurada. Los resultados fueron impresionantes, a medida que los grupos de
desarrollo de software reportaron reducciones en los tiempos de desarrollo, mayor incidencia de las
entregas de sistemas a tiempo y más proyectos de software finalizados sin salirse del presupuesto. La
calve de estos logros fue que los programas estructurados eran más claros, más fáciles de depurar y
modificar, y había más probabilidad de que estuvieran libres de errores desde el principio.
El trabajo de Bohm y Jacopini demostró que todos los programas podían escribirse en términos de tres
estructuras de control solamente: la estructura secuencial, la estructura de selección y la estructura de
repetición.
Texto tomado de Java Como Programar 5ta Edición, Deitel.
Páginas 105 y 106 (4.4 Estructuras de Control)
* Bohm, C. y G. Jacopini, "Flow Diagrams, Turing Machines and Languajes with Only Two Formation Rules",
Communications of the ACM, Vol. 9, No. 5, Mayo de 1996, páginas 336,371.
35
Programación Orientada a Objetos
36
Programación Orientada a Objetos
Inicio
Inicializar variable NUM en 1
Repetir mientras NUM sea menor o igual a 12
mostrar (NUM * 8)
incrementar NUM en uno
fin
Consideramos que todas las líneas que están indentadas a la derecha bajo la línea Repetir… son el
bloque que se repite mientras se cumple la condición.
37
Programación Orientada a Objetos
En JAVA
Averiguar:
Existe una variación de la estructura while, el do/while. Investigar cómo utilizar y en qué casos
conviene.
Veamos otro ejemplo: en el capítulo anterior vimos como recorrer una cadena. Recordando, una
cadena, una variable de tipo String es una secuencia ordenada de caracteres. Cada carácter ocupa una
38
Programación Orientada a Objetos
posición del String y por lo tanto podemos recorrer una cadena accediendo a los caracteres desde la
primera hasta la última posición:
Por cada posición, P, desde la primera hasta la última
mostrar el carácter en la posición P
Tomando en cuenta que la primera posición es siempre 0 y la última es un número antes del largo de la
cadena (la cantidad de caracteres), el algoritmo quedaría:
Por cada posición, P, desde 0 hasta (largo cadena - 1)
mostrar el carácter en la posición P
Para implementar este algoritmo deberá haber una variable que mantenga la posición actual de la
cadena y que en cada vuelta se incremente. Esta variable será el contador que controle el bucle. En
JAVA existe una estructura conocida como for que facilita la definición de bucles controlados por
contador. El siguiente programa recorre una cadena ingresada por el usuario usando esta estructura de
control:
Notar como el bucle continua mientras el contador (i) es menor que el largo de la cadena. El largo de
la cadena no lo sabemos a priori, pues es ingresada en tiempo de ejecución por el usuario. Notar
además que la instrucción para definir la variable contadora y para incrementarla al final de cada vuelta
están incluidas en la misma línea de la instrucción de la estructura for.
La estructura for contiene 3 instrucciones: inicialización del contador (A), condición de repetición (B) e
incremento del contador (C).
39
Programación Orientada a Objetos
Importante: este programa no tiene condición definida por lo que seguirá en forma infinita. Para
detener la ejecución en ambientes Windows es necesario cerrar la ventana de ejecución.
40
Programación Orientada a Objetos
En JAVA:
En este programa existe un contador de repeticiones, sin embargo, el bucle es controlado por la variable
adivinado. Este tipo de variable es conocido como flag, dummy variable o centinela y pueden ser de
cualquier tipo. En este caso utilizamos una variable de tipo boolean.
Completemos un poco el programa para que el bucle pare también si el usuario ingresa un 0. El
programa debe dar los mensajes pertinentes:
41
Programación Orientada a Objetos
En este caso existen dos centinelas, la variable adivinado y el valor ingresado. Tener especial cuidado
que el valor para el centinela no pueda ser confundido con un valor permitido y real del programa. Por
ejemplo, si queremos que el bucle pare si se ingresa el 0, entonces el número secreto no puede ser 0.
Ejercicio:
4.8 , 4.9 y 4.10 del libro Java Como Programar 5ta Edición, Deitel.
Los ejemplos muestran una técnica para desarrollar algoritmos llamada mejoramiento de
arriba a bajo (enfoque top-down).
3.4.1 Factorial
Escribir un programa que pida un número entero positivo al usuario y muestre el factorial.
Solución:
42
Programación Orientada a Objetos
Primero hacemos que el programa pida un número al usuario. Luego en un ciclo for, recorremos todos
los números desde el número ingresado hsta 1 y vamos acumulando la multiplicación. Notar como se
utiliza un incremento negativo.
¿Que ocurre si ingresamos el 18? En este caso queda claro que ha ocurrido overflow ya que arroja un
número negativo. Pero tengamos cuidado, ¿Cuál es el mayor número entero positivo del cual podemos
calcular el factorial usando variables de tipo int? Sabemos que el máximo entero representable con int
es 2.147.483.647 y al ingresar el 12 obtenemos 479.001.600. Por lo tanto el factorial del número 13 ya
sobrepasa el máximo entero. Modifique el programa para que utilice long para almacenar el factorial.
43
Programación Orientada a Objetos
44
Programación Orientada a Objetos
45
Programación Orientada a Objetos
Notar como el ciclo for para verificar si el número es primo o no está dentro de otro ciclo (While). Esto
se conoce como anidación de ciclos: el ciclo for está anidado dentro del ciclo while. Otra vez es
importantísimo mantener orden e indentación del código fuente.
46
Programación Orientada a Objetos
Es obvio que el programa resulta innecesariamente complejo. Para facilitarlo, usaremos una estructura
conocida como switch/case:
47
Programación Orientada a Objetos
Observar la instrucción especial break. ¿Qué sucede con el programa si quitamos esta instrucción? La
estructura switch/case funciona de manera que cuando uno de los valores coincide, se realizan
todos los bloques siguientes, a menos que se incluya break.
El caso por defecto (default) es opcional.
El diagrama de actividad para el ejemplo de los meses:
49
Programación Orientada a Objetos
50
Programación Orientada a Objetos
3.7 Ejercicios
1) Escriba en pseudo código y construya el diagrama de actividad del segundo programa del
ejemplo desarrollado 3.4.4.
2) Escriba un programa que muestre las tablas de multiplicar de los números 6, 7, 8 y 9 entre 5 y
12. Considere utilizar ciclos anidados. Desarróllelo primero en pseudo código y dibuje el
diagrama de actividad.
3) Modifique el programa Secreto2 (de las sección 3.3.2) para que muestre "Felicitaciones, Ud. ha
adivinado en el primer intento" en caso que se de esa situación. Dibuje el diagrama de
actividad.
4) Construya un programa que muestre una cadena ingresada por el usuario de la siguiente forma:
en la primera línea muestre sólo el primer carácter de la cadena, en la segunda línea muestre los
dos primeros caracteres de la cadena, ... y así hasta escribir la cadena completa. Por ejemplo, si
la cadena es "Hola a Todos", debe mostrar
H
Ho
Hol
Hola
Hola
Hola a
Hola a
Hola a T
Hola a To
Hola a Tod
Hola a Todo
Hola a Todos
5) Construya un programa que pida al usuario dos enteros positivos y busque el mínimo común
múltiplo entre ellos.
6) Construya un programa que pida al usuario dos enteros positivos y busque el máximo común
divisor entre ellos.
51
Programación Orientada a Objetos
4.1 Módulos
A medida que los programas crecen en complejidad y tamaño se hace necesario implementarlos por
partes. Esto significa dividir el trabajo en módulos que podamos codificar de manera relativamente
independiente. De esta forma el flujo del programa pasa de un módulo a otro.
Veamos un ejemplo: se quiere implementar un programa que imprima los primeros 10 números primos.
En pseudo código:
1. Inicializar contador_primos en 0
2. Inicializar N en 2
3. Mientras contador_primos sea menor o igual a 10 hacer
a. Inicializar una variable boolean esprimo en verdadero.
b. Poner un ciclo for que parta contador en 2 y repita mientras el contador
sea menor que N.
i. En cada paso, calcular el resto de la división de N por el contador
del ciclo. Si el resto es cero, cambiar esprimo a falso.
c. Si esprimo es verdadero
i. imprimir N
ii. incrementar contador_primos en uno
Notar como el algoritmo para reconocer que un número es primo queda anidado dentro de otro ciclo.
Ahora, si tuvieramos un módulo para verificar que un número es primo, digamos esPrimo(N), el
programa se vuelve más sencillo:
1. Inicializar contador_primos en 0
2. Inicializar N en 2
3. Mientras contador_primos sea menor o igual a 10 hacer
a. Si esPrimo(N) es verdadero
i. imprimir el número
ii. incrementar contador en uno
52
Programación Orientada a Objetos
estamos "importando" a nuestra clase la clase JOptionPane que está en el paquete swing, que a su vez
está en el paquete javax.
Nuestra clase, llamada Primos, tiene dos métodos: main y esPrimo. El método main es el
programa principal: cualquier clase que tenga un método main podrá ser ejecutada como un programa.
En realidad, cuando ejecutamos un programa JAVA previamente compilado, el intérprete busca un
53
Programación Orientada a Objetos
método main; si no existe arroja un error. El método esPrimo sólo se ejecutará si se invoca dentro
del método main, o dentro de otro método quesea invocado por el método main.
Analizando el método esPrimo podemos observar que para realizar su tarea requiere un número, del
cual verificará su condición de número primo, y como resultado del proceso contestará verdadero o
falso. En general, a un método ingresa información (materia prima de entrada) y sale información
resultado del proceso:
El método esPrimo tiene como entrada un número entero (int) y devuelve un valor boolean
(true, false).
En general un método podemos verlo de la siguiente manera:
Es evidente que un diagrama como el anterior que representa un método o función se parece a la figura
de un programa como procesamiento de información (Capítulo 1): un método es un subprograma o
subrutina y tiene prácticamente las mismas características que un programa completo.
A saber:
• La primera línea se denomina declaración del método e indica todo lo necesario para utilizar el
método.
54
Programación Orientada a Objetos
• La palabra reservada public indica que el método es de acceso público. Esto significa que
eventualmente podría ser utilizado desde otros programas.
• La palabra reservada static indica que el método está definido dentro del contexto estático de
ejecución, y no se ejecutará desde el contexto de un objeto (veremos estos conceptos con detalle
más adelante).
• El tipo de salida del método puede ser de cualquier tipo primitivo (int, char, byte, boolean, long,
double, etc.) o de algún tipo definido como una Clase (por ejemplo String). Si deseamos escribir
un método que no tenga datos de salida, especificamos void como tipo.
• La lista de parámetros es una lista de identificadores con sus tipos asociados separados por
coma. Si un método no tiene parámetros de entrada se especifica con la lista vacía (pero se
mantienen los paréntesis).
• El flujo del método debe llevar siempre a una instrucción return, la cual genera la salida del
método. El valor que "retorna" o devuelve debe coincidir en tipo con el tipo de salida definido
en la primera línea del método (declaración del método).
Por ahora crearemos métodos en el contexto estático de ejecución (el programa principal) y los
declararemos públicos. Más adelante, cuando nos sumerjamos en los temas de la orientación a objeto
descubriremos que significan estas características. Además, por ahora sólo utilizaremos valores de
salido y parámetros de entrada de tipos primitivos y String.
Observación:
Por convención los nombres de los métodos se escriben con minúsculas excepto las primeras letras de
las siguientes palabras que componen el nombre. Por ejemplo: sumar, sumarEnteros,
calcularPromedioPonderado, etc.
Los nombres de las clases son con minúsculas excepto las primeras letras de todas las palabras que
componen el nombre. Ejemplo: Automovil, NumeroComplejo, String, JOptionPane, etc.
55
Programación Orientada a Objetos
La clase EntradaSalida
56
Programación Orientada a Objetos
57
Programación Orientada a Objetos
El método pedirBinario pide una cadena al usuario hasta que éste ingresa una de largo 8 y compuesta
sólo por caracteres 1s y/o 0s.
58
Programación Orientada a Objetos
4.4.3 Palíndromo
Un palíndromo es una frase que dice exactamente lo mismo si se lee de izquierda a derecha y de
derecha a izquierda. Eso si, obviando la posición de los espacios en blanco, caracteres especiales
distintos de letras y la diferencia entre mayúsculas, minúsculas y letras acentuadas.
Algunos palíndromos:
Yo soy
Somos o no somos
Anita lava la tina
Adán no cede con Eva, y Yavé no cede con nada
Sé verla alrevés
Yo dono rosas, oro no doy
¿Acaso hubo búhos acá?
Dábale arroz a la zorra el abad.
Se desea construir un programa que verifique si un texto ingresado por el usuario es o no palíndromo.
Solución:
Creamos entonces la clase Palindromo con los métodos indicados y un método main que ejecute el
programa:
59
Programación Orientada a Objetos
60
Programación Orientada a Objetos
Los diagramas de clases permiten definir clases y sus métodos sin escribir los algoritmos que estos
incluyen. Utilizaremos este tipo de diagramas en el siguiente capítulo.
61
Programación Orientada a Objetos
4.6 Ejercicios
1. Tomando como base el método PedirEntero, construya un método pedirReal para pedir al
usuario un valor numérico real hasta que sea válido. El método debe recibir el rango de
números válidos y debe devolver un double.
2. Construya un método para verificar si un número es par. Debe recibir como entrada un entero y
devolver true o false (boolean).
4. Usando los métodos de los dos ejercicios anteriores, reescriba el programa de la sección 3.4.2.
5. Escriba un programa que pida al usuario tres números enteros: día, mes y año y muestre la fecha
en formato dd de mes de aaaa. Por ejemplo: si el usuario ingresa 12, 6, 2004 para día, mes y
año respectivamente, el programa debe mostrar: 12 de Junio de 2004. Si los valores son
erróneos (la fecha no se puede representar) el programa debe arrojar "La fecha no es válida".
Construya el programa implementando primero los siguientes métodos:
c. boolean validarAgno(int agno): devuelve verdadero si agno está entre 1950 y 2007.
d. boolean validarDia(int dia, int mes, int agno): devuelve verdadero si la fecha es válida.
Para comprobar esto tener en cuenta que:
iii. El mes 2 (febrero) tiene 28 días, excepto los años bisiestos en que tiene 29.
iv. Un año bisisesto es un año divisible por 4. No se consideran bisiestos los años
divisibles por 100 a menos que sean divisibles además por 400.
6. Construya un método que muestre las primeras 100 cifras de la serie de Fibonacci. Cada cifra
de esta serie se calcula sumando las dos cifras anteriores. Por ejemplo, los primeros 10
elementos de la serie:
1 1 2 3 5 8 13 21 34 55
62
Programación Orientada a Objetos
En este caso se ha definido que el arreglo arreglo1 tiene una capacidad de 20 elementos.
La declaración y la cosntrucción del arreglo son procesos distintos, pero pueden resumirse a una sola
línea. Las siguientes dos instrucciones son válidas y crean arreglos (notar como no importa que los
paréntesis cuadrados estén luego del tipo o luego del nombre de la variable):
63
Programación Orientada a Objetos
Ahora bien, ¿cómo modificamos y accedemos a los elementos del arreglo? La siguiente instrucción
establece el valor del primer elemento del arreglo en 10:
numeros[0] = 132;
numeros[6] = -32
Los elementos de un arreglo se almacenan en forma secuencial y se identifican por una posición dentro
del arreglo. El primer elemento está en la posición 0.
numeros
132 0 0 0 0 0 -32
numeros[0] numeros[1] numeros[2] numeros[3] numeros[4] numeros[5] numeros[6]
Podemos obtener el largo de un arreglo mediante la propiedad length, lo cual es recomendable, aunque
el tamaño del arreglo se defina dentro del programa. La propiedad length es siempre un número entero:
int largo1 = reales.length;
64
Programación Orientada a Objetos
En Java es posible declarar, crear y rellenar un arreglo en una sola instrucción, especificando los
valores del arreglo entre paréntesis de llaves ( '
{','
}'):
65
Programación Orientada a Objetos
La siguiente clase muestra un programa que crea un arreglo de números reales que contiene las notas
de un alumno, luego utiliza métodos para buscar la menor nota, la mayor nota y calcular el promedio.
66
Programación Orientada a Objetos
67
Programación Orientada a Objetos
Por supuesto, pueden existir métodos que reciban y devuelvan arreglos. El siguiente ejemplo construye
un arreglo de enteros con los valores de las longitudes de las cadenas contenidas en un arreglo de
Strings.
68
Programación Orientada a Objetos
primer arreglo como de dimensión 1xN y el segundo como de Nx1, el resultado es de 1x1, un
escalar). En este último caso, los vectores deben ser del mismo tamaño, sinó debe devolver 0.
El primer método cortar, devuelve un arreglo con los primeros cantidad números de vector.
El segundo, en cambio, obtiene todos los elementos entre la posición limite1 y limite2,
ambas incluidas.
70
Programación Orientada a Objetos
71
Programación Orientada a Objetos
5.7 Ejercicios
1. Construya los métodos "minimo" y "maximo" que devuelvan el mayor valor contenido en un
arreglo de números (double) pasado como parámetro.
2. Construya un método que normalice un arreglo de double a porcentajes del mayor número
contenido.
3. Construya un método que normalice un arreglo de double para que todos los elementos sumados
den siempre 1, manteniendo las proporciones.
4. Construya un método "promedio" que devuelva el promedio de un conjunto de valores pasados
como un parámetro arreglo de double.
5. Construya un método "promedioPonderado" que reciba dos arreglos y calcule el promedio
ponderando los elementos del primer arreglo con respecto al segundo arreglo. El método debe
verificar que ambos arreglos tengan el mismo largo.
6. Construya un método "factores" que devuelva un arreglo de int con todos los factores de un número
entero.
7. Construya un método "existe" que devuelva la posición de la primera ocurrencia de un número en
un arreglo. Debe devolver -1 si el número no existe en el arreglo.
8. Construya un método "cuantasPalabras" que cuente el número de palabras en una cadena de
caracteres pasada como parámetro.
9. Construya el método "separaCadena" que separe una cadena de caracteres en un arreglo con las
palabras (delimitadas por espacio en blanco).
72