2014年2月14日金曜日

猫でもわかるスクリプティング

略して猫スク。
いやなんというかただのネタで、元々猫耳スクール水着を描こうとかそういう話だったはずなのだが・・・サイトのエイプリルフールかなんかのネタ用に少しまともに文章を作ろうかななんて・・・。

Windowsを使っている人」で「プログラムはコンパイラ導入から諦めた」方や良くわからないけどなんとなくロジカルというかプログラミング的思考の仕方をかじってみたい人向け。
※上級者お断り。訂正、中級者もきっと知ってる事しか無いのでお断り。圧倒的初心者向け。
※一番大切な前提【作業は全て自己責任です


さて、言語選択ですが「Windows Script Host(以後WSH)」より「VBscript(以後VBS)」を扱います。
WSHにはほかに「Jscript」がありますがVBSの方が圧倒的に習得が楽です。
詳細はこちら⇒「Clinick's Clinic on Scripting #1: VBScript それとも JScript?

まぁ、今後はWSHは廃れ「Windows PowerShell」に変わっていく気はしますが、標準搭載windows7からですし、まだ使える言語で記述自体はVBAなんかにも流用できますしね。


■よくある質問

Q.何かインストールする必要はありますか?
A.ありません。windowsに標準で搭載されている言語です(マックの人はさよなら)

Q.何かソフトを使いますか?
A.しいて言えばwindows標準搭載のメモ帳を使います。

Q.スクリプトってプログラムと何が違うの?
A.若干区分けし辛い言語もありますが大枠はコンパイルが必要なのがプログラムで必要ないのがスクリプトです。



さて、前置き終了。


ステップ1:表示 - msgbox
先ずは、メモ帳を開いてください。以下のように記述します。

msgbox "はろーわーるど"

記述できたら「名前を付けて保存」を選びファイル名「*.txt」を「ねこすく.vbs」(ファイル名はなんでもいいですが拡張子はvbs)にして保存してください。
保存したファイルをダブルクリックしてください。すると「はろーわーるど」と表示されたOKしか押せないポップアップボックスが出るはずです。OKを押せば終了します。

おめでとう、これであなたもスクリプトマスター!
は、流石に早いですがこのステップでは「msgbox後のダブルクォーテーションで囲んだ文字が表示される」とだけ理解すればよいです。




Q.メモ帳を閉じてしまいました!もう一度編集するにはどうすればいいですか??
A.保存したファイルを右クリックして「編集(E)」を選択してください


ステップ2:変数
変数はデータを一時的に格納する紙切れみたいなものです。先ほどの内容を以下のように書き直します。

abc="はろーわーるど"
msgbox abc

これを上書き保存してもう一度実行してみてください。先ほどと同じ動作をしますね?
コードの内容を見て既に理解できる人もいるでしょうが説明します。
「abc」は変数で「はろーわーるど」と言う文字を代入しました。
コードの通り「=」の右側の値を左の変数に一時的に保存させる事ができます。

処理を追ってみましょう。
──────────────────────────────
先ず変数abcに文字が代入されます。
abc="はろーわーるど"
msgbox abc

abcは今後文字と同じように扱われるので、一行目が処理されるとこうなります
"はろーわーるど"="はろーわーるど"
msgbox abc

次の二行目もabcは代入した文字ですので二行目はこのように処理されます。
すると結果的にステップ1で記述したコードと同じになる事が解ります。
"はろーわーるど"="はろーわーるど"
msgbox "はろーわーるど"
──────────────────────────────
Q.「abcはなんでabcなの?」
A.「今回は変数名をabcにしましたが変数名は基本なんでも構いません今回は適当につけましたaでもbでもaaaでもなんでもOK」

・・・何でも良いですが命名規則はあります。MSDNより抜粋となりますが命名規則は以下の通り。
・変数名の先頭文字は、アルファベットであること。
・変数名には、ピリオドを使用しないこと。
・変数名は、255 文字以内 であること。
・変数宣言を行った適用範囲内で同じ変数名を複数使用しないこと。
・変数名には関数名と同じ名前を使用しない事。

このステップで覚える必要があるのは「変数名は好きなようにつけてよい、変数に好きなデータを代入できる」です。


