VCSSLプログラミングの基本

ここからは、いよいよ実際にプログラミングを行ってみましょう。まずは、基本事項を扱います。


画面を最大化する

最初に、リニアンプロセッサーの画面を最大化しましょう。すると、画面内容がプログラミングに適したデザインに変化します。

このように、INPUTエリアがかなり大きくなりました。ここにプログラムを記述していきます。なお、INPUTエリアの文字サイズは、「Ctrl」+「U」キーで大きく、「Ctrl」+「D」キーで小さく調整できます。

ところで、リニアンプロセッサーは、INPUTエリアの記述内容が、数式か、それともプログラムなのか、一体どうやって判断しているのでしょうか? その答えは、セミコロン記号「 ; 」の有無です。つまり、INPUTエリアの記述内容がセミコロン記号「 ; 」を一個でも含む場合、それは数式ではなく、VCSSLによるプログラムと見なされます。

値をOUTPUTエリアに表示してみる

それでは、まずは何かしらの値を、OUTPUTエリアに表示してみましょう。INPUTエリアに以下のように記述し、「 = 」ボタンを押してください。プログラムが実行されます。

output( 100.0 ) ;

最後のセミコロン記号「 ; 」は忘れがちなので、注意してください。必ず必要です。 実行した結果、OUTPUTエリアに以下のように表示されます。

- OUTPUT -

100.0

なお、実行したプログラムを終了させるには、もう一度「 = 」ボタンを押します。

さて、上の例では、output関数を呼びました。この関数は、sin関数やcos関数のように値を返すものではなく、呼ぶ事自体に意味がある関数です。とにかくoutput関数は、呼ばれると、引数の内容をOUTPUTエリアに表示するという機能を持っているのです。

値を様々な形で表示する

ところで、OUTPUTエリア以外にも、値を表示する事ができます。以下のプログラムを実行してみてください。

- INPUT -
output( 100.0 ) ;
println( 200.0 ) ;
alert( 300.0 ) ;

このプログラムを実行すると、OUTPUTエリアに「 100.0 」と表示され、CONSOLEエリアに「 200.0 」と表示され、さらに画面中央にメッセージウィンドウが出現し、「 300 」と表示されます。

この例のように、複数行の処理を記述すると、上の行から下の行へ、順番に実行されます。この性質は全ての基本なので、よく把握しておきましょう。

計算を行う

続いて、簡単な計算を行ってみましょう。以下のように記述し、実行してみてください。

output( 1.0 / 2.0 ) ;

実行すると、OUTPUTエリアに以下のように表示されます。

- OUTPUT -

0.5

このように、正しく計算できました。

ただし、ここで一つ、注意が必要な点があります。 それは、「 数値には小数点を付けておく 」という点です。もし、小数点を省略したらどうなるのでしょうか? 実際にやってみましょう。

- INPUT -
output( 1 / 2 ) ;

実行すると、OUTPUTエリアに以下のように表示されます。

- OUTPUT -

0

このように、0.5ではなく、0と表示されてしまいました。これはなぜでしょうか?

実は、VCSSLをはじめとする多くのプログラミング言語では、整数同士の除算( 割り算 )の結果は、整数になるというルールがあります。そのため、0.5の小数点以下が切り捨てられて、0になってしまったのです。

そこで、特に除算の際などは、数値の末尾に小数点をつけて、整数ではなく小数にしておく事で、この問題を防ぐ事ができるというわけです。

変数を使う

計算結果は、変数に格納する事ができます。例として、「 value 」という名前の変数に計算結果を格納し、表示してみましょう。

- INPUT -
float value ;                 // 変数「value」を用意
value = ( 1.0 / 2.0 ) * 3.0 ;    // valueに計算結果を格納
output( value ) ;             // valueの中身を表示

ダブルスラッシュ「 // 」より右は、コメントとして無視されます。

変数を用意する行で、先頭に「 float 」というキーワードが存在します。これは、小数を扱う変数を用意する事を意味するキーワードです。 他にも、整数を扱う事を意味する「 int 」などがあります。

