一年課題10 - 配列の使い方 変数の各処理について

今回は配列の使い方について説明します。

変数を知らない場合は、先に変数の使い方を見ることをおすすめします。


配列とは
配列とは、変数の機能を拡張して考案された多次元的な変数を指す。

変数ではそれぞれ名前をつけて値を記録していたが、それでは複数の値の関連性や、連続した複数の変数の値を処理することができない。
そのため、それを補うために配列という方法で、一つの変数に番号を振って利用する。
その際には変数の型の後に、必ず[]という記号を入れ、配列であることを示さなければならない。
使用言語:processing

コード1

int[] a = {1,5,23,342}; // aという配列を宣言し値を代入する
float[] b = {3.12,636.1,2.2,-1.442}; // 以下は上の少数、文字の場合
string[] c = {"I","dont","like","processing"};

このように、processingやjavaにおいてはその配列を宣言した際にその値を代入することが良いとされている。
もし、宣言した際に値が準備されていない場合、代わりの適当な値を代入しておき、値が準備された後にその値を上書きするという方法が使われる。
他の方法として、先に配列として宣言しておき、その後各場所へ値を代入する方法があるが、若干わかりづらくなる。

コード2

int[] a; // aを配列として宣言
a = new int[] {1,5,23,342}; // 配列aの中に値を代入

この方法のメリットは、最初にいくつの値が代入されるか予測できない場合などに利用しやすい。
配列は宣言時にいくつの値を代入できるようにするか指定することができる。
また、この宣言方法は、他言語では利用できない可能性が高い。これは、各言語において若干の仕様の違いがあり、共通した書き方が存在しないためである。
また、配列を使用する場合は以下のようになる。

コード3

println(a[0]); // 配列の値を出力する

コード3は、コード1や2で宣言した配列の一部を出力している。
変数の名前(この場合はa)の後に[]で囲った数字があるが、それが配列の値の位置を示している。
一番最初の位置にある値を取得する場合は、1ではなく0で位置を示す。

配列の他の使用方法として、複数の値をwhileやforなどの繰り返し処理で代入、または取り出すことができる。

コード4

int[] a = {2,5,2,62,5}; // 配列内に各値を代入

for(int i = 0; i <= 4;i++){ // for文を利用して内部を繰り返す、for文については同記事内繰り返し処理についてを参照
println(a[i]); // 配列内の値を順次出力
}

コード4では、代入された値をfor文で繰り返し、その配列からデータを取り出している。
このコードの出力の際に使われた部分に注目してもらいたいが、コード3では数字を入れていた部分に、今度は変数を入れていることがわかる。
これは、配列の大きな特徴の一つで、配列の値の位置を変数で表現することができるのだ。
値の位置は数字で表わされるため、int型などの整数の変数を利用して処理が可能になる。
また、先ほど書いたとおり、配列の値の位置は0から始まるため、最初から全ての配列の値を取り出す場合は初期値を0にしておく必要がある。
これを利用することで、100個の値をたった数文で書くことができる。


変数の各処理について
プログラミングにおいて、値の演算、分岐、そして繰り返しは重要な要素である。

前回の説明では、変数の概要を説明し、今回は配列について説明したが、重要なこの3要素を飛ばして説明していた。
この章では、主に変数の各処理について解説していく。

演算記号の利用
プログラミングにおいて代入とは、=(イコール)で表されるものを指す。左辺に変数などを置き、右辺に値などを置くことでその値などを変数へ代入することができる。
使用言語:processing

コード5

int a = 24; // 左辺へ右辺の値を代入している

これは前回説明しているが、もし、足し算や引き算、掛け算、割り算を行いたい場合はどうなるのか。
以下はその説明である。

コード6

int a = 5 + 2; // 左辺へ右辺の5+2(足し算、7)を代入している
int b = 4 - 2; // 左辺へ右辺の4-2(引き算、2)を代入している
int c = 3 * 5; // 左辺へ右辺の3*5(掛け算、15)を代入している
int d = 42 / 2; // 左辺へ右辺の42/2(割り算、21)を代入している

このように、足し算、引き算は小学生の頃から使われる計算記号を用いられるが、掛け算、割り算に関しては計算記号がキーボード上に存在しないため、代わりに別の記号が用いられる。
掛け算を行う場合は*(アスタリスク)を用いる。
割り算を行い場合は/(シャープ)を用いる。
これらは四則演算と呼ばれ、通常の計算方法として用いられている。

コード7

int a = 4; // aに4を代入
int b = 6; // bに6を代入
int c = a + c; // cにaとcを足した結果を代入
int d = a - c; // dにaからcを弾いた結果を代入
int e = a * c; // eにaとcを掛けた結果を代入
int f = a / c; // fにaをcで割った結果を代入

