研究開発

はじめてのVectorScript

第3章 選択構造と反復構造

プログラムを書く上で重要な3大構造のお話はしましたが、ここでは実際にコードを書いてみましょう。
まずは選択構造です。PASCALにはIF文とCASE文の2つが用意されています。

比較した結果が真の場合に何かアクションさせたいときには、

PROCEDURE sample09;
VAR
	aa : INTEGER;
BEGIN
	aa := 0;
	IF aa = 0 THEN
	BEGIN
		Message( 'aa はゼロです。' );
	END;
END;
Run( sample09 );
      

IFとTHENの間に比較式を書きます。この場合、aaと0はイコールか?ということになります。
次のBEGINからENDの間に書かれているプロセスをaaと0がイコールのときのみ実行されます。
比較に使われる演算子は
「 = 」イコール
「 <> 」等しくない
「 < 」小さい
「 <= 」小さいかイコール
「 > 」大きい
「 >= 」大きいかイコール
があります。

比較した結果、真の場合と偽の場合それぞれに何かアクションさせたい時には、

PROCEDURE sample10;
VAR
	aa : INTEGER;
BEGIN
	aa := 0;
	IF aa = 0 THEN
	BEGIN
		Message( 'aa はゼロです。' );
	END
	ELSE
	BEGIN
		Message( 'aa はゼロではないです。' );
	END;
END;
Run( sample10 );
      

先ほどのプログラムにELSE文が加わっています。このときELSEの前行のENDの後に;をしてはいけません。
ELSEに続くBEGINとENDの間に書かれているプロセスを、この場合、aaと0はイコールではない場合実行されます。

PROCEDURE sample11;
VAR
	aa, bb : INTEGER;
BEGIN
	aa := 0;
	bb := 0;
	IF aa = 0 THEN
	BEGIN
		Message( 'aa はゼロです。' );
	END
	ELSE IF bb = 0 THEN
	BEGIN
		Message( 'bb はゼロです。' );
	END
	ELSE
	BEGIN
		Message( 'aa、bbはゼロではないです。' );
	END;
END;
Run( sample11 );
      

先ほどのプログラムにELSE IF文が加わっています。
ELSE IFとTHENの間に比較式を書きます。この場合、bbと0はイコールか?ということになります。
続くBEGINとENDの間に書かれているプロセスを、この場合、bbと0がイコールのときのみ実行されます。
そして続くELSEはaaとbbがともに0とイコールの時以外にのみ実行されます。
ELSE IFは比較式を追加していけますので、IF文とELSE文の間にいくつでも書けます。ですが、比較はあくまでも上から順ですので気をつけてください。
IF xxx THEN
BEGIN
END
ELSE IF yyy THEN
BEGIN
END
ELSE IF zzz THEN
BEGIN
END
ELSE
BEGIN
END;

また、比較式には数字だけではなく、文字列の比較も可能です。

PROCEDURE sample11;
VAR
	aa : STRING
BEGIN
	aa := 'yes';
	IF aa = 'yes' THEN
	BEGIN
		Message( 'aa はイエスです。' );
	END;
END;
Run( sample11 );
      

同じ選択構造でも、Case文は一つの比較式に対して、多数の比較対象を処理する場合に使われます。

PROCEDURE sample12
VAR
	aa : INTEGER;
BEGIN
	aa := 0;
	CASE aa OF
		0:
		BEGIN
			Message( 'aaはゼロです' );
		END; 
		1..10:
		BEGIN
			Message( 'aaは1から10です' );
		END; 
		OTHERWISE
		BEGIN
			Message( 'aaは0から10以外です' );
		END; 
	END;
END;
Run( sample12 );
      

CASE と OFの間に比較したい変数をいれます。
単独で数字を書いて:(コロン)を入れた行が比較対象となります。
数字..数字:とした場合は数字から数字までの間が比較対象となります。
OTHERWISEはすべての比較対象に含まれなかったその他の場合に流れてきます。

また、比較式をCHARにすることで、文字の比較もできます。

PROCEDURE sample13
VAR
	aa : CHAR;
BEGIN
	aa := '7';
	CASE aa OF
		'0'..'9':
		BEGIN
			Message('数字');
		END;
		'A'..'Z':
		BEGIN
			Message('大文字');
		END;
		'a'..'z':
		BEGIN
			Message('小文字');
		END;
		OTHERWISE
		BEGIN
			Message('対処外');
		END;
	END;
END;
Run( sample13 );
      

次に、反復構造です。PASCALにはFOR文とWHILE文、REPEAT文の3つが用意されています。

予め繰り返す回数が決まっている場合にはFOR文を使います。

PROCEDURE sample14;
VAR
	ii : INTEGER;
BEGIN
	FOR ii := 1 TO 10 DO
	BEGIN
		Message( ii );
	END;
END;
Run( sample14 );
      

FORとTOの間に初期値を書きます。この場合、iiは1から始めるということを意味します。
TOの場合は初期値を入れた変数が繰り返すたびに1づつインクリメント(足す)されていきます。
TOとDOの間に終了値を書きます。この場合、iiが10になったら終わりを意味します。
このFOR文の場合、iiが1から始まり1づつ足され10になるまで繰り返します。すなわちBEGINとENDの間を10回繰り返すことになります。

TOがDOWNTOとなった場合は初期値を入れた変数が繰り返すたびに1づつデクリメント(引く)されていきます。

PROCEDURE sample15;
VAR
	ii : INTEGER;
BEGIN
	FOR ii := 10 DOWNTO 1 DO
	BEGIN
		Message( ii );
	END;
END;
Run( sample15 );
      

条件を満たすまで繰り返すのがWHILE文とREPEAT文です。2つの違いは条件判定を前でするか後でするかの違いです。

PROCEDURE sample16;
VAR
	ii : INTEGER;
BEGIN
	ii := 1;
	WHILE ii <= 10 DO
	BEGIN
		Message( ii );
		ii := ii + 2;
	END;
END;
Run( sample16 );
      

WHILEとDOの間に比較式を書きます。この場合、iiが10以下の場合BEGINとENDの間のプロセスを繰り返すを意味します。

PROCEDURE sample17;
VAR
	ii : INTEGER;
BEGIN
	ii := 1;
	REPEAT
		Message( ii );
		ii := ii + 1;
	UNTIL( ii > 10  );
END;
Run( sample17 );
      

REPEATとUNTILの間にプロセスを書きます。
UNTILの後ろに終了の条件を書きます。この場合、iiが10より大きくなったら終了を意味します。