2020年02月13日

師匠のVB.NETどたばた塾~第6回

sisyo.gif
師匠T:さて。前回はちょっとしたミスで、予定が変わってしまったが、今回は改めてクラスについて説明していくことにするぞ。

deshi.gif
弟子D:師匠ももう年……いてっ。

sisyo.gif
余計なことは言わんでいい。ではさっそくはじめていくとするぞ!

【 クラスとは? 】

sisyo.gif
さて。まずはクラスとは何かについてじゃ。これについては、以前のJava道場で説明したが、改めて復習しておくとしようぞ。弟子よ、クラスとはなんぞや?

deshi.gif
あ、はい。オブジェクトというものの設計図のようなもので、それをもとにして作られたのがインスタンスですよね。ザクに例えるなら、ザクの設計図がクラスで、作られたザクがインスタンスと。

sisyo.gif
うむ、その通りじゃ。さらに、クラスに別の機能を付与して新しいクラスを作る『継承』ができるのも、クラスの特徴であったな。

deshi.gif
そうでしたっけ。

sisyo.gif
お主の記憶容量は、数十年前のPC並みしかないのか? こほん。では次の項目では、クラスの作り方、そしてインスタンスの作り方について説明していくぞ!

【 クラスの作り方、そしてインスタンスの作り方じゃ! 】

sisyo.gif
さて。VB.NETでは、クラスを作るにはちょっとした手間をかけなくてはならぬ。まずは、『プロジェクト』メニューから、『クラスの追加』を選ぶ。

deshi.gif
ふむふむ。

sisyo.gif
すると、次のウィンドウが開くので、クラス名を入力してOKを押す。これだけでOKじゃ。

vb0202-i01.png

deshi.gif
なるほど!

sisyo.gif
なお、この方法で作るだけではなく、モジュール内にコードを書いて作ることもできるぞ。その場合は次のように宣言部分を書く。

--------------------
Class クラス名
End Class
--------------------

deshi.gif
~の部分に動作などのコードを書くわけですね。もしかして、このクラスをどこからでも使えるようにしたい場合には、Classの前にPublicをつけるのですか?

sisyo.gif
おぉ、よくぞそれに気づいたのう。その通りじゃ。さすが我が弟子。

deshi.gif
俺だってバカなままじゃありませんよ!

sisyo.gif
ほほう。それでは、クラスのメソッドやセッター・ゲッターを作りたい時にはどうすればいいのか述べてみよ。

deshi.gif
え? えーと、えーと……。

sisyo.gif
メソッドを作りたい場合には、そのクラスにサブルーチンを作ってやればよいのだ。ゲッターを作りたいなら関数を作ってやればよい。セッターを作りたいなら、やはりサブルーチンを作ればよいぞ。

--------------------
Class Sisyo
   Sub Method()←メソッドになる
   ~
   End Sub

   Public Function Getter() As Integer←ゲッターになる
   ~
   End Function

   Public Sub Setter(p As Integer)←セッターになる
   ~
   End Sub
End Class
--------------------


sisyo.gif
なお注意点として、上の例のようにゲッター、セッターにする関数・サブルーチンを作るときにはPublicをつけること。さもないと、外から使うことができずに、ゲッター・セッターの役割をすることができなくなってしまうからの。

deshi.gif
はい。

sisyo.gif
そしてそれと同じようにメソッドも、外から使えるメソッドにする場合には、Publicをつけることを忘れずに。

deshi.gif
わかりました、師匠!

sisyo.gif
うむ。さて、コンストラクタを作る場合には、次のように宣言する。

--------------------
Public Sub New(~)
End Sub
--------------------

deshi.gif
Newという名のサブルーチンを、Publicをつけて作るわけですね。

sisyo.gif
その通りじゃ。さて、いよいよインスタンスを作る方法じゃが、まずは変数の宣言からじゃ。
といっても難しいことはない。ほれ、この通り。

-------------------------
Dim 変数名 As クラス名

例:
Dim s1 As Sisyo
-------------------------

sisyo.gif
どこからでも使えるパブリック変数にする場合には、DimをPublicに変えればよい。さて、そしてインスタンス化じゃ。

---------------------------
変数名 = New クラス名(~)

例:
s1 = new Sisyo()
---------------------------

deshi.gif
なるほど。Newをつけた上で変数に代入してやればいいんですね。

sisyo.gif
うむ、そのとおりじゃ。それほど難しくはなかろう。では次は継承についてやっていくとするぞ!

【 継承 】

sisyo.gif
さて、次は継承についてじゃ。Javaでは継承のさいには、extendsをつけて宣言しておったな。

deshi.gif
はい。

sisyo.gif
VB.NETも、それと似たようなものじゃ。このように、Class文の下にInheritsをつけて宣言する。

---------------------------
Class Deshi
   Inherits Sisyo
End Class
---------------------------

