このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1342966104/71
#  [1] 授業単元:C言語  
#  [2] 問題文(含コード&リンク): 
#  http://ime.nu/ideone.com/TO8Kg 問題です。 
#  http://ime.nu/ideone.com/ZvUuR 課題を提出したら関数の定義 
#               をしろといわれました。 
#  http://ime.nu/ideone.com/Nd5ir 自分なりにやったのですが 
#               ここからができませんでしたので 
#               よろしくお願いします。 
#  
#  生徒の氏名と身長と体重を列挙したデータファイル wh-list.dat がある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙するプログラムkadai12.c を書きなさい。ただしファイル名は画面から入力されるものとする(scanf()を使う)。
#  ただし、wh-list.datに列挙される人数はプログラム開発時点では全く分からないものとする。
#   
#  ヒント:
#  ○何をしなければならないかを大まかに書き下してみよう。
#    1. ファイルのオープン(これに先立ってファイル名を取得する必要がある)
#    2. データ構造の用意(これにはファイルにかかれたデータ数を知る必要がありますね。どうやって知るべきか考えよう)
#    3.データの読み込み
#   4.BMIの算出
#    5. BMIの大きい者順に並べ替える(バブルソートを使おう。これが何者か知らない人は「バブルソート」で検索されたい)
#    6. 画面表示
#   
#  ○BMIとは?
#  BMIは次のようにして計算されるものとする。
#  BMI値=体重(キログラム)/(身長(メートル))^2 
#  '^2'は二乗を意味する。
#  このBMI値が25を越えると、肥満とみなされる。
#   
#  ○ファイルポインターがファイルの中間もしくは終わりをさしている時、これをファイルの先頭に戻す関数があります。

'生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んでBMI値を計算し、BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。ただしファイル名は画面から入力されるものとする。' :-
        '生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL),
        'BMI値を計算し'(LL,LL1),
        'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1).

'生徒の氏名と身長と体重を列挙したデータファイルがある。このデータを読み込んで'(LL) :-
        write('データファイル名を入力してください : '),
        get_line(_データファイル名),
        get_split_lines(_データファイル名,[' ',','],LL).

'BMI値を計算し'(LL1,LL2) :-
        findall([_BMI値,_氏名],(
                    member([_氏名,_身長,_体重],LL1),
                    'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値)),
                LL2).

/*
'BMI値を計算し'([],[]).
'BMI値を計算し'([[_氏名,_身長,_体重]|R1],[[_BMI値,_氏名]|R2]) :-
        'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値),
        'BMI値を計算し'(R1,R2).
*/


'BMIは次のようにして計算されるものとする。BMI値=体重(キログラム)/(身長(メートル))^2 '(_体重,_身長,_BMI値) :-
        _BMI値 is _体重 / _身長 ^ 2.

'BMI値が大きいもの順に、その人のBMI値および肥満か否かを列挙する。'(LL1) :-
        'BMI値が大きいもの順に'(LL1,LL3),
        その人のBMI値および肥満か否かを列挙する(LL3).

'BMI値が大きいもの順に'(LL1,LL3) :-
        sort(LL1,LL2),
        reverse(LL2,LL3).

その人のBMI値および肥満か否かを列挙する(LL3) :-
        append(_,[[_BMI値,_氏名]|R],LL3),
        'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,_肥満判定),
        writef('%t は %t。\n',[_氏名,_肥満判定]),
        R = [].

'このBMI値が25を越えると、肥満とみなされる。'(_BMI値,肥満です) :-
        _BMI値 > 25.0,!.
'このBMI値が25を越えると、肥満とみなされる。'(_,肥満ではない).