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.