このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/131
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク):http://codepad.org/EEw71Jn2 
#  
#  [問1] 長さ100のstruct rocker型の配列 struct rocker Rockers[100]; を定義して、この中の所定の数のロッカーに乱数を格納するプログラムを以下の手続きにしたがって作りなさい。
#  
#  ○  データ構造として次の構造体を用意する。
#  struct rocker {
#      int data; //保存するデータ
#      char name[20]; //ロッカーのラベル
#  };
#  
#  ○  main関数の中身が次のようになるものとする。
#  int main() {
#          int N;
#          struct rocker Rockers[100];
#          scanf("%d", &N);
#          set_rockers(Rockers, N);
#          display_rockers(Rockers, N);
#  }
#  
#  上記main関数の中の
#   void set_rockers(struct rocker rockers[], int length); //0番目からlength-1番目のロッカーにラベル(name)と乱数(data)を格納する関数
#  および
#  void display_rockers(struct rocker rockers[], int length);//0番目からlength-1番目のロッカーのname, dataを全て表示する関数。
#  を次の仕様を元に定義し、プログラムを完成させなさい。
#  
#  set_rockers()の仕様:
#   例えば0番目のロッカーには
#      rocker[0].name が "rocker-0"という文字列がラベルとしてセットされ、
#      rocker[0].data に乱数(例:1804289383)がセットされます。
#  
#      ラベルをセットするにはsprintf()を使用すると便利です。
#   sprintf()は例えば
#   char str[100];
#   int i = 1;
#      sprintf(str, "rocker-%d", i);
#     とすると、strには"rocker-1"がセットされます。
#  
#   乱数はあらかじめ用意されている関数 int rand()を使用すると得ることが出来ます。ただし
#      #include 
#      が必要です。rand()は呼び出すたびに全く異なる数を返してきます。なお、rand()を使う前にsrand(0)を実行するようにしてください。
#  
#  display_rockers()の仕様:
#      printf("%s : %d\n", rockers[i].name, rockers[i].data);
#      をlength個分繰り返してください。
#  
#  
#  gcc kadai11-1.c
#  ./a.out
#  3
#  rocker-0 : 1804289383
#  rocker-1 : 846930886
#  rocker-2 : 1681692777
#  

'長さ100のならびを定義して、この中の所定の数のロッカーに乱数を格納する' :-
        長さ100のならびを定義して(_ロッカーならび),
        所定の数を得る(_数),
        length(Ln,_数),
        ロッカー位置と格納する値を乱数で決める(Ln,_ロッカーならび).

長さ100のならびを定義して(_ロッカーならび) :-
        length(_ロッカーならび,100).

所定の数を得る(_数) :-
        write('1以上100以下の数を入力しなさい : '),
        get_line(Line),
        所定の数診断(Line,_数),!.
所定の数を得る(_数) :- 所定の数を得る(_数).

所定の数診断(Line,_数) :-
        atom_to_term(Line,_数,_),
        integer(_数),
        _数 >= 1,
        _数 =< 100,!.
所定の数診断(Line,_) :-
        writef('入力された%tからは1以上100以下の数を得られませんでした。再入力をお願いします\n',[Line]),
        fail.

ロッカー位置と格納する値を乱数で決める([],_ロッカーならび) :- !.
ロッカー位置と格納する値を乱数で決める([_|R1],_ロッカーならび) :-
        '1から100の範囲のランダム値を得る'(_位置),
        指定位置のロッカーが空だったら(_位置,_ロッカーならび,_ロッカー),
        ロッカーにランダム値を格納する(_ロッカー),
        ロッカー位置と格納する値を乱数で決める(R1,_ロッカーならび).
ロッカー位置と格納する値を乱数で決める([_|R1],_ロッカーならび) :-
        ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|R1],_ロッカーならび).

'1から100の範囲のランダム値を得る'(_ランダム値) :-
        _ランダム値 is random(100) + 1.

指定位置のロッカーが空だったら(_位置,_ロッカーならび,_ロッカー) :-
        nth1(_位置,_ロッカーならび,_ロッカー),
        var(_ロッカー).

ロッカーにランダム値を格納する(_ロッカー) :-
        _ロッカー is random(0x100000000).

ロッカーが既に格納済みだったらもう一度ロッカーを捜す([_|R1],_ロッカーならび) :-
        ロッカー位置と格納する値を乱数で決める([_|R1],_ロッカーならび).