このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1309076891/945
#  
#  テキストフィールドから入力した学習時間の平均を求める。  
#  
#  ただし、テキストフィールドの入力が改行のみの時、入力は[]となり終了する。
#  

テキストフィールドから入力した学習時間の平均を求める(_学習時間の平均) :-
        テキストフィールドから入力した学習時間の(_学習時間ならび),
        学習時間の平均を求める(_学習時間ならび,_学習時間の平均).

テキストフィールドから入力した学習時間の(_学習時間ならび) :-
        テキストフィールドから入力した学習時間(_学習時間),
        テキストフィールドから入力した学習時間の(_学習時間,_学習時間ならび).

テキストフィールドから入力した学習時間の(_入力,[]) :-
        'テキストフィールドの入力が改行のみの時、入力は[]となり終了する'(_入力),!.
テキストフィールドから入力した学習時間の(_学習時間,[_学習時間|R]) :-
        テキストフィールドから入力した学習時間(_学習時間_2),
        テキストフィールドから入力した学習時間の(_学習時間_2,R).

テキストフィールドから入力した学習時間(_学習時間) :-
        write('学習時間をスペース区切りで _時 _分 _秒 : '),
        readln(L),
        テキストフィールドから入力した学習時間診断(L,_学習時間),!.
テキストフィールドから入力した学習時間(_学習時間) :-
        テキストフィールドから入力した学習時間(_学習時間).

テキストフィールドから入力した学習時間診断([],[]) :- !.
テキストフィールドから入力した学習時間診断([_時,_分,_秒],[_時,_分,_秒]) :-
        時の範囲内(_時),
        分の範囲内(_分),
        秒の範囲内(_秒),!.
テキストフィールドから入力した学習時間診断(L,_学習時間) :-
        writef('%t Input Error: ',[L]),
        fail.

時の範囲内(_時) :-
        integer(_時),
        _時 >= 0.

分の範囲内(_分) :-
        integer(_分),
        _分 >= 0,
        _分 < 60,!.

秒の範囲内(_秒) :-
        integer(_秒),
        _秒 >= 0,
        _秒 < 60,!.

学習時間の平均を求める([],_) :-
        write('テキストフィールドから入力した学習時間が有りません\n'),
        fail,!.
学習時間の平均を求める(_学習時間ならび,_学習時間の平均) :-
        length(_学習時間ならび,_人数),
        findsum([_時,_分,_秒],(
                    member([_時,_分,_秒],_学習時間ならび)),
                [_合計時,_合計分,_合計秒]),
        学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒).

学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒) :-        一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒),
        _平均秒 is truncate((_換算された秒 + 0.5) / _人数),
        '換算された秒を時、分、秒に還元'(_換算された秒,_平均時,_平均分,_平均日).

一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒) :-
        _換算された秒 is _合計時 * 3600 + _合計分 * 60 + _合計秒.

'換算された秒を時、分、秒に還元'(_換算された秒,_時,_分,_秒) :-
        _時 is _換算された秒 // 3600,
        _剰余_1 is _換算された秒 mod 3600,
        _分 is _剰余_1 // 60,
        _秒 is _剰余_1 mod 60.


'テキストフィールドの入力が改行のみの時、入力は[]となり終了する'([]).