このディレクトリの索引

# 出典 :: C/C++の宿題片付けます 151代目 #36 # [1] 授業単元:構造体の配列利用 # [2] 問題文(含コード&リンク): # #include <stdio.h> # /* 配列arrayの要素数 */ # #define ELENUM(array) (sizeof(array) / sizeof((array)[0])) # #define SIZE_DATA (10) /* データ数 */ # # struct Address_data{ # char name[81]; # char phone[20]; # int age; # }; # # int main(void) # { # struct Address_data data[SIZE_DATA], *p = data; # printf("Input end = Ctrl + D\n"); # /* 配列初期化(入力プロンプトより前に置くべき?) */ # for (p = data; p - data < ELENUM(data); p++) { # p->age = -1; # } # /* 入力処理 */ # for (p = data; p - data < ELENUM(data); p++) { # printf("[%d]name phone age = ", p - data); # if (scanf("%s %s %d", p->name, p->phone, &p->age) != 3) { # break; # } # } # putchar('\n'); # /* 表示 */ # for (p = data; p->age >= 0; p++) { # printf("%s\t(%d)\t[%s]\n", p->name, p->age, p->phone); # } # return 0; # } # 表示を行う際に、年齢順に表示するようにしたい。 # 配列の並び替えを行なって表示するようにプログラムを拡張しなさい # データ数(10). 入力処理(L) :- データ数(_データ数), length(L,_データ数), findall([_名前,_年齢,_電話番号],( append(_,[_|_],L), '名前・年齢・電話番号の入力'(_名前,_年齢,_電話番号)),L). '名前・年齢・電話番号の入力'(_名前,_年齢,_電話番号) :- 催促後に行入力('名前・年齢・電話番号をカンマ区切りで入力してください ',_行), 項目区切り_行,[',',' '],[_名前,_年齢,_電話番号]). 催促後に行入力(_催促,_行) :- write(_催促), 行入力(_行). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). 年齢順にデータを表示(LL) :- 年齢をキーとする(LL,LL2), sort(LL2,LL3), キーを外す(LL3,LL4), データを表示(LL4). 年齢をキーとする(LL1,LL2) :- findall([_年齢|L], member([_名前,_年齢,_電話番号],LL1),_先頭に年齢付加されたLL). 年齢キーを外す(LL1,LL2) :- findall(L,member([_|L],LL1),LL2). データを表示(L) :- forall(member([_名前,_年齢,_電話番号],LL), writef('%w,%w,%w\n',[_名前,_年齢,_電話番号])). sort([],[]) :- !. sort([A|R1],L) :- partition(A,R1,L1,L2), sort(L1,L11), sort(L2,L22), append(L11,[A|L22],L). partition(_,[],[],[]) :- !. partition(A,[B|R1],[B|R2],R3) :- B @< A, partition(A,R1,R2,R3),!. partition(A,[B|R1],R2,[B|R3]) :- B @>= A, partition(A,R1,R2,R3),!. 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび_1), 文字列ならびの中で数値に変換可能なものは変換する(_区切られた文字列ならび_1,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列).