1 Algoritmos Básicos

Anuncio
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.
Descargar