C言語を使って現在時刻を十二支を使った時刻で表示するプログラムを作った。
平成も終わろうとしているが、日本では明治以前、時刻はお昼の12時なら午(うま)の刻とか言っていたのだ。(現在も正午というのはこの午の刻から来ている)
十二支の時刻表はこんな感じ
| 時刻 | 十二支の時刻 |
|---|---|
| 午前0時~ | 子(ね) |
| 午前2時~ | 丑(うし) |
| 午前4時~ | 寅(とら) |
| 午前6時~ | 卯(う) |
| 午前8時~ | 辰(たつ) |
| 午前10時~ | 巳(み) |
| 午後12時~ | 午(うま) |
| 午後14時~ | 未(ひつじ) |
| 午後16時~ | 申(さる) |
| 午後18時~ | 酉(とり) |
| 午後20時~ | 戌(いぬ) |
| 午後22時~ | 亥(い) |
詳しくは以下のページを参照(面白おかしく書いてあります)
プログラムはこちら
eto_jikoku.c
/* eto_jikoku.c: 現在時刻を干支の時刻で表示 */
#include <stdio.h>
#include <time.h>
int main(void)
{
int i;
int hour, minute;
char eto[][32] = {"子(ね)", "丑(うし)", "寅(とら)", "卯(う)", "辰(たつ)", "巳(み)", "午(うま)", "未(ひつじ)", "申(さる)", "酉(とり)", "戌(いぬ)", "亥(い)"};
time_t timer;
struct tm *local;
/* 現在時刻を取得し地方時に変換 */
timer = time(NULL);
local = localtime(&timer);
/* 現在時刻を取得 */
hour = local->tm_hour;
minute = local->tm_min;
printf("\n%d:%d\n", hour, minute);
/* 十二支の時刻で表示 */
for(i=0; i<24; i+=2){
if(hour >=i && hour <=i+1){
printf("%sの刻\n", eto[i/2]);
break;
}
}
return 0;
}
実行イメージ
12:27
午(うま)の刻
時刻表示はtime_t型(中身はunsigned long型)の変数とstruct tm構造体を使って取得できる。
localtime関数を使うと現地時刻に変換される。そのままだとグリニッジ標準時が表示されてしまうため利用する。
time_t timer; struct tm *local; /* 現在時刻を取得し地方時に変換 */ timer = time(NULL); local = localtime(&timer);
十二支の時刻表示部分は、先ほどの表から、2時間毎に干支が変わることを利用して以下のfor文にまとめた。
for(i=0; i<24; i+=2){
if(hour >=i && hour <=i+1){
printf("%sの刻\n", eto[i/2]);
break;
}
}
時刻は、0, 2, 4, 6 …と変化するので、カウンタ変数iを利用し、配列の添え字は変数iを2で割って0, 1, 2, 3 …としてうまくまとめることができた。
ところで、十二支の時刻は2時間ごとに時刻が変わる。
なんてゆったりとした時間が流れていたんだなあと思ってしまう。
時刻の刻(こく)はきざむとも読む。印を刻んだ日時計からきた言葉だと聞いた。


コメント