このディレクトリの索引
#  [1] 授業単元:プログラミング 
#  [2] 問題文( 
#  問題1 
#  キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に 
#  表示してください。なお、プログラム作成時は以下の仕様に従ってください。 
#  ファイル名: kadai2.c 
#  【 問題作成時の注意点 】 
#  ・キーボードから入力したデータはint 型配列で管理してください。 
#  ・データを入力する際にはscanf 関数を利用してください。 
#  ・画面にメッセージを表示する際にはprintf 関数を利用してください。 
#  なお、結果表示時は、最大値/最小値となる要素の添字もあわせて 
#  表示してください。また、最大値/最小値が複数ある場合は、 
#  すべての要素を表示してください。 
#  【 実行時のイメージ 】 
#  ----------------------------- 
#  data[0] ... 69 ←「...」の後ろはキーボード入力部 
#  data[1] ... 91 ←「...」の後ろはキーボード入力部 
#  data[2] ... 91 ←「...」の後ろはキーボード入力部 
#  data[3] ... 72 ←「...」の後ろはキーボード入力部 
#  data[4] ... 86 ←「...」の後ろはキーボード入力部 
#  Max : data[1] = 91 
#  Max : data[2] = 91 
#  Min : data[0] = 69 
#  ----------------------------- 
#  
#  [3] 環境 
#   [3.1] OS: Windows 
#   [3.2] コンパイラ名とバージョン: gcc 3.4 
#   [3.3] 言語: C++ 
#  [4] 期限: ([2006年11月2日17:30まで 
#  [5] その他の制限:なし 
#  

'キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に 
表示してください。なお、プログラム作成時は以下の仕様に従ってください。
ファイル名: kadai2.c 
【 問題作成時の注意点 】 
・キーボードから入力したデータはint 型配列で管理してください。 
・データを入力する際にはscanf 関数を利用してください。 
・画面にメッセージを表示する際にはprintf 関数を利用してください。 
なお、結果表示時は、最大値/最小値となる要素の添字もあわせて 
表示してください。また、最大値/最小値が複数ある場合は、 
すべての要素を表示してください。 
【 実行時のイメージ 】 
----------------------------- 
data[0] ... 69 ←「...」の後ろはキーボード入力部 
data[1] ... 91 ←「...」の後ろはキーボード入力部 
data[2] ... 91 ←「...」の後ろはキーボード入力部 
data[3] ... 72 ←「...」の後ろはキーボード入力部 
data[4] ... 86 ←「...」の後ろはキーボード入力部 
Max : data[1] = 91 
Max : data[2] = 91 
Min : data[0] = 69 
----------------------------- ' :-
        'キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に表示してください。'.

'キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に表示してください。' :-
        キーボードから入力した5 件のデータのうち(_5件のデータ),
        最大値と最小値を調べ(_5件のデータ,_最大値情報のならび,_最小値の情報ならび),
        最大値の情報を表示する(_最大値の情報ならび),
        最小値の情報を表示する(_最小値の情報ならび).

キーボードから入力した5 件のデータのうち(_5件のデータ) :-
        length(_5件のデータ,5),
        findall(_データ,(
                    append(L0,[_|_],_5件のデータ),
                    データを得る(L0,_データ)),
                _5件のデータ).

データを得る(L0,_データ) :-
        length(L0,_0基準位置),
        writef('data[%t] ... ',[_0基準位置]),
        整数を得る(整数,_データ),!.

最大値と最小値を調べ(_5件のデータ,_最大値の情報ならび,_最小値の情報ならび) :-
        位置情報を持った最大値(_5件のデータ,_最大値の情報ならび),
        位置情報を持った最小値(_5件のデータ,_最小値の情報ならび).

位置情報を持った最大値(_5件のデータ,_最大値の情報ならび) :-
        findall([_位置情報,_最大値],(
                    append(L0,[_最大値|R],_5件のデータ),
                    すべてが等しいか小さい(L0,_最大値),
                    すべてが等しいか小さい(R,_最大値),
                    length(L0,_位置情報)),
                _最大値の情報ならび).

位置情報を持った最小値(_5件のデータ,_最小値の情報ならび) :-
        findall([_位置情報,_最大値],(
                    append(L0,[_最大値|R],_5件のデータ),
                    すべてが等しいか大きい(L0,_最小値),
                    すべてが等しいか大きい(R,_最小値),
                    length(L0,_位置情報)),
                _最小値の情報ならび).

すべてが等しいか小さい([],_).
すべてが等しいか小さい([A|R],_基準値) :-
        A @=< _基準値,
        すべてが等しいか小さい(R,_基準値).

すべてが等しいか大きい([],_).
すべてが等しいか大きい([A|R],_基準値) :-
        A @>= _基準値,
        すべてが等しいか大きい(R,_基準値).

最大値の情報を表示する(_最大値の情報ならび) :-
        append(_,[[_0基準位置,_最大値]|R],_最大値の情報ならび),
        writef('Max : data[%t] = %t\n',[_0基準位置,_最大値]),
        R = []. 

最小値の情報を表示する(_最小値の情報ならび) :-
        append(_,[[_0基準位置,_最小値]|R],_最小値の情報ならび),
        writef('Min : data[%t] = %t\n',[_0基準位置,_最小値]),
        R = [].