/* * greeting.c ; 挨拶プログラム (教科書 List4-5) * * 書式 * greeting ; 現在時刻を元に挨拶を表示 * greeting HH:MM ; 指定時刻を元に挨拶を表示 (HHは24時制) * * 作者 * 結城浩 * Copyright (C) 1993 by Hiroshi Yuki. * * (文字コードは EUC-JP) */ #include #include #include int main(int argc, char* argv[]); void print_greeting(int hour, int min); void print_time(struct tm *tp); /************************************************ * print_greeting 時刻に応じた挨拶を表示 * hour 24時制の時間 * min 分 */ void print_greeting(int hour, int min) { if ( ( 22 <= hour && hour < 24 ) || ( 0 <= hour && hour < 4 ) ) { printf("夜遅くまでご苦労様.\n"); } else if ( hour < 7 ) { printf("ずいぶんお早いですね.\n"); } else if ( hour < 12 ) { printf("おはようございます.\n"); } else if ( hour < 15 ) { printf("こんにちわ.\n"); } else if ( hour < 18 ) { printf("のんびりいきましょう.\n"); } else if ( hour < 22 ) { printf("こんばんわ.\n"); } else { /* 例外処理 */ printf("%02d時%02d分とは変な時刻ですね.\n", hour, min); } /* 特別な挨拶 */ if ( 0 <= min && min < 10 ) { if ( 6 <= hour && hour < 9 ) { printf("朝食は食べましたか?\n"); } else if ( hour == 12 ) { printf("昼食は食べましたか?\n"); } else if ( 18 <= hour && hour < 21 ) { printf("夕食は食べましたか?\n"); } } } /************************************************ * main * 引数がない場合は現在時刻を元に挨拶 * 引数 HH:MM がある場合はHH時MM分の挨拶 */ int main(int argc, char *argv[]) { time_t now; struct tm *tp; int hour, min; if ( argc == 1 ) { /* 引数がない場合 */ now = time(NULL); tp = localtime(&now); printf("現在は "); print_time(tp); /* 現在時刻を詳細表示*/ print_greeting(tp->tm_hour, tp->tm_min); /* メッセージを表示*/ } else { /* 引数がある場合 */ sscanf(argv[1], "%02d:%02d", &hour, &min); printf("指定された時刻は %02d時%02d分です.\n", hour, min); print_greeting(hour, min); /* メッセージを表示*/ } } /************************************************ * weekday[0-6]を曜日に変換するための変数 */ char *weekday[] = {"日", "月", "火", "水", "木", "金", "土"}; /************************************************ * print_time * 引数の時刻を詳細表示;「%%年%%月%%日(曜日) %%時%%分%%秒です.」 */ void print_time(struct tm *tp) { printf("%d年%d月%d日(%s) ", tp->tm_year + 1900, tp->tm_mon + 1, tp->tm_mday, weekday[tp->tm_wday] ); printf("%02d時%02d分%02d秒です.\n", tp->tm_hour, tp->tm_min, tp->tm_sec ); }