このディレクトリの索引

# [1]授業単元:プログラミング演習課題3
# [2]問題文:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9516.txt
# ファイルに登録された成績コードを読み、構造体列にデータを編集し指定された項目で
# ソート処理を行って、画面に一覧(見出しと明細データ)を出力する。
# ソートの順序は降順とし、10行毎に見出しを入れる。
#
# 成績ファイル:
# コード(6桁),氏名(20桁),国語(3桁),算数(3桁),理科(3桁),社会(3桁)
#
# 構造体の定義:
# struct seito {
# char cd[7];
# char simei[21];
# int kokugo;
# int sansu;
# int rika;
# int syakai;
# };
#
# ソート項目は、コード、氏名、国語、算数、理科、社会が選択できるようにする。

項目長(コード,7,6).
項目長(氏名,21,20).
項目長(国語,3,3).
項目長(算数,3,3).
項目長(理科,3,3).
項目長(社会,3,3).

項目位置(コード,A,[A,_,_,_,_,_]).
項目位置(氏名,A,[_,A,_,_,_,_]).
項目位置(国語,A,[_,_,A,_,_,_]).
項目位置(算数,A,[_,_,_,A,_,_]).
項目位置(理科,A,[_,_,_,_,A,_]).
項目位置(社会,A,[_,_,_,_,_,A]).


'ファイルに登録された成績コードを読み、構造体列にデータを編集し指定された項目で
ソート処理を行って、画面に一覧(見出しと明細データ)を出力する。
ソートの順序は降順とし、10行毎に見出しを入れる。'(_ファイル,_キーならび) :-
        'ファイルに登録された成績コードを読み、'(_ファイル,_行ならび),
        '構造体列にデータを編集し指定された項目でソート処理(ソートの順序は降順とし)を行って、'(_行ならび,_先頭にキーが付加された降順整列した値ならび),
        length(_キーならび,_キーの長さ),
        '画面に一覧(見出しと明細データ)を出力する。10行毎に見出しを入れる。'(_先頭にキーが付加された降順整列した値ならび,1,_キーの長さ).

'ファイルに登録された成績コードを読み、'(_ファイル,_行ならび) :-
        get_lines(_ファイル,_行ならび).

'構造体列にデータを編集し指定された項目でソート処理(ソートの順序は降順とし)を行って、'(_行ならび,_キーならび,L2) :-
        構造体列にデータを編集し指定された項目で(_行ならび,_キーならび,L1),
        'ソート処理(ソートの順序は降順とし)を行って、'(L1,L2).

構造体列にデータを編集し指定された項目で(_行ならび,_キーならび,L1) :-
        キーを付加しながら項目の切り出し(_行ならび,_キーならび,L1).

キーの付加([],L,L) :- !.
キーの付加([_項目名|R1],L,[_値|R2]) :-
        項目位置(_項目名,_値,L),
        キーの付加(R1,L,R2).

キーを付加しながら項目の切り出し([],_,[]) :- !.
キーを付加しながら項目の切り出し([_行|R1],_キーならび,[L2|R2]) :-
        項目の切り出し(_行,0,[コード,氏名,国語,算数,理科,社会],L),
        キーの付加(_キーならび,L,L2),
        キーを付加しながら項目の切り出し(R1,_キーならび,R2),!.

項目の切り出し(_行,_開始点,[A|R1],[B|R2]) :-
        項目長(A,Len,_),
        sub_atom(_行,_開始点,Len,_,B),
        _次の開始点 is _開始点 + Len,
        項目の切り出し(_行,_次の開始点,R1,R2).

'ソート処理(ソートの順序は降順とし)を行って、'(L1,L2) :-
        sort(L1,L3),
        reverse(L3,L2).

'画面に一覧(見出しと明細データ)を出力する。10行毎に見出しを入れる。'([],_,_) :- !.
'画面に一覧(見出しと明細データ)を出力する。10行毎に見出しを入れる。'([_キーの付いた値ならび|R],_行目,_キーの長さ) :-
        '10行毎に見出しを入れる。'(_行目),
        明細データを出力する(_キーの長さ,_キーの付いた値ならび),
        _次の行目 is _行目 + 1,
        '画面に一覧(見出しと明細データ)を出力する。'(R,_次の行目,_キーの長さ).

'10行毎に見出しを入れる。'(_行目) :-
        1 is _行目 mod 10,
        writef('成績ファイル:\nコード(6桁),氏名(20桁),国語(3桁),算数(3桁),理科(3桁),社会(3桁)\n'),!.
'10行毎に見出しを入れる。'(_).

明細データを出力する(_キーの長さ,_キーの付いた値ならび) :-
        キーを取り除く(_キーの長さ,_キーの付いた値ならび,_値ならび),
        表示項目の調整([コード,氏名,国語,算数,理科,社会],_値ならび,_表示値ならび),
        writef('%t,%t,%t,%t,%t,%t\n',_表示値ならび).

キーを取り除く(_キーの長さ,_キーの付いた値ならび,_値ならび) :-
        length(VL,_キーの長さ),
        append(VL,_値ならび,_キーの付いた値ならび),!.

表示項目長の調整([],[],[]) :- !.
表示項目長の調整([_項目名|R1],[_値|R2],[_表示値|R3]) :-
        項目長(_項目名,_,Len),
        sub_atom(_値,0,Len,_,_表示値),
        表示項目長の調整(R1,R2,R3).