Download Contenido - WordPress.com

Document related concepts
no text concepts found
Transcript
Errores Comunes en el juez
Contenido
Introducción
Veredictos del juez
Error de compilación
Error en tiempo de ejecución
Respuesta incorrecta
Tiempo límite excedido
Errores de lectura
Scanner
BufferedReader
Estructuras de datos
Pagina 1 de 10
Errores Comunes en el juez
Introducción
Este documento explica la dinámica de juzgamiento de la mayoría de jueces Online
además del juez utilizado en Estructuras de datos (DomJudge). También recopila una
lista de los errores más comunes que generan juzgamientos de "Compilation Error",
"Runtime Error" y "Time limit exceeded".
Estructuras de datos
Pagina 2 de 10
Errores Comunes en el juez
Veredictos del juez
Error de compilación (Compilation Error)
Algunos situaciones, sobre todo cuando se está empezando a utilizar el juez, ocurren errores
que se apartan de la estrategia de solución y están más bien alineados con la falta de
experiencia a la hora de usar el lenguaje y lograr que se adecúe a las reglas propuestas por el
juez. A continuación se enumeran algunas de estas situaciones que son recurrentes a la hora
de utilizar el juez.
●
Escribir caracteres especiales (ñ, Ñ á, é, í, ó , ú, etc) en comentarios, nombres de
variables del tipo “año”,”niño”, “tamaño” etc. En general, caracteres como estos no
deben usarse en ninguna parte de un archivo fuente. Para evitar este error, una buena
práctica es "programar en inglés”.
Ejemplo:
public class Test {
public static void main(String[] args) {
int tamaño = 0;//Runtime Error
//no se reconoce el caracter 'ñ'
//el uso de tildes en un comentario podr'í'a
//generar errores
}
}
Solución:
Eliminar las tildes y demás caracteres especiales (Ñ, ñ, ...) del archivo fuente.
Estructuras de datos
Pagina 3 de 10
Errores Comunes en el juez
●
"Empaquetar" la solución, es decir, usar declaraciones de paquete en el archivo fuente;
ejemplo: package Proyecto 1. No se debe usar la de paquete. La mejor manera de usar
Eclipse para Java es creando un proyecto, no hacer ningún paquete y crear las clases
en el paquete por defecto, es decir, dando click derecho sobre el proyecto creado >>
nueva clase >> crear la clase.
Ejemplo:
package Proyecto1;//Runtime
//en el juez no se encuentra el paquete “Proyecto1”
public class Test {
public static void main(String[] args) {
for( int i = 0 ; i < 1000000; i++ )
System.out.println("No debo usar paquetes");
}
}
●
Debe enviarse uno y solo un archivo fuente: un archivo con extensión java. El nombre
del archivo y de la clase pública que debe ser la que tenga el método main.
● Enviar proyectos completos comprimidos; se debe enviar sólo un archivo fuente (.java).
Si utilizan algún tipo de herencia y tienen varias clases, se deben anidar en una sola
clase .java antes de enviar ya que el juez no les permitirá subir más que un archivo.
Para esto, debe haber tan solo una clase principal y dentro de ésta se incluyen las
demás clases anidadas y se declaran como “static”.
● Intentar abrir archivos de entrada cuando no se pide. Es decir, abrir un archivo que
puede que exista en nuestro computador pero a la hora de ser ejecutado en el juez no
lo encuentra en el servidor.
Ejemplo:
import java.io.File;
public class Test {
public static void main(String[] args) {
File f = new File("entrada.txt");//Runtime Error
//al llegar al juez no se encuentra el archivo
//"entrada.txt" y se genera una excepcion
}
}
Estructuras de datos
Pagina 4 de 10
Errores Comunes en el juez
●
Importar paquetes o clases no estándar, por ejemplo: Cuando queremos utilizar la clase
“List”:
import com.sun.xml.bind.v2.schemagen.xmlschema.List;
●
La clase con el "basename" (en el único archivo a enviar) debe ser pública y además
tener un método main estándar de Java; ejemplo: para “ProblemaA.java”:
Si se desea utilizar un método dentro del main se puede hacer uso de los métodos
estáticos o crear un objeto de la clase dentro del Main para así poder llamar variables y
métodos.
Error en tiempo de ejecución (Runtime Error)
Defectos en la lógica o en la implementación de una solución enviada al juez pueden resultar
en "Runtime Error" (o error en tiempo de ejecución). Algunos de los más comunes se
enumeran a continuación:
●
Índices de arreglos o colecciones o cadenas inválidos, ejemplo, intentar acceder a la
posición -20 de un arreglo, o a la posición 100 cuando el arreglo (o cadena o colección
o contenedor) tiene 10 elementos, el último estará en la posición 9.
Ejemplo:
public class Test {
public static void main(String[] args) {
int a[] = new int[10];
System.out.println(a[100]);//Runtime Error
//Se accede a una posicion del arreglo que no existe( la 100)
}
}
A continuación se muestra la tabla de valores de cuanto soporta un programa java estándar:
Estructuras de datos
Pagina 5 de 10
Errores Comunes en el juez
int
10^7 valores
float, double
10^7 valores
char
5*(10^7) valores
boolean
10^8 valores
●
Recursiones sin casos base o casos base que no tienen en cuenta algunos valores de
entrada.
Ejemplo:
public class Test {
public static void main(String[] args) {
System.out.println(fibo(-3));//Runtime Error
//En este caso, quedara en un ciclo infinito
//debido a que el caso base no contempla negativos
}
public static int fibo(int n) {
if (n == 0 || n == 1)
return 1;
return fibo(n - 1) + fibo(n - 2);
}
}
Estructuras de datos
Pagina 6 de 10
Errores Comunes en el juez
●
Intentar usar más memoria de la permitida.
Ejemplo:
public class Test {
public static void main(String[] args) {
int n = 1000000000;
int a[] = new int[n];//Runtime Error
//se desborda la memoria permitida para el programa
}
}
● Apuntadores o referencias no inicializadas o usadas siendo nulas.
Ejemplo:
public class Test {
public static void main(String[] args) {
String s = null;
int len = s.length();//Runtime Error
//acceder a un metodo o variable de una clase
//que no ha sido instanciada
}
}
●
Cualquier excepción sin capturar.
●
Intentar transformar una cadena que no es una representación válida de un entero a
entero (sobre todo en java).
Estructuras de datos
Pagina 7 de 10
Errores Comunes en el juez
Ejemplo:
public class Test {
public static void main(String[] args) {
String a = "abc123";
int number = Integer.parseInt(a);//Runtime Error
//convertir valores a tipos invalidos
}
}
●
En Java, usar ventanas emergentes como las que facilita JOptionPane en java para
pedir o mostrar datos o elementos de interfaz gráfica.
Respuesta incorrecta (Wrong Answer)
Algunos situaciones comunes producen "Wrong Answer" a pesar de que la solución
algorítmica parece ser la correcta:
●
Interactuar con un "usuario" por medio de mensajes para que este ingrese datos. Tenga
en cuenta que la calificación se hace de manera semiautomática, donde se
redireccionan datos de un archivo de pruebas preestablecido para que el programa a
juzgar los tome de la entrada estándar. La salida producida por el programa a juzgar es
entonces comparada automáticamente con el archivo de salida preestablecido con los
jueces. Nunca los jueces van a ingresar datos “a mano”.
Estructuras de datos
Pagina 8 de 10
Errores Comunes en el juez
Ejemplo:
Si nos piden leer un número e imprimir el cuadrado del mismo, a la izquierda se muestra un
error común y a la derecha la forma correcta de hacerlo.
import java.util.Scanner;
import java.util.Scanner;
public class Test {
public class Test {
public static void main(String[] args) {
Scanner scan
public static void main(String[] args) {
= new Scanner(System.in);
Scanner scan
= new Scanner(System.in);
//Wrong Answer por imprimir valores que
int n = Integer.parseInt(scan.nextLine());
//no tienen que ver con la salida
System.out.println(n*n);
System.out.println("ingrese un valor");//error
int n = Integer.parseInt(scan.nextLine());
}
}
System.out.println(n*n);
}
}
●
●
●
No eliminar código usado en la depuración de una solución, que finalmente imprimirá
mensajes de depuración en la salida estándar y que seguramente generará diferencias
entre la salida esperada y la generada. Recuerde antes de enviar probar que la salida
solo muestra lo que se pide en el problema.
Imprimir saltos de línea, espacios o tabulaciones de más, o no imprimirlos donde/como
lo exige el enunciado del problema.
Resolver el problema para un solo caso. Generalmente, en los problemas se pide que
resuelvan varios casos en una sola ejecución. Para evitar esto se debe leer con cuidado
la descripción de entrada que tendrá el problema y la descripción de salida exigida.
Tiempo de ejecución excedido(Time limit exceeded)
Algunos situaciones que producen "Time Limit Exceeded" en el juez:
●
En la inmensa mayoría de casos, este veredicto es producido porque se tiene un
algoritmo ineficiente. Es decir, puede que la solución sea correcta, pero toma
demasiado tiempo en resolver el problema. En estos casos, se deben hacer
optimizaciones o plantear un algoritmo diferente. Una recomendación a tener en cuenta
es asumir que se tiene disposición de aproximadamente 100.000.000 de operaciones
Estructuras de datos
Pagina 9 de 10
Errores Comunes en el juez
elementales por segundo y que se dispone entre 1 y 5 segundos para la ejecución de
un programa que resuelve un problema.
●
Usted puede asumir que un ciclo while o for desde 0 hasta 10^7 haciendo operaciones
como: suma, resta, multiplicación, división, asignación puede tardar 1 segundo en
ejecutar en el juez. Si su algoritmo por ejemplo tiene 2 ciclos de 0 a 10000 el tiempo
esperado de ejecución es de 10 segundos lo cual ya es demasiado para resolver un
problema como los usados en el juez.
Errores de lectura
Scanner
●
Lectura de un entero y luego una cadena, al realizar esto utilizando Scanner y el método
nextInt() se puede caer en un error que muchas veces es difícil de detectar.
Estructuras de datos
Pagina 10 de 10