Solución a la Tarea 2: Día de la semana
Esta tarea consistía básicamente de traducir el algoritmo
dado a C. Aún así, la tarea contaba con al menos una
parte que no era obvia, la cual era la de cómo lidiar con los
números negativos o mayores que 7 que aparecen a la salida. El
primer lugar donde hay problema es en la fórmula f = (b + e + d
- 2c) mod 7, pues a veces b + e + d < 2c y la resta resulta
negativa. Para arreglar esto, basta notar que al sumar cualquier
múltiplo de 7 a un número no cambia el residuo
módulo 7, por lo tanto, basta sumar 7c para obtener la nueva
fórmula f = (b + e + d + 5c) mod 7. El segundo lugar donde hay
problema es al restar o sumar uno al valor de f calculado. Una forma de
resolver esto es explícitamente preguntar si f = 0 entonces la
respuesta debe ser 6 al restar y si f = 6 la respuesta debe ser 0 al
sumar. En el programa de abajo mostramos otra forma.
¿Porqué funciona?
#include
<stdio.h>
int main(void)
{
int a, b, c, d, e, f, m;
scanf("%d%d%d", &a, &m, &d);
if (m > 2)
m = m - 2;
else {
m = m + 10;
a = a - 1;
}
c = a / 100;
e = a % 100;
b = (13*m - 1)/5 + e/4 + c/4;
f = (b + e + d + 5*c) % 7;
printf("%d %d %d\n", (f+6) % 7, f, (f+1) % 7);
return 0;
}
Los valores de entrada y salida empleados para la evaluación
fueron los siguientes:
Entrada
Salida
2005 5 23 0 1 2
0 1 1 6 0 1
123 4 5 0 1 2
6789 10 11 2 3 4
1234 5 6 5 6 0
789 10 11 2 3 4
2000 2 29 1 2 3
2100 2 28 6 0 1
9999 9 9 3 4 5
10000 12 31 6 0 1
Para probar su tarea en UNIX, escriban la instrucción gcc diasemNN.c -o diasem para
compilar su programa, y la instrucción ./diasem para correrlo.
Algunos errores comúnes fueron: (a) Ignorar los números
negativos que aparecen en la fórmula de f. (b) Ignorar que no
existen ni el día -1 ni el día 7, según la
definición.
Además, les recuerdo que
sólo deben enviar el archivo .c y que éste debe tener el
nombre correcto.