ステップ3:コメント
そろそろコード中にメモ書きしたくなってきました。コメントとはコード中に書いても無害な情報の記入です。主に注釈などに使います。vbsでは「' (シングルクォート)」より後ろがコメントになります。

'↓abcに文字列を代入
abc="はろーわーるど"

'↓abcの中身を表示
msgbox abc

このステップで覚えるのは「『' (シングルクォート)』より後ろがコメント」です。


ステップ4:ユーザ入力

さて、こんどはユーザに値をいれてもらい表示してみましょう。
'↓abcにユーザが入れた文字を代入
abc=inputbox("文字を入れてください")

'↓abcの中身を表示
msgbox abc


実行させると入力ダイアログがでますね(その時の文字列「"文字を入れてください"」は書き換えれば任意に変更できます)
そして入れた値は変数abcに格納されて最後にメッセージボックスに渡されて表示されて処理を終了します。

このステップで覚えるのは「『変数=inputbox("文字いれて")』を使うと文字を入力できて変数に代入できる」です


ステップ5:条件分岐 - if

ついに来ましたメインステップ!言語の処理において何より大切なのがこの条件分岐です。
条件分岐は

 「条件1の場合」
 「条件1ではなく条件2の場合」xN
 「上記条件以外の場合」

の三種類しかありません。
'↓abcにユーザが入れた文字を代入
abc=inputbox("文字を入れてください")

'↓abcの中身をを比較
if abc="a" then
    msgbox "a が入力されました"
elseif abc="b" then
    msgbox "b が入力されました"
elseif abc="あ" then
    msgbox "あ が入力されました"
else
    msgbox "どれにも一致しない"
end if

さて、実行してみると入力した結果と文字を比較しているそれぞれの結果がでるだろう。
「if abc="a" then」これは入力した文字列と"a"が一致しているか比較している。

つまり割り当てられている場所をそれぞれ日本語に訳していくと
if abc = "a" then
もし 変数abc が同じか 文字列"a"と そうならば

ただ、これだと日本語的に見ずらいのでもう少し塊で訳すとこうなる
if abc = "a" then
もし 変数abcと文字列"a"が同じ ならば
こうなる

さて、ステップ2の変数代入では
abc="はろーわーるど"
この様に何もないところで「A=B」と書いた場合はAに対してBが代入される(上記例では変数abcに対して文字列"はろーわーるど"が格納される)事を説明したが

if abc="はろーわーるど" then
「if 条件 then」の「条件」部分で=を使用した場合比較処理(上記例では変数abcと文字列"はろーわるど"が一致するか)になる事がわかっただろう。

比較処理は「A=B(AとBが同じか)」の他にもにも色々あるのだが、取り敢えずは逆である「A<>B」でAとB一致しない場合を覚えよう。

以下のように書き換える
'↓abcにユーザが入れた文字を代入
abc=inputbox("文字を入れてください")

'↓abcの中身をを比較
if abc<>"あいう" then
    msgbox "あいう 以外が入力されました"
else
    msgbox "あいう が入力されました"
end if
実行すると「あいう」という文字を入力しない場合「それ以外が入力されました」と出る。
elseはその条件に満たない場合なので「あいうと一致しない」以外の場合とはつまり「あいう」なので「あいうが入力されました」と決め打ちしている。

さて、ではここでのまとめ。
基本記述は以下のようになり

if 条件1 then
    処理1
elseif 条件2 then
    処理2
else
    処理3
end if

ifの条件部分において「=(等号)」は代入ではなく比較の記号(演算子)として扱われる事
elseifは追加していくらでも条件と処理を追加できる事
一致するは「=」で一致しないは「<>」を使う事
elseはどの条件にも一致しない場合の処理を追加できる事

を、このステップではひとまず覚えてください。

ステップ6:繰り返し処理 - for

主な用途は「回数制限のある」繰り返し処理に使います。
ループカウンタ用の変数を必要とするのでそのカウントアップ(又はカウントダウン)される変数を使う場合が多いです。


for i = 0 to 5
    msgbox i
next
さて、実行してみましょう。0~5が表示されたかと思います。
for~nextの間に書かれている部分が繰り返し処理される内容です。

