Sie sind auf Seite 1von 17

Pontificia Universidad Cat olica de Chile

Escuela de Ingeniera
Departamento de Ciencia de la Computaci on
IIC1103 Introducci on a la Programaci on - Secciones 3 y 4
Ayudanta: Control de Flujo
Profesores: Daniel Langdon y Carla Vairetti
Ayudantes: Tom as Mery y Ricardo Rendich
Resumen te orico
If, Else
Hasta ahora las instrucciones dentro del c odigo fuente han podido ser ejecutadas s olo desde arriba hacia
abajo, es decir, en el orden en que se escribe, se ejecuta todo el codigo. Las instrucciones de control de ujo
(if, else), sin embargo, permiten cortar el ujo de ejecuci on ocupando toma de decisiones, permitiendo que
el programa ejecute bloques de c odigo de manera condicional. En otras palabras, permiten seleccionar partes
del codigo para que se ejecuten si cumplen con cierta condici on.
La expresion if(condici on) es la m as b asica de estas. Esta expresi on le dice al programa que se ejecute una
seccion del c odigo s olo si se cumple la condici on entre parentesis.
La expresion else if(condici on) provee un camino secundario en caso de que no se cumpla la condici on entre
parentesis.
Por ultimo, la expresi on else puede usarse cuando ninguna de las condiciones anteriores se ha cumplido.
En dibujos las expresiones se pueden ver de esta manera:
Las condiciones pueden darse con m as de una sentencia entre parentesis:
if (condicion1 && condicion2)
{
//Codigo
}
Implica que si se cumplen AMBAS condiciones, se ejecutar a el codigo.
IIC1103 Ayudanta: Control de Flujo 1
if (condicion1 || condicion2)
{
//Codigo
}
Implica que si se cumple por lo menos UNA condici on, se ejecutar a el codigo a continuaci on.
Y tambien pueden combinarse las formas:
if ( (condicion1 || condicion2) && condicion3)
{
//Codigo
}
El juego estar a en los parentesis, en el orden en que escriba las condiciones.
Existen formas en que se leer a el codigo seg un el orden que le demos a las condiciones.
Por ejemplo:
if (condicion1)
{
/*codigo...*/
}
else if (condicion2)
{
/*codigo...*/
}
else if (condicion3)
{
/*codigo...*/
}
else
{
/*codigo...*/
}
Si se cumple una condici on, las siguientes no ser an vericadas. Sin embargo, si se llega a la condici on3 y
esta no se cumple, la expresion else (sin condici on) implica que debe ejecutarse ese c odigo si ninguno de los
anteriores fue ledo.
For, While
Seg un lo aprendido hasta hace poco, los c odigos podan ser ledos en orden secuencial (desde arriba hacia
abajo). Luego, por medio del control de ujo (ifelse), vimos que se poda regular, por medio de condiciones,
la ejecucion de ciertos bloques de codigo, permitiendo as la toma de decisiones.
Sin embargo, a veces se requiere repetir ciertas partes del c odigo m as de una vez, para lo cual es poco eciente
reescribir. En estos casos lo que hacemos es iterar, haciendo mas eciente nuestro programa.
Una forma, es la instrucci on while(condici on) que ejecuta un bloque de c odigo una y otra vez mientras la
condici on entre parentesis (expresi on booleana) sea verdadera (claramente, reevaluar a la condici on hasta que
se convierta en falsa).
IIC1103 Ayudanta: Control de Flujo 2
Es util para vericar valores ingresados. Por ejemplo, al pedir valores al usuario:
int n= Usuario.entero("Ingrese un numero positivo");
while(n<=0){
n=Usuario.entero("No es positivo, ingrese nuevamente");
}
Por otro lado, la expresi on for (inicializaci on; condici on; variaci on) nos presenta otra alternativa. Permite
condicionar una iteraci on dentro de un rango de valores. La expresi on consta de tres partes: Inicializaci on,
esta se ejecuta una vez, al empezar el ciclo for, indica el valor desde el cual se comienza a ejecutar la
condici on con la que se ingresa. Condici on, precisa el momento en que el valor se vuelve falso. Variaci on,
es la actualizaci on (incremento o decremento) del valor inicializado, se ejecuta despues de cada iteracion.
Por ejemplo, un contador:
int contar=0;
for (int n=1 n<11; n++)
{
contar=contar+n;
}
Al salir del ciclo, contar corresponder a a la suma desde 1 hasta 10 (de uno en uno). Ambas instrucciones son
equivalentes. Normalmente se escoge una sobre la otra por asuntos de elegancia o comodidad. Para ambos,
el esquema es as:
Precauciones:
Limitar con cuidado las expresiones, ya que se puede caer en un loop innito, donde la condici on jam as se
hace falsa.
IIC1103 Ayudanta: Control de Flujo 3
Ejemplos
Problema 1: Costos de Envo
Enunciado
Usted ha sido contratado por FedEx para crear un programa que calcule el costo de envo de paquetes. El
problema reside en que hay m ultiples opciones de envo, es por esto que su programa debe preguntar por las
opciones escogidas y de acuerdo a esto calcular el costo. A continuaci on se detallan los costos junto con el
metodo escogido:
Se puede enviar el paquete de dos maneras, por avi on con costo de $2000 o barco con costo $1000.
En caso de enviarse por barco se puede escoger envo r apido con costo $500 o normal con costo $250.
Adem as se puede contratar un seguro contra perdidas, en caso de escogerlo esto suma $1000 al costo.
Por ultimo, existe la terrible posibilidad de pagar impuestos en aduana, el impuesto s olo se paga si es
que se escoge ir en avion y el costo es igual a $3000 o si se escoge ir en barco y el costo es mayor a
$1250. En caso de pagar impuesto el costo aumenta en $100.
Criterios de soluci on
Hay que hacer un if else para escoger entre avi on o barco.
Luego, si se escogi o barco hay que escoger entre envo normal o r apido, esto implica un if else adentro
del codigo que suma el costo del barco.
Despues hay que hacer un if solo para ver si se escoge el seguro.
Y por ultimo, un if para ver si se paga impuesto.
Posible soluci on
import iic1103Package.*;
public class Transporte {
/**
* Escriba un programa que calcule el costo de enviar un paquete, este debe preguntar por
* todas las opciones de envio.
*/
public static void main(String[] args) {
int costo=0; //Definimos nuestras variables
int tipoEnvio,seguro;
int medioTransporte=Usuario.entero("Desea mandar su paquete"+
"en avion(1) o barco(2)");
if(medioTransporte==1){ //si escogemos mandarlo por avion
costo=costo+2000;
}else{ //si es por barco
costo=costo+1000;
//debemos darle las opciones al usuario
tipoEnvio=Usuario.entero("que tipo de envio desea,"+ "normal(1) o rapido(2)?");
IIC1103 Ayudanta: Control de Flujo 4
if(tipoEnvio==1)
costo=costo+250;
else
costo=costo+500;
}
seguro=Usuario.entero("Desea contratar un seguro?si(1)no(0)");
if(seguro==1)
costo=costo+1000;
if((medioTransporte==1&&costo==3000)||(medioTransporte==2&&costo>1250))
{
Usuario.mensaje("Debe pagar un impuesto extra");
costo=costo+100;
}
Usuario.mensaje("El costo total es : "+costo);
}
}
IIC1103 Ayudanta: Control de Flujo 5
Problema 2: Apuestas
Enunciado
Como parte del nuevo enfoque del DCC usted ha sido encargado de crear un programa que controle apues-
tas online. Este programa debe dar la opci on al jugador de escoger entre tres juegos, cada uno de estos
con distintos porcentajes de ganancia. El sistema del juego en s es muy simple, el jugador debe primero
escoger el n umero del juego que desea jugar (1, 2 o 3) y luego escoger un n umero entre 10 y 20, este es
el n umero por el que est a apostando. Con los n umeros ya elegidos, el programa debe escoger un n ume-
ro entre (numeroApostado numeroJuego) y (numeroApostado + numeroJuego), si el n umero apostado
y el escogido por el programa son iguales, el jugador gana el juego y multiplica el dinero apostado por
(numeroJuego + 1).
Ejemplo: si se escoge el juego 2 y el usuario escoge el n umero 16, el programa debe escoger un n umero entre
14 y 18, y si el usuario gana obtiene el doble de lo que apost o.
Criterios de soluci on
Este programa es bastante estructurado, debemos:
Crear las variables para guardar el n umero del juego, el n umero a apostar y el dinero.
Pedir los valores.
Crear un bloque de if para cada juego.
Y dentro de cada bloque calcular el n umero que escoge el programa ocupando iic1103Package.Aleatorio.entero
para luego compararlo con el n umero del jugador.
Posible soluci on
import iic1103Package.*;
public class apuesta {
/**
* Dise~ nar un programa que controle apuestas online.
*/
public static void main(String[] args) {
int numeroJuego,numeroJugador,dineroJugador; //creamos las variables
numeroJuego=Usuario.entero("Indique el juego que desea jugar");
//y pedimos los datos
numeroJugador=Usuario.entero("Indique el numero que desea usar para jugar");
dineroJugador=Usuario.entero("Indique cuanto dinero quiere apostar");
if(numeroJuego==1){ //depende del juego que jugamos son los numeros ocupados
if(numeroJugador==iic1103Package.Aleatorio.entero(
numeroJugador-numeroJuego, numeroJugador+numeroJuego))
//comparamos numeros
Usuario.mensaje("Usted ha ganado "+ dineroJugador);
else
Usuario.mensaje("Usted ha perdido todo su dinero");
}
IIC1103 Ayudanta: Control de Flujo 6
if(numeroJuego==2){
if(numeroJugador==iic1103Package.Aleatorio.entero(
numeroJugador-numeroJuego, numeroJugador+numeroJuego))
Usuario.mensaje("Usted ha ganado "+2*dineroJugador);
else
Usuario.mensaje("Usted ha perdido todo su dinero");
}
if(numeroJuego==3){
if(numeroJugador==iic1103Package.Aleatorio.entero(
numeroJugador-numeroJuego, numeroJugador+numeroJuego))
Usuario.mensaje("Usted ha ganado "+3*dineroJugador);
else
Usuario.mensaje("Usted ha perdido todo su dinero");
}
}
}
IIC1103 Ayudanta: Control de Flujo 7
Problema 3: Juego
Enunciado