四則演算などは変数同士を演算することが可能で、コード7のような方法が利用できる。
もちろん、配列も利用できる。
コード7のfに関して、値はどうなるだろうか。
答えは、0である。
理由は、fは整数型であるということが大きな理由である。
わかりやすく説明すると、4 / 6は0.6666666....となる(循環小数となっているが、今回は考える必要はない)。
見れば分かる通り、これは少数になる。少数は整数値に入りきらない内容が含まれるため、それらは全て切り捨てられる。
そのため、0.6666...は6666...の部分が切り捨てられて0となる。

四則演算の他に%という記号も存在する。
これは、以下の様な使い方をする。

コード8

int a = 5; // aに5を代入
int b = 6; // bに6を代入
int c = a % b; // cにaをbで割った時の余りを代入

%という記号は、コード8のようにaをbで割った際の余りを求める記号である。
つまり、自分で割り算をした際に余りを求めるコードを書く必要がなくなるということである。
なお、コード8を実行すると、cには5が代入される。

これらの記号は演算をするために用いられるため、演算子と呼ばれている。


分岐について
演算をした値を利用する方法として、分岐という方法が使われる。

コード9

int a = 3; // aに3を代入
int b = 6; // bに6を代入

if(a == b){ // aとbが同じであるか
}
if(a != b){ // aとbが同じでないか
}
if(a < b){ // aがb未満か
}
if(a <= b){ // aがb以下か
}
if(a > b){ // aがbより大きいか
}
if(a >= b){ // aがb以上か
}

コード9のように様々な分岐の使い方がある。この分岐の代表例として、ifという関数がある。
if文とは内で記述した条件式が真である場合に内部の処理を実行するというものである。
この条件式は前の演算子に似ているが違い、比較のためなどの条件のために使われるため、条件演算子と呼ばれる。
この条件は複数の条件を一つの式内に入れることができる。

コード10

int a = 5; // aに5を代入
int b = 2; // bに2を代入

if(a != b || a > b){ // aとbが同じでないか、aがbより大きいか
}
if(a != b && a > b){ // aとbが同じでなく、aがbより大きいか
}

コード10のif文で使われている||と&&とは、条件分岐で利用される記号の一つである。

は、左右にある条件式のどちらかが真であれば内部の処理を実行するということを指す。

逆に&&は左右にある条件式の両方が真でなければ内部の処理を実行しない。


繰り返し処理について
プログラム内では同じ処理を何度も記述していると開発時間が長くなったり、ファイルサイズが大きくなったりと維持が面倒になるため、繰り返しができるような内容は繰り返しをしたり、同じ処理をまとめたりする。
その例としてこの繰り返し処理がある。

これにはwhile文とfor文が使われる。
whileでは、以下の様な使い方をする。

コード11

int a = 0; // aを初期化(0を代入)
int b = 100; // bに100を代入
int c = 1; // cに1を代入

while(a <= b){ // aがb以下の場合
c++; // cを1足す
a++; // aを1足す
}

whileの特徴は条件式が真である間は内部の処理を繰り返すというものである。
コード11のようにaが0の時は100より小さいため繰り返すが、何回か繰り返すとaが100に達するため、その後は条件式に当てはまらなくなるため、繰り返しを抜ける。

for文は以下のようになる。

コード12

int a = 5; // aに5を代入
int b = 0; // bを初期化(0を代入)
for (int i = 0;i <= 5;i++){ // iを初期化して5以下の場合
b = b + i; // bにiを足していく
}

for文の特徴は、条件式を入れる場所に3つの要素を入れることである。
まずひとつ目に、条件式や内部の処理で使われる値の初期化である。
ここで宣言した値は局所変数となり、for文の外では利用できない。
つまり、ここだけの変数として利用できるため、複数のfor文があっても干渉しなくなる。
次の要素として、条件式を当てはめることになる。複数の条件式を||や&&で区切って入れることが可能である。
最後の要素として、条件式や内部で使われる変数の値を足したりすることが可能ということである。
ここで足したり引いたりすることで、whileでは内部で記述していた処理がわかりやすくなる。

for文は実行される順番がわかりづらい点がデメリットであるが、それを克服できれば、非常に使いやすい繰り返しの関数であると思われる。

コード13

for(処理A;処理B;処理C){
処理D
}

コード13のように処理が入っていた場合、順番は以下のようになる。
1.処理Aの実行
2.処理Bの条件を確認、真でなければfor文を終了
3.処理Dを実行
4.処理Cを実行し、2へ戻る
for文も他の言語などでは、処理Aの位置で変数の宣言ができないなど、若干の違いがあるため注意が必要である。

これらの繰り返し処理においては、途中で繰り返しから抜ける関数breakが用意されている。

コード14

for(int a = 0; a <= 1000; a++){ // 繰り返し開始
if(a == 50){ // aが50になった時
break; // 繰り返しから抜ける
}
println(a); // aを出力する
}

コード14で使われたbreakは、aが50になった時にfor文の条件が真であっても繰り返しを抜けるため、何か問題があった時や、条件式では表せなかった場合などに繰り返しを抜けることができる。


このように、変数には様々な使い方ができる。
ここで紹介した内容はあくまでも一例だが、他に連結などの方法もある。