deshi.gif
なるほど。そういえば継承と聞いて、オーバーライドやオーバーロードのことを思い出したのですが、VB.NETでもそれらは可能なのでしょうか?

sisyo.gif
うむ。可能じゃぞ。まずはオーバーライドからじゃ。まず、オーバーライドするにあたっては、元となるクラス(これを基底クラスと呼ぶぞ)の該当するメソッド・関数をOverridableで宣言する必要がある。

---------------------------
Class ●●●
   Public Overridable Sub ▲▲▲←これでこのメソッドはオーバーライドできるようになる
   ~
   End Sub
End Class
---------------------------

sisyo.gif
このように宣言したメソッド・関数は、作られたクラス(これを派生クラスという)側で、Overridesをつけて宣言することで、オーバーライドすることができるようになる。

---------------------------
Class XXX
   Inherits ●●●

   Public Overrides Sub ▲▲▲←オーバーライドしたメソッド
   ~
   End Sub
End Class
---------------------------

deshi.gif
なるほど。基底クラスの内容を実行させるにはどうすれば?

sisyo.gif
うむ。その時は、MyBase.メソッド名を実行させればよい。なお、通常はOverridesをつけると、これが自動的に追加されるので、それほど意識する必要はないぞ。

---------------------------
Class XXX
   Inherits ●●●

   Public Overrides Sub ▲▲▲
      MyBase.▲▲▲()←基底クラスの▲▲▲メソッドの内容を実行する
      ~
   End Sub

End Class
---------------------------

sisyo.gif

さて、次はオーバーロードじゃ。こちらも難しいことはない。
そのメソッドや関数を、Overloadsをつけて宣言するだけじゃ。

---------------------------

Class AAA

   Public Overloads Sub BBB(kin As Integer)←オーバーロードしたメソッド1
   ~
   End Sub

   Public Overloads Sub BBB(kin As Integer, zei As Integer)←オーバーロードしたメソッド2
   ~
   End Sub
End Class
---------------------------

deshi.gif
なるほど!

sisyo.gif
うむ。さて、基本編はこれでおしまいじゃ。次回からはさらに発展して、ウィンドウアプリの作成からやっていくとするぞ!
これまでの復習と、これからすることの予習を忘れてはならぬ!



※次の更新は、『レトロゲーレビュー』の予定です。お楽しみに!
posted by 裏編 at 09:51| Comment(0) | 師匠のVB.NETどたばた塾 | 更新情報をチェックする

2020年01月16日

師匠のVB.NETどたばた塾~第5回

sisyo.gif
師匠T:さて、今回はいきなり謝らねばならぬことがある。

deshi.gif
弟子D:

sisyo.gif
今回は『クラスについて話す』と予告しておいたが、その前に、VB.NETのプログラミングに置いて欠かせぬ要素『関数とサブルーチン』について話すのを忘れておった。なので、クラスについては次回に回し、今回はその関数とサブプロシージャについて説明することとする。了承していただきたい、すまぬ。

deshi.gif
師匠が謝るなんて珍しい。

sisyo.gif
おぬしも一度、謝ってみるか?

deshi.gif
謹んでご遠慮申し上げます。

sisyo.gif
……。
こほん、それでは始めていくとしようぞ。

【まずは概要からじゃ!】

sisyo.gif
まずは、サブルーチンからじゃな。とはいっても、関数もサブルーチンも基本は同じ。特定の処理をまとめたものじゃ。例えば、VB.NETに基本で備わっているVal関数は、文字を数値に変換するための処理をまとめたもの、という具合じゃな。

deshi.gif
確か、値(戻り値)が返されるものが関数、でしたっけ。

sisyo.gif
うむ。その通りじゃ。対して、戻り値が返されぬものをサブルーチンと区別しておる。そしてそれらを総称して、プロシージャと呼ぶのが一般的じゃ。
詳しくは、以下の図を見るべし。

プロシージャ-+--関数(戻り値が返されるもの)
       |
       +--サブルーチン(戻り値が返されないもの)

deshi.gif
ふむふむ。

sisyo.gif
そして、このプロシージャを使うことによって、メインの処理をすっきりさせることができる。だらだらと処理を書き連ねるより、その関数やサブルーチンの名前だけを書けば済むことを想えば、一目瞭然じゃろ?

deshi.gif
そうですね。

sisyo.gif
そして、プロシージャの利点はそれだけではないぞ。汎用性のあるプロシージャを一つ作っておけば、それをプログラムのあちこちで使いまわすことができる。これは、プログラミングをするうえで、大いに助けになるであろう。

deshi.gif
はい。

sisyo.gif
それでは、いよいよプロシージャの作り方、使い方についてレクチャーしていくぞ!

【サブルーチンを作るのじゃ!】

sisyo.gif
さて。まずはサブルーチンの作り方について説明していくぞ。といっても簡単。

