カレンダー(今年1月〜12月, 前年次年リンク付)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> void print_calendar(void) { int y, m, i, year, startwday, endmday; int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /* 1月〜12月の日数 */ int count = 0; char *query; time_t timer; struct tm *date; timer = time(NULL); date = localtime(&timer); year = date->tm_year + 1900; /* 今年 */ if((query = getenv("PATH_INFO")) != NULL) { /* 年取得 */ if(strlen(query) >= 2) { year = atoi(query + 1); } } if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { /* うるう年 */ days[1]++; /* 2月の日数を1日増やす */ } y = year - 1; startwday = (y + y / 4 - y / 100 + y / 400 + (13 * 13 + 8) / 5 + 1) % 7; /* 1月1日の曜日 */ printf("<table align=\"center\" cellpadding=\"7\">\n"); printf("<tr>\n"); printf("<td><small><a href=\"%s/%d\">%d≪</a></small></td>\n", getenv("SCRIPT_NAME"), year - 1, year - 1); printf("<th colspan=\"2\"><big>%d</big><small>年</small></th>\n", year); printf("<td align=\"right\"><small><a href=\"%s/%d\">≫%d</a></small></td>\n", getenv("SCRIPT_NAME"), year + 1, year + 1); printf("</tr>\n"); for(m = 0 ; m < 12 ; m++) { /* 1月〜12月のカレンダー表示 */ if(m % 4 == 0) { printf(" <tr>\n"); } endmday = days[m]; /* 最後の日 */ count = 0; printf(" <td valign=\"top\">\n"); printf("<table border=\"2\" bordercolor=\"#ff9933\" cellspacing=\"0\" cellpadding=\"5\">\n"); printf("<tr>\n"); printf("<th colspan=\"7\"><big>%d</big><small>月</small></th>\n", m + 1); printf("</tr>\n"); printf("<tr>\n"); printf("<td align=\"center\"><small style=\"color:red\">日</small></td>\n"); printf("<td align=\"center\"><small>月</small></td>\n"); printf("<td align=\"center\"><small>火</small></td>\n"); printf("<td align=\"center\"><small>水</small></td>\n"); printf("<td align=\"center\"><small>木</small></td>\n"); printf("<td align=\"center\"><small>金</small></td>\n"); printf("<td align=\"center\"><small style=\"color:blue\">土</small></td>\n"); printf("</tr>\n"); for(i = 0 ; i < startwday; i++) { /* 1日までの空欄 */ if(count % 7 == 0) { printf("<tr>\n"); } printf("<td> </td>\n"); count++; } for(i = 1 ; i <= endmday; i++) { /* 日付を表示 */ if(count % 7 == 0) { printf("<tr>\n"); } printf("<td align=\"right\"", i); if(count % 7 == 0) { printf(" style=\"color:red\"", i); } else if(count % 7 == 6) { printf(" style=\"color:blue\"", i); } printf(">%d</td>\n", i); count++; if(count % 7 == 0) { printf("</tr>\n"); } } startwday = count % 7; /* 次月1日の曜日 */ while(count < 42) { /* 最後の日からの空欄 */ printf("<td> </td>\n"); count++; if(count % 7 == 0) { printf("</tr>\n"); } } printf("</table>\n"); printf(" </td>\n"); if(m % 4 == 3) { printf(" </tr>\n"); } } printf("</table>\n"); } int main(void) { printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<head>\n"); printf("<title>カレンダー</title>\n"); printf("</head>\n"); printf("<body>\n"); print_calendar(); printf("</body>\n"); printf("</html>\n"); return 0; }
〔 実行する 〕