Decisiones - Cómputo

“¿Qué número ingresó el usuario?”. 2. Decisiones con if e if...else. La sentencia más simple en Java que se puede usar para hacer una decisión es la sentencia.
228KB Größe 11 Downloads 88 vistas
Decisiones H. Tejeda Febrero 2016

´Indice 1. Planeaci´ on de la l´ ogica de decisi´ on

2

2. Decisiones con if e if...else

3

3. Sentencias m´ ultiples con if e if...else

6

4. Anidamiento de sentencias if e if...else

8

5. Operadores l´ ogicos

9

6. Decisiones eficientes y precisas

11

7. Sentencia switch

15

8. Operador condicional y de negaci´ on

18

9. Precedencia de operadores

20

10.Decisiones en constructores

21

1

1.

Planeaci´ on de la l´ ogica de decisi´ on

Los programadores generalmente planean las partes complejas de los programas con l´apiz y papel. Estos usan frecuentemente pseudoc´ odigo, una herramienta que ayuda a planear la l´ogica del programa escribiendo sentencias en lenguaje coloquial. El uso de pseudoc´odigo requiere que se anoten los pasos necesarios para lograr una tarea dada. Alguna tarea que se d´e en pseudoc´odigo no tiene que estar relacionada con la computadora. Por ejemplo, escribir los pasos para llegar a un cierto lugar. Un diagrama de flujo es parecido a un pseudoc´odigo, pero los pasos se dan en forma de diagrama, como un conjunto de figuras conectadas por flechas. Se pueden dibujar diagramas de flujo que representen situaciones muy complejas usando s´olo rect´angulos y rombos. Se usa un rect´angulo para representar un paso no condicionado y un rombo para representar cualquier decisi´on. La estructura l´ogica llamada estructura secuencial es aquella en la cual un paso sigue a otro sin ninguna condici´on. La cantidad de pasos es arbitrario. Los pasos l´ogicos en ocasiones no siguen una secuencia incondicional—las tareas podr´ıan o no ocurrir de acuerdo a las decisiones hechas. Para representar una decisi´on se usa un rombo para tener una pregunta, y se dibujan trayectorias alternativas a los rumbos de acci´on saliendo de los lados del rombo. La figura 1 incluye dos estructuras de decisi´ on, las cuales involucran escoger entre caminos alternativos de acci´on de acuerdo al d´ıa de la semana. Realizar decisiones es lo que hace que los programas de computo parezcan “inteligentes”.

Figura 1: Diagrama de flujo con decisiones Todas las decisiones computacionales son decisiones s´ı o no, es decir, la respuesta a cada pregunta computacional es true o false (o on u off ). La raz´on de lo anterior es porque la circuiter´ıa computacional consiste de millones de min´ usculos interruptores que est´an apaga2

dos o encendidos, y el resultado de cada decisi´on se pone en uno de estos interruptores en la memoria. Los valores booleanos (o l´ogicos) son true o false, y cada decisi´on computacional da un valor booleano. As´ı un programa pregunta “¿ingreso el usuario un 1?” “sino, ¿ingreso el usuario un 2?” “sino, ¿ingreso el usuario un 3?” en vez de una pregunta como “¿Qu´e n´ umero ingres´o el usuario?”.

2.

Decisiones con if e if...else

La sentencia m´as simple en Java que se puede usar para hacer una decisi´on es la sentencia if. Suponer que se ha declarado una variable entera llamada calificacion y se quiere mostrar un mensaje cuando el valor de calificacion es 10. La sentencia if, c´odigo 1, hace la decisi´on de s´ı se debe producir salida. Observar que signo doble igual (==) es usado para determinar igualdad; este es un operador de equivalencia de Java. 1 2

i f ( c a l i f i c a c i o n == 1 0 ) System . out . p r i n t l n ( ”La c a l i f i c a c i ´on e s p e r f e c t a ” ) ;

