乱入2
http://d.hatena.ne.jp/w_o/20050308#p1
PascalというかDelphi。
ごめんなさい、上の記述は撤回します。Pascalの場合は「節」があるため節の後ろは一行あけないと気持ち悪いです。Adaは「節」が無いからだらだら書いても違和感無いのですね。
一目瞭然ですがbegin〜endの対応などもPascalとAdaはかなり違います。
program w_o_Pascal; {$APPTYPE CONSOLE} {$R+} uses SysUtils, DateUtils; type CompareMode = (Newer, Older); ParseError = class(Exception); var FileName: String; TimeStamp: TDateTime; InFile: Text; Mode: CompareMode; C: Char; FileHour, Hour: 0..23; FileMin, Min: 0..59; function ReadInteger(Last: Char): Cardinal; begin Result := 0; repeat Read(InFile, C); if C = Last then Break; if C in ['0'..'9'] then Result := Result * 10 + Cardinal(Ord(C) - Ord('0')) else raise ParseError.Create('num'); until Eoln(InFile); end; begin if ParamCount < 1 then WriteLn('usage:') else begin FileName := ParamStr(1); FileMode := fmOpenRead; Reset(InFile, FileName); TimeStamp := FileDateToDateTime(FileAge(FileName)); FileHour := HourOf(TimeStamp); FileMin := MinuteOf(TimeStamp); Read(InFile, C); case C of 'n': Mode := Newer; 'o': Mode := Older; else raise ParseError.Create('n/o'); end; Read(InFile, C); if C <> ',' then raise ParseError.Create(','); Hour := ReadInteger(':'); Min := ReadInteger(#0); Close(InFile); if (Mode = Newer) = (FileHour * 60 + FileMin > Hour * 60 + Min) then WriteLn('ok') else WriteLn('ng'); end; end.
そういえばHaskellでファイル入出力の方法知らないなあ…電卓にしか使ってませんでしたから…。