Interrogación 3 - Secciones 2 y 4 - Bachillerato

Anuncio
Pontificia Universidad Católica de Chile
Escuela de Ingenierı́a
Departamento de Ciencia de la Computación
11 de Junio de 2009
IIC1102 — Introducción a la Programación
Interrogación 3 - Secciones 2 y 4 - Bachillerato
Profesoras: Claudia Navarrete y Carla Vairetti
Importante:
Tiempo de duración dos horas.
Lea atentamente el enunciado.
1. (30 %) Archivos
El sistema web BookFace gestiona el contacto online entre amigos. Este sistema maneja en archivos
las listas de amigos de cada uno de sus usuarios de la siguiente manera: en un archivo con el nombre
del usuario guarda una lista con los nombres de todos los amigos que posee ese usuario, cada uno en
una linea por separado sin repetirse.
Por ejemplo el archivo ‘‘Claudia Navarrete.txt’’ podrı́a ser el siguiente:
Carla Vairetti
Yadran Eterovic
Federico Meza
Maria Sylvia Campos
Fernanda Campos
Jorge Perez
Usted debe implementar:
a) Método public boolean buscarAmigo(String usuario, String amigo) que retorna true si
el amigo es amigo de usuario y false en caso contrario.
b) Método public boolean agregarAmigo(String usuario, String amigo) que agrega amigo al
archivo que almacena la lista de amigos de usuario, retorna true si pudo agregarlo correctamente,
y false en caso contrario.
c) Método public int contarAmigos(String usuario) que retorna el número de amigos que pertenecen a la lista de amigos de usuario.
Solución:
import java.io.*;
public class Principal {
public static void main(String[] args) throws IOException {
boolean buscar = buscarAmigo("Claudia Navarrete", "Paula Navarrete");
System.out.println("buscar: "+buscar);
boolean agregado = agregarAmigo("Claudia Navarrete", "Paula Navarrete");
System.out.println("Agregado: "+agregado);
int nAmigos = contarAmigos("Claudia Navarrete");
System.out.println("Numero Amigos: "+nAmigos);
boolean borrado = borrarAmigo("Claudia Navarrete", "Paula Navarrete");
System.out.println("Borrado: "+borrado);
}
/* 0.2 por el throws IOException */
public static boolean buscarAmigo(String usuario, String amigo) throws IOException {
/* 0.3 declara variable tipo FILE */
File archivo = new File(usuario + ".txt");
/* 0.3 manejo de inxistencia de archivo (crearlo o return false */
if (!archivo.exists())
archivo.createNewFile();
/* 0.2 por FileReader y/o BufferedReader*/
FileReader reader = new FileReader(archivo);
BufferedReader amigos = new BufferedReader(reader);
/* 0.3 obtener cada amigo */
String linea = amigos.readLine();
/* 0.2 condicion de termino */
while (linea != null) {
/* 0.3 encontrar al amigo y retornar true */
if (linea.compareToIgnoreCase(amigo) == 0)
return true;
/* 0.2 actualizacion condicion */
linea = amigos.readLine();
}
return false;
}
/* 0.2 por el throws IOException */
public static boolean agregarAmigo(String usuario, String amigo) throws IOException {
/* 0.1 declara variable tipo FILE */
File archivo = new File(usuario + ".txt");
/* 0.3 manejo de inxistencia de archivo (crearlo o return false */
if (!archivo.exists())
archivo.createNewFile();
/* 0.5 no encontrar al amigo en la lista y return false
if(!buscarAmigo(usuario,amigo)){
*/
/* 0.2 por FileReader y/o BufferedReader*/
FileWriter writer = new FileWriter(archivo, true);
BufferedWriter listaAmigos = new BufferedWriter(writer);
/* 0.3 escribir el amigo en una linea independiente */
listaAmigos.write("\n" + amigo);
/* 0.3 Cerrar archivos */
listaAmigos.close();
writer.close();
/* 0.1 retornar true */
return true;
}
return false;
}
/* 0.2 por el throws IOException */
public static int contarAmigos(String usuario) throws IOException{
/* 0.1 declara variable tipo FILE */
File archivo = new File(usuario + ".txt");
/* 0.2 Setear contador en 0 */
int nAmigos = 0;
/* 0.3 manejo de inxistencia de archivo (crearlo o return false */
if (!archivo.exists())
archivo.createNewFile();
/* 0.2 por FileReader y/o BufferedReader*/
FileReader reader = new FileReader(archivo);
BufferedReader amigos = new BufferedReader(reader);
String linea = amigos.readLine();
/* 0.3 ciclo que recorre el archivo */
while (linea != null) {
/* 0.3 aumentar contador */
nAmigos++;
/* 0.2 Actualizar condicion
linea = amigos.readLine();
*/
}
/* 0.2 retornar numero de amigos*/
return nAmigos;
}
2. (35 %) Recursión
a) Programar un algoritmo recursivo que permita sumar los dı́gitos de un número.
Hint: Comience sumando los dı́gitos de derecha a izquierda, siempre las unidades primero.
Ejemplo: número 123 debe dar como resultado 6, es 3 + 2 + 1.
Solución:
/* 1 pto declaración método */
public int sumar_dig(int n){
/* 1 pto caso base */
if (n == 0)
//caso base
return n;
/* 1 pto caso recursivo */
else
return sumar_dig (n / 10) + (n % 10);
}
b) Algoritmo de Euclides para calcular el Máximo Común divisor (MCD):
Sean a y b dos números enteros. Al dividir a entre b se obtiene un cociente q y un residuo r.
El algoritmo de Euclides dice que el MCD entre a y b es el mismo que entre b y r. Este es el
fundamento principal del algoritmo. También es importante tener en cuenta que el MCD entre
cualquier número a y 0 es precisamente a.
Escriba un método recursivo que implemente el algoritmo de Euclides. El método recibe como
parámetros los números para los que se va calcular el MCD y retorna el MCD entre los dos números.
Solución:
/* 1 pto declaración método */
public int sacar_mcd(int a, int b) {
/* 1 pto caso base */
if(b==0)
//caso base
return a;
/* 1 pto caso recursivo */
else
return sacar_mcd(b, a % b);
}
3. (35 %) La abeja que come polen
Una abeja recorre un árbol con flores recolectando miel. El árbol se representa mediante una matriz de
enteros, donde cada posición de la matriz representa una flor del árbol. El valor almacenado en cada
posición de la matriz representa la cantidad de polen que la flor tiene (en gramos).
En cada unidad de tiempo la abeja toma un gramo de polen de la flor en la que se encuentra y luego
decide si le conviene cambiarse a una flor vecina, se cambia siempre y cuando alguna de las flores
vecinas tenga más miel que la flor en la que se encuentra actualmente, la abeja sólo se puede mover a
la flor que se encuentra inmediatamente a la derecha o hacia abaja. Considere que la matriz se comporta en forma circular, es decir cuando llega al borde inferior, y debe ir hacia abajo continúa en la
primera fila, y cuando llega al borde derecho y debe ir hacia la derecha continúa en la primera columna.
La abeja decide dejar de comer e irse al panal a convertir el polen en miel cuando transcurren tres
unidades de tiempo en las que no ha podido comer. Por cada gramo de polen recolectado se obtiene
0, 8 ml de miel; de la cantidad de polen inicial se descuenta 0, 1 gramos de polen que la abeja utiliza
para moverse en cada unidad de tiempo.
Escriba el método Simula-Abeja que reciba como parámetro la matriz que representa el arbol y que
simule la recolección de miel que realiza la abeja sobre el campo. El método debe imprimir, luego de
la simulación la cantidad de polen recolectado y la cantidad de miel generada.
Solución:
public static void Simula_Abeja(int campo [][]){
/* 0.5 Setear variables relevantes en 0 */
int polen=0;
int x=0;int y=0;
int t=0;
int t_sin_comer=0;
//mientras no pasen tres iteraciones consecutivas sin comer
/* 0.5 ciclo principal de tres turnos sin comer */
while(t_sin_comer<=3) {
/* 0.5 encontrar comida o no */
if (campo[x][y]>0){ // si la celda tiene comida
/* 0.5 aumentar polen */
polen++;
// come y
/* 0.5 disminuir comida */
campo[x][y]--; // disminuye la contidad de miel en el campo
/* 0.5 resetear tpo sin comer */
t_sin_comer=0; // se inicializa tiempo sin comer
} else
/*0.5 aumentar tpo sin comer */
t_sin_comer++; // en caso contrario se incrementa el tiempo sin comer
// determina alternativas área proxima posicion
// la abeja sólo se mueve hacia abajo o hacia la deracha
// se recorre el tablero en forma circular
/* Determinar nueva posicion 1 pto */
int x1,y1;
x1= (x+1)%campo.length;
y1= (y+1)%campo[0].length;
// determina posición con mayor comida d: derecha, a_ abajo [OPCIONAL]
int nx, ny, max_miel;
nx=x; ny=y;
max_miel= campo[x][y];
if (campo[x] [y1] >max_miel){nx=x ;ny=y1;max_miel=campo[nx][ny];}
if (campo[x1 ][y] >max_miel){nx=x1;ny=y ;max_miel=campo[nx][ny];}
x=nx; y=ny;
t++;
}
/* 0.5 Imprimir cantidad polen recolectado */
System.out.println("polen:"+polen); // cantidad de miel comida
/* 0.5 Imprimir cantidad miel generado */
System.out.println("miel:"+ ((polen-0.1*t)*0.8); // cantidad de miel generada
}
Descargar