P5

変数とデータ型

変数とは

一般に、プログラミングでは様々なデータを使って計算や命令を行なうことになります。そのデータを保存しておくための入れ物のようなものを「変数」と言います。

データ型

変数にはデータ型というものがあり、例えば整数値を保存する変数にはそれ以外のデータ、例えば小数値や文字列などのデータを入れることはできません。変数にその変数のデータ型と異なるデータを入れようとすると、プログラムは実行時にエラーとなり停止します。

Processing で使われる主なデータ型には以下のようなものがあります。

 int   整数値
 float  小数値
 String  文字列
 boolean 真偽値 真(true)か偽(false)かのどちらかの値
 color  色のデータ
 char   1文字の文字データ

CやJavaを知っている人にはお馴染みのものだと思います。color型は色の情報を保持するためのProcessingに特有なデータ型です。String型だけ頭文字が大文字であることに注意して下さい。

変数の宣言と初期化

変数を使う場合、まず始めに変数の名前とそのデータ型を組にして「宣言」する必要があります。宣言していない変数は使うことができません。MATLAB や Python では変数の宣言はしなくても良いですし、変数ごとにあらかじめデータ型を決める必要も無いのですが、Processing においてはこれは必須となります。

変数の宣言は以下のように行ないます。

int value1;                // int型の変数 value1 を宣言
int value2 = 72;           // int型の変数 value2 を宣言し、72という値を代入
float value3 = 76.5;       // float型の変数 value3 を宣言し、76.5を代入
String s = "Hello world!"; // String型の変数 s を宣言し、文字列を代入
boolean b = true;          // boolean型の変数 b を宣言し、trueを代入

データ型 変数名;
もしくは データ型 変数名 = 初期値;
という形式で記述します。

2行目以降のように、宣言と同時に値を入力することもできます。このように、新たに宣言した変数に初期値を与えることを変数の初期化と言い、例えば2行目のint型変数 value2 は 72 で初期化されています。1行目のように初期値をセットされなかった変数には、初期値として特定の値が自動的に代入されます(int型、float型、color型の場合は 0 が、String型の場合は null が、boolean型の場合は false が代入されます)。

変数の利用

宣言した変数を利用して、計算をしたり関数の引数として使ったりすることができます。

size( 600, 400 );
background( 240 );

int x = 100;
int y = x;
int boxWidth = 400;
int boxHeight = boxWidth / 2;
color c = color( 100, 200, 200 );

fill( c );
rect( x, y, boxWidth, boxHeight );

color型の変数を初期化する際に color 関数を使っています。3つの引数はそれぞれ R, G, B値に対応します。


実行結果

データ型の変換

前述したように、変数はそれぞれのデータ型を持ち、異なるデータ型の値を代入することはできません。従って以下のようなプログラムはエラーになります。

int i = 10;
float f = 7.2;
int a = i + f; // この行がエラーになる

3行目で int型の変数 a に i + f を代入しようとして、エラーになっています。i + f の値は 17.2 であり小数値であるため、整数型の変数 a に代入することはできません。

データ型の変換を行なうことで、このような「型違い」の状況でも計算が行なえるようになります。

int i = 10;
float f = 7.2;
int a = i + int(f); // f を int型に変換した

3行目で f を int型に型変換しています。int型に型変換することで f の小数部分は切り捨てられ、整数値になります(7になります)。その結果、a には10 + 7 の値、つまり 17 が代入されます。

 型変換をするには、変換したいデータ型の名前の引数に変換したい変数を指定します。例えばあるint型変数を float 型にしたい場合は、float(変換したい変数名) とします。

切り捨て、切り上げ、四捨五入

上記の例のように、int()命令を使うと小数値の小数部分は切り捨てられますが、切り上げや四捨五入をしたい場合もあると思います。そのような場合には ceil 関数round 関数が利用できます。

float f = 7.2;
int a1 = int(f);   // 切り捨て
int a2 = floor(f); // 切り捨て
int a3 = ceil(f);  // 切り上げ
int a4 = round(f); // 四捨五入
println(a1); // a1 は 7 となる
println(a2); // a2 は 7 となる
println(a3); // a3 は 8 となる
println(a4); // a4 は 7 となる

int()とfloor()はどちらも切り捨てで、同じ命令になります。println()関数は、引数の値をコンソール(エディタ下部の黒い領域)に表示するための関数で、変数の値を確認するために使われます。

型変換が必要になる場面の例

整数値から小数値の型変換は、整数値同士の割り算を行なう際によく使われます。以下の例を見て下さい。

int a = 3;
int b = 10;
float answer = b / a; // 3.3333... になるはず
println( answer );    // 実際には 3.0 となる

10割る3を行なったので、3行目の変数 answer は 3.333333 になると期待されますが、実際には 3.0 という値になります。というのも、整数値同士の計算はその結果も整数になるようになっているからです。b/a の計算結果は小数部分が切り捨てられ 3 となり、これが float型の変数に代入されるため 3.0 という値が answer にセットされることになります。

このような事態を回避したい場合は、割り算の2つの値のうちどちらかを float型にすると良いでしょう。

int a = 3;
int b = 10;
float answer = b / float(a); // aを小数値に変換しておく
println( answer );    // 計算結果は 3.333333 となる

割り算の分母 a をfloat型にしたため、b/a の計算結果もfloat型となり、3.333333 という値がセットされます。

コメント

Copied title and URL