IWI-131 PROGRAMACION DE COMPUTADORES GUIA #2: JAVA Ejercicio 1. Rutee el siguiente programa JAVA, indicando claramente lo que entrega como resultado. Haga una tabla con todas las variables para mostrar paso a paso el valor que van tomando las variables. public class ruteo{ public static final int A = 10; public static void main(String[] args) { int x, y, z; int c; c = 1; x = 0; y = 1;z = 2; do { z = z + c; y = 2*x + y + z; if ( y < A) y = y + 1; x = x - 1; } while ( z <= y); StdOut.printf("Los valores de x, y, z son: %d %d %d \n", x, y, z); } } Ejercicio 2. Corre el año 2033. La tierra ha sido invadida por seres alienígenas, encabezados por su líder Noicamargorp, quien lo mantiene cautivo a Ud. En una celda custodiada por el androide IWI-131. A su lado, se encuentra el cuerpo inerte de un ex-prisionero, que fue capturado mucho antes que Ud. Entre sus pertenencias, Ud. encuentra la clave para desactivar a IWI-131 y así escapar y salvar a la humanidad del cruel Noicamargorp (quien se dice se encarga de destruir principalmente a Estudiantes de Primer Año de Ingeniería, con sus sádicos Senemátrec). En el manuscrito, se señala que para desactivar a IWI-131 es necesario ingresar la cantidad de pasos necesarios para reducir exactamente mil (1000) números, los cuales van apareciendo en la pantalla del androide, siguiendo la siguiente regla: Si el número es par, dividirlo en dos. Si el número es impar multiplicarlo por 3 y sumarle 1. Se debe repetir este proceso hasta que el número ingresado se transforme en 1. Para poder solucionar el problema, Ud. deberá escribir un programa en JAVA que le permita ingresar 1000 números enteros mayores o iguales que 1 (en caso de ingreso de un número menor que 1, se debe finalizar el programa, enviando un mensaje de error), aplicar la regla anterior, mostrar los resultados parciales, y calcular la cantidad de pasos necesarios para convertir cada número en 1. Finalmente, deberá mostrar el número total de pasos necesarios para convertir en 1 cada uno de los 1000 números ingresados. Por ejemplo, la salida para la primera iteración de su programa, suponiendo que el número ingresado es 20 sería: Valor inicial: 20 Valor siguiente: 10 Valor siguiente: 5 Valor siguiente: 16 Valor siguiente: 8 Valor siguiente: 4 Valor siguiente: 2 Valor siguiente: 1 Valor final es 1, numero de pasos necesarios: 7 Esta salida se genera por cada uno de los 1000 números ingresados, y al final, se debe mostrar la suma de todos los pasos necesarios. Ejercicio 4. Se puede aproximar la integral de mediante la siguiente serie: El siguiente programa calcula la suma de los primeros 5 términos: public class suma{ public static void main(String[] args) { float termino; // Siguiente termino a sumar float serie; // Valor de la serie int n; // Contador serie= 1; //Valor inicial de la suma termino= 1; //Primer termino de la serie for (n=0;n<=4;n++) { termino = -1*termino*(2*n+1) / ((2*n+3)*(n+1)); serie = termino + serie; }; StdOut.printf("El resultado es:%f\n", serie); } } Sin embargo, este programa no es muy práctico si estamos interesados en obtener la serie con un cierto grado de aproximación. Aprovechando el hecho de que la serie es alterna, se puede aproximar su valor sumando términos hasta que el término a sumar, en valor absoluto, sea menor que la precisión deseada. Por ejemplo, si deseamos 3 decimales, debemos sumar hasta que | x | < 0:0005. Aprovechando este hecho, reescriba el programa anterior para obtener la integral expresada en (1) con 6 decimales precisos. Emplee para ello las sentencias WHILE o DO…WHILE. Suponga que no existe ninguna función para calcular el valor absoluto. Recuerde que la función valor absoluto es: Ejercicio 3. Indique que imprime el siguiente programa evaluando las siguientes expresiones de acuerdo a las reglas de precedencia de operadores : public class guia{ public static void main(String[] args) { StdOut.printf("primera: %f\n",4 + 5 * 3 / 3.0+24%4); StdOut.printf("segunda: %f\n",4%3 + 2 * 25 % 10 - Math.sqrt(9+Math.sqrt(9)*2+1)); StdOut.printf("tercera: %d\n",(int)(10 * 0.1 + 20) % 3 / 2); StdOut.printf("cuarta : %s\n",! false || true && (2 > 4*2-5)); StdOut.printf("quinta : %s\n",! (4 <= 3) && false || (4 < (int)((char)(10))) ); StdOut.printf("sexta : %s\n",! (4 <= 3) && false || true && 0 < 2 ||(4 < (int)((char)(32)))) ; } } Ejercicio 4. Considere el siguiente programa JAVA: public class guia{ public static void main(String[] args) { int a, b, c, d, e; StdOut.printf("ingrese numero entero:"); a=StdIn.readInt(); StdOut.printf("ingrese otro numero entero:"); b=StdIn.readInt(); c = a; d = b; e = 0; while (c >= 1) { if (c % 2 != 0) e +=d; c = c / 2 - c % 2 / 2; d = d * 2; }; StdOut.printf("El resultado es:%d\n",e); } } Realice el ruteo de este programa utilizando como datos de entrada los valores 37 y 12. Haga una tabla con todas las variables para mostrar paso a paso el valor que éstas van tomando e indique claramente el resultado entregado. Cuál es la operación aritmética realizada por este programa? Ejercicio 5. Una persona está estudiando un plan de ahorro para los próximos 20 años. La persona estima que podría ahorrar mensualmente una cantidad de $100.000. Además, al final de cada año piensa agregar $200.000 al monto acumulado. El banco le ofrece un interés mensual de 1. 5% los cuales son agregados al capital al final de cada mes. De esta manera, al final del primer mes tendrá 100.000 x 1, 015; al final del segundo mes tendrá (100.000 x 1, 015 + 100.000) x 1, 015; y así sucesivamente. Desarrolle un programa JAVA que permita calcular el monto total acumulado al cabo de los 20 años indicando además la cantidad ganada en intereses. Observación: Suponga que no existe una función para elevar a potencia. Ejercicio 6. El siguiente programa JAVA calcula la cantidad de alumnos aprobados, la cantidad de alumnos reprobados y la cantidad de alumnos que deben rendir examen a partir de las notas de 3 certámenes para 9 cursos de 60 alumnos cada uno: public class guia{ public static void main(String[] args) { int cantidad_cursos = 1, cantidad_alumnos = 2, cantidad_certamenes = 2; int i, j, k, nota, suma, promedio, aprobados, reprobados, examen; int selector; for (i = 1;i <= cantidad_cursos;i++) { reprobados = 0; examen = 0; aprobados = 0; for (j= 1;j<=cantidad_alumnos;j++) { suma = 0; for (k = 1;k<=cantidad_certamenes;k++) { do { StdOut.printf("Ingrese nota"); nota=StdIn.readInt(); } while (nota <0 || nota >100); suma += nota; }; promedio=suma / cantidad_certamenes; selector=0; if (promedio >=0 && promedio <= 40) selector=1 ; if (promedio >= 41 && promedio <=54) selector=2; if (promedio >=55 && promedio <=100) selector=3; switch (selector) { case (1): reprobados++; break; case (2): examen++; break; case (3): aprobados++; break; default: StdOut.printf("Promedio fuera de rango"); break; }; }; StdOut.printf("Curso:%d\n",i); StdOut.printf("Reprobados:%d\n",reprobados); StdOut.printf("A examen:%d\n",examen); StdOut.printf("Aprobados:%d\n",aprobados); }; } } 1. Desarrolle un programa JAVA equivalente utilizando instrucciones if y while en lugar de switch y for, respectivamente. 2. Desarrolle un programa JAVA equivalente utilizando instrucciones if y do…while en lugar de switch y for, respectivamente. Ejercicio 7. Considere el siguiente programa JAVA: public class ruteo{ public static void main(String[] args) { int n, i, k, f1, f2, f3, c; StdOut.printf("Ingrese valor de n:"); n=StdIn.readInt(); for (i = 1;i<=n + 1;i++) { f1 = 1; f2 = 1; f3 = 1; k = 1; while ( k <= n ) { f1 = f1 * k; if (k <= i) f2 = f2 * k; if (k <= n - i) f3 = f3 * k; k = k + 1; }; c = f1 / (f2 * f3)+(int)0.5; StdOut.printf("%d ",c); }; StdOut.printf("\n"); } } Realice el ruteo de este programa utilizando como dato de entrada el valor n = 2. Haga una tabla con todas las variables para mostrar paso a paso el valor que estas van tomando e indique claramente el resultado entregado. Ejercicio 8. Un número entero positivo se dice alternante si está compuesto de una secuencia de dígitos que alterna entre uno par y otro impar. Por ejemplo, los números 1236781, 238 y 1347 son alternantes. Desarrolle un programa JAVA que determine si un número es alternante. Observación: Incluya en su programa las sentencias necesarias para validar que el número ingresado sea un entero positivo.. Ejercicio 12. Transforme el siguiente segmento de programa JAVA en uno equivalente utilizando la sentencia switch en reemplazo de la sentencia if: if (y > 0) StdOut.printf("asiste"); else if ( y == 0) StdOut.printf("no asiste"); else if (y == -1) StdOut.printf("Error"); Ejercicio 9. Transforme el siguiente programa JAVA en uno equivalente reemplazando cada una de las estructuras de control iterativas por una equivalente. public class transformer{ public static void main(String[] args) { int n, c, p; boolean es; do { StdOut.printf("Ingrese numero:"); n=StdIn.readInt(); } while (n<=1); if (n == 2) es=true; else { c = 2; es = true; while ( n / 2 >= c && es ) { p = n; while (p > 0) p = p - c; if (p == 0) es = false; c++; }; }; if ( es ) StdOut.printf("El numero %d Cumple\n",n); else StdOut.printf("El numero %d no cumple\n",n); } } Ejercicio 10. Indique que imprime el siguiente programa evaluando las siguientes expresiones de acuerdo a las reglas de precedencia de operadores : public class guia{ public static void main(String[] args) { int a,b,c,d,i,j,n,s; a=1; b=2; c=3; d=4; i=3; j=-5; n=10; s='A'; StdOut.println(1.2 * i >= i / 2 - 1 % 2 / 2); StdOut.println((i / 2 - i % 2 / 2) >= (j + 6)); StdOut.println( (n == 10) && (s >= 'A')); StdOut.println( a - b / c * Math.sqrt(d) == -9.666767); StdOut.println( (a - b) / c * Math.sqrt(d) == -0.16667); } } Ejercicio 11. La serie de Fibonacci permite aproximar la forma en que se reproducen los conejos. Se sabe que una pareja de conejos puede tener dos crías al mes, y esto se da a partir del tercer mes de nacidos, en el cual los conejos alcanzan su edad madura. La forma en que aumenta la población de conejos mes a mes se puede ver en la siguiente tabla, si consideramos que no se mueren conejos y que inicialmente se cuenta con una pareja de conejos recién nacida: Codifique un programa JAVA que dado un valor n, correspondiente a un mes cualquiera, determine la cantidad de conejos en ese mes. Indicación: observe que en cada mes, la cantidad de conejos corresponde a la suma de los conejos de los dos meses anteriores a ese mes. Ejercicio 12. Codifique un programa en JAVA que genere la tabla de Pascal. La tabla de Pascal son los coeficientes de binomios, trinomios, etc. Ejemplo: 1 11 121 1331 14641 Este programa debe imprimir los 20 primeros números de la tabla de Pascal. Ejercicio 13. Un número perfecto es un entero positivo, que es igual a la suma de todos los enteros positivos (excluido el mismo) que son divisores del número. El primer número perfecto es 6, ya que los divisores de 6 son 1,2,3 y 1+2+3=6. Escribir un programa que encuentre los 50 primeros números perfectos. Ejercicio 14 El matemático italiano Leonardo Fibonacci propuso el siguiente problema. Suponiendo que un par de conejos tiene un par de crías cada mes y cada nueva pareja se hace fértil a la edad de un mes. Si se dispone de una pareja fértil y ninguno de los conejos muertos ¿Cuántas parejas habrá después de un año?. Ejercicio 15 Escribir un programa que visualice la siguiente salida: 1 1 1 1 1 1 1 2 2 2 2 2 3 3 4 3 Ejercicio 16 Si x representa la media de los números x1,x2,x3,….xn, entonces la varianza es la media de la suma de los cuadrados de las desviaciones de los números respecto de la media: Varianza 1 n x x 2 i 1 i n Y la desviación estándar es la raíz cuadrada de la varianza. Escribir un programa que lea una lista de números reales, los cuente y a continuación calcule e imprima su media, varianza y desviación estándar.