You are on page 1of 9

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 ao 2033. La tierra ha sido invadida por seres aliengenas, encabezados por su lder 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 Ao de Ingeniera, con sus sdicos Senemtrec). En el manuscrito, se seala que para desactivar a IWI-131 es necesario ingresar la cantidad de pasos necesarios para reducir exactamente mil (1000) nmeros, los cuales van apareciendo en la pantalla del androide, siguiendo la siguiente regla: Si el nmero es par, dividirlo en dos. Si el nmero es impar multiplicarlo por 3 y sumarle 1. Se debe repetir este proceso hasta que el nmero ingresado se transforme en 1. Para poder solucionar el problema, Ud. deber escribir un programa en JAVA que le permita ingresar 1000 nmeros enteros mayores o iguales que 1 (en caso de ingreso de un nmero 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 nmero en 1. Finalmente, deber mostrar el nmero total de pasos

necesarios para convertir en 1 cada uno de los 1000 nmeros ingresados. Por ejemplo, la salida para la primera iteracin de su programa, suponiendo que el nmero ingresado es 20 sera:

Valor Valor Valor Valor Valor Valor Valor Valor Valor

inicial: 20 siguiente: 10 siguiente: 5 siguiente: 16 siguiente: 8 siguiente: 4 siguiente: 2 siguiente: 1 final es 1, numero de pasos necesarios: 7

Esta salida se genera por cada uno de los 1000 nmeros 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 trminos: 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 prctico si estamos interesados en obtener la serie con un cierto grado de aproximacin. Aprovechando el hecho de que la serie es alterna, se puede aproximar su valor sumando trminos hasta que el trmino a sumar, en valor absoluto, sea menor que la precisin 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 DOWHILE. Suponga que no existe ninguna funcin para calcular el valor absoluto. Recuerde que la funcin 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. Cul es la operacin aritmtica realizada por este programa?

Ejercicio 5.
Una persona est estudiando un plan de ahorro para los prximos 20 aos. La persona estima que podra ahorrar mensualmente una cantidad de $100.000. Adems, al final de cada ao piensa agregar $200.000 al monto acumulado. El banco le ofrece un inters 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 aos indicando adems la cantidad ganada en intereses. Observacin: Suponga que no existe una funcin 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 certmenes 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 dowhile 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 nmero entero positivo se dice alternante si est compuesto de una secuencia de dgitos que alterna entre uno par y otro impar. Por ejemplo, los nmeros 1236781, 238 y 1347 son alternantes. Desarrolle un programa JAVA que determine si un nmero es alternante. Observacin: Incluya en su programa las sentencias necesarias para validar que el nmero 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 cras 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 poblacin 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 recin nacida:

Codifique un programa JAVA que dado un valor n, correspondiente a un mes cualquiera, determine la cantidad de conejos en ese mes. Indicacin: 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 nmeros de la tabla de Pascal.

Ejercicio 13. Un nmero perfecto es un entero positivo, que es igual a la suma de todos los enteros positivos (excluido el mismo) que son divisores del nmero. El primer nmero 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 nmeros perfectos. Ejercicio 14 El matemtico italiano Leonardo Fibonacci propuso el siguiente problema. Suponiendo que un par de conejos tiene un par de cras cada mes y cada nueva pareja se hace frtil a la edad de un mes. Si se dispone de una pareja frtil y ninguno de los conejos muertos Cuntas parejas habr despus de un ao?.

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 nmeros x1,x2,x3,.xn, entonces la varianza es la media de la suma de los cuadrados de las desviaciones de los nmeros respecto de la media:
Varianza = 1 n ( xi x ) 2 i =1 n

Y la desviacin estndar es la raz cuadrada de la varianza. Escribir un programa que lea una lista de nmeros reales, los cuente y a continuacin calcule e imprima su media, varianza y desviacin estndar.