17:定数と配列変数

◆PROCESSINGで始めるゲーム作りとコンピュータ

Desktop 17:定数と配列変数

今日の話題

 

20:変数と定数

以前の記事で、変数とは「変化する数」の事だと説明しました。そしてPROCESSINGでは、その変数がどんな種類なのかを示すために型を用いるのでした。

復習のために掲載しておくと、変数は以下のように定義します。
変数の定義
これで、整数( int型 )を扱う apple という名前の変数ができました。

リアル社会でも変化する数は沢山ありますよね。身長、体重、長さ、重さ、放射線量、髪の毛の数、シワの数・・・。最近、私の体重は増加するという変化しかしていません・・・(汗)。

変化する数がある一方で、変化しない数もあります。値が固定で決っているものです。このようなものを「定数」と呼びます。例えば

  • 円周率は3.14
  • 消費税は8%
  • 私はとりあえず男

など、将来は変わるかもしれないけど、当面は決まった値を採用するものです。

もちろんPROCESSINGでも定数を扱うことができます。定数は以下のように定義します。

定数宣言

変数との違いに注目して下さい。

先頭に「 final 」と書かれた部分がありますよね。定数は必ず「 final 」と書きます。こうする事で、以降に続く記述が変数ではなくて定数だよという事を、PROCESSINGに教えているのです。

次に、定数は宣言と同時に値を入れる必要があります。この例では「 PI = 3.14 ; 」と書いて、PI(円周率)という浮動小数点型( float型 )の定数に 3.14 を代入しています。

定数はプログラムの途中で値を変更する事ができません(だって、定数ですからね:笑)。定数に値を入れる事が可能なのは、宣言時だけ。つまりここで入れた値が、以降ずっと使われることになります。

ちなみに、暗黙のルールとして定数は全て大文字で書く事になっています。なので、pi とか Pi  ではなく PI と書きます。

整理すると、以下のようになります。

  • 定数は final と書く
  • 定数は宣言と同時に値を入れる
  • 定数の中身はプログラムの途中で変更できない
  • 定数は全て大文字で書くのが暗黙のルール

例えば上記のプログラムで、NAME、SEX、SYUZOKUは何れも文字列型(String型 )の定数です。job は文字列型(String型 )の変数です。

定数宣言2
定数を大文字で記述する事で、プログラム中に登場する名前が変数なのか定数なのかを、プログラムを作る人(プログラマー)が判断しやすいように工夫しています。

 

21:配列変数

プログラムでは、ある種類(整数とか文字列とか)の変数を、たくさん扱いたい場面が登場します。

たとえばRPGで、キャラクターが持っているアイテム一覧を作る場合を考えてみましょう。

itemlist01
(画像URL:ドラクエ9(DS版)攻略プロジェクト 様)

1人のキャラクターが8個までアイテムを持てるとします。これを単純な変数としてプログラムすると、以下のようになります。

非配列結果
わかり易いといえばそうなんですが・・・なんだか冗長でスッキリしません(汗)。

持ち物が16個まで持てるゲームでは、item1、item2、item3…という記述が16行続いてしまいます。これは辛いですね(笑)。

こんな時に使えるのが「配列」という考え方です。

配列とは同じ種類の変数をひとまとめにし、個々の変数に「添字」と呼ばれる番号をつけて扱えるようにしたものです。

例えば洋服をしまうタンスを思い浮かべてください。タンスには(原則として)服しか入れないものとします。タンスの中に「おもちゃ」や「食べ物」を入れてはいけません(笑)。

こう考えるとタンスは「服」という型のデータを格納する入れ物(変数)だと考えることができます。この時、タンスの各引き出しが配列になります。

タンスの引き出しに0、1、2、3・・・と番号(添字)を割り振り、「1番目の引き出しに青いパンツをしまってね」というふうにプログラミングします。

タンス
(画像URL:illust-AC 様:かえるWORKSさん、acworksさん)

先ほどの例題を配列変数を使ってプログラミングしてみました。こんな感じになります。

String[]  item ;
という箇所に注目して下さい。ここで item という名前の文字列( String )を格納する配列変数を宣言しています。

