このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1245853701/244
# 〔1〕授業単元:C言語
# 〔2〕問題文:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9601.txt
# ・2つの整数型の変数を入れ替える関数 swapを定義して、それを用いて配列中の数字をランダムに入れ替えるプログラムを作りなさい。
#   1から52までの数が順番に入った配列を用意し、十分に入れ替えた結果を表示すること。
# これができた人は、次のように表示を変更しなさい。
# ・	52個の数字を1〜13、14〜26、27〜39、40〜52の4組に分けて考える
# ・	それぞれ1番目から13番目の数字を、A、2、3、4、5、6、7、8、9、T、J、Q、K
と表示する(TはTenのT)
# 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,2,0,21,22,…
# 				↓
# A,2,3,4,5,6,7,8,9,T,J,Q,K,A,2,3,4,5,6,7,8,9,T,…
# ?これができた人は、次のように表示を変更しなさい。
# ・トランプの4つのスートをアルファベットで表示することにする(スペードは s, ハート
#  はh、ダイヤはd、 クラブはc)
# ・	1〜13はスペード(s)、14〜26はハート(h)、27〜39はダイヤ(d)、40〜52はクラブ(c)とする
# ・	それぞれの数字をA〜Kとshdcの組合せで表示する
# ・	例:1ならAs(スペードのA)、52ならKc(クラブのK)
# As,2s,…..,Ks,Ah,2h,……,Kh,Ad,2d,……,Kd,Ac,2c,…..,Kc

swap(A,B,L,LX) :-
append(L1,[A|L2],[B|L3],L),
append(L1,[B|L2],[A|L3],LX),!.
swap(A,B,L,LX) :-
append(L1,[B|L2],[A|L3],L),
append(L1,[A|L2],[B|L3],LX),!.

t319_2(X) :-
findall(U,(
between(1,52,N),
t319_2_1(N,U)),X).

t319_2_1(N,U) :-
M is N mod 13,
'数字カード・絵カード'(M,U).

'数字カード・絵カード'(1,'A') :- !.
'数字カード・絵カード'(10,'T') :- !.
'数字カード・絵カード'(11,'J') :- !.
'数字カード・絵カード'(12,'Q') :- !.
'数字カード・絵カード'(0,'K') :- !.
'数字カード・絵カード'(N,N).

トランプの準備(X) :-
findall(U,(
between(1,52,N),
一枚のカードを作る(N,U)),_整列したカード),
トランプを切る(100,_整列したカード,X).

一枚のカードを作る(N,U) :-
M is N mod 13,
M2 is (N - 1) // 13,
数字カード・絵カード(M,U1),
カードの種類(M2,U2),
atom_concat(U1,U2,U).

カードの種類(0,s).
カードの種類(1,h).
カードの種類(2,d).
カードの種類(3,c).

トランプを切る(0,L,L) :- !.
トランプを切る(N,L,X) :-
M1 is random(52) + 1,
M2 is random(52) + 1,
swap_nth(M1,M2,L,L1),
N2 is N - 1,!,
トランプを切る(N2,L1,X).

swap_nth(M,N,L1,L2) :-
nth1(M,L1,A),
nth1(N,L1,B),
swap(A,B,L1,L2),!.

swap(A,B,L,LX) :-
append(L1,[A|L2],[B|L3],L),
append(L1,[B|L2],[A|L3],LX),!.
swap(A,B,L,LX) :-
append(L1,[B|L2],[A|L3],L),
append(L1,[A|L2],[B|L3],LX),!.

append([],L2,L3,L4) :-
append(L2,L3,L4).
append([U|L1],L2,L3,[U|L4]) :-
append(L1,L2,L3,L4).