Está en la página 1de 6

Guía de Laboratorio POO

Programación Digital
Ejercicio 1:
Dada una interfaz para funciones numéricas
public interface Funcion {
public double f(double x);
}

Escriba un método recursivo para hallar el valor de x que hace f(x) = 0, entre dos
puntos x1 y x2.
Consideraremos igual a 0 si el valor absoluto es menor que 10-6.
El algoritmo a implementar es así:
double buscaCero(Funcion f, double x1, double x2)
si signo(f(x1) = signo(f(x2))
se lanza una ArithmeticException, con mensaje “no pasa por 0”
se busca el punto medio xm entre x1 y x2
si |f(xm)| < 10-6, se devuelve xm
si signo(f(x1)) = signo(f(xm)) se sigue buscando entre xm y x2
si signo(f(x2)) = signo(f(xm)) se sigue buscando entre x1 y xm

Solución:

public class Recursivo {


public static final double ERROR = 0.000001;

public double recursivo(Funcion m, double x1, double x2) {


System.out.printf("x1 = %.3f; x2 = %.3f%n", x1, x2);
if (m.f(x1) * m.f(x2) > 0)
throw new ArithmeticException("no pasa por cero");
double xm = (x1 + x2) / 2;
if (Math.abs(m.f(xm)) < ERROR)
return xm;
if (m.f(x1) * m.f(xm) > 0)
return recursivo(m, xm, x2);
else
return recursivo(m, x1, xm);
}

public double iterativo(Funcion m, double x1, double x2) {


double xm;
do {
System.out.printf("x1 = %.3f; x2 = %.3f%n", x1, x2);
if (m.f(x1) * m.f(x2) > 0)
throw new ArithmeticException("no pasa por cero");
xm = (x1 + x2) / 2;
if (m.f(x1) * m.f(xm) > 0)

“Hay que cambiar, para cambiar es necesario saber, para saber es necesario aprender, y para
aprender es necesario hacer grandes sacrificios”
Guía de Laboratorio POO
Programación Digital
x1 = xm;
else
x2 = xm;
} while (Math.abs(m.f(xm)) > ERROR);
return xm;
}

public static void main(String[] args) {


Funcion m = new Funcion() {
public double f(double x) {
return 0.1 + Math.sin(x);
}
};
Recursivo ej = new Recursivo();

{
System.out.println("recursivo:");
double raiz = ej.recursivo(m, -Math.PI / 4, Math.PI / 4);
System.out.println("raiz = " + raiz);
System.out.println("f(raiz) = " + m.f(raiz));
}
{
System.out.println("iterativo:");
double raiz = ej.iterativo(m, -Math.PI / 4, Math.PI / 4);
System.out.println("raiz = " + raiz);
System.out.println("f(raiz) = " + m.f(raiz));
}
}
}

Array
Ejercicio 2: Array con ventana de ingreso

Crear un array de 10 posiciones de números con valores pedidos por teclado. Mostrar por
consola el indice y el valor al que corresponde. Hacer dos métodos, uno para rellenar valores
y otro para mostrar.

import javax.swing.JOptionPane;
public class arrayApp {

public static void main(String[] args) {

//Esto es opcional

“Hay que cambiar, para cambiar es necesario saber, para saber es necesario aprender, y para
aprender es necesario hacer grandes sacrificios”
Guía de Laboratorio POO
Programación Digital
final int TAMANIO=10;

int num[]=new int[TAMANIO];

//Invocamos las funciones


rellenarArray(num);

mostrarArray(num);
}

public static void rellenarArray(int lista[]){


for(int i=0;i<lista.length;i++){
String texto=JOptionPane.showInputDialog("Introduce un número");
lista[i]=Integer.parseInt(texto);
}
}

public static void mostrarArray(int lista[]){


for(int i=0;i<lista.length;i++){
System.out.println("En el indice "+i+" esta el valor "+lista[i]);
}
}
}

Ejercicio 3:

Dados 2 números en forma de array de caracteres, necesitamos un método que genere el array
suma.
Ejemplo:
Sea A = { ‘4’, ‘0’, ‘1’, ‘2’ } 4012
Sea B = { ‘3’, ‘9’ } 39
suma(A, B) = { ‘4’, ‘0’, ‘5’, ‘1’ } 4 0 5 1
El método que se pide recibe como argumentos 2 arrays de caracteres, y devuelve como
resultado un array de caracteres. El array resultado tendrá el mínimo tamaño necesario para
contener el número; o sea, sin “ceros a la izquierda”.

NOTAS
— para pasar de un carácter ch a un entero: int n= ch –‘0’;
— para pasar de un entero n a un carácter: char ch = (char)(n + ‘0’);

Solución:

“Hay que cambiar, para cambiar es necesario saber, para saber es necesario aprender, y para
aprender es necesario hacer grandes sacrificios”
Guía de Laboratorio POO
Programación Digital
public static char[] suma1(char[] a, char[] b) {
char[] resultado = new char[1 + Math.max(a.length, b.length)];
int mellevo = 0;
for (int i = 0; i < resultado.length; i++) {
int indiceA = a.length -1 -i;
int indiceB = b.length -1 -i;
int indiceR = resultado.length -1 -i;
int na = indiceA < 0 ? 0 : a[indiceA] -'0';
int nb = indiceB < 0 ? 0 : b[indiceB] -'0';
int sp = na + nb + mellevo;
if (sp < 10) {
mellevo = 0;
} else {
sp %= 10;
mellevo = 1;
}
resultado[indiceR] = (char) ('0' + sp);
}
if (resultado[0] != '0')
return resultado;
char[] corto = new char[resultado.length -1];
for (int i = 0; i < corto.length; i++)
corto[i] = resultado[i + 1];
return corto;
}

Ejercicio 4: Lista

Dados 2 números en forma de lista de caracteres, necesitamos un método que genere la lista
suma.
Ejemplo:
Sea A = [‘9’, ‘9’, ‘8’] 998
Sea B = [ ‘3’] 3
suma(A, B) = [‘1’, ‘0’, ‘0’, ‘1’] 1 0 0 1
El método que se pide recibe como argumentos 2 List<Character>, y devuelve como
resultado otra lista de caracteres. La lista resultado tendrá el mínimo tamaño necesario para
contener el número; o sea, sin “ceros a la izquierda”.

Solución:

public static List<Character> suma1(List<Character> a, List<Character> b) {


List<Character> opA = invierte(a);
List<Character> opB = invierte(b);
List<Character> resultado = new ArrayList<Character>();

“Hay que cambiar, para cambiar es necesario saber, para saber es necesario aprender, y para
aprender es necesario hacer grandes sacrificios”
Guía de Laboratorio POO
Programación Digital
int mellevo = 0;
for (int i = 0; i < Math.max(a.size(), b.size()); i++) {
int na = i < a.size() ? opA.get(i) -'0' : 0;
int nb = i < b.size() ? opB.get(i) -'0' : 0;
int sp = na + nb + mellevo;
if (sp < 10) {
mellevo = 0;
} else {
sp %= 10;
mellevo = 1;
}
resultado.add((char) ('0' + sp));
}
if (mellevo > 0)
resultado.add('1');
return invierte(resultado);
}
private static List<Character> invierte(List<Character> x) {
List<Character> xx = new ArrayList<Character>();
for (int i = 0; i < x.size(); i++)
xx.add(x.get(x.size() -1 -i));
return xx;
}

Ejercicio 5: Permutaciones

Dada un String, escriba un método que devuelva una lista de String con todas las
permutaciones de los caracteres de la String de entrada.
Ejemplo:
permutaciones(“abc”)
devuelve: [ “abc”, “acb”, “bac”, “bca”, “cab”, “cba” ]

Para ello necesitará un método auxiliar


List<String> permutaciones(String prefijo, String datos) que, dado un prefijo y unos
datos a permutar, genera todas las combinaciones del mismo prefijo y las permutaciones
de los datos. El método es recursivo, y deja de llamarse a sí mismo cuando el
número de caracteres a permutar es 1.
Solución

public List<String> permutaciones(String datos) {


return permutaciones("", datos);
}
private List<String> permutaciones(String prefijo, String datos) {

“Hay que cambiar, para cambiar es necesario saber, para saber es necesario aprender, y para
aprender es necesario hacer grandes sacrificios”
Guía de Laboratorio POO
Programación Digital
List<String> salida = new ArrayList<String>();
if (datos.length() < 2) {
salida.add(prefijo + datos);
return salida;
}
for (int i = 0; i < datos.length(); i++) {
char c = datos.charAt(i);
String resto = datos.substring(0, i) + datos.substring(i + 1);
String prefijoExtendido = prefijo + c;
salida.addAll(permutaciones(prefijoExtendido, resto));
}
return salida;
}

Resultados Finales:

¿Qué nuevos comandos y/o sentencias ha aprendido?

“Hay que cambiar, para cambiar es necesario saber, para saber es necesario aprender, y para
aprender es necesario hacer grandes sacrificios”

También podría gustarte