配列宣言型( String )の後ろにカッコ([])が付いています。これで item という変数が、タダの変数ではなくて配列変数だよという事をPROCESSINGに教えているのです。

ただし配列変数は、宣言しただけでは使えません。宣言しただけでは、予約しただけで実体が無いからです。

例えるなら電車や飛行機の切符のようなものです。「X月Y日の8:00発に乗りますね」と予約しただけで、まだ切符は購入していません。とうぜん電車や飛行機に乗ることはできません(笑)。

予約
(画像URL:SFJ STARFLYER JAPAN 様)

その下にある
item  =  new  String [ 8 ] ;
と書かれた部分が、宣言した配列変数を確保している部分になります。

配列確保
ここで8個の文字列を格納する箱を作っています。列車の例なら、切符を8枚購入したわけですね。これで item という配列が使えるようになりました。

new というのは「新しい領域(実体)を作ってね」という命令です。

new は、その後ろに書かれた種類(型)の変数領域を確保します。new で作成できるのは、配列変数か、次章で解説するクラスのインスタンス変数となります。配列ではない普通の変数は new で作ることはありません。

この2行の部分は、以下のように1行で記述する事も可能です。これでも同じ意味になります。

配列変数は添字と呼ばれる番号で、値の出し入れを行います。

例えば
item [ 0 ] = “短剣” ;
なら、item という配列変数の先頭( 0番目)に “短剣” という文字列を格納します。

PROCESSINGでは、添字は必ず 0 番から始まります。1からではありません。例えば 8 個の配列変数を確保した場合なら、添字の範囲は 0 から 7 ( 8 – 1 )となります。

配列変数説明(画像URL:maskworld 様、illust-AC 様:きららさん)

一番下にある for() 文は、「15:繰り返し処理の実装」の記事で説明した繰り返し処理ですね。

この例ではループ変数( i )を用意して、i を 0 に初期化しています。そして i が item.length 以下の間だけ繰り返し処理を行います。

配列変数は、配列変数名 . length  と書くことで、配列変数の数(この場合は 8 個)を取得する事ができるのです。もちろん

と書いても同じです。

i  が0なら、item [ i( 0 ) ] 番目の文字列をコンソール領域に表示( println() )します。
i  が1なら、item [ i( 1 ) ] 番目の文字列をコンソール領域に表示( println() )します。
i  が2なら、item [ i( 2 ) ] 番目の文字列をコンソール領域に表示( println() )します。

このように添字で読み書きできる配列変数は、ループ処理と非常に相性が良いため、ループ処理と組み合わせて用いられることが多いです。

また配列変数は、宣言と同時に値を入れる事も可能です。変数でも
int   apple  =  100 ;
として、宣言と同時に値を入れましたよね。同じことができるのです。

配列変数の初期化は、
型 []  変数名 = { 初期値1,  初期値2,  初期値3,  … 初期値n  } ; 
と記述します。

例えば、こんな感じです。

上記なら、item という文字列型の配列変数を用意し、各配列にアイテムの名前を格納します。

こういう書き方でもOKです。

でも、残念ながら上記のように2行にわけて記述する事はできません。ここは注意が必要です。

ここまでの説明を元にプログラムを書き直すと、以下のようになります。

すごくスッキリしました(笑)。

 

Forest今日の言葉

・配列変数

同じ種類の変数をひとまとめにしたものです。1枚、1枚の紙が変数(文字列を書く変数)なら、それをまとめたノートが配列変数です。

・添字

ノートで言えば、何ページという情報になります。配列の中にある1つ1つの変数を示す番号です。PROCESSINGでは、添字は必ず0から始まります。

 

scroll今日の文法

・変数名 = new 型またはクラス名

型またはクラス名で指定された領域を新規作成する命令です。より正確に言うと、オブジェクト(クラスや配列)のインスタンスを生成する命令になります。

・配列変数名.length

配列変数にまとめられた変数の数を取得します。

 

 今日のまとめ

  • 定数はプログラムの中で変更しない固定値を管理する
  • 同じ情報をまとめたものに配列がある
  • 配列は new で実体を確保し、添字でアクセスする

18:オブジェクト指向とクラスへ進む
16:関数と構造化プログラミングに戻る
目次へ戻る


本ページで利用している特に参照元記載のないアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。