C´odigo 1: Ejemplo de una sentencia if. Si calificaci´ on, en el c´odigo 1, tiene el valor 10, el valor booleano de la expresi´on calificacion == 10 es true, y la subsecuente sentencia de salida se ejecuta. Si el valor de la expresi´on es false, porque calificacion tiene un valor diferente a 10, la sentencia de salida no se ejecuta. Una sentencia if siempre requiere par´entesis. Dentro de los par´entesis, se puede colocar cualquier expresi´on booleana, las cuales usan alguno de los siguientes operadores relacionales: ==, ! =, , =. Sin embargo, se puede usar cualquier expresi´on que d´e un valor booleano, como una variable booleana, o una llamada a un m´etodo.

2.1.

Colocaci´ on incorrecta de punto y coma en sentencia if

En el c´odigo 1 no hay un punto y coma al final de la primera l´ınea de la sentencia if ya que la sentencia no termina ah´ı. La sentencia termina despu´es de la llamada a println(), por eso es donde se pone el punto y coma. Se podr´ıa intentar poner la sentencia if entera en una sola l´ınea y se ejecutar´ıa correctamente; sin embargo, el formato de dos l´ıneas para la sentencia if es m´as convencional y f´acil de leer, as´ı que se pone la sentencia if y la expresi´on booleana en una l´ınea, y sangrar con espacios antes de codificar la acci´on que ocurre si la expresi´on booleana se eval´ ua como true. Ser cuidadoso—si se usa el formato de dos l´ıneas y se pone un punto y coma al final de la primera l´ınea, como se muestra en el ejemplo del c´odigo 2, da un resultado que podr´ıa no ser el que se intenta.

3

1 2

i f ( c a l i f i c a c i o n == 1 0 ) ; System . out . p r i n t l n ( ”La c a l i f i c a c i ´on e s p e r f e c t a ” ) ;

C´odigo 2: Colocaci´on extra de ; despu´es de la expresi´on booleana en la sentencia if. Cuando la expresi´on booleana en el c´odigo 2 es true, una sentencia vac´ıa contenida entre la expresi´on booleana y el punto y coma se ejecuta. Si la expresi´on probada se eval´ ua a true o false, la decisi´on es inmediata (no hacer nada), y la ejecuci´on contin´ ua con la siguiente sentencia independientemente para mostrar siempre un mensaje. En este caso, por el punto y coma incorrecto, la sentencia if no hace nada.

2.2.

Operador de asignaci´ on en vez de equivalencia

Otro error de programaci´on com´ un es cuando el programador usar un s´olo signo de igual en vez de un doble signo de igual cuando intenta determinar la igualdad. La expresi´on calificacion = 10 no hace la comparaci´on de calificacion con 10, lo que intenta hacer es una asignaci´on de 10 a calificacion. Si se usa esta asignaci´on en la sentencia if, esta es ilegal porque s´olo expresiones booleanas son permitidas. Nota. La expresi´ on if(x = true) compilar´a s´olo si x es una variable booleana, ya que es legal asignar true a x. Sin embargo, esta sentencia es poco u ´til ya que el valor de la expresi´ on nunca podr´ıa ser false.

Una alternativa al uso de una expresi´on booleana en una sentencia if, es guardar el valor de la expresi´on booleana en una variable booleana. Y luego usar la variable en la sentencia if como se muestra enseguida. esCalificacionPerfecta = (calificacion == 10); if ( esCalificacionPerfecta ) System.out.println("La calificaci´ on es perfecta."); Lo anterior agrega un paso extra al programa, pero hace la sentencia if m´as similar a una sentencia del lenguaje coloqieal.

2.3.

Intentar comparar objetos con operadores relacionales

Para los tipos primitivos, como int y double se pueden usar los operadores relacionales est´andar (==, , =, y !=). Sin embargo no se pueden usar , = para comparar objetos; un programa con tales comparaciones no compila. Se pueden usar las comparaciones == y ! = con objetos, pero cuando se usan, no se comparan sus valores, se comparan las direcciones de memoria de los objetos. == dar´a true para dos objetos 4

