このディレクトリの索引
このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1250204272/188
#  [1] 授業単元:C言語入門  
#  [2] 問題文(含コード&リンク):  
#    入力した任意の小数5つを降順にソートし出力する 
#  [3] 環境  
#   [3.1] OS: Windows  
#   [3.2] コンパイラ名とバージョン: VC 
#   [3.3] 言語: C  
#  [4] 期限: 本日中  
#  [5] その他の制限:初心者用講座 配列を用いる 
#   
#  助けてください  
#   
# 
# 

入力した任意の小数5つを降順にソートし出力する  :-
入力した任意の小数5つを降順にソートし(X),
出力する(X).

入力した任意の小数5つを降順にソートし(X) :-
'5つの数を得る'(L),
要素数の少ない降順整列(L,[],X).

要素数の少ない降順整列([],L,L) :- !.
要素数の少ない降順整列([_数|R1],[],X) :-
要素数の少ない降順整列(R1,[_数],X),!.
要素数の少ない降順整列([_数|R1],[N|R2],X) :-
数 >= N,
要素数の少ない降順整列(R1,[_数,N|R1],X).
要素数の少ない降順整列([_数|R1],[N|R2],X) :-
数 < N,
降順の挿入(_数,[N|R2],Y),
要素数の少ない降順整列(R1,Y,X).

降順の挿入(_数,[],[_数]) :- !.
降順の挿入(_数,[N|R],[_数,N|R]) :- _数 >= N,!.
降順の挿入(_数,[N|R1],[N|R2]) :- _数 < N,降順の挿入(_数,R1,R2).

'5つの数を得る'(L) :-
length(Ln,5),
'5つの数を得る'(Ln,L).

'5つの数を得る'([],[]).
'5つの数を得る'([_|Ln],[_数|R]) :-
'あと何行入力が必要か示した後で整数を入力する'([_|Ln],_数),
'5つの数を得る'(Ln,R),!.
'5つの数を得る'(M,X) :-
 write('正しい入力がえられませんでした\nもう一度入力してください\n'),
 '5つの数を得る'(M,X).

'あと何行入力が必要か示した後で整数を入力する'([_|Ln],T) :-
length([_|Ln],_残り入力必要数),
swritef(S,'小さな数を入力して改行してください(残り%t個) : ',[_残り入力必要数]),
整数を得る(S,treu,T).

整数を得る(_催促,_評価,_整数) :-
催促後に行入力(_催促,_行),
整数入力検査(_行,_整数),
整数入力評価(_評価).

催促後に行入力(_催促,_行) :-
write(_催促),
行入力(_行),!.
催促後に行入力(_催促,_行) :- 催促後に行入力(_催促,_行).

行入力(_行) :-
read_line_to_codes(current_input,_コードならび),
atom_codes(_行,_コードならび).

整数入力検査(_行,_整数) :-
atom_number(_行,_整数),
integer(_整数),!.
整数入力検査(_行,_整数) :-
writef('入力された行 %w からは整数が得られません。\n',[_行]),
fail.

整数入力評価(_評価) :-
call(_評価),!.
整数入力評価(_評価) :-
writef('整数評価 %w が偽となりました。\n',[_評価]),
fail.

出力する(X) :-
writef('%w\n',[X]).