パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
データの並び替え(大きい順、小さい順など)は、まさしくパソコンにまかせるべき作業です。
人間ならうんざりするような、何千、何万というデータの並び替えを文句も言わず、瞬時に
こなしてくれます。
データの並びかえや、最大値、最小値の検索、順位づけなども、配列を使います。
データの並び替えについては、いろいろな方法が研究されていますが、以下に一番単純な
バブルソートによるデータ並び替え(小さい順)のプログラム例を示します。
バブルソート法というのは、隣同士のデータを順番に比較し、入れ替えていく方法です。
ここでは、小さい順に並べ替えなので、隣同士を比較し、
・前のデータ<後ろのデータ ならそのまま
・前のデータ>後ろのデータ なら入れ替え
という作業を繰り替えしていきます。
N個のデータがある場合、1回目はN−1回隣同士を比較し入れ替えます。これで、一番大きい
データは一番後ろに移動します(一番大きいデータの確定)。一番大きいデータは確定したので、
2回目は、残りのN−1個のデータの入れ替えです。今度はN−2回隣同士を比較し入れ替えま
す。これで、2番めに大きいデータが、後ろから2番目に確定します。以下、N−2,N−3個の
データの入れ替えという作業をくりかえします。N個のデータの場合、結局N−1回の作業で、
並べ変えが完了します。
データ4個(5,9,4,3の場合)
1回目のソート 2回目 3回目
5 −>5 5−>4 4−>3
9 −>9 −>4
4−>5−>3 3−>4
4 4 −>9−>3
3 3−>5 5
3 3−>9
9 9
9は確定 5が確定 全部確定
BUBSORT.BAS(N88互換Basic for Win用)
データは9個乱数で発生させています
1 'バブルソート
5 CLS
10 randomize val(right$(time$,2))
15 n=9 'データ個数 ここでは9個
20 for i=0 to n
30 a(i)=int(rnd*100): print a(i); 'a(0)からa(9)にデータ設定
40 next
50 'バブルソート
60 for i=n to 1 step -1 'ソートするデータ個数は1かい毎に減少
70 for j=0 to i-1 'ソートするデータは 0
からi−1(=n−1)番まで
80 if a(j)>a(j+1) then swap a(j),a(j+1) '前のデータ>後ろのデータ なら入れ替え
90 next j
100 next i
110 print:print "結果PRINT"
120 for i=0 to 9
130 print a(i);
140 next
150 print:print "もう1かいやる?(y/n)"
160 q$=input$(1)
170 if q$="y" or q$="Y" then goto 20
2 トランプのシャッフル
トランプもパソコンのゲームでよくありますが、カードの設定とシャッフルも配列を使うと簡単に
できます。
以下のプログラムは、シャッフルしてその結果を表示するものですが、変数等は次のように
設定しています。
0から52の数値にカードを設定します。設定ルールは以下の通りとします。
0 ジョーカー
1 から 13 ハート 1 が ハート
1
14 から 26 ダイヤ 14がダイヤ
1
27 から 39 クラブ
40から 52 スペード
この数値を配列 K() に設定します。K()
の添え字はカードが何枚目かを表します。
(例)
K(3) = 0 4枚目(配列は0からはじまるので)のカードがジョーカー
K(34) = 1 35枚めのカードが ハート 1
変数Q$()は表示用です。
例えば K(11) = 0 の場合
(12枚めのカードがジョーカー)
Q$(K(11)) は“ジョーカー ”と表示します。
K()の値でカードの種類が判別できるので、K()の値を判定することにより、いろんなトランプ
ゲームが作成できます。また、カードの表示はQ$(K(
))で行えます。
シャッフルは、1 から 52
までの乱数を発生させ
0番のカードと交換していくというやり方を
とっています。100回もやればかなり、混ざると思います。
乱数 5 ===> 乱数 2 ==>
K(0)=0 K(0)=5 K(0)=2
K(1)=1 K(1)=1
K(1)=1
K(2)=2 K(2)=2 k(2)=5
・・・・・・・ ・・・・・・・ ・・・・・・・・
k(5)=5 K(5)=0 K(5)=0
・・・・・・・・ ・・・・・・
・・・・・・・
トランプのカード設定、シャッフルの方法は他にもいろいろありますが、筆者はだいたいこの
方法でやりました。
SHUFFLE.BAS(N88互換BASIC for Win 用)
1 'SHUFFLE
10 dim q$(52),k(52)
20 cls
25 '初期設定
30 q$(0)="Joker***"
40 for i=1 to 13
50 q$(i)="ハート"+str$(i)
60 q$(i+13)="ダイヤ"+str$(i)
70 q$(i+26)="クラブ"+str$(i)
80 q$(i+39)="スペド"+str$(i)
90 next
92 for i=0 to 52
94 q$(i)=left$(q$(i)+" ",9)
96 next
97 for i=0 to 52
98 k(i)=i
99 next
100 'シャッフル
110 randomize val(right$(time$,2))
120 for j=0 to 100
130 i=int(rnd*52)+1
140 swap k(0), k(i)
150 next
155 '結果表示
160 for i=0 to 12
170 for j=0 to 3
180 print q$(k(i*4+j))+" ";
190 next j
195 print
200 next i
210 print q$(52)