cuando ellos se refieran al mismo objeto en memoria, y no cuando ellos son objetos diferentes con el mismo valor. Para comparar los valores de los objetos, se deber´ıan escribir m´etodos especializados. Por ejemplo, con objetos String no se debe usar ==. Los nombres de los objetos son referencias, sus nombres de campos no son referencias si ellos representan tipos de datos primitivos. Se podr´ıa comparar los valores entre campos de objetos usando m´etodos accesores p´ ublicos. Por ejemplo, suponer que se ha creado una clase llamada Estudiante con un campo double para el promedio y un m´etodo p´ ublico llamado getPromedio(). Despu´es de instanciar dos objetos, estudiante1 y estudiante2, se puede escribir una sentencia como la siguiente: if (estudiante1.getPromedio() > estudiante2.getPromedio()) System.out.println("Primer estudiante con un promedio mayor"); Los valores representados por estudiante1.getPromedio() y estudiante2.getPromedio() son double, as´ı que pueden ser comparados usando cualquier operador relacional.

2.4.

Estructura if...else

En la siguiente sentencia: if (calificacion == 10) System.out.println("La calificaci´ on es perfecta"); Esta sentencia tambi´en es llamada una alternativa simple if porque el programa solo realiza una acci´on, o no, basada en una alternativa. En ocasiones se requieren dos opciones para el camino de la acci´on siguiendo a la decisi´on. Una alternativa doble if es la estructura de decisi´on que se usa cuando se necesita tomar uno u otro de dos posibles caminos de acci´on. En Java, la sentencia if...else da el mecanismo para realizar una acci´on cuando una expresi´on booleana eval´ ua a true y para realizar una acci´on diferente cuando la expresi´on booleana eval´ ua a false. El c´odigo 3 muestra uno de dos mensajes. Cuando el valor de calificacion es 10, la cl´ ausula if de la sentencia es ejecutada, mostrando el mensaje “La calificaci´on es perfecta”. Cuando calificacion es cualquier valor diferente de 10, la cl´ ausula else de la sentencia se ejecuta y el programa muestra el mensaje “No lo es”. Se puede codificar un if sin un else, pero es ilegal codificar un else si un if que le preceda. 1 2 3 4

i f ( c a l i f i c a c i o n == 1 0 ) ; System . out . p r i n t l n ( ”La c a l i f i c a c i ´on e s p e r f e c t a ” ) ; else System . out . p r i n t l n ( ”No l o e s ” ) ;

C´odigo 3: Una estructura if...else. 5

El sangrado mostrado en el c´odigo 3 no es requerido pero es de uso est´andar. Se alinean verticalmente las palabras reservadas if y else, y se sangran las sentencias de acci´on que dependen de la evaluaci´on. Cada sentencia, la que sigue al if y la que sigue al else, es una sentencia completa, por lo que cada una termina con punto y coma.

3.

Sentencias m´ ultiples con if e if...else

En ocasiones se quiere ejecutar m´as de una acci´on despu´es de la evaluaci´on de una expresi´on booleana dentro de una sentencia if. Para ejecutar m´as de una sentencia se deben usar llaves para poner las sentencias en un bloque. El siguiente segmento de un programa determina si un empleado ha trabajado m´as que el valor de la constante SEMANA COMPLETA; s´ı as´ı es, se calcula el pago ordinario y el extraordinario. if (horasTrabajadas > SEMANA_COMPLETA) { pagoOrdinario = SEMANA_COMPLETA * tarifa; pagoExtraordinario = (horasTrabajadas - SEMANA_COMPLETA) * TASA_EXTRA * tarifa; } Cuando se pone un bloque dentro de una sentencia if, es importante colocar las llaves correctamente. En el siguiente c´odigo las llaves fueron omitidas y cuando horasTrabajadas >SEMANA COMPLETA es true, entonces pagoOrdinario es calculado y la expresi´on if termina. La siguiente sentencia, la que calcula el pago extraordinario, se ejecuta siempre que se ejecuta el programa, no importando el valor de horasTrabajadas, es decir, no depende de la sentencia if. El sangrado podr´ıa ser enga˜ noso; pareciera que las dos sentencias dependen del if, pero el sangrado no hace que esas sentencias sean dependientes del if. if (horasTrabajadas > SEMANA_COMPLETA) pagoOrdinario = SEMANA_COMPLETA * tarifa; pagoExtraordinario = (horasTrabajadas - SEMANA_COMPLETA) * TASA_EXTRA * tarifa; Cuando se crea un bloque, no se requiere poner m´as de una sentencia. Es legal poner llaves alrededor de una sola sentencia. Por claridad, algunos programadores siempre usan llaves para encerrar las acciones en una sentencia if, no importando s´ı solo tiene una sentencia el bloque. Cuando no se hace un bloque de sentencias porque dependen de un if, y se usa la cl´ausula else, el programa no compilar´a. Considerar el siguiente c´odigo: 6

