module pind.samples.ja.assert_.assert_2; import std.stdio; import std.string; import std.exception; /* メッセージを表示した後、 * 時刻を時と分として読み込む。 */ void readTime(string message, out int hour, out int minute) { write(message, "? (HH:MM) "); readf(" %s:%s", &hour, &minute); enforce((hour >= 0) && (hour <= 23) && (minute >= 0) && (minute <= 59), "Invalid time!"); } /* 時刻を文字列形式で返す。 */ string timeToString(int hour, int minute) { assert((hour >= 0) && (hour <= 23)); assert((minute >= 0) && (minute <= 59)); return format("%02s:%02s", hour, minute); } /* 開始時刻に継続時間を加算し、 * その結果を3番目のパラメータのペアとして返す。 */ void addDuration(int startHour, int startMinute, int durationHour, int durationMinute, out int resultHour, out int resultMinute) { resultHour = startHour + durationHour; resultMinute = startMinute + durationMinute; if (resultMinute > 59) { ++resultHour; } } void main() { int startHour; int startMinute; readTime("Start time", startMinute, startHour); int durationHour; int durationMinute; readTime("Duration", durationHour, durationMinute); int endHour; int endMinute; addDuration(startHour, startMinute, durationHour, durationMinute, endHour, endMinute); writefln("%s hours and %s minutes after %s is %s.", durationHour, durationMinute, timeToString(startHour, startMinute), timeToString(endHour, endMinute)); }