for i = 0 to 5
一行目のこれは処理を繰り返しながら変数「 i 」に0~5を代入します。という意味です。
結果、一周目のiは0でmsgboxで0が表示され、二回目のループではiが1になる為1が表示・・・となり、それが5まで繰り返されます。

また、途中で抜ける場合は「exit for」を使います。

for i = 0 to 5
    msgbox i
    if i =3 then
        exit for
    end if
next

このようにすればifで変数iが3と同じになった瞬間に処理を終了させたりできます。

このステップで覚えるのは「
『for ~ next』の間が繰り返し処理される事
ループ回数は一行目『for 変数=A to B』で変数がA~Bの間処理される事
『exit for』で途中でforを終了できる事
」です


ステップ7:繰り返し処理 - do loop while

forと違い、主な用途は条件を満たしている間(又は条件を満たすまでの間)処理を続ける為に使います。

i=""
do while i=""
    i=inputbox("文字を入力すると終了します")
loop
さて、実行してみましょう。文字を何か入力するまで終了できないinputboxの出来上がりです。
do~loopの間に書かれている部分が繰り返し処理される内容です。

do while i=""
一行目のwhileは「~である間」と言う意味で、上記の場合条件が『i=""』なので『変数「 i 」が空である間処理する』という事になります。

今度は指定の文字を入れるまで実行するように書き換えてみます。
while条件の指定を下記のように後ろに変更することができます。
do
    i=inputbox("end と入力すると終了します")
loop while i<>"end"
さて、実行してみましょう「end」を入力しないと処理を終了できないinputboxの出来上がりです。

先ほど違い一行目のdoに対して条件が無いため無条件でループに突入します。
ですが今度はloopの後に条件を指定している為その条件を満たさない限りdoの位置から処理が繰り返されます。

途中で抜ける場合は「exit do」を使います。
do
    i=inputbox("end と入力すると終了します")
    if i="end" then
        exit do
    end if
loop
こんどはwhileを抜きました。そうする事で無条件無限ループになります。
代わりにdo loop内のif文で「end」が入力されたら「exit do」で終了する記述をしました。

ここではexit doの効果を見るためにwhileを抜きましたが基本的には「while 条件」を指定しておくことを推奨します。そうしないと簡単に無限ループに陥る為です。

このステップで覚えるのは「
『do ~ loop』の間が繰り返し処理される事
ループ条件は『while 条件』で指定した「条件」の間処理される事
条件を満たしている間処理したい場合doの後に、満たすまで処理したい場合loopの後にwhile文を書く事
『exit do』で途中でdo loopを終了できる事
」です


Q.無限ループに陥りました助けてください!
A.タスクマネージャーを開き「wscript.exe」を選択し「プロセスの終了(E)」押してください。

Q.「開かれているプログラムが~システムが不安定になる可能性が~」とかでて怖いです!
A.「メッセージ内容が『'wscript.exe'を終了しますか?』ならそれであっています」


ステップ8:配列変数

配列はひとカテゴリを同じ変数名で扱いたい場合に利用します。
と言ってもい解りずらいでしょう。

たとえば「佐藤」「鈴木」「田中」という文字を表示したい場合
sato="佐藤"
suzu="鈴木"
tana="田中"
msgbox sato
msgbox suzu
msgbox tana
とこのような感じになりますがこれを
user=array("佐藤","鈴木","田中")
msgbox user(0)
msgbox user(1)
msgbox user(2)
先ずは実行してみてください。名前を全員分表示できます。

array()の括弧内で「,(カンマ)」で区切る事で複数のデータを格納する事が出来ます。
また、利用するときは代入した変数名の最後に「変数(数値)」で取り出すことができます。
注意するのは配列で扱われる最初の要素は0からなので三つ代入した場合は0と1と2に値が格納されています。

配列変数にいくつの配列要素が格納されているかを確認するには「ubound」を利用します。
user=array("佐藤","鈴木","田中")
msgbox ubound(user)
実行してみましょう。ここでは2が表示されます。配列の要素数なのでデータがいくつ含まれているかと考えた場合0と1と2に格納されているという事なので3つのデータが含まれている事が解ります。

