このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/885
#  夜分遅くに申し訳ございません… 
#  本日9時提出の課題を今になって気づいたのですが、私の頭ではさっぱりわからないのでお助け下さい… 
#   
#  [1]プログラミングC 
#  [2] 問題文(含コード&リンク): 
#  問1:以下の実行結果に示すような、3つの実数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 
#  ※例 
#  3つの整数を入力してください。 
#  na=12 
#  nb=65 
#  nc=44 
#  65と12の差は53です。 
#   
#  問2:以下の文字列(programming_jissyu)が配列に格納されているとする。 
#  この文字列を任意の位置で2つ分割して表示するプログラムを作成せよ。 
#  ※例 
#  難文字目で分割しますか:11 
#  文字列の前半 
#  programming 
#  文字列の後半 
#  _jissyu 
#  

'問1:以下の実行結果に示すような、3つの整数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。
※例
3つの整数を入力してください。
na=12
nb=65
nc=44
65と12の差は53です。' :-
        '3つの整数を入力した後、'(_3つの整数),
        最大値と最小値の差(_3つの整数,_最大値,_最小値,_最大値と最小値の差),
        writef('%tと%tの差は%tです。',[_最大値,_最小値,_最大値と最小値の差]).        

'3つの整数を入力した後、'(_3つの整数) :-
        write('3つの整数を入力してください。\n'),
        findall(_整数,(
                    member(A,[na,nb,nc]),
                    writef('%t=',[A]),
                    整数を得る(_整数)),
                _3つの整数).

最大値と最小値の差(_3つの整数,_最大値,_最小値,_最大値と最小値の差) :-
        最大値(_3つの整数,_最大値),
        最小値(_3つの整数,_最小値),
        _最大値と最小値の差 is _最大値 - _最小値.

最大値(_整数ならび,_最大値) :-
        select(N,_整数ならび,R),
        forall(member(M,R),M =< N).

最小値(_整数ならび,L_最小値) :-
        select(N,_整数ならび,R),
        forall(member(M,R),M >= N).

整数を得る(_整数) :-
        一行読み込む(Line),
        '診断: 整数を得る'(Line,_整数),!.
整数を得る(_整数) :-
        整数を得る(_整数).

'診断: 整数を得る'(Line,_整数) :-
        read_term_from_atom(Line,_整数,[]),
        integer(_整数),!.
'診断: 整数を得る'(Line,_整数) :-
        writef('入力された値"%t"から整数は得られません。再入力をお願いします。\n',[Line]),
        fail.

一行読み込む(_行) :-
        get_line(_行).

get_line(Stream,X) :-
        get_char(Stream,C),
        get_line_1(Stream,C,Chars),
        atom_chars(X,Chars).

get_line_1(Stream,'\n',[]) :- !.
get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !.
get_line_1(Stream,C,[C|R]) :-
        get_char(Stream,C2),
        get_line_1(Stream,C2,R).

get_line(X) :-
        get_char(C),
        get_line_1(C,Chars),
        atom_chars(X,Chars).

get_line_1('\n',[]) :- !.
get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !.
get_line_1(C,[C|R]) :-
        get_char(C2),
        get_line_1(C2,R).