このディレクトリの索引

# 出典 :: C/C++の宿題片付けます 150代目 #586 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://codepad.org/3dkRTmjJ # # 生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。 # このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人の # BMI値および肥満か否かを列挙するプログラムkadai13-1.cを書きなさい。 # ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分から # ないものとする。 # # ヒント: # ○何をしなければならないかを大まかに書き下してみよう。 #  1. ファイルのオープン(これに先立ってファイル名を取得する必要がある) #  2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう) #  3.データの読み込み #  4.BMIの算出 #  5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい) #  6. 画面表示 # # ○BMIとは? # BMIは次のようにして計算されるものとする。 # BMI値=体重(キログラム)÷(身長(メートル))^2 # '^2'は二乗を意味する。 # このBMI値が25を越えると、肥満とみなされる。 # # ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。 # rewind(FILE *stream); # # ○wh-list.dat の中身は以下の通りで、氏名 身長(cm) 体重(kg)が列挙されている。 # yamada 157 62.5 # tanaka 180 45.1 # yoneda 190 50.5 # yamashita 210 80.5 # toyama 140 80 # .... # # ○例えば画面表示は # toyama BMI=40.816326 himan # nagashima BMI=29.551020 himan # yamashita BMI=27.777779 himan # takenaka BMI=27.716263 himan # . # 中略 # . # nakano BMI=23.179012 # yamashita BMI=18.253969 # . # . # # 等と表示されるものとする。 # '生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する' :- '生徒の氏名と身長と体重を列挙したファイルがある。このデータを読み込んで'(_行ならび), 'BMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する'(_行ならび). '生徒の氏名と身長と体重を列挙したファイルがある。このデータを読み込んで'(_行ならび) :- '1. ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_入力), '2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう)'. '3.データの読み込み'(_入力,_行ならび). '1. ファイルのオープン(これに先立ってファイル名を取得する必要がある)'(_入力) :- コマンド引数からファイル名を得る(_ファイル名), open(_ファイル名,read,_入力). コマンド引数からファイル名を得る(_ファイル名) :- current_prolog_flag(argv,[_ファイル名]). '2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう)' :- データ構造を用意する必要はありません. データ構造を用意する必要はありません. '3.データの読み込み'(_入力,_行ならび) :- findall(_行,( repeat, ( at_end_of_stream(_入力),!,fail;行入力(_入力,_行))),_行ならび). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). 'BMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する'(_行ならび) :- '4.BMIの算出(その人のBMI値および肥満か否かを列挙する)'(_行ならび,_BMIと判定ならび), '5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい)'(_BMIと判定ならび,_降順に整列したBMIと判定ならび), '6. 画面表示'(_降順に整列したBMIと判定ならび). '4.BMIの算出(その人のBMI値および肥満か否かを列挙する)'(_行ならび,_BMIと判定ならび) :- 'BMIの算出と判定'(_行ならび,_BMIと判定ならび). '5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい)'(_BMIと判定ならび,_降順に整列したBMIと判定ならび) :- 降順のバブルソート(_BMIと判定ならび,_降順に整列したBMIと判定ならび). 'BMIの算出と判定'([],[]) :- !. 'BMIの算出と判定'(_行ならび,_判定ならび) :- '全ての行のBMIの算出と判定をして行く'(_行ならび,_判定ならび). '全ての行のBMIの算出と判定をして行く'([_行|R1],[[_BMI値,_名前,_判定]|R2]) :- '行を解析して、名前、BMI値と判定を引き出す'(_行,_名前,_BMI値,_判定), 'BMIの算出と判定'(R1,R2). '行を解析して、名前、BMI値と判定を引き出す'(_行,_名前,_BMI値,_判定) :- '行を解析して、名前、身長、体重を取り出し'(_行,_名前,_身長単位メートル,_体重), 'BMIの判定'(_体重,_身長単位メートル,_BMI値,_判定). '行を解析して、名前、身長、体重を取り出し'(_行,_名前,_身長単位メートル,_体重) :- split(_行,[' '],[_名前,_身長単位センチメートル,_体重]), _身長単位メートル is _身長単位センチメートル / 100. 'BMIの判定'(_体重,_身長単位メートル,_BMI値,_判定) :- 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長単位メートル,_BMI値), 'BMI値が25を越えると、肥満とみなされる'(_BMI値,_判定). 'BMI値=体重(キログラム)÷(身長(メートル))^2'(_体重,_身長,_BMI値) :- _BMI値 is _体重 * _身長 ^ 2. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,肥満) :- _BMI値 > 25,!. 'BMI値が25を越えると、肥満とみなされる'(_BMI値,''). 降順のバブルソート(_対象ならび,_整列済みならび) :- 降順になるための交換(_対象ならび,_対象ならびの一), !, 降順のバブルソート(_対象ならびの一,_整列済みならび). 降順のバブルソート(_整列済みならび,_整列済みならび). 降順になるための交換([],[]) :- !,fail. 降順になるための交換(L1,L2) :- '第一要素が第二要素より小さい時は第一要素と第二要素を取り替える。等しいか大きい時は次の要素に進む。'(L1,L2),!. '第一要素が第二要素より小さい時は第一要素と第二要素を取り替える。等しいか大きい時は次の要素に進む。'(L1,L2) :- '第一要素が第二要素より小さい時は第一要素と第二要素を取り替える。'(L1,L2). '第一要素が第二要素より小さい時は第一要素と第二要素を取り替える。等しいか大きい時は次の要素に進む。'(L1,L2) :- '等しいか大きい時は次の要素に進む。'(L1,L2). '第一要素が第二要素より小さい時は第一要素と第二要素を取り替える。'([_1,_2|R],[_2,_1|R]) :- _1 @< _2. '等しいか大きい時は次の要素に進む。'([A|R1],[A|R2]) :- 降順になるための交換(R1,R2). '6. 画面表示'(_降順に整列したBMIと判定ならび) :- forall( member([_BMI,_名前,_判定],_降順に整列したBMIと判定ならび), writef('%w%w%w\n',[_名前,_BMI,_判定])). split(_文字列,_区切り文字列ならび,[_前文字列|R]) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび), split(_後文字列,_区切り文字列ならび,R),!. split(_文字列,_区切り文字列ならび,[_文字列]). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列).