このディレクトリの索引

# 出典 :: C/C++の宿題片付けます 158代目 #164 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # n人の点数を読み込み、その中央値を求めたい。 # そこで、次の関数を 作成しなさい。 # *標準入力から読み込んだ点数を配列に代入する関数。 # ただし、呼び出し時には人数は与えられず、負の点数が入力されたら、 # その直前までの点数を返すものとする。また、人数を関数の返却値で返す。 # 例.85, 58, 90, 65, 45, -1 のときは、5名の点数を配列に入れ、 # 関数自身は人数の5を返却する。 # *配列の中身を昇順に並べ替える関数。ここで、配列のi番目とj番目の要 # 素の値を入れ替えるには、次のように行う。 # int temp = ary[i]; # ary[i] = ary[j]; # ary[j] = temp; # * 配列から中央値を返却する関数。 # 中央値は、データ数が奇数個のときは、 1番目から数えて(n+1)/2番目の # データであり、偶数個のときは、n/2番目とn/2+1番目のデータの平均値でる。 # 例.50, 70, 90のときは、中央値は70であり、50, 70, 80, 90のときは、 中 # 央値は75である。 # 適切な実行例を作成し、上記の関数が正しく動作することを示しなさい。 # 'n人の点数を読み込み、その中央値を求めたい。そこで、次の関数を作成しなさい。 *標準入力から読み込んだ点数を配列に代入する関数。ただし、呼び出し時には人数は与えられず、負の点数が入力されたら、その直前までの点数を返すものとまた、人数を関数の返却値で返す。'(_人数,_中央値) :- 整数を得る(人数,_人数), '人数分の点数を入力する。ただし、負の点数が入力されたら、その直前の点数を返す'(_人数,_点数ならび), 中央値(_点数ならび,_中央値). '人数分の点数を入力する。ただし、負の点数が入力されたら、その直前の点数を返す'(_人数,_点数ならび) :- findall(_人数,_点数,( 整数を得る(点数,_点数), ( _点数 < 0,!,fail;true)),_点数ならび),!. 中央値(_標本ならび,_中央値) :- 整列して中央値を得る(_標本ならび,_中央値). 整列して中央値を得る(_標本ならび,_中央値) :- 重複要素を残す整列(_標本ならび,_整列した標本ならび), 中央値を得る(_整列した標本ならび,_中央値). 中央値を得る(_整列した標本ならび,_中央値) :- length(_整列した標本ならび,_要素数), _要素数の半分 is _要素数 // 2, 中央値を得る(_整列した標本ならび,_要素数,_要素数の半分,_中央値). 中央値を得る(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- '標本数が奇数の時は中央順位、偶数の時は中央二値の平均値'(_整列した標本ならび,_要素数,_要素数の半分,_中央値). '標本数が奇数の時は中央順位、偶数の時は中央二値の平均値'(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 標本数が奇数の時は中央順位(_整列した標本ならび,_要素数,_要素数の半分,_中央値). '標本数が偶数の時は中央順位、偶数の時は中央二値の平均値'(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 標本数が偶数の時は中央二値の平均値(_整列した標本ならび,_要素数,_要素数の半分,_中央値). 標本数が奇数の時は中央順位(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 奇数(_要素数), 中央順位(_中央値). 中央順位(_整列した標本ならび,_要素数の半分,_中央値) :- length(L1,_要素数の半分), length(L2,_要素数の半分), append(L1,[_中央値|L2],_整列した標本ならび). 標本数が偶数の時は中央二値の平均値(_整列した標本ならび,_要素数,_要素数の半分,_中央値) :- 偶数(_要素数), 中央二値(_整列した標本ならび,_要素数の半分,_中央値_1,_中央_2), _中央値 is (_中央値_1 + _中央値_2) / 2. 中央二値(_整列した標本ならび,_要素数の半分,_中央値_1,_中央_2) :- length([_|L1],_要素数の半分), length([_|L2],_要素数の半分), append(L1,[_中央値1,_中央値2|L2],_整列した標本ならび). 奇数(_奇数) :- 1 is _奇数 mod 2. 偶数(_偶数) :- 0 is _偶数 mod 2. 重複要素を残す整列([],[]) :- !. 整列(_対象ならび,_整列したならび) :- _対象ならび = [_軸要素|_残り対象ならび], 重複要素を残す整列(_軸要素,_残り対象ならび,_整列したならび). 重複要素を残す整列(_軸要素,_軸要素を除いた対象ならび,_整列したならび) :- 分割(_軸要素,_軸要素を除いた対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび), 重複要素を残す整列(_軸要素に等しいかより小さい要素のならび,_整列した軸要素に等しいかより小さい要素のならび), 重複要素を残す整列(_軸要素より大きい要素のならび,_整列した軸要素より大きい要素のならび), append(_軸要素に等しいかより小さい要素のならび,[_軸要素|_整列した軸要素より大きい要素のならび],_整列したならび). 分割(_軸要素,[],[],[]). 分割(_軸要素,[_要素|_残り対象ならび],[_要素|_軸要素に等しいかより小さい要素のならび],_軸要素より大きい要素のならび) :- _要素 @=< _軸要素, 分割(_軸要素,_残り対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび). 分割(_軸要素,[_要素|_残り対象ならび],_軸要素に等しいかより小さい要素のならび,[_要素|_軸要素より大きい要素のならび]) :- _要素 @> _軸要素, 分割(_軸要素,_残り対象ならび,_軸要素に等しいかより小さい要素のならび,_軸要素より大きい要素のならび). % 整数を得る/2