[Public] Sub サブルーチン名([引数1 As 引数1の型, ……])

End Sub

sisyo.gif
このSub~とEnd Subの間に、目的の処理を書けばいいだけじゃ。なお、[ ]で囲まれている部分は、省略できることを表しているぞ。例としてはこんなところじゃ。

Sub Sisyo1(A As Integer)
End Sub
-----
Sub Sisyo2()
End Sub

deshi.gif
引数というのは、確か呼び出し先から渡された数が入る変数みたいなもののことですよね。

sisyo.gif
うむ。その通り。例えば……

Sub Sisyo3(hiki1 As Integer)
End Sub

sisyo.gif
というサブルーチンがあったとして……

Sisyo3(5)

sisyo.gif
呼び出し元のほうで上のように呼んでやると、hiki1に5が入る、というわけじゃ。なお、引数を入れる変数として宣言したものは、Dim文で宣言することはできぬ。ここには気を付けること。

deshi.gif
はい。それで、頭にPublicとつけることができるようですが、これをつけるとどうなるのですか?

sisyo.gif
うむ。これをつけると、そのサブルーチンは、そのプロジェクト(プログラム全体のようなものと思うがよい)のどこからでも呼び出すことができるようになるのじゃ。

deshi.gif
ふむふむ。

sisyo.gif
今回は、Module1という一つのソースファイル内で完結しておるから、Publicを使う機会はあまりないが、この先、複数のソースファイルで構成されるプログラムを組むさいには必要になってくる。覚えておくようにな。

deshi.gif
はい!

sisyo.gif
なお、引数についてじゃが、複数の引数がある場合は、『引数名 As 引数の型』をコンマで区切る。こんなようにの。

Sub Sisyo4(hiki1 As Integer, hiki2 As Integer)

deshi.gif
ふむふむ。

sisyo.gif
また、引数の指定にはちょっと難しい使い方がある。それがOptionalじゃ。

deshi.gif
おぷしょなる?

sisyo.gif
うむ。Optionalをつけた引数は、省略することができるようになるのじゃ。Optionalを使う時は、このように書く。

Optional 引数名 As 引数の型=初期値
例:Sub Sisyo4a(Optional hiki1 As Integer=0)

sisyo.gif
例の場合、引数を渡さずに呼び出した場合は、hiki1には0が入るのじゃ。

deshi.gif
なるほど、これは便利ですね!

sisyo.gif
そうじゃろう。さて、呼び方だが、とても簡単。こう書けばいいだけじゃ。

サブルーチン名([引数1, ~])

例:
Sisyo5()
Sisyo6(5)
Sisyo7(4, 2)

sisyo.gif
こちらも、引数が複数ある場合は、コンマで区切って書く。また、引数を必要としないサブルーチンの場合は引数を書かなくてよい、というか書いてはならぬ。無理に書くと、ビルドエラーが起こるので気を付けるようにの。

deshi.gif
はい!

sisyo.gif
では次は、関数について説明していくことにするぞ!

【関数を作るぜ!】

sisyo.gif
さて、関数とはプロシージャの中でも、呼び出し元に値を返すものだと話したな。

deshi.gif
はい!

sisyo.gif
では、それを踏まえたうえで、関数の宣言について教えよう。これじゃ!

[Public] Function 関数名([引数1 As 引数1の型, ……]) As 戻り値の型

End Function

sisyo.gif
Publicや引数については、サブルーチンと同じだから、ここでは割愛するぞ。

deshi.gif
Subではなく、Functionを使うところと、戻り値の型をつけるところがサブルーチンと違うんですね。

sisyo.gif
うむ、その通り。さて、戻り値の返し方だが、二つの方法がある。まず一つは、このように書くこと。

関数名=戻り値
例:Sisyo8=5

sisyo.gif
そしてもう一つは、Return文を使うことじゃ。

Return 戻り値
例:Return 5

sisyo.gif
ここで注意点を一つ。先の引数の注意点と同じく、関数の中では、関数と同じ変数をDim文で宣言することはできぬ。宣言しようとするとビルドエラーが出るので気を付けることじゃ。

deshi.gif
はい。

sisyo.gif
さて使い方じゃが、このように作られた関数は、VB.NETに標準で供えられておる関数と同じように使うことができる。つまり、ただ変数に入れるだけではなく、式の一部として使ったり、表示させたりできるわけじゃな。