if (horasTrabajadas > SEMANA_COMPLETA) pagoOrdinario = SEMANA_COMPLETA * tarifa; pagoExtraordinario = (horasTrabajadas - SEMANA_COMPLETA) * TASA_EXTRA * tarifa; else pagoOrdinario = SEMANA_COMPLETA * tarifa; En este caso, la sentencia if termina despu´es del primer c´alculo de pagoOrdinario, y la segunda sentencia independiente realiza el c´alculo para pagoExtraordinario. La tercera sentencia inicia con else, la cual es ilegal, ya que hay un else sin un if, es decir la sentencia precedente no fue un if que es lo que se requer´ıa. Al igual como se pueden hacer bloques de sentencias para que dependan de un if, tambi´en se puede hacer para un else. La aplicaci´on Nomina, c´odigo 4, muestra una estructura if con dos sentencias dependientes y una else tambi´en con dos sentencias. La u ´ltima sentencia println() se ejecuta sin importar el valor de la variable horasTrabajadas; no es parte de la estructura if. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

import j a v a . u t i l . Scanner ; public c l a s s Nomina { public s t a t i c void main ( S t r i n g [ ] a r g s ) { double t a r i f a ; double h o r a s T r a b a j a d a s ; double p a g o O r d i n a r i o ; double p a g o E x t r a o r d i n a r i o ; f i n a l int SEMANA COMPLETA = 4 0 ; f i n a l double TASA EXTRA = 1 . 5 ; Scanner e n t r a d a = new Scanner ( System . i n ) ; System . out . p r i n t ( ”¿Cu´ a n t a s h o r a s t r a b a j a s t e e s t a semana ? ” ) ; h o r a s T r a b a j a d a s = e n t r a d a . nextDouble ( ) ; System . out . p r i n t ( ”¿Cu´ a l es la t a r i f a ? ” ) ; t a r i f a = e n t r a d a . nextDouble ( ) ; i f ( h o r a s T r a b a j a d a s > SEMANA COMPLETA ) { p a g o O r d i n a r i o = SEMANA COMPLETA ∗ t a r i f a ; p a g o E x t r a o r d i n a r i o = ( h o r a s T r a b a j a d a s − SEMANA COMPLETA) ∗ TASA EXTRA ∗ t a r i f a ; } else { pagoOrdinario = horasTrabajadas ∗ t a r i f a ; pagoExtraordinario = 0 . 0 ; } System . out . p r i n t l n ( ” El pago o r d i n a r i o e s ” + p a g o O r d i n a r i o + ” \n El pago e x t r a e s ” + pagoExtra ) ; } }

C´odigo 4: Aplicaci´on interactiva Nomina. 7

Cuando se hacen bloques de sentencias, se debe recordar que cualquier variable declarada dentro del bloque es local a ese bloque. En el siguiente segmento de c´odigo se tiene una variable llamada suma que es local al bloque que sigue al if. La u ´ltima sentencia println() causa un error porque la variable suma no est´a reconocida: if (a == b) { int suma = a + b; System.out.println("Las dos variables son iguales"); } System.out.println("La suma es " + suma);

4.

Anidamiento de sentencias if e if...else

