このディレクトリの索引

# 出典 :: #704 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9863.txt # リストを用いた成績処理 # リストを用いて個人データを格納する表を作成 # 処理番号を入力して処理の切り替えを行う # 1.成績一覧表示, 2.個人成績表示, # 3.個人平均点表示,4.科目平均点表示, # 0.終了 # リストに新たにデータを追加する時は学生番号順に並ぶように追加する. # リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする. # # 入力する成績データ(この順番で入れる) # 学番名前英語数学化学物理 # 106 tada 65 80 90 100 # 101 kouda 50 85 70 65 # 103 hanako 70 75 65 80 # 104 akane 60 95 80 75 # 102 tarou 90 80 85 65 # 105 nara 80 70 50 95 初期データの入力(_初期データならび) :- write('初期データを入力してください\n'), 行入力(_行), 初期データの入力(_行,[],_初期データならび),!. 初期データの入力(end_of_file,Ls,Ls) :- !. 初期データの入力(_行,Ls1,Ls2) :- 項目区切り(_行,[' '],L), insert_Ls(L,Ls1,Ls3), 行入力(_行_2), 初期データの入力(_行_2,Ls3,Ls2). insert_Ls(L,[],[L]) :- !. insert_Ls([A|R1],[[B|R2]|R3],[[A|R1],[B|R2]|R3]]) :- A @=< B,!. insert_Ls([A|R1],[[B|R2]|R3],[[B|R2]|R3]]) :- A @> B, insert_Ls([A|R1],R3,R4). 'リストを用いた成績処理 リストを用いて個人データを格納する表を作成 処理番号を入力して処理の切り替えを行う 1.成績一覧表示, 2.個人成績表示, 3.個人平均点表示,4.科目平均点表示, 0.終了 リストに新たにデータを追加する時は学生番号順に並ぶように追加する. リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする.' :- 初期データの入力(L), 'リストを用いた成績処理 リストを用いて個人データを格納する表を作成 処理番号を入力して処理の切り替えを行う 1.成績一覧表示, 2.個人成績表示, 3.個人平均点表示,4.科目平均点表示, 0.終了 リストに新たにデータを追加する時は学生番号順に並ぶように追加する. リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする.'(L,_機能), _機能 = 終了(_,_). 'リストを用いた成績処理 リストを用いて個人データを格納する表を作成 処理番号を入力して処理の切り替えを行う 1.成績一覧表示, 2.個人成績表示, 3.個人平均点表示,4.科目平均点表示, 0.終了 リストに新たにデータを追加する時は学生番号順に並ぶように追加する. リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする.'(L,_機能) :- repeat, 処理番号を入力して処理の切り替えを行う(L,_機能), call(_機能). 処理番号を入力して処理の切り替えを行う(L,_機能) :- 整数を得る('1. 一覧表示\n2. 個人成績表示\n3. 個人平均点表示\n4. 科目平均点表示\n0. 終了\n',true,_処理番号), 処理番号による機能選択(_処理番号,L,_機能). 処理番号による機能選択(1,L,一覧表示(L,_)). 処理番号による機能選択(2,L,個人成績表示(L,_)). 処理番号による機能選択(3,L,個人平均点表示(L,_)). 処理番号による機能選択(4,L,科目平均点表示(L,_))). 処理番号による機能選択(0,_,終了). 終了(_,_). 一覧表示(L,_) :- forall(member([A,B,C,D,E,F],L), writef('%w,%w,%w,%w,%w,%w\n',[A,B,C,D,E,F])). 個人成績表示(L,[A,B,C,D,E,F]) :- 整数を得る('検索したい学番を入れてください : ',true,A), member([A,B,C,D,E,F],L), writef('%w,%w,%w,%w,%w,%w\n',[A,B,C,D,E,F]),!. 個人平均点表示(L,[Avg]) :- findavg(U,(member([_,_,C,D,E,F],L),U is C+D+E+F),Avg), writef('個人平均点は %wです\n',[Avg]). 科目別平均点表示(L,[AvgC,AvgD,AvgE,AvgF]) :- 四科目の平均点を得る(C,D,E,F,AvgC,AvgD,AvgE,AvgF), writef('英語平均点=%w,数学=%w,化学=%w,物理=%w\n',[AvgC,AvgD,AvgE,AvgF]),!. 四科目の平均点を得る(C,D,E,F,AvgC,AvgD,AvgE,AvgF) :- findavg(C,member([_,_,C,_,_,_],L),AvgC), findavg(D,member([_,_,_,D,_,_],L),AvgD), findavg(E,member([_,_,_,_,E,_],L),AvgE), findavg(F,member([_,_,_,_,_,F],L),AvgF). 整数を得る(_催促,_評価,_整数) :- 催促後に行入力(_催促,_行), 整数入力検査(_行,_整数), 整数入力評価(_評価). 催促後に行入力(_催促,_行) :- write(_催促), 行入力(_行),!. 催促後に行入力(_催促,_行) :- 催促後に行入力(_催促,_行). 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). 整数入力検査(_行,_整数) :- atom_number(_行,_整数), integer(_整数),!. 整数入力検査(_行,_整数) :- writef('入力された行 %w からは整数が得られません。\n',[_行]), fail. 整数入力評価(_評価) :- call(_評価),!. 整数入力評価(_評価) :- writef('整数評価 %w が偽となりました。\n',[_評価]), fail. 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列).