PASCAL 講座(塩田) 第5回
□ 列挙型
有限個の名前を列挙して定義する型を「列挙型」と言う。
列挙型変数の値はそこに列挙された名前のいずれかである。
列挙型変数については =, <>, <, >, <=, >= などの比較演算子が使える。
列挙型の値 x に対して
pred(x) は直前の値を表す
succ(x) は直後の値を表す
ord(x) は対応する整数値を表す(列挙した順に 0,1,2,... が対応する)
サンプルプログラム s5_1.p
□ 部分範囲型
論理型、整数型、文字型、列挙型(これらを合わせて順序型と言う) のデータの一部分として定義される型を「部分範囲型」と言う。
上限と下限を用いて定義し、配列の添え字に用いることができる。
アルファベットの ASCII コードを表示する サンプルプログラム s5_2.p
□ 集合型
部分範囲型のデータを要素に持つ集合をひとつのデータとして扱うことができる。 宣言の一般形は
type
集合型名 =
set of
部分範囲型 ;
または
var
集合変数名 :
set of
部分範囲型 ;
扱える集合の最大サイズはデフォルトでは 256。 それを増やしたいときはオプションを付けて
gpc [ソースファイル名] --setlimit=16384
のようにコンパイルする。
ふたつの集合変数 s, t に対して、集合演算
s*t(共通部分), s+t(和集合), s-t(差集合)
が定義されている。
ふたつの集合変数 s, t に対して、条件判定
s=t ( 等しい ), s<>t ( 等しくない ),
s<=t ( s が t に含まれる ), s>=t ( s が t を含む )
が定義されている。
また、要素の型の変数 x と集合 s に対して条件判定
x
in
s ( x が s に含まれる )
が定義されている。
エラトステネスの篩による素数表作成の サンプルプログラム s5_3.p
(コンパイル時に警告メッセージが出ますが気にせず実行してください。)
ちなみに、
配列を使った素数表作成の サンプルプログラム s5_3_1.p
の方が断然高速です。
計算機内部では集合型変数は「部分範囲」の長さのビット列として表現され、 共通部分、和集合などはビットごとの and や or で計算される。
□ 課題
全体集合 X の3つの部分集合 A, B, C に対して、
( A xor B ) xor C = A xor ( B xor C )
が成り立つ。ただし xor は排他的論理和を表す集合演算
A xor B = ( A + B ) - ( A * B )
である。
X = { 1,2,...,30 } のときにランダムに作った3つの部分集合 A, B, C について 上の公式を確かめるプログラムの
雛形 s5_4.p
をダウンロードして完成させよ。
戻る