Documentos de Académico
Documentos de Profesional
Documentos de Cultura
requiere un ciclo en el que se introduzca de manera sucesiva el resultado de cada examen. Sabemos de an-
temano que hay precisamente 10 resultados del examen, por lo que es apropiado utilizar un ciclo contro-
lado por contador. Dentro del ciclo (es decir, anidado dentro del ciclo), una estructura de selección doble
determinará si cada resultado del examen es aprobado o reprobado, e incrementará el contador apropiado.
Entonces, el refinamiento del seudocódigo anterior es
Nosotros utilizamos líneas en blanco para aislar la estructura de control Si...De lo contrario, lo cual mejora
la legibilidad.
La instrucción en seudocódigo
Imprimir un resumen de los resultados de los exámenes y decidir si debe pagarse un bono
Fig. 4.11 冷 El seudocódigo para el problema de los resultados del examen (parte 1 de 2).
15
16 Imprimir el número de aprobados
17 Imprimir el número de reprobados
18
19 Si más de ocho estudiantes aprobaron
20 Imprimir “Bono para el instructor!”
Fig. 4.11 冷 El seudocódigo para el problema de los resultados del examen (parte 2 de 2).
La clase de Java que implementa el algoritmo en seudocódigo se muestra en la figura 4.12, junto con
dos ejecuciones de ejemplo. Las líneas 13, 14, 15 y 22 de la clase main declaran las variables que se utilizan
para procesar los resultados del examen.
Fig. 4.12 冷 Análisis de los resultados de un examen, utilizando instrucciones de control anidadas (parte 1 de 2).
Fig. 4.12 冷 Análisis de los resultados de un examen, utilizando instrucciones de control anidadas (parte 2 de 2).
La instrucción while (líneas 18 a 32) itera 10 veces. Durante cada iteración, el ciclo recibe y proce-
sa un resultado del examen. Observe que la instrucción if...else (líneas 25 a 28) se anida en la ins-
trucción while para procesar cada resultado. Si el resultado es 1, la instrucción if...else incrementa
a aprobados; en caso contrario, asume que el resultado es 2 e incrementa reprobados. La línea 31 in-
crementa contadorEstudiantes antes de que se evalúe otra vez la condición del ciclo, en la línea 18.
Después de introducir 10 valores, el ciclo termina y la línea 35 muestra el número de aprobados y de
reprobados. La instrucción if de las líneas 38 y 39 determina si más de ocho estudiantes aprobaron el
examen y, de ser así, imprime el mensaje “Bono para el instructor!”.
La figura 4.12 muestra la entrada y salida de dos ejecuciones de ejemplo del programa. Durante la primera
ejecución de ejemplo, la condición en la línea 38 del método main es true; más de ocho estudiantes aprobaron
el examen, por lo que el programa imprime un mensaje indicando que se debe dar un bono al instructor.
en donde operadorr es uno de los operadores binarios +, -, *, / o % (o alguno de los otros que veremos más
adelante en el libro), puede escribirse de la siguiente forma:
c = c + 3;
c += 3;
El operador += suma el valor de la expresión que está a la derecha del operador al valor de la variable ubica-
da a la izquierda del mismo y almacena el resultado en la variable que se encuentra a la izquierda del ope-
rador. Por lo tanto, la expresión de asignación c += 3 suma 3 a c. La figura 4.13 muestra los operadores de
asignación aritméticos compuestos, algunas expresiones de ejemplo en las que se utilizan los operadores y
las explicaciones de lo que estos operadores hacen.
aprobados = aprobados + 1;
reprobados = reprobados + 1;
contadorEstudiantes = contadorEstudiantes + 1;
pueden escribirse en forma más concisa con operadores de asignación compuestos, de la siguiente manera:
aprobados += 1;
reprobados += 1;
contadorEstudiantes += 1;
++aprobados;
++reprobados;
++contadorEstudiantes;
aprobados++;
reprobados++;
contadorEstudiantes++;
Al incrementar o decrementar una variable que se encuentre en una instrucción por sí sola, las formas
preincremento y postincremento tienen el mismo efecto, al igual que las formas predecremento y postde-
cremento. Solamente cuando una variable aparece en el contexto de una expresión más grande es cuando
los operadores preincremento y postincremento tienen distintos efectos (y lo mismo se aplica a los opera-
dores de predecremento y postdecremento).
En C y C++, los programadores con frecuencia tienen que escribir versiones independientes de los
programas para soportar varias plataformas distintas, ya que no se garantiza que los tipos primitivos sean
idénticos de computadora en computadora. Por ejemplo, un valor int en un equipo podría representarse
mediante 16 bits (2 bytes) de memoria, en un segundo equipo mediante 32 bits (4 bytes) de memoria, y
en otro mediante 64 bits (8 bytes) de memoria. En Java, los valores int siempre son de 32 bits (4 bytes).
Cada uno de los tipos del apéndice D se enumera con su tamaño en bits (hay ocho bits en un byte), así
como con su rango de valores. Como los diseñadores de Java desean asegurar la portabilidad, utilizan es-
tándares reconocidos a nivel internacional, tanto para los formatos de caracteres (Unicode; para más infor-
mación, visite www.unicode.org) como para los números de punto flotante (IEEE 754; para más informa-
ción, visite grouper.ieee.org/groups/754/).
En la sección 3.2 vimos que a las variables de tipos primitivos que se declaran fuera de un método como
variables de instancia de una clase se les asignan valores predeterminados de manera automática, a menos que
se inicialicen en forma explícita. Las variables de instancia de los tipos char, byte, short, int, long, float
y double reciben el valor 0 de manera predeterminada. Las variables de tipo boolean reciben el valor
false de manera predeterminada. Las variables de instancia de tipo por referencia se inicializan de manera
predeterminada con el valor null.
[
(0, 0) eje x
\ [ \
eje y
Fig. 4.19 冷 Creación de un objeto JFrame para mostrar un objeto PanelDibujo (parte 1 de 2).
Fig. 4.19 冷 Creación de un objeto JFrame para mostrar un objeto PanelDibujo (parte 2 de 2).
La línea 6 utiliza la palabra clave extends para indicar que la clase PanelDibujo es un tipo mejorado
de JPanel. La palabra clave extends representa algo que se denomina relación de herencia, en la cual
nuestra nueva clase PanelDibujo empieza con los miembros existentes (datos y métodos) de la clase JPanel.
La clase de la cual PanelDibujo hereda, JPanel, aparece a la derecha de la palabra clave extends. En
esta relación de herencia, a JPanel se le conoce como la superclase y PanelDibujo es la subclase. Esto
produce una clase PanelDibujo que tiene los atributos (datos) y comportamientos (métodos) de la clase
JPanel, así como las nuevas características que agregaremos en nuestra declaración de la clase PanelDi-
bujo. En particular, tiene la habilidad de dibujar dos líneas a lo largo de las diagonales del panel. En el
capítulo 9 explicaremos con detalle el concepto de herencia. Por ahora, sólo tiene que imitar nuestra
clase PanelDibujo cuando cree sus propios programas de gráficos.
El método paintComponent
Todo JPanel, incluyendo nuestro PanelDibujo, tiene un método paintComponent (líneas 9 a 22), que el
sistema llama de manera automática cada vez que necesita mostrar el objeto PanelDibujo. El método
paintComponent debe declararse como se muestra en la línea 9; de no ser así, el sistema no llamará al mé-
todo. Este método es llamado cuando se muestra un objeto JPanel por primera vez en la pantalla, cuando
una ventana en la pantalla lo cubree y después lo descubre, y cuando la ventana en la que aparece cambia su
tamaño. El método paintComponent requiere un argumento, un objeto Graphics, que el sistema propor-
ciona por usted cuando llama a paintComponent. Este objeto Graphics se usa para dibujar líneas, rectán-
gulos, óvalos y otros gráficos.
La primera instrucción en cualquier método paintComponent que cree debe ser siempre:
super.paintComponent(g);
la cual asegura que el panel se despliegue de manera apropiada en la pantalla, antes de empezar a dibujar en él.
A continuación, las líneas 14 y 15 llaman a los métodos que la clase PanelDibujo hereda de la clase JPanel.
Como PanelDibujo extiende a JPanel, éste puede usar cualquier método public de JPanel. Los métodos
getWidth y getHeight devuelven la anchura y la altura del objeto JPanel, respectivamente. Las líneas 14 y 15
almacenan estos valores en las variables locales anchura y altura. Por último, las líneas 18 y 21 utilizan la
variable g de la clase Graphics para llamar al método drawLine, para que dibuje las dos líneas. El método
drawLine dibuja una línea entre dos puntos representados por sus cuatro argumentos. Los primeros dos son
las coordenadas x y y para uno de los puntos finales de la línea, y los últimos dos son las coordenadas para el
otro punto final. Si cambia de tamañoo la ventana, las líneas se escalarán en concordancia, ya que los argumen-
tos se basan en la anchura y la altura del panel. Al cambiar el tamaño de la ventana en esta aplicación, el siste-
ma llama a paintComponent para volver a dibujarr el contenido de PanelDibujo.
La clase PruebaPanelDibujo
Para mostrar el PanelDibujo en la pantalla, debemos colocarlo en una ventana. Usted debe crear una
ventana con un objeto de la clase JFrame. En PruebaPanelDibujo.java (figura 4.19), la línea 3 impor-
ta la clase JFrame del paquete javax.swing. La línea 10 en main crea un objeto PanelDibujo, el cual
contiene nuestro dibujo, y la línea 13 crea un nuevo objeto JFrame que puede contener y mostrar nues-
tro panel. La línea 16 llama al método setDefaultCloseOperation del método JFrame con el argumen-
to JFrame.EXIT_ON_CLOSE, para indicar que la aplicación debe terminar cuando el usuario cierre la
ventana. La línea 18 utiliza el método add de JFrame para adjuntarr el objeto PanelDibujo al objeto
JFrame. La línea 19 establece el tamaño del objeto JFrame. El método setSize recibe dos parámetros
que representan la anchura y altura del objeto JFrame, respectivamente. Por último, la línea 20 muestra
el objeto JFrame mediante una llamada a su método setVisible con el argumento true. Cuando se
muestra el objeto JFrame, se hace una llamada implícita al método paintComponent de PanelDibujo
(líneas 9 a 22 de la figura 4.18) y se dibujan las dos líneas (vea los resultados de ejemplo en la figura 4.19).
Pruebe a cambiar el tamaño de la ventana, y podrá ver que las líneas siempre se dibujan con base en la
anchura y altura actuales de la ventana.
b) Modifique su respuesta en la parte (a) para hacer que las líneas se desplieguen a partir de las cuatro es-
quinas, como se muestra en la captura de pantalla derecha de la figura 4.20. Las líneas de esquinas
opuestas deberán intersecarse a lo largo de la parte media.
4.2. La figura 4.21 muestra dos diseños adicionales, creados mediante el uso de ciclos while y de
drawLine.
a) Cree el diseño de la captura de pantalla izquierda de la figura 4.21. Empiece por dividir cada borde en
un número equivalente de incrementos (elegimos 15 de nuevo). La primera línea empieza en la esquina
superior izquierda y termina un paso a la derecha, en el borde inferior. Para cada línea sucesiva, avance
hacia abajo un incremento en el borde izquierdo, y un incremento a la derecha en el borde inferior.
Continúe dibujando líneas hasta llegar a la esquina inferior derecha. La figura deberá escalarse a medi-
da que usted cambie el tamaño de la ventana, de manera que los puntos finales siempre toquen los
bordes.
b) Modifique su respuesta en la parte (a) para reflejar el diseño en las cuatro esquinas, como se muestra en
la captura de pantalla derecha de la figura 4.21.
4.16 Conclusión
Este capítulo presentó las estrategias básicas de solución de problemas para crear clases y desarrollar méto-
dos para ellas. Demostramos cómo construir un algoritmo (es decir, una metodología para resolver un
problema), y después cómo refinarlo a través de diversas fases de desarrollo de seudocódigo, lo cual produ-
ce código en Java que puede ejecutarse como parte de un método. El capítulo demostró cómo utilizar el
método de refinamiento de arriba a abajo, paso a paso, para planear las acciones específicas que debe reali-
zar un método y el orden en el que debe hacerlo.
Sólo se requieren tres tipos de estructuras de control (secuencia, selección y repetición) para desarrollar
cualquier algoritmo para solucionar un problema. En específico, este capítulo demostró el uso de la ins-
trucción if de selección simple, la instrucción if...else de selección doble y la instrucción de repetición
while. Estas instrucciones son algunos de los cimientos que se utilizan para construir soluciones para
muchos problemas. Utilizamos el apilamiento de instrucciones de control para calcular el total y el prome-
dio de un conjunto de calificaciones de estudiantes, mediante la repetición controlada por un contador y
controlada por un centinela. También utilizamos el anidamiento de instrucciones de control para analizar
y tomar decisiones con base en un conjunto de resultados de un examen. Presentamos los operadores de
asignación compuestos de Java, así como sus operadores de incremento y decremento. Por último, anali-
zamos los tipos primitivos de Java. En el capítulo 5 continuaremos nuestra explicación de las instrucciones
de control, en donde presentaremos las instrucciones for, do...while y switch.
Resumen
• El círculo sólido rodeado por una circunferencia, que aparece en la parte inferior del diagrama, representa el estado
final (pág. 104); es decir, el término del flujo de trabajo después de que el programa realiza sus acciones.
• Los rectángulos con las esquinas superiores derechas dobladas se llaman notas en UML (pág. 104), y son comen-
tarios aclaratorios que describen el propósito de los símbolos en el diagrama.
• Java tiene tres tipos de instrucciones de selección (pág. 105).
• La instrucción if de selección simple (pág. 105) selecciona o ignora una o más acciones.
• La instrucción if...else de selección doble selecciona una de dos acciones distintas, o grupos de acciones.
• La instrucción switch se llama instrucción de selección múltiple (pág. 105), ya que selecciona una de varias accio-
nes distintas, o grupos de acciones.
• Java cuenta con las instrucciones de repetición (también conocidas como de iteración o ciclos) while, do...while
y for, las cuales permiten a los programas ejecutar instrucciones en forma repetida, siempre y cuando una condi-
ción de continuación de ciclo siga siendo verdadera.
• Las instrucciones while y for realizan las acciones en sus cuerpos, cero o más veces. Si al principio la condición de
continuación de ciclo (pág. 105) es falsa, las acciones no se ejecutarán. La instrucción do...while lleva a cabo las
acciones que contiene en su cuerpo, una o más veces.
• Las palabras if, else, switch, while, do y for son palabras claves en Java. Las palabras clave no pueden utilizarse
como identificadores, como los nombres de variables.
• Cada programa se forma mediante una combinación de todas las instrucciones de secuencia, selección y repetición
(pág. 105) que sean apropiadas para el algoritmo que implementa ese programa.
• Las instrucciones de control de una sola entrada/una sola salida (pág. 105) se unen unas a otras mediante la cone-
xión del punto de salida de una al punto de entrada de la siguiente. A esto se le conoce como apilamiento de ins-
trucciones de control.
• Una instrucción de control también se puede anidar (pág. 105) dentro de otra instrucción de control.
• Así como podemos colocar un bloque en cualquier parte en la que pueda colocarse una sola instrucción, también
podemos usar una instrucción vacía, que se representa colocando un punto y coma (;) en donde normalmente
estaría una instrucción.
Ejercicios de autoevaluación
4.1 Complete los siguientes enunciados:
a) Todos los programas pueden escribirse en términos de tres tipos de estructuras de control: ,
y .
b) La instrucción se utiliza para ejecutar una acción cuando una condición es verdadera, y otra
cuando esa es falsa.
c) Al proceso de repetir un conjunto de instrucciones un número específico de veces se le llama repetición
.
d) Cuando no se sabe de antemano cuántas veces se repetirá un conjunto de instrucciones, se puede usar un
valor para terminar la repetición.
e) La estructura de está integrada en Java; de manera predeterminada, las instrucciones se ejecutan
en el orden en el que aparecen.
f ) Todas las variables de instancia de los tipos char, byte, short, int, long, float y double reciben el valor
de manera predeterminada.
g) Java es un lenguaje ; requiere que todas las variables tengan un tipo.
h) Si el operador de incremento se de una variable, ésta se incrementa en 1 primero, y después su
nuevo valor se utiliza en la expresión.
4.2 Conteste con verdadero o falso a cada una de las siguientes proposiciones; en caso de ser falso, explique
por qué.
a) Un algoritmo es un procedimiento para resolver un problema en términos de las acciones a ejecutar y el
orden en el que lo hacen.
b) Un conjunto de instrucciones contenidas dentro de un par de paréntesis se denomina bloque.
c) Una instrucción de selección especifica que una acción se repetirá, mientras cierta condición siga siendo
verdadera.
d) Una instrucción de control anidada aparece en el cuerpo de otra instrucción de control.
e) Java cuenta con los operadores de asignación compuestos aritméticos +=, -=, *=, /= y %= para abreviar las
expresiones de asignación.
f ) Los tipos primitivos (boolean, char, byte, short, int, long, float y double) son portables sólo en las
plataformas Windows.
g) Al proceso de especificar el orden en el que se ejecutan las instrucciones en un programa se denomina
control del programa.
h) El operador de conversión de tipo unario (double) crea una copia entera temporal de su operando.
i) Las variables de instancia de tipo boolean reciben el valor true de manera predeterminada.
j) El seudocódigo ayuda a un programador a idear un programa, antes de tratar de escribirlo en un lenguaje
de programación.
4.3 Escriba cuatro instrucciones distintas en Java, en donde cada una sume 1 a la variable entera x.
4.4 Escriba instrucciones en Java para realizar cada una de las siguientes tareas:
a) Usar una instrucción para asignar la suma de x y y a z, e incrementar x en 1 después del cálculo.
b) Evaluar si la variable cuenta es mayor que 10. De ser así, imprimir “Cuenta es mayor que 10”.
c) Usar una instrucción para decrementar la variable x en 1, luego restarla a la variable total y almacenar el
resultado en la variable total.
d) Calcular el residuo después de dividir q entre divisor, y asignar el resultado a q. Escriba esta instrucción
de dos maneras distintas.
4.5 Escriba una instrucción en Java para realizar cada una de las siguientes tareas:
a) Declarar la variable suma de tipo int e inicializarla con 0.
b) Declarar la variable x de tipo int e inicializarla con 1.
c) Sumar la variable x a suma y asignar el resultado a la variable suma.
d) Imprimir “La suma es: ”, seguido del valor de la variable suma.
4.6 Combine las instrucciones que escribió en el ejercicio 4.5 para formar una aplicación en Java que calcule
e imprima la suma de los enteros del 1 al 10. Use una instrucción while para iterar a través de las instrucciones de
cálculo e incremento. El ciclo debe terminar cuando el valor de x se vuelva 11.
4.7 Determine el valor de las variables en la instrucción producto *= x++;, después de realizar el cálculo. Supon-
ga que todas las variables son de tipo int y tienen el valor 5.
4.8 Identifique y corrija los errores en cada uno de los siguientes conjuntos de código:
a) while (c <= 5)
{
producto *= c;
++c;
b) if (genero == 1)
System.out.println(“Mujer”);
else;
System.out.println(“Hombre”);
4.3 x = x + 1;
x += 1;
++x;
x++;
4.4 a) z = x++ + y;
b) if (cuenta > 10)
System.out.println(“Cuenta es mayor que 10”);
c) total -= --x;
d) q %= divisor;
q = q % divisor;
La suma es: 55
Ejercicios
4.10 Compare y contraste la instrucción if de selección simple y la instrucción de repetición while. ¿Cuál es la
similitud en las dos instrucciones? ¿Cuál es su diferencia?
4.11 Explique lo que ocurre cuando un programa en Java trata de dividir un entero entre otro. ¿Qué ocurre con la
parte fraccionaria del cálculo? ¿Cómo puede un programador evitar ese resultado?
4.12 Describa las dos formas en las que pueden combinarse las instrucciones de control.
4.13 ¿Qué tipo de repetición sería apropiada para calcular la suma de los primeros 100 enteros positivos? ¿Qué tipo
de repetición sería apropiada para calcular la suma de un número arbitrario de enteros positivos? Describa brevemen-
te cómo podría realizarse cada una de estas tareas.
4.14 ¿Cuál es la diferencia entre preincrementar y postincrementar una variable?
4.15 Identifique y corrija los errores en cada uno de los siguientes fragmentos de código. [Nota: puede haber más
de un error en cada fragmento de código].
a) if (edad >= 65);
System.out.println(“Edad es mayor o igual que 65”);
else
System.out.println(“Edad es menor que 65)”;
b) int x = 1, total;
while (x <= 10)
{
total += x;
++x;
}
c) while (x <= 100)
total += x;
++x;
d) while (y > 0)
{
System.out.println(y);
++y;
Para los ejercicios 4.17 a 4.20, realice cada uno de los siguientes pasos:
a) Lea el enunciado del problema.
b) Formule el algoritmo mediante un seudocódigo y el proceso de refinamiento de arriba a abajo, paso a paso.
c) Escriba un programa en Java.
4.19 (Calculadora de comisiones de ventas) Una empresa grande paga a sus vendedores mediante comisiones.
Los vendedores reciben $200 por semana, más el 9% de sus ventas brutas durante esa semana. Por ejemplo, un
vendedor que vende $5 000 de mercancía en una semana, recibe $200 más el 9% de 5 000, o un total de $650.
Usted acaba de recibir una lista de los artículos vendidos por cada vendedor. Los valores de estos artículos son los
siguientes:
Artículo Valor
1 239.99
2 129.75
3 99.95
4 350.89
Desarrolle una aplicación en Java que reciba como entrada los artículos vendidos por un comerciante durante la últi-
ma semana, y que calcule y muestre los ingresos de ese vendedor. No hay límite en cuanto al número de artículos que
un representante puede vender.
4.20 (Calculadora del salario) Desarrolle una aplicación en Java que determine el sueldo bruto para cada uno de
tres empleados. La empresa paga la cuota normal en las primeras 40 horas de trabajo de cada empleado, y cuota y
media en todas las horas trabajadas que excedan de 40. Usted recibe una lista de los empleados de la empresa, el nú-
mero de horas que trabajó cada uno la semana pasada y la tarifa por horas de cada empleado. Su programa debe recibir
como entrada esta información para cada empleado, para luego determinar y mostrar el sueldo bruto de cada trabaja-
dor. Utilice la clase Scanner para introducir los datos.
4.21 (Encontrar el número más grande) El proceso de encontrar el valor más grande se utiliza con frecuencia en
aplicaciones de computadora. Por ejemplo, un programa para determinar el ganador de un concurso de ventas recibe
como entrada el número de unidades vendidas por cada vendedor. El vendedor que haya vendido más unidades es el
que gana el concurso. Escriba un programa en seudocódigo y después una aplicación en Java que reciba como entrada
una serie de 10 números enteros, y que determine e imprima el mayor de los números. Su programa debe utilizar
cuando menos las siguientes tres variables:
a) contador: un contador para contar hasta 10 (para llevar el registro de cuántos números se han introduci-
do, y para determinar cuando se hayan procesado los 10 números).
b) numero: el entero más reciente introducido por el usuario.
c) mayor: el número más grande encontrado hasta ahora.
4.22 (Salida tabular) Escriba una aplicación en Java que utilice ciclos para imprimir la siguiente tabla de valores:
1 10 100 1000
2 20 200 2000
3 30 300 3000
4 40 400 4000
5 50 500 5000
4.23 (Encontrar los dos números más grandes) Utilizando una metodología similar a la del ejercicio 4.21, en-
cuentre los doss valores más grandes de los 10 que se introdujeron. [Nota: puede introducir cada número sólo una vez].
4.24 (Validar la entrada del usuario) Modifique el programa de la figura 4.12 para validar sus entradas. Para
cualquier entrada, si el valor introducido es distinto de 1 o 2, debe seguir iterando hasta que el usuario introduzca un
valor correcto.
4.25 ¿Qué es lo que imprime el siguiente programa?