例:
a = Sisyo9(5, 2)
b = Sisyo10(1000, 0.3) + 1000
Console.WriteLine(Str(Sisyo11(4, 2))

deshi.gif
なるほど、わかりました、師匠。

sisyo.gif
プロシージャをうまく使えば、プログラミングがとても楽になる。精進することじゃ。
さて、次回は改めて、クラスについて説明していく。予習、復習を忘れてはならぬぞ!

deshi.gif
でも、師匠が学生時代のころは……?

sisyo.gif
はあっ!!(飛び蹴り

==========
※次の更新は、『師匠TのチャレンジARSゲーム!』の予定です。お楽しみに!

posted by 裏編 at 12:43| Comment(0) | 師匠のVB.NETどたばた塾 | 更新情報をチェックする

2019年12月16日

師匠のVB.NETどたばた塾~第4回

sisyo.gif
師匠T:さぁ、今回もVB.NETどたばた塾、張り切っていくとしようぞ! さっそく行くぞ!

deshi.gif
弟子D:師匠、どうしてそんなに急いで講座に入ろうとしてるんですか?

sisyo.gif
何事もないぞ弟子よ! 何も見てないし見えない! さぁ、確か今回は、配列変数についてであったな!

deshi.gif
何かに目をそらしておられるような……あ(建物の外を歩くカップルを見つける)

sisyo.gif
クリスマスに浮かれているカップルなぞ、わしの目には映らないし見てないぞ! さぁ、さっそく始めるとしようぞ!

deshi.gif
はぁ……。

【 こんなときは!? 】

sisyo.gif
さて。数人の成績を合計して、その平均点を出したいとき、おぬしならどうする?

deshi.gif
え? うーん。その人数分の変数を用意して格納し、それを計算……とか。こんな風に。

vb1912-01.JPG

sisyo.gif
ほほう。では、例えば1クラス40人分の平均を出したりしたい場合はどうする?

deshi.gif
……ぐわーーー!! 無理です、気力が持ちません!

sisyo.gif
それだけではないぞ。〇人目の点数を入力した点数に修正するという場合もどうする? IFやSELECT CASEで、対応した変数を修正する、という形にしてもかなりの労力がかかるであろう。

deshi.gif
はぁはぁ……そ、そうですね。はっ! こんな時に、配列変数が役に立つのでは?

sisyo.gif
うむ、その通りじゃ。さすが我が弟子、配列変数についての学習は怠りないと見えるな。

deshi.gif
えーと、配列変数ってなんでしたっけ?

sisyo.gif
はあっ!!(飛び蹴り)

deshi.gif
うわあっ。

sisyo.gif
では改めて、配列変数について復習しておくとしようぞ。配列変数とは、一つの変数をいくつもの部屋に区切って、それぞれごとに別々の値を入れられるようにしたものじゃ。

deshi.gif
あ、思い出してきたかも。それぞれの部屋は、添え字という数値で識別するんでしたっけ。

vb1912-p01.gif

sisyo.gif
その通りじゃ。この添え字は、いわば部屋番号のようなものと考えるがよかろう。そして一番のポイントとしては、この添え字には変数も使える、ということじゃ。
例えば、2が入っている変数iを添え字に使った場合、2番の値を見たりすることができる。もちろん、この変数iが1増えて3になった場合は、3番の値を見たり操作したりできるのだ。

deshi.gif
なるほど。ということは、For~Nextなどの繰り返しと組み合わせることで、大量のデータを処理することができそうですね!

sisyo.gif
そういうことじゃ。では次からは、その配列変数の使い方について説明していくことにしようぞ。

【 全てはDimから始まるのじゃ! 】

sisyo.gif
まず、変数と同じように、配列変数を使うにはDim文で定義する必要がある。書き方はこうじゃ。

----------
Dim 配列変数名(添え字の最大) As 変数の型

例:
Dim a(5) As Integer
----------

sisyo.gif
ここで注意するべきことが一つある。わかるかな?

deshi.gif
??

sisyo.gif
それは、配列の添え字は0からスタートするので、実際には配列の部屋数は添え字の最大よりも1多くなる、ということじゃ。例の場合だと、実際には0~5までの6つの部屋が作られるのだ。

deshi.gif
なるほど。

sisyo.gif
なお、Javaでは配列の宣言の後に、配列の確保をする必要があったが、VB.NETではそんなことはない。上のDim文だけで全てOKじゃ。

deshi.gif
ふむふむ。

sisyo.gif
それと、昔のBASICとは違い、VB.NETのDim文には、書き方のバリエーションとして、配列を宣言すると同時に、初期値を入れてしまう書き方がある。その場合は、このように書くのじゃ。

----------
Dim 配列変数名() As 変数の型 = {値1, 値2……}

例:
Dim b() As Integer = {5, 2, 4}
----------

sisyo.gif
このように書いてやると、VB.NETは自動的に、値の数と同じだけの部屋を持つ配列変数を作り、この初期値を入れてくるのじゃ。便利じゃろう?

deshi.gif
はいっ!

【 配列を使え! 】

sisyo.gif
さて。配列変数の使い方は、いたって簡単。このように書けばいいだけじゃ。

----------
配列変数名(添え字)

例:
a(3)
----------

sisyo.gif
この添え字の部分には変数も使えるというのは先ほど話した通りじゃ。ゆえに、先ほどお主が言った通り、For~Nextと組み合わせて、こんな使い方もできるのだ。

vb1912-02.JPG

sisyo.gif
このように、多くのデータを、For~Nextなどの繰り返しと組み合わせることで、簡単に処理できるのが配列変数の強みじゃ。

deshi.gif
ですね!

sisyo.gif
さて。昔のBASICとは違い、VB.NETの配列には、色々と役立つ機能が内臓されておる。まずはCloneからじゃ。

deshi.gif
Clone?

sisyo.gif
これは、ある配列をコピーして、全く別の配列を作るというものじゃ。コピーしてできた配列は、元の配列とは全く別の配列なので、コピーしてできた配列をいじっても、元の配列には何の影響もないのがポイントじゃ。
なお、Cloneはこのように使う。

----------
新しい配列変数名 = 元となる配列変数名.Clone

例:
b = a.Clone
----------

sisyo.gif
これだけで済むのじゃ。簡単じゃろう?

deshi.gif
はいっ。

sisyo.gif
次はRedimじゃ。これは配列の部屋数を自由自在を変えてしまう、というものじゃ。Redimはこのように書く。

----------
Redim 配列変数名(添え字の新しい最大値)

例:
Redim c(5)
----------

deshi.gif
あれ? 師匠。やってみたんですけど、Redimを使ったら、配列の中身が0になっちゃったんですが……。

vb1912-03.JPG

vb1912-r01.JPG

sisyo.gif
おぉ、それを忘れておったの。普通、Redimを使うと、その中身はクリアされてしまう。それを防ぐには、RedimのあとにPreserveを付ける必要があるのじゃ。

----------
Redim Preserve 配列変数名(添え字の新しい最大値)
----------

sisyo.gif
それでやってみよ。今度はちゃんと値が残るはずじゃ。

deshi.gif
おおっ、ほんとだ!

vb1912-r02.JPG

sisyo.gif
次はLengthとGetLengthじゃ。これを使うと、その配列の部屋の数を取得することができる。2次元以上の多次元配列の場合、Lengthを使うと、全ての部屋数を合計して返してしまう。特定の次元の部屋数を使うには、Lengthではなく、GetLengthを使う必要がある……ってどうした?

deshi.gif
あ、あのー、師匠。多次元配列とはなんぞや。

sisyo.gif
おっと、それを忘れておったな。多次元配列とは、複数の添え字を持つ配列のことじゃ。というより、1次元配列は一棟の建物、2次元配列は数階建ての建物、3次元配列は数階建ての建物が複数集まった団地……と例えればイメージが伝わるかな?

vb1912-p02.jpg

deshi.gif
あー、わかる気がします。つまり、2次元配列の場合、Lengthはその建物(配列)の全ての部屋数を返して、GetLengthは指定した階の部屋の数を返す、というわけですね。

sisyo.gif
うむ、そんな感じじゃ。さて、話を戻すぞ。このLengthとGetLengthはそれぞれ、次のように使う。

----------
配列変数名.Length

例:
d.Length →配列変数dの、全ての部屋数を取得する

配列変数名(次元数[, 次元数……]).GetLength
例:
e(2).GetLength →配列変数eの、2次元目(2階)の全ての部屋数を取得する
----------

sisyo.gif
なお、GetLengthのところの[ ]は省略してよいことを表しているぞ。

deshi.gif
ふむふむ。

sisyo.gif
そして最後に、IndexOfとLastIndexOfについて教えておくとしよう。これは、指定した値が入っている部屋を調べて教えてくれる、という代物じゃ。これはこのように使う。

----------
Array.IndexOf(調べる配列変数, 探す値)
Array.LastIndexOf(調べる配列変数, 探す値)

例:
Array.IndexOf(f, "ABC")
→配列変数fの部屋の中から、"ABC"という文字列が格納されている部屋を探し、その添え字を取得する
----------

deshi.gif
IndexOfとLastIndexOfとはどう違うのですか?

sisyo.gif
うむ。IndexOfは配列の先頭から探す。LastIndexOfはその逆(つまり配列の最後)から探すのだ。

deshi.gif
なるほど、わかりました!

sisyo.gif
では、今月はここまで。次回は、VB.NETにおけるクラスについて説明していくぞ。Java道場を読んでおくことを勧める。
ではさらばじゃ! いい年を過ごすのじゃぞ!!

==========
※次の更新は、『フリーソフトでゲームを作ろう!』の予定です。お楽しみに!

posted by 裏編 at 15:08| Comment(0) | 師匠のVB.NETどたばた塾 | 更新情報をチェックする

2019年11月18日

師匠のVB.NETどたばた塾~第3回

sisyo.gif
師匠T:……。

deshi.gif
弟子D:どうしたのですか、師匠? 何か難しい顔を……。

sisyo.gif
いや、もうすぐ12月、クリスマスであろう? いやなんでもない。

deshi.gif
(師匠の体が泣いている……!?)

sisyo.gif
さて、そんな世俗のことなどどうでもよい。今回もびしばしいくぞ!
今回は繰り返しについてじゃ。はっはっはっ!

deshi.gif
は、はぁ……。

【 やってみせい! 】

sisyo.gif
さて、今回はいきなり問題じゃ。1から5までの合計を求めるプログラムを作ってみるがよい。

deshi.gif
はいっ。かたかたかた……これでいかがでしょうか?

vb1911-l01.JPG

sisyo.gif
ふむ、まずまずじゃな。では、1から100までの合計を表示させてみよ。

deshi.gif
はい。かたかた……

deshi.gif
がーーーー!! 無理です! 気力がもちません!

sisyo.gif
そうであろう。そこで役立つのが、繰り返しを司る、Do~Loop文と、For~Next文なのだ。まずは、繰り返しの基本形・Do~Loop文について説明していくぞ!

deshi.gif
はい!

【 臨機応変! Do~Loopなのじゃ! 】

sisyo.gif
さて。Do~Loop文はある条件が満たされる(あるいは満たされなくなる)まで繰り返しを行うものであり、このように書くぞ。

(書き方1)
Do While 条件式
Loop

(書き方2)
Do Until 条件式
Loop

(書き方3)
Do
Loop While 条件式

(書き方4)
Do
Loop Until 条件式

(書き方5)
Do
Loop

deshi.gif
色々な書き方があるのですね。それぞれ、どのような違いがあるのですか?

sisyo.gif
うむ。まず、条件が満たされている間繰り返すか、条件が満たされていない間繰り返すか、からじゃ。
書き方1、書き方3の場合、つまり、Whileとついている場合は、条件が満たされている間繰り返す。つまり、条件が満たされなくなるまで繰り返すのじゃ。

deshi.gif
ふむふむ。

sisyo.gif
他方、書き方2と書き方4、Untilとついている場合は、条件が満たされていない間繰り返す。つまり、条件が満たされるまで繰り返すのだ。

deshi.gif
なるほど。

sisyo.gif
次は、最低何回繰り返すか、についてじゃ。書き方1と書き方2、つまり、Do側にUntil/Whileがついている場合は、このDoの時点で繰り返すかどうか判断するので、繰り返す条件が成立しないときは、1回も繰り返さずに終えることになる。

vb1911-z01.jpg

deshi.gif
ふむふむ。

sisyo.gif
一方、Loop側についている場合(書き方3と書き方4)は、Do~Loop内の命令を実行した後、Loopで判断するので、最低1回は繰り返すことになるのだ。

vb1911-z02.jpg

deshi.gif
なるほど!

sisyo.gif
ここまでのことを図に表すとこうなるぞ。

vb1911-z03.JPG

deshi.gif
わかりました。それで、書き方5については?

sisyo.gif
うむ。この場合は、無限に繰り返すのだ。

deshi.gif
ええ!? それはとても困るのでは?

sisyo.gif
ふふふ、安心せい。ちゃんと止めるためのものが用意してある。それがExit Do文じゃ。

deshi.gif
Exit Doですか。

sisyo.gif
うむ。このExit Do文が実行されると、そこで繰り返しは終了し、Loopの次の文から命令を実行していくのだ。
そこで、このExit Do文をIF文などと組み合わせて、条件が満たされたときにExit Do文を実行するようにするのじゃ。

deshi.gif
なるほど。

sisyo.gif
それでは弟子よ。Do~Loop文を活用し、1から10までの合計を計算するプログラムを作ってみるがよい。

deshi.gif
はい! かたかた……これでいかがでしょうか?

vb1911-l02.JPG

sisyo.gif
うむ、見事じゃ!と言いたいところだが、まだ甘いのう。実行結果を今一度確認してみるがよい。

vb1911-g01.JPG
↑ あれ?

deshi.gif
え……? あっ、45になってる。正解は55のはずなのに。どうしてでしょう?

sisyo.gif
ふふふ。プログラムの流れを追ってみるがよい。aが9の時はどうなっておる?

deshi.gif
あっ! sumに足したあと、aに1を足して10になって、そこでDoに戻って10になってるからこの10が足されずに抜けてしまったんですね。

sisyo.gif
その通りじゃ。この場合は、条件をa<>11か、a <= 10にするのが正解じゃな。

deshi.gif
なるほど。

sisyo.gif
このように、条件式の内容、またDo側につけるかLoop側につけるかでも、結果は全く違うものになってしまう。気を付けることじゃ。

deshi.gif
はいっ!

【 融通はきかんが簡単! For~Nextじゃ! 】

sisyo.gif
さて。よくよく考えてみれば、今回のプログラムの主題は、1ずつ増えていく値を合計を足していく、というものであったな。

deshi.gif
はい。

sisyo.gif
このような、条件となる値が一定値ずつ増えていく流れの場合、もっと簡単に書けるものがある。それが……

deshi.gif
For~Next文ですね!

sisyo.gif
うむ、その通りじゃ。For~Next文の書き方は、昔のBASICと同じく、このように書く。

(書き方)
For 変数=値1 To 値2 Step 値3
Next

sisyo.gif
この文は、いたって簡単。まず変数の値が値1からスタートし、値3だけ増減していく。そして、値2以上(以下)になったら、繰り返しを終えるのだ。なお、この判断は、Nextの時点で行われる。
そうそう、値3が+1の時は、Step以降は省略することができるぞ。

deshi.gif
なるほど。

sisyo.gif
さて、それでは弟子よ。改めて出題じゃ。For~Nextを活用して、1から10までの合計を計算するプログラムを作ってみるがよい。

deshi.gif
はい!

vb1911-l03.JPG

deshi.gif
ちゃんと、55と正解がでましたよ! しかも、Do~Loopと比べて、若干繰り返しの部分が短くなってすっきりしてますね!

sisyo.gif
そうであろう。臨機応変に使えるDo~Loopと、シンプルなFor~Next。これらを使いわけて使いこなすことが、繰り返し処理の肝心な部分じゃ。精進するように。

deshi.gif
はい!

sisyo.gif
では、今日はここまでじゃ。次回は、配列変数について学ぶことにする。復習を忘れてはならぬぞ!

==========

※次の更新は、『フリーゲームレビュー』の予定です。お楽しみに!

posted by 裏編 at 13:40| Comment(0) | 師匠のVB.NETどたばた塾 | 更新情報をチェックする

2019年10月22日

師匠のVB.NETどたばた塾~第2回

sisyo.gif
師匠T:さて。前回は、入出力と変数について説明したが、実はあることを説明するのを忘れておった。

deshi.gif
弟子D:さすがに師匠もそろそろボケ……いてっ。
それで、忘れていたことってなんなんです?

sisyo.gif
うむ。それは、保存についてじゃ。これができぬと、VB.NETを終了させたら、せっかくのプログラムが消えてしまうからの。
それで保存についてじゃが、VB.NET終了時に保存するかどうか聞かれるが、メニューバーのディスクのアイコンを押すことでも保存することができる。

vb1910-g01.JPG
↑保存していなくても、VB.NET終了時に保存するかどうか聞かれるぞ。

vb1910-g02.JPG
↑このアイコンをクリックして保存するのだ!

sisyo.gif
また、プロジェクトを読み込むときは、開始時の画面の左半分に、今までに開いたプロジェクトのリストがあるからそれをクリックしてもいいし、右側の『プロジェクトやソリューションを開く』をクリックしてもいい。どちらの方法でも読み込むことができるぞ。後者の場合は、クリックした後に、ファイルを選ぶダイアログが開くから、そこから目的のプロジェクトを選ぶがよい。

vb1910-g03.JPG
↑どちらを使っても読み込めるぞ!

deshi.gif
なるほど!

sisyo.gif
さて、ではここからが本題じゃ、いくぞ!

【 なぜ? 】

sisyo.gif
さて。今回はいきなり、わしのほうからプログラムを見せよう。これを例の如く、Sub Main()とEnd Subの間に書くがよい。

vb1910-l01.JPG

sisyo.gif
できたら実行してみよ。最初は5を入力してみるがよい。

deshi.gif
はい!

vb1910-g04.JPG
↑5を入力した結果

deshi.gif
入力してみました。『10個のリンゴを5人で分けると、一人2個』と表示されましたよ。

sisyo.gif
うむ。では続いて、もう一度実行し、今度は0を入力してみよ。

deshi.gif
はい……あっ!

vb1910-g05.JPG
↑あっ!

deshi.gif
何やら、変なウィンドウが出てきましたよ!

sisyo.gif
うむ。これは、7行目の c = a / b が原因じゃ。今の入力では変数aに10が、bには今おぬしが入力した0が入っておる。これを見て、何か気づかぬかな?

deshi.gif
あっ! 確か、0で割ることはできなかったのでは?

sisyo.gif
うむ、その通り。そんな計算をしたから、VB.NETは『そんな割り算はできんぞ!』と例外を出したのじゃ。『例外』については覚えておるか?

deshi.gif
はい。Java道場で勉強した覚えが……。エラーみたいなものでしたっけ。でも、これを解決するにはどうしたらいいのですか?

sisyo.gif
うむ。Javaの時と同じように、例外処理の構文を使うのも一つの手ではあるが、それは条件判断文について学ぶという今回の趣旨に反する。
そこで今回は、変数bに0が入った時には、計算する前に警告のメッセージを表示させることにしよう。

deshi.gif
なるほど。それで、どうやって。

sisyo.gif
うむ。まず、変数bが0かどうかをチェックする。そして、0なら警告メッセージを出し、0でなければ普通に計算させて、結果を表示させるようにするのだ。そこで!

deshi.gif
おおっ!!

sisyo.gif
『もし~なら~をおこなう』というような処理を行わせる時に使うのが、今回説明するIF~THEN文なのじゃ!

deshi.gif
おおぉぉっ!

sisyo.gif
このIF~THEN文は、次のように使うぞ。

If 式 Then
式がtrueの時に行う処理
Else
式がfalseの時に行う処理
End If

例:
If a >= 5 Then
  b = 0
Else
  b = 1
End If

sisyo.gif
式がtrueの時は、IfとElseの間にある処理を、falseの場合は、ElseとEnd Ifの間の処理を実行する。
例の場合だと、aが5以上の時は、If~とElseの間にあるb = 0が実行される。そうでなければ、ElseとEnd Ifの間にある、b = 1が実行されるのじゃ。

deshi.gif
ふむふむ。

sisyo.gif
それと、falseの時には何もしないのであれば、Elseは省略することもできるぞ。

deshi.gif
なるほど。式はどのように書けばいいのですか?

sisyo.gif
うむ。基本的は、Javaの時と同じじゃ。普通の式を書いてもいいし、条件式を書いても良い。
なお、上の説明では、式がtrueかfalseによって処理が分岐する、となっておるが、VB.NETの条件式でも、成立すればtrue、成立しなければfalseを返すので、『式が成立すれば~』『式が成立しなければ~』と読み替えてもおかしくはないであろう。
なお、条件式はJavaと同じようにこのように書く。

値or式or変数 比較演算子 値or式or変数

sisyo.gif
ただし、比較演算子は、一部Javaのものとは異なっておるので注意が必要じゃ。

vb1910-c01.JPG
↑VB.NETとJavaの比較演算子の対応

deshi.gif
『等しい』と『ではない』の比較演算子が違ってるわけですね。

sisyo.gif
うむ。それと、もちろん論理演算子で二つの式をつなぐこともできるが、Javaでは使えた&&や||は使うことはできぬ。前者はAnd、後者はOrを使うので気を付けること。なお、Andは二つの式が共にtrueならtrue、Orは二つの式のうちどちらかがtrueならtrueを返すぞ。

〇 (a>5) And (b=3) ×(a>5)&&(b==3)
〇 (c=5) Or (d<>2) ×(c==5)||(d!=2)

sisyo.gif
さて、ではここまでのことを踏まえて、先ほどのプログラムを直してみるとしようぞ。
どうすればいいかな?

deshi.gif
うーん。変数bが0なら警告を出して、そうでなければ従来の処理を行えばいいんだから……カタカタ……これでどうでしょう?

vb1910-l02.JPG

sisyo.gif
ふむ。実行してみるがよい。

deshi.gif
はい!

vb1910-g06.JPG

sisyo.gif
うむ、ちゃんと警告メッセージが出ているの。正解じゃな。見事じゃ!

deshi.gif
ありがとうございます! 俺だって本気を出せばこのくらい……いてっ。

sisyo.gif
調子にのるでない。さて、話はもうちょっと続くのじゃ。

【 SELECT CASEとはなんぞや? 】

sisyo.gif
条件判断を行う文は、If~Then文だけではない。Select Case文というのもあるのじゃ。

deshi.gif
それはどのようなっ?

sisyo.gif
うむ。Java道場で勉強したswitch文は覚えておるか?

deshi.gif
えーと……なんでしたっけ?

sisyo.gif
はあっ!!(飛び蹴り)

deshi.gif
うわあっ。

sisyo.gif
指定した変数の値によって、処理を分岐させる文じゃ。それと同じ働きをするのじゃ。
さて、このSelect Case文の書き方はこうじゃ。

Select Case 変数
Case 値1
変数が値1の時に行う処理
Case 値2
変数が値2の時に行う処理
……
End Select

sisyo.gif
なお、switchと違い、Select Caseでは、処理の最後にbreak(に該当する命令)を入れる必要はない。

deshi.gif
ということは、breakを省略して、処理をまとめる裏技は使えないわけですか……。

sisyo.gif
そういうことじゃな。あと、Javaでのdefaultのように、列挙した数以外の値が来たときの処理を書きたいときは、Case Elseを使う。

Select Case a
Case 1
Case 2
Case 3
Case Else
〇〇〇←1、2、3以外の数の時は、ここが実行される
End Select

deshi.gif
なるほど!

sisyo.gif
では、今日はここまで。次回は、繰り返しの文、Do~LoopとFor~Nextについて説明するぞ。
ここまでの復習、そして予習を忘れないように!



※次の更新は、『レトロゲーレビュー』の予定です。お楽しみに!

posted by 裏編 at 14:52| Comment(0) | 師匠のVB.NETどたばた塾 | 更新情報をチェックする