- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- VstoneMagicを使ってみる/プログラミング/変数を使ったプログラムの作成 へ行く。
- 1 (2015-10-06 (火) 19:09:37)
- 2 (2015-10-06 (火) 21:45:19)
- 3 (2015-10-07 (水) 12:29:01)
- 4 (2015-10-08 (木) 10:01:26)
2.6. 変数を使ったプログラム †
本ソフトウェアの特徴として、変数機能があります。変数は値を記録したり計算することができるもので、これを使うことでより柔軟なプログラミングが可能です。それでは実際にプログラムを作成しながら変数の使い方を確認してみましょう。顔認識のプログラムに変数を組み込み、顔が認識されて既定の回数だけmot2メソッドが呼び出されたら、無限ループをbreakで抜けるプログラムにしてみます。
変数の作成と演算 †
変数を使う場合、まずは「変数宣言」のブロックで、名前や内容などを決めて変数を作成します。まずは、mainメソッドの先頭に変数宣言ブロックを一つ追加しましょう。
- ○ 変数宣言ブロックの追加
ブロックを追加したらクリックしてプロパティウィンドウに設定を表示し、変数の型・名前・初期値を確認してみましょう。ちなみに、デフォルトのブロックの設定では、 int(整数)型の変数「var」を作り、定数「0」で初期化する内容になっています。
- 【変数宣言の設定】
- name
- 変数の名前を設定できます。同じメソッドに同じ名前の変数が存在するとビルド時にエラーが出るため、複数の変数を使用するときは、重複しない名前を設定してください。
- type
- 変数の「型」を設定できます。プログラムでは「数値」「文字列」等の様々な形式のデータを扱いますが、それらには全て「型」が決まっており、取り扱うデータに応じて正しい変数の型を設定する必要があります。一般的なプログラムでは、前述のように「数値」または「文字列」を扱うことが多く、前者の場合は「int」、後者の場合は「String」を型に指定します。
- IsInitialize・initParam
- 「変数を初期化するか否か」及び「初期化する内容」です。現在の設定では、int型の「var」と言う名前の変数を定数の「0」で初期化(代入)します。
- 「変数を初期化するか否か」及び「初期化する内容」です。現在の設定では、int型の「var」と言う名前の変数を定数の「0」で初期化(代入)します。
- name
- ○ 演算ブロックの追加
変数を作成したら、続いて「メソッドmot2を実行したら加算して回数を記録する」と言う部分を作ります。演算のブロックをプログラムに追加し、メソッドmot2の呼び出しブロックの後に接続しましょう。
接続したら、ブロックの設定を変更します。プロパティウィンドウの設定項目の概要は次の通りです。ここでは、先ほど作成した変数int varに1を加算するという設定に書き換えましょう。
- 【変数演算の設定】
- left
- 計算対象となる変数を設定します。ここでは「var」を選択してください。
- right
- leftとの計算に使う数値または変数を設定します。「1を加算」という計算のため、数値入力で1を入力してください。
- ccalc
- leftとrightの計算方法を設定します。ここでは「1を加算」という計算のため、「+=」を設定してください。各選択肢の概要は、「=」はrightの内容をそのままleftの変数に代入し、+=(加算),-= (減算),*= (乗算),/= (除算),%= (剰余)は、leftの変数に記憶した内容にrightを四則演算し、その結果を改めてleftに代入します。
- left
left及びrightの選択肢から(自由入力)を選ぶと、「変数+5」のような書式も可能です。ただし、自由入力を行う場合は、文法や変数名等に問題が無いように注意してください。
- ○ 変数を使った条件分岐の作成
ここまでの操作で、変数varが作成され、mot1メソッドを実行するごとに1加算される仕組みができました。最後に、既定の回数で無限ループを抜ける処理を作成しましょう。変数を使った汎用的な条件分岐にはifのブロックを使用します。プログラムにifブロックを追加してください。ブロックを追加したら、演算ブロックの後ろにつなげてください。
ifブロックの条件の設定は、「顔が見つかったか」のブロックと同じく、プロパティウィンドウではなくブロックをダブルクリックして「条件分岐の設定画面」を開いて行います。ブロックをダブルクリックして設定画面を開き、以下のように設定を変更してください。
この分岐条件の設定で、「var>=3」となり、プログラム実行中にvarの値が0から加算され、3を超えた時点で条件が成立します。
最後に、条件が成立したら無限ループを抜けるようにbreakブロックを追加しましょう。設定できたらプログラムを実行してみましょう。3回mot1メソッドを実行したら、プログラムが終了します。
変数を使うことで、このようにプログラム内の様々な状態や必要な情報を保存・呼び出しでき、柔軟なアルゴリズムを組み立てることができます。ただし、変数の使い方を間違えるとビルドが通らなくなり、プログラムが実行できなくなってしまうため、扱いには注意が必要です。ここで、変数に関しての補足事項をいくつかお伝えします。
- ○ ローカル変数とメンバ変数
本ソフトウェアを含め、java言語一般のプログラミングにおける変数には「グローバル変数」「ローカル変数」「メンバ変数」のカテゴリが存在します。各カテゴリには以下のような特徴があります。
- 【変数のカテゴリ】
- ローカル変数
- メソッドの中で作成される変数です。変数が使えるのは宣言したメソッドの中だけです。
- ローカル変数
- メンバ変数
- コンストラクタで作成される変数です。変数は、同じクラスの中であればどこでも使えますが、「いつどこで何を書き換えたか」を把握しておかないと意図した動作が行われない場合があります。また、プログラムから自動的に追加・設定されるものが多いため、設定を間違えるとプログラム全体に影響を与える場合があります。
- グローバル変数
- 全てのクラスでどこからでも参照できる変数です。ワークスペースのプロパティ内で設定します。メンバ変数と同じく「いつどこで何を書き換えたか」把握する必要がある、自動で追加・設定された内容に影響を与えるとうまく動かない場合がある点に注意が必要です。
※ 同じカテゴリの変数の場合、同じ名前を設定できませんが、カテゴリが異なる変数の場合同じ名前を設定できます。ただし、プログラミングの際に混同しやすいため、なるべく変数名は異なる物を設定してください。 |
各カテゴリの特徴を見ると、メンバ変数やグローバル変数はどこからでもアクセスができるため使い勝手が良いように見えますが、逆に「いつどこで書き換えられたか」がわかりにくくなるという問題があり、また本ソフトウェアでは、メンバ変数・グローバル変数の多くがプログラムから自動で追加されるため、それらを勝手に使ったり設定や並び順を変更したりすることで、プログラムが正しく動作しなくなる場合があります。これらの点に十分注意し、メンバ変数・グローバル変数は、極力必要な場面だけ作成・使用しましょう。
- ○ 変数の参照制限とウォッチウィンドウ
他のブロックが変数を使えるのは、宣言された場所から後になります。変数が宣言される前に使おうとしても、プロパティウィンドウの選択肢等に表示されません。メンバ変数やグローバル変数も、実際に宣言される場所(コンストラクタやワークスペースの設定項目)においては同様に、既に宣言された変数のみ使えます。
本ソフトウェアには、各ブロックやクラスがどの変数を使えるかを確認する「ウォッチウィンドウ」があります。クラスウィンドウや命令ブロックをクリックすると、そのブロックが参照できる全ての変数がウォッチウィンドウにリストアップされます。ウォッチウィンドウが画面に表示されておらずタイトルバーも見つからない場合は、本ソフトウェアのメニューより「ウィンドウ」→「ウォッチ」をクリックして開いてください。
例えば、先ほどのプログラムで追加したifブロックをクリックすると、全てのグローバル変数・メンバ変数と、ローカル変数としてメソッドの最初で宣言した変数varがウォッチウィンドウに表示されます。一方、mainメソッドのブロックをクリックすると、変数varが宣言される前のブロックであるため、ローカル変数には何も表示されません。
また、ローカル変数の中でも、forブロックや無限ループ、ifブロックのように、開始・終了を持つブロックの中で宣言された変数は、同じブロックで囲まれた中でしか参照できません。同じブロックで囲まれた中であれば、更に別のブロックで囲まれた中でも参照可能です。
ただし、範囲的に参照できる変数でも、設定項目によっては型が一致しないと選択できない場合があります(ブロックの種類によって異なります)。例えばifブロックでは、partAは自由に変数を選択できますが、partCはpartAで選んだ変数・定数の型からしか選択できません。
引数を持つメソッドの作成 †
変数と関連する機能として、メソッドの引数・戻り値があります。先の説明の通り、変数は同じメソッドの中でしか使えませんが、異なるメソッドで変数の値を使いまわしたり、メソッドに「繰り返し回数」など何らかの情報を与えたい場合に「引数」を使います。また、呼び出したサブメソッドから何らかの情報を返す機能が「戻り値」で、サブメソッドの実行結果の成否等の情報をメインメソッドに伝える場合などに使います。
- ○ メソッドの引数の作成
まずは、メソッドの引数を使ってみましょう。クラス「motion.java」のmot1にforループを組み込んで、繰り返し回数を引数で指定してみましょう。まず、次の手順でmot1のメソッドにforループを組み込んでください。
次に、引数を設定します。mot1のメソッドブロックをクリックしてプロパティウィンドウに設定項目を表示し、続いて「arguments」の項目の ボタンをクリックしてください。
クリックすると引数を設定する画面を表示します。まずは「追加」ボタンをクリックし、「メンバー」に1個引数の情報を追加してください。追加したらその項目をクリックして、画面右側に詳細設定を表示してください。詳細設定では、「name」に変数名、「type」に変数の型を設定します。ここではそれぞれ「name」をarg、「type」をintにしてください。
引数を設定すると、メソッドのローカルに登録されます。引数はメソッドの最初で宣言されるため、メソッド内のどこからでも使用できます。また、mot1のプロパティにも表示されます。mot1ブロックをクリックして、プロパティウィンドウ及びウォッチウィンドウから、引数argが追加されたことを確認してみましょう。
続いて、mot1内のforブロックの繰り返し回数を設定しましょう。mot1内のforブロックをクリックしてプロパティウィンドウに設定を表示し、「loop」の設定を(int)argに変更してください。
以上でmot1(motion.java)側の設定は完了です。続いて、mot1を呼び出すmainメソッド(mymain.java)側の設定を行います。
メソッドの引数の設定を変更したら、そのメソッドを呼び出す場所も、それに合わせた引数の設定をする必要があります。メソッドの引数と呼び出し場所の引数の設定が異なるとビルドエラーが出てプログラムが実行できません。
- ○ メソッド呼び出し側の引数設定
続いて、mainメソッドのmot1メソッド呼び出しブロックをクリックし、プロパティウィンドウに設定を表示しましょう。プロパティウィンドウでは、「argument」の項目に「[0] | (int)」という項目が追加されています。これが、mot1メソッドの引数argに渡す数値になります。ここでは、数値入力で4を設定しましょう。
設定を変更したら、プログラムを実行してみましょう。mot1の動作を4回繰り返すようになっていたら、正しくプログラミングできています。正しい動作を確認したら、呼び出しブロックの引数の回数を変更してみましょう。
戻り値を持つメソッドの作成 †
続いて、メソッドに戻り値を設定してみましょう。今度は例として「引数を2倍にして返す」というメソッドを新しく作り、mot1メソッドに組み込んでforループの繰り返し回数を2倍にするプログラムを作成してみましょう。
motion.javaにメソッドを追加したら、プロパティウィンドウから「methodName」(名前)を「mul」に変更し、また、「type」(戻り値の型)を「void」から「int」に変更しましょう。元の設定の「void」は「戻り値が無い」という型であり、戻り値を使わない関数は必ずこの設定をします。
続いて、argumentsをクリックして引数を一つ作りましょう。引数は「name」をsrc、「type」をintに設定しましょう。
次に、メソッドmulの中身(処理部分)を作成します。まずは、演算ブロックを一つ追加します。追加する演算ブロックをmulの開始側ブロックのコネクタにドラッグ&ドロップして、接続した状態で追加しましょう。
ブロックを追加したら、プロパティウィンドウより「ccalc」を「*=」、「left」を「src」、「right」を「2」に、それぞれ変更しましょう。これで、メソッドmulの引数「src」が、この演算ブロックで2倍されます(leftの値とrightの値を掛け算(*=)し、その答えをleftに戻す)
次に、mulメソッドの戻り値を設定します。メソッドがどのような値を戻り値として返すかは、returnブロックによって設定します。mulメソッドの演算ブロックの後にreturnブロックを追加してください。
ブロックを追加したら、クリックしてプロパティウィンドウに設定を表示してください。returnブロックには、戻り値として使う定数・変数を設定する「returnValue」の項目があります。今回は2倍した結果を記録している変数「src」を戻り値に設定してください。
以上でmulメソッド側の設定は完了です。続いてmulメソッドを呼び出す部分を作成します。
メソッドの戻り値を使用する(void以外に設定)場合、必ずreturnブロックをメソッドに追加して戻り値を設定してください。また、戻り値の型とメソッドの型を一致させてください。これらに問題があると、ビルドエラーが出てプログラムが実行できません
作成したmulメソッドはmot1で呼び出すので、エクスプローラ型mot1の開始ブロックのコネクタにメソッドの呼び出しブロックをドラッグ&ドロップしてください。
続いて追加したブロックをクリックしてプロパティウィンドウに設定を表示し、メソッドの引数(「arguments」の「[0]」)にargを設定してください。次に、「enableGetReturnValue」をtrueに設定してください。これで、関数の戻り値を変数に代入できるようになります。enableGetReturnValueをtrueにしたら、「recvVariable」の項目に「arg」を設定してください。
この設定により、mot1内の変数argを引数にメソッドmulが呼び出され、その中で2倍された結果が再び変数argに代入されます。設定できたらプログラムを実行し、mot1の繰り返し回数が2倍になったことを確認してください。
戻り値を受け取る場合は、enableGetReturnValueをtrueにする必要があります。また、enableGetReturnValueをtrueにすると、recvVariableに必ず戻り値を受け取る変数を設定しないとビルドエラーが出ます。
以上で変数を使ったプログラムは完了です。ここまでの内容が、本ソフトウェアによるプログラミングの基本となります。