Libroparadigma2017 FINAL2 Caratula
Libroparadigma2017 FINAL2 Caratula
Libroparadigma2017 FINAL2 Caratula
No está permitida la reproducción total o parcial de esta obra, ni su tratamiento o transmisión por ningún
procedimiento electrónico o mecánico, incluyendo fotocopiado, grabación magnética o cualquier
almacenamiento de información y sistema de recuperación sin autorización de la editorial. Los derechos
son exclusivos de los autores.
© Derechos reservados
ISBN: 978-958-8801-62-9
Reproducido y editado por ELIZCOM S.A.S
www.elizcom.com
ventas@elizcom.com
Cel: (57) 3113349748
Armenia, Quindío
Colombia
Diciembre 2017
2
Lógica de Programación en
Java
Adscrito al
Facultad de Ingeniería
Facultad de Ingeniería
Facultad de Ingeniería
3
4
PREFACIO
Este libro ofrece a los lectores un primer acercamiento a los aspectos básicos de programación y lógica de
programación, siguiendo el paradigma de programación estructurada. Este paradigma ofrece mayor claridad a la
hora de crear una aplicación, dado que usa solamente tres estructuras (secuencial, estructuras de decisión y ciclos)
y subrutinas (funciones o métodos). Todos estos conceptos se desarrollan a través de 4 unidades temáticas que
corresponden a los contenidos del primer curso de Programación del Programa de Ingeniería de Sistemas y
Computación de la Universidad del Quindío.
La unidad I, denominada Introducción a la lógica de programación en Java, incluye temáticas tales como: conceptos
básicos de programación y algoritmia, tipos de datos primitivos, tipos de datos por referencia, variables (declaración,
inicialización, nomenclatura), constantes, comentarios, operadores (aritméticos, relacionales y lógicos), casting,
métodos (con/ sin retorno, con/sin parámetros), llamado de métodos y paso de argumentos. Se crean proyectos
completos, haciendo uso del ambiente de desarrollo Eclipse, aunque el lector puede usar cualquier otro IDE para
digitar sus aplicaciones. La unidad II, aborda el tema de las estructuras de decisión (condicionales): if y switch. La
tercera unidad aborda la programación iterativa: ciclo condicionado al final (do-while) y ciclos condicionados al inicio
(while, for), además de, contadores y acumuladores. La última unidad, trabaja el tema de arreglos. Allí se describe
como crear, recorrer y manipular estructuras contenedoras unidimensionales de tamaño fijo.
Para el entendimiento de este libro no es necesario contar con conocimientos previos en el área de la programación.
Sin embargo, quien desee trabajar con pseudocódigo y diagrama de flujos, antes de realizar las actividades de este
libro, podrá consultar un anexo presente al final del documento con algunas instrucciones en PSeINT [1]. Esta
herramienta es un pseudolenguaje en idioma castellano que enfatiza en la parte algorítmica.
Si bien es cierto, que en este libro no se aborda la Programación Orientada a Objetos, se toman elementos del
Proyecto Cupi2, de la Universidad de los Andes [2], dado que este se consolida como una solución integral al
problema de enseñar y aprender a programar. Partiendo de lo anterior, elementos tales como definición de un
contrato para construir un método, separación de la lógica y la interfaz se utilizan durante todo el libro. El ingreso de
los datos se efectúa mediante cajas de diálogos estándar. Esta lectura no se realiza en los métodos de la lógica,
para que al migrar a la programación orientada a objetos, el estudiante no mezcle los conceptos de lógica e interfaz.
El código construido dentro del libro incorpora el uso de buenas prácticas de programación. Entre ellas se destaca:
usar un único retorno por método, construir métodos cortos (definiendo claramente en el contrato del método),
realizar una codificación legible y entendible por cualquier programador, utilizar llaves en las estructuras de decisión
y ciclos, declarar valores literales como constantes, reutilizar código (modularizar) y usar los patrones de recorrido:
parcial, total y doble recorrido [3].
5
6
Contenido
1. Introducción a la lógica de programación en Java ...................................................................... 11
1.1. Identificadores ......................................................................................................................... 12
1.2 Tipos de datos primitivos ......................................................................................................... 13
1.3 Constantes ................................................................................................................................ 15
1.4 Tipos de datos por referencia................................................................................................... 15
1.5 Expresiones .............................................................................................................................. 18
1.5.1 Operadores aritméticos ...................................................................................................... 18
1.5.1.1 Operadores de incremento y decremento ...................................................................... 18
1.5.1.2 Promoción automática y casting..................................................................................... 26
1.5.2 Operadores lógicos ............................................................................................................ 27
1.5.3 Operadores relacionales .................................................................................................... 28
1.6 Primera interacción con Eclipse............................................................................................... 29
1.7 Métodos ..................................................................................................................................... 36
1.7.1 Documentación del código ................................................................................................ 38
1.7.2 Construcción de programas con métodos ........................................................................ 39
1.7.2.1 Métodos de uso común: leerDouble, leerEntero, leerChar, leerString, leerBoolean e
imprimir ....................................................................................................................................... 40
1.8 Taller de métodos ..................................................................................................................... 45
2. Estructuras de decisión ................................................................................................................. 49
1.1 Instrucción If......................................................................................................................... 49
2.2 Instrucción switch..................................................................................................................... 58
2.3 Taller estructuras de decisión .................................................................................................. 62
3. Estructuras repetitivas ................................................................................................................... 67
3.1 Instrucción for ........................................................................................................................... 67
3.2 Instrucción while ....................................................................................................................... 67
3.3 Instrucción do while ................................................................................................................. 67
3.4 El depurador de Eclipse............................................................................................................ 68
4. Estructuras contenedoras unidimensionales de tamaño fijo ....................................................... 97
4.1 Pila y Stack ................................................................................................................................ 98
4.2 Patrones para instrucciones repetitivas .................................................................................. 98
4.3 Clase Arrays ............................................................................................................................ 100
4.4 Métodos estándar usados en esta unidad: leerArregloEnteros, leerArregloDouble ............ 101
4.5 Taller de arreglos .................................................................................................................... 126
Índice ................................................................................................................................................ 129
Referencias ...................................................................................................................................... 131
7
ANEXO 1. Tabla de códigos UNICODE ............................................................................................ 133
ANEXO 2. PSeInt .............................................................................................................................. 135
ANEXO 3. Instalación de Eclipse ..................................................................................................... 145
8
1. Introducción a la lógica
de programación en Java
Objetivos Pedagógicos
Al final de este nivel el lector estará en capacidad de:
9
10
1. Introducción a la lógica de programación en Java
Cuando una empresa requiere una aplicación, lo primero que hace es contactar a un equipo de desarrollo. Este
escucha y analiza las necesidades del cliente, y sigue una serie de etapas (análisis, diseño e implementación) para
poder construir un producto que satisfaga lo solicitado. En la etapa de análisis se determinan los requisitos
funcionales, es decir, lo que se espera que el programa haga, el mundo del problema (contexto en el que se desarrolla
el problema) y los requisitos no funcionales (restricciones tales como hardware, distribución geográfica y factores
humanos). La fase de diseño considera las partes y diferentes relacionales que componen la solución. La fase de
construcción, permite, partiendo del diseño, expresar la solución mediante algoritmos y construir el código fuente.
Un algoritmo es un conjunto de pasos finitos y lógicos para resolver un problema, que consta de pasos estrictamente
descritos y acciones precisas. El archivo que ejecuta el cliente debe pasar por una etapa de pruebas para validar
que si cumpla con los requisitos solicitados inicialmente [2]. La Figura 1 ilustra el proceso seguido:
Dentro de los elementos que forman parte de la solución de un problema, ver Figura 2, se contempla la construcción
de un código fuente (para el caso de este libro, un archivo Java®). Este código luego debe compilarse, para dar lugar
a un archivo de construcción (con extensión .class) que contiene el bytecode o código binario generado acorde a la
arquitectura del equipo. Finalmente, la máquina virtual de java, interpreta el bytecode, para poder desplegar la
aplicación. Es importante, hacer uso de datos de prueba para verificar la validez de los resultados que arroja el
programa. El programador puede valerse de herramientas para automatizar las pruebas de los programas realizados
en Java, tales como JUnit [4].
11
Figura 2 Elementos que forman parte de la solución, tomado de [2]
1.1. Identificadores
Todos los datos e instrucciones de un programa son almacenados en la memoria. Para poder tener acceso a las
diferentes posiciones de memoria, es necesario hacer uso de identificadores. Un identificador es un nombre que
puede darse a una variable, constante (variable con un valor inmutable durante la ejecución de un programa) o a
cualquier otro elemento que necesite nombrarse. Existen diversas reglas para el uso de identificadores:
- Tener en cuenta la sensibilidad al tamaño, es decir, existe distinción entre mayúscula y minúscula, por
ejemplo suma es diferente de sumA.
- No puede contener espacios en blanco. Si se quiere escribir cantidad hijos, se escribiría cantidadHijos.
- Debe iniciar con letra Java (A-Z, a-z, $ y _)
- Puede contener dígitos (0-9).
- Si está formado por más de una palabra, las palabras adicionales iniciarán con mayúscula, cantidadHijos,
edadPromedioPersonas.
- Si es una constante se escribe en maýuscula
- No usar caracteres propios del castellano (tilde, ni la letra ñ) [3].
12
1.2 Tipos de datos primitivos
En Java, a cada variable o constante se le debe asociar un tipo de dato. El tipo define el rango de valores que puede
tomar mientras el programa se encuentra en ejecución. Los tipos de datos primitivos permitidos por Java son los
enteros (byte, short, int, long), reales (float, double), tipos de dato caracter (char) y booleanos (boolean).
Los enteros representan un intervalo de los números enteros (sin considerar decimales), ver Tabla 1.
Algunos ejemplos de variables que tienen naturaleza de tipo entero son: la edad de una persona, la cantidad de
hijos de una persona, la cantidad de equipos en una sala de computadores. Aunque existe 4 diferentes tipos de
datos enteros (byte , short, int y long durante este libro por sencillez solo se utilizará en tipo de dato int.
En Java, cuando se crea una variable de tipo de dato numérico el valor por defecto con el que se inicializa es 0.
El lector debe tener precaución cuando trabaja con lenguajes tales como C++, dado que no ocurre lo mismo. Se
sugiere, por facilidad de migración a otros lenguajes, que cuando declare una variable la inicialice con 0. Para
inicializar una variable se hace uso del operador igual (=), que permite cambiar fijar el valor de la variable al valor
deseado.
Ejemplo:
double promedio=0;
Los reales aceptan rangos de valores con parte entera y decimal, ver Tabla 2. Los datos soportados son float y
double. Para los ejemplos de este libro solo se utiliza tipo de dato double. Este tipo de dato permite desarrollar
completamente los objetivos del curso sin necesidad de estar haciendo conversiones forzosas, lo que le agregaría
mayor dificultad al lector.
Tamaño en
Nombre Rango de valores Declaración
bits
13
El tipo de dato caracter, usa la codificación Unicode. Esta codificación permite usar los caracteres de todos los
idiomas. Se caracteriza porque sus primero 127 caracteres corresponden a los mismos caracteres del código ASCII.
Un tipo de dato caracter corresponde a un único carácter. El valor de inicialización debe ir entre comillas simples.
En Java las variables de tipo char no tienen una inicialización por defecto (contrario a lo que ocurre en C++, que se
inicializa con el carácter nulo), por lo que debe tener la precaución de inicializarla. Tenga en cuenta que a un carácter
se le puede asignar un numero entero (su código ASCII-unicode).
char letra = '0';
char letra = 0;
Las instrucciones:
Imprimen:
F
Algunas de las secuencias de escape (caracteres especiales usados con frecuencia), se presentan en la
Tabla 4.
Un dato de tipo booleano se caracteriza por tomar únicamente dos valores true o false. Su correcta declaración
e inicialización se muestra en la Tabla 5.
14
1.3 Constantes
Las constantes pueden usarse para dos objetivos: representar valores inmutables o para representar el dominio de
un atributos. La Tabla 6 ilustra cómo se declara una constante.
La instrucción final impide que las constantes sean modificadas durante la ejecución del programa.
Java cuenta con dos tipos de datos: valor y referencia. Cuando se declara una variable que corresponde a un tipo
de dato primitivo, se está haciendo referencia a una variable por valor, que almacena su contenido en una estructura
denominada pila (stack). Los tipos de datos por referencia, corresponden a instancias de clases y utilizan un área de
memoria llamada montículo o heap [5]. Este libro solo hará uso de los tipos de datos por referencia String y las clases
envoltorio. Una clase es una plantilla para crear objeto y un objeto es una instancia de una clase. Las clases
envoltorio permiten manipular un tipo de dato primitivo como un objeto. Los 8 tipos de datos primitivos con su
correspondiente clase envoltorio se muestran en la Tabla 7.
byte - Byte
short - Short
int - Integer
long - Long
float - Float
double - Double
char - Character
boolean - Boolean
Tabla 7 Tipo de dato primitivo con su correspondiente clase envoltorio
El uso de clases envoltorio permite hacer uso de funcionalidades adicionales que fueron implementados en Java en
cada clase, por ejemplo:
15
Clase Screenshot de algunos de los métodos implementados en Java
Integer
La clase Integer encierra un dato primitivo
(tipo int) en un objeto.
Esta clase tiene métodos entre ellos:
convertir un int en un String y un String en
int
Integer dato=new Integer(5);
Double
La clase Double encierra un dato primitivo
(tipo double) en un objeto.
Esta clase tiene métodos entre ellos:
convertir un double en un String y un String
en double
Double dato=new Double(5.0);
Character
Encierra un tipo de dato primitivo de tipo char
Character c=new Character('A');
La clase String permite expresar un conjunto de caracteres (cadena). Para inicializar una cadena se hace uso de
comillas dobles. Ejemplo
String direccion= "Carrera 12 #23 10";
String nombre= "Maria Jose";
La clase String consta de variados métodos, algunos de ellos, para extracción de caracteres, comparación y
concatenación.
16
Concatenar es unir dos cadenas, en Java esto se logra con el operador +
1) marca ( ) int
2) capacidadLibras ( ) String
3) modelo ( ) String
4) serie ( ) String
5) tipoProducto ( ) double
6) precio ( ) int
7) isbn ( ) boolean
8) activo ( ) String
17
1.5 Expresiones
Este tipo de operadores permite realizar operaciones. Ellos son: + (suma), - (resta), * (multiplicación), / (división),
% (módulo o residuo de la división entera).
Se debe tener en cuenta que en Java entero dividido entre entero da como resultado otro entero. Por ejemplo:
int a = 20;
int b = 3;
double res = ( a + b ) / 3;
El programa debería imprimir 7.66666666667 pero da 7. Si lo que se desea es conservar estos decimales se pueden
aplicar las siguientes 3 soluciones:
double auxiliar = a + b;
double res = auxiliar / 3;
Java posee el operador incremental unario ++, y el operador decremental unario --, para incrementar o decrementar
el valor de una variable en 1, respectivamente. La siguiente tabla describe cada uno de estos operadores.
Operadores Significado
18
Modo normal Modo con operador
x=x+1; x++;
s=s-1; s--;
Los operadores pueden estar antes o después del operando. Por ejemplo:
s = s+1; es igual a:
++s;
s++;
Hay que tener precaución al usar esos operadores dentro de una expresión. Si operador incremento o decremento
precede a su operando, java realiza operaciones de incremento o decremento antes de usar el valor del operando.
Por el contrario, si el operador está luego del operando, java usa el valor del operador antes de incrementarlo o
decrementarlo.
() Paréntesis
+, - Operadores de signo ( PRECAUCION: no hace referencia a suma y resta)
++, --
*, /, %
+, - Suma y resta
<, >, <=, >=, ==, !=
!
&&, ||
=
Tabla 9 Prioridad de operadores
19
Si se tiene una expresión, que contienen operadores con la misma prioridad, Java evalúa la expresión de izquierda
a derecha. Si hay paréntesis lo que está dentro se evalúa primero. Si hay paréntesis internos, lo que está en su
interior se evalúa primero que lo que está en los externos. Ejemplo:
x = (2 + 3) * 8
Por precedencia de operadores, se efectúa primero (2+3) y por último se realiza el producto, por lo tanto:
x = (2 + 3) * 8
x = (5) * 8
x = 40
x = (2+5+5) + (4+1)
Según la precedencia de los operadores, se debe evaluar primero las expresiones con paréntesis, estas son (2+5+5)
y (4+1), en el caso de (3+5+5), como se tiene el mismo operador (+) dentro de la expresión, estos operandos, se
evalúan de izquierda a derecha, por lo tanto la forma en que es evaluada la expresión es:
x = (2+5+5) + (2+1)
x = (7+5) + (3)
x = 12 + 3
x = 15
z = 1 + (10+6*6+7) + (18/2) / 3 / 1 + 2
Inicialmente, se resolverá las expresiones que se encuentran dentro de los paréntesis, se deben resolver las
operaciones que tengan la mayor precedencia.
z = 1 + (10 + 6 * 6 + 1) + (18 / 2) / 3 / 1 + 2
z = 1 + (10 + 36 + 1) + 9 /3 / 1 + 2
Se observa que la expresión (3)/3/1, tiene tres operadores con idéntica precedencia, por lo tanto estos se evalúan
de izquierda a derecha.
20
z = 1 + 47 + 3 + 2
Cuando se tenga una potencia y el exponente involucre una operación ésta debe encerrarse entre paréntesis:
X1/2 = Math.pow (X, 1/2.0)
Recuerde que debe ponerse 2.0 porque 1/2=0, mientras que ½.0=0.5
Si se tiene una raíz esta debe expresarse en forma de potencia. Ejemplo:
n
√4 = Math.pow (4, 1.0/n);
a) 22 + X = 36 b) 16 – X= 9 c) 11- X = 4 d) X*4 = 38
- Dada la expresión realice el despeje de la x. Recuerde que el operador multiplicación debe reemplazarse por un
asterisco y el división por un slash.
a) 2x + 20 = 2x + 60
b) x + 15 = 17
c) (2x – 4) = x + 7
e) 6(x – 6) – 20 = 2(x – 5) – 3
f) 6(x – 2) – 6 (x – 2) = 3(3x – 4)
La suma de dos números consecutivos es 60. Informar cuáles son los números.
Actividad 3 Construir expresiones que involucren únicamente los operadores aritméticos y el operador =
a. Se desea crear una aplicación que permita incrementar el salario de un empleado en un 10%
Variables Expresión
b. Si se sabe el porcentaje de incremento del salario y el nuevo salario informar cuál era el salario previo
21
Variables Expresión
Entrada:
Salida:
c. Si se sabe el salario incrementado y el salario anterior informar cual fue el porcentaje de incremento.
Variables Expresión
Entrada:
Salida:
a. Si se sabe el volumen de un tetraedro regular, calcular el lado. Recuerde que el volumen del tetraedro =
Variables Expresión
Variables Expresión
Entrada:
Salida:
Variables Expresión
Entrada:
Salida:
Variables Expresión
Entrada:
Salida:
22
4. Una finca tiene la siguiente forma, hallar el perímetro de toda la finca y el área, si se conocen las longitudes que
se encuentran punteadas.
a
lado2
lado1
lado2
lado1
Entrada:
Salida:
Entrada:
Salida:
lado3 lado4
lado2
lado1
23
Variables Expresión área de la casa
Entrada:
Salida:
a. Se tiene una torta de torta de forma circular, de radio r. Si el usuario se come una porción de torta (y se sabe el
ángulo en grados de la porción consumida), informar el área de torta que queda disponible para consumo.
Entrada:
Salida:
b. Resolver este mismo punto si se conoce la longitud de arco de un sector o segmento. Calcular θ.
Longitud de arco = θ × r
Entrada:
Salida:
1
Figura basada en http://compumch.webnode.es/a1%C2%B0-primaria-iii-b/actividad-3-19-8-15-herramienta-borrador-
dibujo-figuras-geometricas/
24
Variables Expresión área total de la figura
Entrada:
Salida:
9. Obtener el número de cerámicas cuadradas para cubrir un salón rectangular. El usuario debe ingresar el largo y
ancho del espacio a cubrir, y la longitud de cada cerámica.
Entrada:
Salida:
25
10. Se vende un vehículo perdiendo un porcentaje sobre el precio de compra. Hallar el precio de venta del mismo
si se sabe que costó X pesos.
Entrada:
Salida:
Cuando calcula una expresión que involucre operandos de tipo byte o short, Java efectúa una promoción a int.
También se debe considerar que si hay un operador long, la expresión completa se promociona a este tipo de dato.
Si un operador es float, entonces toda la expresión completa se promociona a float. Igual ocurre si es double. Por
ejemplo si se tiene:
int d = a * b / d;
El resultado de a * b se calcula en entero y no en byte , esto ocurre porque tal operación puede salirse del rango
de los byte. Observe el siguiente ejemplo:
byte b = 2, resultado;
Si se intenta multiplicar un byte b por 6 que es un entero el resultado será un entero, por tal razón este valor no
podría asignarse a un byte. Si se requiere que el resultado se almacene en un byte, será necesario realizar una
conversión explícita (casting):
byte b = 2, resultado;
resultado = (byte)( b * 6 );
26
Actividad 4 Identificar el resultado de expresiones sencillas escritas en Java
Estos operadores trabajan sobre operandos de tipo lógico para producir un resultado lógico (false o true). La Tabla
10 presenta los diferentes tipos de operadores lógicos.
Operador Significado
&& AND
|| OR
! NOT
Tabla 10 Operadores lógicos
El operador AND (&&) da como resultado true si los dos operandos son verdaderos. De lo contrario da como
resultado false.
El operador OR (||) da como resultado verdadero cuando al menos uno de sus operandos es verdadero.
27
Operando 1 Operador Operando 2 Salida
false || false false
false || true true
true || false true
true || true true
Tabla 12 Operador OR
Si la variables está en false, el operador negación cambia el valor de la variable a true. Si está en true lo vuelve
false.
Estos operadores dan como resultado un valor de tipo lógico (true o false). Los operadores lógicos son:
== (igualdad)
!= (diferente)
> (mayor que)
< (menor que)
>= (mayor o igual)
<= (menor o igual)
Tabla 13 operadores relacionales
__________________________________________________________
__________________________________________________________
28
1.6 Primera interacción con Eclipse
Esta práctica le permitirá al lector crear un primer programa. El objetivo es practicar el tema de expresiones, tal
como se muestra en el diagrama de flujo. En primer lugar se crean dos variables a y b, que se inicializan con los
valores de 9 y 6 respectivamente. Luego se halla la raíz cuadrada de cada una de ellas y finalmente se muestran los
resultados.
Para llevar este diagrama a Java, previamente instale Eclipse, tal como se explica en el ANEXO 1. Luego ingrese a
Eclipse y de clic en File -> New Java Project
29
2. De nombre al proyecto y presione Finish
3. De clic derecho sobre el proyecto, elija New-> Class. Dele el nombre de Prueba. Active la opción public static void
main(String[] args) y Generate comments. Luego de clic en Finish
30
4. La siguiente pantalla aparecerá:
31
5. Agregue comentarios para describir la clase
/**
* Programa para utilizar los diferentes operadores aritmeticos vistos en clase
* @param args los argumentos de la línea de comando
*/
32
Finalmente, de clic en Ejecutar , para observar los resultados
33
Actividad 6 Crear programas en Java
1. Pase los siguientes diagramas de flujo a Java. Para realizar la lectura de los datos, utilice Scanner
34
2. Escribir expresiones.
Nota
Si tiene las siguientes instrucciones:
int a=6, b=5;
double resultado=6*5;
System.out.println(a+" * "+b+" = "+resultado);
Crear una aplicación que permita calcular expresiones. Tenga en cuenta que
Restricciones
35
Actividad 7 Cree una aplicación por cada uno de los puntos de la Actividad 3 un proyecto en Eclipse.
1.7 Métodos
Un método es una subrutina que permite efectuar una tarea particular. Los métodos tienen gran importancia en la
programación estructurada, al brindar la posibilidad de encapsular una serie de instrucciones de manera, que luego
pueden ser invocadas y ejecutadas desde diferentes puntos del programa.
Los parámetros pueden verse como las variables de entrada, es decir, lo que se requiere para cumplir con la
responsabilidad del método. Es decir, si el método se va a encargar de sumar dos números double, el método tendrá
dos parámetros y tipo de retorno será doublé (porque el resultado de la suma es double).
A la línea correspondiente al encabezado del método (sin el conjunto de instrucciones, es decir, omitiendo lo que
está dentro de las llaves) se le da el nombre de signatura del método [2]. El nombre del método (identificador) debe
iniciar en verbo en infinitivo. Los parámetros se escriben de la siguiente forma: tipo nombre2, tipo nombre2, …
Siempre se debe poner primero el tipo de dato seguido por el nombre del parámetro. Si son varios parámetros se
separan por comas.
Cada método debe tener claramente definidos sus compromisos y responsabilidades (es decir, lo que va a hacer)
[2]. No se recomienda la creación de métodos demasiado extensos que “realicen de todo”. En su lugar, deben crearse
múltiples métodos y luego integrarlos. Lo anterior permite obtener un código mejor estructurado y reutilizable,
además de que, facilita la detección de errores.
1. Sin Retorno (void). Es decir, el método no devuelve ningún valor. Estos métodos son útiles cuando se
pretende modificar el valor de los atributos de una clase [2]. Dado que en este libro no se trata el concepto
de clases y programación orientada a objetos, se evitará su uso y se preferirá el uso de métodos con retorno,
ver Tabla 14.
2. Con retorno: Muchos de los métodos que se utilizan en la vida cotidiana, retornarán valores. Los métodos
pueden retornar valores de tipos primitivos, pueden retornar objetos, pueden retornar arreglos entre otros.
El retorno indica el tipo del resultado por ejemplo en el caso de determinarExistenciaEstudiante el retorno
podría ser booleano, es decir se devolvería un true (si existe) o un false en caso contrario. Si hay retorno
debe especificarse claramente el tipo de dato devuelto y debe incluirse la sentencia return para realizar dicha
tarea.
36
El siguiente gráfico demuestra la importancia de identificar el tipo de retorno adecuado. Observe en primer lugar la
columna 1(SIN RETORNO). Allí se implementa un método sin retorno, llamado calcularSuma, que tiene dos
parámetros double num1 y double num2. El hecho de no tener retorno tiene importantes implicaciones. Para
entender esto, por favor observe el método main, allí el método calcularSuma se invoca 2 veces. La primera vez se
invoca enviándole los valores de 2 y 4, esto daría como resultado 6. La segunda vez, se invoca para sumar 4 y 5,
esto da 9. Si quisiera multiplicar los resultados, 6 más 9, no se puede porque los datos se imprimieron e
inmediatamente se pierden cuando finaliza el método calcularSuma( double num1, double num2 ). El ámbito y tiempo
de vida de las variables está limitado por las llaves, es decir, estas definen cuando su tiempo de vida termina.
Ahora observe la columna, CON RETORNO, y note que dentro del método main el método calcularSuma se invoca
2 veces. La primera vez se invoca enviándole los valores de 2 y 4, esto daría como resultado 6, el valor se retorna y
queda almacenado en resultado1. La segunda vez, se invoca para sumar 4 y 5, esto da 9, el valor se retorna y
queda almacenado en resultado2. A continuación se invoca el método calcularProducto y se le envía como
argumento resultado1 y resultado2, por lo que en la variable resultado 3 se obtendría el valor de 54. Retornar permite
hace que el valor resultante del método pueda ser reutilizado.
public static void main(String[] args) { public static void main(String[] args) {
double num1=2; double num1=2;
double num2=4; double num2=4;
double num3=5; double num3=5;
calcularSuma(num1, num2); double resultado1, resultado2, resultado3;
calcularSuma(num2, num5); resultado1 = calcularSuma(num1, num2);
} resultado2 = calcularSuma(num2, num3);
resultado3 = calcularProducto (resultado1,resultado2);
public static void calcularSuma( double num1, double num2 ) }
{
double res=num1+num2; public static double calcularSuma( double num1, double num2 )
System.out.println("El resultado es"+res); { double res=num1+num2;
} return res;
} }
public static double calcularProducto( double num1, double num2
)
{ double res=num1*num2;
return res;
}
}
Tabla 14 Comparativo método void y con retorno
Se le sugiere al lector, evitar imprimir en los métodos de la lógica. Esta práctica puede verse como una mezcla de
lógica con interfaz y puede traer inconvenientes a la hora de migrar a la Programación orientada a objetos, y
específicamente cuando trabaje paquetes (uno para la lógica y otro para la interfaz gráfica).
Se debe diferenciar entre los términos parámetro y argumento. Un parámetro es una variable definida por un método
y que recibe un valor cuando se llama a ese método. Un argumento es un valor que se pasa a un método cuando
éste es invocado” 2. Por ejemplo, el método calcularSuma tiene dos parámetros: double num1 y double num2.
Cuando se invoca se le pasan como argumentos los valores de a y b, respectivamente 4 y 7. Observe detenidamente,
parámetro y argumento deben coincidir en tipo, pero no en nombre.
2
Gómez, Carlos Eduardo y Gutierrez, Julián Esteban
37
/**
* Calcula la suma de dos números . <br>
* @param num1 Es el número 1.
* @param num2 Es el segundo número a sumar.
public static double calcularSuma( double num1, double num2 )
{ double res=num1+num2;
return res;
}
El contrato de un método permite dejar explícitas las condiciones bajo las cuales el método será exitoso, y lo que se
espera del método una vez termine su ejecución. El contrato del método requiere definir las precondiciones y la
postcondición. Las precondiciones (suposiciones o condiciones impuestas por quien desarrolla el método, que
deben ser verdaderas para que el método funciones correctamente). La postcondición es la descripción del resultado
obtenido (compromisos asumidos) luego de la ejecución del método, siempre y cuando no hayan ocurrido
excepciones. Una excepción es un problema inesperado que surge durante la ejecución de un programa. El contrato
es total, esto quiere decir, que ante el incumplimiento de cualquier precondición el método ya no queda obligado a
cumplir la postcondición [2]
Para documentar el contrato de un método se hace uso de Javadoc. Tal como se muestra a continuación:
/**
* Calcula la suma de dos números . <br>
* @param num1 Es el número 1.
* @param num2 Es el segundo número a sumar.
public static double calcularSuma( double num1, double num2 )
{ double res=num1+num2;
return res;
}
- De varias líneas
38
1.7.2 Construcción de programas con métodos
Durante todo este documento se hará uso de cuatro importantes métodos: leerDouble, leerEntero, leerChar y
leerString 3. A continuación se presenta el primero de ellos: leerDouble. La explicación presentada es generalizable
para los otros tres métodos.
El método leerDouble permite mediante el uso de una caja de diálogo (JOptionPane), leer un valor de tipo double.
Este método tiene como parámetro un mensaje, que corresponde al mensaje que el usuario visualiza y que le
permitirá entender qué es lo que se le solicita.
/**
* Permite leer un numero double mediante una caja de dialogo
* @param mensaje El mensaje que verá el usuario
* @return el numero ingresado por el usuario
*/
Campo de texto
3
Estos métodos fueron construídos por el ingeniero Julián Esteban Gutiérrez, y se acordó su uso por todos los docentes del
área de Programación y Algoritmia de Ingeniería de Sistemas y Computación de la Universidad del Quindío.
39
/**
* Metodo principal
* @param args Los argumentos de la linea de comando
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String mensaje1= "Ingrese la base";
String mensaje2= "Ingrese la altura";
double base= leerDouble (mensaje1);
double altura= leerDouble (mensaje2);
1.7.2.1 Métodos de uso común: leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
/**
* Permite leer un numero double mediante una caja de dialogo
* @param mensaje El mensaje que verá el usuario
* @return el numero ingresado por el usuario
*/
/**
* Permite leer un numero entero mediante una caja de dialogo
* @param mensaje El mensaje que verá el usuario
* @return el numero ingresado por el usuario
*/
public static int leerEntero (String mensaje)
{
int dato= Integer.parseInt(JOptionPane.showInputDialog(mensaje));
return dato;
}
/**
40
* Permite leer un caracter mediante una caja de dialogo
* @param mensaje El mensaje que verá el usuario
* @return el caracter ingresado por el usuario
*/
public static char leerChar(String mensaje)
{
char dato= (JOptionPane.showInputDialog(mensaje)).charAt(0);
return dato;
}
/**
* Permite leer una cadena de caracteres mediante una caja de dialogo
* @param mensaje El mensaje que verá el usuario
* @return el string ingresado por el usuario
*/
public static String leerString (String mensaje)
{
String dato= JOptionPane.showInputDialog(mensaje);
return dato;
}
/**
* Permite leer un boolean
* @param mensaje El mensaje mostrado al usuario
* @return un boolean, true si presiona el boton si, false en caso contrario
*/
public static boolean leerBoolean (String mensaje)
{
boolean centinela=false;
int result = JOptionPane.showConfirmDialog(null,
mensaje,null, JOptionPane.YES_NO_OPTION);
if(result == JOptionPane.YES_OPTION) {
centinela=true;
}
return centinela;
}
/**
* Permite imprimir un mensaje
* @param mensaje El mensaje a imprimir
*/
public static void imprimir (String mensaje)
{
JOptionPane.showMessageDialog(null,mensaje);
}
El siguiente programa permite calcular el área de un Rectángulo, para ello se crea el método calcularArea, que
tiene dos parámetros: base y altura.
41
Programa 1 Hallar el área de un rectángulo
import javax.swing.JOptionPane;
/**
* Clase que representa operaciones sobre un Rectángulo
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
public class Rectangulo {
/**
* Metodo principal
* @param args Los argumentos de la linea de comando
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
double base, altura, area;
String mensaje1= "Ingrese la base";
String mensaje2= "Ingrese la altura";
base= leerDouble (mensaje1);
altura= leerDouble (mensaje2);
area = calcularArea(base, altura);
imprimir ("El area es "+area);
/**
* Permite leer un numero double mediante una caja de dialogo
* @param mensaje El mensaje que verá el usuario
* @return el numero ingresado por el usuario
*/
/**
* Permite imprimir un mensaje
* @param mensaje El mensaje a imprimir
*/
public static void imprimir (String mensaje)
{
JOptionPane.showMessageDialog(null,mensaje);
}
42
Actividad 8 Invocar un mismo método varias veces
El Programa 2 permite convertir una temperatura dada en Fahrenheit a centígrados. El método calcularConversion
tiene como parámetro la variable fahr. Para realizar la conversión se aplica la fórmula:
No se escribe 5/9, dado que entero dividido entre entero da entero, es decir, esta operación daría 0. En su lugar se
escribe 5/9.0, para que no se pierdan los decimales.
/**
* Clase que representa operaciones sobre una temperatura
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
public class Conversion {
/**
* Metodo principal
* @param args Los argumentos de la linea de comando
*/
public static void main(String[] args) {
double centigrado, fahr;
String mensaje1= "Ingrese la temperatura en fahr";
fahr= leerDouble (mensaje1);
centigrado = calcularconversion(fahr);
imprimir("La temperatura en centigrados es "+centigrado);
}
/**
* Permite convertir de fahr a centigrados
* @param fahr La temperatura dad en fahrenheit
* @return la temperatura en centigrados
*/
public static double calcularconversion(double fahr)
{
double resultado=0;
resultado= (5/9.0)* (fahr -32);
return resultado;
}
/**
* Permite leer un numero double mediante una caja de dialogo
* @param mensaje El mensaje que verá el usuario
43
* @return el numero ingresado por el usuario
*/
/**
* Permite imprimir un mensaje
* @param mensaje El mensaje a imprimir
*/
public static void imprimir (String mensaje)
{
JOptionPane.showMessageDialog(null,mensaje);
}
Ejecución
El Programa 3 permite obtener la sumatoria de las 3 cifras de un número entero. Esto se realiza mediante el método
calcularSumatoria, que tiene como parámetro a número y devuelve un entero con el resultado. Las expresiones
escritas dentro del método son:
centenas=numero/100;
decenas= (numero%100)/10;
unidades= numero%10;
123 100
23 1
123 10
3 12
por lo que unidades= 123%10= 3
44
Programa 3 sumar las cifras de un numero de tres cifras
/**
* Metodo principal
* @param args Los argumentos de la linea de comando
*/
public static void main(String[] args) {
int numero;
int sumatoria;
String mensaje1= "Ingrese el numero";
numero= leerEntero (mensaje1);
sumatoria = calcularSumatoria(numero);
imprimir("La sumatoria es "+sumatoria);
}
/**
* Permite convertir de fahr a centigrados
* @param fahr La temperatura dad en fahrenheit
* @return la temperatura en centigrados
*/
public static int calcularSumatoria(int numero)
{
int centenas, unidades, decenas, suma;
centenas=numero/100;
decenas= (numero%100)/10;
unidades= numero%10;
suma=unidades+decenas+centenas;
return suma;
}
}
a. Construir un programa que calcule el área sombreada (rayada) del rectángulo, si se ha dibujado una mascota
dentro de él 4.
4
Figura basada en http://compumch.webnode.es/a1%C2%B0-primaria-iii-b/actividad-3-19-8-15-herramienta-borrador-
dibujo-figuras-geometricas/
45
public class Mascota {
}
public double calcularAreaSombreada(double a)
{
return areaCabeza;
}
public double calcularAreaCuerpo (double a) }
{//aqui debe invocar los métodos para calcularAreas public static void main(String[] args) {
double areaCuerpo=0;
}
return areaCuerpo; }
}
Nota: Para los puntos que involucren áreas de figuras geométricas retomar los métodos de áreas del ejercicio
anterior. También debe implementar un método para hallar un cateto y otro método para hallar Hipotenusa.
46
2. Estructuras de decisión
Objetivos Pedagógicos
Al final de este nivel el lector estará en capacidad de:
- Identificar las responsabilidades de los métodos, diferenciando claramente cuales de los métodos
construidos corresponden a lectura de datos o visualización de información y cuáles a la lógica.
47
48
2. Estructuras de decisión
En Java se manejan dos estructuras de selección if y switch.
1.1 Instrucción If
La instrucción if, evalúa la condición, si el resultado es verdadero ejecuta las acciones encerradas dentro de llaves
(grupoDeAcciones1). El grupoDeAcciones1 puede ser simple o compuesto. Si la condición es falsa, no se ejecuta
ninguna acción.
if( condición )
grupoDeAcciones1
}
Por ejemplo, si se desea cambiar calcular la raíz cuadrada de un número se puede escribir:
double raiz=0;
if(numero>=0)
{
raiz=Math.sqrt(numero);
}
Una variante de esta estructura de decisión es el if-else. En ella se evalúa la condición y si es verdadera se ejecutan
las acciones encerradas dentro de llaves, en caso contrario se ejecuta grupoDeAcciones2
if ( condición )
{
grupoDeAcciones1
}
else
{
grupoDeAcciones2
}
En el siguiente ejemplo si el número es positivo o cero, se calcula la raíz cuadrada, de lo contrario la variable raíz se
inicializa con cero.
49
double raiz=0;
if(numero>=0)
{
raiz=Math.sqrt(numero);
}
else
{
raiz=0;
}
Algunas instrucciones sencillas pueden escribirse mediante un if in-line. El siguiente ejemplo ilustra su uso. Si numero
es menor que 10, entonces se le asigna el valor de 6, de lo contrario se le asigna 23.
int numero=0;
numero=((numero<10)? 6:23);
Otra variante es el if anidado, que se caracteriza porque la instrucción que sigue a un else es un if (excepto la última
que podría ser un único else). En un if anidado, las condiciones se evalúan de forma descendente, es decir, solo
pasa a la siguiente, si la anterior no es verdadera. Cuando la condición es verdadera se efectúa el bloque de
instrucciones correspondiente y se omite el resto de la estructura. Si ninguna se cumple se efectúa la acción del
último else.
Las condiciones se evalúan en orden descendente pasando de una a otra si la anterior resulta fals a. En el momento
que se encuentra una condición verdadera, se efectúa la acción correspondiente a dicha condición y se corta el resto
de la estructura. Si todas las condiciones resultan falsas se efectúa la acción correspondiente al último else.
Esta aplicación lee la edad y luego evalúa si es mayor o igual que 18, en tal caso se inicializa una variable con el
mensaje “es mayor de edad”, de lo contrario, se inicializa con “es menor de edad”.
50
Para ilustrar el uso la instrucción condicional en Java se presenta el método isMayor, que informa si una persona
es o no mayor de edad. Tiene como parámetro la edad.
/**
* Clase que representa operaciones sobre la edad de una persona
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
/**
* Metodo principal
* @param args Los argumentos de la linea de comandos
*/
public static void main(String[] args) {
int edad=0;
String resultado;
edad= leerEntero ("Ingrese la edad");
resultado=isMayor(edad);
imprimir(resultado);
}
/**
* Permite identificar si una persona es o no mayor de edad
* @param edad La edad de la persona, edad>=0
* @return Un mensaje Es mayor de edad (si es mayor de edad), Es menor
* de edad en caso contrario
*/
public static String isMayor(int edad)
{ String salida="";
if(edad>=18)
{
salida="Es mayor de edad";
}
else
{
salida="Es menor de edad";
}
return salida;
51
}
/**
* Permite leer un numero entero mediante una caja de dialogo
* @param mensaje El mensaje que verá el usuario
* @return el numero ingresado por el usuario
*/
public static int leerEntero (String mensaje)
{
int dato= Integer.parseInt(JOptionPane.showInputDialog(mensaje));
return dato;
}
/**
* Permite imprimir un mensaje
* @param mensaje El mensaje a imprimir
*/
public static void imprimir (String mensaje)
{
JOptionPane.showMessageDialog(null,mensaje);
}
Ejecución
El Programa 5 lee tres notas parciales de un estudiante y calcula su definitiva (promedio aritmético). Además informa
si la definitiva es Deficiente, aceptable, buena o excelente e indica la cantidad de parciales que ganó.
Para calcular la nota definitiva se implementa el método calcularPromedio, que tiene 3 parámetros nota1, nota2,
nota3. La definitiva se calcula mediante la expresión: prom=(nota1+nota2+nota2)/3;
Para obtener la valoración se construye el metodo obtenerValoracion, que recibe como parámetro una nota. La
valoración se emite teniendo en cuenta los siguientes criterios:
Rango Valoración
[0,3) Deficiente
[3,4) Aceptable
[4,4.5) Bueno
[4.5, 5] Excelente
52
A continuación se presenta un paralelo comparativo entre dos implementaciones del método obtener valoración. Se
sugiere utilizar la segunda, dado que consta de un único retorno. Una buena práctica de programación es usar un
único retorno por método, que se ubica como última instrucción del método [3].
Para obtener la cantidad de parciales ganados se implementa el método contarGanados, que tiene tres parámetros.
Cada uno de ellos corresponde a una nota parcial. Para determinar la cantidad de parciales ganados se declara un
contador y se plantean tres if, los cuales NO pueden ir anidados. Si se anidan solamente contarían una de las tres
notas. Finalmente se retorna el contador. La aplicación completa se presenta en el Programa 5.
/**
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
/**
* El metodo principal
* @param args Los argumentos de la linea de comando
*/
public static void main(String[] args) {
double nota1, nota2, nota3;
double notaDef;
String valoracion;
53
int resultado;
nota1 = leerDouble ("Ingrese la nota 1");
nota2 = leerDouble ("Ingrese la nota 2");
nota3 = leerDouble ("Ingrese la nota 1");
//Se valida que las tres notas sean correctas
if(isCorrecta(nota1)==true&&isCorrecta(nota2)==true&&isCorrecta(nota1)==true)
{
notaDef = calcularPromedio( nota1, nota2, nota3);
valoracion = obtenerValoracion(notaDef);
resultado=contarGanados(nota1, nota2, nota3);
imprimir("La nota definitiva es: "+notaDef+"\nLa nota es "+valoracion+"\nGano
"+resultado+ " parciales" );
}
else
{
imprimir("Ingreso valores incorrectos, Se aceptan notas de 0 a 5");
}
}
/**
* Calcula la nota promedio
* @param nota1 La nota 1, nota1>=0 &¬a1<=5
* @param nota2 La nota 2, nota2>=0 &¬a2<=5
* @param nota3 La nota 3, nota>=0 &¬a<=5
* @return La nota promedio
*/
public static double calcularPromedio(double nota1, double nota2, double nota3)
{
double prom;
prom=(nota1+nota2+nota2)/3;
return prom;
}
/**
* Obtiene la cantidad de parciales ganados
* @param nota1 La nota 1, nota1>=0 &¬a1<=5
* @param nota2 La nota 2, nota2>=0 &¬a2<=5
* @param nota3 La nota 3, nota>=0 &¬a<=5
* @return La cantidad de parciales ganados
*/
public static int contarGanados(double nota1, double nota2, double nota3)
{
int contador=0;
//No se pueden anidar
if(nota1>=3)
{contador++;}
if(nota2>=3)
{contador++;}
if(nota3>=3)
{contador++;}
return contador;
}
/**
* Se obtiene la valoracion de una nota
* @param nota La nota del estudiante, nota>=0 &¬a<=5
* @return La valoración
*/
public static String obtenerValoracion(double nota)
{
54
String valoracion;
if(nota>=0&¬a<3)
{
valoracion="Deficiente";
}
else
if(nota>=3&¬a<4)
{
valoracion="Aceptable";
}
else
if(nota>=4&¬a<4.5)
{
valoracion="Bueno";
}
else
{ valoracion="Excelente";}
return valoracion;
}
/**
* Verifica que la nota este en el rango indicado
* @param nota La nota ingresada por el usuario
* @return Un boolean, true si la nota es correcto
*/
public static boolean isCorrecta(double nota)
{
boolean centinela=true;
if(nota<0||nota>5)
{centinela=false;}
return centinela;
}
Ejecución
Ejemplo 6 El Minimercado
La siguiente aplicación maneja la información referente a un minimercado, que ha puesto en oferta cierto producto,
para ello ofrece un descuento del 13% si compra más de 3 docenas y de 10% en caso contrario. El minimercado
para cautivar a su clientela está dando un obsequio por cada docena en exceso sobre 3. Se calcula el monto a pagar
y el número de unidades de obsequio, para ello se pide como parámetro al número de docenas y al precio por
docena.
55
El diagrama de flujo ilustra el proceso a seguir para calcular el valor a pagar. Para ello se debe tener en cuenta la
cantidad de docenas y el precio por docena. Si la cantidad de docenas es mayor que 3, el descuento es del 13%,
de lo contrario es del 10%.
calcularValorApagar tiene como parámetros a numDocena y precioDocena. En este método en primer lugar se
calcula el descuento, para ello se evalúa si la cantidad de docenas es mayor que 3, en tal caso aplica un descuento
del 13%, de lo contrario del 10%. Posteriormente, mediante la precioPagar=precioPagar – descuento, se obtiene el
precio final a pagar.
El cálculo del obsequio, se realiza mediante el método calcularObsequio. Este método tiene como parámetro a
numDocena. La variable obsequio se inicializa en cero y mediante un if, se evalúa si la cantidad de docenas es
superior a 3, en tal caso, el obsequio se modifica mediante la expresión obsequio=numDocena-3. Finalmente se
retorna la variable obsequio. La aplicación completa se muestra en el Programa 6.
Programa 6 Minimercado
/**
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
/**
56
* Calcula el valor a pagar
* @param numDocena El numero de docenas compradas, numDocenas>=0
* @param precioDocena El precio de la docena, precioDocena>0
* @return El valor a pagar
*/
public static double calcularValorApagar (double numDocena, double precioDocena)
{
double precioPagar;
double descuento = 0;
precioPagar = numDocena*precioDocena;
if(numDocena > 3)
{
descuento=precioPagar*0.13;
}
else
{descuento=precioPagar*0.10;};
precioPagar=precioPagar - descuento;
return precioPagar;
}
/**
* Calcula el obsequio que se entregara por la compra
* @param numDocena La cantidad de docenas, numDocenas>=0
* @return El obsequio
*/
public static int calcularObsequio(int numDocena)
{
int obsequio=0;
if(numDocena>3)
{obsequio=numDocena-3;}
return obsequio;
}
Ejecución
57
2.2 Instrucción switch
La instrucción switch, permite elegir entre diferentes rutas, haciendo uso de una variable denominada selector. El
selector es comparado con una serie de constantes. En caso de que el selector coincida con alguno de ell os, se
efectua el bloque de instrucciones correspondiente a dicha constante. En caso de no coincidir con ninguno se efectua
la acción por defecto (default), si es que esta existe. Esta instruccion funciona con los tipos de dato primitivos byte,
short, int y char. Tambien con Strings, y las clases Byte, Short, Integer y Character. También funciona con tipos de
datos enumerados (que se construyen mediante Enum).
switch ( selector )
{
case constante1 : acción A1
break;
Cada uno de estos valores dentro del case “constante” debe ser único, es decir, no se pueden definir rangos.
Observe que se hace uso de la sentencia break, para romper, es decir, para que no continue con el siguiente caso
(salta fuera del switch).
Este ejemplo primero lee un numero entre 1 y 12 y mediante el uso de la instrucción de selección múltiple determina
a que estación correponde. Obserque que si el mes es 12,1 ó 2, la estación correspondiente es Invierno. Si el mes
es 3, 4, 5 la estación es primavera, si es 6, 7, 8 la estación es verano, si es 9,10, 11 la estación es otoño.
case 12:
case 1:
case 2: estacionAnio = "Invierno";
break;
/**
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
return centinela;
}
/**
* Dado el mes, obtiene la estacion del anio
* @param numeroMes El numero de mes, numero>0&&numero<13
* @return La estacion
*/
case 3:
case 4:
case 5: estacionAnio = "Primavera";
break;
case 6:
case 7:
case 8: estacionAnio = "Verano";
break;
case 9:
case 10:
case 11: estacionAnio = "Otoño";
break;
}
return estacionAnio;
}
Ejemplo 8 La calculadora
Esta calculadora realiza las cuatro operaciones básicas (suma, resta, multiplicación y división). El método
realizarCalculo se encarga de realizar la operación solicitada, haciendo uso de la instrucción switch. Este método
tiene 3 parametros, los dos primeros corresponden a los números con los que se desea realizar la operación (double
a y double b) y el último al operador. El operador (variable selector) puede tomar los valores de +, -, *, /. El retorno
es de tipo String dado que debe considerarse la división por cero. Si el divisor es cero (y por ende, centinela es
false), entonces la variable resultado se inicializa con el texto "DivByZero", de lo contrario, se inicializa con el
resultado de la operación realizada.
Programa 8 Calculadora
/**
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
if(centinela==false)
{resultado="DivByZero";}
else
{resultado=""+res;}
return resultado;
}
}
61
Ejecucion
1. Calcular el número de pulsaciones máximas que puede tener una persona luego de realizar ejercicio aeróbico;
la fórmula que se aplica cuando el sexo es femenino es:
cantPulsaciones = (225-edad)*0.85
Y si es masculino
cantPulsaciones = (210-edad) *0.85
2. Maluma cobra 2.000.000 por cada canción que interprete, pero ofrece un descuento de acuerdo al número de
canciones que interprete, el cual está dado por la siguiente tabla:
No. De canciones % de canciones
1-3 5%
4-10 10%
11-15 13%
16-en adelante 20%
3. Construya un programa que permita calcular el nuevo sueldo de un trabajador, teniendo en cuenta que si el sueldo
es inferior o igual a $760.000 tendrá un aumento de $50.000, si es mayor de esto pero inferior a 2.200.000 el
incremento será del 10% de lo que gana actualmente, de lo contario será del 8%.
4. Calcular el descuento pagado total por dos artículos. El descuento por artículo se obtiene de acuerdo a la siguiente
tabla.
Precio en miles Descuento
0-15 0%
Mas de 15 hasta 20 7%
Mas de 20 hasta 60 20%
Mas de 60 35%
6. Informa el lugar que visitará un turista, si se sabe el mes en el que desea viajar, la edad del turista, la cantidad de
días a permanecer en el territorio, y su presupuesto. El sitio asignado para el viaje depende de las estaciones, de la
disponibilidad para trabajar y de otras condiciones que se presentan a continuación:
-Si el mes en el que el turista desea viajar corresponde a Invierno, hay dos opciones de viaje: Turkia o Gran Bretaña
. Si su presupuesto es superior a 20 millones, el turista viajará a Gran Bretaña. Cuando el turista sea menor de
edad, sin importar su presupuesto, viajará a Turkia.
- Cuando el mes corresponda a Verano, el turista, que debe ser mayor de edad, viajará a Dubai, siempre y cuando
permanezca más de 10 días en el territorio y pueda trabajar como mínimo 5 días en Uber. De lo contrario irá a
Cancún.
62
- Si el mes de viaje corresponde a Otoño, el turista deberá tener edad entre 40 y 65 años, y un presu puesto de 10
millones.
- Si el mes es Primavera, y el turista no puede trabajar, pero su presupuesto es superior a 22 millones, irá a Japón.
- Si el turista no cumple con ninguna condición previa, deberá viajar a Perú.
7. Se desea crear una aplicación para informar el obsequio que recibirá una mujer en una tienda de ropa. Las
condiciones para la entrega del obsequio son las siguientes:
- Si tiene tarjeta Platinum, un acumulado de puntos superior a 20000, sus compras anuales son inferiores a
4.5 millones y tiene la tarjeta desde hace 2 o más años, se entregará un bolso.
- Si su tarjeta es platinum, el acumulado de puntos es inferior o igual a 20000 recibirá una cosmetiquera.
- Si su tarjeta de puntos es Gold, posee la tarjeta desde hace 2 o más años, tiene edad superior a 45 años y
acumulado de compras anuales superior a 10 millones, se le dará una pulsera.
- Si su tarjeta es Gold, su edad está entre 18 y 45 años y cumple años en el mes actual, se le regalará un
Brazalete.
- Si tiene alguna de las tarjetas, y no cumplió ninguna de las condiciones anteriores, y su promedio de compras
anuales es de 6 millones de pesos se le regalará una cosmetiquera.
- Si no tiene tarjeta pero su promedio de compras excede los 15 millones, se le regalará iphone 6s.
- Si no cumple ninguna de las condiciones anteriores no recibirá obsequio.
63
64
3. Estructuras repetitivas
Objetivos Pedagógicos
Al final de este nivel el lector estará en capacidad de:
65
66
3. Estructuras repetitivas
Java maneja tres tipos de estructuras repetitivas: for, while y do-while. Cada una de estas estructuras consta de 3
elementos: inicialización, decision (condición a evaluar) y cuerpo del bucle (si la evaluación de la condición da como
resultado verdadero, se repite el listado de instrucciones un cierto número de veces). Si luego de evaluar la condición
da como resultado false, el ciclo finaliza.
Una forma de controlar la ejecución del ciclo es haciendo uso contadores y acumuladores. Un contador, se
caracteriza por tener un incremento o decremento constante. La segunda, almacena valores variables, que son el
resultado de operaciones continuas.
La expresión de inicialización, se efectúa solamente una vez. Luego se examina la condición, y si es verdadera, se
efectúa el cuerpo del ciclo. En cada iteración, se evalúa de nuevo la condición y si es verdadera, se vuelve a repetir
el cuerpo del método. Si la expresión de control es falsa, finaliza el ciclo.
El ciclo while, el grupo de acciones se repite siempre y cuando se cumpla la condición indicada dentro de paréntesis
es decir, sea verdadera). Cuando se terminan de ejecutar las instrucciones dentro del while, se vuelve a evaluar la
condición, si da falso se finaliza la ejecución del ciclo.
//inicialización
while( condición )
{ //grupoDeAcciones
//modificacion de la variable de control
}
Esta estructura repetitiva permite que el cuerpo del ciclo se efectue como mínimo una vez, antes de evaluar la
condición de repetición.
Su sintaxis se presenta a continuación,
do
{
//grupoDeAcciones
} while( condición );
67
3.4 El depurador de Eclipse
El depurador de Eclipse permite ejecutar el código línea a línea, para verificar la aplicación en tiempo de ejecución.
Para ilustrar su uso se trabaja sobre el proyecto Sumatoria. Para ejecutar hacer uso del depurador es necesario abrir
las vistas BreakPoints, Debug, Expresion y Variables. Esto se logra dando clic en window>show view> other, tal
como se muestra a continuación:
68
Por cada línea que se desee verificar se agrega un BreakPoint, esto se hace dando doble clic a la izquierda de dicha
instrucción.
A continuación se procede a ejecutar el programa con el Debug, para ello de clic en la barra de menú principal y
seleccione Run – Debug.
69
La primera pantalla que aparece es:
70
Para continuar con la ejecución se puede elegir entre las siguientes opciones: línea por línea (tecla F5) o correr el
método completo (tecla F6). Para este ejemplo ser presiona sucesivamente F5. Observe que el método
calcularSumatoria empieza a ejecutarse y la variable sumatoria se inicializa en 0.
71
El valor de la sumatoria se inicia en 1.
72
Ahora el valor de la sumatoria es 6 y se va a dar un nuevo incremento de la i.
El valor de la i queda en 4.
La i incrementa y queda valiendo 5, como 5 no es menor que finaliza se termina la ejecución del for.
73
Observe que si se activa la pestaña expressions, podrá agregar variables o expresiones. Por ejemplo podría estar
interesado en comparar el valor de la sumatoria con otra variable o un valor.
Observa que cuando una variable cambia su valor, en la ventana de variables se verá de color amarillo (siempre y
cuando se haya presionado la tecla F7).
Esta aplicación se encarga de calcular la sumatoria de los números entre 1 y n. La sumatoria se implementa haciendo
uso de diferentes tipos de estructuras repetitivas. Los diagramas de flujo que se presentan a continuación ilustran el
uso de la estructura for , while y do-while, respectivamente.
74
En lo que respecta a la implementación en Java, mostrada en el Programa 9 , se contruye el método
calcularSumatoria. Este tiene un parámetro de tipo entero llamado finaliza, que indica hasta donde debe llegar la
sumatoria. El for se trabaja con la variable i, que toma valores entre 1 y finaliza. Si al evaluar la condición i<=finaliza,
da como resultado true, entonces, se acumula el valor de i, ello se logra mediante la instrucción
sumatoria=sumatoria+i;
Programa 9 Sumatoria
/**
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
import javax.swing.JOptionPane;
/**
* Programa para calcular la sumatoria desde 1 hasta n
*
* @author Sonia
*/
public class Sumatoria{
/**
* @param args Los argumentos de la linea de comando
*/
public static void main( String[] args ) {
int finaliza;
double sumatoria;
sumatoria=0;
if(finaliza>=1)
{
sumatoria=calcularSumatoria(finaliza);
imprimir( "La sumatoria es:\n" +sumatoria );
}
else
75
{
imprimir("El numero ingresado debe ser positivo");
}
/**
* Método para calcular la sumatoria desde 1 hasta n
* @param finaliza Final del intervalo, finaliza>0
* @return La sumatoria
*/
public static double calcularSumatoria( int finaliza )
{
double sumatoria;
sumatoria=0;
return sumatoria;
}
/**
* Método para leer un número entero
*
* @param pregunta Texto con un pregunta para el usuario
* @return Número entero como respuesta a la pregunta
*/
public static int leerEntero ( String pregunta )
{
return Integer.parseInt( JOptionPane.showInputDialog( pregunta ) );
}
/**
* Método para imprimir un texto en una ventana.
*
* @param texto Texto que se desea imprimir
*/
public static void imprimir( String texto )
{
JOptionPane.showMessageDialog( null, texto );
}
76
Ejemplo 10 Calcular una sumatoria.
Esta aplicación permite calcular una sumatoria de los primeros números enteros. Para poder cumplir con el requisito
funcional solicitado se implementa el método calcularSumatoria, que tiene el parámetro topeAcumulador. El ciclo se
efectúa mientras que la variable sumatoria es menor que topeAcumulador. Cuando el ciclo finaliza se devuelve el
valor de la sumatoria. El proceso efectuado se presenta en la prueba de escritorio siguiente:
package uniquindio.paradigma.serie.mundo;
import javax.swing.JOptionPane;
/**
* Programa que devuelve la Sumatoria de los primeros n numeros positivos, la
* sumatoria finaliza cuando la misma excede un valor ingresado por el usuario,
* Ejemplo: si el usuario ingresa 25, entoces sumará:
* 1+2=3
* 3+3=6
* 6+4=10
* 10+5=15
* 15+6=21
* 21+7=28. El valor de 28 excede 25 por lo tanto devuelve 28
*
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
*/
public class Sumatoria{
/**
* @param args Los argumentos de la linea de comando
*/
public static void main( String[] args ) {
int topeSumatoria;
double sumatoria;
sumatoria=0;
if(topeSumatoria>=1)
77
{
sumatoria=calcularSumatoria(topeSumatoria);
imprimir( "La sumatoria es:\n" +sumatoria );
}
else
{
imprimir("El numero ingresado debe ser positivo");
}
/**
* Método para calcular la sumatoria desde 1 hasta n
* @param topeAcumulador El tope del acumulador, topeAcumulador>0
* @return La sumatoria
*/
public static double calcularSumatoria( int topeAcumulador )
{
double sumatoria;
sumatoria=0;
/**
* Método para leer un número entero
*
* @param pregunta Texto con un pregunta para el usuario
* @return Número entero como respuesta a la pregunta
*/
public static int leerEntero ( String pregunta )
{
return Integer.parseInt( JOptionPane.showInputDialog( pregunta ) );
}
/**
* Método para imprimir un texto en una ventana.
*
* @param texto Texto que se desea imprimir
*/
public static void imprimir( String texto )
{
JOptionPane.showMessageDialog( null, texto );
}
}
78
Ejemplo 11 Mostrar los números enteros en el intervalo cerrado [inicio, finaliza]
Esta aplicación permite calcula la sumatoria de los números enteros del intevalo [inicio, finaliza]. La sumatoria se
calcula de tres formas diferentes: haciendo uso de while, for y do-while.
El primer método, generarSerieEnterosWhile, tiene dos parámetros inicio y finaliza. El ciclo se controla mediante la
variable i que toma el valor de inicio y deja de ejecutarse cuando la i excede el valor de la variable finaliza.
El método generarSerieEnterosFor, funciona de forma similar al método anterior, se declara la variable i, que toma
el valor de inicio y tiene como condición de salida i<=finaliza.
Finalmente, generarSerieEnterosDoWhile, evalua primero que inicio sea menor o igual que finaliza, esto evita que
se de un ciclo infinito (en caso de que los valores estén trocados). Si ambos valores llegan correctos, se ejecuta el
do-while. El cuerpo del ciclo se ejecuta almenos una vez.
Programa 11 Intervalo
import javax.swing.JOptionPane;
/**
* Programa que devuelve la representación en String de los los números enteros que se encuentran en un
intervalo cerrado [inicio, finaliza]
*
*
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
public class Serie {
/**
* @param args Los argumentos de la linea de comando
*/
public static void main( String[] args ) {
int inicio, finaliza;
String serie;
serie="";
inicio = leerEntero( "Ingrese el inicio del intervalo: " );
finaliza = leerEntero( "Ingrese el final del intervalo: " );
79
serie += "Resultado con do while \n";
imprimir( "La serie es:\n" + serie );
}
/**
* Método para generar la serie de números enteros en el intervalo cerrado[ inicio, final ]
* @param inicio Inicio del intervalo
* @param finaliza Final del intervalo
* @return La serie de números enteros
*/
public static String generarSerieEnterosWhile( int inicio, int finaliza )
{
String salida;
int i;
salida = "";
i = inicio;
return salida;
}
/**
* Método para generar la serie de números enteros en el intervalo cerrado[ inicio, final ]
* @param inicio Inicio del intervalo
* @param finaliza Final del intervalo
* @return La serie de números enteros
*/
public static String generarSerieEnterosFor( int inicio, int finaliza )
{
String salida;
salida = "";
return salida;
}
/**
* Método para generar la serie de números enteros en el intervalo cerrado[ inicio, final ]
* @param inicio Inicio del intervalo
* @param finaliza Final del intervalo
* @return La serie de números enteros
*/
public static String generarSerieEnterosDoWhile( int inicio, int finaliza )
{ int i;
String salida;
salida = "";
i= inicio;
80
//se verifica que inicio sea menor o igual que final, si da false, el ciclo no deberia efectuarse
if(inicio<=finaliza)
{
do{
salida += i + " ";
i++;
}while(i<=finaliza);
}//cierra if
return salida;
}
/**
* Método para leer un número entero
*
* @param pregunta Texto con un pregunta para el usuario
* @return Número entero como respuesta a la pregunta
*/
public static int leerEntero ( String pregunta )
{
return Integer.parseInt( JOptionPane.showInputDialog( pregunta ) );
}
/**
* Método para imprimir un texto en una ventana.
*
* @param texto Texto que se desea imprimir
*/
public static void imprimir( String texto )
{
JOptionPane.showMessageDialog( null, texto );
}
81
Esta aplicación permite mostrar los primeros n términos de la serie Fibonacci. En esta serie el siguiente término
corresponde a la suma de los dos anteriores. Por ejemplo, si el usuario ingresa 5 términos imprime 0 1 1 2 3.
El método implementado para resolver este requisito funcional se denomina calcularFibonacci y recibe como
parámetro n. Para generar la serie se hace uso de tres variables: anterior, siguiente y auxiliarSumaIntermedia. El
ciclo se ejecuta mientras que el contador de términos es menor que n. En tal caso, se almacena en suma intermedia
el valor de anterior+siguiente. Este auxiliar es importante, dado que la asignación es una operación destructiva, es
decir, luego de asignar un valor, el que tenía previamente desaparece. Para comprender este concepto observe la
siguiente tabla.
Incorrecto Correcto
while(contador<n) while(contador<n)
{ {
serie+= anterior+" "; serie+= anterior+" ";
anterior=siguiente; auxiliarSumaIntermedia=anterior+siguiente;
//la asignacion es destructiva anterior=siguiente;
siguiente=siguiente+anterior; siguiente=auxiliarSumaIntermedia;
contador++; contador++;
} }
0 0 1 0<5 (T) 0
0 0 1 1 0<5 (T) 0
1 1 1+1=2 1<5 (T) 01
1 1 1 2 1<5 (T) 01
2 2 4 2<5 (T) 012
2 1 2 3 2<5 (T) 011
3 4 8 3<5 (T) 0124
3 2 3 5 3<5 (T) 0112
4 8 16 4<5 (T) 0124 8
5 5<5 (F)
4 3 5 8 4<5 (T) 0112
3
5 5<5 (F)
Programa 12 Fibonacci
import javax.swing.JOptionPane;
/**
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
/**
* El método principal
* @param args Los argumentos de la línea de comandos
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
82
int n;
String serie;
if(n>0)
{
serie=calcularFibonacci(n);
imprimir("La serie Fibonacci es \n "+serie);
}
else
{
imprimir("Debe ingresar un valor mayor a 0");
}
/**
* Devuelve la representacion en String de la serie Fibonacci
* @param n La cantidad de terminos a visualizar, n>0
* @return La serie Fibonacci
*/
contador=0;
anterior=0;
siguiente=1;
auxiliarSumaIntermedia=0;
serie="";
while(contador<n)
{
serie+= anterior+" ";
auxiliarSumaIntermedia=anterior+siguiente;
anterior=siguiente;
siguiente=auxiliarSumaIntermedia;
contador++;
}
return serie;
/**
* Método para leer un número entero
*
* @param pregunta Texto con un pregunta para el usuario
* @return Número entero como respuesta a la pregunta
*/
public static int leerEntero ( String pregunta )
{
return Integer.parseInt( JOptionPane.showInputDialog( pregunta ) );
83
}
/**
* Método para imprimir un texto en una ventana.
*
* @param texto Texto que se desea imprimir
*/
public static void imprimir( String texto )
{
JOptionPane.showMessageDialog( null, texto );
}
Ejecución
Ejemplo 13 Factorial
Esta aplicación permite calcular el Factorial de un número. El factorial de un número se define como:
n! = ∏ i
i=1
La variable i se inicializa en n y va decrementado hasta llegar a 1. El cuerpo del ciclo se encarga de modificar el valor
del acumulador llamado factorial. Observe la similitud con ∏ni=1 i. El símbolo de productoria corresponde al for, que
va desde 1 a n (para ilustrar que el contador puede decrementar el for se hizo al contrario, es decir, desde n hasta
1). La expresión dentro de la productoria equivale a la instrucción factorial=factorial*i
84
Programa 13 Factorial
import javax.swing.JOptionPane;
/**
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
/**
* @param args Los argumentos de la linea de comando
*/
public static void main( String[] args ) {
double factorial;
int n;
n = leerEntero( "Ingrese n: " );
if(n>=0)
{
factorial=calcularFactorial(n);
imprimir( "El factorial es:\n" +factorial );
}
else
{
imprimir("El numero ingresado debe ser positivo o cero");
}
/**
* Permite calcular el factorial de un numero
* @param n El numero al que se le calcula factorial, n>=0
* @return El factorial del número
*/
public static double calcularFactorial(int n)
{
double factorial=1;
/**
* Método para leer un número entero
*
* @param pregunta Texto con un pregunta para el usuario
* @return Número entero como respuesta a la pregunta
*/
public static int leerEntero ( String pregunta )
85
{
return Integer.parseInt( JOptionPane.showInputDialog( pregunta ) );
}
/**
* Método para imprimir un texto en una ventana.
*
* @param texto Texto que se desea imprimir
*/
public static void imprimir( String texto )
{
JOptionPane.showMessageDialog( null, texto );
}
Para obtener los dígitos de un número en base diez, es necesario dividir sucesivamente por 10. Observe el siguiente
ejemplo, en este caso n=1234. La primera vez n=1234, luego se divide por 10, observe que el residuo es 4. A
continuación n se convierte en 123 (es decir en el cociente de la operación anterior) y se vuelve a dividir por 10, esto
de como residuo 3. Nuevamente n cambia su valor y se convierte en 12. Luego de dividir 12 por 10 se obtiene un
residuo de 2 y un cociente de 1. Para obtener cada uno de los dígitos se toman los residuos de abajo hacia arriba,
tal como lo muestra la flecha.
1234 10
4 123 10
3 12 10
2 1
El método devolverDigitos tiene como párametro un número entero. El ciclo while se efectúa mientras que el número
se puede dividir por 10, es decir, es mayor o igual a 10. El cuerpo del ciclo contempla concatenar el módulo de la
división (digito=numAuxiliar%10) y modificar el valor del número (numAuxiliar=numAuxiliar/10).
Programa 14 Base 10
import javax.swing.JOptionPane;
/**
* Programa para mostrar todos los digitos de un numero en base 10
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
public class Base10 {
/**
* El método principal
86
* @param args Los argumentos de la linea de comandos
*/
public static void main(String[] args) {
int numero;
String resultado;
/**
* Devuelve la representacion en String de un numero
* @param num El numero, num>0
* @return La representacion en String con los digitos del numero
*/
public static String devolverDigitos(int num)
{ int numAuxiliar=num;
String resultado;
int digito=0;
resultado="";
while(numAuxiliar>=10)
{
digito=numAuxiliar%10;
numAuxiliar=numAuxiliar/10;
resultado=digito+" "+resultado;
}
resultado=numAuxiliar+" "+resultado;
return resultado;
}
/**
* Método para leer un número entero
*
* @param pregunta Texto con un pregunta para el usuario
* @return Número entero como respuesta a la pregunta
*/
public static int leerEntero ( String pregunta )
{
return Integer.parseInt( JOptionPane.showInputDialog( pregunta ) );
}
/**
* Método para imprimir un texto en una ventana.
*
* @param texto Texto que se desea imprimir
*/
87
public static void imprimir( String texto )
{
JOptionPane.showMessageDialog( null, texto );
}
Esta aplicación permite crear un triángulo rectángulo, tal como se muestra a continuación:
Para ello el método generarTriangulo recibe como parámetro la cantidad de filas. El triángulo se construye fila por
fila. Se tiene entonces un for anidado, en donde el for externo se encarga de manejar la cantidad de filas y el interno,
la cantidad de asteriscos por fila. Observe que el for se efectúa mientras que j <= i,es decir, si la i vale 0 entonces el
for de la j va hasta 0 (se efectúa una vez, pone un solo asterisco). Si la i vale 1, el for de la j se efectúa para 0 y 1
(se efectúa dos veces, pone 2 asteriscos). Si la i vale 2, el for de la j se efectúa para 0, 1 y 2 (se efectúa tres veces,
pone 3 asteriscos).
return miTriangulo;
}
Cada vez que el valor de la i se incrementa y se cumpla la condición i < filas, se efectuará el for de la j (en este caso
particular siempre iniciará en j=0). Sólo hasta cuando se termina el for de la j se vuelve a incrementar i.
Programa 15 Triángulo
import javax.swing.JOptionPane;
/**
* Programa para generar un triángulo con asteriscos (*)
*
*
* @author Sonia, basado en código de Julián Esteban Gutiérrez
*/
public class Triangulo {
/**
* @param args the command line arguments
*/
public static void main( String[] args ) {
int filasTriangulo;
String miTriangulo;
/**
* Método obtiene la representacion en String de un triangulo
*
* @param filas altura del triangulo.
* @return La representacion en String de un triangulo.
*/
public static String generarTriangulo( int filas )
{
String miTriangulo;
miTriangulo = "";
return miTriangulo;
}
/**
* Método para imprimir un texto en una ventana.
*
* @param texto Texto que se desea imprimir
*/
public static void imprimir( String texto )
{
JOptionPane.showMessageDialog( null, texto );
}
/**
* Método para leer un número entero
*
* @param pregunta Texto con un pregunta para el usuario
* @return Número entero como respuesta a la pregunta
*/
public static int leerEntero ( String pregunta )
{
return Integer.parseInt( JOptionPane.showInputDialog( pregunta ) );
}
}
A diferencia del ejemplo anterior, esta aplicación debe trabajar los espacios antes de empezar a concatenar
asteriscos.
90
El método generarTriangulo recibe como parámetro la cantidad de filas. El triángulo se construye fila por fila. Se
crea un for anidado, en donde el for externo se encarga de manejar la cantidad de filas. Internamente se cuenta con
dos for. El primero maneja los espacios y el segundo, la cantidad de asteriscos por fila. Para manejar la cantidad
de espacios previamente se definen las siguientes variables:
int cantidadMaxima=filas*2-1;
int mitad=cantidadMaxima/2;
El for que maneja los espacios se efectúa mientras la condición j<mitad-i sea verdadera. En tal caso concatena
espacio (fila+=" "). Cuando la condición da falso, se efectúa el siguiente for (el que controla los asteriscos). Este
último se ejecuta mientras que j <= i,es decir, si la i vale 0 entonces el for de la j va hasta 0 (se efectúa una vez, pone
un solo asterisco). Si la i vale 1, el for de la j se efectúa para 0 y 1 (se efectúa dos veces, pone 2 asteriscos). Si la i
vale 2, el for de la j se efectúa para 0, 1 y 2 (se efectúa tres veces, pone 3 asteriscos).
Programa 16 Triángulo 2
/**
* Programa para generar un triángulo rectángulo por medio de del símbolo (*)
* de una altura especificada.
*
*
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean e imprimir
* son basados en el material del profesor Julián Esteban Gutierrez de la U.
* del Quindio
*/
public class Triangulo {
/**
* @param args the command line arguments
*/
public static void main( String[] args ) {
int filasTriangulo;
String miTriangulo;
/**
* Método obtiene la representacion en String de un triangulo
*
* @param filas altura del triangulo.
* @return La representacion en String de un triangulo.
*/
public static String generarTriangulo( int filas )
{
String miTriangulo;
miTriangulo ="";
int cantidadMaxima=filas*2-1;
int mitad=cantidadMaxima/2;
int totalAsteriscos=1;
String fila="";
/**se agregan la cantidad de espacios necesarios para que la fila inicie corrida,
* luego se agregan los asteriscos
* por ejemplo para la fila 0 se necesitan 6 espacios y 1 asterisco
* para la fila 2 se necesitan 5 espacios y 2 asterisco2
* para la fila 3 se necesitan 4 espacios y 3 asterisco2
*/
totalAsteriscos+=2;
return miTriangulo;
}
92
3.4 Taller estructuras repetitivas
4. Construya un algoritmo que dados dos números enteros, encuentre su cociente mediante restas sucesivas
13. Sumar los primeros n números primos. Hacer dos métodos (uno llamado isPrimo y otro llamado sumar)
15. Haga un programa que diga si un número es o no perfecto. Un número N es perfecto si la suma de sus divisores
(excluido el propio N) es N. por ejemplo 28 es perfecto, pues sus divisores (excluido el 28) son 1,2,4,7 y 14 su
suma da 28.
n=4
*
**
***
****
***
**
*
21. Construir un programa que visualice por pantalla todos los caracteres correspondientes a letras minúsculas.
94
95
4. Estructuras contenedoras
unidimensionales de tamaño
fijo
Objetivos Pedagógicos
Al final de este nivel el lector estará en capacidad de:
- Documentar programas y comprender la documentación hecha por otros para poder agregar
funcionalidades a una aplicación.
96
4. Estructuras contenedoras unidimensionales de tamaño fijo
Los arreglos son un tipo de estructura contenedora que permite almacenar elementos del mismo tipo. Para poder
hacer uso de este tipo de estructura, el arreglo primero debe declararse y luego se le debe reservar memoria
(haciendo uso del operador new). Esto se hace indicando el tipo de dato y el nombre.
int [] misEdades;
nombre
Tipo de
dato
para reservar memoria se debe utilizar el operador new tal como se muestra a continuación:
Los arreglos pueden tener más de una dimensión, cuando su dimensión es 2 se les conoce como matrices. Este
libro solo se enfoca en los arreglos unidimensionales.
Para poder desplazarse y obtener los elementos almacenados en dicha estructura, se requiere hacer uso de ciclos.
Cada uno de los elementos contenidos en la estructura se designan haciendo uso de un subíndice, que inicia en
cero. Por ejemplo si se tiene el arreglo misEdades el cual contiene 4 elementos, el primer elemento corresponderá
a misEdades [0], el segundo a misEdades [1], el tercero a misEdades [2] y finalmente el cuarto será misEdades
[3]. Esto permite concluir que para poder tener acceso a un elemento, se debe especificar el nombre e índice
respectivo.
En Java, cuando se declara un arreglo de un tipo de dato primitivo numérico, este automáticamente se inicializa con
ceros. Si es boolean, se inicializa con false. Debe tener precaución porque esto no ocurre en lenguajes como C++.
En tal caso será necesario hacer uso de una estructura repetitiva para fijar un valor por defecto, como se muestra a
continuación:
97
Si el arreglo es de Strings automáticamente se inicializa con null.
En Java se diferenciar dos áreas, Heap (Montículo) y Stack (Pila). La primera de ellas almacena información global
(instancias de las variables) y la segunda, almacena información de variables locales y retornos. La Figura 3 ilustra
el comportamiento de las estructuras contenedoras en las diferentes áreas de memoria 5.
Un patrón puede verse como una solución genérica para un problema. Para trabajar con estructuras contenedoras
se se plantean 3 diferentes patrones 6:
5
Basado en los ejemplos creados por el Julián Esteban Gutierrez, también docente de la Universidad del Quindío, presentes en su material de clase Introducción
a la Programación en Java2.
6
Estos patrones están descritos en el libro Fundamentos de Programación. Aprendizaje activo Basado en Casos de Jorge Villalobos y Rubby Casallas
98
La variable length, devuelve la longitud del vector. Observe que el índice va desde 0 hasta misSalarios.length-1.
Si el índice se encuentra por fuera de este rango se genera una excepción.
El recorrido se interrumpe cuando se cumple una condición. Un ejemplo de este tipo de patron se presenta a
continuación, en el que el ciclo deja de ejecutarse cuando se encuentra un salario superior a 5000000.
Se sugiere al lector evitar el uso de sentencias tales como break y continue para construir un recorrido parcial. Es
decir, sentencias que rompan el flujo secuencial de ejecución de la aplicación. La sentencia break, finaliza la
ejecución del ciclo y salta a la primera línea del programa que se debe ejecutar tras el ciclo. Por su parte, continue
finaliza la iteración actual y salta a la siguiente iteración de la estructura repetiva sin salir de ella [7]. En [3] se
desaconseja el uso de ambas, dado que existe la posibilidad de que el programador primero plantee el ciclo y luego
verifique rústicamente su funcionamiento mediante ensayo y error. La invitación a no usar estas instrucciones sugiere
entonces que es mejor pensar la condición o invariante para que el ciclo se ejecute (y no al contrario), y a
continuación crear el cuerpo del ciclo. Esta técnica hace mucho más legible el programa y facilita su posterior
verificación.
Con este patrón por cada uno de los elementos del arreglo se debe realizar un recorrido completo.
99
public int determinarMayorFrecuencia()
{
int edad, contador = 0, mayorFrecuencia = 0, guardaContador = 0;
Esta clase implementada en Java, facilita el trabajo con estructuras contenedoras. Algunos de sus métodos se
presentan a continuación.
Método Descripción
static boolean equals (int[ ] a,int[ ] a2) Devuelve true si los arreglos tienen los mismos
elementos, en el mismo orden
if(Arrays.equals(miArreglo1, miArreglo2))
static int[ ] copyOf (int[ ] original, int newLength); Copia el arreglo original (trunca o rellena para que el
resultado quede con el tamaño requerido).
static void fill (int[ ] a, int inicio, int final, int val) Arrays.fill(miArreglo1, 5);
/** /**
* Método para leer varios enteros y retornarlos en un * Método para leer varios numeros y retornarlos en un
arreglo arreglo
* *
* @param mensaje Mensaje mostrado al usuario * @param pregunta Texto que se muestra al usuario
* @param cantidad Cantidad de textos a ingresar * @param num Cantidad de elementos a leer
como respuesta * @return Arreglo con la informacion ingresada por el
* @return Arreglo con los textos ingresados como usuario
respuesta */
*/ public static double[] leerArregloDouble ( String
public static int[] leerArregloEnteros ( String mensaje, pregunta, int num )
int cantidad ) {
{ double arreglo[]= new double [ num ];
int i, enteros[]; for ( int i = 0 ; i < num ; i++ )
enteros = new int [ cantidad ]; {
for ( i = 0 ; i < cantidad ; i++ ) arreglo [ i ] = leerDouble( pregunta +
{ "( " + (i+1) + " de " + num + " )" );
enteros [ i ] = leerEntero( mensaje + }
"( " + (i+1) + " de " + cantidad + " )" ); return arreglo;
} }
return enteros;
}
/**
* Método que imprime varios enteros dados en un
arreglo
*
* @param cadenas Representación en String del
arreglo
*/
public static String devolverStringArreglo ( int[]
arreglo )
{
String salida;
salida = "[";
for ( int i = 0 ; i < arreglo.length ; i++ )
{
salida += arreglo[ i ] + " ";
}
salida +="]";
return ( salida );
}
Ejemplo 17 Dado un arreglo de Strings, crear uno nuevo en el que los elementos queden en orden inverso
El método leerVectorString permite ingresar cada uno de los elementos del vector de Strings, para ello requiere que
se le envíe como argumento el tamaño del arreglo.
El método invertir recibe el arreglo y se encarga, haciendo uso de un for, de ir llenando un arreglo auxiliar, que tiene
el mismo tamaño del arreglo ingresado por el usuario. El for recorre el arreglo original desde la última posición hasta
la posición 0.
A continuación se plantean dos posibles implementaciones del método invertir. La primera de ellas, hace uso
únicamente del índice i, mientras que la segunda utiliza un segundo índice llamado j.
7
Basado en el material de clase del profesor Julián Esteban Gutiérrez
101
La aplicación completa se presenta en el Programa 17.
public static String[] invertir ( String[] vector ) public static String[] invertir ( String[] vector )
{ {
String[] salida; String[] salida;
int i; int i;
salida = new String [ vector.length ]; salida = new String [ vector.length ];
for ( i = vector.length-1 ; i >=0 ; i-- ) int j=0;
{ for ( i = vector.length-1 ; i >=0 ; i-- )
salida [vector.length - 1 - i] = vector[ i ]; {
} salida [j] = vector[ i ];
return salida; j++;
} }
return salida;
}
Programa 17 Invertir
/**
* Programa que invierte un arreglo
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean, leerArregloDouble,
* leerArregloEnteros, leerArregloString e imprimir son basados en el material del profesor
* Julián Esteban Gutierrez de la U. del Quindio
*/
/**
* @param args los argumentos de la línea de comando
*/
public static void main ( String[] args ) {
int n;
String[] vector, inverso;
/**
* Método que recibe un arreglo de cadenas y retorna otro arreglo con los
* textos en orden inverso
*
* @param vector Arreglo de strings
* @return El arreglo en orden inverso.
*/
public static String[] invertir ( String[] vector )
102
{
String[] salida;
int i;
return salida;
}
/**
* Permite leer un numero entero mediante una caja de dialogo
* @param mensaje El mensaje que verá el usuario
* @return el numero ingresado por el usuario
*/
public static int leerEntero (String mensaje)
{
int dato= Integer.parseInt(JOptionPane.showInputDialog(mensaje));
return dato;
}
/**
* Permite imprimir un mensaje
* @param mensaje El mensaje a imprimir
*/
public static void imprimir (String mensaje)
{
JOptionPane.showMessageDialog(null,mensaje);
}
/**Imprime los elementos del vector
* @param arreglo
* @return Un string con la representacion del vector
*/
public static String imprimirVector ( String[] arreglo)
{
String salida="[";
String aux=", ";
}
salida+=" ]";
return salida ;
}
/**
* Permite leer un vector de Strings
* @param mensaje El mensaje que verá el usuario
* @return el vector de Strings
*/
public static String[] leerVectorString (String mensaje, int tam)
{
String dato;
103
String[] arreglo= new String[tam];
for ( int i = 0 ; i < arreglo.length ; i++ )
{
dato=JOptionPane.showInputDialog(mensaje+" "+i);
arreglo[ i ] = dato;
}
return arreglo;
}
Ejecución
Ejemplo 18 Promedio
El método calcularPromedio, recibe una arreglo y recorre cada una de sus posiciones mediante un for. A medida que
se va moviendo se acumula en la variable promedio el valor almacenado en cada posición. Luego de que el for
finaliza promedio se divide entre la cantidad de elementos del arreglo.
104
El método obtenerCantidadExcedePromedio, recibe un vector de tipo entero. El método inicia invocando el método
calcularPromedio. A continuación mediante una estructura repetitiva se recorre el vector y cada uno de los elementos
se compara con el promedio previamente calculado. Si es superior, se incrementa un contador. Finalmente, se
devuelve el valor del contador.
Programa 18 Promedio
import javax.swing.JOptionPane;
/**
* Programa que dado un vector con n elementos,
* informe la cantidad de elementos que exceden el promedio.
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean, leerArregloDouble,
* leerArregloEnteros, leerArregloString e imprimir son basados en el material del profesor
* Julián Esteban Gutierrez de la U. del Quindio
*/
/**
* @param args los argumentos de la linea de comandos
*/
public static void main( String[] args ) {
int cantidad;
double datos[];
double promedio;
int resultado;
/**
* Método que calcula el promedio de un arreglo
*
* @param arreglo Arreglo de números
* @return El promedio de los números contenidos en el arreglo
*/
public static double calcularPromedio ( double arreglo[] )
{
double promedio;
promedio = 0;
return promedio;
}
105
public static int obtenerCantidadExcedePromedio(double datos[])
{
int contador;
contador = 0;
double promedio= calcularPromedio ( datos );
return contador;
}
/**
* Permite leer un numero double mediante una caja de dialogo
* @param mensaje El mensaje que verá el usuario
* @return el numero ingresado por el usuario
*/
/**
* Permite leer un numero entero mediante una caja de dialogo
* @param mensaje El mensaje que verá el usuario
* @return el numero ingresado por el usuario
*/
public static int leerEntero (String mensaje)
{
int dato= Integer.parseInt(JOptionPane.showInputDialog(mensaje));
return dato;
}
/**
* Método para leer varios numeros y retornarlos en un arreglo
*
* @param pregunta Texto que se muestra al usuario
* @param num Cantidad de elementos a leer
* @return Arreglo con la informacion ingresada por el usuario
*/
public static double[] leerArregloDouble ( String pregunta, int num )
{
double arreglo[]= new double [ num ];
Ejecución
a. Obtener un nuevo vector con los elementos del arreglo origina que corresponden a la opción
elegida por el usuario (0 pares, 1 impares)
b. Concatenar dos arreglos
Para resolver el requisito funcional a, se implementa el método obtenerElementos, que tiene dos parámetros. El
primero de ellos, corresponde al vector de datos y el segundo, es la opción elegida por el usuario (0 pares, 1
impares). De acuedo a la opción ingresada, se calcula mediante el método obtenerCantidad, la cantidad de
elementos que tendrá el vector resultante y haciendo uso de un for se va llenando este vector.
107
Para el requisito funcional b, se construye el método concatenar, que tiene como parámetros a los dos arreglos que
se van a unir, dando como resultado un nuevo vector, que tendrá como tamaño la suma de las longitudes de los dos
vectores originales. Dentro del for se evalua si el índice i es menor que la longitud del arreglo1, en tal caso se copian
todos los elementos del arreglo1 al arregloResultante en la posición i. Si está condición no se cumple, es decir, i>=
arreglo1.length, se utiliza un índice auxiliar j para ubicar los elementos del segundo vector en el arregloResultante,
en la posición correcta.
Programa 19 Vector
/**
* @param args Los argumentos de la linea de comando
*/
public static void main( String[] args ) {
int cantidad, enteros[], pares[], impares[], resultado[];
/**
* Método para obtener sólo los números pares o impares de un arreglo de enteros, dependiendo
* de la variable opcion
*
* @param datos Arreglo con los datos
* @return Una parte del arreglo original que contiene los pares (opcion==0) o los impares (opcion==1)
*/
public static int[] obtenerElementos ( int[] datos, int opcion )
{
int elementos[], i, j, cantidad;
j = 0;
108
elementos = new int [ cantidad ];
if ( datos[ i ] % 2 == 0 &&opcion==0 )
{
elementos [ j ] = datos [ i ];
j++;
}
else
//Si la opcion es uno el dato debe ser impar
if (datos[ i ] % 2 != 0 &&opcion==1)
{
elementos [ j ] = datos [ i ];
j++;
}
}
return elementos;
}
/**
* Concatena dos arreglos, es decir, une dos arreglos
* @param arreglo1 El primer arreglo, arreglo1!=null
* @param arreglo2 El segundo arreglo, arreglo2!=null
* @return El resultado de la concatenacion
*/
int j = 0;
}
return arregloResultante;
}
/**
* Método que cuenta la cantidad de pares o impares que hay en un arreglo de enteros
*
* @param enteros Arreglo de números enteros
* @return La cantidad de números pares en el arreglo
*/
public static int obtenerCantidad ( int[] enteros, int opcion )
109
{
int cantidad=0;
else
if ( enteros[ i ] % 2 != 0 &&opcion==1)
{
cantidad++;
}
return cantidad;
}
/**
* Método para leer un número entero
*
* @param pregunta Texto con un pregunta para el usuario
* @return Número entero como respuesta a la pregunta
*/
public static int leerEntero ( String pregunta )
{
return Integer.parseInt( JOptionPane.showInputDialog( pregunta ) );
}
/**
* Método para imprimir un texto en una ventana.
*
* @param texto Texto que se desea imprimir
*/
public static void imprimir( String texto )
{
JOptionPane.showMessageDialog( null, texto );
}
/**
* Método para leer varios enteros y retornarlos en un arreglo
* @param mensaje Mensaje mostrado al usuario
* @param cantidad Cantidad de textos a ingresar como respuesta
* @return Arreglo con los textos ingresados como respuesta
*/
public static int[] leerArregloEnteros ( String mensaje, int cantidad )
{
int i, enteros[];
/**
* Método que imprime varios enteros dados en un arreglo
*
* @param cadenas Representación en String del arreglo
*/
public static String devolverStringArreglo ( int[] arreglo )
{
String salida;
salida = "[";
for ( int i = 0 ; i < arreglo.length ; i++ )
{
salida += arreglo[ i ] + " ";
}
salida +="]";
return ( salida );
}
}
Ejecución
111
Ejemplo 20 Eliminar el elemento del vector que está en la posición indicada
Esta aplicación solicita un vector a un usuario y una posición p, y crea un nuevo vector con todos los elementos,
excepto el que está en la posición p. El método eliminar, es el encargado, de implementar dicha funcionalidad, para
ello requiere dos parámetros, el arreglo y la posición. El proceso de eliminación se realiza haciendo uso de una
estructura repetitiva, en la que por cada iteración se verifica si el índice i es diferente de la posición que desea
eliminar el usuario, en tal caso se copia el elemento en un arreglo auxiliar. De lo contrario, no se efectúa ninguna
operación.
Programa 20 Eliminación
/**
* @param args the command line arguments
*/
public static void main( String[] args) {
int cantidad, arreglo[], resultante[], posicion;
/**
* Método para eliminar que esta en la posicion indicada por el usuario de un arreglo
112
*
*
* @param arreglo Arreglo de enteros
* @param posicion posicion del elemento a eliminar
* @return El arreglo sin el elemento
*/
public static int[] eliminar ( int[] arreglo, int posicion )
{
int resultante[]= new int [ arreglo.length - 1 ];
int j=0;
/*Se debe manejar un nuevo indice, j, porque el vector
resultante no se llena a la misma velocidad que se recorre
el arreglo original (hay una diferencia de un elemento entre ambos),
esto se refleja en la instruccion, resultante [ j ] = arreglo [ i ];
*/
return resultante;
}
/**
* Método para leer un número entero
*
* @param pregunta Texto con un pregunta para el usuario
* @return Número entero como respuesta a la pregunta
*/
public static int leerEntero ( String pregunta )
{
return Integer.parseInt( JOptionPane.showInputDialog( pregunta ) );
}
/**
* Método para imprimir un texto .
*
* @param texto Texto que se desea imprimir
*/
public static void imprimir( String texto )
{
JOptionPane.showMessageDialog( null, texto );
}
/**
* Método para leer varios enteros y retornarlos en un arreglo
*
* @param mensaje Mensaje mostrado al usuario
* @param cantidad Cantidad de textos a ingresar como respuesta
* @return Arreglo con los textos ingresados como respuesta
*/
113
public static int[] leerArregloEnteros ( String mensaje, int cantidad )
{
int i, enteros[];
return enteros;
}
}
Ejecución
114
Ejemplo 21 Conjuntos
Esta aplicación permite realizar operaciones entre 2 conjuntos. Se debe permitir:
Para hallar la unión se implementa previamente el método isContenido, que dado un vector y un String, devuelve
true si la cadena está contenida en alguna posición del vector.
El método hallarUnion tiene como parámetros a dos vectores de Strings. El primer paso que se realiza es copiar en
el vector resultante todos los elementos del primer vector. Luego, se recorre el segundo vector y, por cada uno de
sus elementos, se verifica que no este contenido en el vector resultante, si es así se agrega, de lo contrario se
descarta.
El método hallarInterseccion recorrre el conjunto1 y por cada uno de sus elementos verifica si está contenido en el
conjunto2, si es así, lo agrega al vector resultante. Esta operación requiere el uso de un índice (contador) que permita
almacenar el elemento en la posición correcta.
Programa 21 Conjuntos
import javax.swing.JOptionPane;
/**
* Dados dos conjuntos hallar la unión e intersección.
*
* @author sonia
* Los métodos leerDouble, leerEntero, leerChar, leerString, leerBoolean, leerArregloDouble,
* leerArregloEnteros, leerArregloString e imprimir son basados en el material del profesor
* Julián Esteban Gutierrez de la U. del Quindio
*/
/**
* @param args los argumentos de la linea de comandos
*/
public static void main( String[] args) {
String conjunto1[], conjunto2[], union[], interseccion[];
conjunto1 = leerString( "Ingrese los elementos del primer conjunto separados por coma").split(",");
conjunto2 = leerString( "Ingrese los elementos del segundo conjunto separados por coma ").split(",");
/**
115
* Halla la union de dos conjuntos
* @param conjunto1 El conjunto 1
* @param conjunto2 el conjunto 2
* @return La union de los dos conjuntos
*/
public static String[] hallarUnion(String conjunto1[], String conjunto2[])
{
String resultado[]=new String[conjunto1.length + conjunto2.length];
int contador = 0;
String dato = "";
}
//Se eliminan los espacios en null
resultado=Arrays.copyOf(resultado, contador);
return resultado;
}
/**
* Halla la interseccion de dos conjuntos
* @param conjunto1 El conjunto 1
* @param conjunto2 eE l conjunto 2
* @return La interseccion de los dos conjuntos
*/
public static String[] hallarInterseccion(String conjunto1[], String conjunto2[])
{
String resultado[];
int tamMaximo=conjunto1.length;
int contador = 0;
String dato = "";
return resultado;
}
/**
* Verifica si dato está contenido en el arreglo
* @param conjunto El arreglo de elementos
* @param dato El dato a buscar
* @return Un true si se encuentra en el arreglo, false en caso contrario
*/
return centinela;
}
/**
* Método para eliminar un elemento de un vector
*
* @param arreglo Arreglo de enteros
* @param posición Posición a eliminar
* @return Un nuevo arreglo sin el elemento de la posición dada
*/
public static int[] eliminarElemento ( int[] arreglo, int posicion )
{
int nuevoArreglo[]= new int [ arreglo.length - 1 ];
int j=0;
for ( int i = 0 ; i < arreglo.length ; i++ )
{
if ( i != posicion )
{
nuevoArreglo [ j ] = arreglo [ i ];
j++;
}
}
return nuevoArreglo;
}
117
/**
* Método para leer un número entero
*
* @param pregunta Texto con un pregunta para el usuario
* @return Número entero como respuesta a la pregunta
*/
public static int leerEntero ( String pregunta )
{
return Integer.parseInt( JOptionPane.showInputDialog( pregunta ) );
}
/**
* Método para imprimir un texto en una caja de dialogo.
*
* @param texto Texto que se desea mostrar
*/
public static void imprimir( String texto )
{
JOptionPane.showMessageDialog( null, texto );
}
/**
* Método para leer varios enteros y retornarlos en un arreglo
*
* @param mensaje Mensaje mostrado al usuario
* @param cantidad Cantidad de textos a ingresar como respuesta
* @return Arreglo con los textos ingresados como respuesta
*/
public static int[] leerArregloEnteros ( String mensaje, int cantidad )
{
int i, enteros[];
enteros = new int [ cantidad ];
for ( i = 0 ; i < cantidad ; i++ )
{
enteros [ i ] = leerEntero( mensaje + "( " + (i+1) + " de " + cantidad + " )" );
}
return enteros;
}
/**
* Método para leer un String
*
* @param mensaje El mensaje mostrado al usuario
* @return El texto ingresado
*/
public static String leerString ( String mensaje )
{
return JOptionPane.showInputDialog( mensaje );
}
}
118
Ejecución
Esta aplicación fusiona dos arreglos. El proceso seguido es el siguiente, el arreglo 1 se recorre de izquierda a
derecha y el arreglo 2 de derecha a izquierda. Ambos vectores deben tener la misma longitud. Por ejemplo, si se
tienen los siguientes arreglos:
arreglo1
1 2 3 4
arreglo2
5 6 7 8
1 8 2 7 3 6 4 5
El método fusionar tiene dos parámetros: arreglo1 y arreglo2. Para realizar la fusión se hace uso del índice i (que
permite recorrer el arreglo1) y del índice j (para recorrer el arreglo2). La variable j inicia en la última posición del
arreglo2. Por cada iteración del ciclo se almanenan dos valores en el vector resultado, mediante las instrucciones
resultado[contador] = arreglo1 [i] y resultado[contador] = arreglo2 [j]. Observe que mientras que la i incrementa,
la j decrementa.
119
Programa 22 Fusionar arreglos
/**
* @param args the command line arguments
*/
public static void main( String[] args) {
int arreglo1 [], arreglo2 [];
int cantidad;
int fusion [];
imprimir("Arreglo 1: \n"+Arrays.toString(arreglo1)+
"\nArreglo 2: \n"+Arrays.toString(arreglo2)+
"\nArreglo fusionado: \n"+Arrays.toString(fusion));
}
/**
* Se fusionan dos vectores, el arreglo 1 se recorre de izquierda a derecha
* y el arreglo 2 de derecha a izquierda
* @param arreglo1 El arreglo 1
* @param arreglo2 El arreglo 2
* @return El arreglo resultado de la fusion
*/
}
return resultado;
}
120
/**
* Método para leer varios enteros y retornarlos en un arreglo
*
* @param mensaje Mensaje mostrado al usuario
* @param cantidad Cantidad de textos a ingresar como respuesta
* @return Arreglo con los textos ingresados como respuesta
*/
public static int[] leerArregloEnteros ( String mensaje, int cantidad )
{
int i, enteros[];
enteros = new int [ cantidad ];
for ( i = 0 ; i < cantidad ; i++ )
{
enteros [ i ] = leerEntero( mensaje +
"( " + (i+1) + " de " + cantidad + " )" );
}
return enteros;
}
Ejecución
121
Ejemplo 23 Eliminar repeticiones de un arreglo
Esta aplicación solicita un vector al usuario y si tiene elementos repetidos deja solamente una ocurrencia. Ejemplo,
si se tiene el siguiente vector:
1 2 1 1 2 4 5 4 2
El resultado será:
1 2 4 5
El método eliminarRepetidos recibe un vector y crea uno nuevo con el mismo tamaño, llamado resultado. Mediante
una estructura repetitiva se recorre el vector original, y se obtienen uno a uno sus elementos. Por cada elemento,
se verifica si está contenido en el vector resultado. Si no está contenido, se almacena en la posición contador, del
vector resultado.
122
Programa 23 Repeticiones
/**
* @param args the command line arguments
*/
public static void main( String[] args) {
String datos[], datosSinRepeticiones[];
datos = leerString( "Ingrese los elementos del vector a examinar, separados por coma").split(",");
datosSinRepeticiones = eliminarRepetidos (datos);
/**
* Método para eliminar los elementos repetidos de un arreglo
* @param original El arreglo original
* @return El arreglo sin repeticiones
*/
public static String[] eliminarRepetidos (String [] original)
{
String resultado[]= new String[original.length];
String cadena = "";
int contador = 0;
return resultado;
/**
* Verifica si dato está contenido en el arreglo
* @param vector El arreglo de elementos
123
* @param dato El dato a buscar
* @return Un true si se encuentra en el arreglo, false en caso contrario
*/
return centinela;
}
/**
* Método para leer un String
*
* @param mensaje El mensaje mostrado al usuario
* @return El texto ingresado
*/
public static String leerString ( String mensaje )
{
return JOptionPane.showInputDialog( mensaje );
}
/**
* Método para imprimir un texto en una caja de dialogo
*
* @param mensaje Texto que se desea mostrar
*/
public static void imprimir( String mensaje)
{
JOptionPane.showMessageDialog( null, mensaje);
}
}
124
Ejemplo 24 Obtiene la cantidad de vocales en un String
Esta aplicación informa la cantidad de vocales que hay en un String 8. Para resolver este requisito funcional se
implementarán dos métodos, el primero de ellos, isVocal. Este método recibe un caracter (si está en minúscula lo
pasa a mayúscula) y lo compara con cada una de las vocales.
El método contar vocales,recorrre el vector de char y por cada vocal invoca al método isVocal, si éste último retorna
true, se incrementa el contador.Finalmente se retorna el valor del contador.
/**
* @param args Los argumentos de la linea de comandos
*/
public static void main( String[] args ) {
String nombre;
int cantidadVocales;
nombre = leerString( "Ingrese un nombre: ");
if(nombre!=null)
{
cantidadVocales=contarVocales(nombre);
imprimir("La cantidad de vocales es "+cantidadVocales);
}
else
{
imprimir("Ingrese un nombre valido");
}
}
/**
* Obtiene la cantidad de vocales en un String
* @param nombre Es el nombre ingresado por el usuario, nombre!=null
* @return La cantidad de vocales
*/
public static int contarVocales (String nombre)
{
int contador=0;
char arreglo[]= nombre.toCharArray();
8
Dado que el tema de operaciones sobre cadenas no está contemplado dentro del contenido del espacio académico de
Paradigma orientado a objetos de la universidad del Quindío, se seguirá la estrategia de pasar el String a un vector de char.
125
}
/**
* Recibe la letra
* @param letra Es la letra a verificar
* @return Un boolean, true si es vocal, false en caso contrario
*/
public static boolean isVocal(char letra)
{
boolean centinela=false;
if(letra>='a'&&letra<='z')
{ //se pasa a mayuscula
letra=(char) (letra-32);
}
if(letra=='A'||letra=='E'||letra=='I'||letra=='O'||letra=='U')
{
centinela=true;
}
return centinela;
}
/**
* Método para imprimir un texto en una ventana.
*
* @param texto Texto que se desea imprimir
*/
public static void imprimir( String texto )
{
JOptionPane.showMessageDialog( null, texto );
}
/**
* Método para leer un String
*
* @param mensaje El mensaje mostrado al usuario
* @return El texto ingresado
*/
public static String leerString ( String mensaje )
{
return JOptionPane.showInputDialog( mensaje );
}
2. Obtener el promedio de todos los números perfectos que hay en un arreglo. Un número es perfecto
cuando la suma de sus divisores propios es igual al mismo número. Ejemplo 6 es número perfecto,
porque sus divisores propios son 1, 2 y 3; y 6 = 1 + 2 + 3.
5. Leer dos vectores A y B, e indicar si el uno está contenido en otro en orden estricto inverso
Ejemplo A= 1,2,3,4,5,7 B=5,4,3 Debe indicar que B está contenido en A
6. Desarrollar un método que permita determinar los tres valores que más se repiten en un
vector de n elementos enteros.
Para los siguientes puntos no use métodos de la clase String. En su lugar convierta el String en una cadena de
caracteres, para ello use toCharArray.
7. Dado un arreglo de Strings de n elementos, y un String k, genere un segundo arreglo con todas las posiciones
en donde el String k (o el String en orden inverso) está almacenado en el primer arreglo 9.
k = “hola”
0 1 2 3 4 5
1 2 4
8. Leer un arreglo de Strings y suprimir todas las consonantes de cada de unas palabras contenidas.
9. Dado un arreglo de Strings de n elementos, genere e imprima un nuevo arreglo con los elementos en orden
descendente. Para resolver este punto, investigue e implemente un método de ordenamiento llamado “Burbuja”.
No puede usar la clase Arrays.
10. Dado un String, crear uno nuevo que contenga primero las vocales y luego las consonantes.
Ejemplo: “ensayo”
eaonsy
11. Leer un arreglo de Strings y una cadena. Informar la posición dentro del arreglo del String que contenga más
veces la cadena leída.
Cadena= hola
Arreglo= mariahola, holaholahola, pepehola, rolaholaholahola
Posición = 3
9
Enunciado basado parcialmente en material del profesor Julián Esteban Gutiérrez
127
128
Índice
Análisis, 11 long, 13
argumento, 37 método, 36
Arrays, 100 montículo, 15
arreglos, 97 new, 97
byte, 13 objeto, 15
bytecode, 11 operador decremental, 18
casting, 26 operador incremental, 18
clase, 15 Operadores aritméticos, 18
clases envoltorio, 15 Operadores lógicos, 27
Constantes, 15 Operadores relacionales, 28
contrato de un método, 38 parámetros, 36
depurador, 68 Patrón de doble recorrido, 99
diseño, 11 Patrón de Recorrido Parcial, 99
do while, 67 Patrón de recorrido Total, 98
double, 13 pila, 15
Estructuras repetitivas, 67 prioridad de operadores, 19
excepción, 38 requisitos funcionales, 11
expresión, 18 requisitos no funcionales, 11
float, 13 short, 13
for, 67 stack, 15
heap, 15 String, 16
identificador, 12, 17, 36 switch, 58
if, 49 Tipos de datos por referencia, 15
implementación, 11 Tipos de datos primitivos, 13
int, 13 while, 67
129
130
Referencias
[3] P. Sánchez, «Consejos y Buenas Prácticas en Programación,» 2010. [En línea]. Available:
http://personales.unican.es/sanchezbp/teaching/faqs/programming.html.
[4] The JUnit Team, «JUnit 5,» 2017. [En línea]. Available: http://junit.org/junit5/.
[5] Microsoft, «Tipos de referencia y de valor,» 2017. [En línea]. Available: https://msdn.microsoft.com/es-
co/library/4d43ts61(v=vs.90).aspx.
[6] Disfruta Las Matemáticas.com, «Sectores y segmentos de círculos,» 2011. [En línea]. Available:
http://www.disfrutalasmatematicas.com/geometria/circulos-sectores-segmentos.html.
[7] Rekkeb Blog, «Curiosidades Java: Break y Continue,» 2009. [En línea]. Available:
https://rekkeb.wordpress.com/2009/04/11/curiosidades-java-break-y-continue/.
[9] ARNOW, David y WEISS, Gerald. Introducción a la programación con Java. Edición 3ª Madrid:
Addison Wesley, 2001.
[10] SCHILDT, Herbert. Fundamentos de programación en Java 2. Edición 1ª. Bogotá: McGraw-Hill,
2001.
[11]SCHILDT, Herbert. Java 2 manual de referencia. Cuarta Edición. Madrid: McGrawHill, 2001.
[12] SCHILDT, Herbert. Java 2 the complete reference. Fourth Edition. Berkeley: McGraw-Hill, 2001.
[13] WEISS, Mark. Estructuras de datos en Java. Edicion 1ª Adison Wessley 2000
[14] NAUGTHTON, Patrick. Java Manual de Referencia. Edicion 2ª McGraw- Hill 1997
[15] DEITEL, Paul J. y DEITEL, Harvey M. Como programar en Java 7ª edición. Pearson Education,
México 2008.
[16] DEITEL, Paul J. y DEITEL, Harvey M. Java how to program 9ª. Prentice Hall, 2012.
[17]HORSTMANN, Cay. Java concepts 5ª. John Wiley & Sons, Inc.
[18]ECKEL, Bruce. Piensa en Java 4ª. Pearson Education S.A. Madrid 2007.
131
132
ANEXO 1. Tabla de códigos UNICODE
Tabla tomada de [2]
133
134
ANEXO 2. PSeInt
PSeInt es una herramienta para crear pseudocodigo y diagramas de flujo creada por Pablo Novara. Para su uso,
descargue el instalador de la dirección resaltada en el siguiente gráfico.
Cuando este proceso finalice, ingrese al PSeInt e de clic en opciones del lenguaje y luego en Personalizar.
Active la opción “permitir asignar con el signo igual (=)” y “controlar el uso de ; al final de las sentencias
secuenciales“ y desactive obligar a definir los tipos de variables
135
PSeInt permite hacer uso de comando graficos. Se destacan los comandos Escribir, Leer y Asignar. Escribir sirve
para mostrar (imprimir) el resultado de una operación. Por ejemplo si se tienen dos números, se calcula una suma
y se quiere mostrar el resultado. También sirve para mostrar un mensaje cualquiera, por ejemplo un saludo. El
comando leer permite inicializar una variable con los datos dados por el usuario. El proceso de lectura se efectúa
cuando el usuario debe ingresar datos para realizar una operación. Por ejemplo, si se quieren sumar dos números a
y b, el usuario debe ingresar “a”, luego ingresar “b” para luego sí poder hacer el cálculo. El comando asignar permite
cambiar el valor de una variable. La lectura es una operación de entrada (pues se le piden datos al usuario) y la
escritura es una operación de salida (se le muestra información al usuario).
136
Según se define en la ayuda del PSeInt, esta aplicación cuenta con los siguientes operadores:
Para crear una primera aplicación en PSeInt de clic en File Nuevo. Asigne nombre a la aplicación, en este caso
se le da el nombre de programa_1
137
Algoritmo Programa_1
a = 9;
b = 6;
resultado = a ^ (1/2.0);
resultado2 = b ^ (1/2.0);
Escribir resultado;
Escribir resultado2;
FinAlgoritmo
138
Convertir de metros a centímetros
139
En países de habla inglesa la estatura se expresa en pies y pulgadas, por ejemplo 3’ 2”. Construya un algoritmo
para convertir a metros. 1 pie= 12 pulgadas, 1 pulgada=2.54 cm, 1m=100 cm
140
Una función es un conjunto de instrucciones que permiten resolver un problema particular. Está compuesto por un
retorno, un nombre y unos parámetros.
A continuación se presentan algunos ejemplos de aplicaciones que hacen uso de subprocesos o funciones.
141
Convertir de fahr a centígrados
142
Calcular sumatoria de 1 a n
Calcula el factorial
143
144
ANEXO 3. Instalación de Eclipse
1) Digite en su navegador Oracle jdk y de clic en buscar.Elija Java SE Development Kit Downloads Oracle
2. A continuación acepte los términos de la licencia y elija la versión para Windows de 64 bits (o la requerida por su
equipo)
2. Luego de que descargue, de clic en ejecutar. A continuación de clic en siguiente (varias veces hasta finalizar
el proceso de instalación).
145
3. Ingrese a la siguiente dirección: https://eclipse.org/downloads/ De clic sobre Get Eclipse Neon -64 bits
146
4. Seleccione Download. Luego de que el archivo se ha descargado, ejecute el instalador
147
8. La siguiente pantalla será desplegada. Seleccione: eclipse IDE for Java Developers
9. De clic en Instalar.
148
10. Eclipse quedará instalado en la ruta mostrada en la captura de pantalla anterior. De clic en Launch
11. Ahora se agrega el WindowBuilder, para facilitar la creación de interfaces gráficas. Para ello de clic en Help-
> Install New Software
149
12. Agregue la ruta siguiente ruta en Work with: http://download.eclipse.org/windowbuilder/WB/integration/4.6/
De clic en Add (Recuerde poner nombre le nombre al repositorio WindowBuilder) y active la casilla
WindowBuilder.
15. De clic en OK
151
152
153