このディレクトリの索引

#  問2
#  正整数n,n個の実数,および文字列を読み込み,文字列がselectionのときは
#  選択ソート,文字列がbubbleのときはバブルソートをして,
#  使用したソートアルゴリズムと降順にソートされた実数型配列を
#  出力するプログラムを作成せよ.以下のコードを穴埋めして,用いても良い.
#  
#  実行例
#  整数 > 10
#  0番目の実数 > 3.3
#  1番目の実数 > 4.4
#  2番目の実数 > 2.2
#  3番目の実数 > 1.1
#  4番目の実数 > 0.0
#  5番目の実数 > 9.9
#  6番目の実数 > 8.8
#  7番目の実数 > 5.5
#  8番目の実数 > 7.7
#  9番目の実数 > 6.6
#  文字列 > selection
#  選択ソート
#  9.900000
#  8.800000
#  7.700000
#  6.600000
#  5.500000
#  4.400000
#  3.300000
#  2.200000
#  1.100000
#  0.000000
#  
#  実行例
#  整数 > 10
#  0番目の実数 > 3.3
#  1番目の実数 > 4.4
#  2番目の実数 > 2.2
#  3番目の実数 > 1.1
#  4番目の実数 > 0.0
#  5番目の実数 > 9.9
#  6番目の実数 > 8.8
#  7番目の実数 > 5.5
#  8番目の実数 > 7.7
#  9番目の実数 > 6.6
#  文字列 > bubble
#  バブルソート
#  9.900000
#  8.800000
#  7.700000
#  6.600000
#  5.500000
#  4.400000
#  3.300000
#  2.200000
#  1.100000
#  0.000000
#  

'正整数n,n個の実数,および文字列を読み込み,文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして,使用したソートアルゴリズムと降順にソートされた実数型配列を出力する' :-
        '正整数n,n個の実数,および文字列を読み込み'(_正整数n,_n個の実数ならび,_文字列),
        '文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして'(_文字列,_n個の実数ならび,_降順に整列されたn個の実数ならび),
        '使用したソートアルゴリズムと降順にソートされた実数型配列を出力する'(_文字列,_降順に整列されたn個の実数ならび).

'正整数n,n個の実数,および文字列を読み込み'(_正整数n,_n個の実数ならび,_文字列) :-
        '正整数nを読み込み'(_正の整数n),
        'n個の実数を読み込み'(_正の整数n,_n個の実数ならび),
        '文字列を読み込み'(_文字列).

'正整数nを読み込み'(_正の整数n) :-
        write('正の整数を入力してください : '),
        get_integer(_正の整数n),
        _正の整数n > 0,!.

'n個の実数を読み込み'(_正の整数n,_n個の実数ならび) :-
        length(_n個の実数ならび,_正の整数n),
        findall(_実数,(
                    append(_,[_|_],__n個の実数ならび),
                    実数を読み込む(_実数)),
                _n個の実数ならび).

実数を読み込む(_実数) :-
        write('実数を入力してください : '),
        get_line(Line),
        実数入力診断(Line,_実数),!.
実数を読み込む(_実数) :- 実数を読み込む(_実数).

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

'文字列を読み込み'(_文字列) :-
        get_line(_文字列).

'文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして'(selection,_n個の実数ならび,_降順に整列されたn個の実数ならび) :-
        降順選択ソート(_n個の実数ならび,_降順整列されたn個の実数ならび),!.
'文字列がselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして'(bubble,_n個の実数ならび,_降順に整列されたn個の実数ならび) :-
        降順バブルソート(_n個の実数ならび,_降順に整列されたn個の実数ならび),!.

'使用したソートアルゴリズムと降順にソートされた実数型配列を出力する'(selection,_降順整列されたn個の実数ならび) :-
        listing(降順選択ソート/2),
        listing(降順swap/3),
        出力する(_降順に整列されたn個の実数ならび).
'使用したソートアルゴリズムと降順にソートされた実数型配列を出力する'(bubble,_降順に整列されたn個の実数ならび) :-
        listing(降順バブルソート/2),
        listing(降順交換/2),
        出力する(_降順に整列されたn個の実数ならび).

出力する(_降順に整列されたn個の実数ならび) :-
        append(_,[_実数|R],_降順に整列されたn個の実数ならび),
        writef('%t\n',[_実数]),
        R = [].

降順選択ソート([],[]) :- !.
降順選択ソート([A],[A]) :- !.
降順選択ソート(L1,[N|R2]) :-
        append(L0,[N|R],L1),
        \+((member(N1,L0),N1 @< N)),
        \+((member(N2,R),N2 @< N)),
        swap(L0,[N|R],R1),
        降順選択ソート(R1,R2).

swap([],[N|R],R) :- !.
swap(L0,[N|R],R1) :-
        L0=[S|R0],
        append(R0,[S|R],R1).

降順バブルソート(_対象ならび,_整列済みならび) :-
        降順交換(_対象ならび,_対象ならびの一),!,
        降順バブルソート(_対象ならびの一,_整列済みならび).
降順バブルソート(_整列済みならび,_整列済みならび).

降順交換([],[]) :- !,fail.
降順交換([A,B|R],[B,A|R]) :-
        A @< B,!.
降順交換([A|R1],[A|R2]) :-
        交換(R1,R2).