30178521-Practicas S2
30178521-Practicas S2
30178521-Practicas S2
• Práctica 2:
• Reparto equitativo de activos (VA)
Normas
• Los estudiantes que tengan aprobadas ambas
prácticas en el curso anterior (sólo el anterior) no es
necesario que vuelvan a realizarlas en este curso.
• Para que el examen sea calificado el alumno deberá:
• haber asistido a las sesiones presenciales de prácticas
• haber entregado y aprobado las prácticas obligatorias
• Si se entregan y aprueban las prácticas en septiembre, hay que
presentarse necesariamente al examen de septiembre
Entrega
• Fechas
• Convocatoria de Febrero: 1 semana para corregir
• Domingo 19 de enero de 2020 (27/ene: Exámenes)
• Convocatoria de Septiembre:
• Domingo 23 de agosto de 2020
• Plataforma ALF
• Entrega de trabajos -> Apuntarse a grupo de prácticas
• Eclipse: File -> Export -> Java -> runnable Jar file
• Código: Errores a evitar
• No compila
• No está desarrollado en Java en la entrega
• No se corresponde con el libro
• No es original, está copiado
• No sigue un diseño OO encapsulado o modular
• Ejecutable:
• No termina
• Se queda sin memoria con ejemplos pequeños
• Aborta sin justificación
• No lee los ficheros previstos en el formato adecuado
• No trata los argumentos
• No se ajusta a las especificaciones
• Documentación:
• No se presenta como ha indicado el tutor
• Está incompleta
• Soporte:
• No se puede leer
• Contiene virus (Suspenso)
¿Dudas?
• Foros de debate de la asignatura en ALF
• Foro de la práctica
• Grupo de tutoría de Sevilla
• Se puede generalizar
… …
a un reparto en n subconjuntos
de igual valor
• https://www.geeksforgeeks.org/partition-set-k-subsets-
equal-sum/
Reparto equitativo dede activos
• x: vector activos
• suma1, suma2, sumaTotal: suma de
activos asignados a cada socio y el total
• Objetivo: ayudar a dos socios
• v: vectorque forman una
de asignaciones
sociedad comercial a disolverla, buscando todas las
formas de repartir en dos subconjuntos disjuntos
de igual valor sus n activos con valor entero
Falta (con suma2 también):
• Espacio de búsqueda:
suma1 suma1 árbol
- x[k+1] de grado 2 y altura n+1
cierto
cierto
cierto
falso
Coste
• El coste del caso peor es del orden del tamaño del
espacio de búsqueda
• Las funciones de poda que utilicemos reducen el
coste, aunque muchas veces no es posible saber
cuanto (depende de los datos), así que se da una
cota superior
Argumentos y parámetros
• Sintaxis:
• java reparto [-t][-h] [fichero_entrada] [fichero_salida]
• java -jar reparto.jar [-t][-h] [fichero_entrada] [fichero_salida]
• Argumentos:
• -t: traza cada paso de manera que se describa la aplicación del algoritmo utilizado
• -h: muestra una ayuda y la sintaxis del comando
Ejemplo:
$ java reparto -h <ENTER>
SINTAXIS:
reparto [-t][-h][fichero_entrada][fichero_salida]
-t Traza las llamadas recursivas
-h Muestra esta ayuda
fichero_entrada Nombre del fichero de entrada
fichero_salida Nombre del fichero de salida
• fichero_entrada: nombre del fichero del que se leen los datos de entrada
• Contiene el número de activos, seguido del valor de cada activo
• Si la entrada no es correcta, el programa debe indicarlo
• fichero_salida: es el nombre del fichero que se creará para almacenar la salida
• Si el fichero ya existe, el comando dará un error
• Si falta este argumento, el programa muestra el resultado por pantalla
Argumentos y parámetros
• Sintaxis:
• java
public class Reparto{ [-t][-h] [fichero_entrada] [fichero_salida]
mayoritario
• java –jar
… mayoritario.jar [-t][-h] [fichero_entrada] [fichero_salida]
public static void main(String[] args){
• Argumentos: switch (args.length){
• -t: traza cada paso de manera caseque se describa
0: //no la aplicación del algoritmo utilizado
hay argumentos
• -h: muestra una ayuda y la sintaxis break; del comando
Ejemplo: case 1: //args[0] puede ser –t, -h, fich_ent o fich_sal
$ java mayoritario -h <ENTER>
SINTAXIS: break;
mayoritario case
[-t][-2: //args[0] y args[1]
h][fichero_entrada][fichero_salida]
break;
-t Traza las llamadas recursivas
-h case 3: //args[0],
Muestra estaargs[1],
ayudaargs[2]
fichero_entrada break;
Nombre del fichero de entrada
fichero_salida Nombre delargs[1],
case 4: //args[0], ficheroargs[2],
de salida
args[3]
break;
• fichero_entrada: nombre del fichero del que se leen
default: //demasiados los datos de entrada
argumentos
• Contiene el número de elementos en el vector de enteros y el propio vector
break;
• Si la entrada no es correcta, el programa debe indicarlo
}
• Si no existe el fichero, se utilizará la entrada estándar
}
• fichero_salida:
… es el nombre del fichero que se creará para almacenar la salida
} • Si el fichero ya existe, el comando dará un error
• Si falta este argumento, el programa muestra el resultado por pantalla
Entrada / Salida
• Entrada
• El fichero de datos de entrada consta de 2 líneas con:
• El valor del parámetro n (número de activos)
• Los valores de los activos (sin ordenar) separados por
espacios
• Ejemplo:
10
10 9 5 3 3 2 2 2 2 2
• Salida
• La salida es:
• Una línea con el número de soluciones encontradas
• Tres líneas por cada solución:
• Identificador de la solución
• Los valores de los activos asignados al socio1
• Los valores de los activos asignados al socio2
• Ejemplo (correspondiente al ejemplo de entrada):
Código auxiliar
Fragmentos de código Java que pueden ser útiles
Lectura de ficheros en java (I)
• Lectura de un fichero de texto línea a línea:
BufferedReader bf = new BufferedReader(new FileReader(nomFich));
String linea = bf.readLine();
// Si no quedan datos en el fichero, linea será null