Está en la página 1de 127
Uso de estructuras de control Caso practico Los miembros de BK Programacién estén inmersos en el mundo de Java, ya conocen una buena parte del lenguaje y ahora van a empezar a controlar el comportamiento de sus programas. Maria pregunta a Juan: -Dime Juan, clas estructuras de control en Java son similares a las de cualquier otro lenguaje? -Efectivamente, Maria, como la gran mayoria de los lenguajes de programacién, Java incorpora estructuras que nos permiten tomar decisiones, repetir cédigo, etc. Cada estructura tiene sus ventajas, inconvenientes y situaciones para las que es adecuada. Hay que saber dénde utilizar cada una de ellas -aclara Juan. 4 ‘ ‘Stoetye, Usa etucatio no comercial para pastors pubes 6 Formacin Protesionala conv kim vis 1.- Introduccion. En la unidad anterior has podido aprender cuestiones basicas sobre el lenguaje Java: definicién de variables, tipos de datos, asignacidn de valores, uso de literales, diferentes operadores que se pueden aplicar, conversiones de tipos, insercién de comentarios, etc. Posteriormente, hemos dado los primeros pasos en la solucién de algoritmos sencillos, que sdlo requieren ejecutar unas instrucciones detras de otras, sin posibilidad de decidir, segun la situacién, ejecutar unas u otras sentencias, ni nada parecido. Todo era una ejecucién secuencial, una sentencia detrés de otra, sin vuelta atrds, ni saltos de ninginn tipo en el orden de ejecucién en que estaban escritas. éPero es eso suficiente? Reflexiona Piensa en la siguiente pregunta: ¢Cémo un programa puede determinar la aparicin en pantalla de un mensaje de EXITO o ERROR, segin los datos de entrada aportados por un usuario? Como habrés deducido, con lo que sabemos hasta ahora no es suficiente. Existen miltiples situaciones que nuestros programas deben representar y que requieren tomar ciertas decisiones, ofrecer diferentes alternativas o llevar a cabo determinadas operaciones repetitivamente hasta conseguir sus objetivos. Si has programado alguna vez o tienes ciertos conocimientos basicos sobre lenguajes de programacién, sabes que la gran mayoria de lenguajes poseen estructuras que permiten a los programadores controlar el flujo de la informacion de sus programas. Esto realmente es una ventaja para la persona que esta aprendiendo un nuevo lenguaje, 0 tiene previsto aprender més de uno, ya que estas estructuras suelen ser comunes a todos (con algunos cambios de te léxico o de te sintaxis). | Sweowe Es decir, si conocias sentencias de control de flujo en otros lenguajes, para patos lo que vamos a ver a lo largo de esta unidad te va a sonar bastante, "ses aunque seguro que encuentras alguna diferencia al verlas en Java. costae aa Para alguien que no ha programado nunca, un ejemplo sencillo le va a permitir entender qué es eso de las sentencias de control de flujo. Piensa en un fontanero (programador), principalmente trabaja con agua (datos) y se encarga de hacer que ésta fluya por donde €l quiere (programa) a través de un conjunto de tuberias, codes, latiguillos, llaves de paso, etc. (sentencias de control de flujo). Pues esas estructuras de control de flujo son las que estudiaremos, conoceremos su estructura, funcionamiento, cémo utilizarlas y dénde. A través de ellas, al construir nuestros programas podremos hacer que los datos (agua) fluyan por los caminos adecuados para representar la realidad del problema y obtener un resultado adecuado. Los tipos de estructuras de programacion que se emplean para el control del flujo de los datos, en cualquier lenguaje, son los siguientes: “ Secuencial: compuestas por 0, 1 0 més sentencias que se ejecutan en el orden en que han sido escritas. Es la estructura mas sencilla y sobre la que se construiran el resto de estructuras. Es de hecho la que hemos usado en los ejemplos y ejercicios de la unidad anterior (un conjunto de sentencias que se ejecutan una detras de otra). ¥ Selectiva 0 condicional: es un tipo de sentencia especial que permite tomar decisiones, dependiendo del valor de una condicién (una expresién Idgica). Segiin la evaluacién de la condicién se generar un resultado (que suiele ser verdadero o falso) y en funcion de éste, se ejecutara una secuencia de instrucciones u otra (que puede ser no ejecutar ninguna instruccién y pasar a ejecutar la siguiente sentencia detras de! bloque condicional). Las estructuras selectivas (0 de seleccién, 0 condicionales) podran ser: © Selectiva simple. Selectiva compuesta. Selectiva miltiple. “ Iterativa, repetitiva o ciclica: es un tipo de sentencia especial que permite repetir la ejecucién de una secuencia o bloque de instrucciones segtin el resultado de la evaluacién de una condicién (una expresién ldgica). Es decir, la secuencia de instrucciones se ejecutard repetidamente si la condicién arroja un valor correcto, en otro caso la secuencia de instrucciones dejaré de ejecutarse, y se pasara a ejecutar la siguiente sentencia detras del ciclo ‘Ademés de las sentencias tipicas de control de flujo, en esta unidad haremos una revision de las sentencias de salto incondicional, que aunque son altamente desaconsejables en la mayoria de casos, y generalmente resulta innecesario recurrir a ellas, no esta de mas conocerlas por si te las encuentras en programas que no han sido escritos por ti Posteriormente, analizaremos la mejor manera de llevar a cabo la depuracién de los programas para localizar errores en nuestro cédigo. Vamos entonces a ponernos el mono de trabajo y a coger nuestra caja de herramientas, ja ver sino nos mojamos mucho! 2.- Estructura secuencial: sentencias y bloques. Caso practico Ada valora muy positivamente en un programador el orden y la pulcritud. Organizar correctamente el cédigo fuente es de vital importancia. cuando se trabaja_ en _entomos colaborativos en los que son varios los desarrolladores que forman los equipos de programacién. Por ello, incide en la necesidad de recordar a Juan y Maria las nociones basicas a la hora de escribir programas. stot. Uso esto n comercial pas pltforas peas de ‘CO.0VB Nom. CBS Este apartado lo utilizaremos para reafirmar cuestiones que son obvias y que de alguna manera u otra las hemos ido viendo explicita o implicitamente a lo largo de ia unidad anterior. Vamos a repasarlas como un conjunto de FAQ 0 "preguntas habitualmente formuladas”: ¥ eCémo se escribe un programa sencillo? Si queremos que un programa sencillo realice instrucciones o sentencias para obtener un determinado resultado, es necesario colocar éstas una detrés de la otra, exactamente en el orden en el que queremos que se ejecuten. “ @Podrian colocarse todas las sentencias una detras de otra, separadas por puntos y comas en una misma linea? En el lenguaje Java (y en muchos otros) puede hacerse, pero no es muy recomendable. Cada sentencia deberia estar escrita en una linea diferente. De esta manera tu cédigo sera mucho més legible y la localizacién de errores en tus programas serd ms sencilla y répida, lo que redundaré en menor tiempo de desarrollo y de mantenimiento, lo que reducira los costes. De hecho, cuando se utilizan herramientas de programacién, los errores suelen asociarse a un nlimero o numeros de linea. ¥ ¢Puede una misma sentencia ocupar varias lineas en el programa? Si. Existen sentencias que, por su tamafio, pueden generar varias lineas. Pero siempre finalizaran con un punto y coma. “ 2En Java todas las sentencias se terminan con punto y coma? Efectivamente. Si detras de una sentencia ha de venir otra, pondremos un punto y coma. Escribiendo la siguiente sentencia en una nueva linea. Pero en algunas ocasiones, sobre todo cuando utilizamos estructuras de control de flujo, detras de la cabecera de una estructura de este tipo no debe colocarse punto y coma. No te preocupes, lo entenderas cuando analicemos cada una de ellas. “Qué es la sentencia nula o sentencia vacia en Java? La sentencia nula es una linea que no contiene ninguna instruccién y en la que sdlo existe un punto y coma. Como su nombre indica, esta sentencia no hace nada. Se puede colocar en cualquier sitio donde la sintaxis del lenguaje exija que vaya una sentencia, pero no queramos que se haga nada. Normalmente su uso puede evitarse, usando una logica adecuada al construir las estructuras de control de fiujo. Pero es importante que la conozcas por si alguna vez te la encuentras en algtin programa no hecho por ti (0 porque realmente llegaras a necesitarla). “ “Qué es un bloque de sentencias? Es un conjunto de sentencias que se encierra entre llaves y que se ejecutaria como si fuera una Unica sentencia. Sirve para agrupar sentencias y para clarificar el cédigo. Los bloques de sentencias son utilizados en Java en la practica totalidad de estructuras de control de flujo, clases, métodos, etc. La siguiente tabla muestra dos formas de construir un bloque de sentencias. ¢Cual de las dos crees que es més clara y que por tanto se recomienda usar? Bloques de sentencias. Bloque de sentencias en una sola linea __ Bloque de sentencias de varias lineas sontencia_l sentencia_2: { sentencia_; sentencia_2;.;sentencia_N; } sontencia N; “En un bloque de sentencias, ¢éstas deben estar colocadas con un orden exacto? En ciertos casos si, aunque si al final de su ejecucién se obtiene el mismo resultado, podrian ocupar diferentes posiciones en nuestro programa “ Es importante documentar los programas? Claro que si. Mas adelante veremos que se pueden documentar de diversas formas, pero una de ellas es escribir el cédigo con claridad (autodocumentacién), usando indentacién adecuada de las sentencias, eligiendo nombres descriptivos para variables, métodos y clases, incluyendo comentarios explicativos, etc. “ @¥ me tengo que preocupar de las faltas de ortografia y de gramatica? Bueno... lo principal es preocuparte de la propia sintaxis del lenguaje para que todo funcione correctamente, eso es cierto. Pero es MUY importante que las cadenas literales que se incluyan en el cédigo sean correctas, porque son la primera, y a veces la tinica impresién que el cliente/usuario obtendra de la aplicacién, y si ve faltas de ortografia 0 frases incoherentes o complicadas de entender, dificilmente lo vas a convencer de que al escribir en un lenguaje de programacién eres una persona cuidadosa y fiable a la hora de escribir cédigo. Ademas, parte de la documentacin se genera con herramientas automaticas a partir de los comentarios, asi que la correccién en los mismos también es fundamental. Debes conocer Accede a los tres archivos que te ofrecemos a continuacién y compara su cédigo fuente. Veras que los tres obtienen el mismo resultado, pero la organizacién de las sentencias que los componen es diferente entre ellos. Sentencias, bloques y diferentes organizacioned. Bloque de sentencias para ejecucién secuencial. int dia=15; System.out printin("El dia es: "dia) Systemout printin("El mes es: int anio-2023; mes); ‘System out printn("E1 anio es: "+anio) En este primer ejemplo, las sentencias estén colocadas en orden secuencial. @ _Sentencias en orden secuencial. 001 us) Bloque de sentencias con declaracién de variables. 1 Zona de daclaracién de variables int dia=10; int mes=11; int anio2011; ‘Sentencias que usa esas variables ‘System.outprintin("E] dia es: "=dia) ‘System.out printin("E] mes es: “+mes); ‘Systemout print ato es: “ranio), En este segundo archivo, se declaran al principio las variables necesarias. En Java no es imprescindible hacerlo asi, pero si que antes de utilizar cualquier veriable ésta debe estar previamente declarada. Aunque la declaracién de dicha variable puede hacerse en cualquier lugar de nuestro programa = Sentencias y déclaraciones de variables. oo: Bloque de sen cédigo organizad de variables, en procesamie (Zona de declaracion de int dia; int mes; String fecha: Zona de inicializacion~ dis-10; mes“; anion2011; Zona de procesamiento fechamdia Zona de sald de result Systemout print ("La f En este tercer archi apreciar que se ha cédigo en las siguie declaracién de vari: datos de entrada, p dichos datos y obte Este tipo de organi: estandarizada y ha: programas ganen ¢ claridad. & Sentencias, Organizacién de Construyas de una forma o de otra tus programas, en Java debes tener en cuenta siempre las siguientes premisas: “ Declara cada variable antes de utilizarla » Inicializa con un valor cada variable la primera vez que la utilices. » No es recomendable usar variables no inicializadas en nuestros programas, pueden provocar errores 0 resultados imprevistos. Podraés observar que la tercera forma de organizar las sentencias de un programa es la que hemos estado recomendando a lo largo de la unidad anterior en cuanto aprendimos a escribir algo de cédigo. Se trata de la "plantilla estandar de programa principal’ que \levamos ya usando para este médulo desde hace algunas semanas. Esa es la que vamos a utilizar durante todo el curso siempre que nos sea posible. Autoevaluacion Indica qué afirmacion es la mas correcta: © Para crear un bloque de sentencias, es necesario delimitar éstas entre llaves. Este bloque funcionaraé como si hubiéramos colocado una Unica orden. © La sentencia nula en Java, se puede representar con un punto y coma sélo en una Unica linea. © Para finalizar en Java cualquier sentenci punto y coma. © Todas las afirmaciones son correctas. , @S necesario hacerlo con un 2.1.- Ambito o alcance de una variable. Hasta el momento habras podido observar que las variables siempre se definen dentro de un bloque (entre llaves { ...}). Por ahora no hemos tenido mucho problema porque la estructura de todos nuestros programas hasta el momento tenia un unico bloque dentro de un mecanismo llamado main: public class ProgramaEjemplo { ‘era Atmamn Pasta License) public static void main(Stinl] ara) { ‘Aqui dentro, entre Ine llaver, estamos eecribiendo al oédigo de nuestros programas. Mas adelante, cuando aprendamos a implementar métodos dentro de una clase, volveremos a ver este tema con més profundidad al estudiar las variables locales, pero dado que a partir de ahora vamos a empezar a utilizar mas de un bloque dentro de nuestros programas, es importante que introduzcamos el concepto de ambito, contexto o alcance de una variable (también conocido como scope). El Ambito de una variable es la zona de cédigo en la que esa variable "existe", es decir, donde puede ser utilizada tanto para obtener su valor como para cambiarlo (suponiendo que no haya sido definida como constante final). Ese ambito esta definido por el bloque encerrado entre llaves donde ha sido declarada la variable. En el momento en que esa llave se cierre, la variable serd eliminada y cualquier sentencia que intente hacer referencia a ella sera considerada como un error, pues esa variable ya no existe, de manera que no podréis compilar ni ejecutar ese programa. Dado que en cuanto comencemos a trabajar con las estructuras de control no secuenciales (las condicionales y las repetitivas) vamos a tener un montén de bloques, algunos de ellos unos dentro de otros y en otros casos en bloques independientes, vamos a ver un ejemplo de bloques donde se vayan creando y destruyendo variables para que observéis como funciona. Tened en cuenta que cualquier variable declarada dentro de un bloque (inicio de la llave "{") dejard de existir en cuanto se cierre el bloque (fin de la llave "}") donde fue declarada. public class ProgramsEjemploBloques { public static void main(String] args) { Blogue principal (0) int uma sum ~ 10; ‘System.out printin("En blogue principal (0)"\; ‘System.out printin('mam1=" + num); Systemout printings Bloque 0.1 System.out printn(Ea blogue 0, int oum2: num; save? = 205, ‘System out printn("numl=" + num); System. out printin('num2~ * ~ num2); System outprintln() ‘System.out printin("En blogue prinipal( ‘ystem.out printin('mam1=" + numl); mum) / Error ‘System out printla("aum2- Systemout printing; Bloque 0.2 System. out printn("Ea blogue 0.2"); int nom anual +4 ‘num? = 205, "= aml): System out printin "asm Systemout printn'num2=" + num2); System.outprintla(); Bloque 0.2.1 ‘System. out print "En blogue 2 a int sm’ uml++; umd; System.ont printin'auml=" + sum) System.out pian "+ aum2) System.out print "aum3~" + aum3); System ont printing; } System. out printn("Ea blogue 0.2"); ‘System out printin(*numl= " + num) ‘System out printin'num2~ * + aum2); ‘System.out printn("aum3~" + num3);/ Error System out printn( System.out printin("En logue principal ( System.ont printn'mm1~" + sum) ‘System out println(aum2~ " + num2)J/ Estor ‘System out printn("aum3~" + num3)// Error System.ont printing; Ejercicio Resuelto Fijandote en el cédigo anterior, dado que se trata de un programa donde todo el flujo es secuencial (cada sentencia se ejecuta una detras de otra) te deberia resultar sencillo intuir cual va a ser el resultado de su ejecucion, ,verdad? Intenta escribir en un papel, sin ejecutar el programa, cudl crees que seria el resultado de la ejecucién del programa anterior. Ahora bien, Zpor qué crees que las sentencias de las lineas 23, 48, 53 y 54 han sido marcadas como errores? Qué explicacién darias para el caso de la linea 237 ‘Systemoutprintn(’num LY para el caso de la linea 48? Systemoutprintin'num3- £Y respecto a la linea 53? Systemout print 'nam2=" ~ nun oe 1 3.- Estructuras de seleccién o condicionales. Caso practico Juan esta desarrollando un método en el que ha de comparar los valores de las entradas de un usuario y una contrasefia introducidas desde el teclado, con los valores almacenados en una base de datos. Para poder hacer dicha comparacién necesitara utilizar una estructura condicional que le permita llevar a cabo esta operacién, incluso necesitara que dicha estructura condicional sea capaz de decidir qué hacer en funcién de si ambos valores son correctos 0 no. a Stott pate pitas pubes de Fofmactn Bolesoal a deta, ED.VB Num. CO‘0E Al principio de la unidad nos haciamos esta pregunta: Como un programa puede determinar la aparicién en pantalla de un mensaje de EXITO © ERROR, segin los datos de entrada aportados por un usuario? Esta y otras preguntas se nos plantean en multiples ocasiones cuando desarrollamos programas. ECémo conseguimos que nuestros programas puedan tomar decisiones? Para comenzar, lo haremos a través de las estructuras de seleccién. Estas estructuras constan de una condicién que se evaliia para ver si toma el valor verdadero 0 falso, y de un conjunto de secuencias de instrucciones, que se ejecutaran o no dependiendo de si la condicién se evalud como verdadera 0 como falsa. Puede haber dos bloques de instrucciones, de forma que si es verdadera la condicién se ejecuta el primer bloque y si es falsa, se ejecuta el otro bloque. Por ejemplo, si el valor de una variable es mayor o igual que 5 (condicion verdadera) se imprime por pantalla la palabra APROBADO (primer grupo de sentencias, en este caso una sola) y si es menor que 5 (condicién falsa) se imprime SUSPENSO (segundo grupo de sentencias, también con una sola en este caso). Para este ejemplo, la comprobacién del valor de la variable ser lo que nos permite decidir qué camino tomar y cual es la siguiente instruccién a ejecutar. La impresién de la palabra APROBADO sera una secuencia de instrucciones y la impresién de la palabra SUSPENSO seré otra. Cada secuencia estara asociada a cada uno de los resultados que puede arrojar la evaluacién de la condicién. Curiosidad En el lenguaje de programacién C, verdadero 0 falso se representan mediante un literal entero. 0 representaré Falso y 1 0 cualquier otro valor, representara Verdadero. Como sabes, en Java las variables de tipo { booleano sdlo podran tomar los valores true (verdadero) 0 false (falso). Las estructuras de seleccion se dividen en: “ Estructura de seleccién simple o estructura if. Estructura de seleccion compuesta o estructura if-else “ Estructura de seleccién basada en el operador condicional, representado en Java por ? “ Estructura de seleccién multiple o estructura switch. A continuacién, detallaremos las caracteristicas y funcionamiento de cada una de ellas. Es importante que a través de los ejemplos que vamos a ver, puedas determinar en qué circunstancias utilizar cada una de estas estructuras. Aunque un mismo problema puede ser resuelto con diferentes estructuras, e incluso, con diferentes combinaciones de éstas. [EEE voces. 3.1.- Estructura condicional simple: if. La estructura de control if es una estructura de seleccién © estructura selectiva o estructura condicional. Os la podéis encontrar con todos estos nombres. Permite condicionar la ejecucién entre dos sentencias (0 dos bloques de sentencias) dependiendo de la evaluacién de una expresién Iégica (condicién). Al comprobar una een rey condicién podamos tomar dos caminos alternativos (bloques de sentencias) dependiendo de si esa condicién se evalué como verdadera (true) 0 como falsa (false). La representacidn en diagrama de flujo seria la de la imagen de la derecha, que es bastante explicativa: “ Si la expresién que se evalua es verdadera, se ejecuta la secuencia de instrucciones 1. “ Sies falsa, se ejecuta la secuencia de instrucciones 2. Esta rama, a veces, puede no contener ninguna sentencia a ejecutar. Este caso es el que conocemos como estructura condicional simple. Es el que vamos a estudiar en este apartado. En ambos casos, una vez finalizada la ejecucién del bloque de sentencias 1 0 2, el flujo continua con la siguiente sentencia que haya tras esta estructura condicional. En lenguaje natural (0 fe pseudocédigo), eso se expresaria como: Estructura if en lenguaje natural Estructura condicional simple.(Si-entonces) Si expresion Entonces seouencia_l Finsi Funcionamiento: La secuencia de instrucciones secuencia_1 se ejecuta si y solo si en el caso de que la expresion se evaltie como verdadera. No se hace nada en caso contrario, simplemente "se omite" la ejecucién de secuencia_1 Fijate que la palabra Entonces se indica para delimitar con claridad dénde termina la expresién que se va a evaluar y dénde empieza la secuencia de instrucciones del primer bloque. La estructura if puede presentarse en Java de las siguientes formas: Estructura if en Java if expresion_logica) { sentencia_Ls if (expresion_logica) sentencia 25 sentencia_Is Funcionamiento: Sila evaluacién de la expresion_logica ofrece un resultado verdadero, se ejecuta la sentencia_1 o bien el bloque de sentencias asociado, Si el resultado de dicha evaluacién es falso, no se ejecutaré ninguna instruccién asociada a la estructura condicional. La mejor de manera de entender el funcionamiento de esta estructura es mediante un ejemplo sencillo. Imagina que dependiendo del contenido de una variable entera llamada valor se muestre por pantalla el texto "El valor es negativo" o bien no se muestre nada. Bastaria con escribir algo asi: int valor ~ -10; ‘Systemout print ("El programa estéejecutindose.");/ Esta linea se ejecutaen cualquier caso if (valor <0) ‘system out printn("El valores negativo.”); / Esta linea solo se ejecuta si valor < 0 System.out print ("El programa sigue ejecutindose.";/ Esta linen se eecuta en cualquier caso En este caso se mostraria por pantalla lo siguiente: El programa esti ejecutindose. El valores aegativ. El programa sigue sjecutdndose, Dado que el contenido de la variable valor es negativo, se ejecuta la linea 4. Si no, se habria saltado directamente a la 5. Vedmoslo con otro ejemplo. Si la variable valor contuviera un nimero que no fuera negativo, como es en el siguiente caso: int valor ~ 0 System.out print ("EI programa estéejecutindose."); Esa linea se ejecutaen cualquier caso if valor <0) System out rintn("El valores negative." ! Esta linea solo se ejecuta si valor 0 ‘System.out.priat ("El progeama sigue ejecutiadose."):/ Esta linea se ejecuta en cualquier aso El resultado de la ejecucién de este fragmento de cédigo no mostraria por pantalla el texto "El valor es negativo", aunque si se ejecutarian las sentencias que hay justo antes (linea 2) y justo después (linea 5), pues no forman parte de la estructura condicional: Fl programa est ejecutindose El programa sigue gjecutandose, Como habras podido observer, al tener una dnica sentencia dentro del "bloque" de la estructura if, no es necesario encerrar ese bloque entre llaves. Si queremos incluir mas de una sentencia, si que tendremos que encerrar todo ese bloque de sentencias entre llaves. Si en el caso anterior, ademas de mostrar un texto por pantalla, queremos hacer algo més, tendremos que encerrar todas esas sentencias entre llaves para que el compilador de Java sepa que son todas esas sentencias las que se tienen que ejecutar cuando la condicién de la estructura if sea evaluada como true. Si no se encierra el bloque entre llaves, se entendera que tan solo debe ejecutarse la primera sentencia y que el resto de sentencias si se ejecutarén en cualquier caso (tanto si el resultado de la evaluacién de la expresidn Idgica es true como si es false). Por ejemplo, si ademas de mostrar el mensaje por pantalla, queremos poner la variable valor a 0 y mostrar otro mensaje mas por pantalla, tendremos que encerrar todas esas sentencias entre llaves formando un bloque. Lo hariamos de la siguiente manera: int valor ~-10; ‘System.out print ("El programa esti ejecutindose.");/ Esta linea se ejecuta en cualquier caso if valor <0) | System out printn (EI valores negativo.");/ Esta linea solo se ejecuta si valor <0 ‘valor 0; // Esta linea solo se ejecuta si valor <0 ‘System out printn ("EI valor ha sido reseteado a cero"); / Esta linea solo se ejecuta si valor <0 ‘Systemout print ("El programa sigue ejecutindose.");/ Esta linea se ejecuta en cualquier caso En este caso el resultado obtenido en pantalla seria: El programa est ejecutindose. El valores negativ. El valor ha sido reseteado a cer. El program sigue ejecurdudose, Si el valor no hubiera sido negativo y hubiéramos tenido por ejemplo: int valor ~0; System.out print ("El programa esti ejecutindose."); Esta linea se ejacuta en cualquier caso if (valor <0) { El resultado habria sido: El programa est ejecutandose El programa sigue ecutindose, Sin embargo, si no hubiéramos encerrado entre Ilaves el bloque de las sentencias que deben ejecutarse cuando el resultado de evaluar valor < 0 sea true, el cédigo tendria el siguiente aspecto: int valor ~0; System.out print ("EI programa esti ejecutindose.");/ Esta linea se ejecuta en cualquier e350 if (valor <0) System.out rina ("EI valor es negativo."); Est linea solo se ejecuta si valor <0 ‘valor 0; // Esta linea se ejecuta en cualquier easo ‘System out printn ("EI valor ha sido reseteado a een ); Esta linea se ejecuta en cualquier easo ‘System .out print ("El programa sigue ejecutindose.);/ Esta linea se ejecuta en cualquier caso Y el resultado de la ejecucién habria sido: Fl programa est ejecutindose El valor ha sido reseteado a cer. El programa sigue gjecutandose, Donde podemos ver cémo las lineas 5 y 6 se han ejecutado independientemente de que el resultado de evaluar la expresién ldgica valor < 0 haya sido true 0 tase. Y €80 probablemente no es lo que nosotros desedbamos que sucediera. Debes tener cuidado con esto, pues se trata de un error bastante habitual cuando se empieza a programar. Por mucha indentacién que afiadamos, si no encerramos el bloque entre llaves, Java consideraré que el bloque es de una Unica sentencia y que el resto de sentencias estan fuera de la estructura condicional. Es decir, que es como si hubiéramos escrito: int valor = 0; System.out-printin"El programe esti ejecuténdose."); / Esta linea se ejecuta en cualquier caso if valor <0) ‘System out printn("El valores negative." / Esta linea solo se ejecuta si valor < 0 valor = 0; //Esta linea se ejecuts en cualquier caso ‘ystem.out printin"El valor ha sido reseteado a cero."); / Esta linea se ejecuta en cualquier caso System.out printin"El programe sigue ejecusindose");// Esta linea se ejecuta en cualquier caso Reflexiona dentro de una estructura de control no las Haves? 4O ambas? {Que sentido Para indicar un bloque de ejecuci condicional, zutilizamos la indenta tiene cada una? Ejercicio Resuelto Es probable que recuerdes que en la unidad pasada se os proporcioné una herramienta llamada Scanner que nos servia para recibir entradas desde el teciado, de tal manera que podiamos hacer cosas como Scanner teclado ~ new Scanner(System, ); No olvides inclie al principio una sentencia import java.util Scanner int mec; ‘System out print("Introduzca un nimero entero: "); ‘mumero ~ teclado.nestlat() Teniendo en cuenta todo esto, ~cdmo podriamos implementar un programa leyera desde teclado un numero entero y nos indicara si se trata de un numero par? Mostrar retroalim Reflexiona Recuerda que la linea de cédigo: Scanner teclado ~ new Scannee(System in): ‘ain no somos capaces de interpretarla completamente pero sabemos que es necesaria para poder leer datos desde el teclado posteriormente usando esta otra linea smnmero ~teclado.nextTnt0; Asi lo llevamos haciendo desde la unidad anterior aunque todavia no sepamos qué se esté haciendo en realidad. En la siguiente unidad aprenderemos mejor cémo trabajar con la entrada desde teclado. Mientras tanto sabemos que podemos hacerlo asi: 1.declarando e instanciando un objeto de tipo Scanner (un tipo referenciado que estudiaremos més adelante): la variable que hemos Hamado teclado (scanner teclado = new Scanner(System.in)); 2. usando ese objeto para leer una entrada desde teclado usando alguna de las sentencias teclado.nextint(), tetado.nextDoubi, teclado.nextShort(), etc. seglin queramos leer un int, double, short, moat, etc. En este caso se ha efectuado la lectura de un entero y lo leldo se ha almacenado en una variable de tipo entero: numero= teclado.nextint(). En la préxima unidad ya entenderemos qué significa instanciar un objeto o llamar ‘a u método. Por ahora nos conformaremos con utilizar este mecanismo sin preocupamos especialmente de su funcionamiento interno. 3.2.- Estructura condicional compuesta: if-else. Una vez que hemos visto en detalle la estructura condicional simple, vamos a estudiar ahora la estructura condicional compuesta, también conocida como if-ese. En este caso si tendremos que implementar los dos posibles caminos alternativos (bloques de __ sentencias), dependiendo de que la condicién se evallie como mea verdadera (true) 0 como falsa (false), tal y como se indica en la representacién en diagrama de flujo de la imagen de la derecha: Q “ Si la expresién que se evalua es verdadera, se ejecuta la secuencia de instrucciones 1. “ Sies falsa, se ejecuta la secuencia de instrucciones 2. En este caso, esta rama si existe. Si no la hubiera, estariamos en el caso anterior de una estructura condicional “simple”. En lenguaje natural (0 te pseudocédigo), esto se expresaria como: Estructura if-else en lenguaje natural Estructura condicional de doble alternativa. (Si-entonces-Si no). Si expresion Entonces secuencia_L Sino Fini Funcionamiento: Si expresion es evaluada como verdadera, se ejecuta secuencia_1 y en caso contrario, no se ejecuta secuencia_t y se ejecuta secuencia_2. Fijate que la palabra Entonces se pone para delimitar con claridad dénde termina la expresién que se va a evaluar y dénde empieza la secuencia de instrucciones del primer bloque. En la parte Sino no es necesario, ya que esa misma palabra delimita el final del primer bloque de instrucciones y el comienzo del segundo. Y se pondria un Fin Si que delimita dénde acaba la sentencia condicional, bien sea delimitando el final del Unico bloque de sentencias en el condicional simple o bien delimitando el segundo. Una vez que tenemos clara la estructura, vamos a ver como se particulariza en el lenguaje Java, pues cada lenguaje de programacién tendra sus particularidades especificas. La estructura condicional if puede presentarse en Java de las siguientes formas: Estructura if-else en Java Estructura if de doble alternativa ( 0 if-else). Sintaxis para el caso de ejecucion Sintaxis para el caso de ejecucion condicional de dos ramas y una sola _condicional de dos ramas y un bloque de sentencia en cada rama sentencias en cada rama if (expresion_logica) { sentencia 13 Af (expresion_logica) eee ‘sentencia 1 25 aise ieee eet sontencia_25 sentencia Ns Funcionamiento: Sila evaluacién de la expresion_logica ofrece un resultado verdadero, se ejecutard la primera sentencia o el primer bloque de sentencias. Si, por el contrario, la evaluacién de la expresion_logica ofrece un resultado falso, no se ejecutara la primera sentencia 0 el primer bloque y si se ejecutard la segunda sentencia o el segundo bloque Antes de seguir avanzando, veamos un ejemplo de uso: 2cémo podriamos utilizar la estructura condicional if-else para completar el ejercicio del apartado anterior de manera que se muestre por pantalla un texto donde se indique si un numero entero leido desde teclado es par o impar? (en el ejercicio anterior solo si indicaba si el numero era par, pues no teniamos else). Una forma muy sencilla para llevar a cabo la comprobacion podria ser la siguiente: if (oumero % 2== 0) {/ Siel resto de Ia division entera entre 2es cero, el mimero es pat System out printn( "El nimero es pac"); J else {// Sino, el niimero es impar ‘System out printin("El nimero es impas.") Como puedes observar, se trata de afiadir el componente else a la estructura de control condicional (lineas 3-5). Con esto podemos indicar qué queremos que se haga cuando: 4, el resultado de evaluar la condicién sea true: system.out.printin("EI numero es par"); 2. el resultado de evaluar la condicion sea false: system.out printin("EI numero es impar.” Algunas consideraciones mas a tener en cuenta sobre las sentencias condicionales en Java: » La clausula else de la sentencia if no es obligatoria. En algunos casos no necesitaremos utilizarla, pero si se recomienda cuando es necesario llevar a cabo alguna accién en el caso de que la expresin ldgica no se cumpla. ’ En aquellos casos en los que no existe cléusula else, si la expresién légica es falsa, simplemente se continuaran ejecutando las siguientes sentencias que aparezcan bajo la estructura condicional if. Es lo que hemos llamado en el apartado aterior estructura condicional simple. ’ Los condicionales if e ircse pueden anidarse, de tal forma que dentro de un bloque de sentencias puede incluirse otro if 0 itelse. El nivel de anidamiento queda a criterio del programador, pero si éste es demasiado profundo podria provocar problemas de eficiencia y legibilidad en el codigo. En otras ocasiones, un nivel de anidamiento excesivo puede hacernos pensar en la necesidad de utilizacién de otras estructuras de seleccién més adecuadas. ¥ Cuando se utiliza anidamiento de este tipo de estructuras, es necesario poner especial atencion en saber a qué if esta asociada una clausula else. Normalmente, un else estara asociado con el if inmediatamente superior o mas cercano que exista dentro del mismo bloque y que no se encuentre ya asociado a otro else. Autoevaluacion £Qué mostrar por pantalla el siguiente fragmento de cédigo? int x=100;, if(x< 100) System.ontpprintin("yEnhorabuens!"); Sugerencia © Mostraré el texto "Enhorabuenal”. © Nose mostraré nada por pantalla. © Mostrara el texto *iLo siento!” 2Qué mostrar por pantalla el siguiente fragmento de codigo? int x-100; if(x>~ 100) System.out printin ("Enhorabuena!"); alse ‘System.out print ("Lo siento!"); © Mostrard el texto "jEnhorabuenal”. © No se mostraré nada por pantalla. © Mostrara el texto *iLo siento!” £Qué mostrar por pantalla el siguiente fragmento de cédigo? int x-100;, it(x< 100) System out print ("Enhorabuens!"); alse ‘System.out print ("Lo siento!"); © Mostrara el texto "/Enhorabuena!". © No se mostrara nada por pantalla. © Mostrara el texto "iLo siento!” entero e indique por pantalla si se trata de un numero positivo o no. Para ello se mostrara uno de estos dos posibles mensajes: ~ "El ntimero es positivo", si en efecto el numero es positivo (mayor que cero). ~ “El ndmero no es positive", si el numero no es positivo (cero 0 negativo, es decir, menor 0 igual que cero). Implementarlo utilizando una estructura condicional de tipo if-else. fon Implementa ahora el programa utilizando la condicién contraria que hayas usado antes. Lo mas habitual es que hayas usado la condicién numero > 0. Por tanto la condicién contraria seria numero <= 0 0 bien !(numero > 0). (ree ESe te ocurre cémo podrias haber resuelto este mismo problema sin usar la estructura if-else? Como pista te decimos que podrias utilizar el operador condicional ? que ya vimos en la unidad anterior. strar retroalimentacion Por iiltimo, gse te ocurre alguna manera de escribir el programa utilizando una estructura if simple sin else? (eres Ejercicio Resuelto Nos han pedido que escribamos un programa en Java que a partir de una calificacién (numero real) entre 0 v 10 (ambos inclusive) muestre por pantalla el mensaje "APROBADO" si la nota es igual o superior a 5 0 bien "SUSPENSO" si es inferior a 5. Implementa ese programa utilizando una estructura de tipo condicional. Intenta que el texto de resultado sea almacenado en una variable de salida (llamada por ejemplo calificacionCualitativa) y procura separar el programa en los tres bloques que recomendabamos en la unidad anterior: entrada de datos, procesamiento y salida de resultados. Coloca un comentario delante de cada bloque y separa cada bloque con al menos una linea en blanco. Coloca también un primer bloque adicional donde declares todas las variables que vayas a utilizar incluyendo a su derecha un pequefio comentario sobre cada variable. Observaras que el cédigo queda mucho mas claro y legible. eee Dado que en nuestra escuela cualquier valor por debajo de 0.0 0 por encima de 10.0 no tiene sentido como una calificacién numérica, amplia el programa anterior para que si se introduce un valor fuera del rango valido, no se lleve a cabo la comprobacién y se muestre un mensaje de salida del tipo "Calificacion introducida no valida” Recomendacion Buena practica de programacién © Utiliza Ja sangria o indentacién en ambos cuerpos de una estructura if- else. » Si hay varios niveles de sangria, en cada nivel debe aplicarse la misma cantidad de espacios en blanco. ~ Colocar siempre las Ilaves en una instruccién if-else (y en general en cualquier estructura de control) ayuda a evitar que se omitan de manera accidental especialmente cuando posteriormente se agregan instrucciones a una cldusula if 0 ese. Para evitar que esto suceda, algunos programadores prefieren escribir la llave inicial y final de los bloques antes de escribir las instrucciones individuales dentro de ellas. Errores de programacién » Olvidar una o las dos Haves que delimitan un bloque puede provocar errores de sintaxis 0 errores ldgicos en un programa. ~ Colocar un punto y coma después de la condicién en una instrucci6n if-else produce un error ldgico en las instrucciones if de seleccién simple, y un error de sintaxis en las instrucciones if-else de seleccién doble (cuando la parte del if contiene una instruccién en el cuerpo). Autoevaluacion {Cuando se mostrara por pantal fragmento de cédigo? el mensaje incluido en el siguiente if (numero % 2== 0); ‘System.out prin"El nimero es pac”); Sugerencia O Nunca. © Siempre. © Cuando el resto de la divisién entre 2 del contenido de la variable numero sea cero. 3.3.- Estructuras condicionales anidadas. Como ya hemos visto en algun ejemplo en el apartado anterior, las estructuras de control condicionales (y en general cualquier estructura de control) pueden anidarse de manera que el bloque de sentencias dentro de la parte if o de la parte else puede a su vez contener una nueva estructura if-else. Veamos algunos ejemplos en los que pueda darse esa circunstancia. 4. Queremos mostrar por pantalla si un ntimero entero x es par ee y ademas superior a 100. Para ello podriamos primero comprobar si es par y, @ continuacién, pero dentro del bloque de sentencias del if, comprobar si es superior a 100: if(x%2=0) | if(-x> 100) ¢ ‘System.out.priatn ("El ntimeco es par y superior 8 100." El if mas interno sdlo contiene una sentencia dentro en su bloque, asi podrian omitirse las llaves si asi lo decidimos: if(x%2—-0){ if(x> 100) ‘System.out print ("EI niimero es par y superior 8 100°) El if mas externo también contiene una inica sentencia en su bloque (la segunda sentencia it), de manera que también podriamos omitir sus llaves: if(x%2—-0) if(x> 100) ‘System.out.priat ("EI ntimeco es par y superior 8 100." Ahora bien, en este caso la anidacion no es necesaria, pues disponemos del operador légico AND («« 0 & en lenguaje Java) que nos permite unir ambas condiciones en una Unica codicién mas compleja: it(x% 0&&x> 100) ‘System.out printn ("EI dmero es par y superior a 100."), Con esto vemos que no siempre es necesario el anidamiento y que el uso de operadores légicos puede ayudarnos a simplicar la estructura de los programas. 2. Imaginemos que se nos pide ahora comprobar si el numero x es negativo, cero o positivo indicando para cada caso un mensaje de texto apropiado. Para resolver este problema podriamos hacer una primera comprobacién para ver si el nlimero es negativo y, en caso contrario, como nos quedan dos posibles opciones (cero 0 positive), hacer una nueva comprobacién para ver si es positive. Si no fuera positive sabremos que se trata de la unica alternativa que nos queda: cero. Estas comprobaciones podriamos implementarlas con un if- else que tendria un else cuyo bloque de sentencias contendria un nuevo if-else: f(x <0) { / Elmimero es negativo System. out printn("El nfimero es negative." Jelse {/ El mimero es cero 0 positive if(x>0) | //Elaimero es positive ‘Systemout printin"El nimero es positivo.") | elee {Sis ha llagado hasta aqui el mero es obligatoriamente cero System.out printin “El niimero es ceo.”); Nuevamente aqui podemos evitar todas las llaves, pues cada bloque de sentencias contiene una tinica sentencia (aunque alguna de ellas contenga a su vez nuevos bloques): iftx<0) ‘System out printn("El nlmero es negative"); clse if(x>0) ‘System.out printin("El namero es positivo.") ohe ‘ystem.out printin "El niimero es ceo.") Ante esto podemos hacemos la pregunta: gnos conviene quitarlas todas o puede venimos bien dejar algunas para mejorar la legibilidad del cédigo? Esa percepcién nos la ir proporcionando la experiencia seguin vayamos implementando cada vez programas mas complejos. Nos plantean la posibilidad de escribir un programa que a partir de una nota cuantitativa calcule su calificacién cualtiativa equivalente teniendo en cuenta que: © Sila nota es menor de 5, la calificacién seré "INSUFICIENTE” © Si la nota es mayor o igual a 5 y menor que 6, la calificacién sera "SUFICIENTE" © Sila nota es mayor o igual a 6 y menor que 7, la calificacién sera "BIEN". © Sila nota es mayor o igual a 7 y menor que 9, entonces la calificacion sera "NOTABLE", © Sila nota es mayor o igual a 9 y menor o igual a 10, entonces la calificacién serd de "SOBRESALIENTE". Escribe un programa en Java que a partir de una nota cuantitativa calcule su calificacién cualtiativa equivalente utilizando una serie de estructuras if sin anidar. meee Una vez que hemos resuelto el problema de esta primera forma y podemos constatar su escasa eficiencia, se nos plantea la posibilidad de utilizar if anidados de manera que sdlo si la condicién no se cumple (parte else de la estructura) entonces intentamos la siguiente. De esta manera, en cuanto se logre entrar en alguna de las condiciones, las demés ya no se realizaran, pues estan dentro de un else. Siguiendo esta nueva manera de plantear el problema escribe el nuevo cédigo. Java para ese programa. En estos casos con tanta indentacién en estructuras donde se van encadenando los else, las "normas de estilo" de Java permiten y recomiendan que cuando haya un if (y nada mas) dentro de un else puedan colocarse ambas palabras juntas (else if) y no incrementar otro nivel de indentacién. De esta manera se consigue mejorar sensiblemente la legibilidad. De esta manera el cédigo quedaria con el siguiente aspecto: if(condicion_1 ) { bloque de sentencias 1 } else i (con blogue de sentencias 2 m2) } elseif condicion 3 ) { blogue de sentencias 3 } else if (con blogue de sentencias a Jelse | bloque de centenciae att Lo que le proporciona un aspecto mucho mas compacto y legible. Escribe como quedaria nuestro programa utilizando este estilo mas compacto. Ejercicio Propuesto Se nos plantea la posibilidad de hacer un programa que calcule la calificacién de un examen a partir de las preguntas acertadas, falladas y no contestadas. Implementa un programa en Java que calcule la nota de un examen de tipo test de 20 preguntas. El programa debe solicitar por teclado dos ntimeros enteros: ntimero de preguntas acertadas y numero de preguntas falladas y a partir de ahi calcular la nota final teniendo en cuenta que cada fallo restara la mitad de un acierto, y que obviamente las preguntas sin contestar ni restaran ni sumaran. La nota final debera estar entre 0 y 10. Si la suma del numero de preguntas acertadas y el numero de preguntas falladas supera el total de preguntas (20), entonces no se llevara a cabo ningun célculo y se mostrara por pantalla el mensaje "Datos erréneos". Si los datos son correctos deberan entonces calcularse {a calificacién no numérica del examen y mostrarse por pantalla ambas calificaciones: la cuantitativa (numérica) y la cualtiativa (no numérica). Soe 3.4.- Estructura selectiva multiple: switch (I). ~Qué podemos hacer cuando nuestro programa debe elegir entre mas de dos alternativas? aoe as = Una posible solucién podria ser emplear estructuras if anidadas, aunque no siempre esta solucién es la més eficiente, porque en caso de que las sucesivas condiciones que se van evaluando sean falsas, puede ser necesario comprober todas antes de saber con seguridad en qué caso nos encontramos. No seria deseable que con una sola comprobacién pudiéramos ir directamente al caso apropiado y ejecutar las instrucciones que lleve asociadas? Desde luego que si, esto seria mas eficiente, y en algunos casos es posible. Cuando estamos ante estas situaciones podemos utilizar la estructura de seleccién milltiple, que en Java es la sentencia switch. Autoevaluacion Indica para cada afirmacion si es verdadera o falsa. La estructura tipo switch resulta imprescindible en cualquier lenguaje, ya que de lo contrario no se podrian tomar decisiones que implican la posibilidad de seguir por mds de dos caminos. © Verdadero ( Falso La estructura tipo switch es més eficiente para resolver un problema con multiples posibilidades, que el uso de estructuras iflelse anidadas para resolver ese mismo problema ) Verdadero © Falso Cémo se implementa esta estructura en Java? En Java se la conoce como estructura switch. En la siquiente tabla se muestra tanto la sintaxis, como el funcionamiento de esta estructura en el lenguaje Java. Estructura selectiva multiple en Jay switch expresion){ cease valorl: sentencial_1; sentencial_2: break; case valor2: sentencia?_1; sentencia? 2: break; case valonN: sentenciaN 1 sontonciaN 2; breaks default sentencias_ default Funcionamiento: 44K Donde expresién debe ser del tipo char, byte, short o int, y la tipo compatible. Sdlo desde la version 7 del lenguaje Java se ¢ esto no funcionaré con versiones anteriores del lenguaje. La expresién debe ir entre paréntesis. Cada case llevaré asociado un valor y se finalizara con dos pu El bloque de sentencias asociado a la cldusula default puede diferencia de funcionamiento. Se permite por mantener la estrt necesita si el default va al final, tal y como se ve en el cédigo, “ Las diferentes alternativas de esta estructura estaran precedidas de la clausula case que el valor obtenido al evaluar la expresién del switch. ¥ Tradicionalmente, en las cléusulas case de Java no podian indicarse expresiones con otros lenguajes de programacién silo permiten). Habra que asociar una cldusula case a Esto ha cambiado desde el JDK 12, que si permite especificar listas de valores a través « “Se pueden especificar varios case uno detras de otro, de manera que para todos esos vi ¥ La cldusula default ser utilizada para indicar un caso por omisién o por defecto (cualqui realidad). Las sentencias asociadas a la cldusula default se ejecutaran si ninguno de los resultado de la evaluacién de la expresion de la estructura switch ¥ La clausula default puede no existir, y por tanto, si ninglin case ha sido activado finalizat Cada cldusula case puede llevar asociadas una o varias sentencias, sin necesidad de de ¥ Enel momento en el que el resultado de la evaluacién de la expresi6n coincide con algut ejecutaran todas las instrucciones asociadas hasta la aparicion de una sentencia break posteriores). Esto hace que si en una cldusula case no se incluye un break para finalizar cascada", de forma que seguiré ejecutando las sentencias de la siguiente cléusula case en alguna encuentre una sentencia break, o hasta que alcance el final de la sentencia. E sentencia switch y hacer algo parecido a los rangos que si permiten otros lenguajes, au! « En resumen, se ha de comparar el valor de una expresién con un conjunto de valores constantes, si el valor de la expresién coincide con alguno de los valores constantes contemplados, se ejecutaran los bloques de instrucciones asociados al mismo. Si no existiese coincidencia, se podran ejecutar una serie de instrucciones por omisién, si se ha incluido la cléusula default, o se saltard a la sentencia siguiente a esta estructura selectiva (tras la llave de cierre) si no se ha incluido esa cldusula. Quizas esta estructura es la que mas diferencias y particularidades presenta para distintos lenguajes de programacién, de manera que si mas adelante trabajas con otros lenguajes puede que te encuentres algo bastante distinto a la sintaxis de Java. Lo importante es que el planteamiento sigue siendo el mismo: se evaltia una expresién, y seguin su valor, se toma el camino que marca una de las etiquetas que identifican cada uno de los casos posibles. \Veamos un ejemplo sencillo. Imagina un programa que en funcién del valor de una variable entera llamada switch nos indiaue vor pantalla el mensaie "cero". "uno". "dos" o bien “otra”. Veamos cémo podria implementarse utilizando la estructura switch y también su equivalente mediante un grupo de estructuras if-else anidadas. Ejemplo de uso de la estructura switch en Java Ejemplo resuelto con switch Ejemplo resuelto con if-else anidados switch (numero) { «case 0: System.out pinta a a if (oumero—-1) break ‘ o system out printIn ("ero"); case |: : a ne te elseif (numero ystem.outprintin ("uno") System.out print ("ano"); brea . oo elseif (oumero—3) System. out pinta ("do ‘System.out.printin ("dos"); L a breaks else System out print ("otra") default : e ‘System.out print ("oto") Ejercicio Resuelto En el ejemplo anterior podriamos mejorar algunas cosas como por ejemplo disponer de una variable de tipo String que contenga el resultado final y de esa manera escribir una tinica linea de tipo System.out.printin una vez finalizada la estructura de control, a modo de salida de resultados. También se podria haber realizado la solicitud de un numero entero por teclado antes de comenzar (entrada de datos) y asi ya tendriamos un programa completamente operativo. Modifica y completa el programa del ejemplo anterior para que solicite un numero entero por teclado y muesire el mensaje apropiado por pantalla utilizando la estructura: 1, entrada de datos: 2. procesamiento; 3. salida de resultados, 3.4.1.- Estructura selectiva multiple: switch (Il). U ‘Spencipar.vetr (Piabay Ucense) En algunas ocasiones es posible que mas de una opcién de un switch dé lugar @ que se tengan que realizar las mismas acciones. En tales casos lo que hay que hacer es acumular varias clausulas case sin contenido una tras otra (0 una debajo de otra) y un Unico cuerpo de sentencias para esas opciones. Algo asi como: swith (expresion) {be > cease valor: case valor sentencia|_1; i! Este blogue de sentencias se ejecutar si expresion da como resultado tanto valor! como valor? sentencial_2s breaks case valor case valor case valor senteacia2_1; Aqui se entraria si resultado fuera valor3, valor 0 valorS senteaci2_2 break: O bien silo prefieres: swith (expresioa) { cease valorl: case valor? seateacial_1 senteacial_2 break ‘case valor3: case valor4: case valor: sentencia2_2; brea \Veamos un ejemplo donde podriamos utilizar esto. Imagina que dependiendo del valor de una cadena de caracteres llamada dia queremos mostrar por pantalla el siguiente mensaje: ~ “dia laborable", si el contenido es lunes, martes, miércoles, jueves 0 viernes; "fin de semana", si el contenido es sAbado 0 domingo; ~ “dia no valido", en cualquier otro caso. Este es un caso en el que nos vendré muy bien aplicar lo anterior para no tener que repetir una y otra vez la misma linea de cddigo. swith (dia) { cease “lunes case “miércoles “jueves” resultado ~ “dia laborable" breaks case “sibada": case “domingo! resultado = "fin de semana”; breaks default resultado ~ "dia no vido” © bien, si prefieres escribir todos los case del mismo grupo en la misma linea: switch (dia) { case "lunes": case "martes": case "miércoles": case "jueves": case "viernes" Ten en cuenta que para el compilador de Java, tanto el espacio en blanco como el salto de linea realizan la funcién de separador, de manera que puedes usar espacios 0 bien saltos de linea para separar cada case. Tan solo afectaré al aspecto visual, pero no a su significado o funcionamiento. El codigo equivalente utilizando estructuras de tipo if-else habria sigo el siguiente: if (iaequals‘tunes) | dia.equals("martes) | dia.equal("miércoles") | diaequals("jueves") | dis.equal"viesnes")) resultado =" laborable"; else if (dia equal” Fijate que la acumulacién de varios case para una Unica accién comin es equivalente al uso de la estructura OR (en Java simbolizada por || 0 |) en la estructura if-else. Ejercicio Propuesto Recuerda que para leer de teclado una cadena de caracteres podemos hacer algo como: Scanner teclado = new SeanneriSystem.in); String din; ‘System out print(Introduzca un dia de la semana: ") dia ~ teclado nextLine() Es decir, que utilizamos nextLine en lugar de nextint y obviamente asignamos lo que se obtenga a una variable de tipo String y no int. Teniendo en cuenta lo anterior, completa el cédigo del ultimo ejemplo para escribir un programa completo que pueda ejecutarse y lleve a cabo la funcién de escribir por pantalla el mensaje apropiado (dia laborable, fin de semana, dia no valido) en funcién de la entrada recibida (/unes, martes, miércoles, etc.) Recomendacion Error comiin de programacién » Olvidar una instruccién break cuando se necesita en una instruccién switch €s un error légico. Es decir, un error del que no nos va a avisar el compilador, pero que es muy probable que de lugar a un comportamiento no deseado de nuestro programa. Autoevaluacion Para la estructura tipo switch, el ultimo caso que debe incluirse es siempre la etiqueta default, ya que debe indicarse expresamente al compilador qué debe hacer ante cualquier valor resultante de evaluar la expresién distinto de los contemplados las etiquetas anteriores. De lo contrario, se produciria una indefinicion, que provocaria que el programa abortara si se presentara cualquier otro caso no previsto expresamente con alguna etiqueta asociada a las instrucciones a ejecutar. ) Verdadero © Falso Ejercicio Resuelto Realiza un programa en Java que calcule la nota de un examen de tipo test de 20 preguntas, donde ha habido 17 aciertos, 3 errores y 0 preguntas sin contestar, siguiendo la formula explicada en apartados anteriores. La nota calculada debes obtenerla como un numero entero, aunque los calculos los puedes hacer con ntmeros reales. Después de calcular la nota final, haz que el programa muestre la calificacién no numérica de dicho examen: Sila nota es 0, 1, 2, 3 0 4, la calificacion sera "INSUFICIENTE”. Si la nota es 5, la calificacién seré "SUFICIENTE". Si la nota es 6, la calificacion sera "BIEN". Si la nota es 7 0 8, entonces la calificacién sera "NOTABLE". Sila nota es 9 0 10, entonces Ia califacién sera de "SOBRESALIENTE”. “ ¢ “ “ Para realizar este ejercicio deberas usar obligatoriamente la estructura switch. 4.- Estructuras repetitivas, iterativas o ciclicas. Caso practico ~ Juan ya tiene claro cémo realizar la comprobacién de los valores de usuario y contrasefia introducidos por teclado, pero le surge una duda: éCémo podria controlar el numero de veces que el usuario ha introducido mal la contrasefia? Ada le indica que podria utilizar una estructura de repeticion que solicitase al usuario la introduccién de la contrasefia hasta un maximo de tres veces. Aunque no eae COMenta que puede haber miiltiples soluciones y todas yatapitsomas psbiras ge ylidas, lo importante es conocer las herramientas que podemos emplear y saber cuéndo aplicerlas. Nuestros programas ya son capaces de controlar su ejecucién teniendo en cuenta determinadas condiciones, pero alin hemos de aprender un conjunto de estructuras que nos permita repetir una secuencia de instrucciones determinada hasta que se consiga un determinado objetivo o hasta que se cumpla una determinada condicion. La funcién de estas estructuras repetitivas es repetir la ejecucién de una serie de instrucciones teniendo en cuenta una condicion. A este tipo de estructuras se las denomina estructuras de repeticion, estructuras repetitivas, bucles o estructuras ( iterativas. En Java existen cuatro clases de bucles: Bucle while (repite mientras). Bucle do-While (repite hasta), Bucle for (repite para). Bucle foriin (repite para cada). Los bucles for y forin Se consideran bucles controlados por(* contador. Por el contrario, los bucles while y doownite se consideran bucles controlados por jm sucesos. La utilizacién de unos bucles u otros para solucionar un problema dependeré en gran medida de las siguientes preguntas: “ ESabemosis _a priori cuantas veces necesitamos repetir un conjunto de instrucciones? Sabemos si hemos de repetir un conjunto de instrucciones si una condicién satisface un conjunto de valores? gSabemos hasta cuando debemos estar repitiendo un conjunto de instrucciones? Sabemos si hemos de estar repitiendo un conjunto de instrucciones mientras se cumpla una condicién? éSabemos si esas instrucciones se deben ejecutar siempre, al menos una primera vez, con independencia del resultado de evaluar la condicién que controla el bucle? Estas y otras preguntas tendrén su respuesta en cuanto analicemos cada una de las estructuras repetitivas en detalle. Recomendacion Estudia cada tipo de estructura repetitiva, conoce su funcionamiento y podras een ee ees ese emcee y obtener los mismos resultados. De hecho, seria posible resolver cualquier problema si solo contéramos con una estructura de control repetitiva (un unico tipo de bucle), pudiendo ser cualquiera de ellos. No obstante, segtin el tipo de problema, disponer de varios tipos podré permitimos construir soluciones mas simples y claras, lo que siempre resulta muy deseable. 4.1.- Estructura repetitiva while (I). En la siguiente imagen puedes ver un diagrama de flujo que representa el funcionamiento de este tipo de estructura repetitiva. El bucle while es la primera estructura de repeticion controlada por sucesos que vamos a estudiar. La utilizacién de este bucle responde al planteamiento de la siguiente pregunta: Qué podemos hacer silo nico que sabemos es que se han de repetir un conjunto de instrucciones mientras se cumpla una determinada condicion? La caracteristica fundamental de este tipo de estructura repetitiva estriba en ser util en aquellos casos en los que las instrucciones que forman el cuerpo del bucle podria ser necesario ejecutarlas o no. Es decir, en el bucle while siempre se evaluara la condicién que lo controla, y si dicha condicién es cierta, el cuerpo del bucle se ejecutara una vez, y se seauird ejecutando mientras la condicién sea cierta. Pero si en la evaluacién inicial de la condicién ésta no es verdadera, el Cuerpo del bucle no se ejecutara. Es imprescindible que en el interior del bucle while se realice alguna accién que modifique la condicién que controla la ejecucién del mismo, en caso contrario estariamos ante un bucle infinito, que es algo que se debe evitar siempre. Autoevaluaci6n De las afirmaciones siguientes, marca las que te parezcan correctas. © Cualquier problema que se pueda resolver con estructuras tipo for también es posible resolverlo con estructuras tipo while. Los ciclos while son adecuados para aquellos casos en los que sabemos que las instrucciones del cuerpo del bucle se deben ejecutar al menos una vez. © Para casos en los que sabemos exactamente cudntas veces debe ejecutarse el bloque de sentencias contenido del ciclo, while es mucho mas adecuado que for, porque aunque hace lo mismo, permite presentar el Cédigo de una manera mas simple y clara. © Los ciclos while requieren que dentro de las sentencias del bucle haya alguna que modifique el valor de la condicién que controla el bucle. Como se implementa esta estructura en Java? En la siguiente tabla se muestra tanto la sintaxis como el funcionamiento de esta estructura (ciclo while) en el lenguaje Java. Estructura renetitiva while. Sintaxis para el caso de una sola Sintaxis para el caso de un bloque de sentencia en el cuerpo del bucle while —_sentencias en el cuerpo del bucle while while (condicion) seatencia_ while (condicién) od sentencia; seatencia_n: Funcionamiento: “ Mientras la condicién sea cierta, el bucle se repetird, ejecutando las instrucciones de su interior (una o varias). En el momento en el que la condicién no se cumpla, el control del flujo de! programa pasara a la siguiente instruccién que exista justo detras del bucle while. ¥ La condicién se evaluara siempre al principio, y podra darse el caso de que las instrucciones contenidas en él no lleguen a ejecutarse nunca si no se satisface la condicién de partida Veamos un ejemplo. Imagina un programa que queremos que muestre por pantalla los niimeros del 1 al 5. Inicialmente podriamos pensar en escribir cinco sentencias de escritura por pantalla: ‘System .out pinta (1) System.out print (2); ‘System.out print (3); System.ont print (4); ‘System out printn (5); Pero claro, basta pensar que si hubiéramos tenido que escribir los niimeros del 1 al 500 no parece una solucién nada razonable tener que escribir quinientas veces esas lineas en nuestro programa. Precisamente para esto sirven los bucles. Podriamos declarar una variable de tipo entero que fuera almacenando el numero que queremos mostrar en pantalla e implementar un bucle cuya condicién de "continuidad" fuera "mientras el niimero esté por debajo de 5, incluido el propio 5°. A esa variable de tipo entero podriamos darle el valor inicial 1 y podriamos ir incrementandola en una unidad dentro del cuerpo del bucle. De este modo, cuando superara el valor 5 (y llegara a valer 6) ya no se entraria en el cuerpo del bucle (la evaluacién de la condicién seria false) y el programa continuaria justo por la siguiente sentencia después del cuerpo del bucle. \Veamoslo paso @ paso: 1 Inicializacién de la variable entera que iremos mostrando por pantalla: ion aumero-Is 65 Vaveucia Ue YULIE WHMIE LUI! Su LUIIBIULALIUIE, HHHETHaS 1 HUNIEIY seq NEIIUF U Igual Yue cinco" hile ( numero<-5 3.- Cuerpo del bucle while donde se muestre el valor de la variable y a continuacién se incremente en uno: System out println (numero smumero*+; } Dado que el cuerpo tiene mas de una sentencia necesitas escribir el bloque entre llaves. Si tan solo hubiera una linea podrias haber omitido las llaves. Por ejemplo, si hubieras usado el operador "post-incremento” dentro del propio printin: ‘System.out.printin (numero; //Esta linea es equivalente a las dos lineas anteriores y ya no son necesrias Ins Iaves de bloque Uniéndolo todo nos podria quedar algo como: int numero=1; while (numero<-5) ‘System out printin (numero } O bien asi (si lo hacemos todo en una tinica linea): int numero=1; hile (numero<-5 SSystemoutprintla (aumeeo+~); Y el resultado que obtendriamos por pantalla quedaria de la siguiente manera: Escribe un programa que solicite dos nimeros por teclado (inicio y fin, donde inicio deberia ser menor o igual que fin) y muestre por pantalla todos los nimeros que van desde inicio hasta fin, todos en una misma linea. Aqui tienes un ejemplo de una posible ejecucion del program: Introduzea el inicio: 4 Introduzea ol fi: 12 Secuencia de iimeros desde 4 hasta 12 456789101112 Tee 4.1.1.- Estructura repetitiva while (Il). Una utilidad muy interesante de las estructuras repetitivas es la rus PARA ESTRUCTURA posibilidad de volver a pedir un dato de entrada si este no cumple po WHILE alguna condicién No Por ejemplo, imagina que nos piden unos nlimeros de inicio y de fin y que el fin no pueda ser mayor que el inicio. Podriamos realizar una primera lectura de los valores: Entrada de datos ‘System out print ("Debe introduc el incio y el fn.") System.out print ("Tonga en cueata que fin no debe ser menor que el inicio: "; System.out print ("Introduzce el inicio inicio = teclado.nentin(); ‘System.out print ("intoduzee el fin: "); fin ~ teclado nent?) Y a continuacién comprobar mediante la condicién de un while si los valores cumplen o no la condicién que deben cumplir: ‘hile (inicio > fin) / Si inicio es superior a fin hay que volver a solicitar En caso de que se cumpla la condicién de que inicio es mayor que fin (que es lo que no debe suceder), se entraria en el cuerpo del while y se volveria a realizar la peticion: io es superior afin hay que volver a soicitar ‘System out print ("Errors el fin no puede ser superior al inicio.) System out print ("troduzeael inicio: ") inicio = teclado.nestlat() Systemout print ("attoduzea el fin: *) fin ~ teclado next) Y como esta dentro de unwhile se volveré a comprobar una y otra vez hasta que introduzcamos los valores correctamente. Unigndolo todo nos quedaria algo asi: Entrada de datos System out print ("Debe introducir el incio y el fn.") ‘System.out print ("Tenga en cuenta que el fin no debe ser menor que el inicio: "\ System.out print ("Introduces el inicio") inicio ~ tclado nestiat(); ‘System.out print ("Introduzea el fin") fin ~ teclado nent) ‘hile (inicio > fin) {1 Si inicio es superior afin hay que volver a solicitar Systemout printn ("Exror: el fin no puede ser superior a inicio." System out print ("atroduzca el inicio: ") inicio ~ teelado.nextint() Systemout print ("introduzea el fin: *) fin = teclado. nent); Systemoutprintn ("Entrada cosect."), De esta manera podriamos obligar al usuario a introducir unos datos de entrada vélidos y mientras no lo haga no se podra avanzar en el programa y se seguiran pidiendo los valores indefinidamente. Fijate que while en inglés significa precisamente "mientras". Aqui tienes una muestra de cémo podria quedar su funcionamiento: Deb introducr el incioy el fn ‘Tenga en cuenta que el fin no debe ser menor que e inicio Introd el inicio: 5 Tantvoduzea el fin: 2 Error: el fin no puede ser superior al inicio, Itroduzea el inicio: 8 Introduzea el fin $ Error: el fn no puede ser superior al inicio, Introdzca el inicio: 2 Tantroduzea el fin: 6 Entrada correcta, Una pega que podemos encontrar a esta manera de hacer una comprobacién de validez de entradas es que tenemos que escribir dos veces la solicitud de los valores. Una primera vez antes del bucle y luego una segunda vez dentro del cuerpo del bucle, lo cual no parece muy practico. Esto lo podremos resolver con la estructura do-while, que veremos en el siguiente apartado. Ejercicio Resuelto Escribe en Java un programa para calcular la tabla de multiplicar del 7 usando un bucle tipo while. Ejercicio Propuesto Escribe en Java un programa que solicite un numero n para calcular la tabla de multiplicar de ese numero n usando un bucle tipo while. Recomendaciéon Error de programacion Si en el cuerpo de una instruccién while no se proporciona una accién que ocasione que en algun momento la condicién de un while no se cumpla, por lo general se producira un error l6gico conocido como ciclo infinito, en el que el ciclo nunca terminara Autoevaluacion Utilizando el siguiente fragmento de codigo estamos construyendo un bucle infinito. ‘while (true) System our println("Imprimiendo desde dentto del bucle..") iIMPORTANTE! Lee con atencién la retroalimentacidn, porque en ella se explican algunos aspectos muy a tener en cuenta sobre la construccién de bucles con este tipo de condiciones. © Verdadero © Falso 4.2.- Estructura repetitiva do-while (I). En la siguiente imagen puedes ver un diagrama de flujo que representa el funcionamiento de este tipo de estructura repetitiva. Q La estructura do-while es otro tipo de estructura repetitiva controlada por sucesos. En este caso, la pregunta que nos planteamos es la siguiente: {Qué podemos hacer si sabemos que se han de ejecutar un conjunto de instrucciones al Menos una vez, y que dependiendo del resultado, puede que deban seguir repitindose mientras que se cumpla una determinada condicién? La caracteristica fundamental de este tipo de estructura repetitiva estriba en ser util en aquellos ser ejecutadas al menos una vez y repetir su ejecucién mientras que la condicién sea verdadera. Por tanto, en esta estructura repetitiva se ejecuta el cuerpo del bucle siempre una primera vez Como en el caso de while, para do-while también es imprescindible que en el interior del bucle se realice alguna accién que modifique la condicién que controla la ejecucién del mismo, en caso contrario estariamos ante un bucle infinito. Autoevaluaci6n Indica cual es la estructura de control de flujo repetitiva o ciclica que garantiza que las sentencias del cuerpo del bucle se ejecutaran al menos. una primera vez, con independencia del valor de la con momento de comenzar la ejecucién del ciclo. © do-while. © for. © while. © forfin. switch. 2Cémo se implementa esta estructura en Java? En la siguiente tabla se muestra tanto la sintaxis como el funcionamiento de esta estructura (ciclo wo-hile) en el lenguaje Java. Estructura repetitiva do-while. do { do sentencia 1; sentencias digla while (condicién) 5 sentencia_N; } while (condicién); Funcionamiento: El cuerpo del bucle se ejecuta la primera vez, a continuacién se evaluara la condicién y si ésta es verdadera, el cuerpo del bucle volver a repetirse, y asi sucesivamente, hasta que la condicién sea falsa. El bucle finalizara cuando la evaluacién de la condicién sea falsa, por tanto. En ese momento el control del flujo del programa pasaré a la siguiente instruccién que exista justo detras del bucle do-while. ¥ La condicién se evaluaré siempre después de una primera ejecucién del cuerpo del bucle, por lo que no se dara el caso de que las instrucciones contenidas en él no lleguen a ejecutarse nunca. Resumidamente: "Primero dispara y luego pregunta”. Ahora podemos repetir el ejemplo que hicimos para mostrar los nimeros del 1 al 5 con la estructura while utilizando esta nueva estructura do-while. No habré mucha diferencia: int numero=1; ‘System out println (numero): smumeno ++ 3 while ( mumero<-S ); / Dependiendo de la evaluacién de la condicién se volver a ejecutar ono O bien, si el cuerpo tiene una Unica linea, podemos eliminar las llaves de bloque: do Systemout printn (numero); hile (numero<=5 J; 4.2.1.- Estructura repetitiva do-while (il) Si retomamos el ejemplo en el que se comprobaba la validez de los datos de entrada utilizando un bucle while, recordaras la pega que le poniamos de tener obligatoriamente que escribir dos veces las sentencias de lectura. Ese problema desaparece con la estructura do-white, pues el cuerpo del bucle se va a ejecutar al menos una vez, ya que la comprobacién no se haré hasta el final. En tal caso la entrada de datos con comprobacién de validez nos podria quedar mucho més sencilla y compacta: system.out.println ("Debe intreducin el incio y el Fin."); do { // La primera vez siempre se entra en el cuerpo del bucle systom.out.println ("Tonga en cuenta el fin que no debe sor system.out.print (“Introduzca el inicio: “); Inicio = teclado.nextInt()5 System.out.print (“Introduzca el fin: “)3 fin = teclado.nextInt(); } while (inicio > fin); // Si 1a condicion no se cumple, se we system.out.println ("Entrada connecta.")3 (xaay ones) De esta manera evitamos tener que escribir una lectura de valores inicial antes de bucle y luego otra lectura exactamente igual en el cuerpo del bucle, por si hay que volver a introducir los valores una segunda vez (0 una tercera, o una cuarta). Autoevaluacion En las sentencias do-while , 2qué hay que tener siempre presente? ) La necesidad de duplicar el cédigo de las sentencias de control del bucle justo antes de entrar al mismo, de forma que se garantice asi que al menos se van a ejecutar una vez. ) La necesidad de que dentro del cuerpo del bucle se incluya alguna sentencia que modifique la variable de control del ciclo, de forma que pueda verse alterado el valor de verdad de la condicién que controla el bucle de tal manera que garanticemos que en algun momento se alcance la condicién de salida, sin entrar en un bucle infinito. ) La posibilidad de que el bucle no se ejecute nunca, por lo que la sentencia que modifique la variable de control de! bucle debe ser previa al do-while, 0 de lo contrario estariamos dejando la puerta abierfa a que nunca se modificara esa sentencia, y por tanto, nunca se alcanzara la condicién de salida, produciendo un bucle infinito, que es algo que siempre hay que evitar. ) Las respuestas anteriores son todas incorrectas. Ejercicio Resuelto Al igual que se pedia en apartados anteriores, ahora vamos os vamos a pedir que realiceis el ejercicio de la tabla de multiplicar del nimero 7, pero usando un bucle do-while. Recomendacién Autoevaluacion Un bucle tipo do-while, que no contenga en su cuerpo ninguna sentencia capaz de modificar el valor de verdad de la condicién que controla el ciclo, o bien se ejecuta una sola vez, o bien entra en un bucle infinito ejecutandose indefinidamente. O Verdadero © Falso 4.3.- Concepto de contador. En muchas ocasiones cuando se implementa un bucle, suele disponer de una variable que se va incrementando (0 N decrementando) a medida que se va realizando iteraciones sobre ese bucle. A este tipo de variables se les suele llamar contadores. En algunos de los ejemplos que ya hemos visto en apartados anteriores aparecian ese tipo de variables "contadoras": © para ir desde 1 hasta 5, en el primer ejemplo que se planted. Variable numero; ~ para ir desde inicio hasta fin, en el ejemplo de la secuencia de nuimeros. Variable numero; © para ir desde 1 hasta 10, en las tablas de multiplicar. Variable contador. omer Freeecocinages (Puabay Leese) Ahora bien, no siempre tiene por qué haber un contador asociado a un bucle. Por ejemplo en el caso de la comprobacién de validez de entradas no se utilizaba ninguna variable para saber cuantas veces se habia tenido que repetir la entrada de datos. No se hacia porque no se ha considerado util o necesario. Si se hubiera considerado asi podria haberse hecho sin problema. \Veamos un ejemplo mas de una variable de tipo contador que pueda resultarnos util Imagina un cajero automatico de un banco. Se nos permite introducir nuestro cédigo hasta tres veces Si al tercer intento no introducimos el cédigo correctamente, no se nos permitira entrar al sistema. Supongamos que nuestro cédigo es 6767. Podriamos implementarlo utilizando un contador (variable numintentos) que liegara hasta tres y a partir de ahi se saliera del bucle: eclaracign de variables Scanner teclado = new Seanner(System in) final it CODIGO- 6767; / Constante que contiene el codigo comecto int codigelntroducide; // Cédigo itroducio por el usuario int mumntent ‘Contador que representa el nimero de intentos Entrada de datos dot ‘System out print ("Introduzea codigo (entre 0 y 9999): ") codigolntroducido~ teclado.nestlai() numintentos-*; if (codigolntreducido != CODIGO) System.out printin ("Codigo incorrecto.") | while (codigolatroducido !~ CODIGO && nunslatentos<3); // Mientras el e6digo sea incorrecto no hayaanos llegado al limite de inte Comprobacisn de cédige correcta ‘ODIGO) ‘systemout printn ("Codigo correcto, Acceso concedido.”); if (odigotntrodvcido ele ‘System.outprintla ("Niimero de intentos superade. Acceso bloqueado"): De esta manera, sabemos que el bucle se puede ejecutar entre una vez como minimo (por ser do-while) y tres veces como maximo (que es el numero maximo de intentos permitidos). Eso lo controlamos mediante la condicién ( codigolntroducido ! = CODIGO && numintentos<3 ), que mientras sea true hara que se vuelva a ejecutar el cuerpo del bucle. Si una vez salgamos del bucle Puedes ver que dentro de una estructura iterativa (bucle) puede haber estructuras de tipo condicional (if, i-ese, switch) sin problema, ‘También podriamos haber implementado este programa utilizando una variable de tipo boolean para evitar realizar varias veces comprobaciones similares: Declaracida de variables ‘Scanner teclado ~ new Scanner(System.in); final int CODIGO= 6767; (/ Constante que contiene el céligo correcto int codigolntroducido; // Cédigo introduc por el usuario int mumfutentos-O; // Contador que representa el atmezo de intentos boolean codigoComecto; Indica si se ha legato aintrodueir el ebdigo cosrecto Entrada de datos codigoCorrecto= false; // Comenzamos asumiendo que no tenemos un cédigo correcto do SSystem.out print ("attoduzea codigo (entre 0 y 9999):" codigolntroducido~ teclado.nextit) snunulatentos+ if (codigolntroducide —~ CODIGO) { codigoCorrecto= tre; / Si el e6igo es corecto, esta variable pasa a tree System.out printin ("Codigo incorrecto.") } while (leodigoCorrecto && numlntentos<3);// Mientras el ebdigo sea incorrecto y no hayanos legado al limite de intentos Comprobacisn de cédige correcta if (odigoCorecto) Ssystem.outprintn ("Numero de intentos superad. Acceso bloqueado"); ele ‘System out println ("Cédigo corresto. Acceso concedido.”) Ejercicio Resuelto Escribe un programa que solicite dos nimeros por teclado (inicio y fin, donde inicio deberia ser menor o igual que fin) y muestre por pantalla cudntos miltiplos de tres hay entre esos dos ntimeros, ambos incluidos. Utiliza una variable de tipo contador para ir contandolos. ‘qu’ tienes un ejemplo de una posible ejecucién del programa: Tntroduzea ol inicio: 2 Introduzea el fin: 15, Entre 2 y 15 hay S miltiplos de tes. Reflexiona Un contador no siempre tiene por qué incrementarse. Podemos encontrarnos con casos en los que el contador comience con un determinado valor y vaya decrementandose hasta otro valor (podriamos decir que se trata de un "descontador’, pues va "descontando" en lugar de "contando", o bien "contando hacia atrés"). Por otro lado, un contador no siempre tiene por qué ir de uno en uno. Puede ir de dos en dos, tres en tres, o en general al ritmo que se considere oportuno. Ejercicio Resuelto Escribe un programa que muestre por pantalla una cuenta atras que vaya de diez en diez, comenzando en 100 y terminando en 0. La salida deberia ser algo similar a lo siguiente: Cuenta ats desde 100 hasta 0, de 10 ea 10. 100 90 80 70 60 5040 30 20 100, 4.4,.- Concepto de acumulador. Del mismo modo que hemos hablado de contadores, que son variables que se van incrementando (o decrementando) seguin un determinado ritmo o bien cuando se produce alguna circunstancia (se estd "contando" algo), también podemos encontrarnos con la necesidad de ir acumulando en una variable los resultados que vayamos obteniendo a lo largo de la ejecucién de un bucle. Es decir, que en lugar de ir sustituyendo el valor anterior por un velor nuevo, lo "acumulamos" o "sumamos" en la variable de algin modo. A este tipo de '-er=nsive Pnabayicone) variables se les suele conocer como acumuladores. Los acumuladores mas habituales son los aditivos o sumativos. Por ejemplo, imagina que queremos calcular la suma de todos los nimeros que hay entre un numero de inicio y un numero de fin, ambos incluidos. Por ejemplo, la suma entre los nimeros 1 y 5 seria 1+2+3+4+5 15. {Cémo podriamos automatizer este proceso mediante un programa en Java? Para lograr algo asi necesitariamos un contador que fuera desde 1 hasta 5 y un acumulador que fuera incorporando a lo que ya tienes cada uno de los nuevos valores que va adquiriendo el contador. Podemos verlo paso @ paso: 1. Iniciamos el contador (variable contador) y el acumulador (variable suma): {nt contador=1: / Contador que iri desde inicio (1) hasta fin (5) int suma-D; _|/ Acumulador que irt sumando de manera consecutiva los distintos valores que vaya tomando del contador 2. Recorremos todos los numeros que haya entre 1 y 5 (inicio y fin) con un bucle while while (contador 3. En el cuerpo del bucle vamos realizando la suma acumulada e incrementado el contador: suma += contador; contador; 4, Mostramos por pantalla el resultado final: ‘Systemoutprint ("La suma de los afimeros entre | y 5 es" ~ sum) Uniéndolo todo tendriamos:

También podría gustarte