このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1342966104/46
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク):次のプログラムを一つ一つ手順を追って説明せよ。 
#  http://ime.nu/codepad.org/iARWUPGk 
#  
#  #include 
#  #include 
#  
#  #define BIRDTHDAY_SIZE        (3)
#  #define BOOKSIZE        (128)
#  
#  struct addressSheet {
#          char *name;
#          int group;
#          char *phone;
#          char *address;
#          int birthday[BIRDTHDAY_SIZE];   /* 年月日 */
#  };
#  
#  #define NUM (4)
#  struct addressSheet addressBook[BOOKSIZE] = {
#          {"Mary", 2, "075-123-1232", "Aneyakouji, Shimogyo", {1983, 12, 1}},
#          {"John", 1, "075-123-2135", "Rokkaku, Shimogyo", {1978, 5, 17}},
#          {"Tom", 3, "075-123-1234", "Takoyakushi, Shimogyo", {1980, 1, 15}},
#          {"Sam", 1, "075-321-2214", "Nishiki, Shimogyo", {1979, 6, 25}},
#  };
#  
#  void sortByName(struct addressSheet *, int);
#  int findMin(struct addressSheet *, int, int);
#  void swap(struct addressSheet *, int, int);
#  int compare(struct addressSheet *, struct addressSheet *);
#  void printSheet(struct addressSheet *);
#  
#  int main(void)
#  {
#          int i;
#  
#          sortByName(addressBook, 4);
#  
#          for (i=0; iname, q->name));
#  }
#  
#  void swap(struct addressSheet ary[], int i, int j)
#  {
#          struct addressSheet tmp;                /* データの待避先 */
#  
#          tmp = ary[i];
#          ary[i] = ary[j];
#          ary[j] = tmp;
#  
#          return;
#  }
#  
#  void printSheet(struct addressSheet *sheet)
#  {
#          printf("Name:\t%s\n", sheet->name);
#          printf("Group:\t%d\n", sheet->group);
#          printf("Tel:\t%s\n", sheet->phone);
#          printf("Address:\t%s\n", sheet->address);
#          printf("Birthday:\t%d/%d/%d\n", sheet->birthday[0], sheet->birthday[1], sheet->birthday[2]);
#  
#          return;
#  }

住所録(毬,2,'075-123-1232','姉屋小路,下京', 1983/12/1).
住所録(慈恩,2,'075-123-2135','六角,下京', 1978/5/17).
住所録(富武,3,'075-123-1234','凧薬師,下京',1980/1/15).
住所録(佐武,1,'075-321-2214','西区,下京',1979/6/25).

テーブル定義(住所録,1,名前).
テーブル定義(住所録,2,所属).
テーブル定義(住所録,3,電話番号).
テーブル定義(住所録,4,住所).
テーブル定義(住所録,5,生年月日).

名前順に整列(_名前順に整列した住所録) :-
名前を鍵として副目標を生成する(_副目標,_鍵,L1),
findall([_鍵|L1],call(_副目標),LL1),
名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録).

名前を鍵として副目標を生成する(_副目標,_鍵,L) :-
findall(_,(テーブル定義(住所録,_,_)),L),
_副目標 =.. [住所録|L],
テーブル定義(住所録,N,名前),
nth1(N,L,_鍵).

名前を鍵に整列して取り出す(LL1,_名前順に整列した住所録) :-
sort(LL1,LL2),
鍵を取り除く(LL2,_名前順に整列した住所録).

鍵を取り除く(LL2,_名前順に整列した住所録) :-
findall(L,member([_|L],LL2),_名前順に整列した住所録).