Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Corrección de estilo:
Mónica Barrera Velasco
Milton A. Gonzales M.
Diagramación:
Lizbeth Eufracio Quispe
SebasƟan Alvarez Sanchez
Impresión
Talleres gráficos de la Empresa Editora Macro EIRL
Jr. San Agusơn N.° 612-624, Surquillo, Lima, Perú
Prohibida la reproducción parcial o total, por cualquier medio o método, de este libro sin
previa autorización de la Empresa Editora Macro EIRL.
Juan José Flores Cueto
Ingeniero de Computación y Sistemas, magister en Administración con mención en Gerencia Estratégica de
Organización; doctor en Educación por la Universidad de San Martín de Porres (USMP). Además, obtuvo el título
de Especialista y el Diploma de Estudios Avanzados (DEA) en Integración de las Tecnologías de la Información en
las Organizaciones (ITIO), por la Universidad Politécnica de Valencia (UPV), España. Actualmente, es doctorando
del Programa ITIO de la UPV.
Es autor de diversos libros, como guías y manuales, los cuales se utilizan para la enseñanza universitaria. También
ha colaborado con artículos para revistas nacionales e internacionales, y ha participado en diversos congresos.
La página personal del autor es: h p://jjflorescueto.googlepages.com/. Y sus publicaciones se pueden encontrar
en: h p://www.lulu.com/spotlight/jjflorescueto, y en la red: h p://www.reddolac.org
Carmen Bertoloƫ Zuñiga
Ingeniera de Computación y Sistemas, egresada de la Universidad de San Martín de Porres (USMP).
Con estudios finalizados en la maestría en Educación con mención en Informática y Tecnología, en la
USMP. Se desempeña como docente contratada en la Facultad de Ingeniería y Arquitectura (FIA), de la
USMP, así como en otras instituciones educativas.
Es autora del libro Método de las 6’D. Modelamiento - Algoritmo - Programación. (Enfoque orientado a
las estructuras lógicas). 2da. ed. Lima: Fondo Editorial USMP, 2008. También ha escrito diversos artículos
en el boletín electrónico InfoFIA de la FIA USMP; además, es autora de guías y manuales utilizados en el
quehacer universitario. Ha laborado en diversas empresas del sector privado, desempeñándose como
ingeniera de desarrollo y jefe de sistemas.
Dedicatoria
Capítulo 1
Método y herramientas .......................................................................................................................... 13
1.1 Método de las 6’D ...........................................................................................................15
1.1.1 Etapas y pasos ..........................................................................................................16
1.1.2 Resumen de método ................................................................................................23
1.1.3 Resultado de las etapas del método ........................................................................24
1.2 Marco de trabajo .............................................................................................................25
1.3 Modelamiento .................................................................................................................26
1.3.1 Paquete ...................................................................................................................26
1.3.2 Clase .........................................................................................................................26
1.3.3 Objeto ......................................................................................................................27
1.3.4 Diagrama de paquetes .............................................................................................28
1.4 Algoritmo..........................................................................................................................29
1.4.1 Características ..........................................................................................................29
1.4.2 Herramientas ...........................................................................................................30
1.5 Programación ..................................................................................................................39
1.5.1 Tipos de lenguajes de programación .......................................................................40
Capítulo 2
Estructuras lógicas de secuencia y estructura de datos variable ........................................................... 41
2.1 Estructuras lógicas de secuencia .....................................................................................45
2.1.1 Definición .................................................................................................................45
2.2 Método de las 6´D - Desarrollo de soluciones con un paquete .......................................46
2.3 Estructuras lógicas de secuencia: Mostrar información ..................................................47
2.3.1 Definición .................................................................................................................47
2.3.2 Representación ........................................................................................................47
2.3.3 Consideraciones adicionales para los lenguajes de programación C++ y Java .........49
2.4 Estructura de datos: Variable ..........................................................................................60
2.4.1 Definición .................................................................................................................60
2.4.2 Declaración ..............................................................................................................60
2.4.3 Nombre ....................................................................................................................60
2.4.4 Inicialización .............................................................................................................61
2.4.5 Almacenamiento o asignación de datos ..................................................................61
2.4.6 Constantes ...............................................................................................................62
2.5 Tipos de dato ...................................................................................................................62
2.5.1 Definición .................................................................................................................62
2.5.2 En pseudocódigo y diagrama de flujo ......................................................................63
2.5.3 En lenguaje C++........................................................................................................64
2.5.4 En lenguaje Java .......................................................................................................65
2.6 Uso de comentarios .........................................................................................................75
2.7 Estructura lógica de secuencia: Ingresar datos................................................................80
2.7.1 Definición .................................................................................................................80
2.7.2 Representación ........................................................................................................80
2.8 Estructura lógica de secuencia: Procesar datos................................................................91
2.8.1 Definición .................................................................................................................91
2.8.2 Tipos.........................................................................................................................91
2.9 Método de las 6`D - Desarrollo de soluciones con dos paquetes ....................................100
2.10 Desarrollo de Aplicaciones Java, utilizando Java Development Kit (JDK ) ......................126
2.10.1 Edición....................................................................................................................126
2.10.2 Compilación ...........................................................................................................126
2.10.3 Ejecución ................................................................................................................126
2.11 Soluciones utilizando cuadros de diálogo......................................................................128
2.11.1 Uso de la clase LE codificada en Java .....................................................................128
2.11.2 Método de las 6´D - Uso de cuadros de diálogo ....................................................129
Capítulo 3
Estructuras lógicas de decisión o selección ............................................................................................ 143
3.1 Desarrollo de soluciones con un paquete .......................................................................147
3.2 Estructuras lógicas de decisión ........................................................................................147
3.2.1 Definición .................................................................................................................147
3.2.2 Estructura lógica de decisión simple ........................................................................148
3.2.3 Estructura lógica de decisión doble .........................................................................167
3.2.4 Estructura lógica de decisión múltiple: “CUANDO” .................................................184
3.2.5 Estructura lógica de decisión múltiple: “SI ANIDADOS” ..........................................208
3.3 Uso combinado de las estructuras lógicas de decisión....................................................237
3.4 Uso anidado de las estructuras lógicas de decisión.........................................................237
3.5 Desarrollo de aplicaciones Java, utilizando Integrated Development Environment (IDE) .. 257
3.6 Método de las 6´D - Uso de cuadros de diálogo ..............................................................259
Capítulo 4
Estructuras lógicas de control o repeƟción ............................................................................................ 281
4.1 Método de las 6’D - Desarrollo de soluciones con dos paquetes ...................................285
4.2 Estructuras lógicas de repetición .....................................................................................286
4.2.1 Otros usos de las variables .......................................................................................287
4.2.2 Estructura lógica de repetición: “HACER” ................................................................287
4.2.4 Estructura lógica de repetición: “MIENTRAS” ..........................................................348
4.2.5 Estructura lógica de repetición: “DESDE” o “PARA” .................................................378
4.3 Empaquetar aplicaciones Java utilizando Java ARchives ( JAR ).......................................409
4.3.1 Creación de un JAR...................................................................................................409
4.3.2 Ejecución de un JAR .................................................................................................411
4.3.3 Visualizar un JAR ......................................................................................................412
4.3.4 Extracción de un JAR ................................................................................................413
4.4 SoŌware para decompilar aplicaciones java ...................................................................415
4.4.1 Uso de javap del JDK ................................................................................................415
4.4.2 Uso de otros soŌware ..............................................................................................416
4.5 Método de las 6´D - Uso de cuadros de diálogo ..............................................................418
Capítulo 5
Estructuras lógicas combinadas .............................................................................................................. 435
5.1 Uso combinado de las estructuras lógicas ......................................................................439
5.2 Manejo de excepciones en el lenguaje de programación Java ........................................522
5.3 Desarrollo de las capacidades lógicas..............................................................................530
5.4 Desarrollo de miniaplicaciones Java (Applet) utilizando Java Development Kit ( JDK ) ...557
5.5 Métodos de las 6´D – Uso de cuadros de diálogo ...........................................................559
Capítulo 6
Introducción al desarrollo de soluciones orientadas a objetos y al uso de Interfaz Gráfica de
Usuario .................................................................................................................................................... 583
6.1 Conceptos básicos ...........................................................................................................588
6.1.1 Clase .........................................................................................................................588
6.1.2 Objeto (Modelos de entes del mundo) ...................................................................589
6.1.3 Atributo ....................................................................................................................590
6.1.4 Método ....................................................................................................................595
6.2 Método de las 6’D: Redefinición de pasos ......................................................................608
6.2.1 Ajuste de los pasos definidos para las etapas del método .......................................608
6.3 SoŌware para generar ejecutables en MS-Windows basado en aplicaciones Java ........615
6.3.1 Uso de soŌware ......................................................................................................615
6.4 Introducción a las soluciones utilizando Interfaz Gráfica de Usuario (GUI) .....................618
6.4.1 Introducción .............................................................................................................618
6.4.2 Definición .................................................................................................................618
6.4.3 Etapas para el desarrollo de GUI ..............................................................................618
6.4.4 Contenedores y componentes de la GUI..................................................................619
6.4.5 Administradores de diseño de la GUI.......................................................................620
6.4.6 Manejadores de evento de la GUI ...........................................................................620
6.5 Método de las 6´D – Desarrollo de soluciones con GUI ..................................................621
Se tratan las Estructuras Lógicas de Secuencia (ELS), las variables, las Estructuras Lógicas de Decisión
(ELD), las Estructuras Lógicas de Repetición (ELR) y las Estructuras Lógicas Combinadas (ELC).
También se tratan las estructuras de bifurcación y el manejo de excepciones en Java (try, catch), y
se finaliza con una introducción al desarrollo de soluciones orientadas a objetos y al uso de Interfaz
Gráfica de Usuario (GUI) en los programas Java.
La estructura de los capítulos y su relación directa con los problemas propuestos al final de cada
uno de ellos, y la gran cantidad de soluciones desarrolladas (250 en total), en las cuales se incluyen
75 pseudocódigos, 59 diagramas de Flujo, 6 diagramas de actividad, 76 programas en C++, 217
problemas en Java utilizando la consola y 23 programas en Java utilizando cuadros de diálogo,
garantizan un aprendizaje progresivo y adecuado de cada uno de los temas tratados.
Finalmente, se incluye una sección llamada PUNTO A PARTE, que permitirá al lector conocer
nuevas herramientas de software gratuitas que complementarán sus conocimientos y le ayudarán a
desarrollar mejores aplicaciones en Java. Los temas incluidos son:
M é to d o y h e r r a m i e n t a s
1
CAP. 1: M ÉTODO Y HERRAMIENTAS 15
Durante el transcurso de nuestra vida nos enfrentamos a diversos problemas. Algunos de ellos
podemos solucionarlos fácilmente, mientras que otros se complican de tal forma que nos afectan de
una manera muy profunda.
Por su naturaleza, algunos problemas pueden ser resueltos utilizando una computadora. Generalmente
son de tipo estructurado; es decir, que tienen una solución determinada y pueden llegar a ser muy
sencillos o extremadamente complejos. Para resolver estos problemas estructurados utilizando una
computadora, es importante aplicar un método fácil de comprender y que guíe paso a paso hasta la
solución del problema.
El método propuesto y utilizado en el presente texto es el Método de las 6’D. Está compuesto de
seis etapas, cada una de las cuales consta de una serie de pasos que se van modificando o ajustando,
dependiendo del grado de complejidad del problema y las herramientas que se utilicen para su
solución.
Con la finalidad de recordar el método, se ha establecido que el nombre de cada una de sus seis etapas
comience con la letra “D”.
Etapa 01
Descripción
del problema
Etapa 02
Definición
Solución n veces Ingeniería
reversa
Etapa 03
Diseño
Solución
Etapa 04
Desarrollo
Solución
MODELAMIENTO Etapa 05
ALGORITMO Depuración
Pruebas
Etapa 06
CODIFICACIÓN
N Documento
16 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Etapa 01
Lo primero que se debe hacer en esta
Descripción etapa es identificar cuál es el problema que
del problema se desea resolver. Esto que parece algo
sumamente sencillo, muchas veces resulta
una tarea agotadora, ya que existen muchas
opiniones acerca de cuál es el problema
central. Identificarlo es una de las tareas más
importantes que los analistas deben afrontar.
Pasos:
}|Identificacióndel problema.
}|Descripcióngeneral del problema.
}|Enunciado claro y preciso del problema.
ENUNCIADO
El resultado obtenido en esta etapa es un enunciado claro del problema que se desea solucionar.
CAP. 1: M ÉTODO Y HERRAMIENTAS 17
Etapa 02
En esta etapa es necesario estudiar a fondo
Definición el problema para poder solucionarlo, saber
de la solución exactamente en qué consiste y descomponerlo
en cada una de sus partes, facilitando su
comprensión y posterior solución. Esta es una
regla que siempre debe ser aplicada, se utilice
o no una computadora en la solución de un
problema.
Pasos:
ESPECIFICACIONES
En esta etapa se obtienen las especificaciones, que determinan lo que se debe hacer para solucionar
el problema.
18 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Etapa 03
Una vez definida la solución se procederá a
Diseño diseñar la lógica, modelando y desarrollando
de la solución algoritmos.
Pasos:
DIAGRAMAS Y
ALGORITMOS
El resultado obtenido en esta etapa son los diagramas y los algoritmos, que especifican cómo se
debe hacer para solucionar el problema.
CAP. 1: M ÉTODO Y HERRAMIENTAS 19
Etapa 04
Una vez previstas todas las posibilidades y
Desarrollo alternativas que puedan presentarse y que
de la solución pasen sin inconvenientes por la clase y los
algoritmos, se procederá a la codificación del
problema en algún lenguaje de programación.
Pasos:
PROGRAMAS
El resultado obtenido en esta etapa son los programas y/o clases codificados en un lenguaje de
programación, que permiten solucionar el problema.
20 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Etapa 05
Luego que se codifiquen los programas y/o
Depuración y clases, deberán ser probados mediante su
pruebas ejecución (esta acción se conoce como corrida
del programa). Al realizarse pueden surgir
diferentes tipos de errores, siendo los de lógica
y sintaxis los más comunes.
Pasos:
PRUEBAS
El resultado obtenido en esta etapa son las pruebas, que registran el adecuado funcionamiento de la
solución del problema.
CAP. 1: M ÉTODO Y HERRAMIENTAS 21
Etapa 06
En esta etapa se recopila toda la documentación
Documentación generada en las etapas anteriores, la cual
servirá como base para la elaboración del
manual técnico.
}|Descripcióndel problema.
}|Resultados esperados y datos necesarios
para generar dichos resultados.
}|Diagramas UML, DF y/o pseudocódigo.
}|Pruebas desarrolladas.
Pasos:
MANUALES
El resultado obtenido en esta etapa son los manuales, que permiten un adecuado manejo de la
solución desarrollada.
22 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Adicionalmente, es posible realizar ingeniería reversa entre las etapas 03, 04 y 05.
Pasos:
Etapa 05
}|Exportar proyecto (archivos class o
Depuración y Java) al disco de la PC, si está trabajando
pruebas con un IDE.
}|Importar proyecto (archivos class o
Java) a una herramienta CASE y realizar
la ingeniería reversa.
MODELAMIENTO
}|Organizar el modelo obtenido en la
ALGORITMO herramienta CASE.
CODIFICACIÓN
DIAGRAMAS
ACTUALIZADOS
Etapa 01 Etapa 02 Etapa 03 Etapa 04 Etapa 05 Etapa 06
problema. datos que se diagramas, internos en los escritura de los }|Generar el manual
para
transformarlos
en información.
Y HERRAMIENTAS
23
24
Diagramas
Enunciado Especificaciones Programas Pruebas
y algoritmos
Manuales
MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
CAP. 1: M ÉTODO Y HERRAMIENTAS 25
Etapa 01
MARCO DE TRABAJO
Descripción
del problema
ENUNCIADO
Etapa 02
Definición
Solución
Etapa 03
Diseño
Solución
Etapa 04
MODELAMIENTO Desarrollo
ALGORITMO Solución
CODIFICACIÓN
Para solucionar problemas sencillos utilizando el Método de las 6’D, es necesario conocer los conceptos
fundamentales de modelamiento, algoritmo y programación, y dominar el uso de las estructuras
lógicas, instrucciones o sentencias de bifurcación y las estructuras de datos conocidas como variables.
Este tipo de soluciones son el objetivo del presente texto.
También es posible plantear soluciones más complejas utilizando el Método de las 6’D. Para ello
se deben dominar algunos conceptos claves como Objetos, Métodos, Encapsulamiento, Herencia,
Polimorfismo, Interfaces gráficas, Conexión a base de datos y Servlets, entre otros.
Es importante mencionar que, dependiendo de la complejidad del problema, los pasos especificados
en cada una de las etapas del método se pueden redefinir o modificar. Esto significa que, dependiendo
de la complejidad del problema y de su solución, se puede plantear nuevos pasos y eliminar los ya
existentes en las diferentes etapas del método. Conforme se avance con el desarrollo de las soluciones,
se podrá observar cómo se redefinen los pasos de las etapas del método.
26 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
1.3 MODELAMIENTO
Se llama modelamiento a la forma en la que se representa la solución de un problema del mundo real
en términos de un modelo. Esta es una representación gráfica o simbólica de algún aspecto del mundo
que se encuentra bajo observación o estudio. Para representar un modelo se utiliza el UML (Unified
Modeling Language).
}|Visualizarun modelo.
}|Especificar un modelo (construir modelos precisos, no ambiguos).
}|Construir un modelo en un lenguaje de programación (se establecen correspondencias con lenguajes
orientados a objetos, como Java, C++, Visual Basic.
}|Documentar los componentes de un sistema de soŌware (arquitectura, requisitos, diseño, pruebas,
versiones, planificación).
}|Describir el ciclo de vida completo del desarrollo orientado a objetos.
Para desarrollar un modelo y representarlo en UML es necesario conocer todos los conceptos
relacionados con el desarrollo de soŌware orientado a objetos. Para dicho propósito, se detallarán
algunos conceptos básicos que serán utilizados en las soluciones que plantea este libro.
1.3.1 Paquete
Los paquetes permiten organizar las clases de un modelo. Un paquete contiene clases cuyas
funciones similares. En UML, un paquete se representa de la siguiente forma:
1.3.2 Clase
Una clase es un modelo que se utiliza para describir uno o más objetos del mismo tipo. En su forma
más sencilla, una clase es un conjunto de atributos y métodos; es una abstracción y no representa a
ningún objeto en particular. En UML, una clase se representa de la siguiente forma:
1.3.3 Objeto
Es cualquier cosa real o abstracta de la que se almacenan datos, y los métodos controlan y manipulan
dichos datos. Un objeto se crea o instancia a partir de una clase. En UML, un objeto se representa
de la siguiente forma:
UML incorpora nueve diagramas que permiten representar un modelo desde diferentes perspectivas.
Estos se muestran a continuación:
Diagramas de
Casos de Uso
Diagramas de
Diagramas de
Clase
Secuencia
Paquete
Diagramas de Diagramas de
Colaboración MODELO Objeto
Diagramas de Diagramas de
Estado Componentes
Diagramas de Diagramas de
Actividad Distribución
28 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
A continuación, se detalla el diagrama de paquetes que será utilizado en las soluciones planteadas
en el presente texto.
Este permite especificar y visualizar las relaciones de dependencia existentes entre los paquetes que
forman parte de una solución. Una relación de dependencia entre dos o más paquetes se establece
cuando las clases que pertenecen a un paquete pueden tener acceso a todas o algunas de las clases
que pertenecen a otro paquete (dependencia unidireccional). También se puede establecer una
relación de dependencia bidireccional, cuando las clases que pertenecen a un paquete pueden tener
acceso a todas o algunas de las clases que pertenecen a otro paquete, y viceversa. En UML, una
relación de dependencia unidireccional entre dos paquetes se grafica de la siguiente manera:
dominioDeLaAplicacion Biblioteca
Relación de dependencia
unidireccional
En este caso, dependencia significa que todas las clases pertenecientes al paquete
“dominioDeLaAplicacion” podrán tener acceso a todas o algunas de las clases que pertenecen al
paquete “Biblioteca”. (Observe el sentido de la flecha que marca la dependencia unidireccional).
|En el Método de las 6’D, el modelamiento de una solución se desarrolla durante la Etapa 03 - Diseño
de la solución.
Etapa 03
Definición
Solución
MODELAMIENTO
}|Definir un nombre para el proyecto. Este paso permitirá agrupar todos los elementos que serán
parte de la solución del problema utilizando el método planteado. El nombre del proyecto comenzará
con las letras “Proy” (abreviatura de proyecto), seguido de un nombre que identifique al proyecto.
Este nombre debe ser seleccionado adecuadamente.
}|Definición de diagramas, relaciones y clases. En este paso se desarrollará el diagrama de paquetes
y se especificará la relación de dependencia entre estos, utilizando UML. En las soluciones, primero
se creará un paquete y luego todos los demás. Fundamentalmente, se desarrollarán soluciones
con dos paquetes donde uno de ellos se llamará “dominioDeLaAplicación” y el otro “Biblioteca”,
estableciendo una relación de dependencia unidireccional del primero hacia el segundo.
CAP. 1: M ÉTODO Y HERRAMIENTAS 29
En el paquete “Biblioteca” se tendrán clases reutilizables, tales como la clase Lectura1 y la clase LE2,
que facilitarán el ingreso de los datos a la computadora.
Regla general para especificar los nombres de los paquetes, clases, atributos y métodos:
El nombre de las clases debe comenzar con una letra mayúscula y el resto en minúscula. Si el nombre
es compuesto, todas las primeras letras de los nombres simples que forman el nombre de la clase o
paquete deberán comenzar con mayúscula.
El nombre de los paquetes, el nombre de los atributos y el nombre de los métodos se escriben en
letra minúscula. En caso que el nombre sea compuesto, a partir de la segunda palabra se escribirá
la primera letra en mayúscula. Los métodos constructores son una excepción a esta regla y tienen el
mismo nombre que su clase (por lo que su nombre comienza con letra mayúscula).
1.4 ALGORITMO
En su forma más simple, una clase está constituida por atributos y métodos. Los métodos representan
pequeños subprogramas encapsulados dentro de las clases y contribuyen a definir el comportamiento
típico de los objetos.
Los algoritmos se desarrollan para especificar cuáles son los pasos desarrollados en un determinado
método y cuáles son los datos que manejan dichos pasos. Un algoritmo constituye una lista completa
de los pasos y una descripción de los datos que son necesarios para resolver un determinado problema
en el ámbito de un método.
De esto se deriva que un algoritmo se desarrolla para un determinado método y que su definición
tiene dos partes esenciales:
1.4.1 Características
}|Todo algoritmo debe ser finito. Si se sigue un algoritmo, este debe terminar en algún momento.
}|Un algoritmo debe estar definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo
resultado.
1
La clase Lectura se uƟliza en todos los capítulos. La clase Lectura se especifica en el apéndice.
2
La clase LE se trata en la parte final de cada capítulo, y con mayor intensidad en el capítulo final. La clase LE se
especifica en el apéndice.
30 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
}|El resultado que se obtenga debe satisfacer los requerimientos de la persona interesada (efectividad).
}|Debe ser estructurado. Es decir, debe ser fácil de leer, entender, usar y cambiar si es preciso.
En conclusión, los algoritmos permiten especificar la lógica de desarrollo de los métodos que
conforman una clase; por lo tanto, se debe entender la importancia de estudiar los algoritmos para
comprender cómo se está solucionando un determinado problema.
Se dispone de diversas herramientas para desarrollar los algoritmos en los métodos de las clases.
Entre estas herramientas se puede mencionar al pseudocódigo y al diagrama de flujo.
1.4.2 Herramientas
A. Pseudocódigo
B. Diagrama de flujo
C. Diagrama de actividad
A. Pseudocódigo
Permite expresar un algoritmo con palabras en castellano que son semejantes a las sentencias de
un lenguaje de programación.
a. Pautas básicas:
}|Todo algoritmo debe tener un nombre que empiece con una letra mayúscula. Si es un nombre
compuesto, la primera letra de cada palabra simple deberá estar en mayúscula. No se permiten
los espacios en blanco en el nombre del algoritmo (generalmente se utilizará el nombre de la
clase y el nombre del método para referirse a un determinado algoritmo).
}|Es necesario que se determinen los datos de entrada y la información de salida.
}|Para declarar una variable “x” se deberá determinar qué tipo de dato se almacenará. Por ejemplo,
si se desea declarar una variable de tipo texto se realizará de la siguiente manera: TEXTO x.
}|Para asignar un valor a una variable “x” se utilizará el signo igual. Por ejemplo, si se desea asignar
5 a la variable “x” se realizará de la siguiente manera: x = 5.
}|Para indicar que la computadora lea un valor desde un dispositivo externo y lo almacene en la
variable “z”, se utiliza: LEER z.
}|Para indicar que la computadora escriba hacia un dispositivo externo:
||Para escribir un mensaje (observe que el mensaje está entre comillas) se utiliza:
ESCRIBIR “hola”.
||Para escribir el valor de una variable (observe que la variable no está entre comillas) se utiliza:
ESCRIBIR x.
||Para escribir el resultado de una expresión (observe que la expresión no está entre comillas)
se utiliza: ESCRIBIR x + 2.
CAP. 1: M ÉTODO Y HERRAMIENTAS 31
ENTRADA:
En Entrada y Salida se especifican
SALIDA: las variables que se usarán en el
desarrollo del algoritmo.
INICIO:
...
... Este es el cuerpo del algoritmo
expresado en pseudocódigo. Las
... instrucciones se colocan entre
FIN:
INICIO... FIN
c. Reglas o pautas
}|Con la finalidad de comprender mejor el diseño de los algoritmos desarrollados en pseudocódigo
y diagrama de flujo, se han clasificado en seis grupos las reglas definidas.
FINSI
SI (condición) ENTONCES
instrucciones...
Permite especificar una estructura de
SI / SINO SINO
decisión doble “SI... SINO... FINSI”.
instrucciones...
FINSI
CASO valor 2 :
Permite especificar una estructura
instrucciones...
CUANDO de decisión múltiple “CUANDO...
CASO valor n :
FINCUANDO”.
instrucciones...
OTROS
instrucciones…
FINCUANDO
DESDE i = valorInicial
HASTA valorFinal
instrucción 1
Permite especificar una estructura
.
de repetición “DESDE... FINDESDE”.
DESDE .
Esta estructura es equivalente a
.
PARA.
instrucción n
FINDESDE
PARA ( i = valorInicial ;
condición ; valor )
instrucción 1
. Permite especificar una estructura de
PARA . repetición “PARA... FINPARA”. Esta
. estructura es equivalente a DESDE.
instrucción n
FINPARA
MIENTRAS (condición)
instrucción 1
.
Permite especificar una estructura
.
MIENTRAS de repetición “MIENTRAS...
.
FINMIENTRAS”.
instrucción n
FINMIENTRAS
HACER
instrucción 1
.
Permite especificar una estructura de
HACER .
repetición “HACER... MIENTRAS”.
.
instrucción n
MIENTRAS (condición
CAP. 1: M ÉTODO Y HERRAMIENTAS 33
B. Diagrama de flujo
Permite ilustrar la secuencia de pasos de un algoritmo por medio de símbolos especializados y
líneas de flujo. La combinación de símbolos especializados y líneas de flujo describe la lógica para
la solución del problema (algoritmo). Entonces, se puede afirmar que el Diagrama de Flujo es la
representación gráfica de un algoritmo.
DIAGRAMA DE FLUJO
FLUJO
Porque muestra la secuencia de lo que se
tiene que realizar.
DIAGRAMA
Por el hecho de ser dibujo que no
requiere estar a escala.
PROCESO
Utilizado para asignar valores a variables y resultados de
operaciones matemáticas.
ENTRADA / SALIDA
Utilizado para ingresar datos y visualizar la información que
resulta del procesamiento.
INICIO / FIN
Este símbolo permite marcar el inicio y el final del algoritmo.
CONECTOR
Este símbolo permite que no se crucen los flujos (líneas) en
un diagrama.
FLUJOS (LÍNEAS)
Líneas que permiten unir los diagramas y mostrar la secuencia
lógica a la solución del problema.
CAP. 1: M ÉTODO Y HERRAMIENTAS 37
INICIO
FIN
C. Diagrama de actividades
Son parte del lenguaje unificado de modelado (UML) y se utilizan comúnmente en dos formas:
1.- Es el modelado de flujos de trabajo, haciendo hincapié en las actividades tal y como son vistas
por los actores que colaboran con el sistema, esto es, modelando procesos de negocio.
2.- Es el modelado de una operación, utilizando los diagramas de actividad como diagramas de flujo
para amostrar detalles de un algoritmo, haciendo amplio uso de las condiciones de procesos
concurrentes.
Los diagramas de actividad están compuestos por símbolos de propósito especial, tales como
los símbolos de estado de acción, diamantes, pequeños círculos y barras de sincronización. Estos
símbolos están conectados mediante flechas de transición, las cuales representan el flujo de
actividad.
Cada estado de acción representa la realización de una o varias tareas. Se representa por un
rectángulo de sus lados izquierdo y derecho reemplazados con arcos hacia fuera. Cada actividad
contiene una expresión de acción que especifica una acción particular a realizar. Las acciones
pueden incluir cálculos aritméticos, lógicos u operaciones de entrada y salida. La expresión de
acción puede especificarse en lenguaje natural o utilizando pseudocódigo.
Las flechas en el Diagrama de Actividad se llaman flechas de transición. Estas flechas representan
transiciones, las cuales indican el orden en el que ocurren las acciones representadas por los
estados de acción.
El círculo sólido en la parte superior del diagrama de actividad representa el estado inicial de la
actividad, es decir, el inicio de flujo de trabajo antes de que el programa realice las tareas modeladas.
El círculo sólido rodeado por una circunferencia que aparece en la parte inferior del diagrama de
actividad representa el estado final, es decir, el final del flujo de trabajo después de que el programa
realiza todas las tareas. Un diamante o rombo permite representar caminos alternativos según se
cumpla alguna condición.
38 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
ESTADO INICIAL
Este símbolo permite marcar el inicio del algoritmo.
DECISIÓN
Permite representar caminos alternativos en base a una
condición.
ESTADO FINAL
Este símbolo permite marcar el final del algoritmo.
FLECHAS DE TRANSICIÓN
Líneas que indican el orden en que ocurren las acciones.
BARRAS DE SINCRONIZACIÓN
Líneas que permiten mostrar actividades concurrentes.
NOTAS
Comentarios que permiten describir el propósito de los
diagramas.
CAP. 1: M ÉTODO Y HERRAMIENTAS 39
|En el Método de las 6`D, el algoritmo de una solución se desarrolla después del modelamiento,
durante la Etapa 03 – “Diseño de la Solución”.
Etapa 03
Diseño
Solución
MODELAMIENTO
ALGORITMO
1.5 PROGRAMACIÓN
La programación es la traducción del modelamiento y los algoritmos en sentencias que la computadora
puede comprender y ejecutar. Es decir, que la programación es la acción de escribir programas para
una computadora, utilizando alguno de los lenguajes de programación existentes. Dicha acción se
conoce como codificación.
Las personas que escriben los programas son conocidas como programadores, los cuales están
divididos en categorías según su experiencia y dominio de diferentes lenguajes de programación.
Entonces, un lenguaje de programación es aquel que utilizan los programadores, que son comprendidos
y ejecutados en una computadora.
Nos “comunicamos” con las computadoras a través de los programas desarrollados en un lenguaje
de programación en parƟcular. Existen diferentes lenguajes de programación, la mayor parte de los
cuales Ɵenen un conjunto de reglas o sentencias muy especializadas.
La forma de programación ha variado con el paso de los años. Al inicio, se desarrolló la programación
lineal, luego de la programación modular, después la programación estructurada y ahora la
programación orientada a objetos.
Entre los lenguajes de programación orientados a objetos podemos destacar a C++ y Java.
40 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
A. C++
C++ es un lenguaje de programación, diseñado a mediados de los años 1980 por Bjame Stroudstrup,
como extensión del lenguaje de programación C.
Actualmente, existe un estándar denominado ISO C++, al que se han adherido la mayoría de los
fabricantes de compiladores más modernos.
Existen también algunos intérpretes como ROOT (enlace externo). Las principales características del
C++ son el soporte para programación orientada a objetos y el soporte de plantillas o programación
genérica (templates). Se puede decir que C++ es un lenguaje que abarca tres paradigmas de la
programación: la programación estructurada, la programación genérica y la programación orientada
a objetos.
C++ está considerado por muchos programadores como uno de los mejores lenguajes de
programación, debido a que permite trabajar tanto a alto como a bajo nivel; sin embargo es a su vez
uno de los que menos automatizaciones tiene (obliga a hacerlo casi todo manualmente al igual que
C) lo que genera más tiempo para su aprendizaje.
B. Java
Java es un lenguaje de programación orientado a objetos, desarrollado por Sun MicroSystems, una
compañía reconocida por sus estaciones de trabajo UNIX de alta calidad.
Fundamentado en el lenguaje de programación C++, el lenguaje Java se diseñó para ser pequeño,
sencillo y portátil a través de plataformas y sistemas operativos, tanto a nivel de código fuente como
binario, lo que significa que los programas Java (applets, aplicaciones y servlests), pueden ejecutarse
en cualquier computadora que tenga instalada una máquina virtual de Java.
En la actualidad, la Programación Estructurada (PE) y la Programación Orientada a Objetos (POO)
son las formas de programación utilizadas por la mayoría de los programadores, siendo la POO la
más reciente y la que asegura solucionar la mayoría de los problemas de la PE, incorporando nuevas
características y nuevos conceptos. Una característica importante de la POO es que utiliza conceptos
óptimos de la PE y de las otras formas de programación.
|En el Método de las 6´D, la programación de una solución se desarrolla durante la Etapa 04 –
“Desarrollo de la Solución”.
Etapa 04
Desarrollo
Solución
CODIFICACIÓN
}|Codificar el proyecto. En este paso, se desarrollará la codificación del proyecto; es decir, utilizando
el lenguaje de programación Java y/o C++, se traducirá lo especificado en el modelamiento y en los
algoritmos en sentencias que la computadora pueda comprender y ejecutar.
CAP.
Estructuras lógicas de
secuencia y estructura
2
d e d a to s v a r i a b l e
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 43
MARCO DE TRABAJO
ENUNCIADO
DEL
PROBLEMA
Etapa 02
Definición
Solución
Etapa 03
Diseño
Solución
Etapa 04
Desarrollo
MODELAMIENTO Solución
ALGORITMO
CODIFICACIÓN
44 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
MODELAMIENTO
PROYECTO CODIFICACIÓN
dominioDeLaAplicacion Biblioteca
Nombre
Clase
Atributos
Método( ) ALGORITMO
SE DESARROLLAN UTILIZANDO:
Estructuras lógicas de secuencia.
ALMACENANDO EN:
Estructuras de datos: Variable
En este capítulo se hablará de las estructuras lógicas de secuencia y la estructura de datos, conocida
como variable.
Es importante mencionar que, utilizando las estructuras lógicas de secuencia y las variables, se pueden
desarrollar algoritmos, de manera que estos puedan ser diseñados en pseudocódigo, diagrama de
flujo o diagrama de actividades, para luego ser codificados en un lenguaje de programación como C++
o Java.
En las siguientes cuatro soluciones desarrolladas se emplea una clase reutilizable creada en el lenguaje
de programación Java, para facilitar el ingreso de datos y visualización de la información utilizando
cuadros de diálogo prediseñados. Esto permite que las soluciones planteadas sean vistosas y más
amigables desde el punto de vista del usuario, logrando que el lector se familiarice con el uso de
cuadros y ventanas en las soluciones. Una contribución importante en esta parte es el uso del diagrama
de actividades como alternativa para el diseño de algoritmos.
Las veinticinco soluciones desarrolladas en el presente capítulo y los problemas propuestos al final del
mismo, contribuirán con el desarrollo de sus capacidades lógicas, necesarias para plantear soluciones
de calidad basadas en un lenguaje de programación determinado.
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 45
2.1.1 Definición
Son aquellas en las que una instrucción sigue a otra en secuencia. Las instrucciones se ejecutan una
a una, de modo que al finalizar su ejecución se inicia la siguiente, hasta completar la ejecución de
todas las instrucciones que forman parte de la secuencia.
Las estructuras lógicas de secuencia son el tipo de estructuras más comunes y constituyen la base
sobre la cual se desarrollan las demás estructuras lógicas (aunque muchos especialistas no las
consideren como tales, sino simples instrucciones básicas para el desarrollo de soluciones).
Estructuras lógicas
ENUNCIADO
DEL
PROBLEMA
MODELAMIENTO CODIFICACIÓN
}|Determinar la }|Determinar el }|Codificar el diseño
información nombre del de la solución del
deseada (salida). proyecto. problema. Utilizar
}|Determinar los }|Definir el paquete el lenguaje de
datos de entrada y las clases que programación C++
(entrada). formarán parte o Java.
}|Establecer como de la solución del
se solucionará el problema. Utilice
problema (proceso). UML.
ALGORITMO
}|Diseñar el algoritmo
para el método
principal. Utilizar
pseudocódigo o
diagrama de flujo.
De manera general, la Etapa 03 - Diseño de la lógica se divide en dos partes: modelamiento (paso 1
y 2) y algoritmo (paso 3). Por otro lado, en la Etapa 04 - Desarrollo de la solución se tiene la parte de
codificación (paso 1). También se puede utilizar esta división en el desarrollo de las soluciones.
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 47
2.3.1 Definición
2.3.2 Representación
Es importante mencionar que se puede visualizar una cadena de texto, el contenido de una variable
o el resultado de una operación matemática. Por ejemplo:
}|En pseudocódigo:
ESCRIBIR “Hola Mundo”
Alternativamente puede usar las reglas MOSTRAR e IMPRIMIR, que permiten visualizar datos
explícitamente a través de la pantalla (consola) y de la impresora, respectivamente.
"Hola Mundo"
Esta sentencia permite la salida de datos por la pantalla (consola) de la computadora. Utilizando
“cout”, se mostrará la información que se coloque a la derecha del operador de salida “<<”. En
el ejemplo, se mostrará el mensaje “Hola Mundo”. Una vez mostrada la información, el cursor
permanecerá al final de la línea. También puede utilizar la siguiente sentencia:
La palabra reservada “endl” permite que el cursor se ubique en la línea siguiente donde se mostró la
información. Esto es necesario cuando se desea visualizar información en diferentes líneas.
Cuando utilice cout o endl deberá asegurarse de incluir al inicio de sus programas el archivo de
cabecera iostream, utilizando la siguiente línea de código:
#include <iostream>
También deberá asegurarse de incluir la sentencia using respectiva al inicio de sus programas. Esto
es necesario, ya que en C++ se requiere indicar el espacio de nombre al que pertenecen dichas
sentencias; es decir, las siguientes líneas de código serán necesarias cuando se utilizan dichas
sentencias:
using std::cout ;
using std::endl ;
Si no se utilizan, deberá anteceder a todas las sentencias cout o endl el prefijo std::.
Esta sentencia permite la salida de datos por la pantalla (consola) de la computadora. Utilizando
“print”, se mostrará la información que se coloque entre los paréntesis “( )”. En el ejemplo, se
mostrará el mensaje “Hola Mundo”; una vez mostrada la información el cursor permanecerá al final
de la línea. También puede utilizar la siguiente sentencia:
Utilizando “println” en lugar de “print”, el cursor se ubicará en la línea siguiente donde se mostró la
información. Esto es equivalente a utilizar “endl” en C++.
La clase System pertenece a la biblioteca de clases del lenguaje de programación Java, y es parte de
su paquete principal denominado java.lang.
Cuando se desarrolla un programa en Java, y necesita utilizar clases que son parte de otros paquetes,
deberá indicarlo utilizando para ello la sentencia import.
Esto se cumple para todos los paquetes que necesite utilizar, tanto para los que ha creado como para
los del lenguaje de programación Java, a excepción del paquete java.lang. Es decir, para trabajar con
la clase System o cualquier clase de paquete java.lang no necesitará importar dicho paquete.
Problema 001
Enunciado: Muestre un mensaje por la pantalla. El mensaje a mostrar será: “Hola bienvenidos”.
Paquete y clase
PrgMensaje
dominioDeLaAplicacion
}|main ( )
50 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
ENTRADA:
SALIDA:
INICIO
FIN
En diagrama de flujo:
INICIO
“Hola bienvenidos”
FIN
Clase PrgMensaje
#include <iostream>
using std::cout ;
int main ( ) {
cout << “ Hola bienvenidos ” ;
return 0 ;
}
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 51
package dominioDeLaAplicacion ;
class PrgMensaje {
Análisis de la solución:
Luego: ENTRADA:
En esta parte se hace referencia a todas las variables cuya función en el
algoritmo es almacenar datos de entrada. Observe que no se ha definido
ninguna variable de entrada. El tema de variables será tratado más adelante
en este mismo capítulo.
A continuación: SALIDA:
Se hace referencia a todas las variables cuya función en el algoritmo
es almacenar datos de salida. Observe que no se ha definido ninguna
variable de salida.
Finalmente: FIN
Esta regla permite indicar el fin de los pasos que constituyen la solución al
problema planteado, es decir, el final del algoritmo.
Los pasos que están entre las reglas INICIO… FIN constituyen la parte más importante del algoritmo,
y son conocidos como el cuerpo del algoritmo.
52 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Ahora, se analizará el algoritmo de main diseñado en diagrama de flujo para la solución del problema
anterior.
Finalmente: FIN
Ahora, debe analizarse cada sentencia de la codificación del algoritmo en el lenguaje de programación
C++.
En primer lugar, se observa que el programa empieza con la línea de código siguiente:
#include <iostream>
El lenguaje C++ define varios archivos llamados archivos de encabezado, que contienen
información útil o necesaria para su programa. Para este programa se necesita el archivo de
encabezado iostream, necesario para utilizar la sentencia cout. Los archivos de encabezado son
proporcionados con el software C++ y constituyen la biblioteca estándar del mismo.
Es importante indicar que este archivo de encabezado debe estar incluido dentro de cualquier
programa en el que se necesite mostrar datos a través del monitor, o ingresar datos a través
del teclado (iostream es un archivo de encabezado de flujo de entrada / salida - input / output
stream header file).
using std::cout ;
Por lo general, la palabra using se coloca al inicio del programa y permite indicar qué “espacios
de nombres” se van a utilizar. Se puede incluir varias veces la palabra using en un programa. La
notación std::cout especifica que se está utilizando un nombre, en este caso cout, que pertenece
al “espacio de nombre” std. Los espacios de nombres son una característica avanzada de C++ y
resuelven los conflictos que pueden generarse al utilizar bibliotecas de terceros.
La línea de código using std::cout eliminan la necesidad de repetir el prefijo std:: en las sentencias
cout. Si no utiliza esta línea de código, deberá anteceder a todas las sentencias cout el prefijo
std::. En el ejemplo, si no utiliza using deberá cambiar la línea de código:
cout << “ Hola bienvenidos ” ;
int main ( ) {
Es conocida como la firma de la función main o función principal. Todo programa en C++ que sea
posible de ejecutarse deberá tener una función main. La palabra int a la izquierda de main indica
que main “devuelve” un valor entero (un número).
Permite mostrar a través de una pantalla el texto contenido entre comillas, es decir, se muestra
el mensaje Hola bienvenidos. De igual forma, se puede visualizar el contenido de una variable o
los resultados de operaciones matemáticas.
return 0 ;
Se indica que la finalización del programa ha sido exitosa y devuelve el control al sistema
operativo o al IDE que lo ejecutó. La palabra return es una de las muchas formas que se utilizan
para indicar la finalización de una función.
En resumen, para desarrollar un programa básico en C++ es necesario indicar el uso de archivos de
encabezado, sentencias using (aunque estrictamente hablando no es necesaria) y la función main.
De esto se deduce que las siguientes líneas de código se utilizarán en todos los programas C++ que
se desarrollen. Solo variará el nombre de los archivos de encabezado que se utilicen y las sentencias
using que se incluyan.
54 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
#include <iostream>
int main ( ) {
return 0 ;
}
En algunos casos es necesario incluir sentencias que permitan mantener la visualización de los
resultados del programa, debido fundamentalmente a que existen IDEs (Interfaces de Desarrollo
Integrado) que no cuentan con una ventana de consola incorporada para mostrar los resultados.
Observe lo siguiente:
#include <iostream>
int main ( ) {
system ( “PAUSE” ) ;
return 0 ;
}
La sentencia system permite ejecutar comandos del sistema operativo. En este caso, “PAUSE” es un
comando del sistema operativo DOS que muestra el mensaje “Presione una tecla para continuar”, y
hace una pausa mientras no se presione una tecla, permitiendo la visualización de los resultados del
programa. Sin embargo, dependiendo del sistema operativo en el que se esté trabajando, se deberá
emplear el comando adecuado.
Otra solución que permite visualizar los resultados del programa y no emplea comandos del sistema
operativo es la siguiente:
#include <iostream>
#include <conio.h>
int main ( ) {
getch() ;
return 0 ;
}
#include <conio.h>
getch() ;
Permite hacer una pausa para visualizar los resultados del programa. Esta pausa se mantendrá
hasta presionar cualquier tecla.
En primer lugar, se observa que el programa empieza con la línea de código siguiente:
package dominioDeLaAplicacion ;
La palabra reservada package especifica el nombre del paquete al que va a pertenecer la clase
creada con la palabra reservada class. El nombre del paquete se encuentra a continuación de la
palabra reservada package. En este caso, el nombre del paquete es “dominioDeLaAplicacion”.
class PrgMensaje {
Observe que se utiliza la palabra reservada class, indicando que se declara una clase. A
continuación se encontrará el nombre de la clase, que es PrgMensaje. Finalmente, seguido del
nombre se coloca una llave de apertura ( { ), que indica el inicio del cuerpo de la clase.
Es conocida como la firma del método main o método principal. Toda clase en Java que sea
posible de ejecurtarse, deberá tener un método main exactamente como ha sido escrito,
respetando las letras minúsculas y mayúsculas.
Permite mostrar por pantalla el texto entre comillas, es decir, se muestra “Hola bienvenidos”.
También se puede visualizar el contenido de una variable y los resultados de operaciones
matemáticas.
}
}
La primera línea indica el final del método main, y la segunda línea indica el final de la clase.
56 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
En resumen, se puede decir que para desarrollar un programa básico en Java es necesario definir
un paquete, una clase y el método main. De esto se deduce que las siguientes líneas de código
se utilizarán en todos los programas que se desarrollen, y solo se dará una variación en el nombre
del paquete y el nombre de la clase, que en este caso son dominioDeLaAplicacion y PrgMensaje
respectivamente.
package dominioDeLaAplicacion ;
class PrgMensaje {
}
}
Problema 002
Enunciado: Muestre dos mensajes por pantalla, cada uno en líneas diferentes. El primer mensaje a
mostrar será “Hola bienvenidos”, y el segundo “Este es el segundo programa”.
A. Resultado deseado: Mostrar los mensajes “Hola bienvenidos” y “Este es el segundo programa”.
B. Datos necesarios: Ninguno.
C. Procesamiento: Los mensajes serán mostrados por la pantalla.
Paquete y clase
PrgMensaje2
dominioDeLaAplicacion
||main ()
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 57
ENTRADA:
SALIDA:
INICIO
FIN
En diagrama de flujo:
Algoritmo PrgMensaje2 – main ( )
INICIO
“Hola
bienvenidos”
“Este es el
segundo”
FIN
#include <iostream>
using std::cout ;
using std::endl ;
int main ( ) {
cout << “ Hola bienvenidos ” << endl ;
cout << “ Este es el segundo programa ” << “\n \n” ;
system ( “PAUSE” ) ;
return 0 ;
}
58 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgMensaje2
package dominioDeLaAplicacion ;
class PrgMensaje2 {
Problema 003
Hola Bienvenidos
Hemos mostrado mensajes
En una sola línea Prob.1
En dos líneas Prob.2
En múltiples líneas Prob.3
Paquete y clase
PrgMensaje3
dominioDeLaAplicacion
||main ()
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 59
En pseudocódigo:
Algoritmo PrgMensaje3 – main ( )
ENTRADA:
SALIDA:
INICIO
En diagrama de flujo:
Algoritmo PrgMensaje3 – main ( )
INICIO
“Hola bienvenidos”
“Hemos mostrado mensajes”
“En una sola línea Prob.1”
“En dos líneas Prob.2”
“En múltiples líneas Prob.3”
FIN
#include <iostream>
#include <conio.h>
using std:: cout ;
int main ( ) {
cout << “ Hola bienvenidos \n” ;
cout << “ Hemos mostrado mensajes ” << “\n” ;
cout << “ En una sola línea \t Prob.1 \n En dos líneas \t\t Prob.2 \n
En múltiples líneas \t Prob.3 ” ;
getch ( ) ;
return 0 ;
}
60 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
package dominioDeLaAplicacion ;
class PrgMensaje3 {
2.4.1 Definición
Una variable es una estructura de datos, lineal o estática, que permite reservar un espacio para
almacenar o guardar datos de forma temporal. Una variable solo puede almacenar un dato a la vez;
si se necesita almacenar dos o tres datos al mismo tiempo, se requerirán dos o tres variables según
sea el caso.
2.4.2 Declaración
Al declarar una variable es posible definir su nombre y el tipo de dato que podrá almacenar. Generalmente
se realiza al inicio de un programa. La declaración de una variable se debe realizar antes de que
pueda ser utilizada, cuestión necesaria en los diferentes lenguajes de programación.
TipoDeDato ListaDeVariables
En C++ y Java:
TipoDeDato ListaDeVariables ;
Donde TipoDeDato debe ser un tipo de variable o tipo de dato válido, y ListaDeVariables puede
tener uno o más nombres de variables separadas por comas.
2.4.3 Nombre
Es necesario que las variables tengan un nombre para poder referirse a ellas en cualquier parte de
un programa. El nombre de una variable deberá comenzar con una letra minúscula y no debe tener
una longitud mayor a 31 caracteres, de manera que se asegure la portabilidad de los programas a
otros sistemas operativos. Si el nombre de la variable está formado por varias palabras, se deberá
escribir con mayúscula la primera letra de cada palabra, a partir de la segunda palabra que forme
parte del nombre. No es válido que el nombre de una variable tenga espacios en blanco ni caracteres
especiales, como /, (, ), =, ?, ¨, ^, *, etc.
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 61
En pseudocódigo:
Una variable no puede tener el nombre de una regla o pauta definida.
Ejemplo: ESCRIBIR.
En C++ y Java:
Una variable no puede tener el nombre de una palabra reservada. Ejemplos:
System en Java o cout en C++.
IMPORTANTE
Se recomienda que el nombre a uƟlizar en las variables que se
empleen, guarde relación con el valor que estas almacenan.
2.4.4 Inicialización
Es posible que una variable sea definida con un valor inicial, y que posteriormente sea modificado.
Además, es recomendable definir con un valor inicial a todas las variables declaradas en el programa.
En C++ y Java:
TipoDeDato variable = valor ;
Donde valor debe ser un valor equivalente al tipo de variable o tipo de dato definido. Aquí,
TipoDeDato es opcional y se utiliza solo si la variable no ha sido declarada anteriormente.
Para almacenar un valor en una variable se utiliza el nombre con el que esta fue declarada, y a
continuación el signo igual (=) seguido del valor que se desea almacenar.
variable = valor
En C++ y Java:
variable = valor ;
Se debe tener en cuenta que una variable puede almacenar solo un valor a la vez, y que este valor
deberá ser equivalente al tipo de dato con el que se declaró la variable.
62 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Cada vez que se almacena un valor en la variable, se pierde el valor que anteriormente tenía. Es
posible almacenar un valor en una variable en cualquier parte del programa; el único requisito es
que la variable donde se almacene el valor esté previamente declarada. El valor de una variable
puede también ser sustituido por el resultado de una operación aritmética o de cálculo. Por ejemplo:
suma = 7 + 5
En C++ y Java:
suma = 7 + 5 ;
En ambos casos, cuando se desee visualizar el contenido de la variable suma, se observará que el
valor obtenido será 12.
2.4.6 Constantes
Una constante es un tipo de variable que mantiene el valor asignado a lo largo de un algoritmo o un
programa. A una variable tipo constante, generalmente se le declara y asigna un valor al inicio de un
algoritmo o un programa. Dicho valor no cambia en todo el algoritmo o en todo el programa.
variable = valor
En C++:
En Java:
Se debe tener presente que una constante es una variación lógica del concepto de una variable.
2.5.1 Definición
Los tipos de dato permiten declarar las variables. A pesar que en el pseudocódigo y el diagrama de flujo
solo se reconocen cuatro tipos de datos, en los lenguajes de programación existe una gran variedad de
estos tipos, generalmente divididos en dos categorías: básicos o simples y compuestos.
Existen diferentes tipos de dato. En pseudocódigo y diagrama de flujo se utilizan cuatro tipos
(NUMERO, CARACTER, TEXTO y LOGICO). Los lenguajes de programación permiten trabajar con una
amplia variedad de tipos de datos, que se extienden desde los más básicos hasta los más complejos.
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 63
Los tipos de datos básicos se tratarán en este capítulo, y constituyen la base para los tipos de dato
compuestos.
Se debe tener en cuenta que las palabras NUMERO, ENTERO, REAL, CARACTER, TEXTO, LOGICO,
VERDADERO y FALSO son reglas utilizadas en el pseudocódigo y diagrama de flujo, por lo que no
podrán ser usadas como nombre de variable. Estas palabras nos permiten definir los tres tipos de
variables utilizadas:
A. Variables numéricas: Permiten almacenar solo tipos de dato numérico (NUMERO, ENTERO y REAL).
Con una variable numérica se puede realizar operaciones matemáticas (suma, resta, multiplicación,
división, etc.). En este contexto, se debe tener presente que las operaciones matemáticas se
resuelven siguiendo las mismas reglas que se aplican en la aritmética tradicional. Es decir, primero
se resuelven las multiplicaciones y divisiones; luego las sumas y restas. Para alterar esta prioridad
se podrán utilizar los paréntesis.
Ejemplos:
edad = 15
resultado = 5 + 8 * ( 6 – 2)
Donde edad y resultado son variables que previamente han sido declaradas como variables de
tipo NUMERO.
B. Variables de texto: Permiten almacenar datos de tipo texto y datos de tipo carácter (TEXTO y
CARACTER). Las variables tipo texto son útiles para almacenar cualquier cadena de texto, tales
como nombres de personas, direcciones, etc. Las variables tipo carácter permiten almacenar una
sola letra, dígito o símbolo. Para almacenar un valor a una variable texto se coloca el texto entre
comillas, mientras que para almacenar un valor a una variable carácter se debe colocar entre
apóstrofes.
Ejemplos:
nombre = “Pedro”
letra = ‘J’
Donde nombre y letra son variables que previamente han sido declaradas como variables de tipo
TEXTO y CARACTER respectivamente.
64 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
C. Variables lógicas: Permiten almacenar solo datos de tipo lógico. Existen solo dos valores que se
pueden almacenar en este tipo de variable: VERDADERO y FALSO.
Ejemplos:
masculino = VERDADERO
estudiante = FALSO
Donde masculino y estudiante son variables que previamente han sido declaradas como variables
de tipo LOGICO. Las palabras VERDADERO y FALSO constituyen reglas en pseudocódigo y diagrama
de flujo, por lo que no está permitido que se usen como nombres de variables.
Los tipos de dato básicos o simples de C++ son utilizados para declarar las variables que serán utilizadas
en los programas y forman parte de las palabras reservadas del lenguaje. Las palabras reservadas
que permiten declarar variables son short, int, long, float, double, boolean, char, wchar_t y string.
T®ÖÊ DÝÙ®Ö®ÌÄ
int entero
double lógico
bool carácter
Las palabras reservadas short, int y long permiten declarar variables de tipo ENTERO, mientras que las
palabras reservadas float y double permiten declarar variables de tipo REAL. En conjunto, las palabras
reservadas short, int, long, float y double permiten declarar variables de tipo NÚMERO.
Las palabras reservadas char y wchar_t permiten declarar variables de tipo CARACTER, mientras que
la palabra reservada string permite declarar variables de tipo TEXTO o cadena.
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 65
Los tipos de datos básicos o simples de Java son utilizados para declarar las variables que serán
utilizadas en los programas, y forman parte de las palabras reservadas del lenguaje. Las palabras
reservadas que permiten declarar variables son byte, short, int, long, float, double, char y boolean.
T®ÖÊ DÝÙ®Ö®ÌÄ
byte tipo byte
int entero
char carácter
boolean lógico
Las palabras reservadas byte, short, int y long permiten declarar variables de tipo ENTERO, mientras
que las palabras reservadas float y double permiten declarar variables de tipo REAL. En conjunto, las
palabras reservadas short, int, long, float y double permiten declarar variables de tipo NÚMERO.
La palabra reservada boolean permite declarar variables de tipo LOGICO. La palabra reservada char
permite declarar variables de tipo CARACTER.
Para representar una cadena de caracteres en Java, se utiliza la clase String. Los String en Java no son
un tipo de dato básico o simple, sino un tipo de dato compuesto. (A pesar de ello, se puede utilizar
como un tipo de dato simple para definir datos de tipo TEXTO en Java).
A diferencia de otros lenguajes de programación, en C++ y Java los tipos de datos simples no dependen
de la plataforma ni del sistema operativo. Un entero de tipo int siempre tendrá el mismo tamaño,
por lo que no habrá sorpresas al migrar un programa de un sistema operativo a otro. Las palabras
reservadas de C++ y Java no pueden ser utilizadas como nombre de variable.
Como regla general, una variable solo puede almacenar valores de acuerdo al tipo de dato con el que
fue declarado; es decir, si se declara una variable con un tipo de dato específico, solo podrá almacenar
valores de dicho tipo de dato. En base a esto, si se declara una variable con un tipo de dato específico y
se intenta almacenar un valor de distinto tipo, el programa indicará un error al momento de compilar.
66 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 004
Enunciado: Muestre el día y el mes de cumpleaños de una persona que nació el 23 de agosto.
A. Resultado deseado: Mostrar el día y el mes de cumpleaños de una persona que nació el 23 de
agosto.
B. Datos necesarios: Ninguno.
C. Procesamiento: El día y mes de cumpleaños de la persona serán almacenados en las
variables dia y mes respectivamente, y finalmente serán mostrados.
Paquete y clase
PrgCumpleaños
dominioDeLaAplicacion
||main ()
ENTRADA:
SALIDA: dia, mes
INICIO
COMENTARIO “Este es nuestro cuarto algoritmo”
NUMERO dia
TEXTO mes
dia= 23
mes = “Agosto”
ESCRIBIR dia, mes
FIN
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 67
En diagrama de flujo:
INICIO
Este es nuestro cuarto algoritmo
NUMERO dia
TEXTO mes
dia = 23
mes= "Agosto"
dia, mes
FIN
Clase PrgCumpleaños
/* Este es nuestro cuarto programa. Aunque es sencillo, podemos apreciar los elementos
básicos de un programa en C++ y sus posibles variaciones.
*/
#include <iostream>
#include <string>
using std::cout ;
using std::string ;
int dia ;
string mes ;
dia= 23 ;
mes = “Agosto” ;
cout << “ Cumpleaños: ” << dia << “ de ” << mes << “ \n\n ” ;
system ( “PAUSE” ) ;
return 0 ;
}
68 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgCumpleaños
/* Este es nuestro cuarto programa. Aunque es sencillo, podemos apreciar los elementos
básicos de un programa en Java y sus posibles variaciones.
*/
package dominioDeLaAplicacion ;
class PrgCumpleaños {
// La ejecución empieza en main.
public static void main ( String arg[ ] ) {
int dia ;
String mes ;
dia= 23 ;
mes = “Agosto” ;
System.out.println ( “Cumpleaños: ” + dia + “ de ” + mes) ;
}
}
Análisis de la solución:
Luego: ENTRADA:
A continuación: SALIDA:
Esta regla permite indicar el inicio de los pasos que constituyen la solución
al problema planteado.
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 69
Aquí se asigna la cadena de texto “Agosto” a la variable mes. Note que para
asignar una cadena de texto a una variable, esta debe estar entre comillas.
Finalmente: FIN
A continuación, se analizará el algoritmo de main diseñado en diagrama de flujo para la solución del
problema anterior.
70 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Luego: INICIO
A continuación: dia = 23
mes= "Agosto"
Este símbolo también se utiliza para asignar valores a las variables. Se asigna
el valor 23 a la variable dia y la cadena de texto “Agosto” a la variable mes.
Finalmente: FIN
Ahora, analicemos cada sentencia de la codificación del algoritmo en el lenguaje de programación C++.
En primer lugar, observamos que el programa empieza con las líneas de código siguiente:
/* Este es nuestro cuarto programa. Aunque es sencillo, podemos apreciar los elementos
básicos de un programa en C++ y sus posibles variaciones
*/
Este es un comentario de múltiples líneas en C++. Para agregar un comentario de este tipo se utilizan los
símbolos /* para el inicio del comentario, y los símbolos */ para finalizar el comentario. Es importante
indicar que los comentarios son ignorados al momento de ejecutar el programa.
#include <iostream>
Indica que en el programa se utilizará el archivo de encabezado iostream, el cual es necesario para
utilizar la sentencia cout y la sentencia endl.
#include <string>
Indica que en el programa se utilizará el archivo de encabezado string, el cual es necesario para utilizar
tipos de dato TEXTO.
Es importante indicar que este archivo de encabezado debe estar incluido dentro de cualquier
programa en el que se necesite utilizar tipos de dato TEXTO (definidos como string en C++).
using std::cout ;
using std::endl ;
Elimina la necesidad de repetir el prefijo std:: en las sentencias endl, las mismas que permiten
realizar un salto de línea y que la información se pueda visualizar en diferentes líneas.
using std::string ;
Elimina la necesidad de repetir el prefijo std:: cuando se usan tipos de dato TEXTO y las funciones
asociadas para el manejo de estos datos.
72 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Es un comentario de una sola línea en C++. Para agregar un comentario de este tipo, solo es
necesario utilizar los símbolos // al inicio del comentario.
int main ( ) {
Es conocida como la firma de la función main o función principal. Todo programa en C++ que se
quiera ejecutar, deberá tener una función main. La palabra int a la izquierda de main indica que
main “devuelve” un valor entero (un número).
int dia ;
Permite declarar la variable dia como variable de tipo NUMERO. En C++ las variables de tipo
NUMERO pueden ser declaradas utilizando int.
string mes ;
Permite declarar la variable mes como variable de tipo TEXTO. En C++ las variables de tipo TEXTO
son declaradas utilizando string.
dia = 23 ;
mes = “Agosto” ;
Permite mostrar por pantalla el texto “Cumpleaños:”. Luego se muestra el contenido de la variable
dia, después el texto “de” y finalmente el contenido de la variable mes.
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 73
return 0 ;
Se indica que la finalización del programa ha sido exitosa, y devuelve el control al sistema operativo
o al IDE que lo ejecutó. La palabra return es una de las varias formas que se utilizan para indicar la
finalización de una función.
En primer lugar, se observa que el programa empieza con las líneas de código siguiente:
/* Este es nuestro cuarto programa. Aunque es sencillo, podemos apreciar los elementos
básicos de un programa en Java y sus posibles variaciones
*/
Este es un comentario de múltiples líneas en Java. Observe que este comentario también existe en C++
y es utilizado en Java de la misma forma.
package dominioDeLaAplicacion ;
La palabra reservada package especifica el nombre del paquete al que pertenecerá la clase creada con
la palabra reservada class. El nombre del paquete se encuentra a continuación de la palabra reservada
package. En este caso, el nombre del paquete es “dominioDeLaAplicacion”.
class PrgCumpleaños {
Observe que se utiliza la palabra reservada class, lo cual indica que se está declarando una clase. A
continuación, se encontrará el nombre de la clase: PrgCumpleaños. Finalmente, seguido del nombre
se coloca una llave de apertura ( { ), que indica el inicio del cuerpo de la clase.
74 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Este es un comentario de una sola línea en Java. Observe que este comentario también existe en C++ y
es utilizado en Java de la misma forma.
Es conocida como la firma del método main ( ) o método principal. Toda clase en Java que se desee
ejecutar, deberá tener un método main ( ) exactamente como ha sido escrito, respetando las letras
minúsculas y mayúsculas.
int dia ;
Permite declarar la variable dia como variable de tipo NÚMERO. En Java, al igual que en C++, las
variables de tipo NÚMERO pueden ser declaradas utilizando int.
String mes ;
Permite declarar la variable mes como variable de tipo TEXTO. En Java, las variables de tipo TEXTO
son declaradas utilizando String.
dia = 23 ;
mes = “Agosto” ;
Permite mostrar por pantalla el texto “Cumpleaños: ”. Luego se muestra el contenido de la variable dia;
después el texto “ de ” y finalmente el contenido de la variable mes.
}
}
La primera llave de cierre ( } ) indica el final del método main ( ). La última llave de cierre indica el final
de la clase.
En Java y C++ existen tres tipos de comentarios, y en ambos lenguajes de programación se utilizan de
la misma forma y con los mismos símbolos.
El primer tipo de comentario se llama comentario de múltiples líneas. Este tipo de comentario empieza
con un /* (una barra seguida por un asterisco) y termina con un */ (un asterisco seguida por una
barra). Todas las líneas que quedan comprendidas entre los dos símbolos de comentario son ignoradas
al momento de ejecutar el programa o la clase. Los comentarios de este tipo pueden tener una o más
líneas de longitud.
El segundo tipo de comentario se llama comentario de una sola línea. Este tipo de comentario empieza
con un // (dos barras) y termina al final de la línea. Típicamente, los programadores usan comentarios
de múltiples líneas al describir comentarios extensos de múltiples líneas, y usan comentarios de una
sola línea cuando necesitan comentarios más breves. No obstante, este es un tema de estilo personal.
El tercer tipo de comentario permite documentar una clase desarrollada para ser utilizada en diferentes
soluciones (documentación de clases reutilizables). Un ejemplo de este tipo de comentarios se puede
encontrar en la definición de la clase LE, especificada en el apéndice.
76 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 005
Paquete y clase
PrgAlumno
dominioDeLaAplicacion
||main ()
ENTRADA:
SALIDA: nombre, apellido, nf
INICIO
COMENTARIO “Declaración de variables y asignación de datos.”
TEXTO nombre = “Wally”, apellido = “Flores”
NUMERO nf = 15
En diagrama de flujo:
INICIO
Declaración de variables y
asignación de datos.
TEXTO nombre = “Wally”, apellido = “Flores”
NUMERO nf = 15
Mostrar información.
nombre, apellido,
nf
FIN
Clase PrgAlumno
package dominioDeLaAplicacion ;
class PrgAlumno {
public static void main ( String arg[ ] ) {
// Mostrar información.
System.out.println ( “Nombre del alumno: ” + nombre + “ ” + apellido) ;
System.out.println ( “Promedio final: ” + nf + “.” ) ;
}
}
Problema 006
Enunciado: Se desea mostrar el mensaje “Feliz Navidad” y el mensaje “Próspero Año nuevo”.
Paquete y clase
PrgSaludo
dominioDeLaAplicacion
||main ()
ENTRADA:
SALIDA: msjNavidad, msjNuevo
INICIO
FIN
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 79
En diagrama de flujo:
Algoritmo PrgSaludo – main ( )
INICIO
Declaración de variables y asignación
de datos.
TEXTO msjNavidad, msjNuevo = “Próspero año
nuevo”
Mostrar información.
msjNavidad, msjNuevo
FIN
#include <iostream>
#include <conio.h>
#include <string>
using std::cout ;
using std::string ;
int main ( ) {
// Mostrar información.
cout << msjNavidad << “ y” << msjNuevo ;
getch ( ) ;
return 0 ;
}
IMPORTANTE
Se recomienda solucionar los problemas propuestos del 1 al 5,
planteados al final del presente capítulo.
80 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
2.7.1 Definición
El ingreso de datos es la forma o mecanismo empleado para obtener los datos que un algoritmo
necesita para generar información. En los lenguajes de programación, este tipo de estructura
permite ingresar datos a través de un dispositivo de entrada de una computadora.
2.7.2 Representación
Para ingresar una cadena de texto y almacenar el valor ingresado en la variable nombre, deberá
realizar los siguientes pasos:
Esta sentencia permite el ingreso de datos por teclado. El operador “>>” permite que el valor
ingresado a través de “cin” se asigne a la variable ubicada a la derecha, ya que “cin” en este caso es
el dispositivo de entrada, y representa una entrada a través del teclado.
Cuando utilice cin deberá asegurarse de incluir al inicio de sus programas el archivo de cabecera
iostream, utilizando la siguiente línea de código:
#include<iostream>
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 81
También deberá asegurarse de incluir al inicio de sus programas la sentencia using respectiva. Esto es
necesario ya que en C++ se necesita indicar el espacio de nombre al que pertenece dicha sentencia, es
decir, la siguiente línea de código será necesaria cuando utilice dicha sentencia:
using std::cin ;
Si no utiliza la sentencia, deberá anteceder a todas las sentencias cin el prefijo std::
nombre = Lectura.leerString ( ) ;
Se utiliza la clase Lectura y el método apropiado de dicha clase. Esta clase permite el ingreso de datos
por teclado. El método leerString( ) de la clase Lectura permite que una cadena de texto ingresada
por teclado se almacene en una variable. En el ejemplo, la cadena de texto se almacena en la variable
nombre.
Es importante mencionar que el lenguaje de programación Java no proporciona una clase que facilite
el ingreso de datos en forma tradicional; en consecuencia, se utilizará una clase en Java desarrollada
especialmente para que cumpla dicha finalidad, denominada Lectura.
La clase Lectura facilita el ingreso de datos en consola. Esta clase permite ingresar datos en forma
tradicional y será usada para la codificación de algoritmos en Java.
Lectura
||leerString ()
||leerChar ()
||leerInt ()
||leerLong ()
||leerFloat ()
||leerDouble ()
Pero la mejor decisión será definir la clase Lectura en un paquete independiente, distinto al paquete
dominioDeLaAplicacion, al que se le denominará biblioteca. Esto se justifica debido a que, por
definición, los paquetes permiten agrupar clases con funciones similares (ver los problemas resueltos
a partir del problema 013).
Si se define la clase Lectura en un paquete denominado biblioteca, cada vez que desee utilizar esta
clase en sus soluciones deberá indicarlo explícitamente, utilizando la sentencia siguiente:
import biblioteca.Lectura ;
En el apéndice podrá encontrar la codificación de la clase Lectura. Esta constituye un buen ejemplo de
una clase reutilizable, y ha sido diseñada solo con fines académicos.
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 83
Problema 007
Enunciado: Ingrese el nombre de una persona y muéstrelo junto al mensaje “bienvenido. ¿Cómo
estás?”.
Paquete
dominioDeLaAplicacion
Clases de dominioDeLaAplicación
Lectura
||leerString ( )
||leerChar ( )
PrgBienvenida2
||leerInt ( )
||main ( ) ||leerLong ( )
||leerFloat ( )
||leerDouble ( )
84 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
ENTRADA: nombre
SALIDA: nombre, mensaje
INICIO
LEER nombre
FIN
En diagrama de flujo:
INICIO
nombre
nombre, mensaje
FIN
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 85
Clase PrgBienvenida2
#include <iostream>
#include <string>
using std::cout ;
using std::cin ;
using std::endl ;
using std::string ;
int main ( ) {
system ( “PAUSE” ) ;
return 0 ;
}
Clase PrgBienvenida2
package dominioDeLaAplicacion ;
class PrgBienvenida2 {
public static void main ( String arg [ ] ) {
Problema 008
Enunciado: Ingrese el nombre y la edad de una persona. Muestre los datos ingresados.
Paquete
dominioDeLaAplicacion
Clases de dominioDeLaAplicación
Lectura
||leerString ( )
||leerChar ( )
PrgEdad
||leerInt ( )
||main ( ) ||leerLong ( )
||leerFloat ( )
||leerDouble ( )
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 87
INICIO
TEXTO nombre
ENTERO edad
nombre, edad
FIN
Clase PrgEdad
#include <iostream>
#include <string>
int main ( ) {
string nombre ;
int edad ;
system ( “PAUSE” ) ;
return 0 ;
}
Permite especificar el uso de namespace std. El contenido del archivo de encabezado <iostream>
se define como parte del namespace std. Este tiene como miembros a cout, cin, endl, string, entre
otros.
La instrucción using namespace especifica que los miembros de un namespace van a utilizarse
frecuentemente en un programa. Esto permite tener acceso a todos los miembros del namespace y
codificar sentencias de manera más concisa.
Es importante indicar que la mayoría de programadores de C++ consideran que es una mala
práctica el escribir una instrucción using como la indicada, ya que se incluye todo el contenido del
namespace. Si no se utiliza dicha línea de código, deberá especificar qué miembros del namespace
utilizará en su programa. En este caso se utilizarán las siguientes líneas de código, del mismo modo
que en los problemas anteriores:
using std::cout ;
using std::cin ;
using std::endl ;
using std::string ;
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 89
Problema 009
Enunciado: Ingrese el peso de una bolsa de chocolates y muestre los datos ingresados.
Paquete
dominioDeLaAplicacion
Clases de dominioDeLaAplicación
Lectura
||leerString ( )
||leerChar ( )
PrgPeso
||leerInt ( )
||main ( ) ||leerLong ( )
||leerFloat ( )
||leerDouble ( )
90 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
ENTRADA: peso
SALIDA: peso
INICIO
REAL peso
LEER peso
ESCRIBIR peso
FIN
package dominioDeLaAplicacion ;
class PrgPeso {
public static void main ( String arg []) {
double peso ;
System.out.print ( “ Ingrese el peso de la bolsa de chocolates: ” ) ;
peso = Lectura.leerDouble( ) ;
System.out.print ( “ El peso de la bolsa de chocolates es: ” + peso ) ;
}
}
IMPORTANTE
Se recomienda solucionar los problemas propuestos del 6
al 10, planteados al final del presente capítulo.
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 91
2.8.1 Definición
Las operaciones aritméticas y lógicas son las formas o mecanismos que se emplean para procesar los
datos ingresados y obtener información.
2.8.2 Tipos
A. Operadores aritméticos
Para representar las operaciones aritméticas básicas se utilizan los operadores aritméticos, y se
emplean los mismos signos que en la aritmética tradicional.
PÝçÊÌ®¦Ê ù
C++ ù Jò RÖÙÝÄã
®¦Ùà ¥½ç¹Ê
+ + Suma
- - Resta
* * Multiplicación
/ / División
Los operadores aritméticos son binarios, es decir, son operadores que requieren dos operandos.
Por ejemplo, la expresión aritmética num1 * num2 contiene el operador aritmético binario de
multiplicación y dos operandos num1 y num2.
Las expresiones aritméticas deben introducirse en línea recta, y pueden utilizar paréntesis de la
misma forma que en las expresiones algebraicas.
En una expresión aritmética se evalúan primero las operaciones que están entre paréntesis, luego las
operaciones de multiplicación, división y resto, y finalmente las operaciones de suma y resta.
B. Operador de asignación
Permite asignar un determinado valor a una variable.
PÝçÊÌ®¦Ê ù
C++ ù Jò RÖÙÝÄã
®¦Ùà ¥½ç¹Ê
= = Asignación de datos
92 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
C. Operadores relacionales
Permiten crear condiciones lógicas simples que puedan ser usadas en estructuras lógicas de decisión
y estructuras lógicas de repetición.
PÝçÊÌ®¦Ê ù
C++ ù Jò RÖÙÝÄã
®¦Ùà ¥½ç¹Ê
< < Menor que
> > Mayor que
= ó == == Igual que
<= <= Menor o igual que
>= >= Mayor o igual que
<> ó != != Distinto de
D. Operadores lógicos
Permiten crear condiciones lógicas compuestas, que pueden ser usadas en estructuras lógicas de
decisión y estructuras lógicas de repetición.
PÝçÊÌ®¦Ê ù
C++ ù Jò RÖÙÝÄã
®¦Ùà ¥½ç¹Ê
NO (NOT) ó ! ! Negación
Y (AND) ó && && Conjunción
O (OR) ó || || Disyunción
Problema 010
Enunciado: Se requiere mostrar el resultado de sumar, multiplicar, restar y dividir los números
912123 y 735.
Defina el nombre del proyecto y desarrolle la definición del paquete y las clases.
ENTRADA:
SALIDA: suma, multi, resta, divi
INICIO
FIN
En diagrama de flujo:
Algoritmo PrgOperaciones – main ( )
INICIO
FIN
94 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
#include <iostream>
#include <conio.h>
using std::cout ;
using std::endl ;
int main () {
long num1 = 912123, num2 = 735, suma, resta, multi ;
double divi ;
suma = num1 + num2 ;
resta = num1 – num2 ;
multi = num1 * num2 ;
divi = (double) (num1) / num2 ;
Clase PrgOperaciones
package dominioDeLaAplicacion ;
class PrgOperaciones {
Problema 011
Defina el nombre del proyecto y desarrolle la definición del paquete y las clases.
INICIO
ESCRIBIR precioTotal
FIN
96 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
En diagrama de flujo:
INICIO
precio,
descuento
precioTotal
FIN
Clase PrgArƟculo
package dominioDeLaAplicacion ;
class PrgArticulo {
public static void main ( String arg []) {
Problema 012
Enunciado: Diseñe un programa que permita ingresar dos números enteros, y muestre la suma de
los dígitos correspondientes a las unidades, decenas y centenas de los números ingresados.
Defina el nombre del proyecto y desarrolle la definición del paquete y las clases.
INICIO
unidades1 = numero1 % 10
unidades2 = numero2 % 10
decenas1 = ( numero1 / 10 ) % 10
decenas2 = ( numero2 / 10 ) % 10
centenas1 = ( numero1 / 100 ) % 10
centenas2 = ( numero2 / 100 ) % 10
Clase PrgSumaDigitos
package dominioDeLaAplicacion ;
class PrgSumaDigitos {
public static void main ( String arg [ ] ) {
unidades1 = numero1 % 10 ;
unidades2 = numero2 % 10 ;
decenas1 = ( numero1 / 10 ) % 10 ;
decenas2 = ( numero2 / 10 ) % 10 ;
Clase PrgSumaDigitos
#include <iostream>
#include <conio.h>
int main () {
unidades1 = numero1 % 10 ;
unidades2 = numero2 % 10 ;
decenas1 = ( numero1 / 10 ) % 10 ;
decenas2 = ( numero2 / 10 ) % 10 ;
system ( “PAUSE” ) ;
return EXIT_SUCCESS ;
}
IMPORTANTE
A continuación, se definen formalmente los pasos del Método de las 6’D para el desarrollo de
soluciones utilizando dos paquetes.
ENUNCIADO
DEL
PROBLEMA
MODELAMIENTO CODIFICACIÓN
}|Determinar la }|Determinar el }|Codificar el diseño
información deseada nombre del proyecto. de la solución del
(salida). }|Definir los paquetes problema. Utilizar
}|Determinar los y desarrollar el el lenguaje de
datos de entrada diagrama de paquetes programación C++ o
(entrada). respectivo. Establecer Java.
}|Establecer cómo la dependencia.
se solucionará el Utilice UML.
problema (proceso). }|Definir las clases
que serán parte
de la solución del
problema. Utilice
UML.
ALGORITMO
}|Diseñar el algoritmo
para el método
principal. Utilizar
pseudocódigo o
diagrama de flujo.
De manera general, la Etapa 03 - “Diseño de la solución” se divide en dos partes: modelamiento (paso
1, 2 y 3) y algoritmo (paso 4); mientras que la Etapa 04 - “Desarrollo de la solución” contiene la parte
de codificación (paso 1). También se puede utilizar esta división en el desarrollo de las soluciones.
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 101
Problema 013
Etapa 01 - Descripción del problema
Enunciado: Desarrolle una solución que permita calcular el área de un cuadrado y el área de un
triángulo rectángulo. Considere:
Área del cuadrado = lado2
Área del triángulo rectángulo = (base x altura) / 2
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
3. Definición de clases
Desarrolle la definición de las clases
INICIO
REAL lado, base, altura, areaCuadrado, areaRectangulo
LEER lado, base, altura
En diagrama de flujo:
INICIO
areaCuadrado,
areaTriangulo
FIN
Clase PrgAreas
#include <iostream>
#include <conio.h>
using namespace::std;
int main ( ) {
double lado, base, altura , areaCuadrado, areaTriangulo ;
cout << “ Ingrese el lado del cuadrado: ” ;
cin >> lado ;
cout << “ Ingrese la base del triángulo: ” ;
cin >> base ;
cout << “ Ingrese la altura del triángulo: ” ;
cin >> altura ;
Clase PrgAreas
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgAreas {
public static void main ( String arg [ ] ) {
double lado, base, altura, areaCuadrado, areaTriangulo ;
System.out.print ( “ Ingrese el lado del cuadrado: ” ) ;
lado = Lectura.leerInt ( ) ;
System.out.print ( “ Ingrese la base del triángulo: ” ) ;
base = Lectura.leerInt ( ) ;
System.out.print ( “ Ingrese la altura del triángulo: ” ) ;
altura = Lectura.leerInt ( ) ;
System.out.println ( ) ;
System.out.println ( “ El área del cuadrado es \t: ” + areaCuadrado ) ;
System.out.println ( “ El área del triángulo es \t: ” + areaTriangulo ) ;
}
}
Problema 014
Enunciado: Desarrolle una solución que permita ingresar una cantidad de dinero en dólares,
mostrando la menor cantidad de billetes de 100, 50, 10 y monedas de 1 dólar que serán necesarios
para completar la cantidad ingresada.
A. Resultado deseado: Mostrar la menor cantidad de billetes de 100, 50, 10 y monedas de 1 dólar,
necesarios para completar la cantidad ingresada.
B. Datos necesarios: Cantidad de dinero en dólares.
C. Procesamiento: La cantidad de dinero en dólares será ingresada por el teclado y almacenado
en una variable (dolares). Luego se calculará la menor cantidad de billetes
y monedas necesarios para completar la cantidad ingresada, almacenando
los resultados en variables (b100, b50, b10 y m1). Los resultados se
mostrarán por pantalla.
104 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
3. Definición de clases
Clase de
Clase de biblioteca
dominioDeLaAplicacion
Lectura
||leerString ( )
PrgDolares ||leerChar ( )
||leerInt ( )
||main
||leerLong ( )
||leerFloat ( )
||leerDouble ( )
ENTRADA: dolares
SALIDA: b100, b50, b10, m1
INICIO
FIN
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 105
En diagrama de flujo:
INICIO
dolares
FIN
#include <iostream>
#include <conio.h>
int main ( ) {
getch ( ) ;
return 0 ;
}
106 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgDolares
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgDolares {
public static void main ( String arg [ ] ) {
System.out.println ( ) ;
System.out.println ( “ Cantidad de billetes de $100 \t: ” + b100 ) ;
System.out.println ( “ Cantidad de billetes de $50 \t: ” + b50 ) ;
System.out.println ( “ Cantidad de billetes de $10 \t: ” + b10 ) ;
System.out.println ( “ Cantidad de monedas de $1 \t: ” + m1 ) ;
}
}
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 107
Problema 015
Enunciado: Leer un número y calcular el resto de dividir el número entre 2. Muestre el resto de la
división.
dominioDeLaAplicacion biblioteca
3. Definición de clases
Lectura
||leerString ( )
PrgRestoDivision
||leerChar ( )
||main ||leerInt ( )
||leerLong ( )
||leerFloat ( )
||leerDouble ( )
108 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
ENTRADA: numero
SALIDA: resto
INICIO
ESCRIBIR resto
FIN
Observe que en el diseño del algoritmo aparece la regla “RESTO”, que es utilizada en pseudocódigo
y diagrama de flujo para obtener el resto o residuo de una división. Dicha palabra no se puede
utilizar como nombre de variable. Puede utilizar también el signo de porcentaje (%).
Clase PrgRestoDivision
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgRestoDivision {
public static void main ( String arg [ ] ) {
resto = numero % 2 ;
Problema 016
Enunciado: Dada las horas, minutos y segundos transcurridos del día miércoles, desarrolle una
solución que permita mostrar las horas, minutos y segundos faltantes para llegar al mediodía del
viernes próximo.
ENTRADA: segTransMier
SALIDA: horas, minutos, segundos
INICIO
ENTERO segTransMier ;
ENTERO segFaltanMier, segFaltanJue, segFaltanVie, segFaltanTotal
ENTERO horas, minutos, segundos
LEER segTransMier
FIN
Clase PrgHoras
#include <iostream>
#include <conio.h>
int main ( ) {
int segTransMier ;
int segFaltanMier, segFaltanJue, segFaltanVie,segFaltanTotal ;
int horas, minutos, segundos ;
// Hallando los segundos que faltan para el medio día del viernes
segFaltanMier = 24 * 3600 – segTransMier ;
segFaltanJue = 24 * 3600 ;
segFaltanVie = 12 * 3600 ;
segFaltanTotal = segFaltanMier + segFaltanJue + segFaltanVie ;
getch ( ) ;
return 0 ;
}
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 111
Clase PrgHoras
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgHoras {
public static void main ( String arg [ ] ) {
int segTransMier ;
int segFaltanMier, segFaltanJue, segFaltanVie,segFaltanTotal ;
int horas, minutos, segundos ;
// Hallando los segundos que faltan para el medio día del viernes
segFaltanMier = 24 * 3600 - segTransMier ;
segFaltanJue = 24 * 3600 ;
segFaltanVie = 12 * 3600 ;
segFaltanTotal = segFaltanMier + segFaltanJue + segFaltanVie ;
}
}
112 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 017
Enunciado: Una fábrica que se dedica a la producción de baldes de plástico, tiene registrado los
siguientes tiempos de producción para cada uno de sus productos.
Se solicita desarrollar una solución que permita determinar el tiempo en horas, minutos y segundos
que se necesitarán para producir una determinada cantidad de baldes de cada tipo.
INICIO
tiempoA = baldesA * 15
tiempoB = baldesB * 15
tiempoC = baldesC * 62
FIN
Clase PrgBaldes
#include <iostream>
#include <conio.h>
int main ( ) {
getch ( ) ;
return 0 ;
}
114 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgBaldes
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgBaldes {
public static void main ( String arg []) {
System.out.print ( ) ;
System.out.print ( “ Cantidad de horas \t : ” + horas ) ;
System.out.print ( “ \n Cantidad de minutos \t : ” + minutos ) ;
System.out.print ( “ \n Cantidad de segundos \t : ” + segundos ) ;
}
}
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 115
Problema 018
Enunciado: Una empresa encuestadora ha categorizado a los habitantes de una provincia en cuatro
categorías, tal como se muestra en el cuadro siguiente:
Desarrolle una solución basada en una cantidad de personas, determine y muestre la cantidad de
personas por cada categoría y el porcentaje que representa cada una.
INICIO
ENTERO personas
REAL numA, numB, numC, numD
REAL porA, porB, porC, porD
El símbolo que contiene una letra al final del diagrama, representa un conector de página y permite diseñar
un diagrama de flujo en varias páginas.
116 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
personas
FIN
Clase PrgCatPersonas
#include <iostream>
int main ( ) {
int personas ;
double numA, numB, numC, numD ;
double porA, porB, porC, porD ;
system ( “PAUSE” ) ;
return 0 ;
}
Problema 019
Etapa 01 - Descripción del problema
Enunciado: Calcule y visualice el perímetro y el área de un círculo. Ingrese el radio del círculo.
INICIO
radio
area, perimetro
FIN
# include <iostream>
#include <conio.h>
using namespace::std;
int main() {
getch ( ) ;
return 0 ;
}
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 119
Clase PrgDatosCirculo
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgDatosCirculo {
System.out.println ( ) ;
System.out.println ( “ El área del círculo es: ” + area ) ;
System.out.println ( “ El perímetro del círculo es: ” + perimetro ) ;
}
}
Problema 020
Enunciado: Calcule la nota final que ha obtenido un alumno en el curso de programación avanzada.
Utilice la siguiente fórmula: nf = ( n1 + n2 + n3 + ( n4 * 2) ) / 5. Ingrese las notas n1, n2, n3 y n4 a
través del teclado.
INICIO
nf = ( n1 + n2 + n3 + ( n4 * 2)) / 5
ESCRIBIR nf
FIN
En pseudocódigo:
INICIO
nf = ( n1 + n2 + n3 + ( n4 * 2) ) / 5
ESCRIBIR nf
FIN
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 121
Clase PrgNotaFinal
#include <iostream>
#include <conio.h>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
nf = ( n1 + n2 + n3 + ( n4 * 2) ) / 5 ;
getch ( ) ;
return 0 ;
}
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNotaFinal {
public static void main ( String arg []) {
nf = ( n1 + n2 + n3 + ( n4 * 2) ) / 5 ;
System.out.println ( ) ;
System.out.print ( “ El promedio obtenido por el alumno es ” ) ;
System.out.println ( nf ) ;
}
}
Problema 021
Enunciado: Los empleados de una empresa ganan un sueldo neto que es igual al sueldo bruto
menos descuentos. Si se sabe que los descuentos constituyen el 12 % del sueldo bruto y que los
empleados cobran el 40 % del sueldo neto en la quincena y el resto a fin de mes. Desarrolle
una solución que permita calcular y mostrar lo siguiente: el descuento, el sueldo neto, el monto a
cobrar en quincena y el monto a cobrar a fin de mes.
ENTRADA: sBruto
SALIDA: descuento, sNeto, mQuincena, mFinMes
INICIO
FIN
En diagrama de flujo:
INICIO
Calculando el descuento
REAL sBruto, descuento, sNeto, (12 %),
mQuincena, mFinMes el sueldo neto, el monto
de pago en quincena y
el monto de pago a fin
de mes.
LEER sBruto
ESCRIBIR
descuento, sNeto,
mQuincena, mFinMes
FIN
124 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgSueldoObrero
#include <iostream>
#include <conio.h>
int main ( ) {
getch ( ) ;
return 0 ;
}
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 125
Clase PrgSueldoObrero
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgSueldoObrero {
public static void main ( String arg [] ) {
System.out.println ( ) ;
System.out.println ( “ El total de descuento es: ” + descuento) ;
System.out.println ( “ El sueldo Neto es: ” + sNeto) ;
System.out.println ( “ El monto a cobrar en quincena es: ” + mQuincena) ;
System.out.println ( “ El monto a cobrar en fin de mes es: ” + mFinMes) ;
}
}
IMPORTANTE
PUNTO APARTE
Una vez instalado el JDK y establecidos los valores de las variables de entorno mencionadas, deberá
desarrollar sus aplicaciones siguiendo las siguientes etapas:
2.10.1 Edición
Observe el uso del block de notas de MS-Windows para la edición o codificación de la solución del
segundo problema planteado en el presente texto. Como ejemplo, este archivo será grabado con el
nombre “PrgMensaje2.java” en la carpeta “C:\aplicaciones\dominioDeLaAplicacion”.
2.10.2 Compilación
Etapa en la que se genera un archivo class (archivo de código de bytes) en base a un archivo fuente.
La compilación se realiza utilizando un programa denominado javac.exe. almacenado en la carpeta
bin de la carpeta donde se instaló el JDK.
2.10.3 Ejecución
Se ejecuta el archivo class generado en la etapa de compilación. Este archivo class es ejecutado
por la Máquina Virtual de Java (JVM por sus siglas en ingles). Es importante indicar que existe una
JVM por cada plataforma, y todas las JVM pueden ejecutar el archivo class generado. La ejecución
se puede realizar utilizando el programa denominado java.exe o el programa llamado javaw.exe,
ambos almacenados en la carpeta bin de la carpeta donde se instaló el JDK. (Uno se utiliza para
aplicaciones basadas en consola y el otro para aplicaciones basadas en ventanas).
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 127
Resulta muy conveniente escribir un archivo por lotes, llamado también archivo de comando o archivo
de batería, que permita compilar y ejecutar un determinado archivo fuente.
Observe la creación de un archivo por lotes en la plataforma MS-Windows y como se utilizan los
programas javac.exe y java.exe para compilar y ejecutar el archivo “PrgMensaje2.java” almacenado
en la carpeta “C:\aplicaciones\dominioDeLaAplicacion” en la etapa de EDICIÓN. Como ejemplo, el
archivo por lotes será grabado con el nombre “PrgMensaje2.bat” en la carpeta “C:\aplicaciones”.
Al ejecutar el archivo por lotes de MS-Windows (se ejecuta haciendo doble clic sobre el archivo), se
crea el archivo class en la carpeta “C:\aplicaciones\dominioDeLaAplicacion” y se ejecuta la aplicación.
Para una correcta ejecución de la aplicación, recuerde que deberá observar y establecer los valores de
las variables de entorno PATH y CLASSPATH. En MS-Windows, dichos valores se establecen en el PANEL
DE CONTROL en la utilidad SISTEMA. Ahí deberá seleccionar Opciones avanzadas y luego Variables de
entorno.
128 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Es imprescindible que verifique por lo menos la variable PATH. En dicha variable se habrá especificado
la ruta donde se encuentran los archivos ejecutables de Java. Dichos archivos se encuentran en la
carpeta bin, dentro de la carpeta donde instaló el JDK. Por ejemplo, para la ejecución de la aplicación
anterior se instaló el JDK en la carpeta “C:\jdk1.5.0_06”. Esto significa que se deberá verificar si la ruta
“C:\jdk1.5.0_06\bin” está establecida en la variable PATH. Si no está establecida se deberá modificar la
variable PATH y agregar dicha ruta al final de las rutas ya establecidas, anteponiendo un punto y coma,
tal y como se muestra en el siguiente gráfico:
Finalizado el establecimiento de dicha ruta podrá utilizar los programas javac.exe, java.exe, javaw.exe
o cualquier otro programa del JDK desde cualquier carpeta.
Para ingresar datos y mostrar información en Java, también puede utilizar la clase LE. Esta clase,
a diferencia de la System y la de Lectura, permite ingresar datos y mostrar información utilizando
cuadros de diálogo. A continuación se explican los métodos básicos definidos en la clase LE:
A continuación se definen formalmente los pasos del Método de las 6’D para el desarrollo de
soluciones utilizando dos paquetes.
ENUNCIADO
DEL
PROBLEMA
Etapa 02 Etapa 03 Etapa 04
Definición Diseño Desarrollo
Solución Solución Solución
MODELAMIENTO CODIFICACIÓN
}|Determinar la }|Determinar el nombre }|Codificar el diseño
información deseada del proyecto. de la solución del
(salida). }|Definir los paquetes problema. Utilizar
}|Determinar los y desarrollar el el lenguaje de
datos de entrada diagrama de paquetes programación Java.
(entrada). respectivo. Establecer UƟlice la clase
}|Establecer como la dependencia. Utilice reuƟlizable LE.
se solucionará el UML.
problema (proceso). }|Definir las clases que
serán parte de la
solución del problema.
Utilice UML.
ALGORITMO
}|Diseñar el algoritmo
para el método principal.
UƟlizar diagrama de
acƟvidades.
130 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 022
Enunciado: En base al enunciado del problema N⁰ 6, se desea mostrar el mensaje “Feliz Navidad”
y el mensaje “Prospero año nuevo”. Desarrolle el modelamiento y la codificación en el lenguaje de
programación Java. Utilice la clase LE para mostrar información.
Paquete
dominioDeLaAplicacion
Clases de dominioDeLaAplicacion
LE
(from biblioteca)
||leerString ( )
||leerChar ( )
PrgSaludo ||leerInt ( )
||leerLong ( )
||main ( )
||leerFloat ( )
||leerDouble( )
||mostrarResultado ( )
||mostrarInformacion ( )
||mostrarError ( )
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 131
msjNavidad
INICIO
y msjNuevo son
variables
Mostrar msjNavidad
y msjNuevo
FIN
Clase PrgSaludo
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgSaludo {
public static void main ( String arg [ ] ) {
Resultado:
132 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 023
Enunciado: En base al enunciado del problema N⁰ 8, ingrese el nombre y la edad de una persona
y luego muéstrelos por pantalla. Desarrolle el modelamiento y la codificación en el lenguaje de
programación Java. Utilice la clase LE para ingresar datos y mostrar información.
Paquete
dominioDeLaAplicacion
Clases de dominioDeLaAplicacion
LE
(from biblioteca)
||leerString ()
PrgEdad
||leerChar ()
||main () ||leerInt ()
||leerLong ()
||leerFloat ()
||leerDouble ()
||mostrarResultado ()
||mostrarInformacion ()
||mostrarError ()
…
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 133
INICIO
ESCRIBIR nombre,
edad
FIN
Clase PrgEdad
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgEdad {
public static void main ( String arg [ ] ) {
String nombre ;
int edad ;
Resultado:
La clase LE facilita el ingreso de datos y permite mostrar información utilizando cuadros de diálogo. La
codificación de la clase LE podrá encontrarla en el apéndice. Observe que la clase LE utiliza la clase
JOpƟonPane que se encuentra en el paquete javax.swing, del lenguaje de programación Java.
Para ingresar datos se utilizan los métodos leerChar( ), leerDouble( ), leerFloat( ), leerInt( ),
leerLong( ) y leerString( ) de la clase LE. Dependiendo el tipo de dato que desee ingresar deberá
utilizar el método correspondiente. El método leerClave( ) permite ingresar datos sin que estos se
visualicen, en lugar de visualizar los datos ingresados se visualizan asteriscos.
|En la solución del problema 022 se uƟlizó otro método de la clase LE que permite mostrar
información denominado mostrarResultado( ). Este método no muestra un ícono determinado.
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 135
Problema 024
Clase PrgArƟculo2
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgArticulo2 {
public static void main ( String arg [] ) {
Resultado:
136 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 025
Clase PrgAreaTriangulo
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgAreaTriangulo {
public static void main ( String arg [ ] ) {
double altura, base, area ;
Resultado:
IMPORTANTE
PROBLEMAS PROPUESTOS
16. Desarrollar una solución que permita ingresar la suma y diferencia de dos números enteros, y en
base a estas cantidades calcular y mostrar los números.
17. Desarrollar una solución que permita ingresar la velocidad promedio y el tiempo total que demoró
en llegar a la meta el campeón del rally “El poderoso”. Calcular y mostrar la distancia recorrida.
18. Desarrollar una solución que permita ingresar 5 números enteros positivo. Mostrar la media
aritmética y la media armónica de dichos números.
19. Desarrollar una solución que permita ingresar la masa y la aceleración de un objeto. Calcular la
fuerza y mostrar el equivalente en Newton (N), Dina (Dn) y kilogramos fuerza (kgf).
1 N = 1 kg m/s2
1 Dn = 1 g cm/s2
1 kgf = 9.8 kg m/s2
20. Desarrollar una solución que permita ingresar la base mayor, la base menor y la altura de un
trapecio. Calcular y mostrar su área.
21. Desarrollar una solución que permitan mostrar dos mensajes separados por dos líneas. El 1er
mensaje será: “Universidad San Martín de Porres”, y el 2do mensaje: “Facultad de Ingeniería y
Arquitectura”.
22. Desarrollar una solución que permita ingresar una cantidad entera de dinero. Mostrar el menor
número posible de billetes de S/. 200, S/. 100, S/. 50, S/. 20 y S/. 10 que existen en la cantidad de
dinero ingresada.
23. Desarrollar una solución que permita ingresar tu nombre. Mostrar el mensaje: “Hola, me llamo”,
seguido de un espacio en blanco y el nombre ingresado.
24. Desarrollar una solución que permita obtener el promedio ponderado de un alumno del 3er
ciclo de estudios. El promedio se calcula con la sumatoria de los promedios finales de cada curso
multiplicado cada uno por sus respectivos números de créditos, entre la sumatoria de números
de créditos. Los promedios finales serán ingresados por teclado, tener en cuenta la siguiente
información:
Curso Créditos
AED I 5
Fund. de Diseño Web 3
Cálculo II 5
Física I 5
Estadística I 4
Teoría Económica 3
25. Desarrollar una solución que permita ingresar la hora de entrada y la hora de salida de un obrero
en un día de trabajo (en minutos), y en base a esta información calcular y mostrar el tiempo que
permaneció en la empresa (en horas y minutos), y el sueldo en soles que ganará ese dia, si por
hora le pagan $ 6. Considere: tipo de cambio = 3.10 nuevos soles.
26. Desarrollar una solución que permita calcular y mostrar la potencia 4 de un número ingresado
por teclado.
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 139
27. Desarrollar una solución que permita ingresar la temperatura en Celsius. Mostrar su equivalente
en grados Fahrenheit y en Kelvin. Considere:
F = (9/5) * C + 32
K = C + 273
28. Desarrollar una solución que permita calcular y mostrar el promedio ponderado que un alumno
ha obtenido en base a sus cuatro notas y al peso asignado a cada una de ellas.
29. Desarrollar una solución que permita calcular la velocidad final de un automóvil que parte del
reposo y que se mueve con aceleración constante durante siete segundos. Ingresar el valor de la
aceleración y mostrar la velocidad final del automóvil después de transcurridos los 7 segundos.
Considere: Vf = Vo + a * t.
30. Desarrollar una solución que permita ingresar el radio y la altura de un cilindro. Calcular y mostrar
el volumen del cilindro. Considere: v = [3.1416 * (radio**2)] * altura.
31. Desarrollar una solución que permita determinar la suma de los primeros “n” números enteros
consecutivos, utilizando la siguiente fórmula: n * (n + 1) / 2.
32. Desarrollar una solución que permita mostrar el tiempo (en segundos) que demora en caer una
pelota luego de ser lanzada hacia arriba desde el suelo (despreciar unidades).
Considere: tiempo de vuelo = (2*Velocidad Inicial) / g.
Donde: g = 9,8 m/s2.
33. Desarrollar una solución que permita mostrar las dimensiones reales de un terreno a partir de un
mapa de escala 1:100000. Ingresar la representación en el mapa en centímetros (cm). Considere:
t = 100000 * cm.
34. Desarrollar una solución que permita ingresar varios números enteros. Calcular la sumatoria de
los cubos de los números ingresados. Considere: [n*(n + 1) / 2] ** 2.
35. Desarrollar una solución que permita mostrar el precio real de un artículo, teniendo en cuenta
que al ingresar el precio del artículo no se incluye el I.G.V. (el I.G.V. es equivalente al 19% del precio
del artículo).
36. Desarrollar una solución que permita leer el costo de un artículo y su precio de venta. Calcular y
mostrar su utilidad.
37. Desarrollar una solución que permita convertir y mostrar una cantidad de soles a dólares y a
euros. Considerar como tipo de cambio; 1 dólar = 3.00 soles, y 1 euro = 1.4 dólares.
38. Desarrollar una solución que permita convertir una cantidad expresada en metros a sus
equivalentes en centímetros, pulgadas, pies y yardas. Considerar la siguiente información:
}|1 metro = 100 cm
}|1 pulgada = 2.54 cm
}|1 pie = 12 pulgadas
}|1 yarda = 3 pies
39. Desarrollar una solución que permita leer la capacidad de un disco duro en Gigabytes. Mostrar el
equivalente en Megabytes, Kilobytes y Bytes.
}|1 Kilobyte = 1024 Bytes
}|1 Megabyte = 1024 Kilobytes
}|1 Gigabyte = 1024 Megabytes
140 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
40. Desarrollar una solución que permita calcular el porcentaje de hombres y el porcentaje de
mujeres que están matriculados en un determinado curso.
41. Desarrollar una solución que permita determinar la cantidad total de metros2 que tiene un
terreno, en base a sus medidas parciales en pulgadas2, pies2, yardas2 y metros2. Considere las
siguientes equivalencias:
1 metro2 = 1549.99 pulgadas2 = 10.76 pies2 = 1.20 yardas2.
42. Un contratista desea determinar cuánto gastará en pagar la mano de obra por la construcción de
un edificio, conociendo la tarifa por hora de sus trabajadores, la cantidad de minutos trabajados
por cada uno ellos y el monto que se pagará por hora trabajada.
Tipo trabajador Tarifa por hora
A S/. 50
B S/. 25
C S/. 20
D S/. 10
43. Una compañía telefónica desea que se desarrolle una solución que permita determinar cuánto
le debe cobrar a sus usuarios por llamada, conociendo la hora de inicio y fin de las mismas.
Asimismo, considerar que la hora o fracción cuesta S/. 1.00 y existe un costo por establecimiento
de llamada de S/. 0.50.
44. Desarrollar una solución que permita calcular y visualizar el número de segundos que hay en un
determinado número de días.
45. Desarrollar una solución que permita ingresar un número de cuatro cifras. Determinar la suma de
las cifras del número ingresado.
46. Desarrollar una solución que permita determinar la velocidad inicial con que partió un automóvil
de un determinado punto y cuál fue la distancia que recorrió, conociendo su velocidad final, su
aceleración y el tiempo empleado en el recorrido. Considerar las siguientes fórmulas:
e = Vo + at2
Vf = Vo + at
donde:
Vo = Velocidad Inicial
Vf = Velocidad Final
a = Aceleración
e = Espacio recorrido
47. Desarrollar una solución que permita realizar el cálculo del pago mensual del sueldo de un
empleado de una empresa. Dicho cálculo se realiza de la siguiente manera: el sueldo básico se
calcula en base al número total de horas trabajadas, basado en una tarifa horaria. Al sueldo
básico se le aplica una bonificación del 35 % obteniéndose el sueldo bruto. Al sueldo básico se
le aplica un descuento del 12 % obteniéndose el sueldo neto. Mostrar el sueldo básico, el sueldo
bruto y el sueldo neto de un trabajador.
48. Desarrollar una solución que permita calcular y visualizar el perímetro y el área de un rectángulo.
Ingresar la base y la altura del rectángulo. Considerar: area = base * altura, y perímetro = 2 * (base
+ altura).
CAP. 2: ESTRUCTURAS LÓGICAS DE SECUENCIA Y ESTRUCTURA DE DATOS VARIABLE 141
49. Desarrollar una solución que permita ingresar el sueldo de un obrero. Calcular el aumento de
sueldo del obrero por concepto de escolaridad (17 %). Mostrar el sueldo a cobrar.
50. Desarrollar una solución que permita ingresar el sueldo de un obrero de la empresa “El Gran
Chaparral S. A.”. Calcular su respectivo descuento del 14 % por concepto de impuestos y el 3 %
por concepto de cafetería. Mostrar el total de descuentos y el sueldo a cobrar.
51. Desarrollar una solución que permita invertir un número de cuatro dígitos. El número deberá ser
ingresado por teclado. Ejemplo: se ingresa el número 3579 se debe visualizar 9753.
52. Desarrollar una solución que permita calcular el sueldo neto de un vendedor. Dicho cálculo se
realiza en base a un sueldo básico equivalente a S/. 465.00 nuevos soles, más una comisión del
18 % por cada venta que el vendedor realice. Mostrar el sueldo neto del vendedor sabiendo que
hizo cinco ventas en el mes.
53. Desarrollar una solución que permita calcular el volumen de una esfera. Ingresar el radio.
Considerar: v = (4/3) * pi * radio ** 3.
54. Desarrollar una solucion que permita ingresar un número de tres cifras y permita mostrarlo con
sus cifras invertidas. Por ejemplo, si se ingresa 351 se debe visualizar 153.
55. Desarrollar una solución que permita ingresar un número de una cifra. Calcular su potencia 4.
Mostrar como resultado el número invertido.
56. Desarrollar una solución que permita ingresar un número de una cifra de tipo REAL. Calcular su
potencia 5. Mostrar como resultado la parte entera del número invertido.
57. Un padre desea hacer su testamento, en el desea repartir su fortuna entre sus cuatro hijos, y
desea hacerlo en forma proporcional a sus edades. Desarrolle una solución que determine el
monto que le toca a cada hijo
58. Desarrollar una solución que permita utilizar la ecuación de la energía, para poder calcular la
cantidad de energía que podría producir la materia con una masa determinada (en kg). Ingresar
la masa de la materia. Considerar:
E = m * C2
C = 300 000 km/s (velocidad de la luz)
59. Desarrollar una solución que permita calcular el error absoluto (EA) para cada una de las
observaciones siguientes:
Ni ai (cm)
1 7.13
2 7.16
3 7.09
4 7.02
60. Dos amigos desean juntar un capital para realizar una inversión; para ello, cada uno aporta un
cierto capital en soles, dólares y euros. Si la inversión requerida es de 3500 euros, desarrolle una
solución que permita mostrar el capital total aportado, y si el capital total aportado cubre o no el
monto de la inversión.
Considere: 1 dólar = 3.25 soles.
1 euro = 1.28 dólares.
CAP.
Estructuras lógicas de
decisión o selección
3
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 145
Este capítulo explica las estructuras lógicas de decisión. Es importante mencionar que utilizando
las estructuras lógicas de decisión se pueden desarrollar algoritmos, de tal forma que estos puedan
ser diseñados en pseudocódigo o diagrama de flujo, para luego ser codificados en un lenguaje de
programación.
Etapa 02
Definición
Solución
Etapa 03
Diseño
Solución
Etapa 04
MODELAMIENTO Desarrollo
Solución
ALGORITMO
PROGRAMACIÓN
146 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
PROYECTO MODELAMIENTO
CODIFICACIÓN
dominioDeLaAplicacion Biblioteca
Nombre
Clase
Atributos
Método( ) ALGORITMO
Sentencias
Declaración y
Descripción definición de
de datos datos
SE DESARROLLAN UTILIZANDO:
- Estructuras lógicas de secuencia.
- Estructuras lógicas de decisión.
ALMACENANDO EN:
Estructuras de datos (Variable)
En el desarrollo de las primeras treinta soluciones se puede apreciar el uso de las estructuras lógicas de
decisión simple, doble y múltiple; cómo se diseñan los algoritmos utilizando pseudocódigo y/o diagrama
de flujo, y cómo se codifican en el lenguaje de programación C++ y/o Java. Esto permite comprender
los aspectos fundamentales del desarrollo de soluciones utilizando este tipo de estructuras lógicas.
ENUNCIADO DEL
PROBLEMA
MODELAMIENTO CODIFICACIÓN
}|Determinar la }|Determinar
el nombre }|Codificar el diseño de la
información deseada del proyecto. solución del problema.
(salida). }|Definir los paquetes y Utilizar el lenguaje de
}|Determinar los datos de desarrollar el diagrama programación C++ o
entrada (entrada). de paquetes respectivo Java.
}|Establecer como se }|Establecer la
solucionará el problema dependencia. Utilice
(proceso). UML.
}|Definir las clases que
serán parte de la
solución del problema.
Utilice UML.
ALGORITMO
}|Diseñar el algoritmo
para el método
principal. Utilizar
pseudocódigo o
diagrama de flujo.
De manera general, la Etapa 03 - “Diseño de la Solución” se divide en dos partes: modelamiento (paso
1, 2 y 3) y algoritmo (paso 4); por otro lado, la Etapa 04 - “Desarrollo de la solución” contiene la parte de
codificación (paso 1). También se puede utilizar esta división en el desarrollo de las soluciones.
3.2.1 Definición
Son construcciones que permiten alterar el flujo secuencial de una solución, de manera que en
función de una condición o el valor de una variable, se pueda desviar la secuencia de la solución entre
diferentes alternativas. Las estructuras lógicas de decisión son conocidas también como estructuras
lógicas de selección.
148 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Estructuras lógicas
A. Definición: Una estructura de decisión simple “SI... FINSI”, permite alterar el flujo secuencial o los
pasos secuenciales de una solución, ejecutando un conjunto de pasos adicionales si el resultado de
una condición lógica es verdadero.
Este tipo de estructura es útil cuando se tiene la posibilidad de decidir si se ejecuta una determinada
opción o no.
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 149
B. Representación
a. Formato para diseñar algoritmos
En pseudocódigo:
Explicación:
En diagrama de flujo:
VERDADERO
condición
...
FALSO instrucciones
...
F®¦. 3.1
FALSO
condición
VERDADERO
VER
...
instrucciones
...
F®¦. 3.2
150 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
VERDADERO
condición instrucciones
FALSO
F®¦. 3.3
||Explicación:
Si la condición resulta falsa, se sigue el flujo etiquetado con la regla o pauta “FALSO”, y no se
ejecutan las instrucciones que se encuentran en el flujo etiquetado con la regla “VERDADERO”.
Observe las figuras anteriores. Estas representan una estructura de decisión simple en diagrama
de flujo, donde el rombo indica el inicio de la estructura y el círculo indica el final. El rombo permite
evaluar una condición lógica; si el resultado de dicha evaluación es verdadero se ejecuta una o
varias instrucciones; en el caso que se ejecute una o dos instrucciones se puede utilizar el diagrama
de flujo de la figura 3.3, y si se necesitan ejecutar varias instrucciones será preferible utilizar los
diagramas de flujo de la figura 3.1 o de la figura 3.2. Cualquiera sea su elección, recuerde elaborar
un diagrama de flujo con estética y simetría.
VERDADERO
condición
...
FALSO instrucciones
...
F®¦. 3.4
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 151
FALSO
condición
VERDADERO
VER
...
instrucciones
...
F®¦. 3.5
VERDADERO
condición instrucciones
FALSO
F®¦. 3.6
Recuerde que los diagramas de flujo deben elaborarse de izquierda a derecha, y preferentemente
de arriba hacia abajo. En este libro se utilizará el diagrama de flujo mostrado en la figura 3.1 o en
la figura 3.2, para elaborar estructuras lógicas de decisión simple.
if (condición) {
Si la condición resulta verdadera, se ejecutan las
…
sentencias que se encuentra entre las llaves { }.
sentencias
…
Si la condición resulta falsa, no se ejecutan las sentencias
}
que se encuentran entre las llaves { }.
152 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 026
Enunciado: Ingresar el lado de un cuadrado. Calcular y mostrar su área. Si el área del cuadrado
resulta menor que 100, se deberá visualizar el mensaje “Cuadrado pequeño”.
dominioDeLaAplicacion biblioteca
3. Definición de clases
Clases de dominioDeLaAplicación Clase de biblioteca
Lectura
|leerString ( )
PrgAreaCuadrado
|leerChar ( )
|leerInt ( )
|main ( )
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 153
ENTRADA: lado
SALIDA: area, mensaje
INICIO
NUMERO lado, area
TEXTO mensaje = “ ”
LEER lado
area = lado * lado
FIN
En diagrama de flujo:
Algoritmo PrgAreaCuadrado – main ( )
INICIO
lado
VERDADERO
area < 100
area, mensaje
FIN
154 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
#include <iostream>
#include <string>
using namespace::std;
int main ( ) {
int lado, area ;
string mensaje = “ ” ;
Clase PrgAreaCuadrado
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgAreaCuadrado {
public static void main ( String arg [ ] ) {
Problema 027
Enunciado: Ingresar el radio de un círculo. Calcular y mostrar el área y perímetro. Si el área del círculo
resulta mayor que 50, se deberá visualizar el mensaje “Círculo grande”.
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
156 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
3. Definición de clases
Lectura
|leerString ()
PrgAreaCirculo
|leerChar ()
|leerInt ( )
|main ()
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
ENTRADA: radio
SALIDA: area, perimetro, mensaje
INICIO
LEER radio
FIN
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 157
En diagrama de flujo:
INICIO
radio
VERDADERO
area > 50
FALSO
mensaje = “Círculo grande”
area, perimetro,
mensaje
FIN
158 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
#include <iostream>
#include <string>
using std::cout ;
using std::cin ;
using std::string ;
int main ( ) {
double radio, area, perimetro ;
string mensaje = “ ” ;
if ( area > 50 ) {
mensaje = “Círculo grande ” ;
}
Clase PrgAreaCirculo
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgAreaCirculo {
public static void main ( String arg []) {
double radio, area, perimetro ;
String mensaje = “ ” ;
System.out.print ( “ Ingrese el radio del círculo: ” ) ;
radio = Lectura.leerInt ( ) ;
if ( area > 50 ) {
mensaje = “ Círculo grande ” ;
}
System.out.println ( “ El área es: ” + area) ;
System.out.println ( “ El perímetro es : ” + perimetro) ;
System.out.println ( mensaje + “ \n” ) ;
}
}
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 159
Problema 028
nf = (nota1 + nota2) / 2
El resultado se almacenará en una variable (nf). Si la nota final resulta mayor que 13, se almacenará
el mensaje “Felicitaciones” en una variable (mensaje). Finalmente, se mostrará la nota final y el
mensaje.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
REAL nota1, nota2, nf
TEXTO mensaje = “ ”
SI ( nf > 13 ) ENTONCES
mensaje = “Felicitaciones”
FINSI
ESCRIBIR nf, mensaje
FIN
Clase PrgNotaFinal
#include <iostream>
#include <string>
using namespace::std;
int main ( ) {
double nota1, nota2, nf ;
string mensaje = “ ” ;
cout << “ Ingrese la primera nota : ” ;
cin >> nota1 ;
cout << “ Ingrese la segunda nota: ” ;
cin >> nota2 ;
nf = ( nota1 + nota2 ) / 2 ;
if ( nf > 13 ) {
mensaje = “ Felicitaciones ” ;
}
cout << “ La nota final es: ” << nf << “ \n” ;
cout << mensaje << “\n\n” ;
system ( “PAUSE” ) ;
return 0 ;
}
Clase PrgNotaFinal
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNotaFinal {
public static void main ( String arg [ ] ) {
Problema 029
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
ENTERO horas
REAL tarifa, sueldo, descuento = 0
En diagrama de flujo:
Algoritmo PrgSueldo – main ( )
INICIO
horas , tarifa
VERDADERO
sueldo >
1600
FALSO
descuento = sueldo * 0.2
suedo = sueldo - descuento
descuento,
sueldo
FIN
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 163
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgSueldo {
public static void main ( String arg [ ] ) {
int horas ;
double tarifa, sueldo, descuento = 0 ;
}
}
Problema 030
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
En diagrama de flujo:
Algoritmo PrgCompra – main ( )
INICIO
pV, pC ,
cantidad
total = pV * cantidad
VERDADERO
cantidad > 10
El símbolo que contiene una letra al final del diagrama, representa un conector de página y permite diseñar
un diagrama de flujo en varias páginas.
total,
utilidad
FIN
166 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgCompra
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgCompra {
public static void main ( String arg [ ] ) {
int cantidad ;
double total , pV , pC , utilidad , descuento = 0 ;
System.out.print ( “ Ingrese la cantidad de productos: ” ) ;
cantidad = Lectura.leerInt() ;
System.out.print ( “ Ingrese el precio de compra del producto: ” ) ;
pC = Lectura.leerDouble() ;
System.out.print ( “ Ingrese el precio de venta del producto: ” ) ;
pV = Lectura.leerDouble() ;
total = pV * cantidad ;
if ( cantidad > 10 ) {
descuento = total * 0.2 ;
total = total – descuento ;
}
utilidad = total - ( pC * cantidad ) ;
System.out.println ( “ El total a pagar es: ” + total ) ;
System.out.println ( “ La utilidad es: ” + utilidad ) ;
}
}
IMPORTANTE
Se recomienda solucionar los problemas propuestos del 1 al 5,
planteados al final del presente capítulo.
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 167
A. Definición: Una estructura de decisión doble “SI... SINO... FINSI” permite alterar el flujo secuencial o
pasos secuenciales de una solución, ejecutando un conjunto de pasos que dependen del resultado
de una condición lógica. Si la condición resulta verdadera, se ejecuta un conjunto de pasos, y si la
condición resulta falsa, se ejecuta otro conjunto de pasos. En ningún caso se podrá ejecutar ambos
conjuntos de pasos a la vez.
Este tipo de estructura es útil cuando se tiene la necesidad de escoger entre dos posibles opciones.
B. Representación:
a. Formato para diseñar algoritmos
En pseudocódigo:
EXPLICACIÓN:
SI (condición) ENTONCES
… Si la condición resulta verdadera, se ejecutan las
instrucciones instrucciones que se encuentran entre las reglas SI…
… ENTONCES y SINO.
SINO
… Si la condición resulta falsa, se ejecutan las instrucciones
instrucciones que se encuentran entre las reglas SINO y FINSI.
…
FINSI Solo se ejecuta uno de los grupos de instrucciones; en
ningún caso se podrán ejecutar ambos grupos en una
misma ejecución o corrida del programa.
En diagrama de flujo:
FALSO V
VERDADERO
condición
... ...
instrucciones instrucciones
... ...
F®¦. 3.7
168 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
VERDADERO
condición instrucciones
FALSO
LSO
...
instrucciones
...
F®¦. 3.8
VERDADERO
condición
FALSO
LSO
... ...
instrucciones instrucciones
... ...
F®¦. 3.9
EXPLICACIÓN:
}|Si la condición resulta verdadera, se ejecutan las instrucciones que se encuentran en el flujo
etiquetado con la regla “VERDADERO”.
}|Si la condición resulta falsa, se ejecutan las instrucciones que se encuentran en el flujo etiquetado
con la regla “FALSO”.
}|También se pueden elaborar los diagramas de flujo mostrados sin utilizar el círculo de cierre de la
estructura de decisión doble, tal como se muestra a continuación.
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 169
FALSO V
VERDADERO
condición
... ...
instrucciones instrucciones
... ...
F®¦. 3.10
VERDADERO
condición instrucciones
FALSO
LSO
...
instrucciones
...
F®¦. 3.11
VERDADERO
condición
FALSO
LSO
... ...
instrucciones instrucciones
... ...
F®¦. 3.12
170 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
En el presente libro se utilizará el diagrama de flujo mostrado en la figura 3.7 o en la figura 3.9 para
elaborar estructuras lógicas de decisión doble, y siempre se utilizará el círculo para mostrar de manera
más adecuada dónde finaliza la estructura lógica.
if (condición) { EXPLICACIÓN:
…
sentencias Si la condición resulta verdadera, se ejecutan las
… sentencias que se encuentran entre las llaves { }
} else { ubicadas después de la palabra reservada if.
…
sentencias Si la condición resulta falsa, se ejecutan las sentencias
… que se encuentran entre las llaves { } ubicadas después
} de la palabra reservada else.
Problema 031
Enunciado: Ingresar la edad de una persona, si la edad es menor a dieciocho se deberá mostrar el
mensaje “Menor de edad”; caso contrario, se mostrará el mensaje “Mayor de edad”.
dominioDeLaAplicacion biblioteca
3. Definición de clases
Lectura
|leerString ()
PrgMensajeEdad
|leerChar ()
|leerInt ( )
|main ()
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
ENTRADA: edad
SALIDA: mensaje
INICIO
ENTERO edad
TEXTO mensaje
LEER edad
SI ( edad < 18 ) ENTONCES
mensaje = “Menor de edad”
SINO
mensaje = “Mayor de edad”
FINSI
ESCRIBIR mensaje
FIN
172 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
En diagrama de flujo:
INICIO
ENTERO edad
TEXTO mensaje
Edad
FALSO VERDADERO
edad < 18
mensaje
FIN
Clase PrgMensajeEdad
#include <iostream>
#include <string>
using std::cout ;
using std::cin ;
using std::string ;
int main ( ) {
int edad ;
string mensaje ;
if ( edad < 18 ) {
mensaje = “ Menor de edad ” ;
} else {
mensaje = “ Mayor de edad ” ;
}
system ( “ PAUSE ” ) ;
return 0
}
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgMensajeEdad {
public static void main ( String arg [] ) {
int edad ;
String mensaje ;
if ( edad < 18 ) {
mensaje = “ Menor de edad ” ;
} else {
mensaje = “ Mayor de edad ” ;
}
System.out.println ( mensaje ) ;
}
}
174 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 032
Enunciado: Calcular y mostrar la nota final de un alumno en base a tres notas ingresadas. Si la nota
final es menor a catorce se deberá mostrar el mensaje “Desaprobado”; caso contrario, se mostrará el
mensaje “Aprobado”. Considerar: nf = (n1 + n2 + n3) / 3.
nf = (n1 + n2 + n3) / 3.
El resultado se almacenará en una variable (nf). Si la nota final resulta menor que 14 entonces se
almacenará en una variable (mensaje) el mensaje “Desaprobado”; caso contrario, se almacenará el
mensaje “Aprobado”. Finalmente, se mostrará la nota y el mensaje
dominioDeLaAplicacion biblioteca
3. Definición de clases
Lectura
|leerString ()
PrgNotaFinal2 |leerChar ()
|leerInt ( )
|main ()
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 175
En diagrama de flujo:
Algoritmo PrgNotaFinal2 – main ( )
INICIO
n1, n2, n3
FALSO VERDADERO
nf < 14
nf, mensaje
FIN
176 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
#include <iostream>
#include <string>
using std::cout ;
using std::cin ;
using std::endl ;
using std::string ;
int main ( ) {
double n1, n2, n3, nf ;
string mensaje ;
if ( nf < 14 ) {
mensaje = “Desaprobado ” ;
} else {
mensaje = “ Aprobado ” ;
}
system ( “ PAUSE ” ) ;
return 0 ;
}
Clase PrgNotaFinal2
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNotaFinal2 {
public static void main ( String arg [ ] ) {
nf = (n1 + n2 + n3) / 3 ;
if ( nf < 14 ) {
mensaje = “ Desaprobado ” ;
} else {
mensaje = “ Aprobado ” ;
}
}
}
Problema 033
Enunciado: Ingrese el monto a pagar por la compra de varios productos. A dicho monto ingresado
deberá agregarle el Impuesto General a las Ventas (I.G.V.). En caso de que el monto a pagar -incluido
I.G.V.- sea mayor a S/. 500.00 nuevos soles, no se aplicará un descuento de 8 % sino de 2 %.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
178 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
ENTRADA: montoPago
SALIDA: montoPagoFinal
INICIO
REAL montoPago, montoPagoFinal
LEER montoPago
En diagrama de flujo:
Algoritmo PrgArƟculo – main ( )
INICIO
montoPago
VERDADERO
FALSO
montoPagoFinal
> 500
montoPagoFinal
FIN
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 179
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgArticulo {
public static void main ( String arg [ ] ) {
Problema 034
Defina el nombre del proyecto y luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
180 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
ENTRADA: numero
SALIDA: mensaje
INICIO
ENTERO numero
TEXTO mensaje
LEER numero
SI ( numero % 2 == 0 ) ENTONCES
mensaje = “Número es par”
SINO
mensaje = “Número es impar”
FINSI
ESCRIBIR mensaje
FIN
En diagrama de flujo:
Algoritmo PrgParImpar – main ( )
INICIO
ENTERO numero
TEXTO mensaje
numero
FALSO VERDADERO
numero % 2 ==0
mensaje
FIN
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 181
Clase PrgParImpar
#include <iostream>
#include <string>
using std::cout ;
using std::cin ;
using std::string ;
int main ( ) {
int numero ;
string mensaje ;
if ( numero % 2 == 0 ) {
mensaje = “ El número es par ” ;
} else {
mensaje = “ El número es impar ” ;
}
system ( “PAUSE” ) ;
return 0 ;
}
Clase PrgParImpar
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgParImpar {
public static void main ( String arg [ ] ) {
int numero ;
String mensaje ;
if ( numero % 2 == 0) {
mensaje = “ El número es par ” ;
} else {
mensaje = “ El número es impar ” ;
}
System.out.println ( mensaje ) ;
}
}
182 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 035
INICIO
ENTERO horas
REAL tarifa, sueldo, aumento
LEER horas, tarifa
sueldo = horas * tarifa
SI ( sueldo > 2400 ) ENTONCES
aumento = sueldo * 0.2
SINO
aumento = sueldo * 0.1
FINSI
Clase PrgAumento
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgAumento {
public static void main ( String arg [ ] ) {
int horas ;
double tarifa, sueldo, aumento ;
}
}
IMPORTANTE
Se recomienda solucionar los problemas propuestos del 6 al 10,
que están planteados al final del presente capítulo.
184 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Este tipo de estructura es útil cuando se tiene la necesidad de escoger entre más de dos opciones y
se presentan múltiples opciones, a las que se les puede asociar valores de tipo CARACTER o ENTERO.
B. Representación
a. Formato para diseñar algoritmos
En pseudocódigo:
En diagrama de flujo:
valor
variable
F®¦. 3.13
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 185
valor
variable
F®¦. 3.14
valor
variable
F®¦. 3.15
valor
variable
F®¦. 3.16
186 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
EXPLICACIÓN:
Si el valor de la variable es igual a uno de los valores que tiene como etiqueta el flujo, se ejecutan las
instrucciones que están seguidas del flujo (las que indica la flecha).
Si el valor de la variable no es igual a uno de los valores de las etiquetas de los flujos, se ejecuta el flujo
que tiene como regla OTROS. El flujo con la regla OTROS es opcional.
Los diagramas de flujo mostrados en las figuras 3.13, 3.14, 3.15 y 3.16 se utilizan en forma alternativa
para elaborar estructuras lógicas de decisión múltiple, que no requieren evaluar una condición lógica
sino el valor de una variable. En estas estructuras se evalúa una variable y dependiendo de su valor se
ejecutarán un conjunto de instrucciones; sin embargo, es importante comprender que estos diagramas
muestran diferentes formas de diseñar una estructura lógica de decisión múltiple usando diagramas
de flujo.
VERDADERO
instrucciones
valor == 1
FALSO
VERDADERO
instrucciones
valor == 2
FALSO
VERDADERO
valor == 3 instrucciones
FALSO
...
instrucciones
...
F®¦. 3.17
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 187
FALSO VERDADERO
condición 1
... ...
instrucciones instrucciones
... ...
F®¦. 3.18
Es posible utilizar el diagrama de flujo mostrado en la figura 3.18 y extenderlo para evaluar una mayor
cantidad de posibles valores. Solo recuerde mantener la simetría y la estética al elaborar el diagrama
de flujo.
EXPLICACIÓN:
switch (variable) {
case valor 1 : Si el valor de la variable es igual a uno de los valores
sentencias ... colocados después de la palabra reservada case
break ; (valor 1, valor 2, etc.), se ejecutan las sentencias
que están dentro del mismo hasta llegar al final (es
case valor 2 :
decir hasta la llave); a no ser que encuentre una
sentencias ... palabra reservada break entre las sentencias que se
break ; ejecutan.
case valor n :
sentencias ... Si el valor de la variable no es igual a ninguno de los
valores colocados después de una de las palabras
break ;
reservadas case, se ejecutan las sentencias que
default : están dentro de la palabra reservada default. La
sentencias ... palabra reservada default es opcional (es decir
} puede aparecer como no).
188 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Es importante tener presente que en Java se deberá usar la palabra reservada break al final de cada
bloque de sentencias, esto si se desea que cada alternativa (case) ejecute un grupo de sentencias sin
que ejecute el grupo de sentencias de las alternativas (case) que están a continuación.
Además, en Java la variable utilizada junto a la palabra reservada switch solo puede ser de tipo ENTERO
o de tipo CARACTER.
Si la variable es de tipo ENTERO (definida con la palabra reservada int), se deberán utilizar números
enteros después de la palabra reservada case. En caso que la variable sea de tipo CARACTER (definida
con la palabra reservada char), se deberá utilizar un carácter encerrado entre apóstrofe ( ' ' ) después
de la palabra reservada case.
Cuando se diseñe un algoritmo que necesite utilizar estructuras de decisión, se deben emplear
correctamente los formatos establecidos, ya que estos constituyen un “estándar” o acuerdo.
Cuando se codifique un algoritmo recuerde seguir las reglas del lenguaje de programación que usará;
de lo contrario, al momento de ejecutar un programa se dará con la sorpresa que tendrá errores de
sintaxis.
Problema 036
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 189
3. Definición de clases
Clases de dominioDeLaAplicación Clase de biblioteca
Lectura
|leerString ()
PrgDia
|leerChar ( )
|leerInt ( )
|main ()
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
ENTRADA: numero
SALIDA: dia
INICIO
ENTERO numero
TEXTO dia = “ ”
LEER numero
CUANDO ( numero ) SEA
CASO 1 :
dia = “Lunes”
TERMINAR
CASO 2 :
dia = “Martes”
TERMINAR
CASO 3 :
dia = “Miércoles”
TERMINAR
CASO 4 :
dia = “Jueves”
TERMINAR
CASO 5 :
dia = “Viernes”
TERMINAR
CASO 6 :
dia = “Sábado”
TERMINAR
CASO 7 :
dia = “Domingo”
FINCUANDO
ESCRIBIR dia
FIN
Clase PrgDia
#include <iostream>
#include <string>
using namespace::std;
int main ( ) {
int numero ;
string dia = “ ” ;
switch ( numero ) {
case 1 :
dia = “ Lunes ” ;
break ;
case 2 :
dia = “ Martes ” ;
break ;
case 3 :
dia = “ Miércoles ” ;
break ;
case 4 :
dia = “ Jueves ” ;
break ;
case 5 :
dia = “ Viernes ” ;
break ;
case 6:
dia = “ Sábado ” ;
break ;
case 7 :
dia = “ Domingo ” ;
default :
dia = “ Valor no valido...!!!! ” ;
system ( “PAUSE” ) ;
return 0 ;
}
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 191
Clase PrgDia
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgDia {
public static void main ( String arg [ ] ) {
int numero ;
String dia = “ ” ;
switch (numero) {
case 1 :
dia = “ Lunes ” ;
break ;
case 2 :
dia = “ Martes ” ;
break ;
case 3 :
dia = “ Miércoles ” ;
break ;
case 4 :
dia = “ Jueves ” ;
break ;
case 5 :
dia = “ Viernes ” ;
break ;
case 6:
dia = “ Sábado ” ;
break ;
case 7 :
dia = “ Domingo ” ;
break ;
default :
dia = “ Valor no válido...!!!! ” ;
System.out.println ( dia) ;
}
}
192 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 037
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
NUMERO sueldo
CARACTER categoria
LEER sueldo, categoria
ESCRIBIR sueldo
FIN
En diagrama de flujo:
Algoritmo PrgAumentoSueldo – main ( )
INICIO
NUMERO s
CARACTER categoria
categoria , s
categoria
OTROS
‘a’ ‘A’ ‘b’ ‘B’ ‘c’ ‘C’ ‘d’ ‘D’
s=s*1.18 s=s*1.12 s=s*1.09 s=s*1.06 "Error"
FIN
Clase PrgAumentoSueldo
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
double sueldo ;
char categoria ;
cout << “ Ingrese el sueldo del trabajador : ” ;
cin >> sueldo ;
switch ( categoria ) {
case ‘A’ :
case ‘a’ :
sueldo = sueldo * 1.18 ;
break ;
case ‘B’ :
case ‘b’ :
sueldo = sueldo * 1.12 ;
break ;
case ‘C’ :
case ‘c’ :
sueldo = sueldo * 1.09 ;
break ;
case ‘D’ :
case ‘d’ :
sueldo = sueldo * 1.06 ;
break ;
default :
cout << “Categoría no válida ” << endl ;
}
Clase PrgAumentoSueldo
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgAumentoSueldo {
public static void main ( String arg [ ] ) {
double sueldo ;
char categoria ;
switch ( categoria ) {
case ‘A’ :
case ‘a’ :
sueldo = sueldo * 1.18 ;
break ;
case ‘B’ :
case ‘b’ :
sueldo = sueldo * 1.12 ;
break ;
case ‘C’ :
case ‘c’ :
sueldo = sueldo * 1.09 ;
break ;
case ‘D’ :
case ‘d’ :
sueldo = sueldo * 1.06 ;
break ;
default :
System.out.println ( “Categoría no válida ” ) ;
}
}
}
196 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 038
T®ÖÊ CÊÝãÊ
1 = Moderado S/. 4.5
2 = Mediano S/. 5.0
3 = Extra grande S/. 7.5
4 = Full S/. 13.5
Calcule y muestre el monto total a pagar por un sándwich, sabiendo que adicionalmente hay que
pagar el 5 % por el servicio y 2 % por propinas. Si se ingresa otro Ɵpo de sándwich considerar costo =
0 y mostrar un mensaje de error.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
ENTRADA: tipo
SALIDA: montoPago
INICIO
ENTERO tipo
REAL costo , montoPago
LEER tipo
CUANDO ( tipo ) SEA
CASO 1 :
costo = 4.5
TERMINAR
CASO 2 :
costo = 5.0
TERMINAR
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 197
CASO 3 :
costo = 7.5
TERMINAR
CASO 4 :
costo = 13.5
TERMINAR
OTROS :
ESCRIBIR “ Tipo de sándwich no válido ”
costo = 0
FINCUANDO
montoPago = costo + costo * 0.05 + costo * 0.02
ESCRIBIR montoPago
FIN
En diagrama de flujo:
Algoritmo PrgPagoSandwich – main ( )
INICIO
NUMERO tipo
REAL costo, montoPago
tipo
tipo
OTROS
1 2 3 4
costo = 4.5 costo = 5 costo = 7.5 costo = 13.5 "Error"
costo = 0
montoPago
FIN
198 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
int tipo ;
double costo, montoPago ;
switch ( tipo ) {
case 1 :
costo = 4.5 ;
break ;
case 2 :
costo = 5.0 ;
break ;
case 3 :
costo = 7.5 ;
break ;
case 4 :
costo = 13.5 ;
break ;
default :
cout << “ Tipo de sándwich no válido ” << endl ;
costo = 0 ;
system ( “PAUSE” ) ;
return 0 ;
}
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 199
Clase PrgPagoSandwich
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgPagoSandwich {
public static void main ( String arg [ ] ) {
int tipo ;
double costo, montoPago ;
switch ( tipo ) {
case 1 :
costo = 4.5 ;
break ;
case 2 :
costo = 5.0 ;
break ;
case 3 :
costo = 7.5 ;
break ;
case 4 :
costo = 13.5 ;
break ;
default :
System.out.println ( “ Tipo de sándwich no válido ” ) ;
costo = 0 ;
}
}
200 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 039
Enunciado: Desarrollar una solución que permita realizar operaciones de suma, resta o mulƟplicación.
Se deberá ingresar dos números y el Ɵpo de operación que se desea realizar. Muestre un mensaje de
error si se ingresa un operador no válido.
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
3. Definición de clases
Lectura
|leerString ()
PrgOperaciones
|leerChar ()
|leerInt ( )
|main ()
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 201
INICIO
tipo, n1, n2
tipo
OTROS
‘+’ ‘-’ ‘*’
rpta = n1 + n2 rpta = n1 - n2 rpta = n1 * n2 rpta = 0
rpta
FIN
Observe la forma cómo finaliza la estructura lógica de decisión CUANDO. Esta es una forma alternativa de
hacer el diagrama de la estructura CUANDO.
202 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgOperaciones
#include <iostream>
using namespace::std;
int main ( ) {
switch ( tipo ) {
case ‘+’ :
rpta = n1 + n2 ;
break ;
case ‘-’ :
rpta = n1 - n2 ;
break ;
case ‘*’ :
rpta = n1 * n2 ;
break;
}
} else {
cout << “ Operador no válido …!!! \n\n ” ;
}
system ( “PAUSE” ) ;
return 0 ;
}
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 203
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgOperciones {
public static void main ( String arg [ ] ) {
switch ( tipo ) {
case ‘+’ :
rpta = n1 + n2 ;
break ;
case ‘-’ :
rpta = n1 - n2 ;
break ;
case ‘*’ :
rpta ta = n1 * n2 ;
break;
}
} else {
System.out.print << “ Operador no válido !!! \n\n ” ;
}
}
}
204 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 040
Enunciado: Calcular y mostrar el costo total que representa un paciente para un hospital de acuerdo
al Ɵpo de enfermedad, según los datos de la tabla. Considere que el costo mostrado en la tabla es por
cada día que el paciente estuvo internado en el hospital.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
CASO 11 :
costo = 200
TERMINAR
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 205
CASO 12 :
costo = 350
TERMINAR
CASO 13 :
costo = 420
OTROS :
ESCRIBIR “ Tipo de enfermedad no válida!!! ”
FINCUANDO
En diagrama de flujo:
Algoritmo PrgHospital – main ( )
INICIO
tipo , dias
tipo
11 12 13
costoTotal
FIN
206 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
#include <iostream>
using namespace::std;
int main ( ) {
int tipo, dias ;
double costo = 0, costoTotal ;
Clase PrgHospital
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgHospital {
public static void main ( String arg [ ] ) {
switch ( tipo) {
case 11 :
costo = 200 * dias ;
break ;
case 12 :
costo = 350 * dias ;
break ;
case 13 :
costo = 420 * dias ;
default :
System.out.print ( “ \n Tipo de enfermedad no valida…!!! \n” );
}
costoTotal = costo * dias ;
System.out.println ( );
System.out.println ( “ El costo total es: ” + costoTotal ) ;
}
}
IMPORTANTE
Se recomienda solucionar los problemas propuestos del 11 al 15,
que están planteados al final del presente capítulo.
208 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
A. Definición: Una estructura de decisión múltiple “SI ANIDADOS” permite alterar el flujo secuencial
de una solución, ejecutando un conjunto de pasos que dependen del resultado de varias condiciones
lógicas. Generalmente, cuando se tiene un problema con múltiples condiciones lógicas la mejor
opción será emplear SI ANIDADOS para la solución. Esto fundamentalmente por que la estructura
lógica de decisión múltiple CUANDO no trabaja con condiciones lógicas, sino solo con el valor de
una variable que puede ser de tipo CARACTER o ENTERO.
Este tipo de estructura es útil cuando se tiene la necesidad de escoger entre más de dos opciones
y se presentan múltiples condiciones lógicas.
B. Representación
a. Formato para diseñar algoritmos
En pseudocódigo:
En diagrama de flujo:
FALSO VERDADERO
condición 1
...
condición 2 VERDADERO instrucciones
...
...
FALSO instrucciones
...
F®¦. 3.18
En la figura 3.18 se muestra una estructura de decisión múltiple utilizando diagramas de flujo.
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 209
En la figura se puede observar claramente el diagrama de flujo de una estructura de decisión doble,
y el diagrama de flujo de una estructura de decisión simple en el flujo “FALSO” de la evaluación de
la condición. La idea fundamental es que el diagrama de flujo represente una estructura de decisión
múltiple, donde se debe utilizar diagramas de flujo de estructuras de decisión simple y doble en
forma combinada, de acuerdo a las necesidades que se determinen.
En las figuras 3.19, 3.20, 3.21, 3.22 y 3.23 se pueden apreciar algunos ejemplos. Observe que en todo
momento se elaboran los diagramas de flujo guardando estética, simetría y buen gusto.
FALSO VERDADERO
condición 1
... ...
instrucciones instrucciones
... ...
F®¦. 3.19
FALSO VERDADERO
condición 1
VERDADERO
...
condición 2
instrucciones
...
FALSO ...
instrucciones
...
F®¦. 3.20
210 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
FALSO VERDADERO
condición 1
... ...
instrucciones instrucciones
... ...
F®¦. 3.21
VERDADERO
condición 1
FALSO
VERDADERO
condición 2
FALSO
... ...
instrucciones instrucciones
... ...
F®¦. 3.22
FALSO VERDADERO
condición 1
F®¦. 3.23
LÓGICAS DE DECISIÓN O SELECCIÓN
211
212 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Existe la posibilidad de reducir el tamaño del diagrama de flujo cuando se tienen múltiples condiciones,
y cada condición en su flujo “VERDADERO” ejecuta una o dos instrucciones. Esto puede apreciarse a
continuación:
VERDADERO
condición 1 instrucciones
FALSO
VERDADERO
condición 2 instrucciones
FALSO
VERDADERO
condición 3 instrucciones
FALSO
...
instrucciones
...
F®¦. 3.24
Observando la figura anterior, podrá apreciar que el diagrama de flujo se ha elaborado utilizando
múltiples estructuras de decisión doble (ver figura 3.8). Recuerde que si existien muchas instrucciones
en los flujos “VERDADERO” de las condiciones lógicas, existe la posibilidad de que el diagrama de flujo
pierda simetría y estética; en ese caso, se recomienda utilizar un diagrama de flujo como el que se
muestra en la figura 3.23.
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 213
Problema 041
Enunciado: Calcular el área de un rectángulo conociendo su base y altura. Si el área es menor que
100, se deberá visualizar el mensaje “rectángulo pequeño”; si el área es mayor o igual a 100 y menor
que 1000, se visualizará el mensaje “rectángulo mediano”; y si el área es mayor o igual que 1000, el
mensaje será “rectángulo grande”.
dominioDeLaAplicacion biblioteca
3. Definición de clases
Clases de dominioDeLaAplicación Clase de biblioteca
Lectura
|leerString ()
PrgOperaciones
|leerChar ()
|leerInt ( )
|main ()
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
214 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
INICIO
SINO
SI ( area >= 1000 ) ENTONCES
mensaje = “ rectángulo grande ”
SINO
mensaje = “ rectángulo mediano ”
FINSI
FINSI
FIN
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 215
En diagrama de flujo:
INICIO
base, altura
FALSO VERDADERO
area <100
FALSO VERDADERO
area <100 mensaje = “rectángulo mediano”
mensaje
FIN
216 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgAreaRectangulo
#include <iostream>
#include <string>
using std::cout ;
using std::cin ;
using std::string ;
int main ( ) {
system ( “PAUSE” ) ;
return 0 ;
}
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 217
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgAreaRectangulo {
System.out.println ( “ ” ) ;
System.out.println ( “ El área es: ” + area ) ;
System.out.println ( “ Es un ” + mensaje ) ;
}
}
218 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 042
Etapa 01 - Descripción del problema
Enunciado: Observe el sueldo de un trabajador y calcule su aumento por incremento del costo de
vida de acuerdo a la siguiente tabla. Mostrar el nuevo sueldo.
CÊÄ®®ÌÄ AçÃÄãÊ
sueldo < 2000 20 %
2000 < = sueldo < =3000 13 %
sueldo > 3000 9%
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
3. Definición de clases
Clases de dominioDeLaAplicación Clase de biblioteca
Lectura
|leerString ()
PrgAumentoSueldo2
|leerChar ()
|leerInt ( )
|main ()
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 219
ENTRADA: sueldo
SALIDA: nuevoSueldo
INICIO
LEER sueldo
SINO
FINSI
ESCRIBIR nuevoSueldo
FIN
220 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
En diagrama de flujo:
Algoritmo PrgAumentoSueldo2 – main ( )
INICIO
sueldo
FALSO VERDADERO
sueldo<2000
FALSO VERDADERO
sueldo>3000 nuevoSueldo = sueldo * 1.2
nuevoSueldo
FIN
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 221
#include <iostream>
using namespace::std;
int main ( ) {
system ( “PAUSE” ) ;
return 0 ;
}
Clase PrgAumentoSueldo2
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgAumentoSueldo2 {
public static void main ( String arg [ ] ) {
Problema 043
Enunciado: Desarrolle una solución que permita determinar si un número (num) es par, impar o nulo.
Muestre un mensaje si el número es par, impar o nulo.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
ENTRADA: num
SALIDA: tipo
INICIO
ENTERO num
TEXTO tipo
LEER num
SI ( num == 0 ) ENTONCES
tipo = “El número es nulo ”
SINO
SI ( num % 2 == 0 ) ENTONCES
tipo = “ El número es par ”
SINO
tipo = “ El número es impar ”
FINSI
FINSI
ESCRIBIR tipo
FIN
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 223
En diagrama de flujo:
Algoritmo PrgNumTipo2 – main ( )
INICIO
ENTERO num
TEXTO tipo
num
FALSO VERDADERO
num == 0
FALSO VERDADERO
tipo = “El número es nulo”
num % 2 == 0
tipo
FIN
224 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
#include <iostream>
using namespace::std;
int main ( ) {
int num ;
string tipo ;
cout << “ Ingrese un número: ”;
cin >> num ;
if ( num == 0 ) {
tipo = “ El número es nulo ”;
} else {
if (num % 2 == 0 ) {
tipo = “ El número es par ” ;
} else {
tipo = “ El número es impar ” ;
}
}
system ( “PAUSE” ) ;
return 0 ;
}
Clase PrgNumTipo2
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumTipo2 {
public static void main ( String arg [ ] ) {
int num ;
String tipo ;
System.out.print ( “ Ingrese un número: ” ) ;
num = Lectura.leerInt( ) ;
if ( num == 0 ) {
tipo = “ El número es nulo ” ;
} else {
if (num % 2 == 0 ) {
tipo = “ El número es par ” ;
} else {
tipo = “ El número es impar ” ;
}
}
System.out.println ( tipo ) ;
}
}
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 225
Problema 044
Etapa 01 - Descripción del problema
Enunciado: Determinar si un número es divisor de otro número. UƟlice la expresión (num1 % num2
== 0), donde “num1” y “num2” son los dos números.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
FINSI
ESCRIBIR mensaje
FIN
#include <iostream>
#include <string>
using std::cout ;
using std::cin ;
using std::string ;
int main ( ) {
system ( “PAUSE” ) ;
return 0 ;
}
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 227
Clase PrgNumeroDivisor
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumeroDivisor {
public static void main ( String arg [ ] ) {
Problema 045
Enunciado: Un curso se evalúa de la siguiente forma: se toma cinco prácƟcas calificadas, se determina
el promedio de las cuatro notas más altas y se le da al estudiante una categoría que puede ser A, B, C
o D. Según la tabla siguiente, mostrar el promedio y la categoría del alumno.
Considerar que todas las notas ingresadas están dentro de los valores válidos (de 0 a 20).
RÄ¦Ê Cã¦ÊÙ°
Desde 17 a 20 A
Desde 14 a 16 B
Desde 10 a 13 C
Desde 00 a 09 D
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
sumaNotas = n1 + n2 + n3 + n4 + n5
notaMenor = n1
FINSI
FINSI
FIN
Clase PrgCategoriaAlumno
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
sumaNotas = n1 + n2 + n3 + n4 + n5 ;
notaMenor = n1 ;
if ( notaMenor > n2 )
notaMenor = n2 ;
if ( notaMenor > n3 )
notaMenor = n3 ;
if ( notaMenor > n4 )
notaMenor = n4 ;
if ( notaMenor > n5 )
notaMenor = n5 ;
if (promedio >= 14 ) {
categoria = ‘B’ ;
} else {
if (promedio >= 10 ) {
categoria = ‘C’ ;
} else {
categoria = ‘D’ ;
}
}
}
cout << “\n El promedio del alumno es: " << promedio << “\n” ;
cout << “Su categoría es: ” << categoria << “\n” ;
cout << “\n” ;
system ( “PAUSE” ) ;
return 0 ;
}
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 231
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgCategoriaAlumno {
public static void main ( String arg [ ] ) {
double n1, n2, n3, n4, n5, sumaNotas ;
double notaMenor, promedio ;
char categoria = ‘ ’ ;
sumaNotas = n1 + n2 + n3 + n4 + n5 ;
notaMenor = n1 ;
if ( notaMenor > n2 )
notaMenor = n2 ;
if ( notaMenor > n3 )
notaMenor = n3 ;
if ( notaMenor > n4 )
notaMenor = n4 ;
if ( notaMenor > n5 )
notaMenor = n5 ;
Problema 046
Enunciado: Ingresar tres notas de un alumno y mostrar las notas ordenadas en forma ascendente.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
SI ( n2 > n3 ) ENTONCES
intermedio = n2
menor = n3
SINO
intermedio = n3
menor = n2
FINSI
SINO
mayor = n3
intermedio = n1
menor = n2
FINSI
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 233
SINO
SI ( n2 > n3 ) ENTONCES
mayor = n2
SI ( n1 > n3 ) ENTONCES
intermedio = n1
menor = n3
SINO
intermedio = n3
menor = n1
FINSI
SINO
mayor = n3
intermedio = n2
menor = n1
FINSI
FINSI
FIN
234 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
En diagrama de flujo:
Algoritmo PrgOrdena – main ( )
INICIO
n1 , n2 , n3
FALSO VERDADERO
n1 > n2
n1 > n3 n2 > n3
menor ,
intermedio ,
mayor
FIN
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 235
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
int n1, n2, n3, menor, intermedio, mayor ;
cout << “ Ingrese la primera nota: ” ;
cin >> n1 ;
cout << “ Ingrese la segunda nota: ” ;
cin >> n2 ;
cout << “ Ingrese la tercera nota: ” ;
cin >> n3 ;
if ( n1 > n2 ) {
if ( n1 > n3 ) {
mayor = n1 ;
if ( n2 > n3 ) {
intermedio = n2 ;
menor = n3 ;
} else {
intermedio = n3 ;
menor = n2 ;
}
} else {
mayor = n3 ;
intermedio = n1 ;
menor = n2 ;
}
} else {
if ( n2 > n3 ) {
mayor = n2 ;
if ( n1 > n3 ) {
intermedio = n1 ;
menor = n3 ;
} else {
intermedio = n3 ;
menor = n1 ;
}
} else {
mayor = n3 ;
intermedio = n2 ;
menor = n1 ;
}
}
cout << “ Las notas ordenadas en forma ascendente son: ” ;
cout << menor << “, ” << intermedio << “ y ” << mayor << “\n\n”;
system ( “PAUSE” ) ;
return 0 ;
}
236 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgOrdena {
public static void main ( String arg [ ] ) {
int n1, n2, n3, menor, intermedio, mayor ;
System.out.print ( “ Ingrese la primera nota: ” ) ;
n1 = Lectura.leerInt( ) ;
System.out.print ( “ Ingrese la segunda nota: ” ) ;
n2 = Lectura.leerInt( ) ;
System.out.print ( “ Ingrese la tercera nota: ” ) ;
n3 = Lectura.leerInt( ) ;
if ( n1 > n2 ) {
if (n1 > n3) {
mayor = n1 ;
if ( n2 > n3 ) {
intermedio = n2 ;
menor = n3 ;
} else {
intermedio = n3 ;
menor = n2 ;
}
} else {
mayor = n3 ;
intermedio = n1 ;
menor = n2 ;
}
} else {
if ( n2 > n3 ) {
mayor = n2 ;
if ( n2 > n3 ) {
intermedio = n1 ;
menor = n3 ;
} else {
intermedio = n3 ;
menor = n1 ;
}
} else {
mayor = n3 ;
intermedio = n2 ;
menor = n1 ;
}
}
System.out.print ( ) ;
System.out.print ( “ Las notas ordenadas en forma ascendente son: ” ) ;
System.out.println ( menor + “, ” + intermedio + “ y ” + mayor ) ;
}
}
IMPORTANTE
Es común que en las soluciones planteadas se utilice una o más de estas estructuras lógicas; así, puede
utilizarse una estructura lógica de decisión doble y una estructura lógica de decisión múltiple en una
solución; una estructura lógica de decisión simple y una estructura de decisión doble en otra solución
y muchas otras combinaciones posibles.
También puede utilizarse más de una estructura lógica de decisión al mismo tipo; además, pueden
utilizarse varias estructuras lógicas de decisión doble en una solución o varias estructuras lógicas de
decisión múltiple en otra solución, así como otras combinaciones posibles.
Se puede utilizar una estructura lógica de decisión simple dentro de una estructura lógica de decisión
múltiple en una solución o una estructura lógica de decisión doble dentro de otra estructura lógica de
decisión doble, y muchas otras posibilidades.
A continuación, se presentan algunas soluciones que permiten ilustrar el uso combinado y el uso
anidado de las estructuras de decisión.
Debido a que la Etapa 2 se ha desarrollado en todos los problemas anteriores, a partir de ahora no se
incluirá en las siguientes soluciones. Sin embargo, se recuerda que es imprescindible ejecutar dicha
etapa para asegurar una correcta y eficiente definición de la solución.
Problema 047
Enunciado: Una editorial ha puesto a la venta tres Ɵpos de libros de acuerdo a la tabla adjunta.
Considerando que para el caso de los libros Ɵpo B, el precio Ɵenen un incremento del 18.5 %, si la
compra es realizada con tarjeta de crédito y para los libros Ɵpo C, el precio Ɵene un descuento del
40 % si se compra en efecƟvo. Desarrolle una solucion que permita determinar y mostrar el precio a
pagar por la compra de cierta canƟdad de libros del mismo Ɵpo.
Defina el nombre del proyecto, y luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
FIN
Clase PrgVentaLibro
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgVentaLibro {
public static void main ( String arg [ ] ) {
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 239
switch ( tipoLibro ) {
case ‘A’ : case ‘a’ :
precio = 40 ;
break ;
case ‘B’ : case ‘b’ :
precio = 30 ;
if ( tipoPago == 1 ) {
precio=precio * 1.185 ;
}
break ;
case ‘C’ : case ‘c’ :
precio = 25 ;
if ( tipoPago == 0 ) {
precio = precio * 0.60 ;
}
}
montoPago = precio * cantidad ;
System.out.println ( “ El precio a pagar es: ” + montoPago ) ;
}
}
Problema 048
Enunciado: Una empresa vende dos Ɵpos de jabones, cada uno de los cuales Ɵene una calidad
disƟnta. Considerando que los precios no incluyen I.G.V., desarrolle una solución que muestre el
monto subtotal (sin incluir I.G.V.), el monto del I.G.V. (18 % del subtotal) y el monto a pagar (monto
incluido I.G.V.) por la compra de cierta canƟdad de jabones del mismo Ɵpo y la misma calidad.
Defina el nombre del proyecto, y luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
240 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
INICIO
CASO 1 :
SI ( calidad == 1 ) ENTONCES
precio = 2.0
SINO
precio = 2.5
FINSI
TERMINAR
CASO 2 :
SI ( calidad == 1 ) ENTONCES
precio = 3.0
SINO
precio = 3.5
FINSI
TERMINAR
FINCUANDO
FIN
Clase PrgVentaJabones
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgVentaJabones {
public static void main ( String arg [ ] ) {
switch (tipoJabon) {
case 1 :
if (calidad == 1) {
precio = 2.0 ;
} else {
precio = 2.5 ;
}
break ;
case 2 :
if (calidad == 1) {
precio = 3.0 ;
} else {
precio = 3.5 ;
}
break ;
}
subtotal = precio * cantidad ;
igv = subtotal * 0.19 ;
total = subtotal + igv ;
System.out.println ( ) ;
System.out.println ( “El subtotal es: ” + subtotal ) ;
System.out.println ( “El IGV es: ” + igv) ;
System.out.println ( “El total es: ” + total ) ;
}
}
Problema 049
Enunciado: Según los datos de la tabla, calcular y mostrar el costo total que representa un paciente
para un hospital de acuerdo al Ɵpo de enfermedad. Adicionalmente, deberá considerarse que las
mujeres Ɵenen un incremento del 10 % para el Ɵpo 1 de enfermedad y los hombres un aumento del
5 % para el Ɵpo 3 de enfermedad.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
Clase PrgHospital1
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgHospital1 {
public static void main ( String arg [ ] ) {
switch ( tipoEnfermedad ) {
case 1 :
costoTotal = 200 * dias ;
if ( sexo == 2 ) {
costoTotal = costoTotal * 1.10 ;
}
break ;
case 2 :
costoTotal = 350 * dias ;
break ;
case 3 :
costoTotal = 420 * dias ;
if ( sexo == 1 ) {
costoTotal = costoTotal * 1.05 ;
}
}
System.out.println ( “ El costo total es: ” + costoTotal ) ;
}
}
Problema 050
Enunciado: Según los datos de la tabla, leer las notas obtenidas por un alumno del curso de
MatemáƟca Básica III y calcular su nota final (nf) de acuerdo a la fórmula empleada por su profesor.
Mostrar la nota final (nf) del alumno y determinar si está aprobado o no, considerando que la nota
mínima aprobatoria es 12 (doce).
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
NUMERO codigo, n1, n2, nf = 0
TEXTO mensaje
LEER codigo, n1, n2
CUANDO ( codigo ) SEA
CASO 1 :
nf = ( n1 + n2 ) / 2
TERMINAR
CASO 2 :
nf = ( n1 + n2 * 2 ) / 3
TERMINAR
CASO 3 :
nf = ( n1 * 2 + n2 ) / 3
FINCUANDO
SI ( nf > 12) ENTONCES
mensaje = “aprobado”
SINO
mensaje = “desaprobado”
FINSI
ESCRIBIR nf, mensaje
FIN
Clase PrgNotaFinal3
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNotaFinal3 {
public static void main ( String arg [ ] ) {
int codigo ;
double n1, n2, nf = 0 ;
String mensaje ;
switch ( codigo ) {
case 1 :
nf = ( n1 + n2 ) / 2 ;
break ;
case 2 :
nf = ( n1 + n2 * 2 ) / 3 ;
break ;
case 3 :
nf = ( n1 * 2 + n2 ) / 3 ;
}
if ( nf > 12 ) {
mensaje = “ Alumno aprobado” ;
} else {
mensaje = “ Alumno desaprobado” ;
}
System.out.println ( ) ;
System.out.println ( “ Nota final: ” + nf ) ;
System.out.println ( mensaje ) ;
}
}
Problema 051
Enunciado: Una librería ha puesto a la venta cuadernos ofreciendo descuentos según el siguiente
detalle:
Dã½½ ÝçÄãÊÝ
Por las primeras 12 unidades→ 10 % de descuento
Por las 12 unidades siguientes → 20 % de descuento
Por las demás unidades → 40 % de descuento
Desarrolle una solución que permita determinar y mostrar el importe subtotal, el importe del
descuento y el importe a pagar por la compra de cierta canƟdad de cuadernos.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
ENTERO cantidad
REAL precio, iSubtotal, iDescuento, iPagar, dscto
FIN
|En algunas ocasiones podrá encontrar una solución como la mostrada anteriormente, donde
la estructura lógica de decisión múltiple (SI) no presenta explícitamente el fin de la estructura
(FINSI). Este formato se puede utilizar en forma opcional, cuando existe solo una instrucción en
cada uno de los bloques o flujos de la estructura lógica de decisión múltiple (SI). Es importante
mencionar que, para poder visualizar adecuadamente este formato, se utiliza un número diferente
de tabulaciones en cada instrucción. Su uso se ha extendido debido a las nuevas posibilidades que
ofrecen los actuales lenguajes de programación.
Clase PrgLibreria
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgLibreria {
public static void main ( String arg [ ] ) {
int cantidad ;
double precio, iSubtotal, iDescuento, iPagar, dscto ;
if ( cantidad <= 12 )
dscto = cantidad * 0.10 ;
else if ( cantidad <= 24 )
dscto = 12 * 0.10 + (cantidad – 12) * 0.20 ;
else
dscto = 12 * 0.10 + 12 * 0.20 + (cantidad – 24) * 0.40 ;
System.out.println ( ) ;
System.out.println ( “ El importe subtotal es: ” + iSubtotal) ;
System.out.println ( “ El importe de descuento es: ” + iDescuento) ;
System.out.println ( “ El importe a pagar es: ” + iPagar) ;
}
}
Problema 052
Enunciado: En una oficina de empleados, categorizan a los postulantes en función del sexo y de la
edad, de acuerdo a lo siguiente:
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
Clase PrgCategoriaPostulante
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgCategoriaPostulante {
public static void main ( String arg [ ] ) {
char sexo ;
int edad ;
String categoria = “ ” ;
switch ( sexo ) {
case ‘f’ :
case ‘F’ :
if ( edad < 23 )
categoria = “FA” ;
else
categoria = “FB” ;
break ;
case ‘m’ :
case ‘M’ :
if ( edad < 25 )
categoria = “MA” ;
else
categoria = “MB” ;
break ;
}
Problema 053
Enunciado: Un negocio vende tres Ɵpos de arơculos; el mouse Ɵene un costo de US$ 3, el teclado
cuesta US$5 y la CPU US$ 250. Según la canƟdad que compra el cliente se aplica la siguiente tabla
de descuentos:
Ingresar la canƟdad y el Ɵpo de arơculo que el cliente desea comprar y considere que el cliente solo
puede comprar un Ɵpo de producto a la vez. Determinar el monto total a pagar.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgVenta {
public static void main ( String arg [ ] ) {
char tipo ;
int cantidad ;
double pago = 0, preMou = 3.0, preTecl = 5.0, preCpu = 250.0 ;
switch ( tipo ) {
case ‘M’ : case ‘m’ :
if ( cantidad < 10 )
pago = preMou * cantidad * 0.98 ;
else
pago = preMou * cantidad * 0.96 ;
break ;
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 251
Problema 054
Enunciado: Desarrollar un programa que permita ingresar el día, el mes y el año de una determina
fecha. Comprobar si la fecha ingresada es correcta y si el año es bisiesto o no.
Clase PrgVerificaFecha
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgVerificaFecha {
public static void main ( String arg[] ) {
//verifica el dia
switch (mes) {
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
case 12 :
if ( bisiesto ) {
if ( ( dia > 0 ) && ( dia <= 29 ) ) {
verifdia = true ;
} else {
if ( ( dia > 0 ) && ( dia <= 28 ) )
verifdia = true ;
}
}
break ;
}
case 4 :
mess = “Abril” ;
break ;
case 5 :
mess = “Mayo” ;
break ;
case 6 :
mess = “Junio” ;
break ;
case 7 :
mess = “Julio” ;
break ;
case 8 :
mess = “Agosto” ;
break ;
case 10 :
mess = “Octubre” ;
break ;
case 11 :
mess = “Noviembre” ;
break;
case 12 :
mess = “Diciembre” ;
break ;
}
System.out.println ( ) ;
System.out.println ( “ Fecha: “+ dia + “ de ” + mess + “ de ” + año ) ;
if ( bisiesto ) {
System.out.println ( “ Es año bisiesto ” ) ;
} else {
System.out.println ( “ No es año bisiesto ” ) ;
}
} else {
System.out.println ( “ error en fecha ” ) ;
}
}
}
254 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 055
Enunciado: Desarrollar un programa que permita ingresar un número arábico entre 1000 y 3000.
Determinar y mostrar el número ingresado por medio de su equivalente en número romano.
Clase PrgNumRomano
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumRomano {
public static void main ( String arg [ ] ) {
//obtener centenas
switch ( centena ) {
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 255
case 1 :
romano = romano + “C” ;
break ;
case 2 :
romano = romano + “CC” ;
break ;
case 3 :
romano = romano + “CCC” ;
break ;
case 4 :
romano = romano + “CD” ;
break ;
case 5 :
romano = romano + “D” ;
break ;
case 6 :
romano = romano + “DC” ;
break ;
case 7 :
romano = romano + “DCC” ;
break ;
case 8 :
romano = romano + “DCCC” ;
break ;
case 9 :
romano = romano + “CM” ;
}
//obtener decenas
switch ( decena ) {
case 1 :
romano = romano + “X” ;
break ;
case 2 :
romano = romano + “XX” ;
break ;
case 3 :
romano = romano + “XXX” ;
break ;
case 4 :
romano = romano + “XL” ;
break ;
case 5 :
romano = romano + “L” ;
break ;
case 6 :
romano = romano + “LX” ;
break ;
case 7 :
romano = romano + “LXX” ;
break ;
case 8 :
romano = romano + “LXXX” ;
break ;
case 9 :
romano = romano + “XC” ;
}
256 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
//obtener unidades
switch ( unidad ) {
case 1 :
romano = romano + “I” ;
break ;
case 2 :
romano = romano + “II” ;
break ;
case 3 :
romano = romano + “III” ;
break ;
case 4 :
romano = romano + “IV” ;
break ;
case 5 :
romano = romano + “V” ;
break ;
case 6 :
romano = romano + “VI” ;
break ;
case 7 :
romano = romano + “VII” ;
break ;
case 8 :
romano = romano + “VIII” ;
break ;
case 9 :
romano = romano + “IX” ;
}
// Mostrar número romano
System.out.println ( Arábigo + “ = ” + romano ) ;
} else {
System.out.println ( " Número ingresado no válido " ) ;
}
}
}
IMPORTANTE
Se recomienda solucionar los problemas propuestos del 21 al 80,
que están planteados al final del presente capítulo.
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 257
PUNTO A PARTE
|Puede uƟlizar cualquier buscador de Internet para ampliar sus conocimientos sobre estos y
otros soŌware; solo coloque el nombre del soŌware y podrá observar varios link que incluso le
permiƟrán desacargar el soŌware a su PC.
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 259
ENUNCIADO
DEL
PROBLEMA
MODELAMIENTO CODIFICACIÓN
}|Determinar la }|Determinar el }|Codificar el diseño
información nombre del de la solución del
deseada (salida). proyecto. problema. Utilizar
}|Determinar los }|Definir los paquetes el lenguaje de
datos de entrada y desarrollar programación Java.
(entrada). el diagrama de UƟlice la clase
}|Establecer como paquetes respectivo. reuƟlizable LE.
se solucionará el Establecer la
problema (proceso). dependencia. Utilice
UML.
}|Definir las clases
que serán parte
de la solución del
problema. Utilice
UML.
ALGORITMO
}|Diseñar el algoritmo
para el método
principal. Utilizar
diagrama de
actividades.
260 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 056
Etapa 01 - Descripción del problema
INICIO
VERDADERO
cantidad > 10
FALSO
descuento = total * 0.2
total = total - descuento
utilidad = total –
(pcompra * cantidad)
FIN
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 261
Clase PrgCompra
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgCompra {
public static void main ( String arg []) {
int cantidad ;
double total, pventa, pcompra, utilidad, descuento = 0 ;
cantidad = LE.leerInt ( “ Ingrese la cantidad de productos ” ) ;
pcompra = LE.leerDouble ( “ Ingrese el precio compra del producto ” ) ;
pventa = LE.leerDouble ( “Ingrese el precio de venta del producto ” ) ;
if ( cantidad > 10 ) {
descuento = total * 0.2 ;
total = total - descuento ;
}
utilidad = total - ( pcompra * cantidad ) ;
Resultado:
262 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 057
Enunciado: Calcular y mostrar la nota final de un alumno en base a tres notas ingresadas. Si la nota
final es menor a 14, se deberá mostrar el mensaje “Desaprobado”; en caso contrario se mostrará el
mensaje “Aprobado”. Desarrolle el algoritmo y la codificación en el lenguaje de programación Java y
uƟlice la clase LE para ingresar los datos y mostrar la información.
INICIO
nf = (n1 + n2 + n3) / 3
FALSO VERDADERO
nf < 14
FIN
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 263
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgNotaFinal2 {
public static void main ( String arg []) {
nf = (n1 + n2 + n3) / 3 ;
if ( nf < 14 ) {
mensaje = “ Desaprobado ” ;
} else {
mensaje = “ Aprobado ” ;
}
LE.mostrarInformacion ( “ La nota final es ” + nf + “. ” + mensaje ) ;
}
}
Resultado:
264 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 058
Etapa 01 - Descripción del problema
Cã¦ÊÙ° AçÃÄãÊ
A 18 %
B 12 %
C 09 %
D 06 %
INICIO
LEER sueldo,
categoria
categoria
0 1 2 3 otros
ESCRIBIR
ESCRIBIR sueldo “Error”
FIN
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 265
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgAumentoSueldo {
public static void main ( String arg []) {
String categorias[ ] = { “A” , “B” , “C” , “D” } ;
double sueldo ;
int categoria ;
switch (categoria) {
case 0 :
sueldo = sueldo * 1.18 ;
break ;
case 1 :
sueldo = sueldo * 1.12 ;
break ;
case 2 :
sueldo = sueldo * 1.09 ;
break ;
case 3 :
sueldo = sueldo * 1.06 ;
break ;
default :
sueldo = 0 ;
LE.mostrarError ( “ Categoría no válida ” ) ;
}
LE.mostrarInformacion ( “ El sueldo incrementado es ” + sueldo ) ;
}
}
Ambos métodos reciben tres parámetros. El primero es un String con el ơtutlo del cuadro de diálogo,
el segundo es el String que se visualizará dentro del cuadro de diálogo y el tercero es un arreglo de
String conteniendo las opciones que el usuario puede seleccionar. El tema de arreglos será tratado
en profundidad más adelante.
Para obtener el cuadro de diálogo mostrado se uƟlizaron las siguientes líneas de código Java:
Problema 059
Etapa 01 - Descripción del problema
RÄ¦Ê Cã¦ÊÙ°
Desde 17 a 20 A
Desde 14 a 16 B
Desde 10 a 13 C
Desde 00 a 09 D
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 267
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgCategoriaAlumno {
public static void main ( String arg [ ] ) {
sumaNotas = n1 + n2 + n3 + n4 + n5 ;
notaMenor = n1 ;
if ( notaMenor > n2 )
notaMenor = n2 ;
if ( notaMenor > n3 )
notaMenor = n3 ;
if ( notaMenor > n4 )
notaMenor = n4 ;
if ( notaMenor > n5 )
notaMenor = n5 ;
}
}
268 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Resultado:
Problema 060
Enunciado: Calcular y mostrar el costo total que representa un paciente para un hospital de acuerdo
al Ɵpo de enfermedad, según los datos de la tabla. Adicionalmente, deberá considerar que las
mujeres Ɵenen un incremento del 10 % para la enfermedad Ɵpo 1 y los hombres Ɵenen un aumento
del 5 % para la enfermedad Ɵpo 3. Desarrolle la codificación en el lenguaje de programación Java.
Luego uƟlice la clase LE para ingresar los datos y muestre la información.
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgHospital1 {
public static void main ( String arg [ ] ) {
tipoEnfermedad = LE.seleccionarOpcionIndex
( “Tipo Enfermedad” , “Seleccione tipo de enfermedad” , tipos ) ;
switch ( tipoEnfermedad ) {
case 0 :
break ;
case 1 :
costoTotal = 350 * dias ;
break ;
case 2 :
costoTotal = 420 * dias ;
if ( sexo == 1 ) {
costoTotal = costoTotal * 1.05 ;
}
default :
LE.mostrarError ( “ No seleccionó categoría ” ) ;
}
LE.mostrarInformacion ( “ El costo total es ” + costoTotal ) ;
}
}
Resultado:
IMPORTANTE
Se recomienda solucionar todos los problemas propuestos planteados
al final del presente capítulo, uƟlizando la clase reuƟlizable LE.
270 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
PROBLEMAS PROPUESTOS
1. Desarrollar una solución que permita ingresar y mostrar un número y determinar si es par; en
caso de ser así, mostrar un mensaje que indique: “El número ingresado es par”.
2. Desarrollar una solución que permita ingresar las cuatro notas de un alumno. Calcular el promedio
del alumno con la fórmula (n1 + n2 + n3 + n4) / 4. Mostrar el promedio del alumno, si este es
menor que 11, mostrar el siguiente mensaje: “El alumno está desaprobado”.
3. Desarrollar una solución que permita ingresar y mostrar las edades de dos personas. Si la primera
edad es mayor que la segunda, mostrar un mensaje que diga: “La primera persona es mayor que
la segunda”.
4. Desarrollar una solución que permita ingresar el promedio y la desviación estándar de un número
de datos. Calcular el coeficiente de variabilidad y si este es mayor al 25 %, mostrar un mensaje que
indique: “Este grupo tiene mucha variabilidad”.
CV = (S / X) * 100
CV : Coeficiente de Variabilidad
S : Desviación Estándar
X : Promedio
5. Desarrollar una solución que permita ingresar la cantidad de borradores que se compraron en la
librería “El Boligrafito” y el precio de cada uno. Calcular y mostrar el monto a pagar, y en caso de
que supere los S/. 100.00 nuevos soles aplicarle un descuento de 7 %.
6. Desarrollar una solución que permita calcular y mostrar el volumen de una esfera. Si el volumen
es mayor a 400, se debe visualizar el mensaje: “Esfera grande”.
7. Desarrollar una solución que permita calcular y mostrar el área de un cuadrado. Si dicha área
resulta mayor que 768, se deberá mostrar el mensaje: “Cuadrado grande”.
8. Desarrollar una solución que permita determinar cómo se clasifica un ángulo ingresado a tráves
teclado. Los ángulos se clasifican de la siguiente manera:
Ángulo = 0 Nulo
0 < ángulo <90 Agudo
Ángulo = 90 Recto
90 < ángulo < 180 Obtuso
Ángulo = 180 Llano
180 < ángulo < 360 Cóncavo
Ángulo = 360 Completo
9. Desarrollar una solución que permita calcular y mostrar la nota final (nf) de un alumno, sabiendo
que se tienen solo dos notas. Si el alumno obtiene una nota final mayor o igual a 18 se deberá
visualizar un mensaje de Felicitaciones.
10. Desarrollar una solución que permita calcular el sueldo de un trabajador, conociendo el número
de horas trabajadas y la tarifa horaria además, se deberá aumentar el 16 % por concepto de
bonificación familiar, si el sueldo es menor a S/. 1860.00 nuevos soles. Mostrar la cantidad del
sueldo y el aumento respectivo.
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 271
11. Desarrollar una solución que permita determinar el sueldo neto, el sueldo bruto y el descuento de
un trabajador de una empresa. Se debe tener en cuenta que dicha empresa paga a sus vendedores
por horas trabajadas. Hasta 40 horas se paga una tarifa normal y sobre las 48 horas, la tarifa tiene
un recargo del 20 %. Además,considere de que si el sueldo bruto es superior a S/. 1650.00 nuevos
soles estará sujeto a un descuento del 15 %.
12. Desarrollar una solución que permita ingresar tres notas de un determinado alumno. Entonces
mostrar las notas ordenadas en forma descendente (de mayor a menor).
13. Desarrollar una solución que calcule el costo total de hospitalización, sabiendo el total de días y el
costo de la habitación. Este se determina de acuerdo a la siguiente tabla:
ÁÙ CÊÝãÊ
1 150
2 120
Otra 100
14. Desarrollar una solución que permita determinar si un número ingresado por teclado es capicúa
o no. Un número es capicúa si se lee de la misma forma de derecha a izquierda y viceversa. (Por
ejemplo; el número 4554 es un número capicúa)
15. Desarrollar una solución que permita ingresar un número comprendido entre 1 y 5. Luego mostrar
el número en letras.
16. Desarrollar una solución que permita calcular el monto a pagar por la compra de un producto,
considerando un descuento del 27 % por la compra de 150 unidades.
17. Desarrollar una solución que permita calcular y mostrar el monto total a pagar por la compra
de varios artículos. Considerar que deberá agregar el I.G.V. respectivo. Si el monto total a pagar
incluido I.G.V. es mayor a S/. 1800.00 nuevos soles se aplicará un descuento del 12 %, en caso
contrario el descuento será del 3 %.
18. Desarrollar una solución que permita determinar qué proveedor es más conveniente para una
empresa que desea adquirir cierta cantidad de unidades de un producto. Para ello se cuenta con
las siguientes propuestas:
||Proveedor A: Costo unitario igual a S/. 25.00 y 15 % de descuento para más de 50 unidades
adquiridas.
||Proveedor B: Costo unitario igual a S/. 27.5 y 10 % de descuento para mas de 35 unidades
adquiridas.
19. Desarrollar una solución que permita determinar si un número es múltiplo de otro número.
20. Desarrollar una solución que permita ingresar un número entero. Luego mostrar si el número
ingresado es negativo, par o múltiplo de 7.
21. Desarrollar una solución que permita determinar si un número es o no, múltiplo de los números;
3, 7 y 13. Finalmente mostrar un mensaje que indique si es múltiplo de los tres números o no.
22. Desarrollar una solución que permita ingresar un número entre 1 y 12; y mostrar el nombre del
mes del año correspondiente:(enero, febrero,…).
23. Desarrollar una solución que permita ingresar la categoría y el sueldo de un trabajador. Calcular el
aumento correspondiente teniendo en cuenta la tabla y mostrar el nuevo sueldo del trabajador.
272 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Cã¦ÊÙ° AçÃÄãÊ
1 35 %
2 25 %
3 15 %
4 5%
24. Una empresa paga a sus empleados un sueldo básico en base a la siguiente tabla:
Cã¦ÊÙ° B
Ý®Ê
A S/. 400
B S/. 500
C S/. 600
D S/. 700
Adicionalmente, les paga una comisión en base al monto de sus ventas, según se detalla en el
cuadro siguiente:
VÄãÝ B
Ý®Ê
0 a 500 0%
501 a 1500 20.5 %
1501 a 2500 30.5 %
Más de 2500 45.5 %
Desarrolle una solución que permita calcular y mostrar el sueldo básico, la comisión y el sueldo a
cobrar (sueldo básico + comisión) por el empleado.
25. Desarrollar una solución que permita calcular y mostrar el costo total que representa un paciente
para un hospital, de acuerdo al tipo de enfermedad, según los datos de la tabla. Adicionalmente,
se debe considerar que las mujeres tiene un incremento del 19 % para la de enfermedad tipo 1 y
los hombres tienen un descuento del 4 % para la enfermedad tipo 3.
26. Desarrollar una solución que permita determinar y mostrar si una persona que va a mirar un
programa de televisión está apta o no. Considerar la siguiente tabla:
E Cã¦ÊÙ°
18 – más Adultos
11 – 17 Mayores de 14
0 – 10 Apta para todos
27. Un colegio categoriza y cobra la mensualidad de sus estudiantes de acuerdo a la siguiente tabla:
Cã¦ÊÙ° MÄÝç½®
1 500
2 600
3 700
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 273
Desarrolle una solución que permita hallar y mostrar cuánto sería el costo de la mensualidad por
un alumno, teniendo en cuenta su promedio y categoría.
28. Una fábrica codifica sus productos mediante un número de cinco cifras.
||La primera cifra define el tipo de producto (1: zapatos, 2: correas y 3: carteras).
||La segunda cifra define el color (1: natural, 2: negro y 3 marrón).
||La tercera cifra define el material (1: cuero y 2: sintético).
||La cuarta y quinta cifra, el lote al que corresponde.
Desarrolle una solución que permita obtener la información del tipo, color, material y lote de un
producto en base a su código.
29. Desarrollar una solución que permita determinar la categoría de un alumno. Considerar que la
categorización de los alumnos se realiza en función de la nota, en base a la siguiente tabla:
PÙÊÃ®Ê Cã¦ÊÙ°
18 – 20 Excelente
15 – 17 Bueno
11 – 14 Regular
0 – 10 Malo
30. Desarrollar una solución que permita ingresar las cinco notas de un alumno y calcular el promedio
del alumno sabiendo que se elimina la nota más baja y se duplica la nota más alta. Finalmente,
determinar la categoría obtenida por el alumno, considerando que la categoría del alumno está
en función de su promedio, tal como se muestra en la siguiente tabla:
PÙÊÃ®Ê Cã¦ÊÙ°
17 – 20 A
14 – 16 B
10 – 13 C
0–9 D
31. Desarrollar una solución que permita mostrar en palabras, el valor de las unidades de un número
natural.
32. Desarrollar una solución que permita ingresar el nombre del alumno, el tipo de participante
(profesor, alumno y externo) y el nivel de curso (básico, intermedio y avanzado). En la tabla que se
muestra a continuación se detallan los costos de los cursos:
A½çÃÄÊ 40 50 60
EøãÙÄÊ 60 80 100
274 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Mostrar los datos del recibo, tal como se muestra en el siguiente ejemplo:
RECIBO
Alumno Juan Pérez
Costo (de acuerdo a la tabla)
Nivel (de acuerdo al ingresado)
33. Desarrollar una solución que permita ingresar el sueldo de un trabajador. Calcular y mostrar su
aumento por incremento del costo de vida, de acuerdo a la siguiente tabla:
CÊÄ®®ÌÄ AçÃÄãÊ
Sueldo < 2000 23 %
2000>=Sueldo<=3000 17 %
Sueldo > 3000 12 %
34. Desarrollar una solución que permita ingresar la temperatura promedio (tp) de un día y mostrar
el tipo de clima, de acuerdo a la siguiente tabla:
TÃÖÙãçÙ (ãÖ) T®ÖÊ ½®Ã
tp <= 9 Frío
9 >= tp <=17 Nublado
17 >= tp <= 27 Caluroso
tp > 27 Tropical
35. Desarrollar una solución que permita ingresar una fecha en el siguiente formato: (dd/ mm/ aaaa).
Luego, calcular el número de días que tiene el mes y si el año es bisiesto o no.
36. Desarrollar una solución que calcule el sueldo de un obrero por un día, ingresando el número de
horas trabajadas y la categoría. Mostrar el sueldo y la categoría de acuerdo a la siguiente tabla:
Cã¦ÊÙ° Sç½Ê
1 horas * 300
2 horas * 450
3 horas * 500
37. Desarrollar una solución que permita mostrar el precio de un sándwich y el tipo. Luego ingrese la
categoría del sándwich:
Cã¦ÊÙ° T®ÖÊ PÙ®Ê
1 Triple S/. 4
2 Mixto S/. 6
3 Pollo S/. 2
4 Hamburguesa S/. 10
38. Desarrollar una solución que permita calcular y mostrar el precio de distintos autos, sabiendo que
se debe agregar el I.G.V. = 18 %. Tomar en cuenta la siguiente información:
39. Desarrollar una solución que permita calcular y mostrar el descuento de un televisor según su
marca.
MÙ PÙ®Ê DÝçÄãÊ
Samsung $. 500 10 %
Sony $. 1000 5%
LG $. 900 8%
Philips $. 800 10 %
40. Desarrollar una solución que permita calcular el monto a pagar por la compra de un producto,
considerando un descuento del 13 % por la compra de más de 200 unidades.
41. Desarrollar una solución que permita ingresar tres números; calcular la suma y resta, y mostrar si
la suma es par o impar y si la resta es múltiplo de 3. Luego desarrollar una solución que permite
ingresar tres números, calcular su suma y resta. Finalmente, comprobar si la suma es par o impar
y si la resta es múltiplo de 3.
42. Desarrollar una solución que permita calcular la ganancia total por la venta de cierta cantidad
de helados en un día, si su costo de producción es el 55 % del precio de venta. Los precios se
muestran en la siguiente tabla:
T®ÖÊ PÙ®Ê
Fresa S/. 0.50
Lúcuma S/. 0.70
Mango S/. 0.50
Si se cobra S/. 2 por cada ingrediente extra y el precio de la pizza sencilla es calculado por 1.5 *
diámetro. Desarrollar una solución que permita calcular y mostrar el precio total de una pizza,
ingresando el tipo y el número de ingredientes extras.
Desarrollar una solución que calcule y muestre el precio de entrada ingresando la categoría.
Además, tener en cuenta que los días martes se cobra un 50 % más.
45. Desarrollar una solución que solicite un año e indique si es bisiesto o no. Un año es bisiesto si es
múltiplo de 4, excluyendo aquellos que son múltiplo de 100 y no de 400.
||Los años exactamente divisibles entre 4 son años bisiestos.
||Los años exactamente divisibles entre 100 no son años bisiestos.
||Los años exactamente divisibles entre 400 son años bisiestos.
276 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
46. Desarrollar una solución que permita calcular el área de un trapecio y mostrar un mensaje si el
área es mayor de 400; además, indicar si el área es par o impar. Ingresar las bases y la altura del
trapecio a tráves del teclado.
47. Desarrollar una solución que muestre el “Ku” e indicar qué tipo de curva representa:
Kç T®ÖÊ çÙò
Ku < 0.25 Platicúrtica
Ku = 0.25 Mesocúrtica
Ku > 0.25 Leptocúrtica
Ingresar a tráves del teclado los datos necesarios para la aplicación de la fórmula:
48. Desarrollar una solución que permita mostrar el Skp (coeficiente de asimetría), y si la curva es
simétrica o asimétrica, y de qué tipo, si:
S»Ö AÝ®ÃãÙ°
Skp < 0 Asimet. a la izq.
Skp = 0 Simétrica
Skp > 0 Asimet. a la der.
Ingrese a tráves del teclado el promedio (X), la mediana (Me) y la desviación estándar (S) para
aplicar la formula:
Skp = 3(X – Me) / S
49. Desarrollar una solución que permita calcular el mayor de dos números ingresados a través del
teclado; además, mostrar un mensaje que muestre el número mayor.
50. Desarrollar una solución que permita calcular el promedio de un alumno. Luego, mostrar el
mensaje de aprobado (prom>=11) o desaprobado (prom<=11), teniendo en cuenta la siguiente
fórmula:
51. Desarrollar una solución en la cual se pueda ingresar y mostrar el precio de un artículo, si el precio
de dicho artículo es mayor a S/. 70.00 nuevos soles, mostrar el siguiente mensaje: “Te ganaste
una mochila”, de lo contrario mostrar el mensaje: “Te llevas una cartuchera”.
52. Desarrollar una solución que permita calcular y mostrar la suma de los 100 primeros números
enteros consecutivos, teniendo en cuenta la siguiente fórmula:
suma = n * ( n + 1 ) / 2
53. Desarrollar una solución que permita calcular un descuento del 10 % en las entradas a un
concierto, en caso de que el cliente compre más de tres entradas. Ingresar el costo de la entrada
y el número de entradas que el cliente desea comprar.
54. Desarrollar una solución que permita aumentar el salario de un empleado, en base a la siguiente
información:
S½Ù®Ê AçÃÄãÊ
0 a 500 soles 15 %
501 a 1000 soles 12 %
1001 a 2000 10 %
Más de 2000 5%
Calcular y mostrar el aumento correspondiente, así como el nuevo salario del empleado.
55. Desarrollar una solución que permita ingresar tres números enteros. Luego mostrar el menor
número, y si este es capicúa o no.
56. Desarrollar una solución que permita ingresar la categoría y el sueldo de un trabajador. Calcular
el aumento correspondiente, teniendo en cuenta la siguiente tabla. Mostrar la categoría del
trabajador y su nuevo sueldo.
Cã¦ÊÙ° AçÃÄãÊ
1 30 %
2 25 %
3 20 %
4 10 %
57. Desarrollar una solución que permita ingresar cinco números impares, luego determinar si su
suma es par o impar, y si es múltiplo de 5.
58. Desarrollar una solución que permita introducir el promedio de un alumno ingresante y clasificarlo
según la siguiente información:
59. Desarrollar una solución que permita ingresar el nombre de una tienda, el costo total de compra y
el monto total de venta de todos sus productos. Entonces, calcular la ganancia total, y de acuerdo
a esto clasificar a la tienda, teniendo en cuenta la siguiente información:
VÄãÝ T®ÖÊ
Gan >= 3000 A1
1000 <= Gan <3000 B
Gan <1000 C
278 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
60. Desarrollar una solución que permita controlar las ventas de entradas de un teatro que atiende
solo los días viernes, sábados y domingos, y cuenta con tres localidades (palco, platea y mezanine).
Tener en cuenta las siguientes tablas:
D° DÝçÄãÊ
Viernes 10 %
Sábado 5%
Domingo 3%
Finalmente, mostrar el precio neto a pagar, dependiendo el día y la localidad. Según la siguiente
formula:
61. Desarrollar una solución que permita calcular y mostrar el costo total que representa un paciente
para un hospital de acuerdo al tipo de enfermedad, según los datos de la tabla. Adicionalmente,
se debe considerar que las mujeres mayores de 18 años tienen un incremento del 19 % para la
enfermedad tipo 1 y los hombres tienen un aumento del 4 % para la tipo 3, si son menores de
edad, y del 10 % en caso contrario.
62. Desarrollar una solución que permita calcular y mostrar el costo total que representa un paciente
para un hospital de acuerdo al tipo de enfermedad, según los datos de la tabla. Adicionalmente,
debe considerar que los pacientes menores de edad tienen un descuento especial de acuerdo al
tipo de enfermedad, según se muestra en la tabla.
63. Desarrollar una solución que permita ingresar el tipo de sangre de una persona y mostrar un
mensaje de acuerdo al siguiente cuadro:
T®ÖÊ MÄݹ
O+ Compatible
O- Incompatible
CAP. 3: ESTRUCTURAS LÓGICAS DE DECISIÓN O SELECCIÓN 279
64. Desarrolle una solución que permita ingresar la edad de una persona y determine cuál es su
empleo más adecuado para dicha persona, teniendo en cuenta la siguiente información:
E EÃÖ½Ê
19 - 23 Recepcionista
23 - 25 Secretaria
25 - 30 Ejecutivo de Ventas
65. Desarrollar una solución que permita ingresar el promedio ponderado de un alumno. Si el
promedio es mayor a 16, mostrar un mensaje que se lea: “El alumno obtuvo una beca integral”.
66. Desarrollar una solución que permita ingresar el costo y el precio de venta de una computadora
portátil. Si un cliente compra más de tres computadoras se le otorgará un descuento del 10 %
sobre el precio de venta. Calcular y mostrar el monto que tiene que pagar el cliente al realizar la
compra, y cuál será la ganancia del vendedor.
67. Desarrollar una solución que permita ingresar tres números enteros. Calcular y mostrar la suma
y resta de los números; además, restar los resultados de la suma y resta. Si este resultado sale
negativo mostrar el mensaje: “Error”; de lo contrario, mostrar el resultado junto con el mensaje:
“La operación se realizó con éxito”.
68. Desarrollar una solución que permita anotar los ingresos y egresos que ha tenido una empresa.
Determinar si tiene o no estabilidad, sabiendo que si su ganancia es mayor o igual a s/.10.00
Nuevos Soles la empresa tiene estabilidad. Si tiene estabilidad mostrar el mensaje: “La empresa
califica internacionalmente”, en caso contrario no califica.
69. Desarrollar una solución que permita ingresar la cantidad de cd vendidos en una tienda y
distribuirlos según los géneros: pop, latin, hip-hop, rock; el que tenga la cantidad más alta de cd
vendidos será mostrado por un mensaje que diga: “Este género está de moda”.
70. En una tienda de muñecos de peluche se realizan descuentos y obsequian artículos según el
tamaño de los muñecos. Desarrollar una solución que permita ingresar el tamaño y el precio
de un peluche. Finalmente, calcular el descuento y determinar el regalo que obtiene el cliente,
teniendo en cuenta la siguiente información:
P½ç«Ý
Cã¦ÊÙ° DÝçÄãÊ R¦½Ê
Pequeño 7% Una bolsa de regalo
Mediano 15% Un llavero
Grande 23% Un peluche pequeño
71. Desarrollar una solución que permita ingresar el nombre y el promedio de tres alumnos de un
salón de clase, y determinar quién es el alumno que tiene el mayor promedio. Luego, mostrar el
nombre del alumno que tiene el mayor promedio junto con un mensaje de felicitaciones.
280 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
72. En la clínica “La Buena Salud” se internan diariamente muchas personas. Desarrollar una solución
que permita calcular el costo total de un paciente internado en dicha clínica, teniendo en cuenta
el total de días y el costo de la habitación. Este último se determina en base al área de ubicación
de la misma, de acuerdo a la siguiente información:
73. Desarrollar una solución que permita ingresar tres números. Multiplicar los números y mostrar el
resultado. Adicionalmente, si el resultado es múltiplo de seis, realizar dos saltos de línea y mostrar
el mensaje: “El resultado es un número múltiplo de seis”.
74. Desarrollar una solución que permita ingresar el precio de un artículo; si este es mayor a S/.
100.00 nuevos soles, mostrar un mensaje indicando que el artículo está de oferta.
75. Desarrollar una solución que permita retirar dinero del cajero de un banco; si el monto a retirar
es mayor a S/. 1000.00 nuevos soles, mostrar el mensaje “Se pasó del límite”; de lo contrario se
mostrará el mensaje “Gracias por usar nuestros servicios”
76. En una farmacia se desea comprar un fármaco. En caso de que no hay stock de ese producto
mostrar el mensaje “Agotado”; de lo contrario, se mostrará el precio del fármaco. El precio será
ingresado por teclado.
77. En una farmacia se desea comprar un fármaco. Si el fármaco se agotó mostrar el mensaje:
“Agotado”, de lo contrario, se mostrará el precio del fármaco. El cual será ingresado a tráves del
teclado. Adicionalmente, si el precio del fármaco es mayor a S/. 128 nuevos soles y el cliente
decide comprarlo se le otorgará un descuento del 3.0 %. Mostrar el descuento y el monto a pagar.
78. En una fábrica de artículos se realiza un análisis de control de calidad de piezas; si el número de la
serie de la pieza se encuentra entre los siguientes rangos de valores 146 – 156, 700 – 799 y 888 –
911 se dirá que la pieza es “defectuosa”, caso contrario se dirá que es “correcta”. Adicionalmente,
en caso que la pieza fuera correcta, determinar y mostrar si el número de la serie es un número
par o impar.
79. Una fotocopiadora permite obtener copias al por mayor según la tabla siguiente:
CÊÖ®Ý SʽÝ
De 1 a 10 0.10
De 11 a 50 0.05
De 50 a100 0.04
Mad de 100 0.03
Ingresar el número de hojas que el cliente necesita fotocopiar y mostrar el monto total a pagar.
Tener en cuenta lo siguiente:
monto = numCopias x soles
80. Desarrollar una solución que lea un número entero de tres cifras, luego mostrar el menor número
y el mayor número posible de dos cifras que se puedan formar empleando la cifra mayor y la cifra
menor del número ingresado.
CAP.
E st r u c t u r a s l ó g i c a s d e
c o n t ro l o r e p et i c i ó n
4
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 283
El presente capítulo explica en detalle las estructuras lógicas de repetición. Es importante mencionar
que, utilizando las estructuras lógicas de repetición, se pueden desarrollar algoritmos de tal forma
que estos puedan ser diseñados en pseudocódigo o diagrama de flujo, para luego ser codificados en
un lenguaje de programación. Se emplearán las técnicas para el ingreso de datos y visualización de la
información, utilizando la consola (solo caracteres) y las que emplean cuadros de diálogo.
Etapa 02
Definición
Solución
Etapa 03
Diseño
Solución
Etapa 04
MODELAMIENTO Desarrollo
ALGORITMO Solución
PROGRAMACIÓN
284 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
PROYECTO
MODELAMIENTO
CODIFICACIÓN
dominioDeLaAplicación biblioteca
Nombre
Clase
Atributos
ALGORITMO
Método ( ) Sentencias
Descripción de Declaración y
datos definición de datos
SE DESARROLLAN UTILIZANDO:
- Estructuras lógicas de secuencia
- Estructuras lógicas de decisión
- Estructuras lógicas de repetición
ALMACENADOS EN:
- Estructuras de datos variable
}|Contadores
}|Acumuladores
}|Centinelas
Por otro lado, se tratará sobre las estructuras lógicas de repetición, su diseño en algoritmos y su
codificación en un lenguaje de programación. Es importante indicar que el dominio de las estructuras
lógicas de secuencia y de decisión tratadas en los capítulos anteriores son indispensables para iniciar
el estudio del presente capítulo.
En el desarrollo de las primeras setenta soluciones se podrá apreciar el uso de las estructuras
lógicas de repetición HACER, MIENTRAS y DESDE o PARA; cómo se diseñan los algoritmos utilizando
pseudocódigo y/o diagrama de flujo, y cómo se codifican en el lenguaje de programación C++ y/o Java.
Esto permite comprender los aspectos fundamentales del desarrollo de soluciones utilizando este tipo
de estructuras lógicas.
En el desarrollo de las siguientes cinco soluciones se diseñan algoritmos con el diagrama de actividades,
y se codifican en el lenguaje de programación Java, utilizando para ello la clase reutilizable LE. En
esta parte se utilizan métodos complementarios de la clase LE, que permiten plantear soluciones más
vistosas y mucho más amigables para el usuario, a tráves del uso de cuadros de diálogo.
4.
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 285
ENUNCIADO
DEL
PROBLEMA
MODELAMIENTO CODIFICACION
}|Determinar la }|Determinar el }|Codificar el diseño
información nombre del de la solución del
deseada (salida). proyecto. problema. Utilizar
}|Determinar los }|Definir los paquetes el lenguaje de
datos de entrada y desarrollar programación C++
(entrada). el diagrama de o Java.
}|Establecer cómo paquetes respectivo.
se solucionará Establecer la
el problema dependencia. Utilice
(proceso). UML.
}|Definir las clases
que serán parte
de la solución del
problema. Utilice
UML.
ALGORITMO
}|Diseñar el algoritmo
para el método
principal. Utilizar
pseudocódigo o
diagrama de flujo.
En forma general, la Etapa 03 - “Diseño de la lógica” se divide en dos partes: modelamiento (paso 1, 2
y 3) y algoritmo (paso 4), mientras que en la Etapa 04 - “Desarrollo de la solución” se tiene la parte de
codificación (paso 1). También se puede utilizar esta división en el desarrollo de las soluciones.
286 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Estructuras lógicas
Muchas veces es necesario utilizar variables que permitan almacenar resultados parciales, obtenidos
cada vez que se ejecuta una estructura lógica de repetición (las estructuras lógicas se repetición se
estudiarán más adelante en este capítulo). Dichas variables pueden asumir la función de contador,
acumulador o centinela. La función que pueda asumir una variable dependerá de la forma como se
plantee la solución para un determinado problema.
A. Contadores: Un contador es una variable cuyo valor se incrementa o disminuye en una cantidad
fija, cada vez que se ejecutan los pasos que forman parte de una estructura de repetición. Un
contador puede ser creciente o decreciente.
B. Acumuladores: Un acumulador o totalizador es una variable cuya función consiste en almacenar un
valor como resultado de sumas o restas sucesivas. Asimismo, realiza la función de un contador, con
la diferencia de que el incremento o decremento no es una cantidad fija sino una cantidad variable.
C. Centinelas: Un centinela (denominado también interruptor, conmutador, bandera o flag) es una
variable que puede tomar dos posibles valores (1/0, verdadero/falso, si/no, encendido/apagado)
dentro de una determinada solución. Dependiendo del valor que tome la variable centinela, se
ejecutarán ciertos pasos.
Cabe mencionar que en una solución se puede utilizar una o varias variables que pueden asumir las
funciones de contador, acumulador o centinela.
A. Definición: Una estructura de repetición “HACER”, al igual que una estructura de repetición “DESDE”
y una estructura de repetición “MIENTRAS” (las cuales se estudiarán más adelante), permiten
repetir una instrucción o un bloque de instrucciones mientras que una condición se cumpla o sea
verdadera.
La principal diferencia entre una estructura de repetición HACER y una estructura de repetición
MIENTRAS, consiste en que el bucle “MIENTRAS” prueba la condición antes de ejecutar la
instrucción o bloque de instrucciones, lo que hace posible que dichas instrucciones no se ejecuten
si la condición es falsa la primera vez que se prueba la condición. Los bucles “HACER” ejecutan al
menos una vez las instrucciones o bloque de instrucciones antes de probar la condición.
}|Este tipo de estructura es útil cuando se necesita repetir una instrucción o bloque de instrucciones
un número de veces no determinado, siendo necesario ejecutar dicha instrucción o bloque por
lo menos una vez.
B. Representación
a. Formato para diseñar algoritmos
En pseudocódigo:
HACER
instruccion 1
.
.
.
instruccion n
MIENTRAS (condicion)
288 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Explicación:
Cuando se ejecuta la estructura HACER... MIENTRAS se procede a ejecutar las instrucciones que están
dentro de la misma. Al final, se realiza la evaluación de la condición lógica ubicada junto a la instrucción
MIENTRAS, etiquetada con la palabra (condición).
Una vez evaluada la condición lógica, se pueden obtener dos posibles resultados.
Si el resultado de evaluar la condición lógica es verdadero, se procede a ejecutar nuevamente las
instrucciones que están dentro de la estructura HACER... MIENTRAS, y se evalúa nuevamente la
condición lógica.
Si al evaluar la condición lógica esta resulta falsa, se continúa con la ejecución del algoritmo.
Esto significa que la estructura HACER... MIENTRAS se ejecuta por lo menos una vez antes de ser
evaluada la condición lógica. Si al evaluar la condición lógica esta resulta verdadera, se vuelve a
ejecutar la estructura; caso contrario, finaliza la ejecución de la estructura, continuando con la siguiente
instrucción del algoritmo.
Los equivalentes de esta estructura en el diagrama de flujo se muestran a continuación. Observe dónde
se ubican la condición lógica y los flujos “VERDADERO” y “FALSO”.
En diagrama de flujo:
...
instrucciones
...
condición
VERDADERO FALSO
Fig. 4.1
...
instrucciones
...
VERDADERO
condición
FALSO
Fig. 4.2
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 289
...
instrucciones
...
VERDADERO
condición
FALSO
do {
sentencias ...
} while ( condición ) ;
Explicación:
En C++ y Java, la estructura de repetición HACER está representada por la sentencia do.
En la sentencia do, al igual que en pseudocódigo y diagrama de flujo, se utiliza una condición lógica
(ejemplo: i > 10) al final de la estructura, para verificar si la estructura se vuelve a ejecutar o no.
Esta condición lógica constituye la prueba en Java y en C++. Si la condición es verdadera, se vuelven a
ejecutar las instrucciones o bloque de instrucciones que pertenecen a la estructura de repetición; en
el caso que sea falso, se finaliza la ejecución de la estructura y se continúa con la siguiente sentencia.
Problema 061
numero % 5
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
3. Definición de clases
Clase de
Clase de biblioteca
dominioDeLaAplicacion
Lectura
|leerString ()
PrgMultiploCinco
|leerChar ( )
|main () |leerInt ( )
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 291
ENTRADA: numero
SALIDA: mensaje
INICIO
NUMERO numero
TEXTO mensaje = “”
HACER
LEER numero
SI ( numero <= 0 )
ENTONCES
ESCRIBIR “Error, ingrese un número entero mayor que 0 ”
FINSI
SI ( numero % 5 == 0 )
ENTONCES
mensaje = “El número: ” + numero + “ es múltiplo de 5. ”
SINO
mensaje = “El número: ” + numero + “ no es múltiplo de 5. ”
FINSI
ESCRIBIR mensaje
FIN
292 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
En diagrama de flujo:
Algoritmo PrgMulƟploCinco – main ( )
INICIO
NUMERO numero
numero
VERDADERO
numero < 1
“Error ingrese un
número mayor
que 0”
FALSO
"error"
numero < 1
VERDADERO
FALSO
FALSO VERDADERO
numero % 5 == 0
mensaje
FIN
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 293
#include <iostream>
using namespace::std;
int main ( ) {
int numero ;
string mensaje = “” ;
do {
cout << “ Ingrese un número entero positivo: ” ;
cin >> numero ;
if ( numero < 1 ) {
cout << “ Error, ingrese número mayor que 0 ” << “\n\n” ;
}
} while ( numero < 1 ) ;
if ( numero % 5 == 0 ) {
mensaje = “ El número es múltiplo de 5 ” ;
} else {
mensaje = “ El número no es múltiplo de 5 ” ;
}
system ( “PAUSE” ) ;
return 0 ;
}
294 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgMulƟploCinco
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgMultiploCinco {
int numero ;
String mensaje ;
do {
System.out.print ( “ Ingrese un número entero positivo: ” ) ;
numero = Lectura.leerInt ( ) ;
if ( numero < 1 ) {
System.out.println (“ Error,ingrese número mayor que 0” + “\n”) ;
}
} while ( numero < 1 ) ;
if ( numero % 5 == 0 ) {
mensaje = “ El número es múltiplo de 5 ” ;
} else {
mensaje = “ El número no es múltiplo de 5 ” ;
}
System.out.println ( mensaje ) ;
}
}
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 295
Problema 062
Consistencie la entrada de datos (precio de compra mayor que cero y precio de venta mayor que
precio de compra).
utilidad = pV – pC
Diagramas de paquetes
dominioDeLaAplicacion biblioteca
296 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase de
Clase de biblioteca
dominioDeLaAplicacion
Lectura
|leerString ()
PrgUtilidad
|leerChar ( )
|main () |leerInt ( )
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
En pseudocódigo:
ENTRADA: pC, pV
SALIDA: utilidad
INICIO
REAL pC , pV , utilidad
HACER
LEER pC
SI ( pC <= 0 ) ENTONCES
ESCRIBIR “ El precio de compra debe ser mayor que 0. Vuelva a ingresarlo.”
FINSI
MIENTRAS ( pC <= 0 )
HACER
LEER pV
SI ( pC >= pV ) ENTONCES
ESCRIBIR “ El precio de venta debe ser mayor que el precio de compra.
Vuelva a ingresarlo.”
FINSI
MIENTRAS ( pC >= pV )
utilidad = pV - pC
ESCRIBIR utilidad
FIN
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 297
En diagrama de flujo:
INICIO
pC
VERDADERO
pC <= 0
FALSO
“error”
pC <= 0
VERDADERO
O
FALSO
pV
VERDADERO
pV <= pC
FALSO
“error”
pV <= pC
VERDADERO
O
FALSO
A
298 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
utilidad = pV - pC
utilidad
FIN
Clase PrgUƟlidad
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
double pC , pV , utilidad ;
do {
cout << “ Ingrese el precio de compra: ” ;
cin >> pC ;
if ( pC <= 0 ) {
cout << “ El precio de compra debe ser mayor que 0.
Vuelva a ingresarlo.” << endl ;
}
} while ( pC <= 0 ) ;
do {
cout << “ Ingrese el precio de venta: ” ;
cin >> pV ;
if ( pV <= pC ) {
cout << “ El precio de venta debe ser mayor que el
precio de compra. Vuelva a ingresarlo.” ;
cout << endl << endl ;
}
} while ( pV <= pC ) ;
utilidad = pV - pC ;
cout << endl ;
cout << “ La utilidad es: ” << utilidad << endl << endl ;
system ( “PAUSE” ) ;
return 0 ;
}
Problema 063
Enunciado: Ingrese el nombre de una persona. Muestre la primera y última letra del nombre
ingresado, luego consistencie la entrada de datos (el nombre debe tener una longitud mayor a 1).
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
Lectura
|leerString ()
PrgNombre
|leerChar ()
|main () |leerInt ( )
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
300 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
ENTRADA: nombre
SALIDA: primeraLetra, ultimaLetra
INICIO
TEXTO nombre
CARACTER primeraLetra , ultimaLetra
HACER
LEER nombre
FIN
|Observe el uso de las pautas o reglas del pseudocódigo y diagrama de flujo, que permiten
manipular caracteres y cadenas de texto. En el capítulo uno, puede observar el uso de dichas
pautas o reglas.
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 301
En diagrama de flujo:
Algoritmo PrgNombre – main ( )
INICIO
TEXTO nombre
CARACTER primeraLetra , ultimaLetra
NUMERO lon
nombre
VERDADERO
nombre
FALSO “error”
lon <= 1
VERDADERO
O
FALSO
nombre,
primeraLetra ,
ultimaLetra
FIN
302 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgNombre
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrNombre {
String nombre ;
char primeraLetra , ultimaLetra ;
do {
if ( nombre.length ( ) <=1 ) {
System.out.println ( “ Ingresar un nombre con más de
un caracter ” ) ;
}
primeraLetra = nombre.charAt ( 0 ) ;
ultimaLetra = nombre.charAt ( nombre.length ( ) - 1 ) ;
System.out.println ( ) ;
System.out.println ( “ La primera y última letra del nombre: ” +
nombre + “ son: ” + primeraLetra + “ y ” + ultimaLetra ) ;
}
}
|Observe el uso de los métodos trim ( ), length ( ) y charAt ( ) de la clase String de Java. La clase
String de Java no es tratada en el presente libro; sin embargo, dicha información la podrá encontrar
en la página web de los autores.
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 303
Problema 064
numero RESTO 3 = 0
dominioDeLaAplicacion biblioteca
CASO 1 :
HACER
LEER num
CASO 2 :
SI ( num RESTO 3 == 0 ) ENTONCES
ESCRIBIR “ El número es múltiplo de 3 ”
SINO
ESCRIBIR “ El número no es múltiplo de 3 ”
FINSI
TERMINAR
CASO 3 :
ESCRIBIR “ Hasta luego ”
TERMINAR
OTROS :
ESCRIBIR “ Opción incorrecta... Reintente !!! ”
FINCUANDO
MIENTRAS ( opc != 3 )
FIN
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 305
En diagrama de flujo:
MENU
INICIO [1] Ingresar un número
[2] Mostrar si el número
es múltiplo de 3
[3] Finalizar
NUMERO opc , num = 0 , res
opc
opc
1 2 3 OTROS
num VERDADERO
res == 0
VERDADERO FALSO
“si es múltiplo
num <= 0 de 3”
FALSO
“Error”
“no es múltiplo
de 3”
num <= 0
VERDADERO
FALSO
opc <> 3
VERDADERO
FALSO
FIN
306 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgMulƟploTres
#include <iostream>
using namespace::std;
int main ( ) {
do {
cout << “ \n\n-----MENU-----\n” ;
cout << “ [1] Ingresar un número \n” ;
cout << “ [2] Mostrar si el número es múltiplo de 3 \n” ;
cout << “ [3] Finalizar\n\n Seleccione su opción: ” ;
cin >> opc ;
switch ( opc ) {
case 1 :
do {
cout << “ Ingrese un número ” ;
cin >> num ;
if ( num <= 0 ) {
cout << “ Ingrese un número mayor que 0 ” << endl ;
}
case 2 :
if ( num % 3 == 0 ) {
cout << “ El número ” << num << “ es múltiplo de 3 ” ;
} else {
cout << “ El número ” << num << “ no es múltiplo de 3 ” ;
}
break ;
case 3 :
cout << “ Hasta luego...” << endl ;
break ;
default :
cout << “ Opción incorrecta. Reintente!!! ” << endl ;
}
} while ( opc != 3 ) ;
Clase PrgMulƟploTres
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgMultiploTres {
public static void main ( String arg [ ] ) {
do {
System.out.println ( “ \n\n-----MENU----- ” ) ;
System.out.println ( “ [1] Ingresar un número ” ) ;
System.out.println ( “ [2] Mostrar si el número es múltiplo de 3 ” );
System.out.print ( “ [3] Finalizar\n\n Seleccione su opción: ” ) ;
opc = Lectura.leerInt ( ) ;
switch ( opc ) {
case 1 :
do {
System.out.print ( “ Ingrese un número: ” ) ;
num = Lectura.leerInt ( ) ;
if ( num <= 0 ) {
System.out.println ( “ Ingrese número mayor que 0: ” ) ;
}
case 2 :
if ( num % 3 == 0 ) {
System.out.println ( “ El número es múltiplo de 3 ” ) ;
} else {
System.out.println ( “ El número no es múltiplo de 3 ” ) ;
}
break ;
case 3 :
System.out.println ( “ Hasta luego... ” ) ;
break ;
default :
System.out.println (“ Opción incorrecta. Reintente!!!!”);
}
} while ( opc != 3 ) ;
}
}
308 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 065
En la solución de este problema, deberá evitar que el usuario seleccione la opción 2 sin antes haber
seleccionado la opción 1.
Defina el nombre del proyecto y luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
ENTERO opc
TEXTO nombre = “” , letra
LOGICO valida = FALSO
HACER
LEER opc
CASO 1 :
HACER
LEER nombre
CASO 2 :
SI ( valida ) ENTONCES
ESCRIBIR “ La primera letra en mayúscula es: ” + letra
SINO
ESCRIBIR “ Ingrese primero la opción 1”
FINSI
TERMINAR
CASO 3 :
ESCRIBIR “ Hasta luego ”
TERMINAR
OTROS :
ESCRIBIR “ Opción incorrecta... Reintente! ”
FINCUANDO
MIENTRAS ( opc <> 3 )
FIN
|Observe el uso de las pautas o reglas del pseudocódigo y diagrama de flujo que permiten manipular
caracteres y cadenas de texto. En el capítulo uno, puede observar el uso de dichas pautas o reglas.
|Observe el uso de la variable denominada “valida”. Dicha variable está actuando como un
centinela.
En diagrama de flujo:
INICIO
A
310 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
MENU
A [1] Ingresar un nombre
[2] Mostrar la primera letra
del nombre en mayúscula
[3] Finalizar
opc
opc
1 2 3 OTROS
“Fin” “Error”
VERDADERO
Ingreso
num de valida
datos
FALSO
letra
nombre = MAYUSCULA nombre
letra = nombre SUBCADENA (0,1)
“Error”
valida = VERDADERO
opc <> 3
VERDADERO
FALSO
FIN
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 311
Ingreso
de datos
nombre
VERDADERO
lon <= 1
FALSO “Error”
lon <= 1
VERDADERO
FALSO
Ingreso
de datos
Este símbolo permite la ejecución de una parte de un algoritmo que ha sido diseñado en otro lugar,
con la finalidad de hacer más claro y legible el diagrama de flujo respectivo.
También es utilizado para la ejecución de procesos predefinidos, es decir, para la ejecución de otros
algoritmos. La forma de utilizar este símbolo no será tratada en el presente texto.
312 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgMenu
#include <iostream>
#include <string>
using std::cout ;
using std::endl ;
using std::cin ;
using std::string ;
int main ( ) {
int opc ;
string nombre = “” , letra ;
bool valida = false ;
do {
cout << “ \n\n -----MENU-----\n ” ;
cout << “[1] Ingresar un nombre \n ” ;
cout << “[2] Mostrar la primera letra en mayúscula \n ” ;
cout << “[3] Finaliza ” << endl ;
cin >> opc ;
switch ( opc ) {
case 1 :
do {
cout << “Ingrese un nombre: ” ;
cin >> nombre ;
if ( nombre.length() <= 1 ) {
cout << “El nombre no es válido ” << endl ;
}
} while (nombre.length() <= 1 ) ;
nombre = nombre.toUpperCase( ) ;
letra = nombre.substring ( 0,1 ) ) ;
valida = true ;
break ;
case 2 :
if ( valida ) {
cout << “ La primera letra en mayúscula es: ”
<< letra << endl ;
} else {
cout << “ Ingrese primero la opción 1 ” << endl ;
}
break ;
case 3 :
cout << “ Hasta luego... ” ;
break ;
default :
cout << “ Opción no válida. Reintente! ” << endl ;
}
} while ( opc != 3 ) ;
Clase PrgMenu
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgMenu {
public static void main ( String arg [ ] ) {
int opc ;
String nombre = “” , letra = “ ” ;
boolean valida = false ;
do {
System.out.println ( “ \n\n-----MENU----- ” ) ;
System.out.println ( “ [1]Ingresar un nombre ” ) ;
System.out.println ( “ [2]Mostrar la primera letra en mayúsculas ” ) ;
System.out.print ( “ [3]Finalizar \n Seleccione su opción: ” ) ;
opc = Lectura.leerInt( ) ;
switch (opc) {
case 1 :
do {
System.out.print ( “ \n Ingrese un nombre: ” ) ;
nombre = Lectura.leerString ( ) ;
if ( nombre.matches ( “ ! [a-zA-Z] * " ) ) {
System.out.println ( “ Nombre no válido ” ) ;
}
} while ( nombre.matches ( “ ! [a-zA-Z] * ” ) ) ;
nombre = nombre.toUpperCase( ) ;
letra = nombre.substring ( 0,1 ) ;
valida = true ;
break ;
case 2 :
if ( valida ) {
System.out.println ( “ La primera letra en mayúsculas
es: ” + letra ) ;
} else {
System.out.println (“Ingrese primero la opción 1”);
}
break ;
case 3 :
System.out.println ( “ Hasta luego... ” ) ;
break ;
default :
System.out.println (“Opción no válida. Reintente!”) ;
}
} while ( opc != 3 ) ;
}
}
Observe el uso de los métodos matches ( ), toUpperCase ( ) y substring ( ) de la clase String de Java. La clase
String de Java no es tratada en el presente libro; sin embargo, dicha información la podrá encontrar en la
página web de los autores.
314 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 066
En la solución de este problema deberá primero visualizar solo la opción 1 y 5. Una vez ingresadas
las notas deberá visualizar todas las opciones.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes,
la definición de las clases y diseñe el algoritmo.
Clase PrgMenuCalculoPromedio
#include <iostream>
#include <math.h>
using namespace::std;
int main ( ) {
int opc ;
double nota1 = 0 , nota2 = 0 , nota3 = 0 , promedio = 0 ;
bool valida = false ;
do {
if ( valida == true ) {
cout << “ \n\n-----MENU---- \n ” ;
cout << “ [1] Ingresar las 3 notas de un alumno \n ” ;
cout << “ [2] Calcular promedio simple \n ” ;
cout << “ [3] Calcular promedio duplicando la mayor nota \n ” ;
cout << “ [4] Calcular promedio eliminando la menor nota \n ” ;
cout << “ [5] Finalizar \n Ingrese su opción : ” ;
} else {
cout << “\n\n -----MENU-----\n ” ;
cout << “ [1] Ingresar las 3 notas de un alumno \n ” ;
cout << “ [5] Finalizar \n Ingrese su opción : ” ;
}
cin >> opc ;
switch ( opc ) {
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 315
case 1 :
do {
cout << “ \t Ingrese la primera nota: ” ;
cin >> nota1 ;
do {
cout << “ \t Ingrese la segunda nota: ” ;
cin >> nota2 ;
do {
cout << “ \t Ingrese la tercera nota: ” ;
cin >> nota3 ;
valida = true ;
break ;
case 2 :
if ( valida == true ) {
case 3 :
if ( valida == true ) {
promedio = ( nota1 + nota2 + nota3 + max ( nota1 , max ( nota2 ,
nota3 ) ) ) / 4 ;
cout << “\t El promedio duplicando la mayor nota es: ”
<< promedio << endl ;
break ;
}
case 4 :
if ( valida == true ) {
}
case 5 :
if ( opc == 5 ) {
cout << “ \t HASTA LUEGO !!! ” ;
break ;
}
default :
cout << “ \t OPCION INCORRECTA. REINTENTE !!!. ” ;
}
} while ( opc != 5 ) ;
Clase PrgMenuCalculoPromedio
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class ProyMenuCalculoPromedio {
public static void main ( String args [ ] ) {
int opc ;
double nota1 = 0 , nota2 = 0 , nota3 = 0 , promedio = 0 ;
boolean valida = false ;
do {
if ( valida == true ) {
System.out.println (“\n\n-----MENU---- \n ) ” ;
System.out.println (“[1] Ingresar las 3 notas de un alumno ” ) ;
System.out.println (“[2] Calcular promedio simple ” ;
System.out.println (“[3] Calcular promedio duplicando la mayor
nota ” ) ;
System.out.println (“[4] Calcular promedio eliminando la menor
nota ” ) ;
System.out.print ( “ [5] Finalizar \n Ingrese su opción :”);
} else {
System.out.println ( “ \n\n -----MENU----- ” ) ;
System.out.println ( “ [1] Ingresar las 3 notas de un alumno ” ) ;
System.out.print ( “ [5] Finalizar \n Ingrese su opción : ” );
}
opc = Lectura.leerInt ( ) ;
switch ( opc ) {
case 1 :
do {
System.out.print ( “ \t Ingrese la primera nota: ” ) ;
nota1 = Lectura.leerDouble ( ) ;
if ( nota1 > 20 || nota1 < 0 ) {
System.out.println ( “ \n\t ERROR. LA NOTA DEBE
ESTAR ENTRE 0 y 20 ” ) ;
}
} while ( nota1 > 20 || nota1 < 0 ) ;
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 317
do {
System.out.print ( “ \t Ingrese la segunda nota: ” ) ;
nota2 = Lectura.leerDouble ( ) ;
if ( nota2 > 20 || nota2 < 0 ) {
System.out.println ( “ \n\t ERROR. LA NOTA DEBE ESTAR
ENTRE 0 y 20 ” ) ;
}
} while ( nota2 > 20 || nota2 < 0 ) ;
do {
System.out.print (“ \t Ingrese la tercera nota: ” ) ;
nota3 = Lectura.leerDouble ( ) ;
if ( nota3 > 20 || nota3 < 0 ) {
System.out.println (“ \n\t ERROR. LA NOTA DEBE ESTAR
ENTRE 0 y 20 ” ) ;
}
} while ( nota3 > 20 || nota3 < 0 ) ;
valida = true ;
break ;
case 2 :
if ( valida == true ) {
promedio = ( nota1 + nota2 + nota3 ) / 3 ;
System.out.println ( “ \t El promedio simple es: ” + promedio ) ;
break ;
}
case 3 :
if ( valida == true ) {
promedio = ( nota1 + nota2 + nota3 + Math.max ( nota1 , Math.max (
nota2 , nota3 ) ) ) / 4 ;
System.out.println ( “ \t El promedio duplicando la mayor nota es: ”
+ promedio ) ;
break ;
}
case 4 :
if ( valida == true ) {
promedio = ( nota1 + nota2 + nota3 - Math.min ( nota1 , Math.min (
nota2 , nota3 ) ) ) / 2 ;
System.out.println ( “ \t El promedio anulando la mínima nota es: ”
+ promedio ) ;
break ;
}
case 5 :
if ( opc == 5 ) {
System.out.println ( “ \t HASTA LUEGO !!! ” ) ;
break ;
}
default :
System.out.println ( “ \t OPCIÓN INCORRECTA. REINTENTE! ” ) ;
}
} while ( opc != 5 ) ;
}
}
Observar el uso de los métodos min ( ) y max ( ) de la clase Math de Java. La clase Math de Java no será tratada
en el presente libro; sin embargo, dicha información la podrá encontrar en la página web de los autores.
318 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 067
Enunciado: Desarrollar una solución que permita mostrar los diez primeros números enteros
existentes. No deberá ingresar datos.
ENTRADA:
SALIDA: lista
INICIO
ENTERO c = 1
TEXTO lista = “”
HACER
lista = lista + “ ” + c
c = c + 1
MIENTRAS ( c <= 10 )
FIN
Observar el uso de la variable denominada “c”. Dicha variable está actuando como un contador.
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 319
En diagrama de flujo:
INICIO
ENTERO c = 1
TEXTO lista = “ ”
lista = lista + “ ” + c
c=c+1
c <= 10
VERDADERO
FALSO
lista
FIN
Clase PrgNumerosEnteros
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
public class PrgNumerosEnteros {
public static void main ( String [ ] args ) {
int c = 1 ;
String lista = “” ;
do {
lista = lista + “ ” + c + “\n” ;
c ++ ;
} while ( c <= 10 ) ;
System.out.println ( “ Los 10 primeros números son:\n ” + lista ) ;
}
}
Problema 068
Enunciado: Desarrollar una solución que permita mostrar los números pares comprendidos entre
1000 y 1500. No deberá ingresar datos.
INICIO
Cálculo de los
números pares entre
1000 y 1500
lista
FIN
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 321
Cálculo de los
números pares
entre 1000 y
1500
lista = lista + c + “ ”
res = i % 5
VERDADERO
res == 0
FALSO
INSERTAR SALTOLINEA
i=i+1
c=c+2
c <=1500
VERDADERO
FALSO
|Observar el uso de la regla o pauta INSERTAR SALTOLINEA. El uso de esta regla es opcional y
generalmente no se utiliza, debido a que al diseñar un algoritmo nos preocupamos por la lógica
de la solución. Cómo se ingresan los datos o cómo se visualiza la información, son temas que se
tratan específicamente al codificar el algoritmo en un lenguaje de programación determinado.
322 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgListaPares
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
int c = 1000 , i = 1 ;
String lista = “” ;
do {
lista = lista + c + “ ” ;
if ( i % 5 == 0 ) {
lista = lista + “\n” ;
}
i++ ;
c += 2 ;
} while ( c <= 1500 ) ;
System.out.println ( lista ) ;
}
}
Clase PrgListaPares
#include <iostream>
#include <string>
using namespace::std;
int main ( ) {
int c = 1000 , i = 1 ;
do {
cout << c << “ ” ;
if ( i % 5 == 0 ) {
cout << endl ;
}
i++ ;
c += 2 ;
} while ( c <= 1500 ) ;
cout << endl ;
system ( “PAUSE” ) ;
return 0 ;
}
Problema 069
SI ( i RESTO 5 == 0 ) ENTONCES
INSERTAR SALTOLINEA
FINSI
i = i + 1
FINSI
num1 = num1 + 1
SI ( i RESTO 5 == 0 ) ENTONCES
INSERTAR SALTOLINEA
FINSI
i = i + 1
FINSI
num2 = num2 + 1
FINSI
FIN
Observar el uso de las variables “impares” e “i”. Ambas variables actúan en la solución como contadores;
por otra parte, la variable denominada “listaMul3” actúa como un acumulador.
Clase PrgMulƟpos3Impares
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
if ( i % 5 == 0 ) {
listaMul3 = listaMul3 + “\n” ;
}
i++ ;
}
num1++ ;
} while ( num1 <= num2 ) ;
} else {
do {
if ( num2 % 2 != 0 ) {
impares++ ;
}
if ( num2 % 3 == 0 ) {
listaMul3 = listaMul3 + “ ” + num2 ;
if ( i % 5 == 0 ) {
listaMul3 = listaMul3 + “\n” ;
}
i++ ;
}
num2++ ;
} while ( num2 <= num1 ) ;
}
Clase PrgMulƟpos3Impares
#include <iostream>
#include <string>
using std::cout ;
using std::string ;
using std::cin ;
using std::endl ;
int main ( ) {
i++ ;
}
num1++ ;
} else {
do {
if ( num2 % 2 != 0 ) {
impares++ ;
}
if ( num2 % 3 == 0 ) {
cout << num2 << “ ” ;
if ( i % 5 == 0 ) {
cout << “\n” ;
}
i++ ;
}
num2++ ;
} while ( num2 <= num1 ) ;
}
cout << “\n\nLa cantidad de números impares es: ” << impares ;
Problema 070
Enunciado: Calcular y mostrar la nota final que obtuvieron todos los alumnos de un salón de clase.
El cálculo de la nota final se realiza en base a cuatro notas, utilizando la siguiente fórmula:
nf = ( n1 + n2 + n3 + ( n4 * 2 ) ) / 5
Ingrese las cuatro notas a través del teclado. No ingrese el total de alumnos.
A. Resultado deseado: Mostrar la nota final de todos los alumnos de un salón de clase.
B. Datos necesarios: Las cuatro notas de cada uno de los alumnos de un salón de clase.
C. Procesamiento: Las cuatro notas del alumno se ingresan a través del teclado y se
almacenan en variables (n1, n2, n3 y n4). Se realizará el cálculo de la nota
final sobre la base de la siguiente fórmula:
nf = ( n1 + n2 + n3 + ( n4 * 2 ) ) / 5
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
328 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Lectura
|leerString ()
PrgNotasAlumnos
|leerChar ()
|main () |leerInt ( )
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
INICIO
CARACTER continua
HACER
nf = ( n1 + n2 + n3 + ( n4 * 2 ) ) / 5
ESCRIBIR nf
LEER continua
FIN
Clase PrgNotasAlumnos
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
int i = 1 ;
double n1, n2, n3, n4, nf ;
char continua ;
do {
nf = ( n1 + n2 + n3 + ( n4 * 2 ) ) / 5 ;
cout << “ \t Nota final del alumno [” << i << “]: ” << nf ;
cout << “ \n\n Desea continuar (s/n): ” ;
cin >> continua ;
cout << endl ;
i ++ ;
system ( “PAUSE” ) ;
return 0 ;
Clase PrgNotasAlumnos
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNotasAlumnos {
int i = 1 ;
double n1, n2, n3, n4, nf ;
char continua ;
do {
nf = ( n1 + n2 + n3 + ( n4 * 2 ) ) / 5 ;
i ++ ;
}
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 331
Problema 071
Enunciado: Determinar la suma de sueldos de los obreros (categoría 1), la suma de sueldos de los
empleados (categoría 2) y la suma de sueldos de los gerentes (categoria 3) de una determinada
empresa. Adicionalmente, determinar cuál es el mayor y el menor sueldo en la empresa. No deberá
ingresar el total de trabajadores.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes,
la definición de las clases y diseñe el algoritmo.
Clase PrgSueldoCategoria
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
do {
do {
cout << “ Ingrese la categoría [ 1=obreros, 2=empleados,
3=gerentes]: ” ;
cin >> cat ;
if ( cat != 1 && cat != 2 && cat != 3 ) {
cout << “Categoría no válida… Reintente! ” ;
}
} while ( cat != 1 && cat != 2 && cat != 3 ) ;
do {
cout << “ Ingrese el sueldo del trabajador: ” ;
cin >> sueldo ;
if ( sueldo <= 0 ) {
cout << “ Sueldo ingresado no válido..Reintente! ” ;
}
} while ( sueldo <= 0
switch ( cat ) {
case 1 :
sumaObr = sumaObr + sueldo ;
break ;
332 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
case 2 :
sumaEmp = sumaEmp + sueldo ;
break ;
case 3 :
sumaGer = sumaGer + sueldo ;
break ;
if ( i == 1 ) {
sueldoMayor = sueldo ;
sueldoMenor = sueldo ;
i=2 ;
} else {
}
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 333
Clase PrgSueldoCategoria
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
do {
do {
System.out.print ( “ Ingrese la categoría [ 1=obreros,
2=empleados, 3=gerentes]: ” ) ;
cat = Lectura.leerInt ( ) ;
if ( cat != 1 && cat != 2 && cat != 3 ) {
System.out.println ( “ Categoría no válida… Reintente!” ) ;
}
} while ( cat != 1 && cat != 2 && cat != 3 ) ;
do {
System.out.print ( “ Ingrese el sueldo del trabajador: ” ) ;
sueldo = Lectura.leerDouble ( ) ;
if ( sueldo <= 0 ) {
System.out.println ( “ Sueldo no válido… Reintente! ” ) ;
}
} while ( sueldo <= 0 ) ;
switch ( cat ) {
case 1 :
sumaObr = sumaObr + sueldo ;
break ;
case 2 :
sumaEmp = sumaEmp + sueldo ;
break ;
case 3 :
sumaGer = sumaGer + sueldo ;
break ;
}
if ( i == 1 ) {
sueldoMayor = sueldo ;
sueldoMenor = sueldo ;
i=2 ;
} else {
if ( sueldo > sueldoMayor ) {
sueldoMayor = sueldo ;
}
if ( sueldo < sueldoMenor ) {
sueldoMenor = sueldo ;
}
}
Problema 072
Enunciado: Calcular y mostrar el número de alumnos que tienen promedio final menor que 10, los
alumnos que tienen promedio final de 10 a 14, los alumnos que tienen promedio final de 15 a 18
y los alumnos que tienen promedio final mayor a 18. Ingresar las cuatro notas de cada alumno y
calcular su promedio final en base a la siguiente fórmula:
nf = ( n1 + n2 + n3 + ( n4 * 2 ) ) / 5
Clase PrgNotasRango
#include <iostream>
#include <string>
using std::cout ;
using std::endl ;
using std::cin ;
int main ( ) {
int i = 1 , numAlumnos = 0 ;
double n1 ,n2 ,n3 ,n4 ,nf ,total1 = 0 ,total2 = 0 ,total3 = 0 ,total4 = 0 ;
do {
do {
cout << “Ingrese nota 1 del alumno (” << i << “): ” ;
cin >> n1 ;
if ( n1 < 0 || n1 > 20 ) {
cout << “Error, nota 1 incorrecta ” << endl ;
}
} while ( n1 < 0 || n1 > 20 ) ;
do {
cout << “Ingrese nota 2 del alumno (” << i << “): ” ;
cin >> n2 ;
if ( n2 < 0 || n2 > 20 ) {
cout << “Error, nota 2 incorecta ” << endl ;
}
} while ( n2 < 0 || n2 > 20 ) ;
do {
cout << “Ingrese nota 3 del alumno (” << i << “): ” ;
cin >> n3 ;
if ( n3 < 0 || n3 > 20 ) {
cout << “Error, nota 3 incorrecta ” << endl ;
}
} while ( n3 < 0 || n3 > 20 ) ;
do {
cout << “Ingrese nota 4 del alumno (” << i << “): ” ;
cin >> n4 ;
if ( n4 < 0 || n4 > 20 ) {
cout << “Error, nota 4 incorrecta ” << endl ;
}
} while ( n4 < 0 || n4 > 20 ) ;
cout <<endl ;
nf = ( n1 + n2 + n3 + ( n4 * 2 ) ) / 5 ;
if ( nf < 10 ) { total1++ ; }
if ( nf >= 10 && nf <= 14 ) { total2++ ; }
if ( nf >= 15 && nf <= 18 ) { total3++ ; }
if ( nf > 18 ) { total4++ ; }
i ++ ;
cout << “\nAlumnos con promedio menor a 10: ” << total1 << endl ;
cout << “Alumnos con promedio de 10 a 14: ” << total2 << endl ;
cout << “Alumnos con promedio de 15 a 18: ” << total3 << endl ;
cout << “Alumnos con promedio mayor a 18: ” << total4 << endl ;
Clase PrgNotasRango
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
public class PrgNotasRango {
public static void main ( String[ ] args ) {
int i = 1 , numAlumnos = 0 ;
double n1 ,n2 ,n3 ,n4 ,nf ,total1 = 0 ,total2 = 0 ,total3 = 0 ,total4 = 0 ;
System.out.print ( “ Ingrese el número de alumnos: ” ) ;
numAlumnos=Lectura.leerInt ( ) ;
do {
do {
System.out.print ( “ \nIngrese nota 1 del alumno (” + i + “): ” ) ;
n1 = Lectura.leerDouble ( ) ;
if ( n1 < 0 || n1 > 20 ) {
System.out.println ( “ Error, nota 1 incorrecta ” ) ;
}
} while ( n1 < 0 || n1 > 20 ) ;
do {
System.out.print ( “ Ingrese nota 2 del alumno (” + i + “): ” ) ;
n2 = Lectura.leerDouble ( ) ;
if ( n2 < 0 || n2 > 20 ) {
System.out.println ( “ Error, nota 2 incorrecta ” ) ;
}
} while ( n2 < 0 || n2 > 20 ) ;
do {
System.out.print ( “ Ingrese nota 3 del alumno (” + i + “): ” ) ;
n3 = Lectura.leerDouble ( ) ;
if ( n3 < 0 || n3 > 20 ) {
System.out.println ( “ Error, nota 3 incorrecta ” ) ;
}
} while ( n3 < 0 || n3 > 20 ) ;
do {
System.out.print ( “ Ingrese nota 4 del alumno (” + i + “): ” ) ;
n4 = Lectura.leerDouble ( ) ;
if ( n4 < 0 || n4 > 20 ) {
System.out.println ( “ Error, nota 4 incorrecta ” ) ;
}
} while ( n4 < 0 || n4 > 20 ) ;
nf = ( n1 + n2 + n3 + ( n4 * 2 ) ) / 5 ;
if ( nf < 10 ) { total1++ ; }
if ( nf >= 10 && nf <= 14 ) { total2++ ; }
if ( nf >= 15 && nf <= 18 ) { total3++ ; }
if ( nf > 18 ) { total4++ ; }
i ++ ;
} while ( i <= numAlumnos ) ;
System.out.println ( ) ;
System.out.println ( “Alumnos con promedio menor a 10: ” + total1 ) ;
System.out.println ( “Alumnos con promedio de 10 a 14: ” + total2 ) ;
System.out.println ( “Alumnos con promedio de 15 a 18: ” + total3 ) ;
System.out.println ( “Alumnos con promedio mayor a 18: ” + total4 ) ;
}
}
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 337
Problema 073
Enunciado: Elaborar una solución que permita controlar la venta de boletos en un determinado
día en un teatro de la capital, en base a la siguiente información:
A. Al comenzar, se leerá una sola vez el precio de entrada para palco, platea y mezanine.
B. Por cada entrada vendida se leerán los siguientes datos: número de boleto (si el número de boleto
es cero se deberá finalizar) y lugar (puede ser platea, palco o mezanine).
C. Antes de finalizar, se deberá proporcionar la siguiente información:
a. Número total de entradas vendidas durante el día.
b. El total de soles recaudados en el día.
c. Número de entradas vendidas para platea, palco y mezanine en el día.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes,
la definición de las clases y diseñe el algoritmo.
Clase PrgTeatro
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
do {
if ( numBoleto != 0 ) {
do {
switch ( tipo ) {
case 3 : totalMez++ ;
}
}
} while ( numBoleto != 0 ) ;
}
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 339
Clase PrgTeatro
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
do {
do {
System.out.print ( “ \n Ingrese el número de boleto: ” ) ;
numBoleto = Lectura.leerInt ( ) ;
} while ( numBoleto < 0 ) ;
if ( numBoleto != 0 ) {
do {
System.out.println ( “ Ingrese el lugar ” ) ;
System.out.print ( “ [1] Platea, [2] Palco, [3] Mezanine ” ) ;
tipo = Lectura.leerInt ( ) ;
} while ( tipo < 1 || tipo > 3 ) ;
switch ( tipo ) {
case 1 : totalPla++ ; break ;
case 2 : totalPal++ ; break ;
case 3 : totalMez++ ; break ;
}
}
} while ( numBoleto != 0 ) ;
Problema 074
Enunciado: Los empleados de una fábrica trabajan en tres turnos: mañana, tarde y noche. Se
necesita calcular el jornal diario de cada empleado teniendo en cuenta lo siguiente:
Clase PrgJornal
#include <iostream>
using namespace::std;
int main ( ) {
do {
i ++ ;
do {
cout << “\n Ingrese horas trabajadas empleado ( ” << i << “ ): ” ;
cin >> horas ;
if ( horas <= 0 ) {
cout << “ Número de horas mayor a 0 ” << endl ;
}
} while ( horas <= 0 ) ;
do {
cout << “ \n Seleccione día: ” << endl ;
cout << “ [1] Lunes ” << endl ;
cout << “ [2] Martes ” << endl ;
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 341
system ( “PAUSE” ) ;
return 0 ;
}
342 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgJornal
package dominioDeLaAplicacion;
import biblioteca.Lectura;
do {
System.out.print ( “ Ingrese el número de empleados: ” ) ;
numEmpleados = Lectura.leerInt ( ) ;
if ( numEmpleados <= 0 ) {
System.out.println ( “ Número de empleados debe ser mayor a 0” ) ;
}
} while ( numEmpleados <= 0 ) ;
do {
i++ ;
do {
if ( horas <= 0 ) {
System.out.println ( “ Número de horas mayor a 0 ” ) ;
}
do {
System.out.print ( “ \t Opción: ” ) ;
turno = Lectura.leerInt ( ) ;
switch ( turno ) {
case 1 :
case 2 :
if ( dia == 7 ) {
tarifa = 1.5 * 8 ;
} else {
tarifa = 8 ;
}
break ;
case 3 :
if ( dia == 7 ) {
tarifa = 1.6 * 10 ;
} else {
tarifa = 10 ;
}
break ;
default :
System.out.println ( “ La opción no es válida ” ) ;
}
} while ( turno != 1 && turno != 2 && turno !=3 ) ;
if ( turno ==2 ) {
jornal = horas * tarifa + 10 ;
} else {
jornal = horas * tarifa ;
}
}
}
344 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 075
Enunciado: Desarrollar una solución que permita obtener la siguiente información en un salón de
clase:
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes,
la definición de las clases y diseñe el algoritmo.
Clase PrgClase
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
do {
i++ ;
do {
cout << “ Ingrese el sexo del alumno ( ” << i << “ ) F/M: ” ;
cin >> sexo ;
if ( sexo != ‘f’ && sexo != ‘F’ && sexo != ‘m’ && sexo != ‘M’
) {
cout << “Sexo no válido" << endl ;
}
} while (sexo != ‘f’ && sexo !=‘F’ && sexo !=‘m’ && sexo != ‘M’ ) ;
do {
cout << “ Ingrese la edad del alumno ( ” << i << “ ): ” ;
cin >> edad ;
if ( edad <= 0 ) {
cout << “Edad no válida ” << endl ;
}
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 345
do {
cout << “ Ingrese la nota del alumno ( ” << i << “ ): ” ;
cin >> nota ;
if ( nota <0 || nota > 20 ) {
cout << “Nota no válida ” << endl ;
}
} while ( nota < 0 || nota > 20 ) ;
switch ( sexo ) {
case ‘f’ :
case ‘F’ :
matriculadas += 1 ;
if ( edad < 20 ) {
menores += 1 ;
}
if ( nota < 10.5 ) {
desaprobadas += 1 ;
}
break ;
case ‘m’ :
case ‘M’ :
matriculados += 1 ;
if ( edad > 18 ) {
mayores += 1 ;
}
if ( nota >= 10.5 ) {
aprobados += 1 ;
}
}
do {
cout << “ \n ¿Desea ingresar datos de otro alumno (S/N)?: ” ;
cin >> rpta ;
if ( rpta != ‘s’ && rpta !=‘S’ && rpta !=‘n’ && rpta !=‘N’) {
cout << “ Respuesta no válida ” << endl ;
}
} while ( rpta !=‘s’ && rpta != ‘S’ && rpta != ‘n’ && rpta !=‘N’);
Clase PrgClase
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
do {
i++ ;
do {
if ( sexo != ‘f’ && sexo !=‘F’ && sexo != ‘m’ && sexo != ‘M’){
System.out.println ( “Sexo no válido ” ) ;
}
} while ( sexo != ‘f’ && sexo !=‘F’ && sexo != ‘m’ && sexo !=‘M’);
do {
if ( edad <= 0 ) {
System.out.println ( “Edad no válida ” ) ;
}
do {
switch ( sexo ) {
case ‘f’ :
case ‘F’ :
matriculadas += 1 ;
if ( edad < 20 ) {
menores += 1 ;
}
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 347
case ‘m’ :
case ‘M’ :
matriculados += 1 ;
if ( edad > 18 ) {
mayores += 1 ;
}
if ( nota >= 10.5 ) {
aprobados += 1 ;
}
}
do {
System.out.print ( “ \n ¿Desea ingresar otros datos (S/N)?: ” ) ;
rpta = Lectura.leerChar ( ) ;
if ( rpta != ‘s’ && rpta != ‘S’ && rpta != ‘n’ && rpta != ‘N’){
System.out.println ( “Respuesta no válida ” ) ;
}
} while (rpta != ‘s’ && rpta !=‘S’ && rpta != ‘n’ && rpta != ‘N’);
System.out.println ( );
System.out.println ( “ Hay ”+ matriculadas + “ alumna(s) matriculada(s)” );
System.out.println ( " Hay ”+ matriculados + " alumno(s) matriculado(s)” );
System.out.println ( “ Hay ”+ menores + “ alumna(s) menor(es) de 20 ” ) ;
System.out.println ( “ Hay ”+ mayores + “ alumno(s) mayor(es) de 18 ” ) ;
System.out.println ( “ Hay ”+ desaprobadas + “ alumnas desaprobadas ” ) ;
System.out.println ( “ Hay ”+ aprobados + “ alumno(s) aprobado(s) ” ) ;
}
}
IMPORTANTE
Se recomienda solucionar los problemas propuestos del 1 al 15,
que están planteados al final del presente capítulo.
348 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
A. Definición: Una estructura de repetición “MIENTRAS”, al igual que una estructura de repetición
“DESDE”, permite repetir una instrucción o un bloque de instrucciones, mientras que una condición
se cumpla o esta sea verdadera.
|Estetipo de estructura es útil cuando se necesita repetir una instrucción o bloque de instrucciones
un número de veces no determinado.
B. Representación
a. Formato para diseñar algoritmos
En pseudocódigo:
MIENTRAS ( condición )
instrucción 1
.
.
.
instrucción n
FINMIENTRAS
Explicación:
Una vez evaluada la condición lógica, se pueden obtener dos posibles resultados.
Si el resultado de evaluar la condición lógica es verdadero, se procede a ejecutar las instrucciones que
están dentro de la estructura MIENTRAS... FINMIENTRAS, y se evalúa nuevamente la condición lógica.
Si el resultado de evaluar la condición lógica es falso, no se ejecutan las instrucciones que están dentro
de la estructura MIENTRAS... FINMIENTRAS, y se continúa con la ejecución del algoritmo.
Esto significa que, mientras la evaluación de la condición lógica resulte verdadera, se ejecutará la
estructura MIENTRAS... FINMIENTRAS, y solo finalizará cuando la evaluación de la condición lógica
resulte falsa.
En diagrama de flujo:
FALSO
condición
VERDADERO
...
instrucciones
...
Fig. 4.4
VERDADERO
condición instrucción
FALSO
Fig. 4.5
while ( condición ) {
sentencias ...
}
Explicación:
En C++ y Java, la estructura de repetición MIENTRAS está representada por la sentencia while.
En la sentencia while, al igual que en pseudocódigo y diagrama de flujo, se utiliza una condición lógica
(ejemplo: i > 10) para verificar si se ejecuta o no la estructura.
Esta condición lógica constituye la prueba en C++ y en Java. Si la condición es verdadera, se continúa
con la ejecución de las sentencias o bloque de sentencias que pertenecen a la estructura de repetición;
en el caso que sea falsa, se finaliza la ejecución continuando con la siguiente sentencia.
Es importante indicar que el inicio y fin del while se representan con llaves ( { } ).
350 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 076
Enunciado: Mostrar la suma de los números múltiplos de 5 menores a 50. Utilice la estructura de
repetición MIENTRAS.
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
3. Definición de clases
Clase de
Clase de biblioteca
dominioDeLaAplicacion
Lectura
|leerString ()
PrgMultiplo5
|leerChar ()
|main () |leerInt ( )
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 351
INICIO
ENTERO num = 0
ENTERO suma = 0
FALSO
num <= 50
VERDADERO
num = num+1
suma
FIN
352 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgMulƟplo5
#include <iostream>
using std::cout ;
int main ( ) {
int suma = 0 ;
int num = 0 ;
system ( “PAUSE” ) ;
return 0 ;
}
Clase PrgMulƟplo5
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgMultiplo5 {
int suma = 0 ;
int num = 0 ;
Problema 077
Enunciado: Calcular y mostrar la cantidad de números pares comprendidos entre dos números
ingresados por teclado. Utilice la estructura de repetición MIENTRAS.
A. Resultado deseado: Mostrar la cantidad de números pares comprendidos entre dos números
ingresados a través del teclado.
B. Datos necesarios: Los dos números.
C. Procesamiento: Los números serán ingresados y almacenados en variables tipo entero
(num1 y num2 respectivamente); luego, se realizará la evaluación de cada
uno de los números comprendidos entre los números ingresados, con
la finalidad de establecer si son números pares. Para esto se utilizará la
siguiente fórmula:
num RESTO 2
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
3. Definición de clases
Clase de
Clase de biblioteca
dominioDeLaAplicacion
Lectura
|leerString ()
PrgPares
|leerChar ()
|leerInt ( )
|main ()
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
354 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
INICIO
NUMERO num1, num2, num, numPar = 0
num = num + 1
FINMIENTRAS
ESCRIBIR numPar
FIN
En diagrama de flujo:
INICIO
NUMERO num1,num2
NUMERO num, numPar = 0
num1, num2
num = num1
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 355
num = num1
FALSO
VERDADERO
VERDADE
FALSO
num%2 = 0
VERDADERO
VERDAD
numPar = numPar + 1
num = num + 1
numPar
FIN
Clase PrgPares
#include <iostream>
using namespace::std;
int main ( ) {
int num1 , num2 , num , numPar = 0 ;
cout << “ Ingrese el primero número: ” ; cin >> num1 ;
cout << “ Ingrese el segundo número: ” ; cin >> num2 ;
num = num1 ;
while ( num <= num2 ) {
if ( num % 2 == 0 ) {
numPar ++ ;
356 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
}
num ++ ;
}
cout << “ \n La cantidad de números pares es: ” << numPar << “ \n\n ” ;
system ( “PAUSE” ) ;
return 0 ;
}
Clase PrgPares
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgPares {
public static void main ( String arg [ ] ) {
Problema 078
Enunciado: Calcular y mostrar los números enteros cuadrados perfectos mayores que cero y
menores a un número ingresado por teclado. Un número cuadrado perfecto es aquel cuya raíz
cuadrada es un número entero. Utilice la estructura de repetición MIENTRAS.
A. Resultado deseado: Mostrar los números cuadrados perfectos mayores que cero y menores a
un número ingresado por teclado.
B. Datos necesarios: Un número entero.
C. Procesamiento: Se ingresará un número entero, se almacenará en una variable (num) y se
evaluará cada uno de los números desde el 1 hasta el número ingresado
(i). La evaluación se realiza obteniendo la raíz cuadrada del número (raiz)
y multiplicando el número por 10. Si el resto de dividir a la raíz cuadrado
del número entre 10 es cero, entonces el número es un cuadrado perfecto.
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
3. Definición de clases
Clase de Clase de biblioteca
dominioDeLaAplicacion
Lectura
PrgNumerosPerfectos |leerString ()
|leerChar ()
|main () |leerInt ( )
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
358 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
ENTRADA: num
SALIDA: i
INICIO
LEER num
raiz = i RAIZ 2
raiz = raiz * 10
i = i + 1
FINMIENTRAS
FIN
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 359
En diagrama de flujo:
INICIO
NUMERO num , i = 1
NUMERO raiz
num
FALSO
i <= num
VERDADERO
raiz = i RAIZ 2
raiz = raiz * 10
VERDADERO
raiz RESTO 10 = 0
FALS
FALSO
L
i=i+1
FIN
360 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
#include <iostream>
#include <math.h>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
int num, i = 1 ;
double raiz ;
raiz = sqrt ( i ) ;
raiz = raiz * 10 ;
if ( (int)(raiz) % 10 == 0 ) {
cout << “ \t El número ” << i << “ es un número perfecto ” << endl;
}
i ++ ;
Clase PrgNumerosPerfectos
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumerosPerfectos {
int num, i = 1 ;
double raiz ;
raiz = Math.sqrt ( i ) ;
raiz = raiz * 10 ;
if ( (int)(raiz) % 10 == 0 ) {
System.out.println ( “ \t El número ” + i + “ es perfecto ” ) ;
}
i ++ ;
}
}
Observe el uso de los métodos sqrt ( ) de la clase Math de Java. La clase Math de Java no es tratada en el
presente libro; sin embargo, dicha información la podrá encontrar en la página web de los autores.
Problema 079
Enunciado: Ingresar tres notas de diez alumnos de un salón de clase y calcular el promedio de cada
uno de ellos. Utilice la estructura de repetición MIENTRAS.
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
3. Definición de clases
Lectura
PrgPromedios |leerString ()
|leerChar ( )
|main () |leerInt ( )
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
INICIO
FINMIENTRAS
FIN
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 363
En diagrama de flujo:
INICIO
FALSO
numAlu <= 10
VERDADERO
O
promedio
numAlu = numAlu + 1
FIN
364 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgPromedios
#include <iostream>
using namespace::std;
int main ( ) {
Clase PrgPromedios
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgPromedios {
public static void main ( String arg [ ] ) {
Problema 080
Enunciado: Ingrese el promedio de diez alumnos de un salón de clase y calcule el promedio general
obtenido. Para la solución, utilice la estructura de repetición MIENTRAS.
promGen = sumaPromedios / 10
dominioDeLaAplicacion biblioteca
3. Definición de clases
Lectura
PrgPromedioG |leerString ()
|leerChar ( )
|main () |leerInt ( )
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
366 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
ENTRADA: promedio
SALIDA: promGen
INICIO
ENTERO numAlu = 1
REAL promedio , sumaPromedios = 0 , promGen = 0
LEER promedio
sumaPromedios = sumaPromedios + promedio
numAlu = numAlu + 1
FINMIENTRAS
promGen = sumaPromedios / 10
ESCRIBIR promGen
FIN
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 367
En diagrama de flujo:
INICIO
ENTERO numAlu = 1
REAL promedio , sumaPromedios = 0 , promGen=0
FALSO
numAlu <= 10
VERDADERO
VERDADE
promedio
numAlu = numAlu + 1
promGen = sumaPromedios / 10
promGen
FIN
368 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgPromedioG
#include <iostream>
using std::cout ;
using std::cin ;
int main ( ) {
system ( “PAUSE” ) ;
return 0 ;
}
Clase PrgPromedioG
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgPromedioG {
public static void main ( String arg [ ] ) {
Problema 081
Enunciado: Desarrolle una solución que permita generar y visualizar los diez primeros términos de
la serie siguiente:
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
ENTRADA:
SALIDA: num, den
INICIO
SI ( cont == 1 ) ENTONCES
ESCRIBIR num + “ / ” + den
SINO
ESCRIBIR “, ” + num + “ / ” + den
FINSI
num = num + 3
den = den + 4
FINMIENTRAS
FIN
Clase PrgSerie
#include <iostream>
using std::cout ;
int main ( ) {
num += 3 ;
den += 4 ;
cont ++ ;
}
Clase PrgSerie
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgSerie {
public static void main ( String arg [ ] ) {
num += 3 ;
den += 4 ;
cont ++ ;
}
}
}
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 371
Problema 082
Enunciado: Ingresar, calcular y mostrar el número de cifras que tiene cierto número. Utilizar la
estructura de repetición MIENTRAS, para resolver el ejercicio.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
ENTRADA: numero
SALIDA: numCifras
INICIO
LEER numero
MIENTRAS ( numero > 0 )
numero = numero / 10
numCifras = numCifras + 1
FINMIENTRAS
ESCRIBIR “La cantidad de cifras es: ” + numCifras
FIN
Clase PrgNumCifras
#include <iostream>
using std::cout ;
using std::cin ;
int main ( ) {
numCifras ++ ;
Clase PrgNumCifras
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumCifras {
numero = numero / 10 ;
numCifras ++ ;
}
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 373
Problema 083
Enunciado: Ingresar, calcular y mostrar la suma de las cifras de un número. Utilizar la estructura de
repetición MIENTRAS, para resolver el ejercicio.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes,
la definición de las clases y diseñe el algoritmo.
Clase PrgSumaCifras
#include <iostream>
using std::cout ;
using std::cin ;
int main ( ) {
cifra = numero % 10 ;
numero = numero / 10 ;
sumaCifras += cifra ;
}
374 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgSumaCifras
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgSumaCifras {
public static void main ( String arg [ ] ) {
Problema 084
Enunciado: Ingresar un número, luego calcular y mostrar dicho número con las cifras invertidas
(Ejemplo: se ingresa 128, se muestra 821). Utilizar la estructura de repetición MIENTRAS.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes,
la definición de las clases y diseñe el algoritmo.
Clase PrgInvCifras
#include <iostream>
using std::cout ;
using std::cin ;
int main ( ) {
int numero , cifra , numInvertido = 0 ;
cout << “ Ingrese un número: ” ;
cin >> numero ;
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 375
cifra = numero % 10 ;
numero = numero / 10 ;
numInvertido = numInvertido * 10 + cifra ;
cout << “ \n El número con las cifras invertidas es: ” << numInvertido ;
Clase PrgInvCifras
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgInvCifras {
cifra = numero % 10 ;
numero = numero / 10 ;
numInvertido = numInvertido * 10 + cifra ;
}
}
376 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 085
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes,
la definición de las clases y diseñe el algoritmo.
Clase PrgNumCapicua
#include <iostream>
using std::cout ;
using std::cin ;
int main ( ) {
numIngresado = numero ;
cifra = numero % 10 ;
numero = numero / 10 ;
numInvertido = numInvertido * 10 + cifra ;
if ( numIngresado == numInvertido ) {
cout << “ \n El número ingresado es capicua ” ;
} else {
cout << “ \n El número ingresado no es capicua ” ;
}
Clase PrgNumCapicua
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumCapicua {
numIngresado = numero ;
cifra = numero % 10 ;
numero = numero / 10 ;
numInvertido = numInvertido * 10 + cifra ;
if ( numIngresado == numInvertido ) {
System.out.println ( “ \n El número ingresado es capicua ” ) ;
} else {
System.out.println ( “ \n El número ingresado no es capicua ” ) ;
}
}
}
IMPORTANTE
Se recomienda solucionar los problemas propuestos del 16 al 30,
que están planteados al final del presente capítulo.
378 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
A. Definición: Una estructura de repetición “DESDE” o “PARA” permite repetir una instrucción o un
bloque de instrucción, un número determinado de veces o hasta que una condición se cumpla. Se
utiliza con frecuencia para iteraciones sencillas, donde se repite un bloque de instrucciones cierto
número de veces y después se detiene.
|Este Ɵpo de estructura es úƟl cuando se necesita repeƟr una instrucción o bloque de instrucciones
un cierto número de veces.
B. Representación
a. Formato para diseñar algoritmos
En pseudocódigo:
instrucción 1
.
.
.
instrucción n
FINPARA
instrucción 1
.
.
.
instrucción n
FINDESDE
Explicación:
1. Inicialización: <valor_inicial>
Esta parte se ejecuta una sola vez al momento de iniciar la ejecución del DESDE o PARA, y permite
asignar un valor inicial a una variable índice. Esta variable permite mantener el control sobre el
número de veces que se repiten las instrucciones ubicadas entre el DESDE y el FINDESDE, o el PARA
y el FINPARA, dependiendo del formato que se utilice.
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 379
2. Incremento: <valor>
Cada vez que finaliza la ejecución de las instrucciones o bloque de instrucciones ubicadas entre el
DESDE y el FINDESDE, o el PARA y el FINPARA, se ejecuta esta parte y se INCREMENTA (aumenta)
el valor de la variable índice, según se indique en <valor>. También existe la posibilidad de reducir
el valor de la variable índice; en este caso, se utiliza la palabra reservada DECREMENTA (disminuye)
en vez de la palabra INCREMENTA en el formato DESDE.
En diagrama de flujo:
PARA… FINPARA
valor_inicial
FALSO
condición
VERDADERO
ADERO
...
instrucciones
...
valor
380 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
DESDE… FINDESDE:
FALSO
DESDE i HASTA z
condición
INCREMENTA i en x
VERDADERO
...
instrucciones
...
Explicación:
Las tres partes de esta estructura representada con el formato DESDE, se simbolizan en el diagrama de
flujo a través de las siguientes palabras reservadas:
DESDE i HASTA z
Donde “i” representa la variable índice, y “z” representa el valor que la variable índice “i” debe alcanzar
para finalizar la ejecución.
INCREMENTA i en x
Aquí “x” representa el valor que se incrementará a la variable índice “i” cada vez que finalice la
ejecución de las instrucciones que forman parte de la estructura.
También puede usar:
INCREMENTA x
Se incrementa el valor de “x” a la variable índice.
Ambas palabras se encuentran dentro del símbolo que representa La Estructura Lógica DESDE, la cual
se muestra a continuación:
El fin de las instrucciones o bloque de instrucciones que forman parte de La Estructura Lógica DESDE,
se representa por el siguiente símbolo:
sentencias ...
Explicación:
En C++ y en Java la estructura de repetición DESDE está representada por la sentencia for.
Al igual que en pseudocódigo y diagrama de flujo, en Java y C++ esta estructura está constituida por
tres partes, las cuales están entre paréntesis y separadas por punto y coma.
La parte de inicialización es la que se ejecuta una sola vez (la primera vez que se ejecuta el for) y
permite inicializar la variable índice.
La parte de condición es la condición lógica (ejemplo: i >10), que permite determinar si se vuelve a
ejecutar la estructura de repetición for.
Y la tercera parte permite incrementar o decrementar el valor de la variable índice cada vez que se
ejecuta la estructura de repetición for.
Problema 086
Enunciado: Calcular y mostrar los 10 primeros números múltiplos del número 7. Utilice la estructura
de repetición DESDE.
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
3. Definición de clases
Lectura
PrgMultiploSiete |leerString ()
|leerChar ( )
|main () |leerInt ( )
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 383
ENTRADA:
SALIDA: mensaje
INICIO
TEXTO mensaje = “”
NUMERO num
En diagrama de flujo:
INICIO
TEXTO mensaje = “”
NUMERO num
FALSO
DESDE num=1 HASTA 10
INCREMENTA num en 1
VERDADERO
mensaje = mensaje + ( num * 7 ) + “ ”
mensaje
FIN
384 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgMulƟploSiete
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgMultiploSiete {
String mensaje = “” ;
int num ;
}
}
Clase PrgMulƟploSiete
#include <iostream>
#include <string>
using namespace::std ;
int main ( ) {
int num ;
Problema 087
Enunciado: Calcular y mostrar la cantidad de números pares, y la suma de los números múltiplos
de 3 comprendidos entre dos números ingresados por teclado. Utilice la estructura de repetición
DESDE y PARA.
A. Resultado deseado: Mostrar la cantidad de números pares y la suma de los números múltiplos
de 3 comprendidos entre dos números ingresados por teclado.
B. Datos necesarios: Los dos números.
C. Procesamiento: Los números ingresados por teclado se almacenarán en variables tipo
entero (num1 y num2). Luego, se evaluarán los números comprendidos
entre los números ingresados. Para ello se utilizará una variable (num).
Cada número será evaluado con la finalidad de determinar si es par o es
múltiplo del número 3. Si resulta un número par se le suma 1 a la variable
contador (pares), y si es múltiplo de 3 se le suma dicho número en una
variable acumulador (suma). Finalmente, se mostrarán los resultados.
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
3. Definición de clases
Lectura
PrgParesSuma |leerString ()
|leerChar ()
|main () |leerInt ( )
|leerLong ( )
|leerFloat ( )
|leerDouble ( )
386 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Esto se justifica, ya que se asume que la variable índice esta representada por “num” y es la
variable que se incrementa en 1 cada vez que se ejecuta la estructura lógica de repetición DESDE.
En diagrama de flujo:
INICIO
num1, num2
INCREMENTA 1
VERDADERO
VERDADERO
num RESTO 2 = 0
FALSO
pares = pares + 1
VERDADERO
num RESTO 2 = 0
FALSO
suma = suma + num
pares, suma
FIN
388 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
INICIO
num1, num2
num = num1
FALSO
num <= num2
VERDADERO
VERDADERO
num RESTO 2 = 0
VERDADERO
num RESTO 3 = 0
num = num1 + 1
pares, suma
FIN
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 389
Clase PrgParesSuma
#include <iostream>
using std::cout ;
using std::cin ;
int main ( ) {
if ( num % 2 == 0 ) {
pares ++ ;
}
if ( num % 3 == 0 ) {
suma = suma + num ;
}
Clase PrgParesSuma
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgParesSuma {
Problema 088
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
ENTRADA: num
SALIDA: num
INICIO
SI ( div == 1 ) ENTONCES
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 391
FIN
Observe que la tercera parte de la estructura lógica de repetición DESDE no ha sido utilizada.
Cuando en el pseudocódigo o diagrama de flujo no se utiliza la tercera parte de la estructura
de repetición DESDE, se asume que la variable índice (representada en este pseudocódigo por la
variable “i”) se incrementará en 1 cada vez que se ejecute la estructura lógica de repetición DESDE.
En diagrama de flujo:
Algoritmo PrgNumeroPrimo – main ( )
INICIO
num
VERDADERO
VERDADERO
FALSO
VERDADERO
div = 1
FIN
392 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgNumeroPrimo
#include <iostream>
using namespace::std;
int main ( ) {
Clase PrgNumeroPrimo
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumeroPrimo {
public static void main ( String arg [ ] ) {
Problema 089
Enunciado: Determinar y mostrar los términos de una progresión aritmética. Ingrese el valor del
primer término, el valor de la razón y el número de términos que tiene la progresión. Utilice la
estructura de repetición PARA.
Clase PrgProgresionAritmeƟca
#include <iostream>
#include <string>
using std::cout ;
using std::cin ;
using std::string ;
using std::endl ;
int main ( ) {
termino = primerT ;
cout << endl << “Los términos de la progresión son: ” ;
cout << endl << termino << “ ” ;
Clase PrgProgresionAritmeƟca
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgProgresionAritmetica {
System.out.println ( mensaje ) ;
}
}
Problema 090
Enunciado: Determinar y mostrar la suma de los términos de una progresión geométrica. Ingrese el
valor del primer término, el de la razón y el número de términos que tiene la progresión. Utilice la
estructura de repetición PARA y DESDE.
INICIO
FINPARA
ESCRIBIR suma
FIN
En diagrama de flujo:
INICIO
VERDADERO
suma
FIN
Clase PrgProgresionGeometrica
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgProgresionGeometrica {
Problema 091
INICIO
Cálculo de
cantidad de
pares, ceros
y negativos.
pares, ceros ,
negativos
FIN
Cálculo de
cantidad de
pares, ceros y
negativos.
DESDE i = 0 HASTA 49 FALSO
INCREMENTA 1
VERDADERO
num
VERDADERO
res == 0
FALSO
pares = pares + 1
VERDADERO
num==0
FALSO
ceros = ceros + 1
VERDADERO
num>0
Clase PrgNumeros
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
if ( num % 2 == 0 ) {
pares ++ ;
}
if ( num == 0 ) {
ceros ++ ;
}
if ( num < 0 ) {
negativos ++ ;
}
}
Problema 092
Enunciado: Ingresar “n” números, luego determinar y mostrar los números pares y la cantidad total
de números impares ingresados. Utilice la estructura de repetición DESDE, para resolver el ejercicio.
ENTRADA: n , num
SALIDA: pares , numImpares
INICIO
LEER n
DESDE i = 0 HASTA n - 1
LEER num
SI ( num RESTO 2 == 0 ) ENTONCES
pares = pares + num + “ ”
SINO
numImpares = numImpares + 1
FINSI
FINDESDE
ESCRIBIR pares
ESCRIBIR numImpares
FIN
Clase PrgNumerosN
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumerosN {
if ( num % 2 == 0 ) {
pares += num + “ ” ;
} else {
numImpares ++ ;
}
Clase PrgNumerosN
#include <iostream>
#include <string>
using std::cout ;
using std::cin ;
using std::string ;
using std::endl ;
int main ( ) {
if ( num % 2 == 0 ) {
cout << “ \nNúmeros ” << num << “ es par.” ;
} else {
numImpares++ ;
}
Problema 093
Enunciado: Ingresar las tres notas de todos los alumnos de un salón de clase y calcular el promedio
general. Utilice la estructura de repetición PARA, en la solución del problema.
Defina el nombre del proyecto, luego desarrolle la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
i=0
FALSO
i<n
VERDADERO
VE
n1 , n2 , n3
prom = ( n1 + n2 + n3 ) / 3
sumaProm = sumaProm + prom
i=i+1
promGen = sumaProm / n
promGen
FIN
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 405
Clase PrgPromedioG
#include <iostream>
using std::cout ;
using std::cin ;
int main ( ) {
int n ;
double n1, n2, n3 ;
double prom , sumaProm = 0 , promGen ;
prom = ( n1 + n2 + n3 ) / 3 ;
sumaProm += prom ;
}
promGen = sumaProm / n ;
cout << “ \n \t El promedio general es : ” << promGen ;
cout << “ \n \n ” ;
system ( “PAUSE” ) ;
return 0 ;
}
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgPromedioG {
public static void main ( String arg [ ] ) {
int n ;
double n1 , n2, n3 ;
double prom , sumaProm = 0 , promGen ;
prom = ( n1 + n2 + n3 ) / 3 ;
sumaProm += prom ;
}
promGen = sumaProm / n ;
System.out.println ( “ \n \t El promedio general es: ” + promGen ) ;
}
}
Problema 094
Enunciado: Ingresar el precio de compra y el precio de venta de todos los artículos de una bodega.
Calcular y mostrar la utilidad de cada uno de los artículos. Utilice la estructura de repetición DESDE,
para la solución del problema.
Clase PrgUƟlidad
#include <iostream>
using std::cout ;
using std::cin ;
int main ( ) {
double precioCompra , precioVenta , utilidad ;
int numArticulos ;
cout << “ \t La utilidad del producto es: ” << utilidad << “\n” ;
Clase PrgUƟlidad
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgUtilidad {
}
}
408 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 095
Etapa 01 - Descripción del problema
Enunciado: Ingresar los nombres de todos los socios de un club y mostrar los nombres, de tal forma
que la primera letra esté en mayúscula y el resto en minúscula. Utilice la estructura de repetición
PARA.
Clase PrgSocios
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgSocios {
primera = nombre.substring ( 0 , 1 ) ;
primera = primera.toUpperCase ( ) ;
resto = nombre.substring ( 1 ) ;
resto = resto.toLowerCase ( ) ;
nombre = primera + resto ;
}
System.out.println ( “ \n\t Los socios son: \n\t ” + lista ) ;
}
}
IMPORTANTE
Ahora, se recomienda solucionar los problemas propuestos del 31
al 50, que están planteados al final del presente capítulo.
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 409
PUNTO A PARTE
Para explicar cómo se crea y utiliza un JAR nos basaremos en la solución desarrollada para el problema
057, el cual se denominaba ProyNotaFinal2 y tenía los paquetes dominioDeLaAplicacion y biblioteca,
los cuales se muestran a continuación.
En la plataforma MS-Windows
los paquetes se visualizan como
carpetas y las clases Java como
archivos.
Paso 1:
En la carpeta del proyecto creado (donde
están ubicadas las carpetas biblioteca y
dominioDeLaAplicacion) crearemos un
archivo de texto denominado manifiesto.
txt, en el cual colocaremos la siguiente
información:
Este archivo constituye nuestro archivo de manifiesto, el cual contiene una cabecera de propósito
especial denominada Main–Class. Esta cabecera permite indicar la clase que iniciará la ejecución
de la aplicación cuando se ejecute el archivo JAR. Es decir, indica la clase que contiene el método
main (en nuestro caso la clase PrgNotaFinal2.class ubicada en la carpeta dominioDeLaAplicacion).
Finalizada la creación del archivo manifiesto.txt tenemos:
410 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Paso 2:
Creamos un archivo por lotes denominado CrearJar.bat, en el cual colocaremos la siguiente información:
La aplicación JAR permite realizar tareas básicas con archivos de tipo JAR. Esta aplicación es parte del
JDK. Observe que se han incluido las siguientes opciones:
Como se ha incluido la opción m, lo siguiente que se deberá colocar es el nombre del archivo de
manifiesto existente, el cual se creó en el paso 1 con el nombre de manifiesto.txt; después, se coloca
el nombre que se desea tenga el archivo JAR, en nuestro caso PrgNotaFinal2.jar. Finalmente, se
colocan los nombres de los archivos o carpetas que se desean empaquetar en el JAR (observe que
se ha incluido las carpetas dominioDeLaAplicacion y biblioteca). Finalizada la creación del archivo
CrearJar.bat tenemos:
Paso 3:
Ejecutamos el archivo por lotes denominado CrearJar.bat (recuerde que para ejecutar el archivo
bastará con hacer doble clic con el botón izquierdo del mouse de la computadora sobre el nombre del
archivo). Al momento de ejecutar el archivo CrearJar.bat se puede observar una ventana en la cual se
muestra todo lo que sucede durante la creación del JAR denominado PrgNotaFinal2.jar (opción v).
Finalizada la ejecución, tenemos:
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 411
Resulta importante indicar que, cuando se crea un JAR, automáticamente se crea un archivo de
manifiesto denominado MANIFEST.MF, el cual se ubica en la carpeta META-INF (con la opción M se
deshabilita). El manifiesto por defecto tiene el siguiente contenido (o similar):
Manifest-Version: 1.0
Created-By: 1.5.0_06 (Sun Microsystems Inc.)
Como se puede observar, las entradas de un archivo de manifiesto tienen la forma "cabecera:valor" (el
nombre de una cabecera está separado de su valor por dos puntos).
Si al momento de crear el JAR se indica que se utilice adicionalmente información de manifiesto desde
un archivo de manifiesto existente (opción m), dicha información será añadida al archivo MANIFEST.
MF. En nuestro ejemplo, la información contenida en el archivo manifiesto.txt creado en el paso 1 se
añade en el archivo MANIFEST.MF (el archivo de manifiesto MANIFEST.MF se empaqueta en el JAR
junto con los demás archivos y/o carpetas). El archivo de manifiesto MANIFEST.MF resultante tendría
el siguiente contenido:
Manifest-Version: 1.0
Created-By: 1.5.0_06 (Sun Microsystems Inc.)
Main-Class: dominioDeLaAplicacion/PrgNotaFinal2
Paso 4:
Finalizada la creación del JAR, procedemos a ejecutarlo (recuerde que para ejecutar el archivo
bastará con hacer doble clic con el botón izquierdo del mouse de la computadora sobre el nombre
del archivo). Al momento de ejecutar el archivo PrgNotaFinal2.jar se observa la ejecución de nuestra
aplicación PrgNotaFinal2.class:
412 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Como puede observar, se ejecuta la aplicación sin necesidad de utilizar directamente el JDK (aunque
debe estar instalada la Java Virtual Machine o JVM), o sin necesidad de un IDE (como Eclipse o
JCreator). Recuerde que el archivo JAR ahora contiene todos los paquetes y clases que su aplicación
necesita para ejecutarse, y un archivo de manifiesto denominado MANIFEST.MF.
Se utiliza la aplicación Java del JDK con la opción –jar para ejecutar el archivo PrgNotaFinal2.jar.
Si su JAR contiene una miniaplicación o Applet de Java, deberá crear un archivo HTML y utilizar los
siguientes TAGS:
< applet
code = NombreApplet.class
archive = "NombreJar.jar"
width = 350
height= 500 >
Es posible visualizar el contenido de un JAR. Como ejemplo, crearemos el archivo por lotes
denominado VerJar.bat, tal y como se muestra a continuación
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 413
Se utiliza la aplicación JAR del JDK con las opción ƞ para visualizar el archivo PrgNotaFinal2.jar.
v : Permite obtener información adicional sobre los archivos empaquetados en el JAR, información
como el tamaño de los archivos y la última fecha de modifcación.
Paso 1:
Creamos un archivo por lotes
denominado ExtraerJar.bat en el cual
colocaremos la siguiente información:
La aplicación JAR permite realizar tareas básicas con archivos de tipo JAR. Esta aplicación es parte del
JDK. Observe que se han incluido las siguientes opciones:
Cuando se extrae el contenido de un JAR, la aplicación JAR del JDK copia las carpetas y archivos
deseados y los escribe en el directorio actual, reproduciendo la estructura de directorios. El archivo
JAR original no se modifica. (Cuando se extraen carpetas y archivos, la herramienta JAR sobreescribe
cualquier carpeta o archivo que tenga el mismo nombre y ruta que las carpetas y archivos extraídos).
Paso 2:
Ejecutamos el archivo por lotes denominado ExtraerJar.bat (recuerde que para ejecutar el archivo
bastará con hacer doble clic con el botón izquierdo del mouse sobre el nombre del archivo). Finalizada
la ejecución, tenemos:
Observe que se han creado las carpetas biblioteca y dominioDeLaAplicacion, las cuales contienen a
su vez los archivos LE.class y PrgNotaFinal2.class respectivamente. Adicionalmente, se ha creado la
carpeta META-INF, que contiene el archivo de manifiesto MANIFEST.MF.
Finalmente, es importante indicar que en la actualidad existen características más avanzadas ofrecidas
por los archivos JAR (incluyendo la firma electrónica, el control de versiones y el sellado de paquetes). Esto se
ha hecho posibles gracias a los archivos de manifiesto.
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 415
Es común que por error o descuido eliminemos información importante sobre nuestras aplicaciones.
En algunas ocasiones eliminamos las carpetas y archivos relacionados con esta, y solo contamos con el
archivo JAR creado; en otras, solo tenemos los archivos class, generados en la Etapa de Compilación,
pero no el archivo fuente (.java) a través del cual se generó el archivo class. En este contexto, resulta
importante tener herramientas que permitan descompilar los archivos class, con la finalidad de
recuperar los archivos fuente desarrollados en la Etapa de Edición.
Es importante tener presente que la descompilación de clases puede constituir una violación del
acuerdo de licencia. Antes de utilizar herramientas de descompilación deberá consultar el acuerdo
de licencia de las clases. Recuerde que alrededor del mundo, el software es protegido por leyes de
derechos de autor (Copyrights).
La aplicación javap del JDK permite descompilar un archivo class, y muestra una versión
medianamente comprensible de dicha clase.
Paso 2:
Ejecutamos el archivo por lotes denominado DeCompilar.bat, y se visualizará una versión general del
archivo fuente de dicha clase.
En la actualidad, existen diversos soŌwares que permiten descompilar un archivo class de Java. Algunos
ejemplos de descompiladores (decompilers) son:
- JCavaJ
- Jshrink
- DJ Java Decompiler
- FrontEnd Plus
A. JCavaJ: Pequeña y sencilla utilidad que permite generar el archivo fuente (.java) a partir de un
archivo class de Java, y lo reconstruye completamente. Esta utilidad es gratuita y puede bajarla de
Internet sin ningún inconveniente. Es importante mencionar que para que esta utilidad funcione
correctamente deberá tener instalado el JRE 1.4 o superior.
B. Jshrink: Esta utilidad es sencilla y puede adquirirla a través de Internet. Además de descompilar
archivos, genera archivos ejecutables (exe) y permite “camuflar” el código para dificultar su lectura
o que el archivo pueda ser descompilado.
}|Las herramientas que permiten “camuflar” el código también son conocidas como ofuscadores,
y se utilizan conjuntamente con los derechos de autor y patentes, como parte de una estrategia
de “Protección de Ideas”.
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 417
C. DJ Java Decompiler: Es un descompilador para Java, que permite reconstruir el código original
o archivo fuente a partir de un archivo class de Java. Este software es capaz de descompilar las
aplicaciones Java más complejas, para luego producir un preciso código. También es un completo
editor de Java que usa un sistema gráfico con syntax-coloring. DJ Java Decompiler es una aplicación
"autosuficiente", por lo que no será necesario tener instalado Java, Java Virtual Machine, ni
ninguna otra SDK de Java. Puede obtener copias de prueba del software en Internet.
En la actualidad, algunos sitios WEB le ofrecen el software libre de virus por un incremento
adicional de su precio normal. Solo recuerde que dicho pago es por la seguridad del sitio y no por
el software. Una vez que obtenga el software, deberá instalarlo en su PC (para este ejemplo se
utilizará la versión 3.9).
Observe la ventana principal del DJ Java Decompiler. En el panel principal se muestra el archivo
PrgNotaFinal2.class descompilado. En el panel inferior se muestran todos los métodos que tiene
la clase descompilada; al efectuar la descompilación, podrá guardar el archivo fuente ( .java)
generado.
Puede utilizar cualquier buscador de Internet para ampliar sus conocimientos sobre estos y otros
softwares; solo tendrá que colocar el nombre del software y podrá observar varios links que le
permitirán inclusive bajar el software a su PC.
418 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
ENUNCIADO
DEL
PROBLEMA
MODELAMIENTO CODIFICACION
}|Determinar la }|Determinar el }|Codificar el diseño
información nombre del proyecto. de la solución del
deseada (salida). }|Definir los paquetes problema. Utilizar
}|Determinar los y desarrollar el lenguaje de
datos de entrada el diagrama de programación Java.
(entrada). paquetes respectivo. UƟlice la clase
}|Establecer cómo Establecer la reuƟlizable LE.
se solucionará dependencia. Utilice
el problema UML.
(proceso). }|Definir las clases
que serán parte
de la solución del
problema. Utilice
UML.
ALGORITMO
}|Diseñar el algoritmo
para el método
principal. UƟlizar
diagrama de
acƟvidades.
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 419
Problema 096
Enunciado: Ingresar un número entero. Calcular y mostrar el número factorial del número ingresado.
Adicionalmente, mostrar el proceso de cálculo del número factorial del número ingresado.
Desarrolle el algoritmo y la codificación en el lenguaje de programación Java. Finalmente, utilice la
clase LE para ingresar datos y mostrar información.
INICIO
mensaje = “ ”,
i=1
LEER num
FALSO
I < num
VERDADERO
LEER num
LEER num
LEER num
FIN
420 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgFactorial
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgFactorial {
public static void main ( String arg [ ] ) {
String mensaje = “” ;
long numero, factorial = 1 ;
}
}
Resultado:
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 421
En las siguientes soluciones podrá apreciar los diferentes usos del método mostrarInformacion (
). Observe que en todo momento deberá colocar dentro de los paréntesis del método los cinco
parámetros definidos.
422 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 097
Enunciado: Ingresar dos números y mostrar todos los múltiplos de 5 comprendidos entre dichos
números. Considerar que el primer número ingresado puede ser mayor que el segundo número, y
que ambos números pueden ser iguales. Desarrolle la codificación en el lenguaje de programación
Java. Utilice la clase LE para ingresar datos y mostrar información.
Clase PrgMulƟplos
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgMultiplos {
public static void main ( String arg [ ] ) {
if ( numMay == numMen ) {
} else {
System.exit ( 0 ) ;
}
}
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 423
Resultado:
Problema 098
Enunciado: Desarrollar una solución que muestre un menú de opciones y permita obtener la
siguiente información en un salón de clase:
Clase PrgCurso
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgCurso {
public static void main ( String arg [ ] ) {
do {
switch ( opc ) {
case 1 :
if ( sexo == 0 ) {
hombres++ ;
if ( edad > 21 ) {
homMayores++ ;
}
}
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 425
if ( sexo == 1 ) {
mujeres++ ;
if ( edad < 16 ) {
mujMenores++ ;
}
}
break ;
case 2 :
break ;
case 3 :
default :
} while ( opc != 3 ) ;
System.exit ( 0 ) ;
}
}
Resultado:
426 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 099
Enunciado: Desarrollar una solución que permita ingresar la clave o palabra secreta de una persona
y muestre las vocales de dicha clave o palabra secreta. Considerar que al momento de ingresar la
clave o palabra secreta, esta no se deberá visualizar.
Clase PrgClave
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgClave {
public static void main ( String arg [ ] ) {
if ( clave.length ( ) != 0 ) {
System.exit ( 0 ) ;
}
}
Resultado:
El método leerClave( ) de la clase LE, permite mostrar un cuadro de diálogo con un título en la
ventana y un mensaje interno. Observe que cuando el usuario ingresa la clave, esta no se visualiza
y en su lugar aparecen asteriscos. Observe la línea de código Java, que permite mostrar el cuadro
anterior.
El primer parámetro del método leerClave ( ) de la clase LE está referido al título de la ventana,
mientras que el segundo parámetro está referido al mensaje que se muestra junto a la caja de texto
al interior de la ventana. Otro detalle importante a destacar es que los nombres de los botones han
sido personalizados.
428 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 100
Enunciado: Desarrollar una solución que permita ingresar la clave o palabra secreta de una persona,
y que muestre las vocales de dicha clave. Considerar que al momento de ingresar la clave, esta no
se deberá visualizar.
Clase PrgPrimo
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgPrimo {
public static void main ( String arg [ ] ) {
do {
num = LE.leerInt ( mensaje ) ;
if ( num < 1) {
mensaje = “Error... Ingrese un número mayor que 0 ” ;
}
if ( sw ) {
LE.mostrarInformacion ( “El número ” + num + “ es primo ” ) ;
} else {
LE.mostrarInformacion ( “El número ” + num + “ no es primo ” ) ;
}
System.exit ( 0 ) ;
}
}
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 429
Resultado:
IMPORTANTE
Ahora, se recomienda solucionar todos los problemas propuestos
planteados al final del presente capítulo, uƟlizando la clase
reuƟlizable LE.
430 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
PROBLEMAS PROPUESTOS
En la solución de este problema deberá evitar que el usuario seleccione la opción 2 sin antes
haber seleccionado la opción 1.
En la solución de este problema deberá primero visualizar solo la opción 1 y 5. Una vez ingresadas
las notas, deberá visualizar todas las opciones.
8. Desarrollar una solución que permita mostrar los 125 primeros números enteros existentes. No
deberá ingresar datos. Utilice la estructura de repetición HACER.
9. Desarrollar una solución que permita mostrar los números múltiplos de 6 comprendidos entre los
números 10 y 1230. No deberá ingresar datos. Utilice la estructura de repetición HACER.
10. Mostrar los números pares y la cantidad de números múltiplos de 5 comprendidos entre dos
números ingresados por teclado. Utilice la estructura de repetición HACER.
11. Mostrar la cantidad de números pares y los números múltiplos de 10 comprendidos entre dos
números ingresados por teclado. Utilice la estructura de repetición HACER.
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 431
12. Calcular y mostrar la nota final que obtuvieron todos los alumnos de un salón de clase. El cálculo
de la nota final se realiza en base a 3 notas utilizando la siguiente fórmula:
nf = ( n1 + n2 + n3 ) / 3.
Ingrese las 3 notas a través del teclado. No ingrese el total de alumnos. Utilice la estructura de
repetición HACER.
13. Calcular y mostrar la nota final que obtuvieron todos los alumnos de un salón de clase. El cálculo
de la nota final se realiza en base a 3 notas utilizando la siguiente fórmula:
nf = ( ( n1 * 2 ) + n2 + ( n3 * 2 ) ) / 5.
Ingrese las 3 notas a través del teclado. No ingrese el total de alumnos. Utilice la estructura de
repetición HACER.
14. Determinar el promedio de sueldos de los obreros (categoría 1), la suma de sueldos de los
empleados (categoría 2), y el mayor sueldo de los gerentes (categoría 3) de una determinada
empresa. No deberá ingresar el total de trabajadores. Utilice la estructura de repetición HACER.
15. Calcular y mostrar el número de alumnos que tienen promedio final menor a 6, de 6 a 10, de 11 a
14, de 15 a 17, y los alumnos que tienen promedio final mayor a 17. Ingresar las cuatro notas de
cada alumno y calcular su promedio en base a la siguiente fórmula:
nf = ( n1 + n2 + n3 + n4 + nMayor - nMenor ) / 4.
Es decir, se anula la nota más baja y se duplica la nota mayor. Utilice la estructura de repetición
HACER.
23. Ingresar un número. Calcular y mostrar el número de cifras pares que tiene dicho número. Utilice
la estructura de repetición MIENTRAS.
24. Ingresar un número. Calcular y mostrar la suma de todas las cifras menores que 5. Utilice la
estructura de repetición MIENTRAS.
25. Ingrese dos números. Calcular y mostrar la suma de todas las cifras impares de ambos números.
Utilice la estructura de repetición MIENTRAS.
26. Calcular y mostrar el porcentaje de alumnos aprobados y el porcentaje de alumnos desaprobados
de un salón de clase. El cálculo de la nota final se realiza en base a tres notas, utilizando la siguiente
fórmula:
nf = ( ( n1 * 2 ) + n2 + ( n3 * 2 ) ) / 5.
Ingrese las tres notas a través del teclado. No ingrese el total de alumnos. Utilice la estructura de
repetición MIENTRAS.
27. Determinar la suma de sueldos de los obreros (categoria 1), el menor sueldos de los empleados
(categoria 2) y el sueldo promedio de los gerentes (categoria 3) de una determinada empresa. No
deberá ingresar el total de trabajadores. Utilice la estructura de repetición MIENTRAS.
28. Desarrollar una solucion que permita obtener la siguiente información de los empleados de una
empresa. Utilice la Estructura de repetición MIENTRAS:
}|¿Cuántas empleadas y cuántos empleados son nombrados?
}|¿Cuántas empleadas y cuántos empleados son contratados?
}|¿Cuántas empleadas son menores de edad y cuántos empleados son mayores de edad?
29. Ingresar un número entero. Calcular y mostrar el factorial del número ingresado. Utilice la
estructura de repetición MIENTRAS.
30. Desarrolle una solución que permita generar 100 números aleatorios de dos cifras, y determine la
cantidad de números aleatorios generados cuyo último dígito es un número 6.
31. Ingresar un número. Calcular y mostrar los números múltiplos del número 4 y del número 6
menores al número ingresado. Utilice la estructura de repetición DESDE o PARA.
32. Desarrollar una solución que permita ingresar el número de términos que tiene una serie y
muestre sus términos, en base a lo siguiente. Utilice la estructura de repetición DESDE o PARA.
2, 5, 8, 11, 15,…
33. Desarrolle un programa que muestre los términos de la serie mostrada. Deberá ingresar el número
de términos que se desea mostrar y deberá tener en cuenta que a partir del tercer término, cada
término es igual a la suma de los dos términos anteriores. Utilice la estructura de repetición
DESDE o PARA.
1, 2, 3, 5, 8, 13,…
34. Desarrolle un programa que muestre los términos de la serie mostrada. Deberá ingresar el número
de términos que se desea mostrar. Utilice la estructura de repetición DESDE o PARA.
1, 1/2, 1/4, 1/6, 1/8, 1/10,…
CAP. 4: ESTRUCTURAS LÓGICAS DE CONTROL O REPETICIÓN 433
35. Ingresar 80 números. Determinar y mostrar la suma de números positivos, la cantidad de ceros
y la suma de números negativos ingresados. Utilice la estructura de repetición DESDE o PARA.
36. Ingresar tres números. Determinar y mostrar los números pares que están comprendidos entre
los dos menores números ingresados y los números impares comprendidos entre los dos mayores
números ingresados. Utilice la estructura de repetición DESDE o PARA.
37. Ingresar las tres notas de todos los alumnos de un salón de clase y calcular el promedio de cada
uno de los alumnos, el promedio general, la mayor nota y la menor nota. Utilice la estructura de
repetición DESDE o PARA.
38. Ingresar las cuatro notas de todos los alumnos de un salón de clase y calcular el promedio de
cada uno de los alumnos, el porcentaje de aprobados y el porcentaje de desaprobados. Para el
cálculo del promedio, considerar que se deberá eliminar la menor nota. Utilice la estructura de
repetición DESDE o PARA.
39. Ingresar el nombre de una persona. Determinar y mostrar el número de vocales que tiene el
nombre, la cantidad de letras “a” y la cantidad de letras “p”. Utilice la estructura de repetición
DESDE o PARA.
40. Ingresar el nombre y el apellido de todos los socios de un club. Mostrar los nombres y apellidos
de tal forma que la primera letra este en mayúscula y el resto en minúscula. Utilice la estructura
de repetición DESDE o PARA.
41. Desarrollar una solución que permita ingresar la edad y el sexo de todas las personas que viven
en un distrito, y determine lo siguiente:
}|La suma de todas las edades de las mujeres.
}|El promedio de las edades de los hombres.
}|El número de personas mayores de edad.
Utilice la estructura de repetición DESDE o PARA.
42. Desarrollar una solución que permita ingresar el nombre y la edad de todas las personas que
viven en un distrito, y determine lo siguiente:
}|La cantidad de edades múltiplo de 5.
}|La edad mayor.
}|El nombre de la persona o las personas que tiene la menor edad.
Utilice la estructura de repetición DESDE o PARA.
43. Desarrollar una solución que permita ingresar el nombre y el sueldo de todas los empleados de
una empresa, y determine lo siguiente:
}|La cantidad de nombres que comienzan con las letras “a” o “A”.
}|El nombre de la persona o las personas que tiene el sueldo promedio.
Utilice la estructura de repetición DESDE o PARA.
44. Desarrollar una solución que permita ingresar un número. Determinar y mostrar el dígito mayor
del número ingresado. Utilice la estructura de repetición DESDE o PARA.
45. Desarrollar una solución que permita ingresar un número. Determinar y mostrar el número de
veces que se repite el menor dígito del número ingresado. Utilice la estructura de repetición
DESDE o PARA.
434 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
46. Desarrollar una solución que permita ingresar un número. Determinar y mostrar el menor número
que se puede formar con sus dígitos. Utilice la estructura de repetición DESDE.
47. Desarrollar una solución que permita ingresar un número. Determinar y mostrar el número con el
primer dígito y el último dígito intercambiado. Utilice la estructura de repetición DESDE o PARA.
48. Desarrollar una solución que permita ingresar una palabra. Determinar si la palabra ingresada
es un palíndromo o no (Nota: Palíndromo es una palabra o frase que se lee igual de izquierda a
derecha y viceversa). Utilice la estructura de Repetición DESDE o PARA.
49. Desarrollar una solución que permita ingresar una palabra. Determinar y mostrar qué vocales
existen y cuántas veces se repiten. Utilice la estructura de repetición DESDE o PARA.
50. Desarrollar una solución que permita ingresar el nombre completo de una persona (ingresar los
nombres y apellidos en una sola variable). Mostrar cada nombre y cada apellido de la persona, la
primera letra en mayúscula y las demás letras en minúsculas. Utilice la estructura de repetición
DESDE o PARA.
Cap.
E st r u c t u r a s l ó g i c a s
combinadas
5
CAP. 5: Estructuras lógicas combinadas 437
El presente capítulo es un complemento de los capítulos 2, 3 y 4, y trata sobre el uso de las estructuras
lógicas en forma combinada y el manejo de excepciones en el lenguaje de programación Java.
Con las estructuras lógicas se desarrollan algoritmos, que pueden ser diseñados en pseudocódigo o
diagramas de flujo, y después codificados en un lenguaje de programación.
En este capítulo se emplearán las técnicas para el ingreso de datos y visualización de la información
utilizando la consola (solo caracteres), y las que emplean cuadros de diálogo.
Para iniciar el estudio del quinto capítulo es indispensable el dominio de las estructuras lógicas de
secuencia, estructuras lógicas de decisión y estructuras lógicas de repetición tratadas en los capítulos
anteriores.
Es importante mencionar que la capacidad de poder utilizar las estructuras lógicas en forma combinada,
diferencia la eficiencia de los programadores.
ENUNCIADO
DEL
PROBLEMA
Etapa 03
Diseño
Solución
Etapa 04
MODELAMIENTO
Desarrollo
ALGORITMO solución
CODIFICACIÓN
438 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
En el desarrollo de las primeras veintidós soluciones se puede apreciar el uso de las diferentes
estructuras lógicas, cómo se diseñan los algoritmos utilizando el pseudocódigo o el diagrama de flujo,
y cómo se codifican en el lenguaje de programación C++ o Java. Esto permite mejorar su comprensión
en el uso de las estructuras lógicas.
En las diecinueve soluciones posteriores, se aprecia el uso de las diferentes estructuras lógicas y cómo
se codifican en el lenguaje de programación Java. Esto permite mejorar el desarrollo de su capacidad
lógica.
Finalmente, para desarrollar las últimas cinco soluciones se utiliza el lenguaje de programación
Java, para codificar la solución utilizando la clase reutilizable LE. En esta parte se utilizan métodos
complementarios de la clase LE, que permiten plantear soluciones más vistosas y amigables para el
usuario, utilizando cuadros de diálogo.
MODELAMIENTO
PROYECTO
CODIFICACIÓN
dominioDeLaAplicación biblioteca
Nombre
Clase
Atributos
SE DESARROLLAN UTILIZANDO:
- Estructuras lógicas de secuencia
- Estructuras lógicas de decisión
- Estructuras lógicas de repetición
ALMACENADOS EN:
- Estructuras de datos (variable)
Contadores
Acumuladores
Centinelas
CAP. 5: Estructuras lógicas combinadas 439
El desarrollador de soluciones debe tener la habilidad y la capacidad para identificar qué estructuras
lógicas debe utilizar para abordar la solución de un determinado problema. No existe una solución
única, pero es importante utilizar las estructuras lógicas en forma correcta para asegurar una adecuada
solución al problema y su posterior facilidad en el mantenimiento.
A continuación, se presentan algunas soluciones que permiten ilustrar el uso combinado de las
estructuras lógicas.
Por motivo de espacio y porque la Etapa 02 (Definición de la solución) es recurrente en todos los
problemas que se han realizado, no se desarrollará en las siguientes soluciones, ni se ha considerado
hacerlo en la parte de Modelamiento de la Etapa 03 (Diseño de la solución) por las mencionadas
razones. Sin embargo, es importante realizar las mencionadas etapas para asegurar una correcta y
eficiente definición de la solución.
Problema 101
Enunciado: Desarrollar una solución que permita ingresar varios números. Determinar y mostrar
los números ingresados que son números primos. Finalmente, constatar el ingreso de los datos.
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
En pseudocódigo:
INICIO
SI ( sw ) ENTONCES
lista = lista + primo + SALTOLINEA
FINSI
sw = VERDADERO
FINDESDE
ESCRIBIR “Los números primos son: ” + lista
FIN
Observe que para diseñar el pseudocódigo se han utilizado estructuras lógicas en forma combinada;
estructuras lógicas de secuencia, una estructura lógica de repetición HACER y una estructura
lógica de repetición DESDE. Dentro de la estructura lógica de repetición DESDE se ha incluido una
estructura lógica de repetición HACER, una estructura lógica de repetición DESDE y una estructura
lógica de decisión SIMPLE; es decir, existen estructuras lógicas combinadas y anidadas, una en
relación con las otras, en la solución.
Esto significa que al diseñar el algoritmo en el diagrama de flujo, se deberá tener en cuenta que
dentro de una de las estructuras lógicas de repetición DESDE, se debe hacer el diagrama de las otras
tres estructuras lógicas.
Clase PrgNumerosPrimos
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumerosPrimos {
public static void main ( String arg [ ] ) {
int cantNum , primo ;
String lista = “\n\n” ;
boolean sw = true ;
do {
System.out.println ( “Cuántos números va a ingresar ” ) ;
cantNum = Lectura.leerInt ( ) ;
if ( cantNum <= 0 )
System.out.println ( “Número ingresado no válido…” ) ;
Problema 102
Enunciado: Ingresar 10 números a través del teclado y determinar la suma de todos los números
pares y la suma de todos los números impares. Constatar el ingreso de los datos.
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
FALSO
DESDE i = 1 HASTA 10
INCREMENTA i en 1
VERDADERO
Cálculo de la
suma de números
pares e impares
sumPar , sumImp
FIN
CAP. 5: Estructuras lógicas combinadas 443
Cálculo de la
suma de números
pares e impares.
num
VERDADERO
num <= 0
FALSO “error”
num <= 0
VERDADERO FALSO
FALSO VERDADERO
res==0
Clase PrgSocios
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
do {
cout << “Ingrese un número: ” << endl ;
cin >> num ;
if (num <= 0 ) {
cout << “Número ingresado no válido ” << endl ;
}
if ( num % 2 == 0 ) {
sumPar = sumPar + num ;
} else {
sumImp = sumImp + num ;
}
return 0 ;
}
Problema 103
Enunciado: Ingresar las tres notas de todos los alumnos de un salón de clase. Calcular y mostrar el
promedio de notas de cada alumno. Adicionalmente, si el alumno obtiene un promedio final mayor
a 16, se deberá visualizar un mensaje de felicitaciones. Constatar el ingreso de las notas.
INICIO
ENTERO numAlu , i
REAL nota1 , nota2 , nota3 , promedio
LEER numAlu
HACER
FINDESDE
FIN
Clase PrgPromedio
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
if ( promedio > 16 ) {
cout << “Felicitaciones ” ;
}
cout << endl ;
}
return 0 ;
}
También puede mejorar la solución. Para ello, consistencie el ingreso del valor de la variable numAlu (utilice
la estructura lógica HACER), y cambie la forma de consistenciar el ingreso de las notas, de tal forma que cada
una de las notas se consistencie en forma independiente (incluya un mensaje si la nota que se ingresa no es
válida).
CAP. 5: Estructuras lógicas combinadas 447
Problema 104
Enunciado: Calcular y mostrar el sueldo de todos los trabajadores de una empresa conociendo el
número de horas trabajadas y su tarifa horaria, sabiendo que se debe descontar 20 % por concepto
de impuestos si este es mayor a S/. 1600 nuevos soles. Consistenciar el ingreso de los datos.
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
INCREMENTA i en 1
VERDADERO
FIN
448 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
horas
horas < 1
VERDADERO
FALSO
tarifa
tarifa < 1
VERDADERO FALSO
VERDADERO
sueldo > 1600
Sueldo
Clase PrgSueldo
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
do {
cout << “Ingrese las horas del trabajador:” <<( i + 1 ) ;
cin >> horas ;
} while ( horas < 1 ) ;
do {
cout << “Ingrese la tarifa del trabajador:” <<( i + 1 ) ;
cin >> tarifa ;
} while ( tarifa < 1 ) ;
}
return 0 ;
}
450 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgSueldo
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgSueldo {
do {
System.out.println ( “Horas del trabajador ” + ( i + 1 ) ) ;
horas = Lectura.leerInt ( ) ;
} while ( horas < 1 ) ;
do {
System.out.println ( “Tarifa del trabajador ” + ( i + 1 ) ) ;
tarifa = Lectura.leerDouble ( ) ;
} while ( tarifa < 1 ) ;
}
}
}
CAP. 5: Estructuras lógicas combinadas 451
Problema 105
Enunciado: Ingrese la categoría y el sueldo de todos los trabajadores de una empresa. Calcular el
aumento correspondiente, teniendo en cuenta los datos de la tabla. Mostrar el nuevo sueldo de
cada uno de los trabajadores. Finalmente, constatar el ingreso de los datos.
Categoría Aumento
1 25%
2 15%
3 10%
4 05%
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
HACER
LEER numTrab
HACER
LEER categoria
MIENTRAS ( categoria < 1 OR categoria > 4 )
HACER
LEER sueldo
MIENTRAS ( sueldo <= 0 )
452 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
FINDESDE
FIN
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
do {
cout << “Ingrese la cantidad de trabajadores: ” << endl ;
cin >> numTrab ;
if ( numTrab <= 0 ) {
cout << “Número de trabajadores no válido… ” << endl ;
}
} while ( numTrab <= 0 ) ;
do {
cout << “Categoría del trabajador ” << ( i + 1 ) << endl ;
cin >> categoria ;
} while ( categoria < 1 || categoria > 4 ) ;
do {
switch ( categoria ) {
case 1 :
sueldo = sueldo * 1.25 ;
break ;
case 2 :
sueldo = sueldo * 1.15 ;
break ;
case 3 :
sueldo = sueldo * 1.10 ;
break ;
case 4 :
sueldo = sueldo * 1.05 ;
}
cout << “El nuevo sueldo es: ” << sueldo << endl ;
}
return 0 ;
}
Clase PrgSueldoCategoria
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgSueldoCategoria {
do {
if ( numTrab <= 0 ) {
System.out.println ( “Número de trabajadores no válido” ) ;
}
do {
do {
454 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
switch ( categoria ) {
case 1 :
sueldo = sueldo * 1.25 ;
break ;
case 2 :
sueldo = sueldo * 1.15 ;
break ;
case 3 :
sueldo = sueldo * 1.10 ;
break ;
case 4 :
sueldo = sueldo * 1.05 ;
}
}
}
}
CAP. 5: Estructuras lógicas combinadas 455
Problema 106
Enunciado: Calcular y mostrar el costo que representa un paciente y el costo total que representan
todos los pacientes para un hospital de la gran ciudad, según los datos de la tabla. Adicionalmente,
considerar que los pacientes menores de edad que tienen la enfermedad tipo 1, tienen un descuento
del 20 %, y los pacientes mayores de 54 años tienen un incremento del 12 %. Consistenciar el
ingreso de los datos.
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
numP
numP < 1
VERDADERO FALSO
A
456 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
FALSO
DESDE i = 0 HASTA numP -1
INCREMENTA i en 1
VERDADERO
Ingreso de
datos del
paciente
Cálculo del
costo por
paciente
costo
costoTotal
FIN
Diseñe la parte del algoritmo relacionado con el ingreso de datos del paciente y el cálculo del costo por
paciente. Observe que en este último, deberá utilizar una estructura lógica de decisión múltiple.
CAP. 5: Estructuras lógicas combinadas 457
Clase PrgPaciente
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
do {
cout << “ Ingrese el número de pacientes: ” << endl ;
cin >> numP ;
} while ( numP < 1 ) ;
do {
cout << “Edad del paciente ” << endl ;
cin >> edad ;
} while ( edad <= 0 ) ;
do {
cout << “Días de internamiento ” << endl ;
cin >> dias ;
} while ( dias <= 0 ) ;
switch ( tipo ) {
case 1 :
costo = 200 * dias ;
if ( edad < 18 ) {
costo = costo * 0.8 ;
}
break ;
case 2 :
costo = 350 * dias * ;
break ;
case 3 :
costo = 420 * dias * ;
}
cout << “El costo del paciente es: ” << costo << endl ;
costoTotal += costo ;
}
cout << “El costo total para el hospital es: ” << costoTotal ;
return 0 ;
}
458 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgPaciente
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgPaciente {
public static void main ( String arg []) {
do {
System.out.println ( “Ingrese el número de pacientes:” ) ;
numP = Lectura.leerInt ( ) ;
} while ( numP < 1 ) ;
switch ( tipo ) {
case 1 :
costo = 200 * dias ;
if ( edad < 18 ) {
costo = costo * 0.8 ;
}
break ;
case 2 :
costo = 350 * dias * ;
break ;
case 3 :
costo = 420 * dias * ;
}
Problema 107
Enunciado: Ingresar las tres notas de todos los alumnos de un salón de clase. Mostrar las notas
ingresadas ordenadas ascendentemente y el promedio final de cada alumno. Adicionalmente,
mostrar el promedio de notas de todos los alumnos del salón de clase. Finalmente, consistenciar
el ingreso de las notas.
INICIO
HACER
LEER numAlu
HACER
LEER nota1
MIENTRAS ( nota1 < 0 OR nota1 > 20 )
HACER
LEER nota2
MIENTRAS ( nota2 < 0 OR nota2 > 20 )
HACER
LEER nota3
MIENTRAS ( nota3 < 0 OR nota3 > 20 )
SINO
notaMe = nota2
notam = nota3
FINSI
FINSI
FINDESDE
FIN
Clase PrgNotas
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
do {
cout << “Ingrese la cantidad de alumnos: ” << endl ;
cin >> numAlum ;
} while (numAlum <= 0 ) ;
do {
cout << “Nota1 del alumno ” << ( i + 1 ) << endl ;
cin >> nota1 ;
} while ( nota1 < 0 || nota1 > 20 ) ;
do {
cout << “Nota2 del alumno ” << ( i + 1 ) << endl ;
cin >> nota2 ;
} while ( nota2 < 0 || nota2 > 20 ) ;
do {
cout << “Nota3 del alumno ” << ( i + 1 ) << endl ;
cin >> nota3 ;
} while ( nota3 < 0 || nota3 > 20 ) ;
notaMa = nota1 ;
notaMa = nota2 ;
462 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
notaMa = nota3 ;
cout << notaMa << “\n” << notam << “\n” << notaMe ;
cout << “\nEl promedio del alumno ” << ( i + 1 ) << “ es: ” ;
cout << promedio << endl ;
sumaTotal += promedio ;
Problema 108
Considere que para la solución de este problema deberá primero visualizar solo las opciónes 1 y
4. Después de haber ingresado la base y altura de un rectángulo, se deberá visualizar todas las
opciones.
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
menu = menu1
Menú de
opciones
opc <> 4
VERDADERO
FALSO
FIN
464 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
MENÚ 1
Menú de
[1] Ingresar base y altura
opciones
[4] Finalizar.
MENÚ 2
opc [1] Ingresar base y altura
[2] Mostrar área
[3] Mostrar perímetro
[4] Finalizar
opc
1 OTROS
2 3 4
1 "Error"
Ingreso de
datos
VERDADERO
VERDADERO
sw = 1 sw = 1
"Error" "Error"
FIN
Diseñe la parte del algoritmo relacionado con el ingreso de datos, el cálculo del área y el cálculo del
perímetro del rectángulo.
CAP. 5: Estructuras lógicas combinadas 465
Clase PrgMenuAreaPerimetro
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgMenuAreaPerimetro {
public static void main ( String arg [ ] ) {
int opc , sw = 0 ;
double base = 0 , altura = 0 ;
do {
System.out.println ( menu ) ;
opc =Lectura.leerInt ( ) ;
switch ( opc ) {
case 1 :
menu = menu2 ;
sw = 1 ;
break ;
case 2 :
if ( sw == 1 ) {
System.out.print ( “Area del rectángulo: ” ) ;
System.out.println ( base * altura ) ;
} else {
System.out.println ( “Ingrese la opción 1…” ) ;
}
break ;
466 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
case 3 :
if ( sw == 1 ) {
System.out.print ( “Perímetro del rectángulo: ” ) ;
System.out.println ( base * 2 + altura * 2 ) ;
} else {
System.out.println ( “Ingrese la opción 1…” ) ;
}
break ;
case 4 :
break ;
default :
System.out.println ( “Opción no válida. Reintente! ” ) ;
}
} while ( opc != 4 ) ;
}
}
Problema 109
Enunciado:
Desarrolle un menú con las siguientes opciones:
[1] Ingresar un número.
[2] Determinar el número de cifras del número.
[3] Determinar si el número es par o no.
[4] Finalizar.
Consistenciar el ingreso de todos los datos. Considere que para la solución de este problema deberá
primero visualizar solo la opción 1 y 4. Después de haber ingresado el número, se deberá visualizar
todas las opciones.
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
HACER
ESCRIBIR menu
LEER opc
menu = menu2
sw = 1
TERMINAR
CASO 2 :
SI ( sw == 1 ) ENTONCES
numTmp = 0
numCifras = 0
numTmp = numTmp / 10
numCifras = numCifras + 1
FINMIENTRAS
SINO
ESCRIBIR “Ingrese la opción 1”
FINSI
TERMINAR
CASO 3 :
SI ( sw == 1 ) ENTONCES
ESCRIBIR mensaje
SINO
ESCRIBIR “Ingrese la opción 1”
FINSI
TERMINAR
CASO 4 :
TERMINAR
OTROS :
ESCRIBIR “Opción no válida. Reintente!”
FINCUANDO
MIENTRAS ( opc <> 4 )
FIN
Clase PrgMenuNumero
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgMenuNumero {
menu = menu1 ;
do {
System.out.println ( menu ) ;
opc =Lectura.leerInt ( ) ;
switch ( opc ) {
case 1 :
do {
System.out.println ( “Ingrese un número: ” ) ;
num = Lectura.leerInt ( ) ;
if ( num <= 0 ) {
System.out.println ( “Número no válido... ” ) ;
}
menu = menu2 ;
sw = 1 ;
break ;
case 2 :
if ( sw == 1 ) {
numTmp = num ;
numCifras = 0 ;
numCifras ++ ;
}
} else {
System.out.println ( “Ingrese la opción 1…” ) ;
}
break ;
case 3 :
if ( sw == 1 ) {
if ( num % 2 == 0 ) {
mensaje = “El número es par ” ;
} else {
mensaje = “El número es impar ” ;
}
System.out.println ( mensaje ) ;
} else {
System.out.println ( “Ingrese la opción 1…” ) ;
}
break ;
case 4 :
break ;
default :
System.out.println ( “Opción no válida. Reintente! ” ) ;
} while ( opc != 4 ) ;
}
}
Problema 110
Enunciado: Ingresar el nombre, precio de compra, precio de venta y cantidad de artículos de todos
los productos de una bodega. Calcular la utilidad de cada producto y la utilidad total si se vendieran
todos los artículos de cada producto. Finalmente consistenciar el ingreso de los datos.
INICIO
TEXTO nombre
REAL pC , pV , util = 0 , utilT = 0
NUMERO total , cant , i
1
Ingreso de la
cantidad de
productos
2
Ingreso de
datos y cálculo
de utilidad
FIN
472 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
1
Ingreso de
la cantidad
de productos
total
VERDADERO
total < 1
FALSO
"error"
total < 1
VERDADERO
FALSO
CAP. 5: Estructuras lógicas combinadas 473
2
Ingreso de
datos y cálculo
de utilidad
FALSO
DESDE i = 0 HASTA total -1
INCREMENTA i en 1
VERDADERO
2.1
Ingreso de
datos
2.2
Cálculo de
utilidad
utilT
474 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
2.1
Ingreso de datos
nombre
cant
cant < 1
VERDADERO
FALSO
pC
pC < 1
VERDADERO
FALSO
pV
pC <= pV
VERDADERO
FALSO
CAP. 5: Estructuras lógicas combinadas 475
2.2
Cálculo de
utilidad
util = pV - pC
util
#include <iostream>
#include <string>
using std::cout ;
using std::cin ;
using std::endl ;
using std::string ;
int main ( ) {
string nombre ;
double pC , pV , util = 0 , utilT = 0 ;
int total , cant ;
do {
cout << “Ingrese la cantidad de productos: ” << endl ;
cin >> total ;
if ( total < 1 ) {
cout << “Cantidad no válida… ” << endl ;
}
} while ( total < 1 ) ;
for ( int i = 0 ; i < total ; i++ ) {
do {
cout << “Ingrese cantidad: ” << endl ;
cin >> cant ;
do {
cout << “Ingrese su precio de compra: ” << endl ;
cin >> pC ;
} while ( pC < 1 ) ;
do {
cout << “Ingrese su precio de venta: ” << endl ;
cin >> pV ;
} while ( pC <= pV ) ;
util = pV – pC ;
cout << “La utilidad total sería: ” << utilT << endl ;
return 0 ;
}
Clase PrgUtilidad
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgUtilidad {
string nombre ;
double pC , pV , util = 0 , utilT = 0 ;
int total , cant ;
do {
System.out.println ( “Ingrese la cantidad de productos: ” ) ;
total = Lectura.leerInt ( ) ;
if ( total < 1 ) {
System.out.println ( “Cantidad no válida… ” ) ;
}
} while ( total < 1 ) ;
do {
System.out.println ( “Ingrese cantidad: ” ) ;
cant = Lectura.leerInt ( ) ;
} while ( cant < 1 ) ;
do {
System.out.println ( “Ingrese su precio de compra: ” ) ;
pC = Lectura.leerDouble ( ) ;
} while ( pC < 1 ) ;
do {
System.out.println ( “Ingrese su precio de venta: ” ) ;
pV = Lectura.leerDouble ( ) ;
} while ( pC <= pV ) ;
util = pV – pC ;
}
System.out.println ( “La utilidad total es: ” + utilT ) ;
}
}
478 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 111
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
ENTERO opc
REAL radio = 0 , area , perimetro , volumen
HACER
ESCRIBIR menu
LEER opc
CASO 1 :
LEER radio
TERMINAR
CASO 2 :
area = 4 * Math.PI * Math.pow ( radio , 2 )
ESCRIBIR “ El área de la esfera es: ” + area
TERMINAR
CAP. 5: Estructuras lógicas combinadas 479
CASO 3 :
perimetro = 8 * Math.PI * radio
ESCRIBIR “ El perímetro de la esfera es: ” + perimetro
TERMINAR
CASO 4 :
volumen = 4 * Math.PI / 3 * Math.pow ( radio , 3 )
ESCRIBIR “ El volumen de la esfera es: ” + volumen
TERMINAR
OTROS :
FINCUANDO
FIN
Clase PrgMenuEsfera
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
int opc ;
double radio = 0 , area , perimetro , volumen ;
switch ( opc ) {
480 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
case 1 :
cout << “Ingrese el radio de la esfera: ” << endl ;
cin >> radio ;
break ;
case 2 :
area = 4 * Math.PI * Math.pow ( radio , 2 ) ;
cout << “El área de la esfera es: ” ;
cout << area << endl ;
break ;
case 3 :
perimetro = 8 * Math.PI * radio ;
cout << “El perímetro de la esfera es: ” ;
cout << perimetro << endl ;
break ;
case 4:
volumen = 4 * Math.PI / 3 * Math.pow ( radio , 3 ) ;
cout << “El volumen de la esfera es: ” ;
cout << volumen << endl ;
break ;
default :
if ( opc != 5 ) {
cout << “Opción no válida ” << endl ;
}
}
} while ( opc != 5 ) ;
return 0 ;
}
Problema 112
Enunciado: Desarrollar una solución que permita mostrar el término enésimo de la serie de
FIBONACCI. Recordar:
INICIO
NUMERO serie = 0 , f0 = 1, f1 = 1 , fn = 0 , i
1
Ingreso de un
número
2
Cálculo de la
serie Fibonacci
del número
fn
FIN
482 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
1
Ingreso de un
número
serie
VERDADERO
serie < 1
FALSO
“error”
serie < 1
VERDADERO
FALSO
CAP. 5: Estructuras lógicas combinadas 483
2
Cálculo de la
serie Fibonacci
del número
serie
1 2 OTROS
INCREMENTA i en 1
VERDADERO
fn = f0 + f1
f0 = f1
f1 = fn
Clase PrgFibonacci
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
int serie = 0, f0 = 1, f1 = 1, fn = 0 ;
do {
if ( serie < 1 ) {
cout << “Ingrese un número mayor que cero. ” << endl ;
}
switch ( serie ) {
case 0 :
fn = f0 ;
break ;
case 1 :
fn = f1 ;
break ;
default :
for ( int i = 2 ; i <= serie ; i ++ ) {
fn = f0 + f1 ;
f0 = f1 ;
f1 = fn ;
}
}
cout << “El valor, ” << serie << “ de la serie de Fibonacci es: ” << fn ;
return 0 ;
}
CAP. 5: Estructuras lógicas combinadas 485
Clase PrgFibonacci
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgFibonacci {
int serie = 0 , f0 = 1 , f1 = 1 , fn = 0 ;
do {
if ( serie < 1 ) {
System.out.println ( “Ingresar número mayor que cero.” ) ;
}
switch ( serie ) {
case 0 :
fn = f0 ;
break ;
case 1 :
fn = f 1 ;
break ;
default :
for ( int i = 2 ; i <= serie ; i ++ ) {
fn = f0 + f1 ;
f0 = f1 ;
f1 = fn ;
}
}
Problema 113
Categoría Descuento
1 25%
2 15%
3 10%
4 10%
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
1
Ingreso de la
cantidad de
productos
2
Ingreso de
datos y cálculo
de precio
FIN
CAP. 5: Estructuras lógicas combinadas 487
1
Ingreso de la
cantidad de
productos
cant
cant <= 0
VERDADERO
FALSO
2
Ingreso de
datos y cálculo
de precio
DESDE i = 0 HASTA cant -1 FALSO
INCREMENTA i en 1
VERDADERO
2.1
Ingreso de
datos
2.2
Cálculo de
precio
488 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
2.2
Cálculo de
precio
cat
1 2 3 4
pC
Clase PrgSupermercado
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
int cat , cant ;
double pC ;
do {
cout << “Ingrese la cantidad de productos: ” << endl ;
cin >> cant ;
} while ( cant <= 0 ) ;
CAP. 5: Estructuras lógicas combinadas 489
do {
cout << “Ingrese la categoría: ” << endl ;
cin >> cat ;
} while ( cat < 1 && cat > 4 ) ;
do {
cout << “Ingrese el precio: ” << endl ;
cin >> pC ;
} while ( pC <= 0 ) ;
switch ( cat ) {
case 1 :
pC = pC * 0.75 ;
break ;
case 2 :
pC = pC * 0.85 ;
break ;
case 3 :
pC = pC * 0.9 ;
break ;
case 4 :
pC = pC * 0.95 ;
break ;
}
cout << “El nuevo precio es: ” << pC ;
}
return 0 ;
}
Clase PrgSupermercado
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgSupermercado {
do {
System.out.println ( “Ingrese la cantidad de productos: ” ) ;
cant = Lectura.leerInt ( ) ;
} while ( cant <= 0 ) ;
do {
System.out.println ( “Ingrese la categoría: ” ) ;
cat = Lectura.leerInt ( ) ;
} while ( cat < 1 && cat > 4 ) ;
do {
System.out.println ( “Ingrese el precio: ” ) ;
pC = Lectura.leerDouble ( ) ;
} while ( pC <= 0 ) ;
switch ( cat ) {
case 1 :
pC = pC * 0.75 ;
break ;
case 2 :
pC = pC * 0.85 ;
break ;
case 3 :
pC = pC * 0.9 ;
break ;
case 4 :
pC = pC * 0.95 ;
break ;
}
System.out.println ( “El nuevo precio es: ” + pC ) ;
}
}
}
Problema 114
Enunciado: Desarrollar una solución que permita ingresar un valor “n” mayor o igual que 1, y un valor
“x” cualquiera para el cálculo de la ecuación mostrada. Tener en cuenta que la division entre 0 no está
definida.
3 π
x −
n
x +5
∑ x1+ 2 +x1−1+
i=1 x3
n
∑ x − i + 32
i=1
Etapa 03 - Diseño de la lógica
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
CAP. 5: Estructuras lógicas combinadas 491
ENTRADA: n , x
SALIDA: resultado
INICIO
ENTERO n = 0 , i
REAL x , numerador = 0 , denominador = 0 , resultado , pi = 3.1416
HACER
LEER n
SI ( n < 1 ) ENTONCES
ESCRIBIR “Valor ingresado no válido… Reintente! ”
FINSI
MIENTRAS ( n < 1 )
HACER
LEER x
SI ( x == 0 ) ENTONCES
ESCRIBIR “Valor ingresado no válido… Reintente! ”
FINSI
MIENTRAS ( x == 0 )
DESDE i = 0 HASTA n
numerador = numerador +
( x POTENCIA ( i + 2 ) + x POTENCIA ( i - 1 ) +
( ( x POTENCIA 3 ) – ( pi / x + 5 ) )
/ ( x POTENCIA 3 ) ) ) )
FINDESDE
FIN
Clase PrgSumatoria
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
int n = 0 , i ;
double x , numerador = 0 , denominador = 0 , resultado ;
do {
cout << “Ingrese el valor de n para la sumatoria: \n ” << endl ;
cin >> n ;
if ( n < 1 ) {
cout << “Valor ingresado no válido… Reintente! ” << endl ;
}
} while ( n < 1 ) ;
do {
cout << “Ingrese un valor para la variable X : ” << endl ;
cin >> x ;
if ( x == 0 ) {
cout << “Valor ingresado no válido… Reintente! ” << endl ;
}
} while ( x == 0 ) ;
for ( i = 1 ; i <= n ; i ++ ) {
denominador += ( x - i + Math.pow ( x , 3 ) + 32 ) ;
return 0 ;
Problema 115
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
HACER
ESCRIBIR menu
LEER opc
CASO 1 :
LEER longitud
TERMINAR
CASO 2 :
conversion = longitud / 3.28
ESCRIBIR “ La longitud en pies es: ” + conversion
TERMINAR
494 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
CASO 3 :
conversion = longitud / 39.37
ESCRIBIR “ La longitud en pulgadas es: ” + conversion
TERMINAR
CASO 4 :
conversion = longitud / ( 1.6093 / 1000 )
ESCRIBIR “ La longitud en millas es: ” + conversion
TERMINAR
OTROS :
SI ( opc <> 5 ) ENTONCES
ESCRIBIR “Opción no válida. Reintente!”
FINSI
FINCUANDO
FIN
Clase PrgMenuMetros
#include <iostream>
using std::cout ;
using std::cin ;
using std::endl ;
int main ( ) {
switch ( opc ) {
CAP. 5: Estructuras lógicas combinadas 495
case 1 :
cout << “Ingrese la longitud: \n\n ” << endl ;
cin >> longitud ;
break ;
case 2 :
conversion = ( longitud / 3.28 ) ;
cout << “La longitud en pies es: ” << conversion << endl ;
break ;
case 3 :
conversion = longitud / 39.37 ;
cout << “La longitud en pulgadas es: ” << conversion ;
cout << endl ;
break ;
case 4 :
conversion = longitud / ( 1.6093 / 1000 ) ;
cout << “La longitud en millas es: ” << conversion ;
cout << endl ;
break ;
default :
if ( opc != 5 ) {
cout << “Opción no válida… Reintente!. ” << endl ;
}
}
} while ( opc != 5 ) ;
return 0 ;
}
Problema 116
INICIO
HACER
ESCRIBIR menu
LEER tipo , cantidad
CUANDO (tipo) SEA
CASO 1 :
precio = precio + cantidad * 1.5
TERMINAR
CASO 2 :
precio = precio + cantidad * 1.2
canGel = canGel + cantidad
TERMINAR
CASO 3 :
precio = precio + cantidad * 2
TERMINAR
CASO 4 :
precio = precio + cantidad * 3.2
TERMINAR
OTROS :
ESCRIBIR “Opción no válida. Reintente!”
FINCUANDO
Clase PrgPostres
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgPostres {
char rpta ;
do {
tipo = Lectura.leerInt ( ) ;
switch ( tipo ) {
case 1 :
precio = precio + cantidad * 1.5 ;
break ;
case 2 :
precio = precio + cantidad * 1.2 ;
canGel = canGel + cantidad ;
break ;
case 3 :
precio = precio + cantidad * 2 ;
break ;
case 4 :
precio = precio + cantidad * 3.2 ;
break ;
default :
System.out.println ( “Opcion no válida!.” ) ;
}
if ( canGel >= 20 ) {
vales = vales + cantidad / 20 ;
}
if ( canTotal > 10 ) {
descuento = precio * 0.1 ;
}
Problema 117
Tener en cuenta que por la compra de más de 10 porciones de cualquier tipo de producto, se le
otorga el descuento de acuerdo a la tabla. Desarrolle una solución que permita determinar el monto
de compra de cada tipo de producto, el monto del descuento de cada tipo de producto y el monto
total a pagar por una determinada compra. Ingrese el tipo de producto y la cantidad de porciones
que se desea comprar. Finalmente, asumir que se puede realizar varios pedidos en la misma compra.
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
CASO 1 :
precio1 = precio1 + cantidad * 1.5
canMaz = canMaz + cantidad
TERMINAR
CASO 2 :
precio2 = precio2 + cantidad * 1.2
canGel = canGel + cantidad
TERMINAR
CASO 3 :
precio3 = precio3 + cantidad * 2
canKek = canKek + cantidad
TERMINAR
CASO 4 :
precio4 = precio4 + cantidad * 3.2
canHel = canHel + cantidad
TERMINAR
OTROS :
ESCRIBIR “Opción no válida. Reintente!”
FINCUANDO
LEER rpta
Clase PrgPostre2
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgPostre2 {
public static void main ( String arg [ ] ) {
do {
tipo = Lectura.leerInt ( ) ;
System.out.println ( “Ingrese cantidad de porciones a llevar: ” ) ;
cantidad = Lectura.leerInt ( ) ;
switch ( opc ) {
case 1 :
precio1 = precio1 + cantidad * 1.5 ;
canMaz = canMaz + cantidad ;
break ;
case 2 :
precio2 = precio2 + cantidad * 1.2 ;
canGel = canGel + cantidad ;
break ;
case 3 :
precio3 = precio3 + cantidad * 2 ;
canKek = canKek + cantidad ;
break ;
case 4 :
precio4 = precio4 + cantidad * 3.2 ;
canHel = canHel + cantidad ;
break ;
default :
System.out.println ( “Opcion no válida!. ” ) ;
}
502 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
if ( canMaz > 10 ) {
descuento1 = precio1 * 0.12 ;
}
if ( canGel > 10 ) {
descuento2 = precio2 * 0.10 ;
}
if ( canKek > 10 ) {
descuento3 = precio3 * 0.15 ;
}
if ( canHel > 10 ) {
descuento4 = precio4 * 0.17 ;
}
Problema 118
Enunciado: En un puesto de periódicos se venden periódicos de tres empresas (A, B, y C). Cada una
de las empresas cuenta con tres tipos diferentes de periódicos (popular, normal y especializado). El
costo de cada periódico según el tipo de periódico se muestra en la siguiente tabla:
Desarrollar una solución que permita determinar cuántos periódicos se vendieron de cada empresa
y cuál fue el monto obtenido por la venta de cada tipo de periódico de cada empresa. Por cada
venta, ingrese el tipo de empresa y el tipo de periódico.
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
NUMERO tipo, c1, c2, c3, m1A, m2A, m3A, m1B, m2B,
m3B, m1C, m2C, m3C
CARACTER emp, rpta
Ingreso de
datos, cálculo
y resultado
FIN
504 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Ingreso de
datos, cálculo y
resultado
1
Ingreso de
datos
2
Cálculo de
resultados
rpta
rpta == ‘s’
VERDADERO
FALSO
Diseñe la parte del algoritmo relacionado con el ingreso de datos y el cálculo de resultados.
CAP. 5: Estructuras lógicas combinadas 505
Clase PrgPeriodicos
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgPeriodicos {
public static void main ( String arg [ ] ) {
int tipo , c1 = 0 , c2 = 0 , c3 = 0 ;
double m1A = 0 , m2A = 0 , m3A = 0 , m1B = 0 , m2B = 0 ;
double m3B = 0 , m1C = 0 , m2C = 0 , m3C = 0 ;
char emp , rpta ;
do {
switch ( emp ) {
case ‘A’ :
c1++ ;
if ( tipo == 1 )
m1A = m1A + 0.5 ;
if ( tipo == 2 )
m2A = m3A + 1 ;
if ( tipo == 3 )
m3A = m3A + 2 ;
break ;
case ‘B’ :
c2++ ;
if ( tipo == 1 )
m1B = m1B + 0.5 ;
if ( tipo == 2 )
m2B = m2B + 1.2 ;
if ( tipo == 3 )
m3B = m3B + 2.5 ;
break ;
case ‘c’ :
c3++ ;
if ( tipo == 1 )
m1C = m1C + 0.7 ;
506 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
if ( tipo == 2 )
m2C = m2C + 1.2 ;
if ( tipo == 3 )
m3C = meC + 3.6 ;
break ;
default :
System.out.println ( “Opción mal ingresada” ) ;
}
Problema 119
Enunciado: Una determinada empresa tiene tres productos en oferta (A, B y C). Cada uno de los
productos cuenta con tres diferentes calidades (X1, X2 y X3). El costo de cada producto según la
calidad se muestra en la tabla siguiente:
Desarrolle una solución que permita determinar el monto total a pagar por la compra de cada
producto. Mostrar cuántos productos de una misma calidad se vendieron. Ingrese el producto a
comprar y la calidad del mismo.
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
CASO 1 :
SI ( cal == 1 ) ENTONCES
mA = mA + 50
c1 = c1 + 1
508 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
FINSI
SI ( cal == 2 ) ENTONCES
mA = mA + 89
c2 = c2 + 1
FINSI
SI ( cal == 3 ) ENTONCES
mA = mA + 94
c3 = c3 + 1
FINSI
TERMINAR
CASO 2 :
SI ( cal == 1 ) ENTONCES
mB = mB + 45
c1 = c1 + 1
FINSI
SI ( cal == 2 ) ENTONCES
mB = mB + 55
c2 = c2 + 1
FINSI
SI ( cal == 3 ) ENTONCES
mB = mB + 89
c3 = c3 + 1
FINSI
TERMINAR
CASO 3 :
SI ( cal == 1 ) ENTONCES
mC = mC + 19
c1 = c1 + 1
FINSI
SI ( cal == 2 ) ENTONCES
mC = mC + 39
c2 = c2 + 1
FINSI
SI ( cal == 3 ) ENTONCES
mC = mC + 76
c3 = c3 + 1
FINSI
TERMINAR
OTROS :
ESCRIBIR “Opción no válida. Reintente!”
FINCUANDO
LEER rpta
MIENTRAS ( rpta == ‘s’ OR rpta== ‘S’ )
ESCRIBIR “Monto total a pagar: ”
ESCRIBIR “Producto A: ” + mA
ESCRIBIR “Producto B: ” + mB
ESCRIBIR “Producto C: ” + mC
ESCRIBIR “Cantidad de productos de la misma calidad vendidos: ”
ESCRIBIR “Calidad X1: ” + c1
ESCRIBIR “Calidad X2: ” + c2
ESCRIBIR “Calidad X3: ” + c3
FIN
Clase PrgOfertas
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgOfertas {
public static void main ( String arg [ ] ) {
int cal ;
char prod ;
double mAX1 = 0, mAX2 = 0, mAX3 = 0, mBX1 = 0, mBX2 = 0 ;
double mBX3 = 0, mCX1 = 0, mCX2 = 0, mCX3 = 0 ;
String rpta ;
do {
cal = Lectura.leerInt ( ) ;
switch ( opc ) {
case 1 :
if ( cal == 1 ) {
mA = mA + 50 ;
c1 = c1 + 1 ;
}
if ( cal == 2 ) {
mA = mA + 89 ;
c2 = c2 + 1 ;
}
if ( cal == 3 ) {
mA = mA + 94 ;
c3 = c3 + 1 ;
}
break ;
case 2 :
if ( cal == 1 ) {
mB = mB + 45 ;
c1 = c1 + 1 ;
}
if ( cal == 2 ) {
mB = mB + 55 ;
c2 = c2 + 1 ;
}
510 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
if ( cal == 3 ) {
mB = mB + 89 ;
c3 = c3 + 1 ;
}
break ;
case 3 :
if ( cal == 1 ) {
mC = mC + 19 ;
c1 = c1 + 1 ;
}
if ( cal == 2 ) {
mC = mC + 39 ;
c2 = c2 + 1 ;
}
if ( cal == 3 ) {
mC = mC + 76 ;
c3 = c3 + 1 ;
}
break ;
default :
System.out.println ( “Opción no válida. Reintente! ” ) ;
}
}
}
Problema 120
Enunciado: Desarrollar una solución que permita leer los datos de todos los alumnos de un salón
de clase. Los datos de los alumnos son: nombre, fecha de nacimiento (dd/ mm/ aaaa) y nota final.
Se solicita:
Definir el nombre del proyecto, luego desarrollar la definición de paquetes, el diagrama de paquetes
y la definición de las clases.
INICIO
Ingreso
de datos y
cálculo de
resultados
FIN
512 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Ingreso de datos
y cálculo de
resultados
opc
Menu de
opciones
Opc!=6
VERDADERO FALSO
Menú de
opciones
opc
1 2 3 4 5
1 2 3 4 5
Ingresar Calcular Mostrar Mostrar Mostrar
datos. Hacer y mostrar promedio mejor nombres con
cálculos edad alumno letra a y p
Diseñe la parte del algoritmo relacionado con las opciones del menú.
Intente diseñar el algoritmo en pseudocódigo.
CAP. 5: Estructuras lógicas combinadas 513
Clase PrgMenuAlumnos
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgMenuAlumnos {
public static void main ( String arg [ ] ) {
do {
System.out.println ( “Ingrese su opcion:\n
[1] Ingreso de datos \n
[2] Calcular y mostrar Edad \n
[3] Nota promedio \n
[4] Nombre del alumno con mayor nota \n
[5] Cantidad de nombres que empiezan con a y p \n
[6] Salir \n ” ) ;
opc = Lectura.leerInt ( ) ;
switch ( opc ) {
case 1 :
cant ++ ;
System.out.println ( “Ingrese nombre del alumno: ” ) ;
nom = Lectura.leerString ( ) ;
nom = nom.toUpperCase ( ) ;
prom = prom + nf ;
if ( nf > notaMayor ) {
notaMayor = nf ;
nombreMayor = nom ;
}
if ( nom.charAt (0) == ‘A’ || nom.charAt (0) == ‘P’ ) {
cantAP ++ ;
}
break ;
case 2 :
edad = 2006 - Integer.parseInt ( fecNac.substring(6)) ;
System.out.println ( “Edad: ” + edad ) ;
break ;
514 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
case 3 :
case 4 :
case 5 :
default :
System.out.println ( “Opcion mal ingresada ” ) ;
}
} while ( opc != 6 ) ;
}
}
Problema 121
Enunciado: Desarrollar un programa que permita ingresar un número entero menor que 100 y
permita mostrar su equivalente en letras.
Clase PrgNumALetras01
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumALetras01 {
public static void main ( String arg [ ] ) {
String letra = “”, cero = “cero”, uno = “uno”, dos = “dos”, tres = “tres” ;
String cuatro = “cuatro”, cinco = “cinco”, seis = “seis”, siete = “siete” ;
String ocho = “ocho”, nueve = “nueve”, diez = “diez”, once = “once” ;
String doce = “doce”, trece = “trece”, catorce = “catorce”, quince = “quince” ;
String dieci = “dieci” ;
do {
System.out.println ( “Ingrese un número entero menor que 100: ” ) ;
num = Lectura.leerInt ( ) ;
dec = num / 10 ;
uni = num % 10 ;
switch ( uni ) {
case 0 :
letra = cero ;
break ;
case 1 :
letra = uno ;
break ;
case 2 :
letra = dos ;
break ;
case 3 :
letra = tres ;
break ;
case 4 :
letra = cuatro ;
break ;
516 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
case 5 :
letra = cinco ;
break ;
case 6 :
letra = seis ;
break ;
case 7 :
letra = siete ;
break ;
case 8 :
letra = ocho ;
break ;
case 9 :
letra = nueve ;
break ;
}
switch ( dec ) {
case 1 :
switch ( uni ) {
case 0 :
letra = diez ;
break ;
case 1 :
letra = once ;
break ;
case 2 :
letra = doce ;
break ;
case 3 :
letra = trece ;
break ;
case 4 :
letra = catorce ;
break ;
case 5 :
letra = quince ;
break ;
default :
letra = dieci + letra ;
}
break ;
case 2 :
if ( uni == 0 )
letra = veinte ;
else
letra = veinti + letra ;
break ;
case 3 :
if ( uni == 0 )
letra = treinta ;
else
letra = treinta + y + letra ;
break ;
case 4 :
if ( uni == 0 )
letra = cuarenta ;
else
letra = cuarenta + y + letra ;
break ;
CAP. 5: Estructuras lógicas combinadas 517
case 5 :
if ( uni == 0 )
letra = cincuenta ;
else
letra = cincuenta + y + letra ;
break ;
case 6 :
if ( uni == 0 )
letra = sesenta ;
else
letra = sesenta + y + letra ;
break ;
case 7 :
if ( uni == 0 )
letra = setenta ;
else
letra = setenta + y + letra ;
break ;
case 8 :
if ( uni == 0 )
letra = ochenta ;
else
letra = ochenta + y + letra ;
break ;
case 9 :
if ( uni == 0 )
letra = noventa ;
else
letra = noventa + y + letra ;
}
System.out.print ( “El número ” + num + “ en letras es ” + letra ) ;
}
}
518 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 122
Enunciado: En base al programa anterior, desarrollar otro programa que permita ingresar un
número entero menor que 1000, y que permita mostrar su equivalente en letras.
Clase PrgNumALetras02
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumALetras02 {
public static void main ( String arg [ ] ) {
String letra = “”, cero =“cero”, uno =“uno”, dos = “dos”, tres =“tres”;
String cuatro = “cuatro”, cinco = “cinco”, seis = “seis”, siete =“siete”;
String ocho = “ocho”, nueve = “nueve”, diez = “diez”, once =“once”;
String doce = “doce”, trece = “trece”, catorce = “catorce”, quince =
“quince”;
String dieci = “dieci”;
do {
System.out.println ( “ Ingrese un número entero menor que 1000: ” ) ;
num = Lectura.leerInt ( ) ;
if ( num < 0 || num > 999 )
System.out.println (“Número ingresado no válido... Reintente!!!”);
} while ( num < 0 || num > 999 ) ;
switch ( uni ) {
case 0 :
letra = cero ;
break ;
case 1 :
letra = uno ;
break ;
case 2 :
letra = dos ;
break ;
case 3 :
letra = tres ;
break ;
CAP. 5: Estructuras lógicas combinadas 519
case 4 :
letra = cuatro ;
break ;
case 5 :
letra = cinco ;
break ;
case 6 :
letra = seis ;
break ;
case 7 :
letra = siete ;
break ;
case 8 :
letra = ocho ;
break ;
case 9 :
letra = nueve ;
break ;
}
switch (dec) {
case 1 :
switch (uni) {
case 0 :
letra = diez ;
break ;
case 1 :
letra = once ;
break ;
case 2 :
letra = doce ;
break ;
case 3 :
letra = trece ;
break ;
case 4 :
letra = catorce ;
break ;
case 5 :
letra = quince ;
break ;
default :
letra = dieci + letra ;
}
break ;
case 2 :
if ( uni == 0 )
letra = veinte ;
else
letra = veinti + letra ;
break ;
case 3 :
if ( uni == 0 )
letra = treinta ;
else
letra = treinta + y + letra ;
break ;
520 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
case 4 :
if (uni == 0)
letra = cuarenta ;
else
letra = cuarenta + y + letra ;
break ;
case 5 :
if ( uni == 0 )
letra = cincuenta ;
else
letra = cincuenta + y + letra ;
break ;
case 6 :
if ( uni == 0 )
letra = sesenta ;
else
letra = sesenta + y + letra ;
break ;
case 7 :
if ( uni == 0 )
letra = setenta ;
else
letra = setenta + y + letra ;
break ;
case 8 :
if ( uni == 0 )
letra = ochenta ;
else
letra = ochenta + y + letra ;
break ;
case 9 :
if ( uni == 0 )
letra = noventa ;
else
letra = noventa + y + letra ;
}
switch ( cen ) {
case 1 :
if ( dec == 0 && uni == 0 )
letra = cien ;
else
case 4 :
if ( dec == 0 && uni == 0 )
letra = cuatro + cientos ;
else
letra = cuatro + cientos + letra ;
break ;
case 5 :
if ( dec == 0 && uni == 0 )
letra = quinientos ;
else
letra = quinientos + letra ;
break ;
case 6 :
if ( dec == 0 && uni == 0 )
letra = seis + cientos ;
else
letra = seis + cientos + letra ;
break ;
case 7 :
if ( dec == 0 && uni == 0 )
letra = sete + cientos ;
else
letra = sete + cientos + letra ;
break ;
case 8 :
if ( dec == 0 && uni == 0 )
letra = ocho + cientos ;
else
letra = ocho + cientos + letra ;
break ;
case 9 :
if ( dec == 0 && uni == 0 )
letra = nove + cientos ;
else
letra = nove + cientos + letra ;
break ;
}
System.out.print ( “El número ” + num + “ en letras es ” + letra ) ;
}
}
522 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Existen diversos errores que pueden ocasionar que se lance una excepción en un programa, por
ejemplo, una entrada incorrecta de datos (IOException), una división por cero (ArithmeticException) o
una conversión de datos no válida (NumberFormatException).
Para evitar que la ejecución de un programa se detenga debido a un error que lanza una excepción, se
debe utilizar la sentencia try para alertar al programa acerca del código que puede ocasionar un error,
y utilizar la sentencia catch para capturar y manejar cada una de las excepciones que se puedan lanzar.
try {
// Código de la aplicación
… Tipo de excepción
… capturada por la
… sentencia catch,
… con la finalidad de
… manejarla.
} catch ( ) {
Significa: “Intentar ejecutar las sentencias ubicadas entre las llaves del try, y si ocurre un error y
se lanza una excepción, capturarla con la sentencia catch y manejarla con las sentencias ubicadas
entre las llaves del catch”.
Esto significa que durante la ejecución del programa, normalmente se ejecutarán las sentencias
que están dentro de las llaves de la sentencia try:
CAP. 5: Estructuras lógicas combinadas 523
try {
// Código de la aplicación
…
…
}
Si no ocurre un error, no se lanzará ninguna excepción, lo que significa que las sentencias que
están entre las llaves de la sentencia catch no se ejecutarán.
Como se ha indicado, existen diferentes tipos de excepciones por lo que es común observar en un
programa una sentencia try con varias sentencias catch. Cada sentencia catch capturará y manejará
un excepción.
try {
/* Código de la aplicación que se prevé
que puedan lanzar una excepción.*/
…
…
} catch ( ArithmeticException e ) {
/* Código de tratamiento de la excepción
ArithmeticException. */
…
…
} catch ( NumberFormatException e ) {
/* Código de tratamiento de la excepción
NumberFormatException. */
…
…
}
El manejo de excepciones ofrece una forma de escribir o codificar programas con una mayor claridad
y sencillez, separando explícitamente el código que maneja los errores del código básico de una
aplicación.
En la actualidad, se considera como “buen estilo de programación” el uso de las excepciones en los
programas.
Excepción Descripción
ArithmeticException Una condición aritmética excepcional ocurrió.
NumberFormatException Se intentó convertir una cadena con un formato inapropiado
a un número.
IOException Problemas al realizar operaciones de entrada y salida de
datos.
ArrayIndexOutOfBoundException Problemas al realizar operaciones de entrada y salida de
datos.
ArrayIndexOutOfBoundException Un arreglo fue accedido con un índice ilegal (fuera de los
límites permitidos).
NullPointerException Se intentó utilizar null donde se requería un objeto.
Problema 123
Enunciado: Desarrollar una solución que permita ingresar dos números enteros. Mostrar el
resultado de dividir ambos números. Se debe tener en cuenta que existe la posibilidad de que el
divisor sea igual a cero.
package dominioDeLaAplicacion;
import biblioteca.Lectura;
class PrgDivisionSinExcepcion {
public static void main ( String arg [ ] ) {
int dividendo, divisor, rpta ;
System.out.println ( “ Ingrese el dividendo: ” ) ;
dividendo = Lectura.leerInt ( ) ;
System.out.println ( “ Ingrese el divisor: ” ) ;
divisor = Lectura.leerInt ( ) ;
rpta = dividendo / divisor ;
System.out.println (“ El resultado de la división es: ” + rpta );
}
}
Ejecute el siguiente programa e ingrese cero al divisor. Al momento de realizar la división, se lanzará la
excepcion llamada ArithmeticException, debido a que no se puede dividir un número entero entre cero,
finalizando la ejecución del programa. Para evitar que el programa finalice, es necesario manejar dicha
excepción.
CAP. 5: Estructuras lógicas combinadas 525
Intente incluir en el programa anterior el manejo de la excepción lanzada. Analice el siguiente programa y
anote sus conclusiones.
Clase PrgDivisionConExcepcion
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgDivisionConExcepcion {
public static void main ( String arg [ ] ) {
divisor = Lectura.leerInt ( ) ;
try {
rpta = dividendo / divisor ;
System.out.println ( “ El resultado de la división es: ” + rpta ) ;
} catch ( ArithmeticException e ) {
}
}
}
Problema 124
Enunciado: Desarrollar una solución que permita ingresar la hora en el siguiente formato hh:mm:ss
donde “hh” es igual a la hora (de 00 a 23 horas), “mm” es igual a los minutos (de 00 a 59 minutos)
y “ss” es igual a los segundos (de 00 a 59 segundos). Mostrar un mensaje cuando la hora ingresada
sea válida. Manejar excepciones.
Clase PrgHoraConExcepcion
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgHoraConExcepcion {
public static void main ( String arg [ ] ) {
boolean valido ;
String hora, tmp ;
int hh, mm, ss ;
526 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
do {
System.out.println ( “ Ingrese la hora en el siguiente formato: hh:mm:ss ” ) ;
hora = Lectura.leerString ( ) ;
try {
tmp = hora.substring ( 0, 2 ) ;
hh = Integer.parseInt ( tmp ) ;
if ( hh < 0 || hh > 23 ) {
System.out.println ( “ Hora ingresada no válida ” ) ;
valido = true ;
} else {
tmp = hora.substring ( 3, 5 ) ;
mm = Integer.parseInt ( tmp ) ;
if (mm < 0 || mm > 59) {
System.out.println ( “ minuto ingresado no válido ” ) ;
valido = true ;
} else {
tmp = hora.substring ( 6 ) ;
ss = Integer.parseInt ( tmp ) ;
if (ss < 0 || ss > 59) {
System.out.println ( “ segundo ingresado no válido ” ) ;
valido = true ;
} else {
valido = false ;
}
}
}
} catch ( NumberFormatException error ) {
System.out.println ( “Error... ” ) ;
valido = true ;
}
} while ( valido ) ;
System.out.println ( “ La hora se ingresó correctamente... ” ) ;
}
}
En este programa se captura la excepción NumberFormatException para prevenir que no se intente convertir
una cadena con un formato inapropiado a un número. Puede probar el programa ingresando como hora lo
siguiente:
23:10:xx
Es decir, en cualquier parte del formato indicado, ingrese letras en lugar de números.
Para poder entender la solución del programa se sugiere revisar en el anexo la clase Integer (Clase Wrapper)
y la clase String.
CAP. 5: Estructuras lógicas combinadas 527
Problema 125
Enunciado: Desarrollar una solución que permita ingresar la fecha en una variable de tipo texto o
cadena con el siguiente formato: dd/ mm/ aaaa. Validar que la fecha ingresada tenga el formato
especificado y manejar excepciones.
Clase PrgFechaConExcepcion
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgFechaConExcepcion {
public static void main ( String arg [ ] ) {
do {
if ( fecha.length ( ) == 10 ) {
try {
tmp = fecha.substring ( 0, 2 ) ;
dia = Integer.parseInt ( tmp ) ;
tmp = fecha.substring ( 3, 5 ) ;
mes = Integer.parseInt ( tmp ) ;
tmp = fecha.substring ( 6 ) ;
año = Integer.parseInt ( tmp ) ;
puntos1 = fecha.substring ( 2, 3 ) ;
puntos2 = fecha.substring ( 5, 6 ) ;
if ( valido )
System.out.println (“ Error... Ingrese la fecha según formato!!!”);
} while ( valido ) ;
528 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
}
}
En este programa se captura la excepción NumberFormatException, para prevenir que no se intente convertir
una cadena con un formato inapropiado a un número. Puede probar el programa ingresando como fecha lo
siguiente:
Es decir, en cualquier parte del formato indicado, ingrese letras en lugar de números (inclusive en el lugar del
/ ).
Para poder entender la solución del programa sugerimos que revise en el anexo, la clase Integer (Clase
Wrapper) y la clase String.
Problema 126
Enunciado: Desarrollar una solución que permita ingresar dos números de tres dígitos en una
variable de tipo texto o cadena, con el siguiente formato: nnn//nnn. Validar que los números sean
de tres cifras y mostrar la división de los mismos. Finalmente, manejar excepciones.
Clase PrgNumeroConExcepcion
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumeroConExcepcion {
public static void main ( String arg [ ] ) {
boolean valido = true ;
String numeros, tmp, puntos1 ;
int num1, num2 ;
double resultado ;
do {
System.out.println (“ Ingrese dos números con el formato:nnn//nnn ”);
numeros = Lectura.leerString ( ) ;
numeros = numeros.trim ( ) ;
if ( numeros.length ( ) == 8 ) {
try {
tmp = numeros.substring ( 0, 3 ) ;
num1 = Integer.parseInt ( tmp ) ;
tmp = numeros.substring ( 5 ) ;
CAP. 5: Estructuras lógicas combinadas 529
} else {
valido = true ;
}
} catch ( NumberFormatException error ) {
System.out.println ( “ Formato no válido ” ) ;
valido = true ;
} catch ( ArithmeticException error ) {
System.out.println (“No se puede dividir un número entre cero”);
valido = false ;
}
} else {
valido = true ;
}
if ( valido ) {
System.out.println (“ Error... Ingrese en el formato indicado!!!”);
}
} while ( valido ) ;
}
}
En este programa se captura la excepción NumberFormatException para prevenir que no se intente convertir
una cadena con un formato inapropiado a un número. Puede probar el programa ingresando como números
lo siguiente:
aaa//123
Es decir, en cualquier parte del formato indicado, ingrese letras en lugar de números (inclusive en el lugar de
las // ).
También se captura la excepción ArithmeticException para prevenir que no se intente dividir los números
cuando el segundo número es cero. Puede probar el programa ingresando como números lo siguiente:
123//000
Para poder entender la solución del programa, se sugiere revisar en el anexo la clase Integer (clase Wrapper)
y la clase String.
IMPORTANTE
Se recomienda solucionar los problemas propuestos del 1 al 60,
planteados al final del presente capítulo.
530 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
El desarrollo de las capacidades lógicas se logra con la práctica; es decir, desarrollando soluciones
y codificándolas en un lenguaje de programación determinado, como por ejemplo, los lenguajes de
programación C++ y Java utilizados en el presente texto. Aunque en los siguientes problemas solo se
desarrollan soluciones utilizando el lenguaje de programación Java, se sugiere al lector que intente
desarrollarlas también en el lenguaje de programación C++.
Existen problemas que por su naturaleza contribuyen de manera significativa para lograr este objetivo,
los cuales se desarrollan en esta última parte del presente capítulo. Es importante analizar cada una de
las soluciones siguiendo paso a paso el desarrollo de las mismas y desarrollar los problemas propuestos.
Problema 127
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
Clase PrgCuadrado01
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println ( “ Ingresar el número de filas de la figura ” ) ;
System.out.print ( “ Valores válidos desde 2 hasta 20: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
Análisis de la solución:
Se ingresa el número de filas que va a tener la figura y se almacena en la variable totalFilas, la cual
puede variar desde 2 hasta 20. Para nuestra explicación asumiremos que el valor de totalFilas=5.
Entonces, la condición de la primera sentencia for va ser verdadera para valores de i=1 hasta
i=totalFilas (en el caso de totalFilas=5; los valores válidos para i son i=1, i=2, i=3, i=4 e i=5). Los
valores válidos de i coinciden con el número de filas que nuestra figura va a tener, por lo cual
podemos afirmar que para cada valor de i, corresponde una fila de la figura.
Para fila=5:
Ahora, necesitamos mostrar un número determinado de asteriscos en cada una de las filas y ese
número de asteriscos a mostrar coincide con el número de filas de la figura (para nuestro caso
totalFilas=5).
Esta situación determina la existencia de la segunda sentencia for, dentro de la primera sentencia
for (for interno).
for ( i = 1 ; i <=totalFilas; i++ ) {
for ( j = 1 ; j <= totalFilas; j++ ) {
…
}
…
}
Para cada una de las filas (en el caso de totalFilas=5; para i=1, i=2, i=3, i=4 e i=5), el for interno se
ejecuta la misma cantidad de veces que el número de filas de la figura, y cada vez que se ejecuta
muestra un asterisco (en el caso de totalFilas=5, el for interno se ejecuta 5 veces y mostrará en
total 5 asteriscos en cada una de las filas). Cada vez que finaliza el for interno, la sentencia System.
out.println ( ); nos permite hacer un salto de línea y continuar con la ejecución de la solución, si la
condición del primer for es verdadera.
532 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Los siguientes dos problemas son una variación de este problema. Analice sus respectivas soluciones
y desarrolle sus propias observaciones.
Problema 128
Enunciado:
Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
1 2 3 4 5
Nota: En la figura mostrada, el número de filas = 5.
1 2 3 4 5
Asumir que el número de filas puede variar desde 2
1 2 3 4 5
hasta 9 y que entre los números no existen espacios
1 2 3 4 5 en blanco.
1 2 3 4 5
Clase PrgCuadrado03
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println ( “ Ingresar el número de filas de la figura ” ) ;
System.out.print ( “ Valores válidos desde 2 hasta 9: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
Problema 129
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
1 1 1 1 1
2 2 2 2 2 Nota: En la figura mostrada, el número de filas
3 3 3 3 3 = 5. Asumir que el número de filas puede variar
desde 2 hasta 9 y que entre los números no
4 4 4 4 4
existen espacios en blanco.
5 5 5 5 5
Clase PrgCuadrado03
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println ( “ Ingresar el número de filas de la figura ” ) ;
System.out.print ( “ Valores válidos desde 2 hasta 9: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
Problema 130
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
Clase PrgTriangulo01
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println ( “ Ingresar el número de filas de la figura ”);
System.out.print ( “ Valores válidos desde 2 hasta 20: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
Análisis de la solución:
Se ingresa el número de filas que va a tener la figura y se almacena en la variable totalFilas, la cual
puede variar desde 2 hasta 20. Para nuestra explicación, asumiremos que el valor de totalFilas=5.
Entonces, la condición de la primera sentencia for será verdadera para valores de i=1 hasta
i=totalFilas (en el caso de totalFilas=5; los valores válidos para i son i=1, i=2, i=3, i=4 e i=5). Los
valores válidos de i coinciden con el número de filas que nuestra figura va a tener, por lo cual
podemos afirmar que para cada valor de i, corresponde una fila de la figura.
Para fila=5:
Esta situación determina la existencia de la segunda sentencia for dentro de la primera sentencia
for (for interno).
for ( i = 1 ; i <= totalFilas; i++ ) {
for ( j = 1 ; j <= i ; j++ ) {
…
}
…
}
En la primera fila (i=1) se necesita mostrar un asterisco. Esto se cumple porque para i=1 el único
valor válido para j sería j=1, por lo que el for interno se ejecutaría una sola vez y se mostraría solo
un asterisco. Finalizada la ejecución del for interno, la sentencia System.out.println ( ); nos permite
hacer un salto de línea, es decir, pasar a la segunda fila.
En la segunda fila (i=2) se necesita mostrar dos asteriscos. Esto se cumple porque para i=2 los
valores válidos para j serían j=1 y j=2, por lo que el for interno se ejecutaría dos veces y en cada una
de las ejecuciones del for interno se mostrarían dos asteriscos (en consecuencia se mostrarían en
total dos asteriscos). Finalizada la ejecución del for interno, la sentencia System.out.println ( ) nos
permite hacer un salto de línea, es decir, pasar a la tercera fila y así sucesivamente hasta llegar a la
última fila.
En nuestro caso la última fila es 5 (i=5) y se necesita mostrar 5 asteriscos.Esto se cumple, ya que para
i=5, los valores válidos para j serían j=1, j=2, j=3, j=4 y j=5, por lo que el for interno se ejecutaría cinco
veces y en cada una de las ejecuciones del for interno se mostraría un asterisco (en consecuencia
se mostrarían en total cinco asteriscos). Luego se hace un salto de línea y se finaliza la ejecución.
Los siguientes siete problemas son una variación de este problema. Analice sus respectivas
soluciones y desarrolle sus propias observaciones.
536 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 131
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
1
1 2 Nota: En la figura mostrada, el número de filas
= 5. Asumir que el número de filas puede variar
1 2 3
desde 2 hasta 9 y que entre los números no
1 2 3 4 existen espacios en blanco.
1 2 3 4 5
Clase PrgTriangulo02
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println ( “ Ingresar el número de filas de la figura”);
System.out.print ( “ Valores válidos desde 2 hasta 9: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
Problema 132
Enunciado:
Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
1
Nota: En la figura mostrada, el número de filas = 5.
2 2
Asumir que el número de filas puede variar desde 2
3 3 3 hasta 9 y que entre los números no existen espacios
4 4 4 4 en blanco.
5 5 5 5 5
Clase PrgTriangulo03
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println ( “ Ingresar el número de filas de la figura”);
System.out.print ( “ Valores válidos desde 2 hasta 9: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
Problema 133
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
5
Nota: En la figura mostrada, el número de filas
5 4
= 5. Asumir que el número de filas puede variar
5 4 3 desde 2 hasta 9 y que entre los números no
5 4 3 2 existen espacios en blanco.
5 4 3 2 1
Clase PrgTriangulo04
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println (“ Ingresar el número de filas de la figura ”);
System.out.print ( “ Valores válidos desde 2 hasta 9: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
Problema 134
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
Clase PrgTriangulo05
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println (“ Ingresar el número de filas de la figura ”);
System.out.print ( “ Valores válidos desde 2 hasta 9: ” );
totalFilas = Lectura.leerInt ( ) ;
Problema 135
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
Clase PrgTriangulo06
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0 , i = 0 , j = 0 , k = 0 ;
do {
System.out.println (“ Ingresar el número de filas de la figura ”);
System.out.print (“ Valores válidos desde 2 hasta 9: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
Problema 136
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
Clase PrgTriangulo07
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println (“ Ingresar el número de filas de la figura ”);
System.out.print (“ Valores válidos desde 2 hasta 20: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
Problema 137
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
Clase PrgTriangulo08
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0 , i = 0 , j = 0 , k = 0 ;
do {
System.out.println (“ Ingresar el número de filas de la figura ”);
System.out.print (“ Valores válidos desde 2 hasta 9: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
Problema 138
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
Clase PrgTriangulo09
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println (“ Ingresar el número de filas de la figura ”);
System.out.print ( “ Valores válidos desde 2 hasta 20: ”);
totalFilas = Lectura.leerInt ( ) ;
for ( j = 1 ; j < i ; j ++ ) {
System.out.print ( “ ” ) ;
}
for ( j = i ; j <= totalFilas ; j ++ ) {
System.out.print ( “*” ) ;
}
System.out.println ( ) ;
}
}
}
Intente mejorar la solución anterior (en lugar de usar tres sentencias for utilice solo dos); si no lo consigue,
analice la siguiente solución.
544 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgTriangulo09Mejorado
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println ( “ Ingresar el número de filas de la figura ” ) ;
System.out.print ( “ Valores válidos desde 2 hasta 20: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
if (totalFilas < 2 || totalFilas > 20 ) {
System.out.println ( “ Valor de fila no válido… Reintente!.” ) ;
}
Problema 139
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
*
* * Nota: La cantidad de asteriscos que tiene la figura al
* * * lado derecho es el dato que se debe ingresar. Dicho
dato debe tener un valor entre 2 y 20. En la figura,
* * * *
el lado = 5. No existen espacios en blanco entre los
* * * * * asteriscos.
Clase PrgTriangulo10
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println ( “ Ingresar el número de filas de la figura ”);
System.out.print ( “ Valores válidos desde 2 hasta 20: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
if (totalFilas < 2 || totalFilas > 20 ) {
System.out.println (“Valor de fila no válido… Reintente!.”);
}
Intente mejorar la solución anterior, de tal forma que cambie el for interno por el siguiente for:
Clase PrgTriangulo10Mejorado
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println ( “ Ingresar el número de filas de la figura”);
System.out.print ( “ Valores válidos desde 2 hasta 20: ” ) ;
totalFilas = Lectura.leerInt ( ) ;
Problema 140
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
*
* * Nota: En la figura mostrada, el número
* * * de filas = 5. Asumir que el número de filas
puede variar desde 2 hasta 20 y que entre los
* * * *
asteriscos existe un espacio en blanco.
* * * * *
Clase PrgTriangulo11
package dominioDeLaAplicacion ;
import biblioteca.* ;
int totalFilas = 0, i = 0, j = 0 ;
do {
System.out.println ( “ Ingresar el número de filas de la figura ” ) ;
System.out.print ( “ Valores válidos desde 2 hasta 20: ” ) ;
totalFilas = Lectura.leerInt() ;
Análisis de la solución:
Se ingresa el número de filas que va a tener la figura y se almacena en la variable totalFilas, la cual
puede variar desde 2 hasta 20. Para nuestra explicación asumiremos que el valor de totalFilas=5.
El primer for (como en todos los casos anteriores) está justificado y se ejecuta la misma cantidad de
veces que el número de filas de la figura. Cada vez que se ejecute el primer for se debe asegurar que
se muestren los asteriscos necesarios.
Para fila=5:
Es necesario mostrar un asterisco en la primera fila (i=1), un asterisco, un espacio en blanco y otro
asterisco en la segunda fila (i=2) y así sucesivamente hasta llegar a la última fila (para nuestro caso
hasta la quinta fila → i=5). Pero si se observa bien la figura, se debe tener en cuenta la ubicación de
los asteriscos en cada fila, lo cual complica la lógica de la solución.
Es necesario encontrar algunos parámetros para establecer una constante matemática (una relación
matemática) que permita mostrar adecuadamente la figura. Para realizar un mejor análisis, se van
a representar los espacios en blanco de la figura con un guión - (esto para visualizar la cantidad de
espacios en blanco necesarios en cada fila).
*
- - - *- * Nota: Los guiones representan
- - *- *- * espacios en blanco. Entre un guión y un
- -* -* -* * asterisco no hay ningún símbolo.
- * *- *- *- *
- - - -
Ahora, se realizará una división imaginaria en la figura y se separarán los espacios en blanco ubicados
a la izquierda del primer asterisco de cada fila.
En la parte donde están ubicados los asteriscos y los espacios en blanco entre los asteriscos, es
necesario buscar una relación matemática. Para esto, se debe incluir un espacio en blanco al final de
cada una de las filas de la figura.
*
- - - *- -*
- - -* -* *-
- -* -* -* *-
- * *- *- *- -* Una pareja (formada por un asterisco y un
- - - - - espacio en blanco).
Nota: Se determina que existe una relación en la parte donde están ubicados los asteriscos y espacios en
blanco entre los asteriscos. En la primera fila (i=1) se muestra un asterisco y un espacio en blanco (una pareja
“*-”), en la segunda fila dos parejas y así sucesivamente hasta llegar a la última fila donde se muestran cinco
parejas.
Al analizar la figura, se determina que hay dos partes independientes, por lo que se necesita emplear
dos for internos.
El primer for interno permite mostrar los espacios en blanco ubicados antes del primer asterisco de
cada una de las filas.
Para fila=5:
El segundo for interno permite mostrar los asteriscos y los espacios en blanco ubicados después de
cada uno de los asteriscos en cada una de las filas:
Para fila=5:
Intente mejorar la solución anterior (en lugar de usar tres sentencias for utilice solo dos), sino lo consigue
analice la siguiente solución.
550 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgTriangulo11Mejorado
package dominioDeLaAplicacion ;
import biblioteca.* ;
do {
System.out.println ( “ Ingresar el número de filas de la figura ”);
System.out.print ( “ Valores válidos desde 2 hasta 20: ” ) ;
totalFilas = Lectura.leerInt() ;
if (totalFilas < 2 || totalFilas > 20 ) {
System.out.println ( “ Valor de fila no válido… Reintente!. ”);
}
Análisis de la solución:
Imagínese ahora al triángulo como si este fuera un rectángulo (complete con guiones los espacios
en blanco que tendría la figura si fuera un rectángulo). La variable i va a representar cada una de las
filas, mientras que la variable j va a representar cada una de las columnas.
j
*
- - - *- -* - - -
Nota: Los guiones representan espacios en blanco.
- - *- *- *- - -
Entre un guión y un asterisco no hay ningún símbolo.
i - -* *- *- * -
- * *- *- *- *-
- - - -
El primer for controla el número de filas que se mostrarán (desde i=1 hasta i=totalFilas).
El segundo for (for interno) se ejecuta para cada una de la filas y controla el número de símbolos
(asteriscos o espacios en blanco) que se van a mostrar (en total se deben mostrar totalFilas * 2 –
1 símbolos). En el for interno hay una sentencia if que nos permite determinar el símbolo que se
mostrará.
CAP. 5: Estructuras lógicas combinadas 551
Ahora, intente mejorar la solución. Utilice el primer planteamiento desarrollado. Analice nuevamente
el siguiente gráfico:
*
- - - *- -*
- - -* -* *-
- -* -* -* *-
- * *- *- *- -*
- - - - -
También:
Problema 141
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
*
Nota: Desarrollar la figura con la estructura
* * de repetición MIENTRAS (while). El lado del
* * * rombo debe tener un valor entre 2 y 10. En la
* * * * figura, el lado = 4.
* * *
* *
*
Clase PrgRombo01
package dominioDeLaAplicacion ;
import biblioteca.* ;
do {
totalFilas = Lectura.leerInt ( ) ;
System.out.println ( ) ;
diagonal = totalFilas * 2 - 1 ;
while ( i <= diagonal ) {
j = 1 ;
while ( j <= diagonal ) {
if ( j < totalFilas - cont || j > totalFilas + cont )
// Se muestra un espacio en blanco.
System.out.print ( “ ” ) ;
else {
// Se muestra un asterisco y un espacio en blanco.
System.out.print ( “* ” ) ;
j ++ ;
CAP. 5: Estructuras lógicas combinadas 553
}
j ++ ;
}
if ( i < totalFilas )
cont ++ ;
else
cont - - ;
System.out.println ( ) ;
i ++ ;
}
}
}
Analice la solución del problema y anote sus conclusiones. Intente resolverlo utilizando la sentencia for de
Java.
Problema 142
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
1
2 2 Nota: La figura mostrada es un rombo de
3 3 3 número. Ingresar un valor entero desde 2 hasta 9
4 4 4 4 que representa el número de elementos de la fila
3 3 3 central. En la figura, el dato = 4
2 2
1
Clase PrgRombo02
package dominioDeLaAplicacion ;
import biblioteca.* ;
Modifique está solución utilizando la estructura de repetición while en lugar de la estructura for.
Problema 143
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
* * * * *
* * Nota: En la figura mostrada, el número de
* * filas = 5. Asumir que el número de filas puede
* * variar desde 2 hasta 15.
* * * * *
Clase PrgFiguraA
package dominioDeLaAplicacion ;
import biblioteca.* ;
int lado = 0;
System.out.println ( “ Programa que realiza un cuadrado hueco\n ” ) ;
System.out.print ( “ Ingrese lado del cuadrado entre [2,15]: ” ) ;
do {
CAP. 5: Estructuras lógicas combinadas 555
lado = Lectura.leerInt ( ) ;
Problema 144
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
Clase PrgFiguraB
package dominioDeLaAplicacion ;
import biblioteca.* ;
int lado = 0 ;
do {
lado = Lectura.leerInt ( ) ;
556 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
System.out.println ( ) ;
Problema 145
Enunciado: Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
*
Nota: El dato de ingreso debe ser la cantidad de
* *
asteriscos que tiene la base. La base debe tener un
* * valor impar entre 3 y 25. En la figura, la base = 9.
* *
* * * * * * * * *
Clase PrgFiguraC
package dominioDeLaAplicacion ;
import biblioteca.* ;
System.out.println ( ) ;
medio = base / 2 + 1 ;
CAP. 5: Estructuras lógicas combinadas 557
IMPORTANTE
Se recomienda solucionar los problemas del 61 al 70, planteados
al final del presente capítulo.
PUNTO APARTE
5.4 dEsaRROllO dE miniaPliCaCiOnEs java (aPPlET) UTilizandO java dEvElOPmEnT KiT ( jdK )
Se pueden ejecutar los applets Swing (JApplet) en cualquier navegador que tenga instalado el Java
Plug-in (http://java.sun.com/products/plugin/). Si tiene instalado dicho plug-in, solo deberá crear una
pequeña página HTML que cargue el applet Swing en el navegador.
A continuación, se muestra un ejemplo de cómo crear la página HTML que permita cargar la clase
PrgBienvenida2.class creada en el problema 7.
<HTML>
<HEAD>
</HEAD>
<BODY>
Applet del PROBLEMA 048
<p>
<APPLET CODE=“PrgBienvenida2.class” WIDTH=320 HEIGHT=350
</APPLET>
</BODY>
Luego, deberá hacer doble clic con el botón izquierdo del mouse de la computadora sobre este archivo y se
ejecutará el navegador de internet que tenga en su computadora y cargará el applet cuyo nombre este en el
TAG <APPLET CODE con el ancho y altura especificado en los TAG WIDTH y HEIGHT.
Otras opciones para ejecutar los applets Swing (JApplet) es utilizar un navegador que sea complatible
con el JDK 1.1 y que utilice las clases Swing (Los dos navegadores Java distribuidos con el JDK 1.1 son
HotJava browser [http://java.sun.com/products/hotjava/] y el AppletViewer) o un navegador que sea
compatible con el JDK 1.2 (El navegador Java distribuido con el JDK 1.2 es el AppletViewer versión 1.2).
558 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
En el presente texto se ha utilizado el AppletViewer 1.2 (Por esta razón, en el título de las ventanas
de los diferentes problemas resueltos se puede apreciar el nombre de la utilidad AppletViewer.
Debe comprender que el applet solo es lo que se muestra al interior de la ventana, de la utilidad
AppletViewer).
Para ejecutar el AppletViewer puede crear un archivo por lotes. Dicha aplicación también se encuentra
almacenada en la carpeta bin, de la carpeta donde se instaló el JDK. Recuerde solo invocar el archivo
HTML cuando ejecuta el AppletViewer.
Por ejemplo, si quiere ejecutar la miniaplicación creada en Java para la solución del problema 79,
deberá crear el siguiente archivo HTML:
<HTML>
<HEAD>
</HEAD>
<BODY>
Applet del PROBLEMA 079
<p>
<APPLET CODE=“PrgPromedio.class” WIDTH=320 HEIGHT=370
</APPLET>
</BODY>
</HTML>
Segundo, deberá ejecutar el archivo HTML creado, utilizando el AppletViewer. En este punto es
recomendable crear un archivo por lotes.
Observe la creación de un archivo por lotes en la plataforma MS-Windows y cómo se utilizan los programas
javac.exe para compilar el archivo “PrgPromedio.java” y appletviewer.exe para ejecutar el archivo “PrgPromedio.
htm”, ambos almacenados en la carpeta “C:\aplicaciones\dominioDeLaAplicacion” en la etapa de EDICIÓN. Como
ejemplo; el archivo por lotes será grabado con el nombre “PrgPromedio.bat” en la carpeta “C:\aplicaciones”.
Observe, además que al ejecutar este archivo por lotes de Windows (se ejecuta haciendo doble clic sobre el archivo),
se crea el archivo class en la carpeta “C:\aplicaciones\dominioDeLaAplicacion” y se ejecuta la miniaplicación en
el AppletViewer.
CAP. 5: Estructuras lógicas combinadas 559
ENUNCIADO
DEL
PROBLEMA
MODELAMIENTO MODELAMIENTO
}|Determinar la }|Determinar el }|Codificar el diseño
información deseada nombre del proyecto. de la solución del
(salida). }|Definir el paquete problema. Utilizar
}|Determinar los datos y las clases que el lenguaje de
de entrada (entrada). formarán parte programación Java.
de la solución del Utilice la clase
}|Establecer como
problema. Utilice reutilizable LE.
se solucionará el
problema (proceso). UML.
}|Definir las clases
que serán parte
de la solución del
problema. Utilice
UML.
ALGORITMO
}|Diseñar el algoritmo
para el método
principal. Utilizar
el diagrama de
actividades.
560 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 146
Enunciado: En base al enunciado del problema 103, ingresar las tres notas de los alumnos de un
salón de clase. Calcular y mostrar el promedio de notas de cada alumno. Adicionalmente, si el
alumno obtiene un promedio final mayor a 16, se deberá visualizar un mensaje de felicitaciones.
Consistenciar el ingreso de las notas y desarrollar la codificación en el lenguaje de programación
Java. Finalmente, utilice la clase LE para ingresar datos y mostrar la información.
Definir el nombre del proyecto, luego desarrollar la definición del paquete y las clases, y el diagrama
de actividad.
Clase PrgPromedio
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgPromedios {
String mensaje ;
double nota1 , nota2 , nota3 ;
double promedio ;
int numAlu ;
do {
numAlu = LE.leerInt ( “Ingrese la cantidad de alumnos” ) ;
if ( numAlu < 1 ) {
LE.mostrarInformacion ( “Cantidad no válida” ) ;
}
do {
if ( promedio > 16 ) {
mensaje += “\n\nFelicitaciones” ;
} else {
mensaje += “ ” ;
}
LE.mostrarInformacion ( mensaje ) ;
System.exit ( 0 ) ;
}
}
Resultado:
Problema 147
Enunciado: En base al enunciado del problema 105, ingresar la categoría y el sueldo de todos los
trabajadores de una empresa. Calcular el aumento correspondiente teniendo en cuenta la siguiente
tabla. Mostrar el nuevo sueldo de cada uno de los trabajadores. Consistenciar el ingreso de los
datos. Desarrollar la codificación en el lenguaje de programación Java. Finalmente, utilzar la clase
LE para ingresar datos y mostrar información.
Categoría Aumento
1 25%
2 15%
3 10%
4 05%
Definir el nombre del proyecto, luego desarrollar la definición del paquete y las clases, y el diagrama
de actividad.
562 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgSueldoCategoria
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgSueldoCategoria {
public static void main ( String arg [ ] ) {
do {
numTrab = LE.leerInt ( “Ingrese la cantidad de trabajadores” ) ;
if ( numTrab <= 0 ) {
LE.mostrarError ( “Cantidad no válido” ) ;
}
do {
categoria = LE.seleccionarOpcionIndex (
“Categoría del trabajador ” + ( i + 1 ) , “” , opcs ) ;
do {
sueldo = LE.leerDouble ( “Sueldo del trabajador ” + ( i + 1 ) ) ;
} while ( sueldo <= 0 ) ;
switch ( categoria ) {
case 1 :
sueldo = sueldo * 1.25 ;
break ;
case 2 :
sueldo = sueldo * 1.15 ;
break ;
case 3 :
sueldo = sueldo * 1.10 ;
break ;
case 4 :
sueldo = sueldo * 1.05 ;
}
LE.mostrarInformacion ( “El nuevo sueldo es: ” + sueldo ) ;
}
System.exit ( 0 ) ;
}
}
CAP. 5: Estructuras lógicas combinadas 563
Resultado:
Problema 148
Etapa 01 - Descripción del problema
Enunciado: En base al enunciado del problema 107, ingresar las tres notas de los alumnos de
un salón de clase. Mostrarlas ordenadas ascendentemente y el promedio final de cada alumno.
Adicionalmente, mostrar el promedio de notas de todos los alumnos, consistenciar el ingreso de las
notas y desarrollar la codificación en el lenguaje de programación Java. Finalmente, utilice la clase
LE para ingresar los datos y mostrar la información.
Definir el nombre del proyecto, luego desarrollar la definición del paquete y las clases, y el diagrama
de actividad.
Clase PrgNotas
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgNotas {
String opcs [ ] = { “0” , “1” , “2” , “3” , “4” , “5” , “6” , “7” ,
“8” , “9” , “10” , “11” , “12” , “13” , “14” , “15” , “16” , “17” ,
“18” , “19” , “20” } ;
String mensaje ;
564 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
do {
do {
nota1 = LE.seleccionarOpcionIndex ( “Nota1 del alumno ” +
( i + 1 ) , “” , opcs ) ;
} while ( nota1 == -1 ) ;
do {
nota2 = LE.seleccionarOpcionIndex ( “Nota2 del alumno ” +
( i + 1 ) , “” , opcs ) ;
} while ( nota2 == -1 ) ;
do {
nota3 = LE.seleccionarOpcionIndex ( “Nota3 del alumno ” +
( i + 1 ) , “” , opcs ) ;
} while ( nota3 == -1 ) ;
LE.mostrarInformacion ( mensaje ) ;
sumaTotal += promedio ;
}
}
Resultado:
566 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 149
Enunciado: En base al enunciado del problema 109, desarrollar un menú con las siguientes opciones:
Consistenciar el ingreso de todos los datos. Considerar que para la solución de este problema,
primero se deberá visualizar solo las opciónes 1 y 4. Después de ingresar el número, se deberá
visualizar todas las opciones.
Definir el nombre del proyecto, luego desarrollar la definición del paquete y las clases, y el diagrama
de actividad.
Clase PrgMenuNumero
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgMenuNumero {
public static void main ( String arg [ ] ) {
menu = menu1 ;
CAP. 5: Estructuras lógicas combinadas 567
do {
opc = LE.leerInt ( menu ) ;
switch ( opc ) {
case 1 :
do {
num = LE.leerInt ( “Ingrese un número: ” ) ;
if ( num <= 0 ) {
LE.mostrarError ( “Número no válido... ” ) ;
}
} while ( num <= 0 ) ;
menu = menu2 ;
sw = 1 ;
break ;
case 2 :
if ( sw == 1 ) {
numTmp = num ;
numCifras = 0 ;
case 3 :
if ( sw == 1 ) {
if ( num % 2 == 0 ) {
mensaje = “El número es par ” ;
} else {
mensaje = “El número es impar ” ;
}
LE.mostrarInformacion ( mensaje ) ;
} else {
LE.mostrarError ( “Ingrese la opción 1” ) ;
}
break ;
case 4 :
break ;
default :
LE.mostrarError ( “Opción no válida. Reintente! ” ) ;
}
} while ( opc != 4 ) ;
System.exit ( 0 ) ;
}
}
568 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 150
Enunciado: En base al enunciado del problema 141. Desarrollar la codificación de una solución que
permita mostrar la siguiente figura:
*
* * Nota: Desarrollar la figura con la estructura
* * * de repetición MIENTRAS (while). El lado del
* * * * rombo debe tener un valor entre 2 y 10. En
la figura, el lado = 4.
* * *
* *
*
Definir el nombre del proyecto, luego desarrollar la definición del paquete y las clases, y el diagrama
de actividad.
package dominioDeLaAplicacion ;
import biblioteca.* ;
do {
totalFilas = LE.leerInt ( texto ) ;
if ( i < totalFilas )
cont++ ;
else
cont-- ;
Resultado:
IMPORTANTE
Ahora, se recomienda solucionar los problemas planteados al
final del capítulo, utilizando la clase reutilizable LE.
570 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
PROBLEMAS PROPUESTOS
1. Ingresar dos números y determinar cuántos son primos y cuántos son múltiplos de 3. Consistenciar
el ingreso de los datos.
2. Ingresar diez números y determinar el promedio de los números que tienen menos de tres cifras.
Consistenciar el ingreso de los datos.
3. Ingresar cinco números a través del teclado. Intercambiar la primera cifra con la última cifra y
mostrar los nuevos números. Consistenciar el ingreso de los datos.
4. Ingresar diez números a través del teclado y determinar cuántos números tienen una cifra, cuántos
números tienen dos cifras y cuántos tienen más de dos cifras. Consistenciar el ingreso de los datos.
5. Ingresar las cinco notas de todos los alumnos de un salón de clase. Calcular y mostrar el promedio
de notas de cada alumno. Adicionalmente, si el alumno obtiene un promedio final mayor a 14 se
deberá visualizar un mensaje de felicitaciones. Si está aprobado y tiene un promedio final menor
o igual a 14, un mensaje de aprobado. Consistenciar el ingreso de las notas.
6. Ingresar todas las notas de todos los alumnos de un salón de clase. Calcular y mostrar el promedio
de notas de cada alumno. Adicionalmente, si el alumno obtiene un promedio final menor a 11 se
deberá visualizar un mensaje de desaprobado. En caso que el alumno obtenga un promedio final
de 20, mostrar un mensaje de felicitaciones por excelencia. Consistenciar el ingreso de las notas.
7. Calcular y mostrar el sueldo de todos los trabajadores de una empresa conociendo el número de
horas trabajadas y su tarifa horaria. Se sabe que se descontará 15 % por concepto de impuestos si
este es mayor a S/. 2600.00. Consistenciar el ingreso de los datos.
8. Calcular y mostrar el sueldo de todos los trabajadores de una empresa conociendo el número de
horas trabajadas y su tarifa horaria. Se sabe que se aumentará el 12 % por reintegros varios y se
debe descontar 18 % por concepto de impuestos, si el sueldo es mayor a S/. 3200.00. Consistenciar
el ingreso de los datos.
9. Calcular el sueldo de todos los trabajadores de una empresa si se conoce el número de horas
trabajadas y su tarifa horaria. Ingresar la categoría de cada trabajador de la empresa y calcular el
aumento correspondiente, teniendo en cuenta la siguiente tabla. Mostrar el sueldo, el aumento y
el nuevo sueldo de cada uno de los trabajadores. Consistenciar el ingreso de los datos.
Categoría Aumento
1 23 %
2 18 %
3 13 %
CAP. 5: Estructuras lógicas combinadas 571
10. Calcular el sueldo de todos los trabajadores de una empresa conociendo el número de horas
trabajadas (la tarifa por hora es de S/. 15.00). Ingresar la categoría de cada trabajador de la
empresa y calcular el descuento correspondiente teniendo en cuenta la siguiente tabla.
Mostrar el sueldo, el descuento y el nuevo sueldo de cada uno de los trabajadores. Consistenciar
el ingreso de los datos.
Categoría Descuento
1 2%
2 6%
3 9%
4 11 %
5 12 %
11. Desarrollar una solución que permita determinar el sueldo bruto (sueldo antes del descuento),
el descuento y el sueldo neto (sueldo – descuento) de todos los vendedores de una empresa. La
empresa paga a sus vendedores por horas trabajadas. Hasta por 30 horas trabajadas se paga una
tarifa normal y sobre las 30 horas se paga un adicional de 18 %. Por otro lado, si el sueldo bruto es
superior a S/. 1820.00, el sueldo del trabajador estará sujeto a un descuento de 12 %. Ingresar las
horas trabajadas y la tarifa de cada vendedor.
12. Calcular y mostrar el costo que representa un paciente y el costo total que representan todos
los pacientes para un hospital de la gran ciudad, según los datos de la tabla. Adicionalmente,
considerar que los pacientes mayores de edad que tienen la enfermedad tipo 3 tienen un
descuento de 12 % y los pacientes de sexo femenino tienen un descuento de 10 %. Consistenciar
el ingreso de los datos.
13. Calcular y mostrar el costo que representa un paciente y el costo total que representan todos los
pacientes para una clínica prestigiosa, según los datos de la tabla. Adicionalmente, considerar
que los pacientes menores de 30 años tienen un descuento de 23 % si se realizan las operaciones
tipo 1 y 3. Los pacientes mayores de 60 años tienen un recargo de 20 % por cualquiera de las
operaciones y los pacientes de sexo femenino tienen un descuento de 10 % solo en el tipo de
operación 4. Consistenciar el ingreso de los datos.
Tipo de operación Costo por paciente
1 1200
2 2400
3 3200
4 5400
5 12 000
14. Ingresar la categoría y el precio de todos los productos de un supermercado. Calcular el descuento
correspondiente teniendo en cuenta la siguiente tabla. Mostrar el nuevo precio de cada uno de los
productos. Consistenciar el ingreso de los datos.
Categoría Descuento
1 13 %
2 11 %
3 09 %
572 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
15. Ingresar el precio de compra y el precio de venta de todos los productos de un supermercado.
Calcular el descuento en base a la utilidad de cada producto teniendo en cuenta la siguiente tabla
y mostrar el nuevo precio de cada uno de los productos. Finalmente, verificar el ingreso de los
datos.
Utilidad Descuento
Menor o igual que 100 5%
Mayor que 100 y menor que 1000 9%
Mayor o igual que 1000 12 %
Considerar que para la solución del problema, primero se deberá visualizar solo la opción 1 y 4.
Una vez ingresada la base y altura de un triángulo se deberá visualizar todas las opciones
Considerar que para la solución de este problema, primero se deberá visualizar solo la opción 1 y
7. Después de ingresar el número se deberá visualizar todas las opciones.
Considerar que para la solución de este problema, previamente se deberá visualizar solo la opción
1 y 6. Después de ingresar el nombre, se deberá visualizar todas las opciones.
19. En una frutería se venden productos de calidad de exportación, en base a la siguiente tabla , hallar
lo siguiente:
CAP. 5: Estructuras lógicas combinadas 573
20. En una tienda de autopartes para automóviles se venden diversos productos. Los descuentos se
aplican de acuerdo a la siguiente tabla:
Desarrollar una solución que fije el monto de compra de cada tipo de producto, el monto del descuento
de cada tipo de producto y el monto total a pagar por la compra. Ingresar el tipo de producto y la
cantidad de porciones que se quiere comprar. El usuario podrá realizar varios pedidos en la misma
compra. Adicionalmente, determinar el monto total pagado por todos los clientes.
21. Desarrollar una solución para el siguiente problema. Se desea hacer una estadística de las estaturas
de 1000 alumnos de un colegio, de acuerdo a lo siguiente:
}|Alturas hasta 1,60 metros.
}|Alturas entre 1,60 metros y 1,70 metros.
}|Alturas entre 1,70 metros y 1,80 metros.
}|Alturas mayores de 1,80 metros.
22. Calcular y mostrar el número de alumnos que tienen como promedio final menos de 11; los que
tienen un promedio final entre 11 y 14; aquellos que tienen un promedio final entre 15 y 17; y los
que tienen un promedio final mayor de 17. Ingresar las cuatro notas y calcular el promedio del
alumno en base a la siguiente fórmula: nf = (n1 + n2 + n3 + (n4 * 2)) / 5.
23. Calcular la nota media de los alumnos de una clase considerando “n” alumnos y “c” notas.
574 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
24. Un canillita vende cuatro tipos de loterías. Calcular el total de loterías vendidas de cada tipo, según
se muestra en el cuadro.
25. En una empresa se decide hacer una colecta de dinero, con la finalidad de ayudar a uno de los
empleados de la empresa que ha sufrido un accidente automovilístico. Se determina que los
gerentes contribuirán con S/. 35.00, los profesionales con S/. 25.00 y el resto de empleados de
acuerdo a sus posibilidades. Determinar el total recaudado.
26. Desarrollar una solución que permita emitir la factura correspondiente a la compra de varios
artículos. El IGV a aplicar es de 18 % y si el monto total de la factura incluido el IGV es mayor a S/.
3000.00, se aplicará un descuento de 12 %.
27. Desarrollar una solución para el siguiente menú con las opciones solicitadas.
}|[1] Ingreso de datos (base y altura de un rectángulo).
}|[2] Proceso (determinar área y perímetro del rectángulo).
}|[3] Resultado (Mostrar el valor de área y perímetro obtenidos).
}|[4] Terminar.
28. Desarrollar una solución para el siguiente problema. Los empleados de una fábrica trabajan en
tres turnos: mañana, tarde y noche. Se desea calcular el jornal diario de cada empleado teniendo
en cuenta lo siguiente:
}|La tarifa del turno mañana y tarde es de S/. 8.00 por hora.
}|La tarifa del turno noche es de S/. 10.00 por hora.
}|En caso de ser un día domingo, la tarifa se incrementa en 50 % para los turnos mañana y tarde y
en 60 % para el turno noche.
}|Para el turno tarde se incrementa S/. 10.00 por concepto de movilidad.
29. Desarrollar una solución que permita controlar la venta de boletos en un determinado día en un
teatro de la capital, en base a la siguiente información:
}|Al comenzar, se leerá una sola vez el precio de entrada de las zonas palco, platea y mezanine.
}|Por cada entrada vendida se leerán los siguientes datos: número de boleto y lugar (puede ser
platea, palco o mezanine).
}|El programa terminará cuando el número de boletos sea igual a cero.
}|Antes de finalizar, se deberá proporcionar la siguiente información:
||Número total de entradas vendidas durante el día.
CAP. 5: Estructuras lógicas combinadas 575
30. Desarrollar una solución que permita obtener la siguiente información en un salón de clase:
}|¿Cuántas alumnas están matriculadas en el curso?
}|¿Cuántos alumnos están matriculados en el curso?
}|¿Cuántas alumnas son menores de 20 años?
}|¿Cuántos alumnos son mayores de 18 años?
}|¿Cuántos alumnos están aprobados?
}|¿Cuántas alumnas están desaprobadas?
31. Desarrollar una solución que permita ingresar los nombres y las edades de “n” alumnos. Determinar
la suma de las edades, el nombre del alumno con la mayor ........... y el nombre del alumno con la
menor ..........
32. Desarrollar una solución que permita determinar la nota final obtenida por cada uno de los
alumnos del curso de álgebra del colegio “La Excelencia” (considere tres notas). Adicionalmente,
deberá indicar el porcentaje de alumnos aprobados, desaprobados, la nota final más baja y la más
alta. Ingresar la cantidad de alumnos y las tres notas de cada alumno.
33. Desarrollar una solución que permita determinar el costo de cada uno de los artículos que se
venden en la bodega “La china” (considere el precio de venta y la utilidad obtenida por el artículo).
Adicionalmente, deberá indicar el promedio del costo de todos los artículos, el articulo más costoso
y el más barato. Finalmente ingresar el nombre, el precio de venta y la utilidad de cada artículo.
34. Desarrollar una solución para el siguiente problema. En la fábrica “La Clonación S.A.” trabajan
unos miles de obreros y se desea determinar cuántos tienen un salario menor a S/. 500.00, entre
S/. 500 00 y S/. 2200.00 (incluidos S/. 500.00 y S/. 2200.00) y cuántos tienen un salario mayor a
S/. 2200.00.
35. Desarrollar una solución que permita calcular y mostrar el costo total que representan los pacientes
de un hospital de acuerdo al tipo de enfermedad, según los datos de la tabla. Adicionalmente,
deberá considerar que los pacientes menores de 18 años implican un costo adicional de 35 % y las
mujeres un costo adicional de 12 %.
36. Desarrollar una solución para el siguiente problema. El cine “Pantalla Láser” cuenta con tres salas y
atiende en horarios de matiné, vermouth y noche. Calcular el número de personas que ingresaron
a cada una de las salas, en cada uno de los horarios en un determinado día. (Ingresar solo los
siguientes datos: número de sala y el horario al cual el cliente ingresa).
37. Desarrollar una solución para el siguiente problema. Una empresa cuenta con cuatro almacenes
de productos. ¿Cuál sería la ganancia por cada almacén si el dueño de la empresa decide vender
todos sus productos? (Ingresar solo los siguientes datos: el precio de compra de cada producto, el
precio de venta, la cantidad existente y el almacén donde están ubicados).
38. Desarrollar una solución que permita determinar cuántas hamburguesas de cada tipo fueron
vendidas (considere tres tipos) en cada uno de los tres locales de la empresa “El Rápido”. Deberá
ingresar el tipo de hamburguesa y el local en el que fue vendida.
39. Desarrollar una solución que permita determinar cuántos tipos de productos de cada empresa
de apoyo social fueron vendidos por la comunidad “La buena venta” durante el presente año
(considere solo tres empresas de apoyo social y asuma que cada empresa fabrica tres tipos de
productos; chocolate, caramelo y gaseosa). Ingresar el producto vendido y la empresa que lo
fabricó.
40. Desarrollar una solución que permita determinar cuántos tipos de periódicos de cada empresa
fue vendido por José Luis Candado, quien ganó el premio al mejor canillita 1999 otorgado por
un diario de la capital (considerar solo tres empresas periodísticas y asumir que cada empresa
desarrolla tres tipos de diario: popular, normal y especializado). Ingresar el tipo de diario vendido
y la empresa a la cual pertenece.
41. Desarrollar una solución que permita mostrar un menú con las siguientes opciones:
}|Determinar si un número es par o impar.
}|Determinar si un número es primo o no.
}|Salida.
42. Desarrollar una solución que permita mostrar un menú con las siguientes opciones.
}|Suma, resta y multiplicación de dos números.
}|Determinar el número inverso de un número.
}|Determinar el área y perímetro de un círculo.
}|Salida.
43. Desarrollar una solución que permita ingresar las edades de 10 alumnos. Determinar lo siguiente:
}|La suma de todas las edades.
}|La cantidad de edades impares.
}|El promedio de edades.
}|El promedio de edades pares.
}|La edad mayor.
CAP. 5: Estructuras lógicas combinadas 577
44. Desarrollar una solución que permita ingresar los nombres y sueldos de cinco empleados y
determinar lo siguiente:
}|Sueldo promedio.
}|Menor sueldo.
}|Nombre del empleado con mayor sueldo.
}|Cantidad de nombre que comiencen entre “c y p”.
45. Desarrollar una solución que permita ingresar los valores de una matriz de 4*4. Calcular la suma
de la diagonal y la suma de la diagonal inversa.
46. Desarrollar una solución que permita ingresar los valores de una matriz de 5*4. Intercambiar la
primera columna por la tercera columna e intercambiar la segunda fila por la cuarta fila.
47. Desarrollar una solución que permita almacenar el nombre, la edad y el estado civil de 15
empleados. Elaborar un listado con los datos de los empleados entre 18 y 30 años y otro con los
datos de los empleados solteros.
48. Desarrollar una solución que permita ingresar un número entero de cualquier número de cifras.
Determinar y mostrar el dígito mayor del número ingresado. Finalmente validar el número
ingresado.
49. Desarrollar una solución que permita ingresar 10 nombres. Determinar el número de nombres
cuya primera letra es una letra “c” o una letra “x”. Determinar el nombre que tiene el menor
número de caracteres.
50. Desarrollar una solución que permita leer 10 apellidos, luego determinar cuál es el primer apellido
(según el orden alfabético).
51. Desarrollar una solución que permita leer 10 nombres y determinar cuántos nombres comienzan
entre las letras ‘z’ y ‘p’. Finalmente utilizar un vector.
52. Desarrollar una solución que reciba la fecha con el siguiente formato: 09-30-2004 (mm-dd-aaaa)
y lo convierta a este formato: 30 de septiembre de 2004.
53. Desarrollar una solución que reciba la fecha y hora con el siguiente formato: “dd/mm/aaaa
hh:mm:ss”. Ejemplo: 30/09/2004 18:10:10. Validar que la fecha y la hora tenga el número de
caracteres correctos, así como los símbolos indicados. Finalmente, mostrar los datos de la
siguiente manera: Hoy es 30 de septiembre y son las 6 y 10 de la tarde.
54. Desarrollar una solución que permita leer cuatro números de tres cifras y mostrar su categoría.
Si el número está entre 100 y 300 pertenece a la categoría A, está entre 301 y 600 pertenece a la
categoría B y si está entre 601 y 999 pertenece a la categoría C. Utilizar un vector y validar que el
número ingresado sea de tres cifras.
578 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
55. Desarrollar una solución que permita leer los datos de “n” alumnos. Los datos de los alumnos son:
nombre, fecha de nacimiento (dd/mm/aaaa) y nota.
Se solicita:
}|Ingresar los datos haciendo las validaciones a la fecha (tamaño de fecha y que contenga los
símbolos “/”) y nota.
}|Calcular y mostrar la edad de cada alumno.
}|Hallar:
56. Desarrollar una solución que permita leer los datos de cinco empleados. Los datos de los
empleados son; nombre, fecha de ingreso (dd/mm/aaaa) y sueldo.
Se solicita:
}|Ingresar los datos haciendo las validaciones a la fecha (tamaño de fecha y que contenga los
símbolos “/”) y sueldo.
}|Calcular los años de servicio que tiene trabajando.
}|Hallar:
57. Desarrollar una solución que permita leer los datos de “n” alumnos. Los datos de los alumnos son;
nombre, edad y sexo.
Se solicita:
}|Ingresar los datos validando el sexo y la edad.
}|Por cada alumno mostrar:
||Nombre al revés.
||Ultimo carácter.
||Las tres últimas letras.
}|Cálculos:
58. Desarrollar una solución que permita leer los datos de “n” alumnos. Los datos de los alumnos son;
nombre, fecha de nacimiento (dd/mm/aaaa) y nota.
Se solicita:
59. Desarrollar una solución que permita leer los datos de “n” empleados. Los datos de los empleados
son: nombre, AFP (Integra, Unión y ProFuturo), sueldo básico y fecha de ingreso (dd-mm-aaaa).
Se solicita:
}|Ingresar los datos validando AFP, sueldo y fecha de ingreso.
}|Calcular y mostrar el sueldo total por cada empleado ( sueldo total = sueldo básico – descuentos).
||Si tiene 4 años o más de antigüedad se le descuenta 8 %, además del descuento de la AFP.
||Si tiene menos de 4 años se le descuenta 10 %, además del descuento de la AFP.
||El descuento de la AFP se muestran en la siguiente tabla:
AFP Descuento
Integra 12 %
Unión 13 %
ProFuturo 14 %
}|Cálculos:
60. Desarrollar una solución que permita leer los datos de “n” alumnos. Los datos de los alumnos son;
sexo (M/F), edad y nombre.
Se solicita:
}|Ingresar los datos validando que en el sexo hay dos opciones; “M” o “F” y la edad sea un número
positivo.
}|Mostrar lo siguiente por cada alumno:
||Si es mayor o menor de edad.
||Cantidad de vocales del nombre.
580 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
}|Calcular:
61. Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5
Nota: En la figura mostrada, el número de filas = 5. Asumir que el número de filas puede variar desde 2 hasta
20 y que entre los números no existen espacios en blanco.
62. Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
Nota: En la figura mostrada, el número de filas = 5. Asumir que el número de filas puede variar desde 2 hasta
20, y que entre los números no existen espacios en blanco.
63. Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
&
* *
& & &
* * * *
& & & & &
Nota: En la figura mostrada, el número de filas = 5. Asumir que el número de filas puede variar desde 2 hasta
20, y que entre los números no existen espacios en blanco.
64. Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
* * * * *
* * * *
* * *
* *
*
Nota: En la figura mostrada, el número de filas = 5. Asumir que el número de filas puede variar desde 2 hasta
20, y que entre los asteriscos no existen espacios en blanco.
CAP. 5: Estructuras lógicas combinadas 581
65. Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
- - - - -
* *- *- *- *-
* *- *- *-
* *- *-
* -*
*
Nota: En la figura mostrada, el número de filas = 5. Asumir que el número de filas puede variar desde 2 hasta
20 y que entre los asteriscos no existen espacios en blanco.
66. Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
Nota: En la figura mostrada, el número de filas = 5. Asumir que el número de filas puede variar desde 2 hasta
20, y que entre los asteriscos no existen espacios en blanco.
Observar que en la primera fila se desea mostrar un asterisco y en las siguientes filas; 3, 5, 7… y así
sucesivamente (no hay espacios en blanco entre los asteriscos). Relación: el número de asteriscos a mostrar
en cada fila está dado por la fórmula: totalFilas * 2 - 1.
67. Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
* * * * * * * * *
* * * * * * *
* * * * *
* * *
*
Nota: En la figura mostrada, el número de filas = 5. Asumir que el número de filas puede variar desde 2 hasta
20, y que entre los asteriscos no existen espacios en blanco.
582 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
68. Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
1
2 3
4 5 6
7 8 9 1
2 3 4 5 6
7 8 9 1
2 3 4
5 6
7
Nota: En la figura mostrada, el número de filas = 5. Asumir que el número de filas puede variar desde 2 hasta
20, y que entre los números existen espacios en blanco.
69. Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
2
4 6
8 0 2
4 6 8 0
2 4 6 8 0
2 4 6 8
0 2 4
6 8
0
Nota: En la figura mostrada el número de filas = 5. Asumir que el número de filas puede variar desde 2 hasta
20, y que entre los números existen espacios en blanco.
70. Desarrollar la codificación de una solución que permita mostrar la siguiente figura:
*
& &
* * *
& & & &
* * * * *
& & & &
* * *
& &
*
Nota: En la figura mostrada, el número de filas = 5. Asumir que el número de filas puede variar desde 2 hasta
20, y que entre los símbolos existen espacios en blanco.
CAP.
Introducción al
desarrollo de soluciones
6
o r i e n t a d a s a o b j e to s y a l
u s o d e I n te r f a z G r á f i c a
de Usuario
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 585
Etapa 02
Definición
Solución
Etapa 03
Diseño
Solución
MODELAMIENTO Etapa 04
ALGORITMO Desarrollo
Solución
CODIFICACIÓN
En los capítulos anteriores, se ha utilizado la clase en su forma más simple. Las clases creadas se
utilizaban simplemente para encapsular el método main(), lo que ha permitido mostrar la base de la
sintaxis de Java, las estructuras de datos, las estructuras lógicas y las instrucciones de bifurcación. En
el presente capítulo se presentan las clases en su forma general, describiendo los atributos y métodos,
así como otros conceptos importantes y relacionados a estos temas.
Enunciado: Calcular el promedio final de un alumno. Utilice la siguiente fórmula: prom = (nota1 +
nota2 + nota3) / 3. Ingrese las notas nota1, nota2 y nota3 a través del teclado.
dominioDeLaAplicacion biblioteca
LE
(from biblioteca)
PrgAlumno ||leerString ()
||leerChar ()
||main ()
||leerInt ()
||leerLong ()
||leerFloat ()
||leerDouble ()
||mostrarResultado ()
||mostrarInformacion ()
||mostrarError ()
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 587
INICIO
FIN
Clase PrgPromedio
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgAlumno {
public static void main ( String arg [ ] ) {
double nota1, nota2, nota3, prom ;
nota1 = LE.leerDouble( “Ingrese la nota 1 del alumno ” ) ;
nota2 = LE.leerDouble( “Ingrese la nota 2 del alumno ” ) ;
nota3 = LE.leerDouble( “Ingrese la nota 3 del alumno ” ) ;
prom = ( nota1 + nota2 + nota3 ) / 3 ;
LE.mostrarInformacion ( “ El promedio obtenido por el alumno es ”+prom);
}
}
En este proyecto ProyAlumno se crea un paquete dominioDeLaAplicación con una clase PrgAlumno, que se utiliza
en su forma más simple. En la clase PrgAlumno se define un método main() y dentro del mismo se codifica toda
la solución.
A partir de este punto, se ampliará el conocimiento sobre las clases. Para ello, se revisarán algunos
conceptos básicos y se presentarán en forma progresiva nuevos conceptos hasta llegar al concepto
de ocultamiento de atributos de instancia.
6.1.1 CLASE
Una clase es una implantación de un tipo de objeto. Especifica una estructura de datos (atributos)
y los métodos operativos permisibles que se aplican a cada uno de sus objetos. El mundo real se
modela mediante clases. Una clase es una abstracción que no refiere a ningún objeto en particular;
además, también define un nuevo tipo de objeto.
En Java, una clase se declara utilizando la palabra reservada class. Las clases que se han utilizado
anteriormente son ejemplos muy limitados en los que no aparece su formato general.
class NombreClase {
// ATRIBUTOS
tipo variableInstancia1 ;
tipo variableInstancia2 ;
// ...
tipo variableInstanciaN ;
// METODOS
tipo nombreMetodo1 (listaDeParámetros) {
// cuerpo del método1.
}
//...
Los datos o variables definidos en una clase son llamados atributos. El código está contenido en los
métodos. Los métodos y atributos definidos dentro de una clase son los miembros de la clase.
Los atributos definidos dentro de una clase permiten que los objetos o instancias de una clase
puedan almacenar datos.
Todos los métodos tienen el mismo formato que el método main(), utilizado en los ejemplos
anteriores. Sin embargo, es importante mencionar que muchos métodos, como public, staƟc o
public staƟc no se especificarán.
En el proyecto de solución ProyAlumno se tiene la clase llamada PrgAlumno. Dicha clase tendrá un
método main(). La declaración de esta clase en Java, incluido su método main() es la siguiente:
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 589
package dominioDeLaAplicacion ;
class PrgAlumno {
}
}
Entonces, el proyecto de solución ProyAlumno tiene definida la clase PrgAlumno con un método
main() en el paquete dominioDeLaAplicacion.
Un objeto de soŌware es cualquier cosa real o abstracta en el cual almacenamos datos y los métodos
que los controlan. La definición de un objeto en Java comprende la declaración y la creación del mismo.
Donde:
}|nombreClase es el nombre de la clase que está siendo instanciada. El nombre de la clase seguida
por los paréntesis especifica el método constructor de la clase. Un constructor define que
ocurre cuando se crea un objeto de una clase. La mayoría de las clases del mundo real definen
explícitamente sus propios constructores dentro de la definición clase.
En dicha sentencia, se define el objeto objAlumno01 de la clase PrgAlumno. Para definir otros objetos
de la clase PrgAlumno, solo se tendría que repetir la sentencia y cambiar el nombre del objeto.
Es importante recordar que la definición de una clase solo crea un molde, modelo o patrón a partir del
cual se pueden crear objetos. En cambio, la definición de un objeto crea un objeto real o una instancia
de una clase.
590 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
6.1.3 ATRIBUTO
Hasta este punto se tiene definida la clase PrgAlumno sin atributos, y con solo un método (el método
main()). Ahora, es necesario conocer algunos conceptos básicos sobre los atributos, para luego
definirlos dentro de la clase PrgAlumno.
Los atributos, en principio, sirven para almacenar valores de los objetos que se instancian a partir de
una clase.
A. Atributos de Instancia: Llamados también atributos de objeto; son variables, arreglos u objetos que
almacenan valores distintos para los objetos de una misma clase.
B. Atributos de Clase: Son variables, arreglos u objetos que almacenan el mismo valor para los objetos
de una misma clase.
Es decir que, a partir de un atributo de instancia, se crea una copia por cada objeto que se instancia;
a partir de un atributo de clase, solo se crea una copia de ese atributo para todos los objetos que se
instancien. Si no se especifica lo contrario, los atributos son de instancia. Para declarar un atributo
de clase en Java, se utiliza la palabra reservada staƟc.
tipo nombreAtributo;
Donde:
}|Ɵpo, especifica el tipo de dato que el atributo almacenará. Puede ser cualquier tipo válido,
incluido los tipos de clase.
}|nombreAtributo, especifica el nombre del atributo, que puede ser cualquier identificador válido
diferente a los que se está utilizando en el mismo ámbito.
package dominioDeLaAplicacion ;
class PrgAlumno {
double nota1 ;
double nota2 ;
public static void main ( String args [ ] ) {
}
}
En la clase PrgAlumno solo se han definido dos atributos y el método main(); sin embargo, aún no se
han definido otros métodos. Se agregarán otros métodos a la clase PrgAlumno más adelante.
class PrgAlumno {
double nota1 ;
double nota2 ;
public static void main ( String args [ ] ) {
PrgAlumno objAlumno01 = new PrgAlumno( ) ;
}
}
Cada vez que se define un objeto de una clase, se declara y crea un objeto que contiene una copia de
todos los atributos de instancia definidos para la clase.
En el proyecto de solución ProyAlumno, cada objeto que se defina de la clase PrgAlumno tendrá su
propia copia de los atributos de instancia nota1 y nota2. En consecuencia, el objeto objAlumno01 de
la clase PrgAlumno tendrá su propia copia de los atributos de instancia nota1 y nota2 con un valor
para cada uno de ellos, distinto al valor de las copias de los atributos de instancia que otros objetos
definidos puedan tener.
Cuando se desea acceder a la copia de los atributos de instancia de un objeto se utiliza el operador
punto (.). Este relaciona el nombre del objeto con el nombre de un atributo de instancia.
Por ejemplo, si se desea asignar el valor 15 y 19 a los atributos de instancia nota1 y nota2 del
objeto objAlumno01, se utilizarían las siguientes sentencias:
objAlumno.nota1 = 15 ;
objAlumno.nota2 = 19 ;
Estas sentencias permiten asignar a las copias de los atributos de instancia nota1 y nota2 que
están contenidas en el objeto objAlumno01 los valores 15 y 19 respectivamente.
Si se desea mostrar el valor del atributo de instancia nota1 del objeto objAlumno01 se utilizaría la
siguiente sentencia:
Esta sentencia permite que se muestre el mensaje “La nota del alumno es:” y el valor del atributo
nota1 del objeto objAlumno01.
Estas sentencias permiten obtener el valor de los atributos nota1 y nota2 del objeto objAlumno01
para calcular el promedio de las notas y almacenarlo en la variable prom, para luego mostrar el
mensaje “El promedio final del alumno es:” y el valor de la variable prom calculada.
592 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
package dominioDeLaAplicacion ;
class PrgAlumno {
double nota1 ;
double nota2 ;
}
}
Es común que en todo proyecto de solución solo exista un método main(). Dicho método main() inicia
la ejecución del proyecto, y está definido en una de las clases que pertenecen al proyecto.
En base a esto, se modificará el método main() de la clase PrgAlumno para utilizar el atributo de
instancia nota3 y los conceptos tratados de la siguiente manera:
package dominioDeLaAplicacion ;
class PrgAlumno {
double prom ;
}
}
Aquí el objeto objAlumno01 de la clase PrgAlumno creado en el método main( ) tiene su propia copia
de los atributos de instancia nota1, nota2 y nota3.
Es importante mencionar que los cambios que se realicen en los atributos de instancia de un objeto
no deben afectar a los atributos de instancia de los otros objetos. Porque cada objeto tiene un valor
distinto para cada atributo de instancia, independiente de los valores que pueden tener los otros
objetos.
package dominioDeLaAplicacion ;
class PrgAlumno {
double nota1, nota2, nota3 ;
public static void main ( String args [ ] ) {
double prom ;
// Primero declaramos y creamos tres objetos de la clase PrgAlumno.
PrgAlumno objAlumno01 = new PrgAlumno( ) ;
PrgAlumno objAlumno02 = new PrgAlumno( ) ;
PrgAlumno objAlumno03 = new PrgAlumno( ) ;
// Asignamos valores a variables de instancia del objeto objAlumno01.
objAlumno01.nota1 = 15 ;
objAlumno01.nota2 = 19 ;
objAlumno01.nota3 = 11 ;
// Asignamos valores a variables de instancia del objeto objAlumno02.
objAlumno02.nota1 = 11 ;
objAlumno02.nota2 = 11 ;
objAlumno02.nota3 = 11 ;
// y a las variables de instancia del objeto objAlumno03.
objAlumno03.nota1 = 13 ;
objAlumno03.nota2 = 14 ;
objAlumno03.nota3 = 15 ;
Al ejecutar el proyecto se obtiene el siguiente resultado. Recordar que al ejecutar un proyecto, se está
ejecutando el método main():
Se puede comprobar que cada objeto de la clase PrgAlumno tiene una copia de los atributos de
instancia nota1, nota2 y nota3, y que los valores de un objeto son independientes de los otros valores
que tienen los otros objetos.
Finalmente, es importante especificar que solo se definirán como atributos a los datos de entrada.
A pesar de que podemos definir cualquier dato como atributo (datos de salida o calculados), solo se
definirán como una buena práctica de programación los datos de entrada como atributos. Por tanto,
esto contribuirá de manera significativa a entender correctamente el uso de atributos y métodos en las
soluciones. Los métodos serán tratados a continuación.
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 595
6.1.4 MÉTODO
Hasta este punto se ha definido la clase PrgAlumno con tres atributos de instancia y el método
main(). Ahora, es necesario conocer aspectos básicos sobre los diferentes tipos de métodos para
poder definirlos en la clase PrgAlumno.
Un método representa un pequeño subprograma encapsulado dentro de una clase y contribuye a
definir el comportamiento típico de los objetos, y especifican la forma en que se controlan los datos
(almacenados en atributos) de un objeto.
Los métodos se clasifican en dos categorías:
A. Métodos de Instancia: Son conocidos también como métodos de objetos que pueden ser llamados
(ejecutados) a través de un objeto. Este método se ejecuta utilizando el siguiente formato:
nombreObjeto.nombreMétodoInstancia ( ) ;
B. Métodos de Clase: Son llamados a través de un objeto o utilizando directamente la clase. Para
ejecutar un método de clase, generalmente se utiliza el siguiente formato:
NombreClase.nombreMétodoClase ( ) ;
En resumen:
Para ejecutar un método de instancia se requiere crear primero un objeto de la clase donde está
definido el método.
Para ejecutar un método de clase no se requiere crear un objeto porque se puede hacer
directamente utilizando el nombre de la clase, donde está definido el método. Para declarar un
método de clase se utiliza la palabra reservada staƟc.
A través de los métodos de clase, se puede manipular solo atributos de clase. Mientras que a
través de los métodos de instancia, se puede manipular atributos de clase y de instancia.
Donde:
}|Ɵpo: Especifica el tipo de dato devuelto por el método. Puede ser cualquier tipo válido, incluido los
tipos de clase. Si el método no devuelve ningún valor, el tipo devuelto debe ser void. Los métodos
que devuelven un tipo distinto de void, devuelven un valor a la sentencia que ejecuta el método
utilizando la siguiente forma de la sentencia return:
return valor ;
Aquí valor es el dato que el método devuelve a la sentencia que lo ejecutó. Generalmente, la
sentencia return se coloca al final del cuerpo del método.
596 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
}|nombreMétodo: Especifica el nombre del método, que puede ser cualquier identificador válido
diferente de los que se están utilizando en el mismo ámbito.
}|listaDeParámetros: Es una secuencia de parejas de tipo e identificador separado por comas. Los
parámetros son variables que reciben el valor de los argumentos que se pasan al método cuando
este es ejecutado. Si el método no tiene parámetros, entonces la lista de parámetros estará vacía.
Los métodos de instancia y los métodos de clase pueden ser de cuatro tipos.
La idea fundamental de los métodos es que no se codifique la misma parte más de una vez en
una determinada solución. Conforme se modifique el proyecto de solución ProyAlumno, podrá
comprenderse mejor.
package dominioDeLaAplicacion ;
class PrgAlumno {
void promedio ( ) {
System.out.print ( “ El promedio final del alumno es: ” ) ;
System.out.println ( (nota1 + nota2 + nota3 ) / 3 ) ;
}
double prom ;
Las tres líneas siguientes, ubicadas dentro del método main( ) de la clase PrgAlumno, permiten
ejecutar el método promedio( ) definido en la clase Alumno:
objAlumno01.promedio( ) ;
objAlumno02.promedio( ) ;
objAlumno03.promedio( ) ;
Al igual que para acceder a las variables de instancia, para acceder a los métodos se utiliza el operador
punto (.), el cual relaciona el nombre del objeto con el nombre de un método.
objAlumno01.promedio ( ) ;
Esta sentencia es parte del método main( ) de la clase PrgAlumno y permite que se ejecute el método
promedio( ) del objeto objAlumno01 definido en la clase Alumno; es decir, se ejecuta el método
promedio( ) utilizando el nombre de un objeto de la clase Alumno seguido por el operador punto. Así,
cuando se ejecuta:
void promedio ( ) {
System.out.print ( “ El promedio final del alumno es: ” ) ;
System.out.println ( (nota1 + nota2 + nota3 ) / 3 ) ;
}
El método promedio() no devuelve ningún valor porque tiene definido como tipo de retorno void.
Todos los métodos definidos con void no devuelven valor, por lo que no es necesario especificar una
sentencia return al final de este método. El método promedio(), tampoco tiene parámetros ya que al
final del nombre del método los paréntesis se encuentran vacíos.
No devuelve No tiene
valor. parámetros.
void promedio ( ) {
System.out.print ( “ El promedio final del alumno es: ” ) ;
System.out.println ( (nota1 + nota2 + nota3 ) / 3 ) ;
}
La llave de apertura “{”, ubicada después del paréntesis y la llave de cierre “}” ubicada en la última línea
definen el ámbito del método promedio(). El ámbito de un método define todas las sentencias que se
ejecutarán cuando el método se ejecute. En el caso anterior, cuando se ejecute el método promedio()
se ejecutarán las dos sentencia que están dentro de su ámbito (es decir, entre las llaves).
En el ámbito del método promedio() se puede observar que las variables de instancia nota1, nota2
y nota3 se utilizan directamente sin estar precedidas del nombre del objeto y el operador punto (.).
Cuando un método utiliza una variable de instancia que ha sido definida en su misma clase, se puede
referir a ella en forma directa utilizando solo su nombre.
package dominioDeLaAplicacion ;
class PrgAlumno {
double nota1, nota2, nota3 ;
double promedio ( ) {
return ( nota1 + nota2 + nota3 ) / 3 ;
}
public static void main ( String args [ ] ) {
double prom ;
// Primero declaramos y creamos tres objetos de la clase PrgAlumno.
PrgAlumno objAlumno01 = new PrgAlumno( ) ;
PrgAlumno objAlumno02 = new PrgAlumno( ) ;
PrgAlumno objAlumno03 = new PrgAlumno( ) ;
// Ahora asignamos valores a las variables de instancia del objeto
objAlumno01.
objAlumno01.nota1 = 15 ;
objAlumno01.nota2 = 19 ;
objAlumno01.nota3 = 11 ;
//Asignamos valores a las variables de instancia del objeto objAlumno02
objAlumno02.nota1 = 11 ;
objAlumno02.nota2 = 11 ;
objAlumno02.nota3 = 11 ;
// y a las variables de instancia del objeto objAlumno03.
objAlumno03.nota1 = 13 ;
objAlumno03.nota2 = 14 ;
objAlumno03.nota3 = 15 ;
// Calculamos el promedio de notas para cada alumno.
prom = objAlumno01.promedio ( ) ;
System.out.println ( “ Nota final de Luis: ” + prom ) ;
prom = objAlumno02.promedio ( ) ;
prom = prom + 1 ;
System.out.println ( “ Nota final de María: ” + prom ) ;
System.out.println (“Nota final de Pedro:” + objAlumno03.promedio( ));
}
}
Para ejecutar un método que devuelve un valor se utiliza de igual forma el nombre del objeto, el
operador punto (.) y el nombre del método. El valor devuelto por el método deberá ser asignado a una
variable del mismo tipo.
prom = objAlumno01.promedio ( ) ;
Esta sentencia es parte del método main() de la clase PrgAlumno y permite que se ejecute el método
promedio() del objeto objAlumno01. Como el método promedio() devuelve un valor, este se almacena
en la variable prom. Observe que la variable prom es del mismo tipo que el valor devuelto por el
método promedio().
600 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
double promedio ( ) {
1
Ejecuta
prom = objAlumno01.promedio ( ) ;
2
Se calcula y devuelve
el promedio de notas
3
El valor se asigna
a la variable prom
Una vez que se almacena en prom, el valor devuelto por el método promedio(), se puede procesar
dicho valor según sea necesario. Por ejemplo, en el primer caso se muestra el valor de prom y en el
segundo caso, antes de mostrar el valor de prom se le suma 1.
Primer caso:
prom = objAlumno01.promedio ( ) ;
System.out.println ( “ La nota final de Luis es ” + prom + “.” ) ;
Segundo caso:
prom = objAlumno02.promedio ( ) ;
prom = prom + 1 ;
System.out.println ( “ La nota final de María es ” + prom + “.” ) ;
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 601
Es preciso mencionar que se puede escribir estas sentencias de una manera más eficiente. Observe la
siguiente sentencia:
Aquí no se hace uso de la variable prom. La ejecución del método promedio() se realiza directamente
en la sentencia System.out.println(). Es decir, al ejecutar System.out.println() se ejecuta a su vez el
método promedio() y el valor devuelto se muestra a través de la pantalla.
Existen dos puntos importantes relacionados con los métodos que devuelven valor:
1. El tipo de dato que un método devuelve (con la sentencia return), debe ser compatible con el tipo
de dato especificado por el método.
double promedio ( ) {
return (nota1 + nota2 + nota3 ) / 3 ;
}
2. La variable que recibe el valor devuelto por el método debe también ser compatible con el tipo de
dato especificado por el método.
prom = objAlumno01.promedio ( ) ;
602 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Ahora, se definirán dos métodos dentro en la clase PrgAlumno. Los métodos se llamarán setNotas()
y mostrarPromedio(). El método setNotas() permitirá asignar valores a las variables de instancia
nota1, nota2 y nota3. Esto debido, fundamentalmente, a que en soluciones Java bien diseñadas, las
variables de instancia deberían ser accesibles solo a través de los métodos definidos por sus clases
y no en forma directa. El método mostrarPromedio() permitirá mostrar el promedio de notas de un
alumno.
El método setNotas() recibirá, a través de sus parámetros, las notas de un alumno y las asignará
a los atributos de instancia correspondientes. Los parámetros permiten generalizar el uso de un
método, permitiendo trabajar con diversos datos y utilizarlos en diferentes situaciones. El método
mostrarPromedio() recibirá, a través de su parámetro, el promedio del alumno y lo mostrará en
pantalla.
package dominioDeLaAplicacion ;
class PrgAlumno {
double promedio ( ) {
return ( nota1 + nota2 + nota3 ) / 3 ;
}
objAlumno01.setNotas ( 15,19,11 ) ;
double prom = objAlumno01.promedio ( ) ;
objAlumno01.mostrarPromedio ( ) ;
Para ejecutar un método que tiene parámetros se utiliza el nombre del objeto, el operador punto (.),
el nombre del método a ejecutar y los argumentos necesarios.
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 603
objAlumno01.setNotas ( 15,19,11 ) ;
Esta sentencia es parte del método main() de la clase PrgAlumno(), y permite ejecutar el método
setNotas() del objeto objAlumno01 definido en su clase. Como el método setNotas() tiene definido
tres parámetros, es necesario que al momento de ejecutar el método se incluya entre los paréntesis
los tres argumentos que se enviarán al método.
a = 15
objAlumno.setNotas (15,19,11 ) ;
3 ARGUMENTOS 3 PARÁMETROS
Existen dos puntos importantes relacionados con los métodos que tienen parámetros.
1. Un método que tiene parámetros debe recibir un valor por cada parámetro definido. El valor
recibido debe ser compatible con el tipo de dato definido por el parámetro al cual será asignado.
nota1 = a ;
nota2 = b ;
nota3 = c ;
}
604 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
2. Cuando se ejecuta un método que tiene parámetros, se debe pasar al método un valor por
cada parámetro definido (es decir, se deben pasar los argumentos). Cada argumento deberá ser
compatible con el tipo de dato definido por el parámetro al cual será asignado.
objAlumno.setNotas(15,19,11) ;
void promedio ( ) {
System.out.print ( “ El promedio final del alumno es: ” ) ;
System.out.println ( (nota1 + nota2 + nota3 ) / 3 ) ;
}
double promedio ( ) {
return (nota1 + nota2 + nota3 ) / 3 ;
}
4. Un método puede devolver un valor y tener definido uno o más parámetros. (Este tipo de métodos
todavía no han sido tratados).
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 605
Un constructor es un método especial que sirve para construir o inicializar objetos. Cada vez que se
crea un objeto, se ejecuta en forma automática dicho método que permite que se inicialice la copia
de los atributos de instancia de los objetos, inmediatamente después de su creación. Este método
tiene el mismo nombre que la clase en la cual está definido. Además; puede tener parámetros al
igual que otros métodos, pero no devuelven ningún valor ni siquiera void.
package dominioDeLaAplicacion ;
class PrgAlumno {
PrgAlumno ( ) {
nota1 = nota2 = nota3 =0 ;
}
double promedio ( ) {
return ( nota1 + nota2 + nota3 ) / 3 ;
}
objAlumno01.setNotas ( 15,19,11 ) ;
double prom = objAlumno01.promedio ( ) ;
objAlumno01.mostrarPromedio ( ) ;
}
}
Se declara y crea el objeto objAlumno01 de la clase PrgAlumno. Después de que se crea el objeto
objAlumno01 se ejecuta en forma automática al método constructor PrgAlumno(). El método
constructor PrgAlumno() permite inicializar la copia de los atributos de instancia nota1, nota2 y nota3
del objeto objAlumno01 con el valor cero.
El método constructor puede tener definidos parámetros. En ese caso, podemos enviar al método
constructor PrgAlumno() los valores de la copia de los atributos de instancia nota1, nota2 y nota3 del
objeto creado y eliminar el método setNotas(). También podemos reemplazar el método setNotas()
por un método que permita ingresar las notas y almacenarlas en la copia de los atributos de instancia
nota1, nota2 y nota3 del objeto de la clase PrgAlumno.
Con la finalidad de hacer soluciones simples utilizando métodos, se reemplaza el método setNotas()
por un método que permita el ingreso de las notas desde el teclado. El uso del método setNotas() será
retomado nuevamente en el capítulo nueve, del presente texto.
Ahora, se modificará el proyecto de solución ProyAlumno, de tal forma que los datos sean ingresados
a través del teclado de la computadora. Para ello, se definirá el método ingresarNotas(), el cual tendrá
la finalidad de ingresar las notas utilizando la clase LE. Observar la definición de la clase PrgAlumno.
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgAlumno {
PrgAlumno ( ) {
nota1 = 0 ;
nota2 = 0 ;
nota3 = 0 ;
}
void ingresarNotas ( ) {
nota1 = LE.leerInt ( “ Ingrese la nota de prácticas del alumno ” ) ;
nota2 = LE.leerInt ( “ Ingrese la nota del examen parcial: ” ) ;
nota3 = LE.leerInt ( “ Ingrese la nota de examen final: ” ) ;
}
double promedio ( ) {
return ( nota1 + nota2 + nota3 ) / 3 ;
}
objAlumno01.ingresarNotas ( ) ;
double prom = objAlumno01.promedio ( ) ;
objAlumno01.mostrarPromedio (prom) ;
}
}
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 607
package biblioteca ;
public class LE {
El proyecto de solución ProyAlumno tiene dos paquetes. Un paquete denominado biblioteca que
contiene a la clase LE y un paquete denominado dominioDeLaAplicacion que contiene la clase
PrgAlumno.
Tiene el método main() que permite que el proyecto se ejecute. Dentro del método main() se crea
al objeto objAlumno01 de la clase PrgAlumno y se ejecutan los otros métodos.
También, define los atributos de instancia para almacenar las notas y los métodos que permiten
manipular dichos atributos de instancia; es decir, el método para ingresar las notas, el método para
realizar el cálculo del promedio y el método para mostrar el promedio.
Define métodos que facilitan el ingreso de datos con cuadros de diálogo, utilizando el teclado.
Finalmente, se ha realizado una solución que permita el ingreso de datos, el proceso y salida de la
información utilizando atributos y métodos.
608 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
6.2.1 Ajuste de los pasos definidos para las etapas del método
En la solución del problema anterior, se utilizaron dos paquetes. Los mayores cambios los
desarrollamos en la clase del paquete dominioDeLaAplicacion. En dicha clase se definirá el método
main(), en el cual se crearán objetos y se definirán los atributos de instancia, los métodos de instancia
y el método constructor válido para los objetos.
ENUNCIADO
DEL
PROBLEMA
Etapa 02 Etapa 03 Etapa 04
Definición Diseño Desarrollo
Solución Solución Solución
MODELAMIENTO CODIFICACIÓN
}|Definición del }|Diseño del diagrama }|Codificar el diseño
proyecto de de paquetes de la solución del
solución. respectivo. Establecer problema utilizando
}|Definición del la dependencia el lenguaje de
algoritmo. (Utilice UML). programación Java.
}|Definición del }|Definición de la clase
paquete Aplicación. que serán parte
||Definición de clase del paquete de
con sus atributos y aplicación (Utilice
métodos. UML).
}|Diseño del diagrama
}|Definición del
de secuencia
paquete biblioteca. respectivo (Utilice
||Uso de la clase LE
UML).
con sus métodos
definidos.
ALGORITMO
}|Diseño del algoritmo
para los método
definidos. Utilizar
pseudocódigo.
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 609
Problema 151
Ingrese las notas; nota1, nota2 y nota3 a través del teclado. Luego, utilice atributos y métodos de
instancia.
El resultado se almacenará en una variable (prom), para luego ser mostrada por pantalla.
A. Clase: PrgAlumno
B. Atributos: Como atributos de instancia definiremos las variables de entrada nota1, nota2 y nota3.
C. Métodos: Necesitamos los siguientes métodos:
a. Método main() para iniciar la ejecución del proyecto, crear el objeto objAlumno01 y ejecutar los
diferentes métodos.
b. Método constructor para inicializar los atributos de instancia (método PrgAlumno()).
c. Método para ingresar las notas ( método ingresartNotas() ).
d. Método para calcular el promedio de las notas (método promedio(), devuelve el valor del cálculo
del promedio de las notas).
e. Método para mostrar el promedio de notas del alumno (método mostrarPromedio(), recibe el
valor del promedio de las notas).
610 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Diagrama de paquetes
dominioDeLaAplicacion biblioteca
PrgAlumno LE
(from biblioteca)
nota1 : double
nota2 : double ||leerString ()
nota3 : double
||leerChar ()
||PrgAlumno () ||leerInt ()
||ingresarNotas ( ) : void ||leerLong ()
||promedio ( ) : double ||leerFloat ()
||mostrarPromedio (prom : double) : void ||leerDouble ()
||main ( args : String[ ] ) : void ||mostrarResultado ()
||mostrarInformacion ()
||mostrarError ()
…
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 611
Diagrama de secuencia
objAlumno01: PrgAlumno
: usuario
1:main(String )
2: PrgAlumno( )
3: ingresarNotas( )
4:promedio()
5 mostrarPromedio(double)
Algoritmo PrgAlumno
ATRIBUTOS
PARAMETRO:
INICIO
nota1 = 0
nota2 = 0
nota3 = 0
FIN
612 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
METODO ingresarNotas
PARAMETRO:
RETORNO:
INICIO
LEER nota1, nota2, nota3
FIN
METODO promedio
PARAMETRO:
RETORNO: prom
INICIO
NUMERO prom
prom = ( nota1 + nota2 +nota3 ) / 3
RETORNAR prom
FIN
METODO mostrarPromedio
PARAMETRO: prom
RETORNO:
INICIO
ESCRIBIR prom
FIN
METODO PRINCIPAL
INICIO
NUMERO prom
CREAR OBJETO objAlumno01 CLASE PrgAlumno EJECUTAR PrgAlumno
EJECUTAR objAlumno01.ingresarNotas
prom = EJECUTAR objAlumno01.promedio
EJECUTAR objAlumno01mostrar.Promedio (prom )
FIN
Observe que en esta Etapa 03 – Diseño de la lógica, se han utilizado nuevas reglas de pseudocódigo,
las cuales describimos a continuación:
1. Crear objeto
Se utiliza para indicar la creación de un determinado objeto. El formato completo se muestra con el
siguiente ejemplo:
2. Ejecutar
Se utiliza para ejecutar un método. Se debe tener en cuenta que si el método es de clase, se deberá
anteponer el operador punto (.) y el nombre de la clase antes de colocar el nombre del método
que se desea ejecutar. Si el método es de instancia, se deberá anteponer el operador punto (.) y el
nombre del objeto antes de colocar el nombre del método que se desea ejecutar.
Se ejecuta el método promedio del objeto objAlumno01. El método promedio devuelve un resultado
que se almacena en la variable prom.
3. Parámetro
Se utiliza para especificar las variables que se usan para recibir los valores enviados a un determinado
método.
PARAMETRO: prom
La variable prom se utiliza para recibir los valores que se envían al método que pertenece la
instrucción.
4. Retorno
Se utiliza para especificar la variable que se usa para devolver o retornar una respuesta de un
determinado método.
RETORNO:prom
El valor almacenado en la variable prom será devuelto como respuesta cuando se ejecuta el método
al cual pertenece la instrucción.
5. Atributo
Se utiliza para diferenciar un atributo de una variable local, cuando tienen el mismo nombre y se
utilizan en un mismo método.
ATRIBUTO.nota1 = nota1
Para referirnos al atributo nota1 se utiliza la regla ATRIBUTO, la cual antecede al operador punto (.)
y al nombre del atributo, tal como se muestra en el ejemplo anterior.
614 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgAlumno
package dominioDeLaAplicacion ;
import biblioteca.LE ;
class PrgAlumno {
PrgAlumno ( ) {
nota1 = 0 ;
nota2 = 0 ;
nota3 = 0 ;
}
void ingresarNotas ( ) {
nota1 = LE.leerInt ( “ Ingrese la nota de prácticas del alumno ” );
nota2 = LE.leerInt ( “ Ingrese la nota del examen parcial ” ) ;
nota3 = LE.leerInt ( “ Ingrese la nota de examen final ” ) ;
}
double promedio ( ) {
return ( nota1 + nota2 + nota3 ) / 3 ;
}
objAlumno01.ingresarNotas ( ) ;
double prom = objAlumno01.promedio ( ) ;
objAlumno01.mostrarPromedio (prom) ;
}
}
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 615
PUNTO A PARTE
En la actualidad existen diversos software que permiten generar un archivo ejecutable para la
plataforma MS-Windows. Algunos ejemplos de este tipo de software son:
JSmooth (gratuito)
h p://jsmooth.sourceforge.net/
Launch4j (gratuito)
h p://launch4j.sourceforge.net/
NaƟveJ
h p://nativej.softonic.com/ie/57844
Estos software permiten generar un archivo ejecutable para MS-Windows desde un archivo JAR. Los
archivos ejecutables facilitan la distribución de las aplicaciones Java, puesto que dichos archivos se
encargan de buscar la JVM (Java Virtual Machine) o en su defecto el JRE (Java RunƟme Environment),
que incluya los archivos necesarios para la ejecución de las aplicaciones Java. También puede incluir
en su capeta el JRE lo que facilitaría la grabación de todo su proyecto en un CD y pueda ejecutarlo en
otra computadora con MS-Windows sin ningún problema.
A continuación vamos a generar un archivo ejecutable EXE para la plataforma MS-Windows desde
un archivo JAR utilizando el JSmooth.
Paso 2: Instalar el software obtenido en su computadora. Con este punto no tendrá problemas, porque
el programa de instalación lo guía paso a paso.
Paso 3: En la carpeta donde está ubicada nuestra aplicación Java copiamos el JRE del JDK. Si no se tiene
el JRE, puede obtenerlo en la página Web de Sun (java.sun.com). Para nuestro ejemplo tendríamos la
carpeta del proyecto ProyNotaFinal2, en la cual hemos generado el JAR de la aplicación Java y se ha
copiado el JRE.
Paso 4: Ejecutamos el JSmooth y configuramos cada una de las opciones para generar nuestro archivo
ejecutable para MS-Windows. Incluso puede asociarle un icono.
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 617
Finalmente, luego de configurar adecuadamente las cinco opciones, podrá generar su archivo
ejecutable para MS-Windows.
Internet puede encontrar excelentes manuales para configurar cada una de las opciones del JSmooth. Además,
cuando instale el producto, encontrará un buen manual de usuario.
Puede utilizar cualquier buscador de Internet para ampliar sus conocimientos sobre estos y otros
software, sólo tendrá que colocar el nombre del software y podrá observar varios links que le permitirán
inclusive bajar dicho software a su PC.
618 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
6.4.1 Introducción
La Interfaz del Usuario es la parte del programa o aplicación que permite a esta interactuar con el
usuario. Puede adoptar muchas formas, como utilizar de manera sencilla la consola hasta sofisticadas
Interfaces Gráficas de Usuario.
La programación visual nos permite desarrollar programas amigables, teniendo la ventaja de poder
utilizar todos los componentes y características de una Interfaz Gráfica de Usuario (GUI).
6.4.2 Definición
La Interfaz Gráfica de Usuario o GUI (por sus siglas en ingles Graphical User Interface) es un conjunto
de elementos gráficos tales como ventanas, botones, menús, cajas de texto, listas desplegables,
entre otros, que permiten la interacción entre el usuario y un programa de computadora.
La GUI puede ser una de las partes más importantes de un programa de computadora de tipo
comercial. Independientemente de lo rápido, eficiente o poderoso que sea un programa de
computadora, si no tiene una interfaz gráfica de usuario que sea sencilla de utilizar y estimule
visualmente, entonces no tiene ninguna base. Simplemente no sobrevivirá en el mercado.
A. Diseño de la GUI: Consiste en crear una interfaz y colocar sobre ella los elementos gráficos
necesarios, dispuestos en un determinado orden, de tal forma que se cumpla con los requerimientos
mínimos de entrada y salida de datos. Se utilizan clases de tipo contenedores, componentes y
administradores de diseño.
B. Programación de la GUI: Consiste en la programación de los eventos de la GUI y en asociar los
métodos desarrollados con los elementos gráficos colocados en la interfaz al momento de diseñar
la GUI. Se utilizan clases de tipo manejadores de evento.
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 619
Ejemplo de un contenedor de tipo JApplet con cuatro componentes. Al hacer clic con el botón
izquierdo del mouse de la computadora sobre el botón “Bienvenida”, se espera que suceda algo.
Los lenguajes de programación orientados a objetos proporcionan las clases necesarias para el
desarrollo de sofisticadas GUI, las cuales están almacenadas en diferentes paquetes y organizadas a
través de una jerarquía de clase.
En la actualidad, para diseñar GUI en Java existen herramientas de tercera generación llamadas SWT
(Standard Widget Toolkit) que mejoran las herramientas de primera y segunda generación de Sun
(AWT y Swing, respectivamente).
Los contenedores más utilizados del paquete javax.swing de Java para el diseño de la GUI son:
Los componentes más utilizados del paquete javax.swing de Java para el diseño de la GUI son:
Los Administradores de Diseño más utilizados del paquete java.awt de Java para el diseño de la GUI
son:
C½ÝÝ
BorderLayout BoxLayout
CardLayout FlowLayout
GridLayout GridBagLayout
Los Manejadores de Evento más utilizados del paquete java.awt.event de Java para el diseño de la
GUI son:
C½ÝÝ DÝÙ®Ö®ÌÄ
ActionListener WindowListener
ItemListener MouseListener
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 621
ENUNCIADO
DEL
PROBLEMA
MODELAMIENTO CODIFICACION
}|Determinar la }|Determinar el nombre }|Codificar el diseño
información deseada del proyecto. de la solución del
(salida). }|Definir los paquetes problema. Utilice
}|Determinar los datos y desarrollar el paquete javax.
de entrada (entrada). el diagrama de swing de Java para
}|Establecer como paquetes respectivo. el diseño de la
Establecer la GUI y el paquete
se solucionará el
dependencia. Utilice java.awt.event
problema (proceso).
UML. de Java para la
}|Definir las clases
programación de la
GUI.
que serán parte
de la solución del
problema. Desarrolle
el diagrama de clases.
Establecer la herencia
y agregación. Utilice
UML.
}|Diseñe la Interfaz
Gráfica de Usuario
(GUI).
ALGORITMO
}|Diseñar el algoritmo
para el método
principal. Desarrolle
el diagrama de
actividades. Utilice
UML.
622 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 152
Enunciado: Ingrese el nombre de una persona y luego muéstrelo junto con un mensaje de bienvenida.
Desarrolle el modelamiento y la codificación en el lenguaje de programación Java. Utilice el paquete
javax.swing de Java para crear una GUI.
event
(from awt)
dominioDeLaAplicacion
swing
(from javax)
JApplet
(from swing)
ActionListen
er
(from event)
actionPerformed
PrgBienvenida2
+txaResultado
+lblNombre
JLabel +btnBienvenida +txtNombre JTextArea
(from swing) (from swing)
JBu on JTextField
(from swing) (from swing)
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 623
INICIO
Mensaje = “bienvenido”.
¿Cómo estás?
LEER nombre
FIN
Este algoritmo diseñado en Diagrama de Actividades se ejecutará cuando el usuario presione el botón de
bienvenida en la GUI.
624 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Clase PrgBienvenida2
package dominioDeLaAplicacion ;
import java.awt.event.* ;
import javax.swing.* ;
// DISEñO DE LA GUI.
public void init( ) {
getContentPane().setLayout( null ) ;
// Etiqueta lblNombre
lblNombre = new JLabel ( “Nombre” ) ;
lblNombre.setBounds ( 15, 15, 55, 25 ) ;
getContentPane().add ( lblNombre ) ;
// Declaración de variables
String nombre, mensaje ;
// Ingreso de datos
mensaje = “bienvenido. ¿Cómo estás?” ;
nombre = txtNombre.getText( ) ;
// Mostrar información
txaResultado.setText ( nombre + “ ” + mensaje ) ;
txtNombre.setText ( “” ) ;
}
}
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 625
Resultado:
Una vez que se presiona el botón de bienvenida, se ejecuta el método acƟonPerformed(). En dicho
método está programado el algoritmo que permite mostrar un mensaje de bienvenida.
Problema 153
event
(from awt)
dominioDeLaAplicacion swing
(from javax)
swing
(from javax)
JFrame
(from swing)
WindowListener
ActionListener
(from event)
(from event)
}|actionPerformed()
}|windowOpened()
}|windowClosing()
}|windowClosed()
PrgNumero }|windowIconified()
(from dominioDeLaAplicacion) }|windowDeiconified()
}|PrgNumero() }|windowActivated()
}|main() }|windowDeactivated()
+lblTitulo +txtNumero
+btnProcesar +txaResultado
+lblNumero
package dominioDeLaAplicacion ;
import java.awt.event.* ;
import javax.swing.* ;
import java.awt.* ;
public PrgNumero ( ) {
getContentPane().setLayout ( null ) ;
// Etiqueta lblTitulo
lblTitulo = new JLabel ( “ Determine si un número es par o impar ” );
lblTitulo.setBounds( 15, 15, 350, 25 ) ;
lblTitulo.setForeground ( Color.RED ) ;
getContentPane().add ( lblTitulo ) ;
// Etiqueta lblNumero
lblNumero = new JLabel ( “Número” ) ;
lblNumero.setBounds ( 15, 50, 55, 25 ) ;
getContentPane().add ( lblNumero ) ;
// Botón de acción
btnProcesar = new JButton ( “Procesar” ) ;
btnProcesar.setBounds ( 200, 50, 100, 25 ) ;
btnProcesar.addActionListener ( this ) ;
getContentPane().add ( btnProcesar );
this.addWindowListener ( this ) ;
this.setTitle ( “Número” ) ;
this.setLocationRelativeTo ( null ) ;
this.setResizable ( false ) ;
this.setVisible ( true ) ;
// PROGRAMACIÓN DE LA GUI
public void actionPerformed ( ActionEvent e ) {
// Declarar variables
String sNumero, mensaje ;
int numero ;
// Ingreso de datos
sNumero = txtNumero.getText( ) ;
// Procesamiento
numero = Integer.parseInt ( sNumero ) ;
if ( numero % 2 == 0 ) {
mensaje = “ El número ingresado es par ” ;
} else {
mensaje = “ El número ingresado es impar ” ;
}
// Mostrar Información
txaResultados.setText ( mensaje + “\n” ) ;
txaResultados.append ( “...\nFin. ” ) ;
txtNumero.setText ( “” ) ;
txtNumero.requestFocus( ) ;
}
CAP. 6: INTRODUCCIÓN AL DESARROLLO DE SOLUCIONES ORIENTADAS A OBJETOS Y AL USO DE I NTERFAZ GRÁFICA DE U SUARIO 629
// EJECUCIÓN DE LA APLICACIÓN
public static void main(String[] args) {
}
Bibliograİa
Cay, H. y Cornell, G. (2012). Core Java Volume I—Fundamentals. 9th. ed. Core Series. United States:
Unabridged.
Deitel, H. y Deitel, P. (2010). Java How to Program. 8th. ed. United States: Prentice Hall.
Deitel, H. y Deitel, P. (2004). Cómo programar en Java. 5th. ed. México: Prentice Hall.
Deitel, H. y Deitel, P. (2003). Cómo programar en C++. 4th. ed. United States: Prentice Hall.
Drozek, A (2007). Estructura de Datos y Algoritmos en Java. 2th. ed. México: Thomson.
Hoffman, B. (2013). C++ Programming for Beginners. United States: Kindle Edition - Elms College.
Schildt, H. (2014). Java: A Beginner's Guide. 6th. ed. United States: McGraw-Hill.
Schildt, H. (2011). Java: A Beginner's Guide. 5th. ed. United States: McGraw-Hill.
Stroustrup, B. (2013). The C++ Programming Language. 4th. ed. United States: Lay Flat.
Referencias electrónicas
}|Flores,
J. y Bertolotti, C. (2009). Diagrama de Clase, Perú. InfoFIA 67, USMP. Recuperado de:
h p://www.usmp.edu.pe/publicaciones/boletin/fia/info67/uml.html
}|Flores, J. y Bertolotti, C. (2009). Herramientas de software para gestionar sus aplicaciones Java.
Perú. InfoFIA 66, USMP. Recuperado de:
h p://www.usmp.edu.pe/publicaciones/boletin/fia/info66/herramientas.html
}|Flores, J. y Bertolotti, C. (2008). Empaquetar aplicaciones Java utilizando Java Archives (JAR).
InfoFIA, USMP Perú. (64). Recuperado en abril 2008 de: h p://www.usmp.edu.pe/publicaciones/
boletin/fia/info64/empaquetarJAR.html
Impreso en los talleres gráficos de
Surquillo
Apéndice
Clases creadas e
i n c o rp o r a d a s e n J ava
APÉNDICE - c lasEs crEadas E incorporadas En Java 635
Clase Lectura
package biblioteca;
import java.io.*;
/*
* Clase que permite capturar literales desde el teclado.
*
*/
/**
* Retorna el char capturado desde el teclado.
*/
public static char leerChar() {
char c = ' ';
char[] c1 = leerString().toCharArray();
if (c1.length == 1)
c = c1[0];
return c;
}
/**
* Retorna un literal double capturado desde el teclado.
*/
public static double leerDouble() {
try {
return Double.valueOf(leerString()).doubleValue();
} catch (NumberFormatException e) {
System.out.print("ERROR...\n Ingrese de nuevo: ");
return leerDouble();
}
}
/**
* Retorna un literal float capturado desde el teclado.
*/
public static float leerFloat() {
try {
return Float.valueOf(leerString()).floatValue();
} catch (NumberFormatException e) {
System.out.print("ERROR...\n Ingrese de nuevo: ");
return leerFloat();
}
}
/**
* Retorna un literal int capturado desde el teclado.
*/
public static int leerInt() {
try {
return Integer.parseInt(leerString());
636 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
} catch (NumberFormatException e) {
System.out.print("ERROR...\n Ingrese de nuevo: ");
return leerInt();
}
}
/**
* Retorna un literal long capturado desde el teclado.
*/
public static long leerLong() {
try {
return Long.valueOf(leerString()).longValue();
} catch (NumberFormatException e) {
System.out.print("ERROR...\n Ingrese de nuevo: ");
return leerLong();
}
}
/**
* Retorna un literal short capturado desde el teclado.
*/
public static short leerShort() {
try {
return Short.valueOf(leerString()).shortValue();
} catch (NumberFormatException e) {
System.out.print("ERROR...\n Ingrese de nuevo: ");
return leerShort();
}
}
/**
* Retorna una cadena capturada desde el teclado.
*/
public static String leerString() {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String cadena = "";
try {
cadena = in.readLine();
} catch (IOException e) {
System.out.println(e);
}
return cadena;
}
}
package biblioteca;
import java.awt.*;
import javax.swing.*;
/**
* La clase <code>LE</code> facilita la Lectura y Escritura de datos a través
* de cuadros de diálogos.
*
APÉNDICE - c lasEs crEadas E incorporadas En Java 637
public class LE {
/**
* Muestra un cuadro de diálogo solicitando el ingreso de un caracter.
*
* @param mensaje
* especifica la solicitud del caracter a ingresar.
*/
public static char leerChar(String mensaje) {
String cadena;
do {
cadena = JOptionPane.showInputDialog(mensaje);
if (cadena == null)
mostrarError("Error... no se ha ingresado valor");
if (cadena.length() > 1)
mostrarError("Error... debe ingresar sólo un caracter");
} while (cadena == null || cadena.length() > 1);
char c = cadena.charAt(0);
return c;
}
/**
* Muestra un cuadro de diálogo solicitando el ingreso de un valor real
* double.
*
* @param mensaje
* especifica la solicitud del valor a ingresar.
*
*/
public static double leerDouble(String mensaje) {
String cadena = leerString(mensaje);
try {
return Double.parseDouble(cadena);
} catch (NumberFormatException e) {
mostrarError("Error... debe ingresar un número ");
return leerDouble(mensaje);
}
}
/**
* Muestra un cuadro de diálogo solicitando el ingreso de un valor real
* float.
*
* @param mensaje
638 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
/**
* Muestra un cuadro de diálogo solicitando el ingreso de un valor entero
* int.
*
* @param mensaje
* especifica la solicitud del valor a ingresar.
*/
public static int leerInt(String mensaje) {
String cadena = leerString(mensaje);
try {
return Integer.parseInt(cadena);
} catch (NumberFormatException e) {
mostrarError("Error... debe ingresar un número ");
return leerInt(mensaje);
}
}
/**
* Muestra un cuadro de diálogo solicitando el ingreso de un valor entero
* long.
*
* @param mensaje
* especifica la solicitud del valor a ingresar.
*/
public static long leerLong(String mensaje) {
String cadena = leerString(mensaje);
try {
return Long.parseLong(cadena);
} catch (NumberFormatException e) {
mostrarError("Error... debe ingresar un número ");
return leerLong(mensaje);
}
}
/**
* Muestra un cuadro de diálogo solicitando el ingreso de una cadena.
*
* @param mensaje
* especifica la solicitud de la cadena a ingresar.
*/
public static String leerString(String mensaje) {
String cadena;
do {
cadena = JOptionPane.showInputDialog(mensaje);
if (cadena == null)
mostrarError("Error... no se ha ingresado valor");
} while (cadena == null);
return cadena;
}
APÉNDICE - c lasEs crEadas E incorporadas En Java 639
/**
* Muestra un cuadro de diálogo solicitando el ingreso de una clave seceta
*
* Método leerClave. El método leerClave de la clase LE es un método
* incorporado en la versión 2.0 ha sido creado sobrecargado. Puede utilizar
* tres versiones. El método que no recibe parámetros coloca un titulo y un
* mensaje por default. El método que recibe un parámetro muestra el titulo
* especificado y un mensaje por default y el método que recibe dos
* parámetros muestra el título y el mensaje especificado. Observe como se
* reusa el método.
*
* @return un string con la clave ingresada. Si cierra la ventana o cancela
* retorna una cadena vacia
*
*
*/
if (rpta != 0) {
return "";
} else {
return String.valueOf(jpfClave.getPassword());
}
}
/**
* Muestra un cuadro de diálogo con algún tipo de mensaje. No presenta
* ícono.
*
* @param mensaje
* es el mensaje a mostrar.
*/
public static void mostrarResultado(String mensaje) {
JOptionPane.showMessageDialog(null, mensaje, "Resultado",
JOptionPane.PLAIN_MESSAGE);
}
640 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
/**
* Muestra un cuadro de diálogo con una advertencia especificada en el
* argumento.
*
* @param mensaje
* es la advertencia a mostrar.
*/
public static void mostrarAdvertencia(String mensaje) {
JOptionPane.showMessageDialog(null, mensaje, "Advertencia",
JOptionPane.WARNING_MESSAGE);
}
/**
* Muestra un cuadro de diálogo con un mensaje de error especificado en el
* argumento.
*
* @param mensaje
* es el error a mostrar.
*/
public static void mostrarError(String mensaje) {
JOptionPane.showMessageDialog(null, mensaje, "Error",
JOptionPane.ERROR_MESSAGE);
}
/**
* Muestra un cuadro de diálogo con un mensaje de información especificado
* en el argumento.
*
* Método mostrarInformacion: Método sobrecargado, creandose el segundo
* método. El método mostrarInformación de la clase LE ha sido sobrecargado.
* Ahora Ud. puede utilizar dos versiones. El método que recibe un parámetro
* muestra la información en forma tradicional. El método que recibe cinco
* parámetros tienen la posibilidad de incluir un título en la ventana, un
* texto de titulo al interior del cuadro, mostrar la información en una
* área de texto con la posibilidad de hacer scroll cuando se necesita
* mostrar gran cantidad de información, cambiar la etiqueta del botón que
* se muestra en la parte inferior del cuadro y cambiar el color de fondo
* del área de texto.
*/
if (tituloVentana == null)
tituloVentana = "Información";
if (tituloInterno != null)
cabecera.setText(tituloInterno);
APÉNDICE - c lasEs crEadas E incorporadas En Java 641
if (mensaje == null)
mensaje = "No hay datos para visualizar";
if (color != null)
muestraInformacion.setBackground(color);
muestraInformacion.append(mensaje);
JScrollPane desplazaInformacion = new JScrollPane(muestraInformacion);
panel.add( "North",cabecera);
panel.add( "Center", new Canvas());
panel.add( "South",desplazaInformacion);
if (nombreBoton != null) {
Object[] nombres = {nombreBoton};
JOptionPane.showOptionDialog(null, panel, tituloVentana,
JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_
MESSAGE,
null, nombres, nombres[0]);
} else {
JOptionPane.showMessageDialog(null, panel, tituloVentana,
JOptionPane.INFORMATION_MESSAGE);
}
}
/**
* Muestra un cuadro de diálogo con una pregunta especificada en el
* argumento.
*
* @param mensaje
* es la pregunta a mostrar.
*/
public static void mostrarPregunta(String mensaje) {
JOptionPane.showMessageDialog(null, mensaje, "Pregunta",
JOptionPane.QUESTION_MESSAGE);
}
/**
* Muestra un cuadro de diálogo con una pregunta especificada en el
* argumento y 2 opciones de respuesta a elegir.
*
* @param mensaje
* es la pregunta a mostrar.
* @return el entero 0 o 1 si se presionó el botón con la opción YES o NO
* respectivamente. Si se cierra este cuadro de diálogo sin
* presionar algún botón, retorna el entero -1.
*/
public static int mostrarPreguntaOpcion2(String mensaje) {
return JOptionPane.showOptionDialog(null, mensaje, "Pregunta",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_
MESSAGE, null,
null, null);
}
/**
* Muestra un cuadro de diálogo con una pregunta especificada en el
* argumento y 3 opciones de respuesta a elegir.
*
* @param mensaje
* es la pregunta a mostrar.
* @return el entero 0, 1 o 2 si se presionó el botón con la opción YES, NO
* o CANCEL respectivamente. Si se cierra este cuadro de diálogo sin
642 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
/**
* Muestra un cuadro de diálogo con un combo para selecciona una opción de
* múltiples opciones.
*
* @param opciones
* es un arreglo de cadenas con las opciones a mostrar.
* @return un string con la opción seleccionada. Si cierra la ventana o
* cancela retorna una cadena vacia.
*
*/
public static String seleccionarOpcion(String tituloVentana,
String mensaje, String[] opciones) {
String rpta = (String) JOptionPane.showInputDialog(null, mensaje,
tituloVentana, JOptionPane.QUESTION_MESSAGE, null,
opciones,
opciones[0]);
if (rpta == null) {
rpta = "";
}
return rpta;
}
/**
* Muestra un cuadro de diálogo con un combo para selecciona una opción de
* múltiples opciones.
*
* @param opciones
* es un arreglo de cadenas con las opciones a mostrar.
* @return un entero con la posición de la opción seleccionada. Si cierra
* la ventana o cancela retorna -1.
*
*/
public static int seleccionarOpcionIndex(String tituloVentana,
String mensaje, String[] opciones) {
String rpta = (String) JOptionPane.showInputDialog(null, mensaje,
tituloVentana, JOptionPane.QUESTION_MESSAGE, null,
opciones,
opciones[0]);
if (rpta != null) {
for (int i=0; i<opciones.length; i++) {
if (opciones[i] == rpta) {
return i;
}
}
}
return -1;
}
}
APÉNDICE - c lasEs crEadas E incorporadas En Java 643
El paquete del lenguaje Java, conocido también como java.lang, es uno de los paquetes más
importantes de la API1 de Java, y contiene las clases que constituyen el corazón del lenguaje de
programación Java.
El paquete java.lang, debido a su importancia, no requiere ser importado por las aplicaciones para
usar las clases que contiene; es decir, está automáticamente importado para todos los programas,
por lo que la siguiente sentencia no será necesaria:
import java.lang.* ;
El paquete java.lang contiene clases que encapsulan los tipos primitivos de datos, una clase que
proporciona los objetos2 para manipular la entrada y la salida estándar, clases que manipulan cadenas
de caracteres y otra que proporciona métodos3 correpondientes a las funciones matemáticas, etc.
1
API: Aplication Program Interface. Una API es un conjunto de normas que determinan como debe usarse una
determinada función de un lenguaje de programación en una aplicación.
2
Objetos: Modelos de entes del mundo. Un objeto de software es cualquier cosa, real o abstracta, acerca del
cual almacenamos datosy los métodosque controlan dichos datos.
3
Métodos: Desarrollo de algoritmos. Los métodos especifican la forma en que se controlan los datos de un
objeto y es donde se define el comportamiento del mismo. En palabras sencillas; en los métodos se desarrollan
o codifican los algoritmos.
644 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Entre las clases que serán tratadas en esta primera parte del apéndice se tienen:
1.- Clases que envuelven los tipos de datos primitivos, conocidas como las clases wrappers (envol-
torios). Cada una de estas clases (consideradas subclases4), a excepción de la clase Character, se
derivan de la clase abstracta 5Number (considerada superclase).
||Boolean
||Byte
||Character
||Double
||Float
||Integer
||Long
||Short
2.- Clase que proporciona métodos correspondientes a las funciones matemáticas básicas.
||Math
3.- Clase que proporciona los objetos necesarios para manipular y tratar cadenas de caracteres.
||String
En Java, los métodos siempre están dentro de una clase. Algunos métodos pueden ser invocados o
ejecutados utilizando directamente el nombre de la clase en la cual están definidos, tal es el caso de
los métodos de la clase Math de Java. Estos métodos son conocidos como métodos estáticos o de
clase.
Por otro lado, otros métodos son invocados o ejecutados utilizando un objeto o instancia6 de la clase
en la cual están definidos; tal es el caso de los métodos de la clase String de Java, que son conocidos
como métodos de instancia o de objeto.
También serán tratadas otras clases incorporadas en el lenguaje de programación Java, tales como:
}|Clase Calendar
}|Clase GregorianCalendar
}|Clase SimpleDateFormat
4
Herencia: SubClase y SuperClase. La Herencia es uno de los conceptos más importantes de la Programación
Orientada a Objetos (POO). Utilizando la Herencia se puede derivar una nueva clase a partir de otra clase
existente, donde la nueva clase derivada heredará todos los atributos y métodos de la clase existente. La
nueva clase se llama clase derivada (o SubClase) y la clase original se llama clase base (o SuperClase).
5
Clase abstracta: clase tratada como SuperClase. Una clase abstracta es un tipo de clase de la cual no se
pueden crear o instanciar objetos. En su lugar, se debe derivar una nueva clase a partir de la clase abstracta,
codificar los métodos que son declarados como abstractos en la clase abstracta y crear o instanciar objetos
a partir de la clase derivada. Las clases abstractas se utilizan para forzar a los programadores a desarrollar
algunos o todos los métodos de una clase.
6
Instancia: Representación concreta de una clase. Una Instancia viene a ser lo mismo que un objeto. Crear un
objeto o instanciar una clase se refiere a poder tener una representación real de una clase.
APÉNDICE - c lasEs crEadas E incorporadas En Java 645
COnvERsión dE daTOs
Como regla general, una variable solo puede almacenar valores de acuerdo al tipo de dato con el que
fue declarado; es decir, si se declara una variable con un tipo de dato específico, solo podrá almacenar
valores de dicho tipo, porque de lo contrario el programa indicará un error al compilar.
Problema 156
Clase PrgTipoDato01
package dominioDeLaAplicacion ;
class PrgTipoDato01 {
System.out.println ( numEntero ) ;
}
}
Observación: No se puede almacenar un número real grande (double) en una variable entera (int).
Problema 157
Clase PrgTipoDato02
packagedominioDeLaAplicacion ;
class PrgTipoDato02 {
System.out.println ( numRealFloat ) ;
}
}
Observación: No se puede almacenar un número real grande (double) en una variable real (float).
646 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 158
Clase PrgTipoDato03
package dominioDeLaAplicacion ;
class PrgTipoDato03 {
System.out.println ( caracter ) ;
}
}
Observación: No se puede almacenar un valor lógico (boolean) en una variable carácter (char).
Como se mencionó, solo se puede almacenar un valor en una variable y dicho valor debe ser del tipo
de dato con el que la variable fue declarada; sin embargo, la excepción para este caso se denomina
conversión de datos.
A través de la conversión de datos, se puede almacenar en una variable valores de tipo diferente al
tipo de dato con el que se declaró la variable. Dicha conversión es un tema propio de los lenguajes de
programación que se aplica generalmente sobre los tipos de datos numéricos, aunque también, sobre
el tipo de dato CARACTER.
La conversión implícita de datos se da entre un tipo de dato de menor precisión a uno de mayor
precisión (más amplio, más grande), y son generadas automáticamente por el compilador Java.
A continuación, se muestran los tipos de datos numéricos ubicados desde el tipo de dato de menor
precisión al de mayor precisión:
Problema 159
Clase PrgTipoDato04
package dominioDeLaAplicacion ;
class PrgTipoDato04 {
public static void main ( String arg [ ] ) {
int numEntero = 5 ;
long numEnteroGrande ;
// Se visualiza 5
System.out.println ( numEnteroGrande ) ;
}
}
Problema 160
Clase PrgTipoDato05
package dominioDeLaAplicacion ;
class PrgTipoDato05 {
public static void main ( Stringarg [ ] ) {
// Se visualiza 97.0
System.out.println ( numReal ) ;
}
}
Lado izquierdo
de la expresión
En caso contrario, si el lado derecho tiene un tipo de dato más amplio que el izquierdo, al compilar, el
programa indicará un error.
La conversión implícita de datos en Java se da de un tipo de dato de menor precisión, a uno de mayor
precisión.
Las conversiones de un tipo de dato de mayor precisón a otro de menor requieren que se coloque
en forma explícita en los programas. Estas conversiones son inseguras, por lo que podrían generarse
errores.
A este tipo de conversión de datos se le denomina también cast (casting). Este se realiza colocando
entre paréntesis el tipo de dato al que se desea convertir el resultado de una expresión.
Problema 161
Clase PrgTipoDato06
packagedominioDeLaAplicacion ;
class PrgTipoDato06 {
public static void main ( String arg [ ] ) {
double num1 = 20, num2 = 3 ;
int div ;
System.out.println ( div ) ;
}
}
APÉNDICE - c lasEs crEadas E incorporadas En Java 649
Problema 162
Clase PrgTipoDato07
package dominioDeLaAplicacion ;
class PrgTipoDato07 {
public static void main ( String arg [ ] ) {
double num1 = 20, num2 = 3 ;
int div ;
// Se visualiza 6.
System.out.println ( div ) ;
}
}
Observación: Al ejecutar esta aplicación el compilador utiliza la conversión explícita (casting) para
poder almacenar el resultado de una división de números reales (double) en una variable entera
(int).
Las clases wrappers tratadas a continuación permiten envolver los tipos de datos simples y realizar
operaciones de conversión, entre otras.
A. Introducción: Los tipos de datos primitivos (boolean, byte, char, double, float, int, long, short),
o tipos de datos simples, son los únicos elementos del lenguaje de programación Java que se
representan internamente a través de valores, como en un lenguaje de programación convencional.
Esto significa que dicho tipo de datos no son objetos y se sitúan fuera de la jerarquía de clases7 de
Java, lo cual tiene algunas ventajas desde el punto de vista de la eficiencia.
En ocasiones, es conveniente sacrificar parte de la eficiencia por la flexibilidad, por lo que en Java se
ha creado la clase wrapper (envoltorios), que permite integrar los tipos de datos primitivos dentro
de la jerarquía de clases.
Los wrappers se diseñaron para ser un complemento de los tipos de datos primitivos y proporcionar
métodos para realizar diferentes tareas con el tipo de primitivo, como la conversión con cadenas de
caracteres, comprobación, traslación, entre otras.
Existe una clase wrapper para cada uno de los tipos de datos primitivos, que permiten tratarlos
como objetos. Dichas clases se muestran a continuación:
Cada una de estas clases wrappers (a excepción de Character) tiene un método que permite
convertir desde una cadena (String) al tipo primitivo. Simplemente hay que ejecutar el método de la
clase wrappers adecuada y el string se convierte al tipo de dato primitivo asociado.
java.lang.Object
Las clases Java, en general, tienen métodos estáticos y de instancia. Para ejecutar un método de
instancia es necesario crear un objeto de la clase donde está definido dicho método. Para crear un
objeto en Java se usa la sentencia new, a excepción de los objetos como los de la clase string, que no
necesariamente se crean con dicha sentencia.
int i = 5;
Integer I = new Integer ( i )
Donde el objeto I es un objeto de la clase Integer, que tiene un valor igual a 5 y métodos para
manipular dicho valor.
7
Jerarquía de clases: Forma de ordenar las clases. La jerarquía de clases es una forma de ordenar las clases
existentes en un lenguaje de Programación Orientado a Objetos (POO). Una jerarquía de clases define conceptos
abstractos en la parte superior de la jerarquía, y conforme se desciende en la jerarquía los conceptos se tornan
cada vez más concretos. Java tiene su propia jerarquía de clases, en cuya parte superior se encuentra la clase
Object (pertenece al paquete java.lang).
APÉNDICE - c lasEs crEadas E incorporadas En Java 651
B. Métodos: Con la finalidad de resumir los métodos de las clases wrappers que permiten la
conversión, comprobación y traslación de datos, se utilizarán algunos objetos de dichas clases. Se
asume que los objetos han sido creados previamente. Dichos objetos son:
También se utilizarán algunas variables, para lo cual se deberá asumir que estas han sido declaradas
previamente. Las variables son:
Para referirnos a objetos se utilizará una letra en mayúscula, mientras que para referirnos a las
variables se utilizará una letra minúscula.
Conversión de tipo de dato primitivo a objeto String utilizando clases wrappers y variables:
Observe que se utiliza el método toString ( ) para convertir el valor de una variable a un valor de
tipo cadena contenido en un objeto String. El método toString ( ) es un método estático o de clase,
porque se utiliza directamente el nombre de la clase para ejecutar el método.
652 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Observe que se utiliza el método toString() para convertir el valor contenido en el objeto wrappers
a un valor de tipo cadena contenido en un objeto String. A pesar de que el método toString() es un
método estático o de clase, también puede ejecutarse utilizando un objeto.
Todas las clases wrappers tienen en común el método estático o de clase toString( ). Esto se debe a
que este método no pertenece a dichas clases, sino a la clase Object.
La clase Object es la clase principal en la Jerarquía de Clases de Java (se puede decir que es la clase
padre de todas las clases). Todas las clases en Java pueden utilizar los métodos definidos en la clase
Object (debido fundamentalmente a la herencia) y uno de los métodos definidos en esta clase, es el
método toString ( ).
Conversión de objetos String a tipos de dato primitivo, utilizando clases wrappers y objeto String.
Observe que se utiliza el método valueOf ( ) para convertir el valor contenido en el objeto String S a
un dato de tipo primitivo o valor de una variable. Este método es estático o de clase. También existe
la posibilidad de utilizar los métodos parseInt (),parseLong ( ), parseFloat ( ) y parseDouble ( ) para
los wrappers Integer, Long, Float y Double respectivamente.
Observe que todas las clases wrappers tienen en común los métodos de instancia intValue ( ),
longValue ( ), floatValue ( ) y doubleValue ( ).
Todas las clases wrappers tienen en común los métodos de instancia intValue( ), longValue( ),
floatValue( ) y doubleValue( ). Estos métodos pertenecen en realidad a la clase Number.
La clase Number es la superclase de las clases wrappers (a excepción de la clase wrapper Character).
Estas clases pueden utilizar los métodos definidos en la clase Number a través de la herencia.
Observe que se utiliza el método isNaN ()para determinar si la variable es o no un número. El método
devuelve true si el valor de la variable no es un número.
Observe que se utiliza el método isInfinite() para determinar si la variable es o no un número infinito.
El método devuelve true, si el valor de la variable es un número infinito.
Los valores Infinite proceden normalmente de la división por cero de un valor finito. Por ejemplo el
resultado de la siguiente operación: 10.5 / 0.0.
F. Comprobaciones de caracteres
Comprobación de caracteres utilizando la clase Character y la variable tipo char:
VARIABLE CLASE Character Y VARIABLE char
“Devuelve true si el carácter es una
Character.isLowerCase (c)
letra minúscula”.
“Devuelve true si el carácter es una
Character.isUpperCase (c) ;
letra mayúscula”.
b
“Devuelve true si el carácter es un
Character.isDigit (c) ;
dígito decimal”.
“Devuelve true si el carácter es un
Character.isSpace (c) ;
espacio en blanco”.
}|Traslación de caracteres
Traslación de caracteres utilizando la clase Character y la variable tipo char:
Problema 163
Desarrollar un programa en Java que permita convertir valores de diferentes tipos de datos en
valores de tipo cadena.
class PrgConvertirAString {
String cadena = “ ”;
Observe que es posible convertir cualquier tipo de dato a cadena (String), utilizando el método
valueOf() de la clase String. En ciertas ocasiones esto es necesario, porque las cadenas pueden
ser manipuladas. Analice cómo se pueden manipular las variables de tipo cadena (String), más
adelante en este mismo capítulo.
656 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 164
Desarrollar un programa en Java que permita obtener la fecha del sistema y la convierta en un valor
de tipo cadena.
package dominioDeLaAplicacion ;
import java.util.Date ;
class PrgConvertirFecha {
cadena = hoy.toString ( ) ;
System.out.println ( “ Fecha: ” + cadena ) ;
}
}
La clase Date es una clase propia de Java y está incluida en el paquete java.util. En este paquete
podrá encontrar clases de utilidad para sus aplicaciones. Este paquete está fuera del alcance del
presente texto (Se sugiere investiguar las clases que forman parte de este paquete).
Observe como se convierte la fecha almacenada en un objeto (llamado hoy) de la clase Date en una
cadena (String), utilizando el método toString() de la clase String. Esta cadena de texto podrá ser
manipulada para obtener otros datos, tales como; el día, el mes, el año actual o la hora del sistema.
Mas adelante, se podrá analizar cómo se pueden manipular las variables de tipo cadena (String).
APÉNDICE - c lasEs crEadas E incorporadas En Java 657
Problema 165
Desarrollar un programa en Java que permita convertir una cadena en un número entero y en un
objeto de tipo Integer. Calcular y mostrar la suma de ambos valores.
package dominioDeLaAplicacion ;
class PrgCadenaAEntero {
int numEntero = 0 ;
String cadena = “10" ;
}
}
Observe que es posible convertir una cadena (String) en un valor entero (int) o en un objeto de la
clase Integer. Recuerde que deberá asegurarse que la cadena contenga un valor válido, para que
pueda ser almacenado en un tipo de dato determinado.
Puede utilizar el método parseInt( ) de la clase String para convertir una cadena en un número
entero (numEntero), y también el método valueOf( ) de la clase Integer para convertir una cadena
en un un objeto (objInteger) de la clase Integer. El método intValue( ) nos permite obtener el valor
entero del objeto (objInteger) de la clase Integer.
Como sugerencia, desarrolle un programa en Java que realice lo mismo que este programa pero
utilice una variable long y la clase Long.
658 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 166
Desarrollar un programa en Java que permita convertir una cadena en un número real y en un
objeto de tipo Double. Calcular y mostrar la suma de ambos valores.
Clase PrgCadenaAReal
package dominioDeLaAplicacion ;
class PrgCadenaAReal {
double numRealDoble = 0 ;
String cadena = “10.5” ;
}
}
Observar que es posible convertir una cadena (String) en un valor entero (double) o en un objeto de
la clase Double. Se recuerda que deberá asegurar que la cadena contenga un valor que sea válido
para poderlo almacenar en un tipo de dato determinado.
Puede utilizar el método parseDouble( ) de la clase Double para convertir una cadena en un número
real (numRealDoble) y también el método valueOf( ) de la clase Double para convertir una cadena
en un objeto (objDouble) de la clase Double. El método doubleValue ( ) nos permite obtener el
valor real del objeto (objDouble) de la clase Double.
Se sugiere desarrollar un programa en Java que realice lo mismo que este programa, pero que
utilice una variable float y la clase Float.
APÉNDICE - c lasEs crEadas E incorporadas En Java 659
Introducción
La clase Math viene incorporada en el lenguaje de programación Java, incluida en el paquete java.lang,
la cual nos proporciona métodos y atributos para implementar diversas funciones mátemáticas.
java.lang.Object
java.lang.Object
El paquete java.lang es el principal del lenguaje Java, por lo cual no se necesita importar ninguna
clase incluida en dicho paquete. En consecuencia, no será necesario importar el paquete java.lang
cada vez que se necesite utilizar la clase Math de Java.
La clase Math contiene métodos de cálculo básico como; exponencial, logaritmo, raíz cuadrada
y funciones trigonométricas. La clase Math a diferencia de otras clases, es una clase final8. Esto
significa que no puede ser instanciada (es decir; no se pueden crear objetos de la clase Math). Los
métodos de la clase Math son métodos estáticos (llamados también métodos de clase) y para poder
utilizarlos solo se debe colocar el nombre de la clase, el operador punto y el nombre del método a
utilizar.
Ejemplo:
Math.pow (a, b) ;
8
Clase Final: No puede ser una SuperClase. Una clase final, o declarada como final, es una clase que no puede
ser una SuperClase. Es decir, las clases finales no pueden heredarse. Todos los métodos de una clase final son
implícitamente finales.
660 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Métodos
A. Atributos de clase:
1.- E.
2.- PI.
B. Métodos de clase:
1.- abs( ).
2.- acos( ).
3.- asin( ).
4.- atan( ).
5.- ceil( ).
6.- cos( ).
7.- exp( ).
8.- floor( ).
9.- log( ).
10.- max( ).
11.- min( ).
12.- pow( ).
13.- random( ).
14.- round( ).
15.- sin( ).
16.- sqrt( ).
17.- tan( ).
18.- toDegrees( ).
19.- toRadians( ).
Para trabajar con los métodos de clase, de la claseMath no será necesario crear previamente un
objeto de dicha clase (esto se cumple para todas las clases que implementen métodos de clase).
Para ejecutar un método de clase, de la clase Math, es necesario colocar la palabra Math (que es
el nombre de la clase), el operador punto (.) y el nombre del método de clase que desea ejecutar.
Asimismo, para ejecutar un método de la clase Math, debemos tener en cuenta que si el método
necesita algunos datos, estos deben ser necesariamente proporcionados en la cantidad y tipos
requeridos. En caso de que el método devuelva un resultado, deberá almacenarlo en una variable
del mismo tipo que el resultado proporcionado o mostrarlo a través de la pantalla.
APÉNDICE - c lasEs crEadas E incorporadas En Java 661
A continuación, se presenta una breve descripción del uso de cada uno de los métodos de la clase
Math:
CLASE Math
double pi = Math.PI ;
System.out.print( pi) ;
Almacena el valor de PI. Es decir,
PI almacena el valor equivalente a
Resultado:
3.141592653589793.
pi = 3.141592653589793.
result = 0.6674572160283838
result = 0.9033391107665127
MÉTODOS DE
DESCRIPCIÓN USO
CLASE
double n = 0.65 , result ;
result = Math.ceil( n ) ;
Retorna un valor double con el valor
System.out.print( result ) ;
más corto no menor que el parámetro
ceil (double)
dado. El parámetro dado debe ser
Resultado:
double.
result = 1.0
result = 0.8660254037844387
result = 2.7182818284590455
resutl = 5.0
result = 1.0986122886681096
result = 11.
result = 0.6018150231520483
double x = 16 , result ;
result = Math.sqrt( x ) ;
Retorna un valor double con la raiz
System.out.print ( result ) ;
cuadrada del parámetro dado. El
sqrt (double)
parámetro dado debe ser un valor
Resultado:
double.
result = 4.
result = 1.3270448216204098
A continuación, con la finalidad de mejorar la comprensión del tema tratado, se presentan algunas
soluciones a problemas planteados utilizando algunos de los métodos de la clase Math. Analice cada
una de las siguientes soluciones.
Problema 167
Desarrollar un programa en Java que permita ingresar tres números enteros a través del teclado.
Determinar y mostrar cuál de ellos es el número mayor.
Clase PrgNumeroMayor
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumeroMayor {
Parámetros
Nombre del método
Operador punto
Nombre de la Clase
El método max ( ) nos permite determinar el número mayor entre dos números (en nuestro caso el
número mayor entre num2 y num3).
En esta solución se emplea una estrategia mas simple para determinar el número mayor entre tres
números. El método max ( ) de la clase Math retorna el valor del número mayor (puede ser un
número float, double, int o long) de dos números dados como parámetros. En nuestro ejemplo
determinamos el mayor de los dos últimos números ingresados y en la misma línea de código
evaluamos el mayor de estos dos números con el primer número ingresado, tal y como se muestra
a continuación:
Es importante tener presente que el método max ( ) es un método que solo podemos utilizar con la
clase Math y su función es determinar el número mayor entre dos números dados como parámetros.
666 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 168
Desarrollar un programa en Java que permita ingresar tres números enteros a través del teclado.
Determinar y mostrar cuál de ellos es el número menor.
Clase PrgNumeroMenor
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumeroMenor {
Observe el uso del método min( ) de la clase Math. En la codificación de esta solución se emplea
una nueva estrategia para hallar el menor de tres números, ingresados a través del teclado
(anteriormente se utilizaban sentencias if anidadas).
Observe que Math.min( ) retorna el valor del número menor (que puede ser float, double, int,
long) de dos números dados como parámetros. En nuestro ejemplo, hallamos el menor de los dos
últimos números ingresados, y en la misma línea evaluamos el menor de estos dos números con el
primer número ingresado, tal como se muestra a continuación:
Problema 169
Desarrollar un programa en Java que permita generar una cantidad determinada de números
aleatorios. Los números aleatorios generados deberán estar entre 1 y 6. Mostrar el número
generado aleatoriamente y la suma de dichos números.
Clase PrgNumerosAleatorios
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumerosAleatorios {
En la codificación de esta solución se utiliza una sentencia for con la finalidad de generar la cantidad
de números aleatorios (al azar) que el usuario desee. Cada vez que se ejecuta la sentencia for, se
genera y muestra un número aleatorio (un número entre 1 y 6), el cual es acumulado en la variable
suma. Finalizada la ejecución de la sentencia for se muestra el contenido de dicha variable (es decir,
se muestra la suma de los números aleatorios generados).
Recuerde que para generar números aleatorios entre dos números (entre un intervalo o rango),
utilizando el método random ( ) de la clase Math, se emplea la siguiente fórmula:
668 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
1 + (int) ( Math.random( ) * ( 6 – 1 + 1 ) ) ;
1 + (int) ( Math.random( ) * ( 6 ) ) ;
Problema 170
Desarrollar un programa en Java que permita generar una cantidad determinada de números
aleatorios. Los números aleatorios generados deberán estar entre 1 y 10. Mostrar los números
aleatorios que son números pares.
import biblioteca.Lectura ;
class PrgNumAleatoriosPares {
do {
num = 1 + (int) ( Math.random( ) * 10 ) ;
if (num % 2 == 0) {
cont++;
System.out.print ( num + “ \t ” ) ;
}
En la codificación de esta solución se utiliza una sentencia do con la finalidad de generar números aleatorios.
Si el número generado es par se le aumenta uno a la variable cont(que esta trabajando como contador de
números pares generados al azar) y se muestra el número generado.
APÉNDICE - c lasEs crEadas E incorporadas En Java 669
Problema 171
Desarrollar un programa en Java que permita generar una cantidad determinada de números
aleatorios. Los números aleatorios generados deberán estar entre 1 y 10. Mostrar los números
aleatorios que son números impares.
Clase PrgNumAleatoriosImpares
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumAleatoriosImpares {
do {
num = 1 + (int) ( Math.random( ) * 10 ) ;
if ( num % 2 == 1 ) {
cont ++;
System.out.print ( num + “ \t ” ) ;
}
En la codificación de esta solución se utiliza una sentencia do con la finalidad de generar números aleatorios.
Si el número generado es impar se le aumenta uno a la variable cont(que esta trabajando como contador de
números impares generados al azar) y se muestra el número generado.
670 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 172
Desarrollar un programa en Java que permita ingresar por teclado el radio de una esfera. Calcular y
mostrar el volumen de dicha esfera.
Clase PrgRadioEsfera
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgRadioEsfera {
El método pow ( ) retorna un valor double con la potencia de un número (dado como primer
parámetro) elevado a otro número (dado como segundo parámetro). En nuestro caso el método
pow ( ) eleva a la potencia 3 el radio del círculo.
Para hallar el volumen de la esfera se tendrá que utilizar la fórmula v=4/3*PI*R3. La clase Math
define un atributo (constante) muy útil, que contiene el valor del número PI(Math.PI).
APÉNDICE - c lasEs crEadas E incorporadas En Java 671
Problema 173
Desarrollar un programa en Java que permita ingresar un número decimal. Mostrar el número
ingresado redondeado.
Clase PrgNumRedondeado
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumRedondeado {
resultado = Math.round(num) ;
}
}
resultado = Math.round(num) ;
En esta solución se ingresa un número y se almacena en la variable num. Luego, dicho número es
redondeado utilizando el método round( ) y se almacena en la variable resultado.
672 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 174
Desarrollar un programa en Java que permita ingresar un número entero y un exponente. Mostrar
el resultado del cálculo de la potencia de todos los números menores que el número ingresado,
elevado al exponente ingresado.
Clase PrgNumPotencia
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumPotencia {
El método pow ( ) permite elevar a la potencia un número determinado. En la presente solución se utiliza
una sentencia for con la finalidad de elevar a la potencia todos los números menores que la variable cant y
mostrarlos por pantalla. La variable cant y el exponente expo se ingresan a través del teclado.
Recordar que el método pow ( ) de la clase Math, retorna un valor double, por lo que dicho valor deberá ser
almacenado en una variable del mismo tipo o deberá mostrarse por la pantalla.
APÉNDICE - c lasEs crEadas E incorporadas En Java 673
Problema 175
Desarrollar un programa en Java que permita ingresar un número entero. Mostrar el resultado del
cálculode la raíz cuadrada de todos los números menores que el número ingresado.
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumPotencia {
rpta = Math.sqrt ( x ) ;
En esta solución se utiliza una sentencia for con la finalidad de obtener la raíz cuadrada de todos los números
menores que la variable cant, y mostrarlos por pantalla. La variable cant se ingresa a través del teclado.
Recuerde y siempre tenga presente que el método sqrt () de la clase Math, retorna un valor double, el cual
deberá ser almacenado en una variable del mismo tipo o deberá mostrarse por la pantalla.
674 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 176
Desarrollar un programa en Java que permita generar una cantidad determinada de números
aleatorios. Los números aleatorios generados deberán estar entre 1 y 10. Mostrar los números
generados aleatoriamente elevados al cuadrado.
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumAleatorioCuad {
En la presente solución se utiliza una sentencia for con la finalidad de obtener números aleatorios, elevarlos al
cuadrado y mostrarlos por pantalla. La variable cant se ingresa a través del teclado.
APÉNDICE - c lasEs crEadas E incorporadas En Java 675
Problema 177
Desarrollar un programa en Java que permita determinar y mostrar el área de un tríangulo en base
a las longitudes de sus lados. Considerar el valor absoluto de la diferencia entre el semiperímetro y
cada uno de los lados. Utilizar las siguientes fórmulas:
Donde:
p = Semiperímetro.
a, b, c = Lados del triángulo.
Clase PrgTriangulo
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgTriangulo {
p = (a + b + c) / 2 ;
tmp = (p * (Math.abs(p - a)) * (Math.abs(p - c)) * (Math.abs(p - b)));
area = Math.sqrt ( tmp ) ;
En esta solución se ingresan los valores de los tres lados de un triángulo y se obtiene el valor del
semiperímetro del triángulo.
Primero, se hace uso del método abs ( ) de la clase Math para calcular el valor absoluto de la
diferencia entre el semiperímetro y cada uno de los lados del triángulo. Luego, se multiplican los
valores resultantes con el valor del semiperímetro del triángulo y finalmente se obtiene la raíz
cuadrada del valor resultante utilizando el método sqrt ( ) de la clase Math.
Problema 178
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgCirculo {
Problema 179
Desarrollar un programa en Java que permita ingresar un ángulo expresado en grados. Determinar
el tipo de ángulo ingresado y su equivalente en radianes. Los ángulos expresados en grados se
clasifican de la siguiente manera:
0 grados = Nulo
Entre 0 y 90 grados = Agudo
90 grados = Recto
Entre 90 y 180 grados = Obtuso
180 grados = Llano
Entre 180 grados y 360 grados = Cóncavo
360 grados = Completo
Clase PrgConversionAngulo
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgConversionAngulo {
if (anguloGrados == 0)
tipoAngulo = “Nulo” ;
if (anguloGrados > 0 && anguloGrados < 90)
tipoAngulo = “Agudo” ;
if (anguloGrados == 90)
tipoAngulo = “Recto” ;
if (anguloGrados > 90 && anguloGrados < 180)
tipoAngulo = “Obtuso” ;
if (anguloGrados == 180)
tipoAngulo = “Llano” ;
if (anguloGrados > 180 && anguloGrados < 360)
tipoAngulo = “Concavo” ;
if (anguloGrados == 360)
tipoAngulo = “Completo” ;
Para el desarrollo de esta solución se hace uso de sentencias if múltiples, con la finalidad de
determinar el tipo de ángulo ingresado por teclado. El tipo de ángulo es almacenado en una variable
String (tipoAngulo) y mostrado por pantalla.
Para realizar la conversión del ángulo ingresado en el sistema sexagesimal al sistema radial, se utiliza
el método toRadians ( ) de la clase Math.
Problema 180
Desarrollar un programa en Java que permita determinar y mostrar las raíces de una ecuación de
segundo grado. Tipo:
Ax2 + Bx + C = 0
Considerar que la solución puede tener raíces imaginarias. Utilizar la siguiente fórmula:
x = ( - B + - ( ( B ** 2 – 4 * A * C ) RAIZ ( 2 ) ) ) / 2 * A.
Clase PrgEcuacion2Grado
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgEcuacion2Grado {
En esta solución se ingresan los coeficientes de una ecuación de segundo grado (a, b y c). Si los coeficientes a y
b son iguales a cero, se muestra un mensaje por la pantalla: “La ecuación no tiene solución”. Caso contrario, se
determina el valor de la discriminante, el cual se almacena en la variable tmp utilizando la siguiente fórmula:
En caso que el valor de tmp sea igual a cero, se muestra el siguiente mensaje por pantalla; “La ecuación tiene
raices imaginarias”. Caso contrario, si el coeficiente a es igual a cero la ecuación tendría una sola solución, la
cual se calcularía utilizando:
x = c / b * (-1) ;
Si el coeficiente a es diferente de cero la ecuación tendría dos soluciones, las cuales se calcularían utilizando:
x1 = ( - b + Math.sqrt (tmp)) / (2 * a) ;
x2 = ( - b - Math.sqrt (tmp)) / (2 * a)
680 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 181
Desarrollar un juego en Java que permita generar un número aleatorio. Se debe intentar adivinar
qué número es el que generó la computadora. El rango de números válidos en el juego es de 1 a
100, y cada vez que intente adivinar le indicará si el número buscado es menor o mayor.
Clase PrgJuego
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgJuego {
do {
System.out.println ( “ Ingrese un número entre 0..100: ” ) ;
num = Lectura.leerInt( ) ;
} while (num < 0 || num > 100 ) ;
Utilizando el método random ( ) generamos un número aleatorio (al azar) entre el número 0 y el número 100,
utilizando la siguiente fórmula:
Este número generado al azar es almacenado en la variable numAzares, comparado con un número previamente
ingresado por teclado y almacenado en la variable num. Si ambos son iguales, se mostrará un mensaje indicando
que el número numAzar fue encontrado. Si no son iguales, se mostrará un mensaje indicando si el número buscado
es mayor o menor (en relación al número ingresado), y se solicitará otro número hasta encontrar el número que
se generó en forma aleatoria.
Problema 182
Desarrollar un programa en Java que permita ingresar seis números a tráves del teclado. Determinar
y mostrar cuál de ellos es el número mayor y menor.
Clase PrgNumeroMayorMenor
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgNumeroMayorMenor {
Modificar la codificación de la solución, de tal forma que pueda optimizar el código. Utilice una
sentencia for.
Problema 183
Desarrollar un programa en Java que permita ingresar las notas de todos los alumnos de un
determinado salón de clase. Calcular y mostrar el promedio final de cada alumno en base a la
siguiente fórmula:
pf = ( pp + ep + ( ef * 2 ) ) / 4.
Donde:
pf = Promedio final.
pp = Promedio de prácticas.
Son 4 prácticas de las cuales se elimina la más baja
pp = ( p1 + p2 + p3 + p4 – notaMenor ) / 3
ep = Examen parcial.
ef = Examen final.
import biblioteca.Lectura ;
class PrgPromedioNotas {
do {
pf = ( pp + ep + ef ) / 3 ;
pf = Math.round (pf) ;
opc=Lectura.leerChar( ) ;
}
}
Modificar la codificación de la solución de tal forma que se elimine la práctica con la nota más baja y se
duplique la nota de la práctica más alta. Muestre el promedio de las notas redondeado a dos decimales.
Problema 184
Desarrollar un programa en Java que permita ingresar seis números a tráves del teclado. Determinar
y mostrar cuál de ellos es el número mayor y menor.
Clase PrgRedondearNumero
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgRedondearNumero {
double numero ;
System.out.println ( “ -----------------------------------” ) ;
System.out.println ( “ La parte entera del número es: ” ) ;
System.out.println ( Math.floor (numero) ) ;
El método floor ( ) retorna un valor double con el valor más grande no mayor que el parámetro dado,
el cual debe ser double. Nótese que si ingresamos un número cuya parte decimal es mayor que 5,
solo retorna la parte entera. Para tal caso se le agrega 0.5, para que en el segundo cálculo tenga
efecto de redondeo perfecto. Nótese cómo se redondea un número con uno, dos y tres decimales
utilizando el método floor ( ).
Problema 185
Desarrollar un programa en Java que permita realizar un sorteo en base a un número determinado
de boletos.
||Sugerencia: Utilice el método random ( ) de la clase Math para generar el número del boleto
ganador.
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgSorteo {
double num ;
int boletos, ganador ;
do {
if (boletos > 0) {
do {
} while (ganador == 0) ;
Problema 186
Desarrollar un programa en Java que permita calcular la suma de cuadrados y la suma de cubos
de los “n” primeros números. Se deberá ingresar un número por teclado y mostrar los resultados.
Clase PrgSumaCuadradosCubos
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgSumaCuadradosCubos {
}
686 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 187
Desarrollar un programa en Java que permita ingresar un ángulo no mayor de 360, grados ni menor
de 0 grados. Mostrar como resultado el seno y el coseno del ángulo ingresado.
Clase PrgSenCos
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgSenCos {
do{
}
}
APÉNDICE - c lasEs crEadas E incorporadas En Java 687
Es importante mencionar que Java trabaja con el sistema radial, y para obtener las razones
trigonométricas seno y coseno de un ángulo ingresado por teclado, hay que convertirlo primero al
sistema radial. Para esto, utilizamos el método toRadians ( ) de la clase Math. Este método retorna
un valor double y permite convertir un ángulo expresado en el sistema sexagesimal (enviado como
parámetro double) en un ángulo expresado en radianes. Cuando el ángulo está convertido en
radianes, podemos utilizar los métodos sin ( ) y cos ( ) de la clase Math, para obtener el seno y el
coseno del ángulo ingresado por teclado.
Problema 188
Desarrollar un programa en Java que permita ingresar un ángulo de inclinación de la recta con
respecto al eje x. Mostrar como resultado la pendiente de la recta.
import biblioteca.Lectura ;
class PrgTangente {
anguloRadianes = Math.toRadians(anguloGrados) ;
tangente = Math.tan(anguloRadianes) ;
System.out.println ( “ La pendiente de la resta es = ” + tangente ) ;
}
}
El método tan ( ) permite hallar la pendiente de una recta con respecto al eje X. Para ello utiliza el ángulo de
inclinación de la recta, expresado en el sistema radial, tal y como se muestra:
tangente = Math.tan(anguloRadianes) ;
688 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 189
Desarrollar un programa en Java que permita ingresar los catetos de un triángulo perpendicular.
Calcular y mostrar la hipotenusa del triángulo.
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgHipotenusa {
}
}
La fórmula para este caso sería: (hipotenusa)2 = (cateto1)2 + (cateto2)2 . Se ingresan los catetos por
el teclado y son elevados al cuadrado con Math.pow( ). El resultado obtenido al elevar al cuadrado
cada uno de los catetos, se suma. Luego se obtiene la raíz cuadrada con Math.sqrt( ) y finalmente
se muestra el resultado almacenado en la variable hipotenusa. Ejemplo:
Problema 190
Desarrollar un programa en Java que permita ingresar la ordenada y la abscisa de un punto. Calcular
y mostrar el ángulo de las coordenadas del punto en grados.
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgPunto {
}
}
Sabemos que Math.atan ( ) retorna un valor double con el arcotangente de un ángulo expresado
en radianes. Dicho ángulo expresado en radianes debe ser un valor double enviado al método como
parámetro.
En este caso, se ingresan por teclado la ordenada y la abcisa de un punto cualquiera en el sistema de
coordenadas, por lo que el método atan ( ) de la clase Math no nos serviría (este método necesita
el valor de un ángulo expresado en radianes y no los valores de las coordenadas de un punto).
En este caso, se utiliza el método atan2 ( ) de la clase Math. Este método nos permite obtener el
valor del arcotangente de un par ordenado.
Problema 191
Desarrollar un programa en Java que permita ingresar un número cualquiera. Calcular y mostrar el
número “e” elevado al número ingresado, y el logaritmo natural (de base e) del número ingresado.
import biblioteca.Lectura ;
class PrgExpLog {
exponencial = Math.exp(num) ;
logaritmo = Math.log(num) ;
exponencial = Math.exp(num) ;
logaritmo = Math.log(num) ;
En esta solución se hace necesario el uso del método exp ( ) para obtener el número e elevado al
número ingresado por teclado:
enum
También se hace necesario el uso del método log ( ) para obtener el logaritmo natural del número
ingresado en base e:
logenum
Tenga presente que Java solo resuelve logaritmos en base e y no en base 10.
APÉNDICE - c lasEs crEadas E incorporadas En Java 691
Problema 192
Un jugador lanza dos dados, cada uno de los cuales tiene seis caras, las caras contienen 1, 2, 3, 4 ,5 y
6 puntos. Una vez que los dados quedan en reposo, se suman los puntos de las dos caras que quedan
hacia arriba. Si la suma es 7 u 11 en el primer lanzamiento, el jugador gana. Si la suma es 2, 3 o 12 en
el primer lanzamiento (resultado que en los casinos reciben el nombre de “craps”), el jugador pierde
(es decir, la casa gana). Si la suma es 4, 5, 6, 8, 9, 10 en el primer lanzamiento, esta suma se convierte
en el punto del jugador. Para ganar, el jugador debe seguir tirando los dados hasta “lograr su punto”.
El jugador perderá si tira un 7 antes de lograr su punto.
package dominioDeLaAplicacion ;
import biblioteca.* ;
class PrgLanzarDados1 {
do {
if ( suma1 == 7 || suma1 == 11 ) {
opc1 = “s” ;
estado = 1 ;
} else
if ( suma1 == 2 || suma1 == 3 || suma1 == 12 ) {
opc1 = “s” ;
estado = 0 ;
} else {
692 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
do {
System.out.println ( “Lanzar dados” ) ;
Lectura.leerString ( ) ;
if ( suma1 == suma2 ) {
estado = 1 ;
opc1 = “s” ;
opc2 = “s” ;
} else
if ( suma2 == 7 ) {
estado = 0 ;
opc1 = “s” ;
opc2 = “s” ;
}
}
}while ( opc1 != “s” ) ;
if ( estado == 1 )
System.out.println ( “El jugador gana” ) ;
else
System.out.println ( “El jugador pierde ” ) ;
}
}
Problema 193
Modificar el programa del problema anterior, de tal forma, que se muestre un mensaje preguntando
si desea volver a tirar los dados.
Clase PrgLanzarDados2
package dominioDeLaAplicacion ;
import biblioteca.* ;
class PrgLanzarDados2 {
do {
opc1 = “ ” ;
opc2 = “ ” ;
do {
if ( suma1 == 7 || suma1 == 11 ) {
opc1 = “s” ;
estado = 1 ;
} else
if (suma1 == 2 || suma1 == 3 || suma1 == 12) {
opc1 = “s” ;
estado = 0 ;
} else {
do {
System.out.println (“Lanzar dados”);
Lectura.leerString ( ) ;
if ( suma1 == suma2 ) {
estado = 1 ;
opc1 = “s” ;
opc2 = “s” ;
} else
if ( suma2 == 7 ) {
estado = 0 ;
opc1 = “s” ;
opc2 = “s” ;
}
}
} while ( opc1 != “s” ) ;
if ( estado == 1 )
System.out.println ( “ El jugador gana ” ) ;
else
System.out.println ( “ El jugador pierde ” ) ;
694 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
opc3 = Lectura.leerChar ( ) ;
}
}
Problema 194
Elaborar un programa que simule el lanzamiento de una moneda. Solicitar el número de veces que
se lanzará la moneda, contar el número de veces que aparece cada lado de la moneda y mostrar
los resultados.
Clase PrgLanzarMoneda
package dominioDeLaAplicacion ;
import biblioteca.* ;
class PrgLanzarMoneda {
if (moneda == 1)
cont1 ++ ;
else
cont2 ++ ;
Problema 195
Elaborar un programa que simule el juego de tragamonedas, las opciones para ganar son los
números: 1, 2, 3, 4, 5 ,6 y 7. El jugador gana cuando el número se repita tres veces. Los números
deberán ser generados aleatoriamente. El premio mayor se obtiene con el número 7.
import biblioteca.* ;
class PrgTragamoneda1 {
do {
s = (char) valor1 ;
switch (s) {
case 1 :
monto = 100 ;
break ;
case 2 :
monto = 200 ;
break ;
case 3 :
monto = 300 ;
break ;
case 4 :
monto = 400 ;
break ;
case 5 :
monto = 500 ;
break ;
case 6 :
monto = 600 ;
break ;
case 7 :
monto = 1000 ;
break ;
}
696 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
monto = 0 ;
System.out.println ( “Desea volver a jugador [s/n] : ” ) ;
opc1 = Lectura.leerChar ( ) ;
Problema 196
Modificar el programa del problema anterior, de tal forma que se muestre la cantidad acumulada
del dinero ganado en el tragamoneda.
Clase PrgTragamoneda2
package dominioDeLaAplicacion ;
import biblioteca.* ;
class PrgTragamoneda2 {
do {
s= (char) valor1 ;
switch ( s ) {
case 1 :
monto=100 ;
break ;
case 2 :
monto=200 ;
break ;
APÉNDICE - c lasEs crEadas E incorporadas En Java 697
case 3 :
monto=300 ;
break ;
case 4 :
monto=400 ;
break ;
case 5 :
monto=500 ;
break ;
case 6 :
monto=600 ;
break ;
case 7 :
monto=1000 ;
break ;
}
} else
System.out.println ( “La casa gana” ) ;
monto = 0 ;
System.out.println ( “Desea volver a jugador [s/n] : ” ) ;
opc1=Lectura.leerChar ( ) ;
Problema 197
Las computadoras están desempeñando un papel cada vez más importante en la educación.
Clase PrgMultiplicacion
package dominioDeLaAplicacion ;
import biblioteca.* ;
class PrgMultiplicacion {
if ( resul1 == resul2 )
System.out.println ( “Respuesta correcta… Muy bien” ) ;
else
System.out.println (“No es la respuesta correcta… Vuelva a
intentarlo”);
Problema 198
Modificar el programa del problema anterior, de tal forma que se muestre un menú de opciones
que permita sumar, restar, multiplicar y dividir dos números generados al azar. El estudiante podrá
contestar la misma pregunta ilimitadamente hasta que responda correctamente.
Clase PrgMenuOperaciones1
package dominioDeLaAplicacion ;
import biblioteca.* ;
class PrgMenuOperaciones1 {
do {
APÉNDICE - c lasEs crEadas E incorporadas En Java 699
case 1 :
resul1 = valor1 + valor2 ;
operacion = “Suma” ;
signo = ‘+’ ;
break ;
case 2 :
resul1 = valor1 - valor2 ;
operacion = “Resta” ;
signo = ‘-’ ;
break ;
case 3 :
resul1 = valor1 * valor2 ;
operacion = “Multiplicación” ;
signo = ‘*’ ;
break ;
case 4 :
resul1 = valor1 / valor2 ;
operacion = “División” ;
signo = ‘/’ ;
break ;
case 5 :
System.exit (0) ;
break ;
}
do {
if ( resul1 != resul2 )
System.out.println (“No es, por favor trata otra vez”);
} while ( op != 5 ) ;
}
}
700 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 199
Modificar el programa del problema anterior, de tal forma que se muestre un menú de opciones que
permita sumar, restar, multiplicar y dividir dos números al azar. Mostrar la cantidad de preguntas
correctas y la cantidad de preguntas incorrectas.
import biblioteca.* ;
class PrgMenuOperaciones2 {
do {
case 1 :
resul1 = valor1 + valor2 ;
operacion = “Suma” ;
signo = ‘+’ ;
break ;
case 2 :
resul1 = valor1 - valor2 ;
operacion = “Resta” ;
signo = ‘-’ ;
break ;
case 3 :
resul1 = valor1 * valor2 ;
operacion = “Multiplicación” ;
signo = ‘*’ ;
break ;
APÉNDICE - c lasEs crEadas E incorporadas En Java 701
case 4 :
resul1 = valor1 / valor2 ;
operacion = “División” ;
signo = ‘/’ ;
break ;
case 5 :
System.exit (0) ;
break ;
}
if ( resul1 != resul2 ) {
System.out.println ( “No es, por favor trata otra vez” ) ;
cont1 ++ ;
} else {
System.out.println ( “Muy bien” ) ;
cont2 ++ ;
}
} while ( op != 5 ) ;
}
}
Problema 200
Elaborar un programa que permita adivinar cuál es el número entero generado al azar entre 1 y
1000. El jugador ingresará una primera estimación; si es incorrecta, el programa deberá indicar
si el número ingresado fue mayor o menor al número generado al azar. Cuando la respuesta sea
correcta, se mostrará el mensaje de felicitaciones.
Etapa 04 - Desarrollo de la codificación
Clase PrgAdivinarNumero1
package dominioDeLaAplicacion ;
import biblioteca.* ;
class PrgAdivinarNumero1 {
Problema 201
Modificar el programa del problema anterior, de tal forma que se pueda ingresar la cantidad de
intentos que se tiene para adivinar el número.
Import biblioteca.* ;
class PrgAdivinarNumero2 {
do {
System.out.println ( “Ingresar número : ” ) ;
num = Lectura.leerInt ( ) ;
if (cont >= intentos ) {
APÉNDICE - c lasEs crEadas E incorporadas En Java 703
Introducción
La clase String es una clase que viene incorporada en el lenguaje de programación Java, incluida
en el paquete java.lang, la cual permite declarar y manipular variables de tipo texto o cadena (en
realidad no se declaran variables de tipo texto o cadena, sino que se crean objetos de la clase String).
Ejemplo:
java.lang.Object
java.lang.Object
El paquete java.lang es el paquete principal del lenguaje Java, por lo cual no se necesita importar
ninguna clase incluida en dicho paquete. En consecuencia, no será necesario importar el paquete
java.lang cada vez que se necesite utilizar la clase String de Java.
La clase String permite manipular las variables de tipo texto o cadena a través de los métodos que
implementa (la clase String tiene métodos de instancia y métodos de clase). La clase String incluye
métodos que permiten examinar los caracteres individuales de una cadena para compararlos,
ubicarlos o extraerlos como subcadenas y para crear copias de una cadena convirtiendo todos sus
caracteres en letra mayúscula o minúscula.
704 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Las conversiones son realizadas a través del método toString ( ), método definido en la clase Object,
el cual puede ser utilizado por todas las clases Java a través de la herencia.
Métodos
A. Métodos de instancia:
1.- charAt( ).
2.- compareTo( ).
3.- concat( ).
4.- endsWith( ).
5.- equals( ).
6.- equalsIgnoreCase( ).
7.- indexOf( ).
8.- lastIndexOf( ).
9.- length( ).
10.- matches().
11.- replace( ).
12.- split( ).
13.- startsWith( ).
14.- substring( ).
15.- toCharArray( ).
16.- toLowerCase( ).
17.- trim( ).
18.- toUpperCase( ).
B. Métodos de clase:
19.- valueOf( ).
Para trabajar con los métodos de instancia de la clase String, es necesario previamente haber
declarado y asignado un valor a una variable de tipo texto o cadena. Para el caso de los métodos de
clase esto no será necesario.
Para ejecutar un método de instancia de la clase String es necesario colocar el nombre de la variable
(que debe ser de tipo texto o cadena), el operador punto (.) y el nombre del método de instancia que
se desea ejecutar. Para el caso de los métodos de clase deberá colocar la palabra String, el operador
punto (.) y el nombre del método de clase que se desea ejecutar.
Asimismo, para ejecutar cualquiera de los métodos de la clase String, se debe tener en cuenta que si
el método necesita algunos datos, estos deben ser necesariamente proporcionados en la cantidad y
tipos requeridos. En caso de que el método devuelva un resultado, este deberá almacenarse en una
variable del mismo tipo o mostrarse a través de la pantalla.
APÉNDICE - c lasEs crEadas E incorporadas En Java 705
A continuación, se presenta una breve descripción del uso de cada uno de los métodos de la clase
String:
CLASE String
Si la cadena es alfabéticamente
menor que la cadena colocada como
parámetro, el método devuelve un String cad1 = “Hola Danae”;
número entero menor que cero. Si String cad2 = “Hola Pedro”;
las dos cadenas son alfabéticamente int x = cad1.compareTo(cad2);
compareTo(String)
iguales devuelve un número cero,
y si la cadena es alfabéticmente Resultado:
mayor que la cadena colocada como x < 0 (cad1<cad2).
parámetro, el método devuelve un
número entero mayor que cero.
Resultado:
cadena = "Hola a todos”
Resultado:
x = 5.
substring(int)
Devuelve una subcadena a partir de
la cadena especificada, empezando Resultado:
desde la posición indicada en el x = “Danae”.
primer parámetro hasta el final o hasta
una posición anterior a la indicada en String cad1 = “Hola Danae”;
el segundo parámetro del método. String x = cad1.substring(6,9);
substring(int,int)
Resultado:
x = “ana”.
String.valueOf(boolean)
String.valueOf(int)
double pi = 3.1416;
String.valueOf(long)
Método de clase que permite String x = String.valueOf(pi);
String.valueOf(float)
convertir los valores de otros tipos
String.valueOf(double)
de datos o variables a una cadena. resultado:
String.valueOf(Object)
x = “3.1416”.
String.valueOf(char[ ])
String.valueOf(char[ ], int,int)
A continuación, con la finalidad de mejorar la comprensión del tema tratado, se presentan algunas
soluciones de los problemas planteados, utilizando algunos de los métodos de la clase String. Analice
cada una de las siguientes soluciones:
APÉNDICE - c lasEs crEadas E incorporadas En Java 709
Problema 202
Desarrollar un programa en Java que permita ingresar el nombre de un alumno. Mostrar el nombre
del alumno en letra mayúscula.
Clase PrgConvertirMayuscula
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgConvertirMayuscula {
String nom ;
nom = nom.toUpperCase( ) ;
nom.toUpperCase ( ) ;
Operador punto
Nombre de la variable (objeto)
El método toUpperCase ( ) se utiliza con variables de tipo String y permite convertir en letras
mayúsculas el contenido de la variable que antecede al nombre del método y al operador punto (en
nuestro caso la variable nom). Como el método toUpperCase ( ) devuelve un valor de tipo String (el
contenido de la variable en letra mayúscula), se puede mostrar el resultado utilizando System.out.
println o almacenarlo en una variable (que puede ser la variable que contenía la cadena original),
tal y como se ha realizado en el ejemplo:
nom = nom.toUpperCase ( ) ;
* Importante: Tener presente que el método toUpperCase ( ) solo se puede utilizar con variables de
tipo String y su función es convertir el contenido de una variable en letras mayúsculas.
710 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 203
Desarrollar un programa en Java que permita ingresar el nombre de un alumno. Mostrar el nombre
del alumno en letras minúsculas.
Clase PrgConvertirMinuscula
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgConvertirMinuscula {
String nom ;
nom = nom.toLowerCase( ) ;
Operador punto.
Nombre de la variable (objeto).
El método toLowerCase ( ) se utiliza con variables de tipo String y permite convertir en letras
minúsculas el contenido de la variable que antecede al nombre del método y al operador punto
(en nuestro caso la variable nom). Como el método toLowerCase ( ) nos devuelve un valor de tipo
String (el contenido de la variable en letra minúscula), podemos mostrar el resultado utilizando
System.out.println o almacenarlo en una variable (que puede ser la variable que contenía la cadena
original), tal y como se ha realizado en el siguiente ejemplo:
nom = nom.toLowerCase ( ) ;
Es importante tener presente que el método toLowerCase ( ) es un método que solo podemos
utilizar con variables de tipo String, y su función es convertir el contenido de una variable en letras
minúsculas.
APÉNDICE - c lasEs crEadas E incorporadas En Java 711
Problema 204
Desarrollar un programa en Java que permita ingresar el primer nombre y el segundo nombre de un
alumno. Concatenar y mostrar los nombres del alumno en letras mayúsculas y minúsculas.
Clase PrgConcatenarNombres
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgConcatenarNombres {
nom1 = nom1.concat(espacio) ;
nombre = nom1.concat(nom2) ;
El método concat ( ) se utiliza para juntar o concatenar el contenido de dos variables de tipo String
(la misma función cumple el signo “+ “cuando trabaja con variables de tipo String). Es decir, el
contenido de la variable nom1 y el contenido de la variable espacio se juntan (o concatenan) y el
resultado se almacena en la variable que antecede al signo = (en nuestro caso la misma variable
nom1). Luego el contenido de la variable nom1 se junta con el contenido de la variable nom2 y el
resultado se almacena en la variable nombre.
Esto permite concatenar los nombres del alumno con un espacio en blanco entre ellos, en una única
variable de tipo String.
También podría visualizarse directamente el resultado de concatenar dos variables de tipo String
(cadenas) utilizando System.out.println, como se muestra a continuación:
Problema 205
Desarrollar un programa en Java que permita ingresar el nombre de un alumno, mostrar el número
de caracteres del nombre ingresado por teclado y consistenciar el nombre del alumno al momento
de ingresarlo.
Clase PrgLongitudCadena
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgLongitudCadena {
int cant ;
String nom ;
do {
System.out.println ( “ Ingresar el nombre: ” ) ;
nom = Lectura.leerString( ) ;
nom = nom.trim( ) ;
if ( nom.length( ) < 2 ) {
System.out.println (“ Nombre ingresado no válido… Reintente! ”);
}
} while (nom.length( ) < 2 ) ;
cant = nom.length( ) ;
nom = nom.trim ( ) ;
El método trim( ) permite eliminar los espacios en blanco que pueden existir al inicio y/o al final de
una cadena contenida en una variable (en nuestro caso la cadena contenida en la variable nom).
Esto se realiza como precaución porque el usuario podría presionar la barra espaciadora antes de
ingresar el nombre del alumno, y esto se almacena en la variable como espacios en blanco.
cant = nom.length ( ) ;
El método length ( ) se utiliza con variables de tipo String y nos permite contar la cantidad de
caracteres que almacena una variable (en nuestro caso, la cantidad de caracteres que almacena la
variable nom). Como el método length ( ) devuelve la cantidad de caracteres que tiene una variable
(incluidos los espacios en blanco), podemos mostrar el resultado utilizando System.out.println(),
utilizarlo en una condición lógica o almacenarlo en una variable. En el ejemplo se utiliza como
condición lógica y para almacenarlo en una variable.
En las líneas de código mostradas a continuación, se consistencia el ingreso del nombre, de tal
forma que no se permita ingresar un nombre que tenga menos de dos caracteres (se asume que
puede haber nombres de dos caracteres o más, como por ejemplo; Lu, Ana, José, Pedro; que tienen
2, 3, 4 y 5 caracteres respectivamente).
do {
System.out.println ( “ Ingresar el nombre: ” ) ;
nom = Lectura.leerString( ) ;
nom = nom.trim ( ) ;
if ( nom.length ( ) < 2 ) {
System.out.println ( “Nombre ingresado no válido… Reintente! ” ) ;
}
} while (nom.length ( ) < 2) ;
714 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 206
Desarrollar un programa en Java que permita ingresar el nombre de un alumno. Mostrar el nombre
del alumno en letras mayúsculas. Consistenciar el nombre del alumno al momento de ingresarlo.
Clase PrgConvertirMayuscula2
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgConvertirMayuscula2 {
do {
System.out.println ( “ Ingresar el nombre: ” ) ;
nom = Lectura.leerString( ) ;
nom = nom.trim( ) ;
if ( nom.length( ) < 2 ) {
System.out.println ( “ Nombre ingresado no válido… Reintente! ” ) ;
}
} while ( nom.length( ) < 2 ) ;
nom = nom.toUpperCase( ) ;
System.out.println ( “ El nombre en Mayúscula es: ” + nom ) ;
}
}
En la codificación de este programa se deben eliminar los espacios en blanco que la variable nom
pueda tener al inicio y al final del dato que contiene. Luego se consistencia que tenga por lo menos
dos caracteres. Después se convierte el contenido de la variable nom en letra mayúscula, para
finalmente mostrar su contenido en pantalla.
En consecuencia, se puede afirmar que esta solución es óptima en comparación con la presentada
en el problema 100.
APÉNDICE - c lasEs crEadas E incorporadas En Java 715
Problema 207
Desarrollar un programa en Java que permita ingresar el nombre de un alumno. Mostrar el primer
carácter del nombre ingresado en mayúscula.
Clase PrgPrimeroMayuscula
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgPrimeroMayuscula {
do {
System.out.println ( “ Ingresar el nombre: ” ) ;
nom = Lectura.leerString( ) ;
nom = nom.trim( ) ;
if ( nom.length( ) < 2 ) {
System.out.println ( “ Nombre ingresado no válido… Reintente! ” ) ;
}
} while (nom.length( ) < 2 ) ;
cadena1 = nom.substring(0,1) ;
cadena1 = cadena1.toUpperCase( ) ;
cadena2 = nom.substring(1) ;
nom = cadena1.concat(cadena2) ;
cadena1 = nom.substring(0,1) ;
cadena2 = nom.substring(1) ;
El método substring( ) se utiliza de dos formas. La primera forma nos permite obtener una subcadena
desde una posición inicial hasta un carácter antes de la posición final indicada. La segunda forma
nos permite obtener una subcadena desde una posición determinada hasta el final de la cadena.
Imagínese que la variable nom contiene el nombre “danae”, tal y como se muestra a continuación:
nom = “danae”.
716 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Cuando manipulamos cadenas con el método substring( ) debemos tener en cuenta que cada
carácter de la cadena tiene una determinada posición, empezando por la posición cero (0).
nom = “danae”.
cadena1 = nom.substring(0,1) ;
Donde, el primer número del método substring ( ) indica la posición de la cadena nom (desde el
inicio de la subcadena), y el segundo número indica la posición final de la cadena (es importante
mencionar que se debe incluir hasta un carácter antes de la posición final indicada). Esto nos permite
solo obtener el primer carácter de nom (la letra “d”).
Suponiendo que se quiere obtener la subcadena “ana” de la cadena “danae” contenida en la variable
nom, utilizaríamos la siguiente sentencia:
Continuando con nuestro ejemplo, una vez obtenida la primera letra del nombre se convierte a
mayúscula, utilizando:
cadena1 = cadena1.toUpperCase ( ) ;
Ahora es necesario obtener el resto del contenido de la variable nom. Esto lo realizamos utilizando:
Esta es la segunda forma de utilizar el método substring ( ), donde el número (en nuestro caso el
número 1) indica la posición de la cadena nom, donde va a comenzar la subcadena (la primera letra
“a”) hasta el final de la cadena.
Ahora en la variable cadena1 tenemos almacenada la letra “D” y en la variable cadena2 tenemos
almacenadas las letras “anae”. Para finalizar, solo será necesario concatenar ambas variables en la
variable original nom, utilizando el método concat ( ).
Problema 208
Desarrollar un programa en Java que permita ingresar el nombre de un alumno. Mostrar el primer
carácter del nombre ingresado en mayúscula y el resto en minúsculas.
Clase PrgMayusculaMinuscula
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgMayusculaMinuscula {
int cant ;
String nom, cadena1 = “” , cadena2 = “” ;
do {
System.out.println ( “ Ingresar el nombre: ” ) ;
nom = Lectura.leerString( ) ;
nom = nom.trim( ) ;
if ( nom.length( ) < 2) {
System.out.println ( “ Nombre ingresado no válido… Reintente! ” ) ;
}
} while (nom.length( ) < 2 ) ;
cadena1 = nom.substring(0,1) ;
cadena1 = cadena1.toUpperCase( ) ;
cadena2 = nom.substring(1) ;
cadena2 = cadena2.toLowerCase( ) ;
nom = cadena1.concat(cadena2) ;
System.out.println ( “ El nombre del alumno es: ” + nom ) ;
}
}
Observe el uso de los métodos trim ( ), length ( ), substring ( ) en sus dos formas, toUpperCase ( ),
toLowerCase ( ) y concat ( ) de la clase String.
En la codificación de este programa, se convierte en mayúscula la primera letra del nombre y el resto
se convierte en minúscula. Esto como precaución de que se ingrese todo el nombre en mayúscula,
o en forma combinada entre letras mayúsculas y minúsculas. Finalmente siempre el nombre tendrá
la primera letra en mayúscula y el resto en letra minúscula.
En consecuencia, se puede afirmar que esta solución es óptima en comparación con la presentada
en el problema 104.
718 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 209
Desarrollar un programa en Java que permita ingresar el nombre completo de un alumno (nombres
y apellidos en una sola variable). Mostrar el primer carácter de cada palabra del nombre en
mayúsculas y el resto de cada palabra en minúscula.
Clase PrgNombreCompleto
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgNombreCompleto {
do {
System.out.println ( “ Ingresar el nombre: ” ) ;
nom = Lectura.leerString( ) ;
nom = nom.trim( ) ;
if ( nom.length( ) < 2) {
System.out.println ( “ Nombre ingresado no válido… Reintente! ” ) ;
}
} while (nom.length( ) < 2) ;
cant = nom.length( ) ;
for (int x=0; x<cant; x++) {
if ( x==0) {
cadena1 = nom.substring(0,1) ;
cadena1 = cadena1.toUpperCase( ) ;
cadena2 = nom.substring(1) ;
cadena2 = cadena2.toLowerCase( ) ;
nom = cadena1.concat(cadena2) ;
} else {
caracter = nom.substring(x, x+1) ;
if (caracter.equals ( “ ” ) ) {
cadena1 = nom.substring(0,x+1) ;
caracter = nom.substring(x+1, x+2) ;
caracter = caracter.toUpperCase( );
cadena2 = nom.substring(x+2) ;
nom = cadena1 + caracter + cadena2 ;
}
}
}
System.out.println ( “ El nombre del alumno es: ” + nom ) ;
}
}
APÉNDICE - c lasEs crEadas E incorporadas En Java 719
if (caracter.equals (“ “)) { }
El método equals ( ) se utiliza con variables de tipo String y nos permite comparar el contenido
de dos cadenas (en nuestro caso la variable caracter con un espacio en blanco). Si al comparar el
contenido de las dos cadenas resulta que ambas variables son iguales, el método equals ( ) nos
devuelve un valor verdadero (true), en caso contrario nos devuelve un valor falso (false). Este valor
devuelto se evalúa en la estructura de decisión if.
Nosotros desearíamos que la primera letra de cada nombre y apellido de un alumno estén en letra
mayúscula y el resto en minúsculas.
Al inicio utilizamos parte de la solución del problema 105. Después obtenemos carácter por carácter
y evaluamos si el carácter obtenido es un espacio en blanco. Si el carácter resulta ser un espacio
en blanco, entonces se almacena y se convierte en letra mayúscula, y la siguiente letra al espacio
en blanco. El siguiente esquema muestra cómo se debe almacenar parcialmente el nombre del
ejemplo en la variable nom.
Después se concatenan las tres variables y se almacenan en la variable nom. El proceso se repite
hasta llegar al final de la cadena.
Ahora considere si entre los nombres existe más de un espacio en blanco. ¿Qué sucede? Modificando
la solución anterior para poder considerar la problemática, tendríamos la siguiente variación:
cant = nom.length( ) ;
sw = false ;
for (int x=0; x<cant; x++) {
if (x==0) {
cadena1 = nom.substring(0,1) ;
cadena1 = cadena1.toUpperCase( ) ;
cadena2 = nom.substring(1) ;
cadena2 = cadena2.toLowerCase( ) ;
nom = cadena1.concat(cadena2) ;
} else {
caracter = nom.substring(x, x+1) ;
if (caracter.equals( “ ” ) ) {
720 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
,
sw = true ;
} else {
if (sw) {
cadena1 = nom.substring(0,x) ;
caracter = nom.substring(x, x+1) ;
caracter = caracter.toUpperCase( );
cadena2 = nom.substring(x+1) ;
nom = cadena1 + caracter + cadena2 ;
sw = false ;
}
}
}
}
En esta parte modificada de la solución se utiliza un centinela (o flag), que nos permite indicar
el momento preciso para realizar la conversión de la primera letra del nombre o apellido a letra
mayúscula, sin preocuparnos de la cantidad de espacios en blanco que pueda existir entre dos
nombres.
Problema 210
Desarrollar un programa en Java que permita ingresar los apellidos y nombres de un obrero (en una
sola variable). Mostrar el número de caracteres blancos o espacios en blanco que existan.
Clase PrgLongitudCadenaBlanco
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgLongitudCadenaBlanco {
int x,cant,cont=0 ;
String nom,caracter ;
do {
System.out.println ( “ Ingresar el nombre: ” ) ;
nom = Lectura.leerString( ) ;
nom = nom.trim( ) ;
if ( nom.length( ) < 2 ) {
System.out.println ( “ Nombre ingresado no válido… Reintente! ” ) ;
}
APÉNDICE - c lasEs crEadas E incorporadas En Java 721
cant = nom.length( ) ;
for (x=0;x<cant;x++) {
caracter = nom.substring(x,x+1) ;
if (caracter.equals ( “ ” ) ) {
cont ++ ;
}
}
System.out.println ( “ La cantidad de espacios: ” + cont ) ;
}
}
Observe el uso de los métodos trim ( ), length ( ), substring ( ) y equals ( ) de la clase String.
En la codificación de este programa, se evalúa carácter por carácter (de la variable nom). Si el carácter
es igual a un espacio en blanco (“ “), se le aumenta uno a la variable cont (que está trabajando como
contador de espacios encontrados en la variable nom).
Problema 211
Desarrollar un programa en Java que permita ingresar los apellidos y nombres de un obrero (en
una sola variable). Mostrar el número de caracteres del nombre ingresado por teclado que no sean
espacios en blanco.
Clase PrgLongitudCadenaNoBlanco
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgLongitudCadenaNoBlanco {
do {
System.out.println ( “ Ingresar el nombre: ” ) ;
nom = Lectura.leerString( ) ;
nom = nom.trim( ) ;
if ( nom.length( ) < 2 ) {
System.out.println (“Nombre ingresado no válido… Reintente!”);
}
} while (nom.length( ) < 2 ) ;
cant = nom.length( ) ;
for (x=0; x<cant; x++) {
722 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
caracter = nom.substring(x,x+1) ;
if ( !caracter.equals ( “ ” ) ) {
cadena = cadena.concat(caracter) ;
}
}
cant = cadena.length( ) ;
System.out.println ( “ La cantidad de caracteres sin contar espacios: ”+cant);
}
}
Observe el uso de los métodos trim ( ), length ( ), substring ( ) y equals ( ) de la clase String.
En la codificación de este programa, se evalúa carácter por carácter (de la variable nom). Si el
carácter no es un espacio en blanco, se concatena con los caracteres de la variable cadena (al inicio
no contiene ningún carácter). Al final se obtiene la longitud de la variable cadena, que equivale a la
cantidad de caracteres de la variable nom, diferentes a espacios en blanco.
Problema 212
Desarrollar una solución que permita ingresar los apellidos y nombres de un obrero (en una sola
variable). Mostrar el número de caracteres que no son espacios en blanco y el número de caracteres
que son espacios en blanco.
Clase PrgLongitudCadenaBlancoNoBlanco
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgLongitudCadenaBlancoNoBlanco {
do {
System.out.println ( “ Ingresar el nombre: ” ) ;
nom = Lectura.leerString( ) ;
nom = nom.trim( ) ;
if ( nom.length( ) < 2 ) {
System.out.println ( “ Nombre ingresado no válido… Reintente! ” ) ;
}
APÉNDICE - c lasEs crEadas E incorporadas En Java 723
cant = nom.length( ) ;
}
}
En la codificación de este programa se emplea la misma estrategia que la utilizada en la solución del
problema 108, para obtener el número de espacios en blanco contenidos en la variable nom. Al final
se obtiene la longitud total de la cadena nom y realizando una simple resta se obtiene el número de
caracteres de la variable nom que no son espacios en blanco.
Problema 213
Desarrollar una solución que permita ingresar el nombre de un alumno. Mostrar el número de
vocales que hay en el nombre ingresado.
Clase PrgTotalVocales1
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgTotalVocales1 {
do {
System.out.println ( “ Ingresar el nombre: ” ) ;
nom = Lectura.leerString( ) ;
nom = nom.trim( ) ;
if ( nom.length( ) == 0 ) {
System.out.println ( “ Nombre ingresado no válido… Reintente! ” ) ;
}
724 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
} while (nom.length( ) == 0 ) ;
cant = nom.length( ) ;
nom = nom.toLowerCase( ) ;
nom.charAt (x) ;
El método charAt( ) se utiliza con variables de tipo String y nos permite obtener un carácter de
una cadena. En nuestro caso, obtenemos un carácter de la variable nom y lo almacenamos en una
variable de tipo char (el método charAt ( ) devuelve un carácter).
c = nom.charAt (x) ;
El carácter obtenido es evaluado para determinar si es o no una vocal. Esta evaluación se realiza a
través de los códigos ASC correspondientes a las vocales (Importante: la evaluación de una variable
de tipo char se puede realizar utilizando los códigos ASC equivalentes a los caracteres especiales,
letras y números).
Antes de iniciar la evaluación de cada uno de los caracteres de la variable nom, se utiliza el método
toLowerCase ( ) para asegurarnos de convertir a letras minúsculas todos los caracteres de la variable
nom, y luego utilizar los códigos ASC equivalentes a las vocales en minúscula.
Modifique la solución anterior de tal forma que pueda determinar cuántas vocales almacenadas en
la variable son; a, e, i, o y u (en forma independiente).
APÉNDICE - c lasEs crEadas E incorporadas En Java 725
Problema 214
Desarrollar un programa en Java que permita ingresar el nombre de un alumno. Mostrar el número
de vocales y el número de caracteres que no son vocales, que hay en el nombre ingresado.
if ( nom.length( ) == 0 ) {
System.out.println (“Nombre ingresado no válido… Reintente!”);
}
} while (nom.length( ) == 0 ) ;
cant = nom.length( ) ;
nom = nom.toLowerCase( ) ;
Problema 215
Desarrollar un programa en Java que permita ingresar dos cadenas. Contar y mostrar cuántas veces
se repite la segunda cadena en la primera cadena ingresada.
Clase PrgCadenaSubcadena
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgCadenaSubcadena {
do {
System.out.println ( “ Ingresar una cadena: ” ) ;
cad1 = Lectura.leerString( ) ;
cad1 = cad1.trim( ) ;
if (cad1.length( ) == 0 ) {
System.out.println ( “ Cadena ingresada no válido... Reintente! ” ) ;
}
} while (cad1.length( ) == 0 ) ;
do {
System.out.println ( “ Ingresar una subcadena de la primera cadena: ” ) ;
cad2 = Lectura.leerString( ) ;
cad2 = cad2.trim( ) ;
if (cad2.length( ) == 0) {
System.out.println ( “ Cadena ingresada no válida... Reintente! ” ) ;
}
} while (cad2.length( ) == 0 ) ;
} else {
if (cad1.equals (cad2) ) {
System.out.println ( “ las cadenas son iguales ” ) ;
} else {
System.out.println (“la segunda cadena no debe tener una longitud”);
System.out.println ( “ mayor que la primera cadena ” ) ;
}
}
}
}
APÉNDICE - c lasEs crEadas E incorporadas En Java 727
Observe el uso de los métodos trim ( ), length ( ), substring ( ) y equals ( ) de la clase String.
En primer lugar, se verifica que la primera cadena (cad1) tenga una longitud mayor que la segunda
cadena (cad2). Luego, se obtiene la diferencia entre las longitudes de cad1 y cad2 y se almacena en
la variable total. El límite para la evaluación del número de veces que se repite cad2 en cad1, es el
carácter ubicado en la posición total de cad2.
Después, empezando desde el primer carácter de cad1 se extrae una subcadena (subcad) del mismo
tamaño que cad2 y se comparan para ver si son iguales utilizando el método equals ( ). Si son iguales
el contador cont aumenta en 1. Este proceso se repite utilizando el siguiente carácter de cad1.
En primer lugar determinamos que cad1 tiene una longitud mayor que cad2. Luego, calculamos el
valor de la variable total (total = 5-3 = 2).
El límite para la evaluación del número de veces que se repite cad2 en cad1 es el carácter ubicado
en la posición 2 de cad2.
728 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
cad1 = “Danae”
012
Segunda evaluación:
cad2 = “ana” y subcad = “ana”
Resultado: verdadero (cont =1).
Tercera evaluación:
cad2 = “ana” y subcad = “nae” Finalmente, se concluye que cad2 se
Resultado: falso. repite una vez en cad1.
Problema 216
Desarrollar un programa en Java que permita ingresar el nombre de dos alumnos y mostrar si los
nombres ingresados son iguales o no.
Clase PrgNombresIguales
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgNombresIguales {
do {
System.out.println ( “ Ingresar el nombre del primer alumno: ” ) ;
nom1 = Lectura.leerString( ) ;
nom1 = nom1.trim( ) ;
if ( nom1.length( ) < 2 ) {
System.out.println("Nombre ingresado no válido… Reintente! ");
}
} while ( nom1.length( ) < 2 ) ;
do {
APÉNDICE - c lasEs crEadas E incorporadas En Java 729
if ( nom2.length( ) < 2 ) {
System.out.println ( “ Nombre ingresado no válido… Reintente! ” ) ;
}
} while ( nom2.length( ) < 2 ) ;
if ( nom1.equals (nom2) ) {
System.out.println ( “ Los nombres ingresados son iguales ” ) ;
} else {
System.out.println ( “ Los nombres ingresados son diferentes ” ) ;
}
}
}
Se comparan dos variables de tipo cadena (nom1 y nom2 respectivamente) y se determinan si ambas cadenas
son iguales o no.
Problema 217
Desarrollar un programa en Java que permita ingresar los nombres de dos alumnos y mostrar los
nombres ordenados alfabéticamente.
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgOrdenados1 {
System.out.println ( “ ------------------------------------- ” ) ;
System.out.println ( “ Nombres ordenados alfabéticamente ” ) ;
System.out.println ( “ ------------------------------------- ” ) ;
System.out.println (nombreMenor) ;
System.out.println (nombreMayor) ;
}
}
nombre1.compareTo (nombre2) ;
El método compareTo ( ) permite comparar dos variables de tipo String. El método compareTo (
) nos devuelve un valor entero. Si el valor devuelto es igual a cero (0), entonces las cadenas son
iguales; es decir, las variables nombre1 y nombre2 contiene cadenas iguales. Si el valor devuelto es
mayor que cero (0), entonces la variable nombre1 es mayor que la variable nombre2. Finalmente,
si el valor devuelto es menor que cero, entonces la variable nombre1 es menor que la variable
nombre2.
Cuando se comparan dos cadenas, se realiza una comparación alfabética en la cual tienen significado
las letras mayúsculas, las letras minúsculas, los caracteres especiales y los espacios en blanco.
En base a esto mejore la solución, de tal forma que se pueda realizar la consistencia de los nombres
ingresados.
APÉNDICE - c lasEs crEadas E incorporadas En Java 731
Problema 218
Desarrollar un programa en Java que permita ingresar los nombres de dos alumnos (no permite el
ingreso de solo espacios en blanco) y mostrar los nombres ordenados alfabéticamente.
Clase PrgOrdenados2
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgOrdenados2 {
do {
System.out.println ( “ Ingrese el nombre de la primera persona: ” ) ;
nombre1 = Lectura.leerString( );
nombre1 = nombre1.trim( ) ;
if (nombre1.length( ) < 2 ) {
System.out.println ( “ Nombre ingresado no válido...Reintente!!! ” ) ;
}
} while (nombre1.length( ) < 2 ) ;
do {
System.out.println ( “ Ingrese el nombre de la segunda persona:” ) ;
nombre2 = Lectura.leerString( ) ;
nombre2 = nombre2.trim( ) ;
if ( nombre2.length( ) < 2 ) {
System.out.println (“ Nombre ingresado no válido...Reintente!!! ” ) ;
}
} while ( nombre2.length( ) < 2 ) ;
if ( nombre1.compareTo(nombre2) < 0 ) {
nombreMenor = nombre1 ;
nombreMayor = nombre2 ;
} else {
nombreMenor = nombre2 ;
nombreMayor = nombre1 ;
}
System.out.println ( “------------------------------------------------- ” ) ;
System.out.println ( “Nombres ordenados alfabéticamente ” ) ;
System.out.println ( “------------------------------------------------- ” ) ;
System.out.println (nombreMenor) ;
System.out.println (nombreMayor) ;
}
}
Mejore la codificación del programa, de tal forma que se contemple la posibilidad de que los
nombres ingresados sean iguales.
732 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 219
Desarrollar un programa en Java que permita ingresar los nombres de tres alumnos (los nombres
no deben ser iguales) y mostrar los nombres ordenados alfabéticamente.
Clase PrgOrdenados3
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgOrdenados3 {
do {
System.out.println ( “ Ingrese el nombre de la primera persona: ” ) ;
nombre1 = Lectura.leerString( ) ;
nombre1 = nombre1.trim( ) ;
if ( nombre1.length( ) == 0 ) {
System.out.println (“ Nombre ingresado no válido...Reintente!!!”) ;
}
} while ( nombre1.length( ) == 0 ) ;
do {
System.out.println ( “ Ingrese el nombre de la segunda persona: ” ) ;
nombre2 = Lectura.leerString( ) ;
nombre2 = nombre2.trim( ) ;
if ( nombre2.length( ) == 0 ) {
System.out.println (“ Nombre ingresado no válido...Reintente!!!”) ;
}
} while (nombre2.length( ) == 0 ) ;
do {
System.out.println ( “ Ingrese el nombre de la tercera persona: ” ) ;
nombre3 = Lectura.leerString( ) ;
nombre3 = nombre3.trim( ) ;
if ( nombre3.length( ) == 0 ) {
System.out.println (“ Nombre ingresado no válido...Reintente!!! ”);
}
} while ( nombre3.length( ) == 0 ) ;
if (nombre1.compareTo(nombre2) < 0 && nombre1.compareTo(nombre3) < 0 ) {
nom01 = nombre1 ;
if (nombre2.compareTo(nombre3) < 0 ) {
nom02 = nombre2 ;
nom03 = nombre3 ;
} else {
nom02 = nombre3 ;
nom03 = nombre2 ;
}
APÉNDICE - c lasEs crEadas E incorporadas En Java 733
}
if (nombre2.compareTo(nombre1) < 0 && nombre2.compareTo(nombre3) < 0) {
nom01 = nombre2 ;
if (nombre1.compareTo(nombre3) < 0 ) {
nom02 = nombre1 ;
nom03 = nombre3 ;
} else {
nom02 = nombre3 ;
nom03 = nombre1 ;
}
}
if (nombre3.compareTo(nombre1) < 0 && nombre3.compareTo(nombre2) < 0 ) {
nom01 = nombre3 ;
if (nombre1.compareTo(nombre2) < 0 ) {
nom02 = nombre1 ;
nom03 = nombre2 ;
} else {
nom02 = nombre2 ;
nom03 = nombre1 ;
}
}
System.out.println ( “ ------------------------------------------------- ” ) ;
System.out.println ( “ Nombres ordenados alfabéticamente ” ) ;
System.out.println ( “ ------------------------------------------------- ” ) ;
System.out.println (nom01) ;
System.out.println (nom02) ;
System.out.println (nom03) ;
}
}
Problema 220
Desarrollar un programa en Java que permita ingresar los nombres de tres alumnos (los nombres
pueden ser iguales) y mostrar los nombres ordenados alfabéticamente.
Clase PrgOrdenados4
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgOrdenados4 {
do {
System.out.println ( “ Ingrese el nombre de la primera persona: ” ) ;
nombre1 = Lectura.leerString( ) ;
nombre1 = nombre1.trim( ) ;
if (nombre1.length( ) == 0 ) {
System.out.println ( “ Nombre ingresado no válido...Reintente!!! ” );
}
} while ( nombre1.length( ) == 0 ) ;
do {
System.out.println ( “ Ingrese el nombre de la segunda persona: ” ) ;
nombre2 = Lectura.leerString( ) ;
nombre2 = nombre2.trim( ) ;
if (nombre2.length( ) == 0) {
System.out.println ( “ Nombre ingresado no válido...Reintente!!! ” );
}
} while ( nombre2.length( ) == 0 ) ;
do {
System.out.println ( “ Ingrese el nombre de la tercera persona: ” ) ;
nombre3 = Lectura.leerString( ) ;
nombre3 = nombre3.trim( ) ;
if ( nombre3.length( ) == 0 ) {
System.out.println ( “ Nombre ingresado no válido...Reintente!!! ” );
}
} while (nombre3.length( ) == 0 ) ;
if ( nombre1.compareTo(nombre2) < 0 ) {
if ( nombre1.compareTo(nombre3) < 0 ) {
nom01 = nombre1 ;
if (nombre2.compareTo(nombre3) < 0 ) {
nom02 = nombre2 ;
nom03 = nombre3 ;
} else {
nom02 = nombre3 ;
nom03 = nombre2 ;
}
APÉNDICE - c lasEs crEadas E incorporadas En Java 735
} else {
nom01 = nombre3 ;
nom02 = nombre1 ;
nom03 = nombre2 ;
}
} else {
if ( nombre2.compareTo(nombre3) < 0 ) {
nom01 = nombre2 ;
if ( nombre1.compareTo(nombre3) < 0 ) {
nom02 = nombre1 ;
nom03 = nombre3 ;
} else {
nom02 = nombre3 ;
nom03 = nombre1 ;
}
} else {
nom01 = nombre3 ;
nom02 = nombre2 ;
nom03 = nombre1 ;
}
}
System.out.println ( “ ------------------------------------------------- ” ) ;
System.out.println ( “ Nombres ordenados alfabéticamente ” ) ;
System.out.println ( “ ------------------------------------------------- ” ) ;
System.out.println (nom01) ;
System.out.println (nom02) ;
System.out.println (nom03) ;
}
}
Compruebe lo que sucede. Se ordenarán, primero, los nombres que comiencen con mayúscula, y
luego los que comiencen con minúscula.
Modifique el programa, de tal forma que se cambie la primera letra del nombre ingresado a
mayúscula.
736 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 221
Desarrollar un programa en Java que permita ingresar los nombres de tres alumnos. Asegúrese de
que los nombres ingresados empiecen con una letra mayúscula y finalmente, mostrar los nombres
ordenados alfabéticamente.
Clase PrgOrdenados5
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgOrdenados5 {
do {
System.out.println ( “ Ingrese el nombre de la primera persona: ” ) ;
nombre1 = Lectura.leerString( ) ;
nombre1 = nombre1.trim( ) ;
if ( nombre1.length( ) == 0 ) {
System.out.println ( “ Nombre ingresado no válido...Reintente!!! ” );
} else {
nombre1 =
((nombre1.substring(0,1)).toUpperCase()).concat(nombre1.substring(1));
}
} while ( nombre1.length( ) == 0 ) ;
do {
System.out.println ( “ Ingrese el nombre de la segunda persona: ” ) ;
nombre2 = Lectura.leerString( ) ;
nombre2 = nombre2.trim( ) ;
if ( nombre2.length( ) == 0 ) {
System.out.println ( “ Nombre ingresado no válido...Reintente!!! ” ) ;
} else {
nombre2 =
((nombre2.substring(0, 1)).toUpperCase()).concat(nombre2.substring(1));
}
} while ( nombre2.length( ) == 0 ) ;
do {
System.out.println ( “ Ingrese el nombre de la tercera persona: ” ) ;
nombre3 = Lectura.leerString( ) ;
nombre3 = nombre3.trim( ) ;
if ( nombre3.length( ) == 0 ) {
System.out.println ( “ Nombre ingresado no válido...Reintente!!! ” ) ;
} else {
nombre3 =
((nombre3.substring(0,1)).toUpperCase()).concat(nombre3.substring(1));
}
APÉNDICE - c lasEs crEadas E incorporadas En Java 737
} while ( nombre3.length( ) == 0 ) ;
if ( nombre1.compareTo(nombre2) < 0 ) {
if ( nombre1.compareTo(nombre3) < 0 ) {
nom01 = nombre1 ;
if ( nombre2.compareTo(nombre3) < 0 ) {
nom02 = nombre2 ;
nom03 = nombre3 ;
} else {
nom02 = nombre3 ;
nom03 = nombre2 ;
}
} else {
nom01 = nombre3 ;
nom02 = nombre1 ;
nom03 = nombre2 ;
}
} else {
if ( nombre2.compareTo(nombre3) < 0 ) {
nom01 = nombre2 ;
if ( nombre1.compareTo(nombre3) < 0 ) {
nom02 = nombre1 ;
nom03 = nombre3 ;
} else {
nom02 = nombre3 ;
nom03 = nombre1 ;
}
} else {
nom01 = nombre3 ;
nom02 = nombre2 ;
nom03 = nombre1 ;
}
}
System.out.println ( “ Nombres ordenados alfabéticamente ” ) ;
System.out.println (nom01) ;
System.out.println (nom02) ;
System.out.println (nom03) ;
}
}
Mejore la solución desarrollando un programa que permita ingresar tres nombres de alumnos.
Asegúrese de que los nombres ingresados empiecen con una letra mayúscula y que el resto estén
en minúscula. Finalmente, muestre los nombres ordenados alfabéticamente.
Luego, complemente la solución, permitiendo el ingreso de los nombres de todos los alumnos de
un determinado salón de clase.
738 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 222
Desarrollar un programa en Java que permita ingresar el nombre de una persona, un carácter que
esté contenido en el nombre ingresado y otro carácter por el cual se reemplazará el primer carácter
ingresado. Finalmente, mostrar el nombre modificado.
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgCadenaModifcada {
int cant ;
String nom, dato1, dato2, caracter, cadena= “” ;
cant = nom.length( ) ;
nombre1.equals (nombre2) ;
El método equals ( ) devuelve true (verdadero) si la cadena coincide con la cadena colocada como
parámetro del método equals ( ); caso contrario, devuelve false (falso).
Por lo que, en este caso el método equals ( ) evalúa a la variable dato1 y a la variable caracter. La
variable caracter tuvo que declararse como String para poder ser utilizada por el método equals (
) de esta forma:
APÉNDICE - c lasEs crEadas E incorporadas En Java 739
La sentencia if puede evaluar una condición lógica, una variable booleana o el resultado de
una operación. En nuestro caso, el método equals ( ) devuelve true (verdadero) o false (falso),
dependiendo del resultado de la comparación entre las variables dato1 y caracter.
En base a esto, podemos afirmar que las siguientes sentencias en Java son equivalentes:
if ( dato1.equals (caracter) )
Resulta evidente que no es necesario realizar comparaciones booleanas dentro de las condiciones
lógicas utilizadas en la sentencia if (esto se hace extensivo a las sentencias do, while y for).
Problema 223
Desarrollar un programa en Java que permita ingresar un número mayor de tres dígitos. Convertir
el número en cadena, luego intercambiar posiciones; el primer dígito pasarlo al último y viceversa;
finalmente, mostrar el nuevo número.
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgIntercambioCadena {
cadena = String.valueOf(num);
cant = cadena.length();
dato1 = cadena.substring(0, 1);
dato2 = cadena.substring(1, cant - 1);
dato3 = cadena.substring(cant-1);
cadena = dato3 + dato2 + dato1;
System.out.println(" El resultado es: " + cadena);}
}
}
String.valueOf (num) ;
El método valueOf ( ) se utiliza directamente con la clase String (y no con una variable de tipo
String). Este método permite convertir una variable de cualquier tipo a una variable de tipoString
o cadena. En nuestra solución, convertimos la variable num a String con la finalidad de poder
manipular el contenido de la variable con métodos de la clase String. Una vez convertida la variable
num, se utiliza el método substring( ) para intercambiar las posiciones deseadas.
Problema 224
Desarrollar un programa en Java que permita ingresar el nombre de un alumno. Mostrar el nombre
ingresado, de tal forma que se lea de izquierda a derecha (nombre mostrado al revés).
Clase PrgInvertirCadena
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgInvertirCadena {
int cant, x ;
String nom, caracter, cadena = “” ;
do {
System.out.println ( “ Ingresar el nombre: ” ) ;
nom = Lectura.leerString( ) ;
nom = nom.trim( ) ;
APÉNDICE - c lasEs crEadas E incorporadas En Java 741
if ( nom.length( ) == 0 ) {
System.out.println ( “ Nombre ingresado no válido… Reintente! ” );
}
} while ( nom.length( ) == 0 ) ;
cant = nom.length( );
En este programa, declaramos la variable carácter como una cadena (String). Cada vez que se
ejecuta la sentencia for, se obtiene de la variable nom, un carácter empezando desde el último y
terminando en el primero. Cada vez que se obtiene un carácter, este se agrega a la variable cadena,
de tal forma que al finalizar la ejecución de la sentencia for se tiene almacenado en la variable
cadena, el nombre ingresado con los caracteres finales al inicio y los caracteres iniciales al final.
*Importante: Para esta solución, la variable caracter debe declararse como char. Observe cómo
se utiliza el método charAt ( ) de la clase String, con la finalidad de obtener carácter por carácter
de la variable nom (empezando desde el último y terminando en el primero), para agregarlos a la
variable cadena utilizando el signo “+” (concatenación).
742 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 225
Desarrollar un programa en Java que permita ingresar los nombres de 10 alumnos, este permitirá
visualizar la cantidad de nombres que empiezan con la letra “P” y la cantidad de nombres que
terminan con la letra “a”.
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgCuentaLetras1 {
Mejore la solución desarrollando un programa que permita ingresar los nombres de todos los
alumnos. Utilice la estructura do… while. Asegúrese que los nombres ingresados empiecen con
una letra mayúscula y que el resto esté en minúscula.
APÉNDICE - c lasEs crEadas E incorporadas En Java 743
Problema 226
Desarrollar un programa en Java que permita ingresar los nombres de todos los empleados de una
empresa y mostrar el número de vocales que existen en cada uno de los nombres ingresados.
Clase PrgTotalVocales2
package dominioDeLaAplicacion ;
import biblioteca.* ;
public class PrgTotalVocales2 {
do {
do {
System.out.println ( “ Ingresar el nombre: ” ) ;
nom = Lectura.leerString( ) ;
nom = nom.trim( ) ;
if ( nom.length( ) == 0 ) {
System.out.println ( “ Nombre no válido… Reintente! ” ) ;
}
} while ( nom.length( ) == 0 ) ;
cant = nom.length( ) ;
nom = nom.toLowerCase( ) ;
for ( x=0; x<cant; x++ ) {
c = nom.charAt(x) ;
d = (int) (c) ;
switch(c) {
case 97 : // a
case 101 : // e
case 105 : // i
case 111 : // o
case 117 : cont ++ ; // u
}
}
System.out.println ( “ El Total de Vocales del nombre ingresado es:”+
cont);
System.out.println ( “ Desea ingresar otro nombre (Sí = 1, No = 2):”);
opc =Lectura.leerInt( ) ;
} while ( opc != 1 );
}
}
Mejorar la solución desarrollando un programa que considere el conteo de las vocales acentuadas
y las vocales en letra mayúscula. Como sugerencia, investigue los códigos ASCII de los dos tipos de
vocales mencionadas y agréguelas en la sentencia switch ( ).
744 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 227
Desarrollar un programa en Java que permita ingresar los nombres de todos los productos de una
determinada tienda y mostrar como resultado las posiciones pares.
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgProductosTienda {
do {
System.out.println ( “ Ingresar la cantidad de productos: ” ) ;
cantidad = Lectura.leerInt( ) ;
if ( cantidad < 1 ) {
System.out.println ( “ Cantidad no válida… Reintente! ” ) ;
}
} while ( cantidad < 1 ) ;
do {
if ( x % 2 == 0 ) {
acum = acum + producto.substring(x - 1, x) ;
}
}
System.out.println ( “ Las posiciones pares del producto son:” + acum );
acum = “” ;
cont ++ ;
}
}
Análisis de la solución:
Ingresamos la cantidad de alumnos y la almacenamos en la variable cantidad, se valida el número
de alumnos ingresado, de tal forma que sea mayor a cero.
Luego, se utiliza una sentencia do para ingresar el nombre de cada uno de los productos y determinar
sus posiciones pares. Esto último se logra utilizando una sentencia for dentro de la sentencia do.
Observe el uso de los métodos length ( ) y substring ( ) de la clase String y la forma cómo se utilizan
las estructuras lógicas para la solución del problema.
APÉNDICE - c lasEs crEadas E incorporadas En Java 745
Problema 228
Desarrollar un programa en Java que permita ingresar los nombres de todos los alumnos de un salón
de clase. Mostrar la longitud de cada nombre ingresado, el nombre que tiene la mayor longitud y
el que tiene la menor longitud.
Clase PrgLongitudNombre
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgLongitudNombre {
do {
System.out.println ( “ Ingresar la cantidad de alumnos: ” ) ;
cantidad = Lectura.leerInt( ) ;
if ( cantidad < 1 ) {
System.out.println ( “ Cantidad no válida… Reintente! ”);
}
} while ( cantidad < 1 ) ;
do {
System.out.println ( “ Ingresar el nombre del alumno: ” ) ;
alumno = Lectura.leerString( ) ;
System.out.println ( “ La Longitud es: ” + alumno.length() );
if ( longMayor < alumno.length( ) ) {
longMayor = alumno.length( ) ;
nomMayor = alumno ;
}
if ( longMenor > alumno.length( ) ) {
longMenor = alumno.length( ) ;
nomMenor = alumno ;
}
cont ++ ;
} while ( cantidad != cont ) ;
Análisis de la solución:
Ingresamos la cantidad de alumnos y la almacenamos en la variable cantidad; se valida el número
de alumnos ingresado, de tal forma que sea mayor a cero.
Luego, se utiliza una sentencia do para ingresar el nombre de cada uno de los alumnos, y se
determina la longitud de cada nombre ingresado, el nombre con la mayor longitud y el nombre con
la menor longitud.
Observe el uso de los métodos length ( ) de la clase String y la forma como se utilizan las estructuras
lógicas para la solución del problema.
746 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 229
Desarrollar un programa en Java que permita ingresar una fecha con el siguiente formato “dd-mm-
aaaa” y validarla.
Clase PrgFechaFormato
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
class PrgFechaFormato {
if ( fecha.length( ) <= 10 ) {
dia = fecha.substring(0, 2) ;
num1 = Integer.parseInt(dia) ;
mes = fecha.substring(3, 5) ;
num2 = Integer.parseInt(mes) ;
anio = fecha.substring(6, 10) ;
if ( ( dia.length() != 2 ) || ( num1 < 31 ) ) {
System.out.println ( “ El dia ingresado es incorrecto ” ) ;
} else {
if ( (mes.length() != 2 ) || ( num2 < 12 ) ) {
System.out.println ( “ El mes ingresado es incorrecto ” ) ;
} else {
if ( anio.length( ) != 4 ) {
System.out.println (“El año ingresado esta incorrecto”);
} else {
System.out.println (“ La fecha ingresada es correcta ”);
}
}
}
}
}
}
Intente mejorar la solución validando la fecha, de tal forma que el mes ingresado solo sea válido si
es que la variable dia contiene el número de días válidos para dicho mes. Incluya la posibilidad de
que el mes de febrero sea bisiesto.
APÉNDICE - c lasEs crEadas E incorporadas En Java 747
Problema 230
Desarrollar un programa en Java que permita completar por la izquierda (utilizando asteriscos), una
determinada cadena en base a una longitud especificada.
Ejemplo:
Se ingresa:
Longitud = 10
Cadena = “Danae”
Resultado:
Cadena = “Danae*****”
Clase PrgCompletarCadenaIzq
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
classPrgCompletarCadenaIzq{
String cadena ;
int longitud, tamaño, x ;
Problema 231
Desarrollar un programa en Java que permita completar por la derecha (utilizando asteriscos), una
determinada cadena en base a una longitud especificada.
Ejemplo:
Se ingresa:
Longitud = 10
Cadena = “Danae”
Resultado:
Cadena = “Danae*****”
Clase PrgCompletarCadenaDer
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
classPrgCompletarCadenaDer {
String cadena ;
int longitud, tamaño, x ;
Problema 232
Desarrollar un programa en Java que permita transformar un arreglo de caracteres en una cadena,
especificando la posición del arreglo donde comenzará la cadena y su longitud. Finalmente, analizar
la solución.
Clase PrgArregloCadena
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
classPrgArregloCadena {
}
}
El método valueOf( ) se utiliza directamente con la clase String (y no con una variable de tipo
String), el cual permite convertir un arreglo de caracteres o parte de él, en una variable de tipo
String o cadena. En nuestra solución convertimos parte del arreglo arregloA a un String, con la
finalidad de mostrar el contenido de dicha variable.
Observe que en este método, en primer lugar, se especifica el arreglo de tipo char, del cual se
obtendrá la cadena. En segundo lugar, se indica la posición del arreglo desde el cual se van a tomar
los datos. Finalmente, se indica la longitud o el número de caracteres que se obtendrán del arreglo.
Problema 233
Ingreso de una sola letra. Puede ingresar la letra en mayúscula o minúscula.
String letras;
do {
letras=LE.leerString( “Ingrese 1 sola letra:”);
if(!letras.matches(“[a-z-A-Z]”)){
LE.mostrarError( “Error; la letra ingresada es incorrecta; reintente”);
}
}while(!letras.matches(“[a-z-A-Z]”));
Problema 234
Ingreso de varias letras.
String letras;
do{
letras=LE.leerString(“Ingrese varias letras:”);
if(!letras.matches(“[a-z-A-Z]+” )){
LE.mostrarError( “Error; las letras ingresadas son incorrectas; reintente” );
}
}while(!letras.matches(“[a-z-A-Z]+”));
Problema 235
Ingreso de solo tres letras. Las llaves agregadas al argumento, más el número al interior, indican el
número de caracteres que deben ser ingresados.
String letras;
do{
letras=LE.leerString(“Ingrese 3 letras: ” );
if(!letras.matches(“[a-z-A-Z]{3}” )){
LE.mostrarError( “Error; las letras ingresadasson incorrectas; reintente” );
}
}while(!letras.matches(“[a-z-A-Z]{3}” ));
APÉNDICE - c lasEs crEadas E incorporadas En Java 751
Problema 236
Ingreso de varias letras, un espacio en blanco y después varias letras.
String letras;
do{
letras=LE.leerString(“Ingrese sus dos nombres: ” );
Problema 237
Ingreso de un número con un dígito.
String numeros;
do{
numeros=LE.leerString(“Ingrese un número de un dígito: ” );
if(!numeros.matches(“[0-9]” )){
LE.mostrarError( “Error; el número ingresado es incorrecto; reintente” );
}
}while(!numeros.matches(“[0-9]”));
Problema 238
Ingreso de un número de varias cifras.
String numeros;
do{
numeros=LE.leerString(“Ingrese un número: ” );
if(!numeros.matches(“[0-9]+” )){
LE.mostrarError(“Error; el número ingresado es incorrecto; reintente");
}
}while(!numeros.matches(“[0-9]+”));
752 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 239
Ingreso de un número de tres cifras.
String numeros;
do{
numeros=LE.leerString(“Ingrese un número: ” );
if(!numeros.matches(“[0-9]{3}” )){
LE.mostrarError( “Error; el número ingresado es incorrecto; reintente ” );
}
}while(!numeros.matches(“[0-9]{3}” ));
Problema 240
Ingreso de dos letras y un número de cinco cifras.
String cadena;
do{
cadena=LE.leerString(“Ingrese 2 letras y un número: ” );
if(!cadena.matches(“[a-z-A-Z]{2}[0-9]{5}” )){
LE.mostrarError( “Error; el dato ingresado es incorrecto; reintente” );
}
}while(!cadena.matches(“[a-z-A-Z]{2}[0-9]{5}” ));
Problema 241
Validación de sexo (1).
String sexo;
do{
sexo = LE.leerString(“Ingrese el sexo: F: Femenino | M: Masculino” );
if(!sexo.matches(“[FMfm]” )){
LE.mostrarError( “Error; el dato ingresado es incorrecto; reintente” );
}
}while(!sexo.matches(“[FMfm]” ));
APÉNDICE - c lasEs crEadas E incorporadas En Java 753
Problema 242
Validación de sexo (2).
String sexo;
do{
sexo = LE.leerString(“Ingrese el sexo: F: Femenino | M: Masculino” );
Problema 243
Validación de sexo (3).
String sexo;
do{
sexo = LE.leerString(“Ingrese el sexo: F: Femenino | M: Masculino” );
sexo=sexo.toUpperCase();
Problema 244
Validación de número telefónico.
String numTelefono;
do{
numTelefono=LE.leerString(“Ingrese el número de teléfono” );
if(!numTelefono.matches(“[0-9]{7}” )){
LE.mostrarError(“Error; el Nro. ingresado es incorrecto; reintente” );
}
}while(!numTelefono.matches(“[0-9]{7}” ));
}|DNI
Problema 245
Se debe recordar que el argumento proporcionado para el funcionamiento del método matches es
para un tipo de correo que pueda poseer:
Ingreso del nombre del mail – Puede ser letras o números o ambos caracteres.
Ingreso de dominio del mail- Este solo puede contener caracteres de tipo texto.
String Email;
do{
Email=LE.leerString(“Ingrese su e-mail: ” );
Email = Email.toLowerCase();
if(!Email.matches(“[a-z-0-9-_]+[@][a-z]+[.][a-z]{3}” )){
LE.mostrarError(“Error; el tipo de correo valido es usuario@dominio.com;
reintente” );
}
}while(!Email.matches(“[a-z-0-9-_]+[@][a-z]+[.][a-z]{3}” ));
java.lang.Object
--> java.text.Format
--> java.text.NumberFormat
--> java.text.DecimalFormat
DecimalFormat es una clase concreta de NumberFormat que da formato a números decimales. Tiene
una gran variedad de opciones para dar formatos a números en cualquier sistema; incluye soporte
para dígitos occidentales, arábigos e índicos. También soporta gran variedad de formatos numéricos,
como enteros, decimales, notación científica, formato de moneda, etc.
Se puede utilizar la clase DecimalFormat para formatear números decimales en cadenas específicas
de la localidad. Los programas almacenan y operan con números de una forma independiente de
la localidad. Antes de mostrar o imprimir un número, el programa debe convertirlo a un String que
esté en un formato sensible a la localidad. Por ejemplo, en Francia, el número 123456.78 debería
ser formateado como 123 456,78, y en Alemania debería aparecer como 123.456,78. Para poner en
práctica esto podemos recurrir a dos métodos:
APÉNDICE - c lasEs crEadas E incorporadas En Java 755
NumberFormat formato ;
DecimalFormat df ;
formato = NumberFormat.getNumberInstance(currentLocale);
formato = NumberFormat.getCurrencyInstance(currentLocale);
DecimalFormat df = (DecimalFormat)nf;
Esta clase permite controlar los ceros iniciales y finales, los sufijos y prefijos, separadores (millares) y el
separador decimal. Si se quiere cambiar un símbolo del formateo como el separador decimal, se puede
utilizar DecimalFormatSymbols en conjunción con la clase DecimalFormat.
Símbolo Significado
0 Dígito
# Dígito, el cero se muestra como ausente
. Separador decimal
- Signo menos
, Separador de agrupación
E Para notación científica "0.###E0" muestra 1234 como "1.234E3"
; Para separar formatos positivos y negativos
% Multiplica por 100 y lo muestra como porcentaje
\u2030 Multiplica por 1000 y muestra como millares
¤ (\u00A4) Utilizado para mostrar símbolos monetarios
' Usado para mostrar caracteres especiales
756 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 246
Desarrollar un programa en Java que permita ingresar un número por teclado, luego mostrar el
número ingresado con un formato determinado. Finalmente, analizar la solución.
Clase PrgFormatoNumero
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
import java.text.* ;
classPrgFormatoNumero {
Observe que se declara un objeto de la clase DecimalFormat llamado numFormato; luego, este
objeto es creado utilizando el operador new, estableciendo el formato a utilizar en el método
constructor. Finalmente, con el método format ( ) se procede a establecer el formato creado para
el número ingresado.
APÉNDICE - c lasEs crEadas E incorporadas En Java 757
Problema 247
Ingresar un número por teclado y visualizarlo en diferentes formatos. Para ello, utilice la clase
DecimalFormat de Java.
Clase PrgFormatoNumero2
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
import java.text.* ;
classPrgFormatoNumero2 {
Resultado:
758 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Problema 248
En la siguiente codificación en Java utilizamos la clase DecimalFormatSymbols y reemplazamos
el símbolo de separación decimal por | y el separador de grupos por ^; asimismo, los grupos los
hacemos de cuatro dígitos (en vez de tres como es regularmente) y finalmente, reemplazamos el
símbolo que representa números negativos (-) por n.
package dominioDeLaAplicacion ;
import biblioteca.Lectura ;
import java.text.* ;
classPrgFormatoNumero2 {
java.lang.Object
--> java.util.Calendar
Calendar es una clase base abstracta para conversiones entre un objeto Date y una gama de enteros
como YEAR(año), MONTH(mes), DAY(día), HOUR(hora), y así sucesivamente.
Subclases de la clase calendario interpretan una fecha de acuerdo con las reglas específicas de un
calendario determinado. Esta plataforma implementa una subclase concreta: GregorianCalendar.
Futuras subclases podrían representar los diferentes tipos de calendarios lunares en muchos sitios del
mundo.
Para inicializar un objeto Calendar con los valores de fecha y horas actuales, se utilizará el método
getInstance( ):
Los campos de un objeto calendario pueden ser manipulados usando tres métodos:
set()
// cambiamos los campos YEAR, MONTH y DATE del calendario cal
// a los valores dados en año, mes y día.
cal.set (año, mes, día) ;
add()
// agrega cambio al campo f. Esto es equivalente a hacer set (f, get(f) + cambio)
// agrega cambio al valor del campo campo del calendario cal
cal.add(cal.MONTH, 1) //aumenta el mes actual en 1
roll()
// roll (f, cambio) agrega cambio al campo f sin variar campos superiores, esto es,
// si aumentamos por ejemplo 40 minutos a la hora 3:30, la nueva hora sería 3:10 a
// diferencia del método add ( ) que nos daría 4:10..
cal.roll(cal.HOUR, 40)
// si la hora actual fuera 3:30, la nueva hora sería 3:10 a diferencia del
// método add ( ) que nos daría 4:10.
760 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Sumario de campos
static int AM
Constante que representa el campo AM.
Sumario de campos
static int UNDECEMBER
indica el 13o mes, del mes.
Estas constantes nos sirven para especificar en los métodos que se detallan a continuación, cuáles son
los campos que queremos manipular. Por ejemplo; si queremos agregar un minuto al calendario actual
debemos utilizar el método add, cuyos parámetros son:
Entonces para agregar un minuto, debemos especificarle al método que queremos manipular el
campo minuto y la cantidad que queremos agregar al valor almacenado en este campo (supongamos
ya definido un Calendar cal):
cal.add (cal.MINUTE,1) ;
Sumario de métodos
abstract void add(int Campo, int Cantidad)
Date Arithmetic function.
void clear()
Limpia los valores de todos los campos del calendario.
Sumario de métodos
getActualMaximum(int campo)
Retorna el valor máximo que puede obtener este campo con la fecha del
int
calendario actual. Por ejemplo; si campo=Calendar.DAY_OF_MONTH y el mes actual
es Abril, entonces el valor retornado será 30 (el máximo valor).
getActualMinimum(int campo)
int Retorna el valor mínimo que puede obtener este campo con la fecha del
calendario actual.
getFirstDayOfWeek()
int
Obtiene el primer día de la semana. Por ejemplo SUNDAY (0).
getInstance()
static Calendar
Obtiene un calendario utilizando la zona actual y las reglas dadas.
getInstance(TimeZone zona)
static Calendar
Obtiene un calendario utilizando zona y las reglas dadas.
getTime()
Date
Obtiene la hora actual del calendario.
getTimeInMillis()
long
Obtiene la hora actual del calendario en milisegundos.
getTimeZone()
TimeZone
Obtiene la zona horaria.
isSet(int campo)
boolean
Determina si el campo dado tiene un valor almacenado.
setFirstDayOfWeek(int value)
void
Establece cual es primer día de la semana para el calendario actual. Ej: MONDAY
setTime(Date fecha)
void
Establece la hora del calendario actual a la fecha.
setTimeInMillis(long milisegundos)
void
Establece la hora del calendario actual utilizando los milisegundos dados.
setTimeZone(TimeZone value)
void
Sets the time zone with the given time zone value.
toString()
String
Retorna una representación de cadena del calendario actual.
APÉNDICE - c lasEs crEadas E incorporadas En Java 763
Problema 249
764 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Resultado:
La tarea recayó en una comisión, en la cual destacaron Cristóbal Clavio y Luigi Lilio, entre otros; quienes
presentaron el nuevo calendario a Gregorio XIII; cuya reforma fue aprobada el 14 de septiembre de
1580 y llevada a la práctica en octubre de 1582.
Los cálculos supusieron un día medio de 24 horas y un año medio de 365 días, 5 horas, 49 minutos
y 20 segundos (26 segundos más que el año real). Para ello se alternarían años de 365 días y de 366
días. El calendario gregoriano intercala un año bisiesto cada cuatro años; sin embargo, no cuenta como
bisiestos los años seculares (los que terminan en doble cero: 1800, 1900, 2000), solo cuando las dos
primeras cifras son múltiplo de 4, como el 2000.
Dicha excepción se genera debido a un error en los cálculos de Luigi Lilio, el de un día cada 134 años.
Por tanto, se debía suprimir tres días cada 402 años.
Como esta cifra está relativamente cerca de 400 se acordó que no fuesen bisiestos los años terminados
en doble cero (100, 200 y 300), excepto el 400 y sus múltiplos. De esta manera se produce un error
de sólo un día cada 3323 años. No obstante, si se suprimiese un año bisiesto cada 128 años, el error
acumulado sería menor a un día cada 100 000 años.
APÉNDICE - c lasEs crEadas E incorporadas En Java 765
Como en 1257 años de vigencia del calendario juliano, se habían acumulado 10 días de retraso, se
estableció que el día siguiente al 4 de octubre de 1582, fuese el 15 de octubre de 1582. El año comienza
el 1 de enero.
El calendario gregoriano consta de doce meses: enero (31 días), febrero (28 o 29), marzo (31), abril
(30), mayo (31), junio (30), julio (31), agosto (31), septiembre (30), octubre (31), noviembre (30) y
diciembre (31); y de una semana de siete días: lunes, martes, miércoles, jueves, viernes, sábado y
domingo; que es independiente del mes. Para el cómputo eclesiástico, el primer día de la semana es
el domingo. Los días del mes se numeran correlativamente.El Calendario Gregoriano Standard tiene 2
eras: A.C y D.C.
Para trabajar con fechas en Java que puedan encontrarse entre ambos calendarios, lo recomendable
es reescribir a mano todo el proceso y operaciones necesarias. En caso de que las fechas vayan a estar
dentro del calendario Gregoriano, lo recomendable es usar la clase GregorianCalendar que trae un
grupo extenso de métodos para operar con fechas en Java.
Problema 250
766 MÉTODO DE LAS 6’D - ENFOQUE ORIENTADO A LAS ESTRUCTURAS LÓGICAS
Resultado:
java.lang.Object
--> java.text.Format
--> java.text.DateFormat
Esta clase se utiliza para presentar las fechas como cadenas de texto con formato de acuerdo a un
patrón establecido. Los patrones que se utilizan son:
y Año 1996; 96
a AM/PM PM
m Minuto de la hora 30
S Milisegundo 978
String Cad=s.format(calendar.getTime()) ;
System.out.println(Cad) ; // jueves,20 de mayo del 2004 AD GMT-05:00