配列を使うことでコードも短くなります。
たとえば先ほどの単純列挙も下記のようにすると
user=array("佐藤","鈴木","田中")

for i = 0 to ubound(user)
    msgbox user(i)
next
実行するとわかりますが、「user」に入っている情報を連続で取り出すことができます。まぁ三人程度だと対してわかりにくいですがarrayのデータ100とか1000とかになってもforの三行でデータを取り出すことができます。

事前に配列を宣言しておく事も可能です
dim user(2)

msgbox ubound(user)
実行してみましょう。配列の要素を事前に領域を確保できたのが解ります。
毎回「array(データ,データ,データ,データ,データ,データ,データ,データ,データ,データ,データ)」みたいに一行で書くのは可読性が良くありません

先ほどは連続したデータを表示に使っていましたが今度は連続で代入してみましょう
'配列を0~10の11個分の領域を確保
dim con(10)

'0~10までの数値をconに代入
for i = 0 to ubound(con)
    con(i)=i
next

'ためしに適当な所を表示
msgbox con(3)
実行してみましょう。配列を宣言してその要素すべてに数値を格納し最後に格納されているか表示しています。
もちろん要素も数値も0から順番にデータを格納したので表示されるのは3になります。
今回は単純に数値を格納しましたが別の配列を格納したりも可能です。






ステップ9:関数

関数とは処理をまとめて一つにしておくことができます。
VBSではsubとfunctionの二種類が存在します。
まずはsubを使い違いは戻値のステップで説明します。

'関数を呼ぶ
test

'関数内容
sub test
    msgbox "関数が実行されました"
end sub



sub 関数名
処理
endsub


ステップ10:関数 - 引数

'関数を呼ぶ
test "でーた"

'関数内容
sub test(val)
    msgbox val
end sub


sub 関数名(引数)
処理
endsub


ステップ11:関数 - 戻値

'関数を呼ぶ
msgbox test2("でーた")

'関数内容
function test2(val)
    test2= val & "データ"
end function



ステップXX:課題!

※ゲームの仕様を調べるのも課題です。

・50までの「Fizz Buzz」
 ヒント:割り切れるかどうか

・数値を入力させてそれがうるう年かを算出しよう
 ヒント:条件さえわかればきっと簡単

・0~9までの数値を一つずつ使い10ケタのランダムの数値を作りそれを0からソート
 ヒント:ひとまずバブルから
 応用:バブルより早く並べるには?

・素数を100までの素数を列挙しよう。
 ヒント:素数の条件は何?
 応用:高速化できそうなら

・じゃんけんする処理を考えてみよう
 ヒント:相手の手がばらけるなら方法は問わない

・石取りゲームの処理を考えてみよう
 ヒント:常に最善手とは?(あとランダムいれればゲーム性がますかもね)

・数当てゲームの処理を考えてみよう
 ヒント:大きいか小さいかで詰めて同じなら終了

・1~9(3x3マス)の転置行列
 ヒント:二次配列必須






わかる人だけ、もしくはもっと詳しくなりたい方。動作の理解を優先させるために一部省いた箇所等。

表示は「wsh.echo」じゃないの?
結果を表示させる方法として「msgbox」を使いましたが「wsh.echo」を使った方が「Cscript」でも文字を流せて楽です。wsh.echoを説明するにはwscriptオブジェクト、echoメソッドなど説明が必要になるので省略しました。同様に途中終了させる場合のquitメソッド等他のメソッドも省略しています。

forのstepは?
ひとまず覚える必要がないので省略しています。

for eachは?
コレクション列挙はVB系特有のものなので省略しています。

あれ?「createobject」は?
VBAと違いVBSではcreateobjectを使わないと便利な事はほとんど何もできません。ですがこれまたオブジェクトの説明になるためここでは省略しています。



※答えるかはわからないし、内容を変更するかもわかりませんが
「ここがわかんなーい」や「初心者にはこのステップの前にこれを教えた方が」等あれば

黒い野良猫ツイッターへどうぞ:https://twitter.com/black_stray_cat
内容が疑問が長文になる場合は使い捨てオンラインメモ帳が便利です:http://notepad.cc/


0 件のコメント:

コメントを投稿