今日も昼過ぎに研究室へ。
C言語でカレンダーを表示させるプログラムを作った。
祝日も対応のなかなか便利なカレンダーです!
使い方は第一引数に年、第二引数に月を入れて実行

#include <stdio.h>
#include <string.h>

int main();
int zeller(int,int,int);

/* 第1引数:年 第2引数:月 */
int main(int argc,char *argv[]){
  int i,youbi,day,y = atoi(argv[1]),m = atoi(argv[2]);
  int flag=0; // 連休判定Flag

  printf("\n\t\tYear:%d Month:%d\n\n\x1b[;31mSun\x1b[;0m\tMon\tTue\tWed\tThu\tFri\t\x1b[;34mSat\x1b[;0m\n",y,m);

  /* 日数を設定 */
  if(m == 2){
    if(y%400 == 0 || (y%100 != 0 && y%4 == 0)){
      day = 29;
    }
    else{
      day = 28;
    }
  }
  else if(m == 4 || m == 6 || m == 9 || m == 11){
    day = 30;
  }
  else{
    day = 31;
  }

  /* 1日の曜日を求めます */
  if(m == 1 || m == 2){
    youbi = zeller(y-1,m+12,1);
  }
  else{
    youbi = zeller(y,m,1);
  }

  for(i=1;i<=day+youbi;i++){ //day+youbi回ループさせる    // (i-youbi)が日付、(i-1)%7が曜日となる
    if(i-youbi<1){printf("\t");} //1日までタブ    else{
      if(hantei(y,m,i-youbi,(i-1)%7) == 2){
        printf("\x1b[;31m");
        printf("(%d)\t",i-youbi);
        printf("\x1b[;0m");
      flag = 1; // 日曜と祝日が重なったらflagをたてる
      }
      else if(hantei(y,m,i-youbi,(i-1)%7) == 1 || flag == 1){
        printf("\x1b[;31m");
        printf("(%d)\t",i-youbi);
        printf("\x1b[;0m");
        flag = 0;
      }
      else if((i-1)%7 == 6){ // 土曜日
        printf("\x1b[;34m");
        printf("%d\t",i-youbi);
        printf("\x1b[;0m");
      }
      else{
        printf("%d\t",i-youbi); //日付を出力
        flag = 0;
      }
      if((i-1)%7 == 6){printf("\n");} //土曜のあとは改行
    }
  }
  return 0;
}

/* Zellerの公式 */
int zeller(int y,int m,int d){
  return ((y + (int)(y/4) - (int)(y/100) + (int)(y/400) + (int)(2.6*m + 1.6) + d) % 7);
}

/* 祝日判定関数(祝日なら0以外を返す) */
int hantei(int y,int m,int d,int youbi){

  if((m==3 && d== (int)(20.8431 + 0.242194*(y-1980) - (y-1980)/4)) // 春分の日
     || (m==9 && d== (int)(23.2488 + 0.242194*(y-1980) - (y-1980)/4)) // 秋分の日
     || (m==1 && d==1) // 元旦
     || (m==1 && d>7 && d<15 && youbi==1) // 成人の日
     || (m==2 && d==11) // 建国記念日
     || (m==4 && d==29) // みどりの日
     || (m==5 && d==3) // 憲法記念日
     || (m==5 && d==4) // 国民の祝日
     || (m==5 && d==5) // 子供の日
     || (m==7 && d>14 && d<22 && youbi==1) // 海の日
     || (m==9 && d>14 && d<22 && youbi==1) // 敬老の日
     || (m==10 && d>7 && d<15 && youbi==1) // 体育の日
     || (m==11 && d==3) // 文化の日
     || (m==11 && d==23) // 勤労感謝の日
     || (m==12 && d==23))// 天皇誕生日
  {
    if(youbi == 0){// 日曜と休日が重なった処理
      return 2;
    }
    else{
      return 1;
    }
  }
  if(youbi == 0){ // 日曜日
    return 1;
  }
  return 0;
}