Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación Competencias IIC1103 Introducción a la Programación (I/2010) Interrogación 1 13 de Abril de 2010 Las competencias a evaluar con esta prueba son las siguientes: 1. Explicar los siguientes conceptos relativos a un programa computacional. 2. Aplicar las técnicas fundamentales para la resolución de problemas computacionales identificar los datos relevantes de un problema y las relaciones entre ellos, y descomponer problemas grandes en varios problemas más pequeños para resolver diferentes tipos de problemas con la ayuda del computador. 3. Aplicar el razonamiento algorítmico para establecer la solución a un problema como una secuencia de pasos bien definidos, incluyendo pasos condicionales y repetición de pasos. Pregunta 1 (30 %) Conceptos (40 %) Imagine la siguiente situación. Se te solicita desarrollar un programa de importancia nacional que simule la intercepción de un misil enemigo mediante el uso de un misil enviado por ti. Diseñas el programa, dentro del cual hay todo tipo de elementos como for, while, if-else y otros. Ya estás preparado, por lo que te sientas frente a tu computador para comenzar a programar. En ese momento te enteras mediante una noticia online que hay un virus nuevo que afecta al sistema operativo que ocupas, el cual borra la palabra if y la palabra else cada vez que la escribes, y tu computador está infectado. En definitiva, no puedes programar ocupando el control de flujo if-else. La pregunta es, existe alguna forma de desarrollar de igual forma un programa completo sin ocupar if-else? Si no la hay, por qué?. Y si la hay, cuál será la equivalencia del siguiente trozo de código mediante esta solución? int x = Usuario. entero (" Ingrese cualquier numero entero "); int y = Usuario. entero (" Ingrese cualquier numero entero "); if(x>y){ // Codigo desconocido if else { // Codigo desconocido else
Posible Solución: Claro que la hay, y es simplemente utilizando una combinación entre boolean y while para simular el comportamiento de un if y un else. No hay que olvidar que el else es simplemente un if con la condición negada, y fijándose que si se ingresó al if, no se puede ingresar al else, nunca. int x = Usuario. entero (" Ingrese cualquier numero entero "); int y = Usuario. entero (" Ingrese cualquier numero entero "); boolean entro_al_if = false ; /* La variable de tipo boolean entro_al_if es MUY importante. Sin ella, se podra entrar al if y despues al else ( no olvidar que x puede cambiar de valor dentro del "// Codigo desconocido if" */ while (x>y &&! entro_al_if ){ // if // Codigo desconocido if entro_al_if = true ; while (x <=y &&! entro_al_if ){ // else // Codigo desconocido else Pauta Corrección: Total 3 puntos. Decir que Sí, exista una forma. Puntos:0.5 Solución en código considera complementariedad de condiciones entre el if y el else. Puntos:1.0 Solución en código considera que dentro del Código desconocido if el valor de x puede cambiar y por lo tanto hay que tener cuidado para que no se pueda entrar al if y luego al else. Puntos:1.5 Aplicación (60 %) 1. Detalle el resultado mostrado en consola luego de la ejecución del siguiente programa. import iic1103package.*; public class Principal { public static void main ( String [] args ){ // Parte 1 int r = -1; for ( int i =0; i <5; i ++){ r = r + i; r - -; Usuario. mensaje ("r = " + r); String a = "5"; a = a + r; Usuario. mensaje ("a = " + a); // Parte 2 for ( int i =5; i <10; i ++){ Usuario. mensaje ("i = " + i); for ( int j= -1; j <1; j ++){ i = i - j; Usuario. mensaje (i*j); // Parte 3 int year = 2010;
String sem = "1 "; int x = 2016; while (x > year ){ x = x - 2; Usuario. mensaje (x +1); if ( x %2 == 0){ --x; Usuario. mensaje ( sem + ": " + (x + 1)); Pauta y Solución: Total puntos: 6.0 El resultado en consola es el siguiente: r = 4 Puntos:0.7 a = 54 Puntos:0.5 i = 5 Puntos:0.1-6 Puntos:0.2 0 Puntos:0.4 i = 7 Puntos:0.4-8 Puntos:0.4 0 Puntos:0.4 i = 9 Puntos:0.4-10 Puntos:0.4 0 Puntos:0.4 2015 Puntos:0.1 1 : 2014 Puntos:0.8 2012 Puntos:0.4 2010 Puntos:0.4 Pregunta 2 (40 %) Una persona dispone de los siguientes alimentos para consumir: Alimento Calorías 1.- Cazuela de Ave 340 2.- Completo 700 3.- Durazno 48 4.- Cerveza 96 Tabla 1: Alimentos Y para utilizar las calorías consumidas el individuo puede participar las veces que quiera en un triatlón, el cual consiste en correr durante 15 minutos, luego hacer 15 minutos de bicicleta y finalmente nadar por 15 minutos. En las actividades mencionadas las calorías se gastan de la siguiente forma:
Actividad Física Calorías utilizadas por 15 min. de actividad Correr (12 km/hr) 231 Caminar(6 km/hr) 74 Ciclismo 148 Natación 111 Tabla 2: Actividades Realice un programa en Java que permita al usuario indicar cuántas porciones de cada tipo de alimento va a consumir. El usuario puede modificar cuantas veces quiera la cantidad de porciones que le asigna a cada tipo de alimento. Este proceso se realiza hasta que el usuario ingrese un valor distinto al de la Tabla 1, por ejemplo el valor 0 (cero), el cual indica que ya no se consumirán mas porciones de ningún alimento. Validando que: El alimento ingresado pertenezca a los de la lista (tabla 1). Las cantidades ingresadas sean valores enteros mayores o iguales a cero. Una vez indicada la cantidad total de calorías ingresadas, el programa debe indicar cuál es el número mínimo de repeticiones en el triatlón para gastar las calorías consumidas (no importa que se pase un poco, pero el excedente no puede ser mayor a lo gastado en un ciclo de triatlón). Considere que cada vez que el individuo ya ha participado 2 veces seguidas en la triatlón corriendo, el trayecto que debió hacer corriendo esta tercera vez lo hace caminando por un tema de agotamiento. Tener en cuenta que: al correr a 12 km/hr en 15 min se recorren 3 Km. y al caminar a 6 km/hr en 15 min. se recorren 1,5 Km. considere que el trayecto caminando es de 3 Km, es decir gasta el doble de calorías. Pauta Corrección: Total 10 puntos. Definir todas las variables/constantes (8 en total, 4 de cada tabla). Puntos:0.5 Definir la variable que sume las calorías ingeridas. Puntos:0.5 Definir la variable que sume las calorías utilizadas. Puntos:0.5 Validar que el alimento a ingerir esté en la tabla (1-4) o por defecto sea el valor de fin (cero). Puntos:2 Validar que si el usuario ingresa el valor de fin (cero) Puntos: se termine la ejecución del ciclo. Puntos:2 Validar que si ya ha participado dos veces seguidas en el triatlón corriendo la tercera vez sea caminando. Puntos:2 Participar en el triatlón hasta que las calorias ingeridas sean menores o iguales a las calorias utilizadas. Puntos:2
Imprimir el número mínimo de repeticiones en el triatlón para gastar las calorías consumidas. Puntos:0.5 Posible Solución: import iic1103package. Usuario ; public class P2 { public static final int CAZUELA = 340; public static final int COMPLETO = 700; public static final int DURAZNO = 48; public static final int CERVEZA = 96; public static final int CORRER = 231; public static final int CAMINAR = 74; public static final int CICLISMO = 148; public static final int NATACION = 111; public static void main ( String [] args ) { int alimento ; int caloriasingeridas = 0; int caloriasutilizadas = 0; int porcion = 0; int participaciontriatlon = 0; do { alimento = Usuario. entero (" Ingrese alimento a ingerir "); switch ( alimento ) { case 1: { porcion = Usuario. entero (" Ingrese la porcion de cazuela "); caloriasingeridas = caloriasingeridas + ( CAZUELA * porcion ); case 2: { porcion = Usuario. entero (" Ingrese la porcion de completo "); caloriasingeridas = caloriasingeridas + ( COMPLETO * porcion ); case 3: { porcion = Usuario. entero (" Ingrese la porcion de durazno "); caloriasingeridas = caloriasingeridas + ( DURAZNO * porcion ); case 4: { porcion = Usuario. entero (" Ingrese la porcion de cerveza "); caloriasingeridas = caloriasingeridas + ( CERVEZA * porcion ); case 0: { Usuario. mensaje (" Ahora realizaremos los calculos... "); default : { Usuario. mensaje (" El Alimento ingresado no es valido, intentelo nuevamente "); // switch while ( alimento!= 0); while ( caloriasingeridas > caloriasutilizadas ) { participaciontriatlon ++; // si es la participacion multiplo de 3 debe caminar y no correr if ( participaciontriatlon % 3 == 0) { // CALCULO EN TRAYECTO caloriasutilizadas = caloriasutilizadas + (2 * CAMINAR + CICLISMO + NATACION ); // 2* CAMINAR -- > para // recorrer los 3km Usuario. mensaje (" en 3");
else { caloriasutilizadas = caloriasutilizadas + ( CORRER + CICLISMO + NATACION ); Usuario. mensaje (" en otro "); Usuario. mensaje (" Para gastar las " + caloriasingeridas + " debes participar al menos " + participaciontriatlon + " veces en la triatlon "); Pregunta 3 (40 %) En un casino se estrena un nuevo tipo de juego que consiste en tirar 3 dados con un número distinto de caras y elegir un número. El jugador toma los dados, los lanza y si los 3 resultados suman el número que eligió, gana. El premio es inversamente proporcional a la probabilidad de que gane. El casino quiere poder evaluar esto cada vez que un jugador elige los dados que va a utilizar y el número que quiere sacar. Para ello, le ha pedido un programa que pida al usuario los 4 valores (el número de caras de cada uno de los dados más la suma a la que va a apostar) e imprima en la consola todas las combinaciones ganadoras que pueden ocurrir y finalmente el número total de combinaciones que sirven versus las combinaciones totales. El casino tiene dados de 4, 6, 8, 10, 12y20 caras, pero asuma para efectos del programa que cada dado puede tener cualquier valor entero positivo de caras, numeradas desde la 1 en adelante. No hay problema utilizar dados con tamaños repetidos. Asuma también que el usuario ingresará valores correctos, por lo que no necesita validarlos. EJEMPLO: Para los dados 2, 3 y 4 y el valor 10 el resultado es: Las combinaciones ganadoras son 0 de 24. Para los dados 2, 4 y 6 y el valor 12 el resultado es: La combinación 2-4-6 suma 12. Las combinaciones ganadoras son 1 de 48 Para los dados 2, 4 y 6 y el valor 10 el resultado es: La combinación 1-3-6 suma 10. La combinación 1-4-5 suma 10. La combinación 2-2-6 suma 10. La combinación 2-3-5 suma 10. La combinación 2-4-4 suma 10. Las combinaciones ganadoras son 5 de 48 Pauta Corrección:
Pedir los valores correctamente: 1 pto. Iterar sobre todos los valores posibles: 2 pts. Limitar correctamente los valores a los dados existentes: 1 pto. Evaluar la condición y mostrar las combinaciones correctas: 1 pto. Calcular la suma y mostrar el total al final: 1 pto. Posible Solución: import iic1103package. Usuario ; public class P3 { public static void main ( String [] args ) { int dado1 = Usuario. entero (""); int dado2 = Usuario. entero (""); int dado3 = Usuario. entero (""); int suma = Usuario. entero (""); int combinaciones = 0; for ( int i = 1; i <= dado1 ; i ++) { for ( int j = 1; j <= dado2 ; j ++) { for ( int k = 1; k <= dado3 ; k ++) { if ( i + j + k == suma ) { Usuario. mensaje (" La combinacion " + i + "-" + j + "-" + k + " suma " + suma + "."); combinaciones ++; Usuario. mensaje (" Las combinaciones ganadoras son " + combinaciones + " de " + dado1 * dado2 * dado3 );