今年は、あと何日だろう? と、残り日数を表示するプログラムを
ざざっと書いてみました。
Javaでも良かったんですが、C言語です。
time(NULL)で実行時のシリアル秒を得て(jt)、年月日形式に変換し(ltm)/* restdays.c 今年の残り日数を表示する 引数無し
by H.Magami */
#include <time.h>
#include <stdio.h>
#define SSS (24*60*60)
int main(int ac, char *av[]) {
time_t t,jt;
struct tm ltm0;
struct tm *ltm;
int dd,mn,yy;
jt=time(NULL);
ltm=<m0;
ltm=localtime_r(&jt,ltm);
dd=ltm->tm_mday; mn=(ltm->tm_mon) + 1;
yy=(ltm->tm_year) + 1900;
ltm->tm_sec = ltm->tm_min = ltm->tm_hour = 0;
ltm->tm_mday=1;
ltm->tm_mon=0;
++(ltm->tm_year);
t=mktime(ltm)-jt;
printf("Rest %d days (%d-%d-%d)\n",t/SSS,yy,mn,dd);
return 0;
}
月日、時分秒を0にして、年を+1 して、mktime()でシリアル秒に変換(t)。
tとjtの差(秒)を日にちに直して表示して終わり。
上記ソースを例えば、restdays.c という名で保存して
$ gcc -o restdays restdays.c
で、コンパイル。
$ ./restdays で実行します。
実行すると、
という感じの表示が出ます。$ ./restdays
Rest 120 days (2009-9-2)
mktimeにかける月日を、誕生日や記念日、納期などに変更して
カウントダウンにするのも良いかもしれません。
(その月日が今年まだ来ていないのか、既に過ぎたので来年に設定
するのか、の判定が少し面倒ですが、プログラム演習に作ってみると
良いのではないかと思います。)
こんなプログラムでも、実は少しバグりました。
バグの原因は、
#define SSS (24*60*60)
を
#define SSS 24*60*60
と書いていたため(括弧をつけていなかった)。
マクロ(#define)は、そのまま置き変わるので、括弧無しだと
printf("Rest %d days (%d-%d-%d)\n",t/24*60*60,yy,mn,dd);
になっていたんですね。
マクロには括弧をつけるのを習慣にするのが良いようです。
前の(今日に近い)記事 ← | 最新記事 | 【全目次】 | → 次(過去)の記事