Ultimamente se ha hecho muy popular un juego con las siguientes condiciones para ganar (no nos importa
como se juega). En este juego gana el primero que llega a cuatro con diferencia de dos, con una condici on, si
se empata a 5 en alg un momento se le debe restar a un jugador al azar 1 punto (por lo tanto se puede ganar
4-0, 4-1, 4-2, 5-3 y 6-4). Sabiendo esto, se le encarga realizar un programa que reciba el puntaje que llevan
los jugadores y que luego informe si es que se gan o o si hay que desempatar, en caso de haber desempate
debe informar a que jugador restarle el punto.
Criterios de soluci on
Lo importante aqu es darse cuenta de que lo unico que hay que hacer es pedir los puntajes actuales de
los jugadores y luego hacer dos if, uno por cada situaci on (uno para detectar si gan o y otro para detectar
el empate). Lo m as complicado aqu es dar la condici on para cuando gana uno de los jugadores, nosotros
sabemos que la condici on es que al menos uno de los jugadores haya llegado a los 4 puntos y que el valor
absoluto de la diferencia entre ambos sea 2. La primera condici on es bastante f acil de resolver, la segunda
no tanto. La segunda condici on se puede enfrentar haciendo m ultiples ifs, o, lo m as sencillo, elevando al
cuadrado y buscando que el cuadrado de su diferencia sea mayor a 4.
Posible soluci on
import iic1103Package.*;
public class Juego {
/**
* Debe hacer un programa que simule un juego. Debe preguntar cuantos puntos lleva
cada jugador para luego ver si alguno gano o si es necesario el desempate.
*/
public static void main(String[] args) {
int quienGano;
int jugador1=Usuario.entero("Cuantos puntos lleva el jugador 1?"); //puntos jug1
int jugador2=Usuario.entero("Cuantos puntos lleva el jugador 2?"); //puntos jug2
if(jugador1==5 && jugador2==5) //si estan empatados
{
int random = iic1103Package.Aleatorio.entero(1, 2); //escogemos un numero al azar
//y dependiendo del numero decidmos a quien le quitamos el punto
if(random == 1)
Usuario.mensaje("Se le debe quitar un punto al jugador 1");
else
Usuario.mensaje("Se le debe quitar un punto al jugador 2");
}
//vemos si hay una diferencia de 2 y si alguno llego a 4
if((jugador1>=4||jugador2>=4)&&((jugador1-jugador2)*(jugador1-jugador2))>=4)
{
if(jugador1>=jugador2) //vemos quien gano
Usuario.mensaje("Gano jugador1");
else
Usuario.mensaje("Gano jugador2");
}
}
}
IIC1103 Ayudanta: Control de Flujo 8
Problema 4: Calculadora
Enunciado
Escriba un programa que realice las siguientes operaciones aritmeticas: sumar, restar, multiplicar, dividir,
obtener m odulo (resto de la divisi on entera) y obtener valor absoluto. El programa debe exponer inicialmente
todas las opciones, y a continuaci on pedir el/los n umero/s a operar.
Criterios de soluci on
El programa debe mostrar primero al usuario un men u, y luego realizar determinadas acciones dependiendo
de la opci on elegida. Dado que comparar Strings es m as complicado (por las may usculas y posibles errores
de escritura), bastar a con seleccionar la opci on con un n umero, y dependiendo del n umero ingresado por el
usuario, a traves de varios ifs, ejecutar el codigo correspondiente que pida los operandos correspondientes y
realice la operaci on.
Posible soluci on
import iic1103Package.*;
public class Principal {
public static void main(String[] args) {
int opcion;
String mensaje;
// se pueden hacer saltos de linea con "\n"
mensaje="Seleccione la operaci on que desea: \n" +
"[0] Salir \n" + "[1] Sumar \n" + "[2] Restar \n" + "[3] Multiplicar \n" +
"[4] Dividir \n" + "[5] Resto \n" +"[6] Valor Absoluto";
opcion = Usuario.entero(mensaje);
// Me fijo que la opcion este entre 1 y 6 (opcion valida)
if(opcion <= 6 && opcion >= 1){
double resultado;
if(opcion == 1){
// Escogio la suma, que necesita dos terminos
double terminoUno, terminoDos;
terminoUno = Usuario.real("Ingrese el primer sumando:");
terminoDos = Usuario.real("Ingrese el segundo sumando:");
resultado = terminoUno+terminoDos;
}
else if(opcion == 2){
// Escogio la resta, que necesita dos terminos
double terminoUno, terminoDos;
terminoUno = Usuario.real("Ingrese el primer termino:");
terminoDos = Usuario.real("Ingrese el segundo termino:");
resultado = terminoUno-terminoDos;
}
IIC1103 Ayudanta: Control de Flujo 9
else if(opcion == 3){
// Escogio la multiplicacion, que necesita dos terminos
double terminoUno, terminoDos;
terminoUno = Usuario.real("Ingrese el primer factor:");
terminoDos = Usuario.real("Ingrese el segundo factor:");
resultado = terminoUno*terminoDos;
}
else if(opcion == 4){
// Escogio la division, que necesita dos terminos
double terminoUno, terminoDos;
terminoUno = Usuario.real("Ingrese el numerador:");
terminoDos = Usuario.real("Ingrese el denominador:");
// El denominador no puede ser 0
if(terminoDos != 0)
resultado = terminoUno/terminoDos;
// Si no es 0 se pondra automaticamente 1
else { terminoDos =1;
Usuario.mensaje("Ingreso el valor 0 como denominador, " +
"lo que es invalido. Se ha seleccionado el valor 1 por defecto");
resultado = terminoUno/terminoDos;
}
}
else if(opcion == 5){
// Escogio el resto, que necesita dos t erminos
double terminoUno, terminoDos;
terminoUno = Usuario.real("Ingrese el numerador:");
terminoDos = Usuario.real("Ingrese el denominador:");
// El denominador no puede ser 0
if(terminoDos != 0)
resultado = terminoUno%terminoDos;
// Si no es 0 se pondra automaticamente 1
else { terminoDos =1;
Usuario.mensaje("Ingreso el valor 0 como denominador, " +
"lo que es invalido. Se ha seleccionado el valor 1 por defecto");
resultado = terminoUno%terminoDos;
}
}
else {// Escogio el modulo, que necesita un termino
double termino;
termino = Usuario.real("Ingrese el numero:");
// Esta funcion de la libreria Math obtiene el valor absoluto.
resultado = Math.abs(termino);
Usuario.mensaje("El resultado es: "+resultado);
}
else if (opcion == 0)
Usuario.mensaje("Gracias por usar el SuperOperador1103");
// Si no es ninguna de las anteriores, es una opcion inv alida.
else { Usuario.mensaje("La opcion que escogio no existe, el programa cerrara");
}
}
}
IIC1103 Ayudanta: Control de Flujo 10
Problema 5: Date O Matic
Enunciado
Por alg un motivo, alguien le pide desarrollar un programa en java para encontrar pareja (?!). Para esto, se le
explica que debe recibir el genero del usuario (hombre o mujer), la edad que tiene, y su altura (alto, mediano,
o bajo). Luego de esto, el sistema est a listo para recibir la informaci on de otro usuario, y determinar que
tan compatible son las dos personas.
Nota: Diremos que dos personas son compatibles si y s olo si tienen la misma edad, altura, y distinto
sexo.
Criterios de soluci on
El enunciado de este curioso programa, no especica los tipos de variables que debemos usar. Entonces,
queda a nuestro criterio, pero se debe tener en cuenta, para cada uno de los (dos) usuarios:
Una variable que guarda el genero de la primera persona.
Una variable que guarde la edad (generalmente, un int).
Una variable que guarde la altura (como debemos mostrar solamente 3 opciones, podemos manejar
esta informaci on a traves de otro int).
Mostrar un mensaje que indique si son compatibles las dos personas o no.
Posible soluci on
import iic1103Package.*;
public class DateOMatic {
public static void main(String[] args) {
Usuario.mensaje("Bienvenido primer usuario");
int genero1 = Usuario.entero("Ingrese su genero:" + "\n (1)Hombre" + "\n (2)Mujer");
int edad1 = Usuario.entero("Ingrese su edad: ");
int altura1 = Usuario.entero("Ingrese su altura:"+"\n (1)Alto"+"\n (2)Mediano"+"\n (3)Bajo");
Usuario.mensaje("Bienvenido segundo usuario");
int genero2 = Usuario.entero("Ingrese su genero:" + "\n (1)Hombre" + "\n (2)Mujer");
int edad2 = Usuario.entero("Ingrese su edad: ");
int altura2 = Usuario.entero("Ingrese su altura:"+"\n (1) Alto"+"\n (2)Mediano"+"\n (3)Bajo");
int compatibilidad = 0;
if(genero1 != genero2)
compatibilidad++;
if(edad1 == edad2)
compatibilidad++;
if(altura1 == altura2)
compatibilidad++;
if(compatibilidad == 3)
Usuario.mensaje("Son completamente compatibles! (1313)");
else
Usuario.mensaje("No son compatibles...");
}
}
IIC1103 Ayudanta: Control de Flujo 11
Problema 6: Imprimiendo Pares
Enunciado
Escribir un programa que pregunta por dos enteros e imprima todos los n umeros pares entre ellos.
Criterios de soluci on
Es importante jarse que aqu hay dos condiciones que hay que buscar: cuando dejar de buscar n umeros
para imprimir y cuando un n umero es par, para imprimirlo. La segunda es mas f acil, ya que si el m odulo
del n umero por dos ( %2) es cero entonces es un n umero par. La primera es un poco mas difcil, pero basta
darse cuenta que el n umero de iteraciones es igual a (SegundoNumero - PrimerNumero + 1). Luego basta
iterar (SegundoNumero - PrimerNumero + 1) veces recorriendo los n umeros desde el primero e imprimiendo
los pares.
Posible soluci on
public class Numeros {
/** Escribir un programa que pregunte por dos enteros e imprima todos los
numeros pares que esten desde el primer numero dado hasta el ultimo. */
public static void main(String[] args) {
int primerNumero, segundoNumero; //creamos las variables
int modulo2;
//pedimos los n umeros
primerNumero=Usuario.entero("Ingrese el n umero con el que se empieza");
segundoNumero=Usuario.entero("Ingrese el n umero con el que se termina");
while(segundoNumero>=primerNumero) //mientras el segundo numero sea mayor o igual sigue
{
modulo2=primerNumero%2; //modulamos por 2, si sobra algo es impar
if(modulo2==0) //si el modulo es 0 (o sea sobra algo) se imprime el n umero
{
Usuario.mensajeConsola(primerNumero);
}
primerNumero++;
/*como vamos sumandole uno al primer numero y establecimos la condicion en el while
de que se ejecute mientras el segundo sea mayor al primero, tenemos un numero de
iteraciones igual a (segundo-primero+1)*/
}
}
IIC1103 Ayudanta: Control de Flujo 12
Problema 7: Buscando Primos
Enunciado
Escriba un programa que reciba como input 3 n umeros y luego los imprima con un asterisco al lado si es que
son primos y con un signo m as (+) si no lo son.
Criterios de soluci on
Lo importante aqu es poder encontrar n umero primos, la manera m as f acil de hacer esto es vericar que
no puedan ser divisibles por ning un n umero m as que por s mismos y por 1. Para revisar esto, dividimos los
n umeros partiendo desde dos hasta la mitad del mismo. Si en alg un momento encontramos que es divisible
por alg un n umero terminamos el loop y lo marcamos como no primo. Con el unico n umero que hay problemas
es con el dos, por lo que si el n umero es 2 lo declaramos inmediatamente como primo.
Posible soluci on
import iic1103Package.*;
public class primos {
/**
* Escribir un programa que reciba como input 3 numeros y luego los imprima
* con un asterisco al lado si es que son primos y con un + si no lo son.
*/
public static void main(String[] args) {
int numero1=Usuario.entero("Ingrese el primer numero");
//pedimos el numero char caracter=*;
if(numero1!=2) //revisamos que sea distinto de 2
{
for(int i=2;i<=numero1/2;i++)
{ //recorremos todos los numeros por lo que podria ser divisible
if((numero1%i)==0){ //si en algun momento el resto es cero
caracter=*; //cambiamos el caracter y salimos del loop
break;
}
caracter=+;
}
}
Usuario.mensaje(numero1+" "+caracter);//mostramos el mensaje
}
}
IIC1103 Ayudanta: Control de Flujo 13
Problema 8: Inversi on Numerica
Enunciado
Escriba un programa en Java que reciba un entero cualquiera y retorne otro entero del mismo signo pero
con sus dgitos invertidos. Por ejemplo, al recibir el n umero -1234 la funci on debe retornar el n umero -4321.
Su programa debe pedir cuantos n umeros desea invertir, y luego ir invirtiendo cada uno de ellos.
Criterios de soluci on
Este problema se puede subdividir en tres peque nos problemas: ver si el n umero es negativo; sacar los dgitos
del n umero original; invertirlos en el n umero nal. La primera parte es sencilla, y es inteligente dejar el
n umero como positivo ya que eso permite trabajar solo con positivos. Luego, hay que sacar los dgitos del
n umero original, al momento de separar dgitos de un n umero lo mas f acil es modulando por diez. Luego,
para invertirlos, vamos multiplicando por diez, ya que al haber empezado a sacar los dgitos desde el nal
(eso hace el m odulo) al multiplicarlos por diez van a ir quedando al principio.
Posible soluci on
import iic1103Package.Interfaz;
public class Debuger {
public static void main(String[] args){
int resultado = 0;
int digito = 0;
int multiplier = 1;
int pruebas = Usuario.entero("Ingrese el numero de pruebas a realizar");
int numero;
for(int i=1 ; i<=pruebas ; i++){//iteramos la cantidad de pruebas.
numero = Usuario.entero("Ingrese el numero " + i); //pedimos el numero
if(numero < 0) //si el numero es negativo, nos acordamos
multiplier = -1;
numero *= multiplier; //dejamos el numero como positivo
while(numero > 0){//mientras queden digitos que leer
digito = numero % 10; //al modular por 10 obtenemos el ultimo digito
numero = numero/10; //al dividir por 10 elimniamos el ultimo digito del original
resultado = (resultado+digito)*10; //agregamos el digito al resultado
}
numero= resultado * multiplier / 10; //lo dejamos con el signo correcto
Usuario.mensaje("El inverso es " + numero);
}
}
}
IIC1103 Ayudanta: Control de Flujo 14
Problema 9: Validaci on de Datos Ingresados
Enunciado
Escriba un programa que imprima un men u con 3 opciones pidiendole al usuario un n umero entre 0 y 3
(opci on 0 ser a Salir). El programa debe validar que el valor ingresado por el usuario sea correcto.
Criterios de soluci on
Primero identicamos la secci on de c odigo que se repetir a, siendo esta la impresi on del men u y el pedir
la opci on al usuario. Luego, englobamos este c odigo dentro de un while, vericando que el valor ingresado
este dentro de los valores posibles (0 y 3).
Posible soluci on
import iic1103Package.Usuario;
public class Principal {
public static void main(String[] args) {
int opcion = Usuario.entero("Seleccione alguna de las siguientes opciones: \n[0] Salir \n[1]
Opcion 1\n[2] Opcion 2\n[3] Opcion 3");
while(opcion > 3 || opcion < 0){
opcion = Usuario.entero("La opcion seleccionada es inv alida,
por favor seleccione alguna de las siguientes opciones: \n[0] Salir\n[1] Opcion 1 \n[2]
Opcion 2\n[3] Opcion 3");
}
if(opcion >0)
Usuario.mensaje("Selecciono la opcion "+ opcion);
}
}
IIC1103 Ayudanta: Control de Flujo 15
Problema 10: Proyecto Espacial
Enunciado
La Nasa le pide que realice la simulaci on de un viaje espacial a la Luna. Para esto, debe desplegar un mensaje
con el conteo regresivo (de 10 a 0), indicar, cada 100 km, la altura a la que se encuentra el cohete, cuando
ha salido de la Tierra
1
, y la cantidad de asteroides con que se choca rumbo a nuestro satelite natural
(felicite a la tripulaci on por su buena fortuna si no tuvieron inconvenientes). Para esto, empricamente se ha
determinado que la posibilidad de un impacto corresponde a 17.5 %, y, seg un reportan otros viajes, existen
1000 asteroide en el trayecto.
Bonus1: indique el costo de repaci on de la nave, si por cada impacto se estima que se deben invertir 540
d olares.
Bonus2: extienda el programa anterior para que realice la simulaci on de manera indenida, hasta que el
usuario decida detenerla. Considere que una vez iniciada la simulaci on esta debe llegar a su nal.
Criterios de soluci on
Este problema se puede desglosar en los siguientes puntos:
1. crear las variables mnimas necesarias (cantidad de asteroides, por ejemplo, con un int).
2. hacer un ciclo para mostrar el conteo regresivo.
3. hacer un ciclo incremental para ir noticando la altura
4. indicar cuando se sale de la Tierra.
5. realizar un ciclo, sobre la cantidad de asteroides, donde se determine si hubo choque, y se registre el
suceso (en su variable).
6. informar lo dicultoso o afortunado del trayecto.
7. realizar los bonus respectivos.
Posible soluci on
import iic1103Package.*;
public class ViajeEspacial {
/**
* Programa de simulacion de un viaje de la Tierra a la Luna.
*/
public static void main(String[] args) {
// variables necesarias
int cantChoques = 0; // variable que guardara la cantidad de choques
// variables sugeridas
int altura = 10000; // variable que guarda la altura que se debe alcanzar
int deltaH = 100; // variable que guarda el incremento de la altura
double probabilidad = 17.5; // probabilidad de chocar con un asteroide
int cantRocas = 1000; // cantidad de Asteroides entre la Tierra y la Luna
int cuenta = 10; // cuenta regresiva
1
consideraremos que sale de la Tierra cuando pase la exosfera, la ultima capa de la atm osfera, que se comprende entre los
600 y 10000 km, http://es.wikipedia.org/wiki/Exosfera
IIC1103 Ayudanta: Control de Flujo 16
// ciclo para la cuenta regresiva
for(int i = cuenta ; i > 0; i--)
{
Usuario.mensaje(i+"...");
}
// ciclo para ir incrementando (y mostrando) la altura
for(int h = 0 ; h < altura; h += deltaH)
{
Usuario.mensaje("La altura es: "+h);
}
// mensaje de aviso
Usuario.mensaje("Abandonamos el planeta!");
// ciclo para realizar la operacion cantRocas veces
for(int cant = 0 ; cant < cantRocas ; cant++)
{
// variable que indica la posibilidad de chocar con el asteroide "actual"
double suerte = iic1103Package.Aleatorio.real(0, 100);
// determinamos si hubo choque
if(suerte < probabilidad)
{
cantChoques++; // registramos el choque
}
}
// indicamos la suerte del viaje
if(cantChoques==0)
{
Usuario.mensaje("Enhorabuena! \n" +
"Ha tenido un viaje seguro y tranquilo. Los asteroide no fueron problema");
}
// informamos los choques que sufrio.
else
{
Usuario.mensaje("Para llegar a la Luna se le interpusieron "+cantChoques+" asteroide");
}
}
}
IIC1103 Ayudanta: Control de Flujo 17

Das könnte Ihnen auch gefallen