#include int gettime(void); int one(int c); int ten(int c); void keyflush(int input); /* ----- 滅入ん ----- */ void main() { int time1, time2, time; int i; int hh, mm; hh = mm = 0; while (1) { /* 強制終了のためにループさせてみる */ printf("始めの時刻を入力 (HH:MM):"); time1 = gettime(); /* 分で返ってくる */ if (time1 < 0) { printf("入力値が不正です\n"); /* 入力ミスには容赦しない */ break; } printf("終りの時刻を入力 (HH:MM):"); time2 = gettime(); /* 分で返ってくる */ if (time2 < 0) { printf("入力値が不正です\n"); /* 入力ミスには容赦しない */ break; } time = time1 + time2; /* 2 つの時間を足す */ for (i = 0; i < time / 60; i++) { /* 割り切れた数 == 時間って感じでループする */ hh++; /* 「時」の数値ができてくる */ } mm = time - (hh * 60); /* 「分」の数値を作る */ if (hh >= 24) { /* 24 時間を越えていたら日付表示を行う */ printf("1day %02d:%02d\n", hh - 24, mm); } else { /* 1 日以内だよねぇ */ printf("%02d:%02d\n", hh, mm); } break; /* 円満終了 */ } } /* ----- 関数の定義 ----- */ int gettime(void) /* HH:MM 形式の文字列の入力を待ち「分」を表す数値にして返す */ { /* 全てのエラーは -1 が返る */ int hh, mm; int c; int count; hh = mm = 0; for (count = 1; count <= 5; count++) { /* 5 文字の入力を期待している */ c = getchar(); if (c == '\0') { return -1; } switch (count) { /* 入力フォーマットが固定なのでかなり力技を見せてみる */ case 1: /* 1 桁目 (時を取得) */ if (ten(c) == -1) { return -1; } else { hh = hh + ten(c); break; } case 2: /* 2 桁目 (時を取得) */ if (one(c) == -1) { return -1; } else { hh = hh + one(c); break; } case 3: /* 3 桁目は ':' の筈だッ! */ if (c != ':') { return -1; } break; case 4: /* 4 桁目 (分を取得) */ if (ten(c) == -1) { return -1; } else { mm = mm + ten(c); break; } case 5: /* 5 桁目 (分を取得) */ if (one(c) == -1) { return -1; } else { mm = mm + one(c); break; } } } if (hh >= 24 || mm >= 60) { /* 時が 24 以上もしくは分が 60 以上はエラー */ return -1; } else { keyflush(c); /* キーボードバッファをクリアしておく */ return (hh * 60) + mm; /* 「分」に直してお返りやす */ } } int one(int c) /* 1 の位を表す文字を数値に変換する */ { if (c >= '0' && c <= '9') { return c - '0'; } else { return -1; } } int ten(int c) /* 10 の位を表す文字を数値に変換する */ { if (c >= '0' && c <= '9') { return (c - '0') * 10; } else { return -1; } } void keyflush(int input) { while (input != '\n') { /* 入力バッファのクリア簡易版 */ input = getchar(); } }