Dentro de una cl´ausula if o else se pueden codificar muchas sentencias dependientes seg´ un se requiera, incluso otras estructuras if. Las estructuras if que est´an contenidas dentro de otras if son llamadas sentencias if anidadas. Estas son empleadas cuando dos condiciones deben ser cumplidas antes de que una acci´on sea tomada. Suponer que se quiere pagar un bono de $1,000 a un vendedor s´olo si este vendi´o al menos tres art´ıculos que totalicen al menos $20,000 en valor durante un cierto tiempo. El siguiente c´odigo muestra la soluci´on al problema. final int MIN_ARTS = 3; final int MIN_VENTA = 20000; final int BONO_VENTA = 1000; in t bono = 0; if (articulosVendidos >= MIN_ARTS) if (totalVenta >= MIN_VENTA) bono = BONO_VENTA; Observar que no hay puntos y comas en la sentencia if hasta despu´es de la sentencia bono = BONO VENTA. La expresi´on articulosVendidos >= MIN ARTS es evaluada primero. S´olo si esta expresi´on es true el programa eval´ ua la segunda expresi´on boolena, totalVenta >= MIN VENTA. Si esta expresi´on tambi´en es true, la sentencia de asignaci´on del bono se ejecuta, y la estructura if termina. Cuando se anidan sentencias if se debe tener cuidado al colocar cualquier cl´ausula else. Por ejemplo, suponer que se quieren distribuir bonos con la siguiente pol´ıtica. Si el vendedor no vende al menos tres art´ıculos, se le dan $200 de bono. Si el vendedor vende al menos tres art´ıculos cuyo valor combinado es menor que $20,000, el bono es de $500. Si el vendedor vende al menos tres art´ıculos cuyo valor combinado es al menos $20,000 el bono es de $1,000. El siguiente c´odigo muestra la l´ogica. 8

final final final final final

int int int int int

MIN_ARTS = 3; MIN_VENTA = 20000; BONO_MAYOR = 1000; BONO_MEDIO = 500; BONO_PEQUE~ NO = 200;

int bono = 0; if (articulosVendidos >= MIN_ARTS) if (totalVenta >= MIN_VENTA) bono = BONO_MAYOR; else bono = BONO_MEDIO; else bono = BONO_PEQUE~ NO; Como se muestra en el c´odigo previo, cuando una sentencia if sigue a otra, la primer cl´ausula else encontrada es emparejada con el if m´as reciente encontrado. No importa cuantos niveles de sentencias if...else sean requeridos para dar una soluci´on, las sentencias else son siempre asociados con los if basados en “primero en entra, u ´ltimo en salir”. El sangrado de las l´ıneas de c´odigo ayuda a mostrar cual sentencia else es emparejada con cual sentencia if.

5.

Operadores l´ ogicos

Se pueden combinar dos pruebas booleanas en Java en una sola expresi´on usando los operadores l´ogicos Y y O.

5.1.

Operador Y

Como alternativa para algunas sentencias if anidadas, se puede usar el operador l´ ogico Y entre dos expresiones booleanas para realizar una acci´on cuando ambas sean true. El operador Y en Java es escrito usando dos ampersands (&&). Las dos sentencias que se muestran enseguida trabajan en la misma forma. En ambos casos, la variable articulosVendidos deber´a ser al menos el n´ umero m´ınimo de art´ıculos requeridos para un bono y la variable totalVenta deber´a ser al menos el valor m´ınimo requerido para que bono sea puesto a BONO VENTA. if (articulosVendidos >= MIN_ARTS) if (totalVenta >= MIN_VENTA) bono = BONO_VENTA;

9

if (articulosVendidos >= MIN_ARTS && totalVenta >= MIN_VENTA) bono = BONO_VENTA; Cuando se usa el operador && se debe incluir una expresi´on booleana completa de cada lado, ya que es un operador binario. Si se quiere poner un bono a $8,000 cuando cantidadVendida est´a por encima de $20,000 y por debajo de $100,000, la sentencia correcta es: if (cantidadVendida > 20000 && cantidadVendida < 100000) bono = 8000; La siguiente sentencia no compilar´a porque no tiene una expresi´on booleana a cada lado del operador &&. if (cantidadVendida > 20000 && < 100000) bono = 8000; Por claridad, varios programadores prefieren encerrar cada expresi´on booleana, que es parte de una expresi´on booleana compuesta con su propio conjunto de par´entesis, como en el siguiente ejemplo: if ((cantidadVendida > 20000) && (cantidadVendida < 100000)) bono = 8000; No es obligatorio usar el operador && porque usando sentencias if anidadas siempre se logra el mismo resultado, pero con el operador && se logra un c´odigo m´as compacto, menos susceptible a errores, y m´as f´acil de entender.

