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