このディレクトリの索引

#  無題 投稿者:774 投稿日:2013/04/16(Tue) 17:04 No.6   
#  【質問テンプレ】
#  [1] 授業単元:C言語
#  [2] 問題文(含コード&リンク):
#  一次配列を指定した数参照(例だと3つ),配列の終わりに到達したら,最初に戻る.
#  これを数回繰り返すプログラム(例1)
#  また,例1で特定の条件を満たす場合,次回はその条件を満たした配列の次からスタート.
#  ※例2:条件を満たす数が複数含まれている場合,後ろを優先
#  例1
#  a[4]={1,2,3,4,5}
#  回数3
#  1回目 a[0]=1,a[1]=2,a[2]=3
#  2回目 a[3]=4,a[4]=5,a[0]=1
#  3回目 a[1]=2,a[2]=3,a[3]=4
#  
#  例2
#  条件:2の倍数→2と4
#  a[5]={1,2,3,4,5,6}
#  回数5
#  1回目 a[0]=1,a[1]=2,a[2]=3
#  ※a[1]が条件を満たすので,次回はa[2]から
#  2回目 a[2]=3,a[3]=4,a[4]=5
#  ※a[3]が条件を満たすので,次回はa[4]から
#  3回目 a[4]=5,a[5]=6,a[0]=1
#  4回目 a[1]=2,a[2]=3,a[3]=4
#  ※a[1],a[3]が条件を満たすので,次回はa[4]から
#  5回目 a[4]=5,a[5]=6,a[0]=1
#  
#  [3] 環境
#   [3.1] OS: Linux
#   [3.2] コンパイラ名とバージョン:gcc v3.3
#   [3.3] 言語:C
#  [4] 期限: 4/18
#  [5] その他の制限:stdio.h stdlib.hのみ
#  わかりにくい問題でごめんなさい。ヒントだけでもよろしくお願いします。

'ならびを指定した数参照,終わりに到達したら,最初に戻る'(_参照) :-
        'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照),
        Ln = [],!.

'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照) :-
        ならびを入力する(_ならび),
        繰り返し回数を入力する(_回数,_限界回数L),
        参照限界数を入力する(_参照限界数,_参照限界数L),
        'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],_参照限界数L,[],_回数L,_ならび,_ならび,[],_参照),
        _回数L = _限界回数L.

ならびを入力する(_ならび) :-
        write('ならびを項として入力してください(ピリオドで終わる) : '),
        read(_ならび).

繰り返し回数を入力する(_回数,Ln) :-
        整数を得る(繰り返し回数,_回数 > 0,_回数),
        length(Lmax,_回数).

参照限界数を入力する(_参照限界数,Lmax) :-
        整数を得る(参照限界数,_参照限界数 > 0,_参照限界数),
        length(Ln,_参照限界数).


'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L,_回数L,_,_,L1,L) :-
        reverse(L1,L).
'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L_1,_回数L,_ならび_1,_ならび,L1,L) :-
        'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],Lmax,[_|_回数L_1],_回数L,_ならび_1,_ならび,[],L).
'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[],_ならび,L1,L) :-
        'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,_ならび,_ならび,L1,L).
'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[A|R1],_ならび,L1,L) :-
        参照位置を得る([A|R1],_ならび,_参照位置),
        'ならびを指定した数参照,終わりに到達したら,最初に戻る'([_|Ln],Lmax,_回数L_1,_回数L,R1,_ならび,[[_参照位置,A]|R2],L).

参照位置を得る(L1,_ならび,_参照位置) :-
        append(L0,L1,_ならび),
        length(L0,_参照位置),!.