5.2.

Operador O

Cuando se quiere que alguna acci´on ocurra si s´olo una de dos condiciones es true, se puede usar sentencias if anidadas, o se puede usar el operador l´ ogico O, el cual se indica con || (tubo). Suponer que se quiere dar un descuento a cualquier cliente que satisfaga al menos una de dos condiciones—haber comprado un m´ınimo de art´ıculos o comprado cualquier cantidad de art´ıculos tal que totalicen al menos un valor m´ınimo—se puede escribir el c´odigo usando alguna de las siguientes dos formas. if (articulosComprados >= MIN_ARTS) tarifaDescuento = DESCUENTO; 10

else if (articulosTotal >= VALOR_MIN) tarifaDescuento = DESCUENTO. if (articulosComprados >= MIN_ARTS || articulosTotal >= VALOR_MIN) tarifaDescuento = DESCUENTO; Al igual que con el operador && no es obligatorio usar el operado || porque usando sentencias if anidadas se logra el mismo resultado. Sin embargo, usando el operador || se hace el c´odigo m´as compacto, menos susceptible a errores, y m´as f´acil de entender.

5.3.

Evaluaci´ on cortocircuitada

Las expresiones a cada lado de los operadores && y || son evaluadas tanto como sea necesario para determinar si la expresi´on completa es true o false. Esta capacidad es llamada evaluaci´ on cortocircuitada. Con el operador && ambas expresiones booleanas deber´an ser true antes de que la acci´on pueda ocurrir, si la primera expresi´on probada es false, la segunda expresi´on nunca es evaluada ya que su valor no importa. Con el operador || s´olo una de las expresiones booleanas deber´a ser verdadera para hacer que las sentencias dependientes sean ejecutadas, si el primer operando de || es verdadero, entonces no hay necesidad de evaluar la expresi´on de la derecha, ya que su valor no importa. Suponer que se han creado dos m´etodos que devuelven valores booleanos y se usan las llamadas a estos m´etodos en una sentencia if, como se muestra enseguida: if (metodo1() && metodo2()) System.out.println("Correcto"); Dependiendo de las acciones realizadas dentro de los m´etodos, podr´ıa ser importante entender que en este caso, si metodo1() es falso, entonces el metodo2() no se ejecutar´a.

6.

Decisiones eficientes y precisas

Cuando los programadores deben revisar un rango, en ocasiones introducen c´odigo incorrecto o ineficiente. Se revisa enseguida como hacer revisiones de rango en forma precisa y eficiente, adem´as de usar los operadores l´ogicos && y || apropiadamente.

11

6.1.

Revisi´ on precisa de rango

Una revisi´ on de rango es una secuencia de sentencias que determinan en cual de varios valores consecutivos otro valor cae. Considerar el caso en el cual un agente de ventas puede recibir una de tres posibles tasas de comisi´on de acuerdo a sus ventas. Una venta totalizando $20,000 o m´as da al agente una comisi´on del 8 %, una venta entre $10,000 y hasta $19,999.99 da 6 %, y cualquier otra hasta $9,999.99 o menos da 5 %. Empleando tres sentencias if para probra expresiones booleana simples podr´ıa resultar en alguna asignaci´on incorrecta de la comisi´on. Por ejemplo, revisar el siguiente c´odigo: final final final final final final

double double double double double double

LIM_SUP COM_SUP LIM_MED COM_MED LIM_INF COM_INF

= = = = = =

20000.00; 0.08; 10000.00; 0.06; 9999.99; 0.05;

