• No se han encontrado resultados

Hacer elecciones: la sentencia condicional

Construcciones Java que se abordan en este capítulo

2.11 Hacer elecciones: la sentencia condicional

El Código 2.8 muestra los detalles internos de la definición de clase de la máquina de boletos mejorada. Muchas de estas definiciones ya son familiares a partir del análisis de la máquina de boletos simplificada. Por ejemplo, la envoltura exterior que nombra a la clase es la misma porque hemos elegido dar el mismo nombre a esta clase; además, contiene los mismos tres campos para mantener el estado del objeto y han sido decla- rados de la misma manera; el constructor y los dos métodos get también son los

mismos que los anteriores.

2.11 Hacer elecciones: la sentencia condicional 39

/**

* MaquinaDeBoletos modela una máquina de boletos que trabaja * con tarifa plana.

* El precio de un boleto se especifica a través del constructor.

* Implementa controles para asegurar que un usuario ingrese * sólo cantidades de dinero con sentido y sólo se imprimirá * un boleto si el dinero ingresado alcanza.

*

* @author David J. Barnes and Michael Kolling * @version 2006.03.30

*/

public class MaquinaDeBoletos{

// El precio de un boleto de esta máquina. private int precio;

// La cantidad de dinero ingresada hasta ahora por un cliente.

private int saldo;

// El total del dinero recolectado por esta máquina. private int total;

/** Código 2.8 Una máquina de boletos más sofisticada 02 CAPITULO 02 9/1/07 17:31 Página 39

40 Capítulo 2  Comprender las definiciones de clases

* Crea una máquina que vende boletos de un precio determinado.

*/

public MaquinaDeBoletos(int precioDelBoleto) { precio = precioDelBoleto; saldo = 0; total = 0; } /**

* Devuelve el precio de un boleto. */

public int getPrecio() {

return precio; }

/**

* Devuelve la cantidad de dinero que ya se ingresó para

* el siguiente boleto. */

public int getSaldo() {

return saldo; }

/**

* Recibe del cliente una cantidad de dinero en centavos.

* Controla que la cantidad tenga sentido. */

public void ingresarDinero(int cantidad) {

if(cantidad > 0) {

saldo = saldo + cantidad; }

else {

System.out.println("Debe ingresar una cantidad positiva: " +

cantidad); }

} /**

* Imprime un boleto si la cantidad de dinero ingresada * alcanza y disminuye el saldo actual en el precio * del boleto. Imprime un mensaje de error si se * requiere más dinero.

*/

public void imprimirBoleto() { Código 2.8 (continuación) Una máquina de boletos más sofisticada

Encontramos el primer cambio significativo en el método ingresarDinero. Hemos

reconocido que el principal problema de la máquina de boletos simplificada era su falta de control sobre ciertas condiciones. Una de esas faltas de control era sobre la can- tidad de dinero introducida por un cliente, de modo que resultaba posible ingresar una cantidad de dinero negativa. Hemos remediado esa falla haciendo uso de una sentencia

condicionalque controla que el monto ingresado sea un valor mayor que cero:

if(cantidad > 0) {

saldo = saldo + cantidad; }

else {

System.out.println("Debe ingresar una cantidad positiva: " + cantidad);

}

2.11 Hacer elecciones: la sentencia condicional 41

if(saldo >= precio) {

// Simula la impresión de un boleto. System.out.println("##################"); System.out.println("# Línea BlueJ "); System.out.println("# Boleto");

System.out.println("# " + precio + " cvos.");

System.out.println("##################"); System.out.println();

// Actualiza el total recolectado con el precio.

total = total + precio;

// Disminuye el saldo en el valor del precio. saldo = saldo - precio;

} else {

System.out.println("Debe ingresar como mínimo: " + (precio - saldo) + " cvos más.");

} } /**

* Devuelve el valor del saldo. * Se limpia el saldo.

*/

public int reintegrarSaldo() { int cantidadAReintegrar; cantidadAReintegrar = saldo; saldo = 0; return cantidadAReintegrar; } } Código 2.8 (continuación) Una máquina de boletos más sofisticada 02 CAPITULO 02 9/1/07 17:31 Página 41

Las sentencias condicionales también son conocidas como sentencias if debido a la

palabra usada en la mayoría de los lenguajes de programación que las introducen. Una sentencia condicional nos permite hacer una de dos acciones posibles basándose en el resultado de una verificación o prueba: si el resultado es verdadero entonces hacemos una cosa, de lo contrario hacemos algo diferente. Una sentencia condicional tiene la forma general descrita en el siguiente pseudo-código:

if(se lleva a cabo alguna prueba que da un resultado

verdadero o falso) {

Si la prueba dio resultado verdadero, ejecutar estas sentencias }

else {

Si el resultado dio falso, ejecutar estas sentencias }

Es importante apreciar que después de la evaluación de la prueba se llevará a cabo sólo uno de los conjuntos de sentencias que están a continuación de la prueba. Por lo que, en el ejemplo del método ingresarDinero, a continuación de la prueba sobre la cantidad de dinero introducida, sólo sumaremos la cantidad al saldo o bien mos- traremos el mensaje de error. La prueba usa el operador mayor que «>» para com- parar el valor de cantidadcon cero. Si el valor es mayor que cero entonces se sumará al saldo. Si no es mayor que cero, se muestra un mensaje de error. En efecto, usando una sentencia condicional podemos proteger la modificación del saldo del caso en

que el parámetro no represente una cantidad válida.

La prueba que se usa en una sentencia condicional es un ejemplo de una expresión booleana. Anteriormente en este capítulo introdujimos expresiones aritméticas que pro- ducen resultados numéricos. Una expresión booleana tiene sólo dos valores posibles, verdadero(true)o falso (false): una de dos, el valor de cantidad es mayor que cero (verdadero) o no es mayor que cero (falso). Una sentencia condicional hace uso de esos dos posibles valores para elegir entre dos acciones diferentes.

Ejercicio 2.43 Controle que el comportamiento del que hemos hablado es correcto creando una instancia de MaquinaDeBoletos e invocando a ingre- sarDinero con varios valores diferentes en el parámetro actual. Controle el

saldo antes y después de invocar a ingresarDinero. En los casos en que se muestra un mensaje de error, ¿cambia el valor del saldo? Trate de predecir qué ocurriría si ingresa como parámetro el valor cero y luego compruebe la verdad de su predicción.

Ejercicio 2.44 Prediga qué cree que ocurrirá si cambia el control de ingre- sarDinero usando el operador mayor o igual que.

if(cantidad >= 0)

Verifique sus predicciones ejecutando algunas pruebas. ¿Qué diferencia pro- duce este cambio en el comportamiento del método?

Ejercicio 2.45 En el proyecto figurasque vimos en el Capítulo 1 usamos un campo boolean para controlar un aspecto de los objetos círculo. ¿Cuál es ese aspecto? ¿Estaba bien hecho el control mediante un tipo que tiene sólo dos valores diferentes?

42 Capítulo 2  Comprender las definiciones de clases

Concepto Una sentencia condicionalrealiza una de dos acciones posibles basándose en el resultado de una prueba. Concepto Las expresiones booleanastienen

sólo dos valores posibles: verdadero o falso. Se las encuentra comúnmente controlando la elección entre los dos caminos posibles de una sentencia condicional.

2.12

Un ejemplo más avanzado de sentencia