Preguntas frecuentes


posted on Oct. 12, 2021, 12:03 a.m.
Mi programa funciona en Dev-C++ pero no en el JUEZ

Comprueba que no estés sacando por pantalla texto que no se corresponda con el enunciado. El juez compara lo que sale por pantalla con los ejemplos de referencia como los que se muestran en los enunciados.

El error típico es mostrar mensajes como "Introduca el número" o mostrar algún tipo de cabecera sobre el programa.

La solución más rápida es comentar o eliminar los printf superfluos. También se pueden utilizar directivas de compilación condicional (apéndice A del tema 4) para conseguir un programa legible para personas y para jueces:

#include <stdio.h>

int main(){
    int d;
    #ifndef ONLINE_JUDGE
    printf("Introduzca el número:");
    #endif
    scanf("%d", &d);
}

Como el JUEZ compila los programas con la macro "ONLINE_JUDGE" definida, el mensaje no se mostrará en el mismo, pero sí lo hará en nuestro local (salvo que modifiquemos, claro, las opciones de compilación).

Me sale una advertencia sobre que se ignora el valor de retorno de una función

Las advertencias no son errores, un código puede ser correcto pese a ellas, pero conviene entender su significado para conocer las mejores prácticas de programación.

El caso más típico en que ocurre es al leer datos con scanf, como en este ejemplo:

sumaparesc.c:8:2: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&n1,&n2);

La función scanf devuelve como resultado un valor entero, que es el número de argumentos que se han leído con éxito. En el ejemplo anterior, si la entrada del usuario es consistente con el formato indicado se devolverá el valor 2. Esto podría utilizarse en nuestro programa para controlar si la ejecución es correcta, volver a pedir los datos, indicar el error...

El siguiente ejemplo muestra cómo podrímos utilizar este valor para leer un entero, insistiendo hasta que el usuario introduzca un valor para el mismo:

int d;
printf("Introduzca un entero: ");
while (scanf("%d",&d)!=1){
    printf("Error, introduzca un entero: ");
    scanf("%*[^\n]"); // Leemos hasta el salto de línea para eliminar lo que hubiera en buffer
}

Al trabajar con el juez se supone, salvo que el enunciado indique lo contrario, que la entrada cumple con el formato indicado, por lo que no habrá que preocuparse por esta advertencia y no hace falta utilizar estrategias como la indicada antes.

La cantidad de advertencias que se muestran dependen del compilador y de la configuración de este. En este sentido, podéis esperar que el juez sea más quisquilloso que Dev-C++ con la configuración por defecto.


Comentarios

No hay comentarios por el momento.