if (totalVenta >= LIM_SUP) tasaComision = COM_SUP; if (totalVenta >= LIM_MED) tasaComision = COM_MED; if (totalVenta = LIM SUP) eval´ ua embargo, la siguiente expresi´on del segundo if, (totalVenta >= LIM MED), tambi´en eval´ como true, as´ı a tasaComision, que hab´ıa sido puesta a COM SUP, es incorrectamente puesta ahora a COM MED. Una soluci´on parcial a lo anterior es usar una sentencia else siguiendo a la primera evaluaci´on como se muestra enseguida: final final final final final final

double double double double double double

LIM_SUP COM_SUP LIM_MED COM_MED LIM_INF COM_INF

= = = = = =

20000.00; 0.08; 10000.00; 0.06; 9999.99; 0.05;

if (totalVenta >= LIM_SUP) tasaComision = COM_SUP; else if (totalVenta >= LIM_MED) 12

tasaComision = COM_MED; if (totalVenta = LIM SUP) es true y a tasaComision se asigna COM SUP; entonces la estructura entera if termina. Cuando totalVenta no es mayor que o igual a $20,000 (por ejemplo, $16,000), la primera expresi´on if es false, y la sentencia else se ejecuta y pone correctamente tasaComision a COM MED. Este c´odigo es algo ineficiente, cuando totalVenta es cualquier cantidad por encima de LIM INF, el primer if pone tasaComision a COM SUP para cantidades que est´an al menos en $20,000, o su else pone tasaComision a COM MED para cantidades que est´an son al menos $10,000. En cualquiera de estos dos casos, el valor booleano probado en la siguiente sentencia, if(totalVenta = LIM_MED) tasaComision = COM_MED; else tasaComision = COM_INF;

6.2.

Revisiones de rango eficientes

Dentro de un if...else anidado, como el del c´odigo anterior, es m´as eficiente hacer la pregunta que sea m´as probable que sea verdadera al inicio. Es decir, si se sabe que la mayor´ıa de veces el valor de totalVenta es grande, comparar primero totalVenta con LIM SUP. 13

De esta forma, es m´as frecuente evitar hacer m´ ultiples preguntas. Sin embargo, si se sabe que la mayor´ıa de veces totalVenta es peque˜ no, se debe preguntar primero if(totalVenta =25); se puede convertir en parte de la expresi´on relativamente f´acil de leer if(!suficienteMaduro)...

9.

Precedencia de operadores

Se pueden combinar tantos operadores && o || como se necesiten para hacer una decisi´on. Sup´ongase que se quiere premiar con puntos extras (definidos como EXTRA) para cualquier estudiante que reciba una calificaci´on perfecta en algunos de las cuatro pruebas, se podr´ıa escribir una sentencia como la siguiente: if (calificacion1 == PERFECTA || calificacion2 == PERFECTA || calificacion3 == PERFECTA || calificacion4 == PERFECTA) extra = EXTRA; else extra = 0; Se puede combinar cualquier cantidad de operaciones && o || en una expresi´on, pero se debe tener cuidado cuando se combinen. Las operaciones aritm´eticas tienen diferentes precedencias que hacen una diferencia al ser evaluada la expresi´on. En una expresi´on aritm´etica, la multiplicaci´on y la divisi´on son siempre hechas antes que la suma o la resta. El cuadro 1 muestra la precedencia de los operadores revisados. Cuadro 1: Precedencia M´as alta Intermedia

M´as baja

Precedencia de los operadores revisados. Operador(es) S´ımbolo(s) Negaci´on l´ogica ! Multiplicaci´on, divisi´on, m´odulo * / % Adici´on, substracci´on + Relacionales > < >= 2 || edad < 25 && sexo == ’H’) premiumExtra = 2000; // Asigna cargo premium extra correctamente // La expresi´ on dentro de los par´ entesis anidados se eval´ ua primero if ((multasTransito > 2 || edad < 25) && sexo == ’H’) premiumExtra = 2000; Si consideramos una mujer conductora de 30 a˜ nos con tres multas de tr´ansito; de acuerdo a los criterios dados, a ella no se le deber´ıa asignar el premium extra porque ella no es hombre. Para la primera expresi´on como el operador && toma precedencia, as´ı edad