実行すると、OUTPUTエリアに以下のように表示されます。

- OUTPUT -

1.5

このように、変数に計算結果を格納する事ができました。

ユーザーに値を入力してもらう

変数を使う事で、プログラム実行中に、ユーザーに値を入力してもらう事ができます。それには、以下のようにinput関数を使用します。

- INPUT -
float value = input( "数値を入力してください" ) ;
output( value ) ;

実行すると、ユーザーが入力した値がそのまま出力されます。

なお、上のinput関数のように、文字列を引数とする関数も存在します。プログラム中で文字列を記述する際は、必ずダブルクォーテーション記号「 " 」で挟まなければいけないというルールがあります。慣れない間は忘れがちなので、ご注意ください。

条件分岐 ― if 制御構文 ( if 文 )

変数に格納されている数値に応じて、処理を分岐させたい場合があるかもしれません。それには、if 制御構文( if 文 )を使用します。以下のように記述し、実行してみてください。

- INPUT -
float value = input( "数値を入力してください" ) ;

if ( 3.0 <= value ){
    output( "3.0以上です" ) ;
}
else{
    output( "3.0未満です" ) ;
}

このプログラムを実行すると、入力した値が3.0以上か、未満かを答えてくれます。

このように、if 制御構文では、( ) の中に記述した条件が成立した際に、その直後の { } の中身の処理が実行されます。反対に、条件が成立しなかった場合は、その後の else{ } の中身が実行されます。

なお、条件には以下のような種類があります。

- 条件の種類 -

a <= b     … aがb以下か?
a < b      … a がb未満か?
a == b     … aとbが等しいか?
a != b      … aとbが異なるか?

条件繰り返し ― while 制御構文 ( while文 )

続いて、条件が成立している間、処理を繰り返させてみましょう。それには、while制御構文( while文 )を使用します。以下のように記述し、実行してみてください。

- INPUT -
int counter = 0 ; // 整数を扱う変数を用意(カウンタ)

while( counter <= 10 ){
  println( "繰り返し中 … " + counter ) ;
  counter = counter + 1 ; // カウンタを1加算
}

println( "繰り返しから脱出しました" );

実行すると、CONSOLEエリアに以下のように表示されます。

- CONSOLE -

繰り返し中 … 0
繰り返し中 … 1
繰り返し中 … 2
繰り返し中 … 3
繰り返し中 … 4
繰り返し中 … 5
繰り返し中 … 6
繰り返し中 … 7
繰り返し中 … 8
繰り返し中 … 9
繰り返し中 … 10
繰り返しから脱出しました

このように、while 制御構文では、 ( ) の中に記述した条件が成立している間、ずっと { } の中身の処理が繰り返されます。

回数繰り返し ― for 制御構文 ( for文 )

上のように、一定の回数だけ処理を繰り返すような場合は、while制御構文よりも、for制御構文( for文 )を使用したほうが、シンプルに記述できます。実際に使ってみましょう。

- INPUT -
for ( int counter = 0 ; counter <= 10 ; counter++ ){
  println( "繰り返し中 … " + counter ) ;
}

println( "繰り返しから脱出しました" );

実行すると、CONSOLEエリアに以下のように表示されます。

- CONSOLE -

繰り返し中 … 0
繰り返し中 … 1
繰り返し中 … 2
繰り返し中 … 3
繰り返し中 … 4
繰り返し中 … 5
繰り返し中 … 6
繰り返し中 … 7
繰り返し中 … 8
繰り返し中 … 9
繰り返し中 … 10
繰り返しから脱出しました

このように、先ほどと全く同じ結果が得られました。for制御構文の ( ) の中身は、以下のような意味を持っています。

- for制御構文の形式 -
for( カウンタ変数の用意 ; 繰り返し条件 ; カウンタ変数++ )

このように、一定の回数繰り返すのに必要な、カウンタ変数の用意や、加算していくような処理を、 ( ) の中にまとめて記述する事ができます。

