落書きノート

ふと自分が気になった事を書いてます

C言語でカレンダー計算(閏年対応)

閏年に対応させても大体しかできなかったのですが、一応、1月と2月以外はできてます。

#include <stdio.h>

int days[][12] = {
  {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
  {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
};

int week(int y, int m, int d) {
  return (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d) % 7;
}

int isleap(int year) {
  return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

int main(void) {
  char buf[1000];
  int year,month;
  int space;
  
  printf("年と月を入力してください。\n");
  fgets(buf, sizeof(buf), stdin);
  sscanf(buf, "%d%d", &year, &month);
  space = week(year, month, 1);

  int i,j,p = 1;

  printf("日 月 火 水 木 金 土\n");
  for(i = 0; i < space; i++) {
    printf("   ");
  }
  for(i = 0; i < 7 - space; i++,p++) {
    printf("%2d ", i + 1);
  }
  puts("");
  for(i = 0; i < days[isleap(year)][month - 1] / 7; i++) {
    for(j = p; j < p + 7; j++) {
      if(days[isleap(year)][month - 1] >= j)
        printf("%2d ", j);
    }
    p += 7;
    puts("");
  }
  for(i = p; i <= days[isleap(year)][month - 1]; i++) {
    printf("%2d ", i);
    if(i == days[isleap(year)][month - 1])
      puts("");
  }
  
  return 0;
}

また思いついたらプログラム、作ってみます。