配列 ― いくつもの値を格納できる、特殊な変数

変数は通常、1つの値しか格納できません。しかし、多くの値を格納できる、「 配列 」というものも存在します。配列は、

- 配列宣言の形式 -
float 配列名[ 要素の個数 ] ; 

などと宣言します。そして、例えば3番目の要素に値を格納したければ、

- 配列の要素へのアクセス -
配列名[ 3 ] = … ; 

などとします。

ここで注意が必要なのは、使用できる要素の番号は、[ 0 ]番目から、[ 要素の個数-1] 番目までであるという事です。[ 要素の個数 ]番目は、容量オーバーで使用できません。

例として、5個の値を格納できる配列を使用してみましょう。以下のように記述し、実行してみてください。

- INPUT -
float values[ 5 ] ;  // 0番〜4番まで、5個の値を格納できる配列を用意

// 値の入力
for( int i=0; i<5; i++ ){
    values[ i ] = i * i ;    //  i番目の要素に、iの2乗を格納
}

// 中身の表示
for( int i=0; i<5; i++ ){
    println( values[ i ] ) ;    //  i番目の要素の中身を表示
}

実行すると、CONSOLEエリアに以下のように表示されます。

- CONSOLE -

0.0
1.0
4.0
9.0
16.0

このように、配列valuesに、5つの値を格納できた事が分かります。

数値ファイル入出力の前に…

本章の最後として、数値ファイルの入出力を扱います。これまでと比べて少し難しいですが、便利なのでぜひマスターしましょう。

ファイル入出力を行うには、まず、実行するプログラムを適当な場所に保存しておく必要があります。これは、その場所と同じフォルダ内で入出力が行われるためです。メニューバーから

  「 File 」メニュー > 「 Save File ― 保存 」メニュー

を選択し、適当な場所にプログラムを保存してください。ENCODEはAUTOでかまいません。

数値ファイルにデータを書き出す
( ファイル出力 )

まずは、ファイル出力を行いましょう。最初に、openw関数でファイルを開き、そのファイルのIDを整数の変数で取得します。そして、writeln関数で内容を書き出し、最後にclose関数でファイルを閉じます。

- INPUT -
// ファイル「test.txt」を書き込みモードで開き、ファイルIDを整数変数に格納
int fileID = openw( "test.txt" ) ; 

for( int i=0; i<5; i++ ){

    // ファイルに、iとi*iの値を空白区切りで書き込み、改行する
    writeln( fileID, i, i*i ) ;

}
close( fileID ) ;  // ファイルを閉じる
println( "書き込み完了" ) ;

実行し、「 書き込み完了 」と表示されたら、プログラムと同じフォルダに生成されている、「 test.txt 」というファイルを、テキストエディタで開いてみてください。

- test.txt -

0     0
1     1
2     4
3     9
4     16

このように、ちゃんと書き込めました。

数値ファイルからデータを読み込む
( ファイル入力 )

続いて、今度はこのファイルを読み込んでみましょう。まずopenr 関数でファイルを開き、そのファイルのIDを整数の変数で取得します。続いて、countln関数でファイル行数を取得します。そして、readln関数で一行の内容を読み込んで配列に格納し、最後にclose関数でファイルを閉じます。

- INPUT -
// ファイル「test.txt」を読み込みモードで開き、ファイルIDを整数変数に格納
int fileID = openr( "test.txt" ) ; 
int lineN = countln( fileID ) ;    // ファイル行数を取得
int values[ 2 ] ;                // 1行の内容を、空白区切りで取得する配列

for( int i=0; i<5; i++ ){

    // ファイルから1行を読み込み、空白区切りで配列に格納
    values = readln( fileID ) ;
    println( values[ 0 ] , values[ 1 ] );

}
close( fileID ) ;  // ファイルを閉じる
println( "読み込み完了" ) ;

実行すると、CONSOLEエリアに以下のように表示されます。

- test.txt -

0     0
1     1
2     4
3     9
4     16
読み込み完了

このように、ちゃんと読み込めました。