はじめに
2022.04.01
[ご注意ください]
 このカテゴリーは、Visual BASIC 2022(Microsoft)を使ってコンピュータのプログラミングをやってみましょう、という趣旨のサイトです。主として
(1)Word、Excel等でパソコンはある程度使っているけど、自分でプログラムを作ったことはない
(2)小学校でプログラミング教育を担当することになったけどプログラミングって何をどう考えたらよいのかわからない
(3)昔、BASICでプログラムを作っていたが、最近のBASICはやったことがない
という方のために立ち上げました。
 申し訳ありませんが、パソコンに触れるのが全く初めてという方(電源ってどうやって入れるの?、キー操作がわからない)は対象にしていません。そういう場合は、最初にお使いになるパソコンの取り扱い説明書等で確認しておいてください。
最新のプログラミング言語をマスターすることは目的としていませんのでご了承ください。
 ページ中のサンプルはWindows10パソコンにインストールしたVisial BASIC 2022で作成したものです。Windowsの他のバージョンをお使いの方は、多少表示が異なる部分があることをお含みおきください。


 当カテゴリーはプログラミングを通して、コンピュータのことをもっと知ろう、という方々も対象としています。筆者が2022年3月31日まで勤務していた富山大学人間発達科学部の学生で教養科目の「コンピュータの話」「情報処理」などをすでに履修した方にとっては、これらの授業で学んだことと重複する部分もありますが、当カテゴリーの趣旨をご理解ください。

[BASIC言語]


 コンピュータの中味は膨大な数の電気スイッチです。なので本来コンピュータに何か仕事をさせるには、電気のON/OFFを0と1に置き換えたもの(機械語)で指示を与えなくてはなりません。しかし下のような機械語プログラムはコンピュータには理解できても、私たちがこれをわかるようになるためには、使うコンピュータの内部構造についてかなり専門的な知識が必要な上にこの方法でプログラムを作るには膨大な時間がかかります。


     00111000
     00100111
     00011011

     機械語によるプログラムのイメージ


 コンピュータが電子工学の専門家や数学者によってのみ使われていた時代ならともかく、1946年に世界最初の電子計算機ENIACが誕生してわずか10年後には、コンピュータの専門家でなくてもプログラミングができるようなツールが求められるようになりました。こうして生まれたのがプログラミング言語(人間にわかりやすい言葉で書かれたプログラムを機械語に変換するもの)です。科学技術計算向けのFORTRAN、事務処理向けのCOBOLが1950年代半ばに次々と発表され、1964年にはアメリカのダートマス大学で、数学者・教育者のジョン・ケメニー(John G. Kemeny)とトーマス・カーツ(Thomas E. Kurtz)により文系の学生でも比較的に容易にプログラミングができる言語が発表されました。その言語はBeginner's All-purpose Symbolic Instruction Code(初心者向け汎用記号命令コード)という名称で、頭文字をとってBASIC言語(当カテゴリーでは以下、BASICと略記)と呼ばれるようになりました。 BASICはその後、1970年代後半には、パソコン(当時はマイコンといいました)に標準で搭載されるプログラミング言語としてそのユーザーを増やしてゆきましたが、あくまでゲームプログラムなどホビー用としての需要が高く、これで研究用・実務用のプログラムが作成されることはあまりありませんでした。
 しかし2000年以後にアメリカのマイクロソフト社がVisual BASICを発表すると様相が一変しました。Visual BASICはそれまでのBASICでは出来なかった構造化プログラミングを可能にし、またWindowsフォームが簡単に扱えるという特徴があり、実務プログラムの作成にも充分耐えられるものでした(現在のバージョンはVisual BASIC 2022、2020/04/01現在)。そして最近、BASICが再び入門用プログラミング言語として脚光を浴びるようになってきました。

[お願い]
 このカテゴリーは管理人が本業(あくまでピアノの先生です・・・その顔でかよ!)の合間に少しずつ作成してゆくものです。全章書き上がるには1年以上かかるかもしれません。気長にお付き合いいただければ幸いです。

ピアノ基礎(4)「ゆうやけこやけ」の伴奏を弾いてみよう
2021.11.16

 この曲は小学校学習指導要領音楽では第2学年の歌唱共通教材となっています。ここではグランドピアノの表現力を使って音楽で情景を描写することをやってみましょう。
 教科書の楽譜は以下のようになっています。



図11.ゆうやけこやけ

 音楽を聴いてどんな情景を思い浮かべるか、同じ音楽でも聴く人によって様々ですが、ここでは前奏の3小節でお寺の鐘がボーンと鳴って遊び疲れた子供たちが歩いて家に帰ってゆく様子を表すことにしましょう。グランドピアノのペダルを活用します。


図12.グランドピアノのペダル

 図12.のようにグランドピアノには3つのペダルがあります(古いタイプの楽器は2つ)。3本のピアノの名前と役割は次のとおりです。
①ダンパーペダル・・・このペダルを踏むと鍵盤から指を離しても音が持続する
②シフトペダル・・・このペダルを踏むとピアノのアクションが横にずれて音色が変わる
③ソステヌートペダル・・・1音だけが持続するペダル
 たて形ピアノは②のペダルはソフトペダルと呼ばれ機構が異なります。また③の位置にあるペダルは弱音ペダルなので役割が全く異なります。

図13.ダンパーペダルの記号

 ピアノの楽譜では図13のような記号を見かけることがあります。左のマークはpedalの省略で、ダンパーペダルを踏む指示です(手書きするときは P と書きます)。右のマークはダンパーペダルを離す指示です(手書きするときは × と書きます)。
 シフトペダル(たて型ピアノならソフトペダル)を踏む/離すについては次のように書きます。
   una corda ・・・ シフトペダルを踏む
   tre corda ・・・ シフトペダルを離す
 では、ダンパーペダルとシフトペダルを使って、ゆうやけこやけを弾いてみましょう(図14)。


図14.ゆうやけこやけのペダリング

 ひとつ注意することはシフトペダルは弾く前に踏まないと効きません。そこでこの最初の3小節の前奏は次のように弾くことになります。
 (1)シフトペダル(ソフトペダル)を踏む
 (2)1小節目の低音のドを弾く
 (3)指を離す前にダンパーペダルを踏む
 (4)ダンパーペダルとシフトペダル(ソフトペダル)を踏んだまま以降を弾く
 さらにグランドピアノで弾くなら、シフトペダルを踏んで最初の低音のドを弾いた後、3小節までの間に少しずつ離します。これはグランドピアノならではのシフトペダルの使い方でたて型ピアノのソフトペダルでは残念ながら同様の効果は得られません。次の動画のようになります。

ゆうやけこやけの演奏

【第13章】ゲームを作ろう
2021.10.31
 今まで堅苦しいプログラムばかり作ってきましたが、ちょっと楽しいプログラムを作ってみましょう。そう、ゲームのプログラムです。コンピュータゲームというと「ゲームばかりやってないで勉強しなさい」とお父さんお母さんに叱られたとかオンラインゲームで課金し過ぎてお金がなくなったとかあまりいい話を聞きませんがそれはゲームで遊ぶ側の話です。そのゲームのプログラムを作るということになると話は違ってきます。ゲームのプログラム1つ作る過程でプログラミングの高度なテクニックや様々なアルゴリズムを学ぶことができます。筆者はゲームを作りながらコンピュータの勉強をすることは否定しません。ということでこのカテゴリーでも実際にゲームのプログラムを作ってみたいと思います。とはいっても 残念ながらTiny BASIC for Windowsでテキスト画面のみでは、画面いっぱいに敵戦闘機が飛び回るとか、クエストクリアしたら美少女が微笑むようなゲームは無理ですが、ストリングと計算式のみでも知育ゲームやアドベンチャーゲームのようなものはできます(なんかこの筆者、美少女のたとえが多くね?・・・汗)。

[乱数]
  ゲームで必須なものは乱数です。乱数とは、規則性のない数の並びのことです。たとえば2、3、4、6なら12の約数を小さい順に並べたものとわかりますが、4、7。2、9だとまったく規則性がありません。ゲームでは敵がどこから襲ってくるかわからない、どこに何が隠れているかわからないなど、ランダムに何かが出てくるという場があります。これを実現かるのが乱数であり、Tiny BASICにはこの乱数を発生させる機能があります。それが次のRNDです。次のプログラムを実行してみてください。
  FOR I=0 TO 10
   R=RND
   PRINT R
  NEXT I
 実行結果はこのようになります。



図13_1.乱数を発生する

 RNDは0以上1未満の乱数を発生する関数(後述)です。ただしひとつ注意することがあります。上のプログラムを何回か実行してみてください。おわかりと思いますが乱数とはいってもコンピュータで発生させる場合ある計算式にしたがって発生させるので、同じプログラムを繰り返し実行すると、発生する数の順番はいつも同じになってしまいます。これではたとえばシューティングゲームに使うにしても、敵が出てくる場所と順番がいつも同じになってしまい、面白みが半減ですね。これを回避するには、次のようにRANDOMIZEという一文をRNDの前に入れます。これはコンピュータの内部時計を用いて、乱数発生の計算式の初期化を行なうものです。
  RANDOMIZE
  FOR I=0 TO 10
   R=RND
   PRINT R
  NEXT I
 これで数回実行してみましょう。今度は発生する数の順番はバラバラになったはずです。では、これで1から10までの整数をランダムに発生させる方法を考えてみましょう。RNDで発生する数は0以上1未満ですから
  RANDOMIZE
  R=RND*10+1
で 1 から 10 までの数がランダムで得られます。さらに
  RANDOMIZE
  R=INT(RND*10)
とすると、発生した数の小数点以下が切り捨てられ1から10までの整数がランダムで得られます。INTはInteger(整数の意味)の省略形でINT(数値)で( )内の数値の小数点以下を切り捨てて整数化する関数です。次のプログラムで試してみてください。結果は図13_2のようになります。
  RANDOMIZE
  FOR I=1 TO 10
   R=INT(RND*10+1)
   PRINT R
  NEXT I
  END

図13_2.1から10の整数をランダムに発生させる

[数当てゲームのプログラム] 
 それでは、これまでの知識を使って簡単なゲームを作ってみましょう。コンピュータが隠した 1 から 100 までの整数を当てるゲームです。次のプログラムを見てください。
  1:CLS
  2:RANDOMIZE
  3:PRINT "***** 数当てゲーム *****"
  4:PRINT "今からコンピュータが隠した数を当ててください"
  5:PRINT "数は 1 から 100 の整数のみです"
  6:REM 数を発生させる
  7:R=INT(RND*100)+1
  8:REM 数を当てる
  9:DATAOK=0
 10:WHILE DATAOK=0
 11: NUMOK=0
 12: WHILE NUMOK=0
 13:  INPUT " 1~100で数を当ててください",NUM
 14:  IF NUM=>1 AND NUM<=100 THEN
 15:    NUMOK=1
 16:  END IF
 17: WEND
 18:REM 正解判定
 19: IF NUM=R THEN
 20:  PRINT "正解です。おめでとうございます"
 22:  DATAOK=1
 23: ELSE
 24:  IF NUM 25:    PRINT "小さすぎます"
 26:  ELSE
 27:    PRINT "大きすぎます"
 28:  END IF
 29: END IF
 30:WEND
 31:END
[プログラムの説明]

 プログラムスタート部分の1行目のCLSはCLear Screenの省略形で実行画面をすべて消去する命令です。2行目は今、説明した乱数の初期化です。3~5行目はプログラムと遊び方の説明です。
 7行目がコンピュータが隠す数を発生させるところですが、ここでは1から100までの数を発生させることにします。
 9行目と10、30行目のWHILE~WENDにより、以下の処理は正解が出るまで繰り返し実行されるようになっています。11行目と12、17行目のWHILE~WENDにより、プレイヤーが回答した数が1~100以外の数以外のときは回答入力がやり直しになるようになっています。
 19、29行目のIF~END IFは正解不正解の判定です。正解ならこのプログラムを終了するように、不正解なら回答した数が大きすぎか小さすぎかを表示するようにしています。

[関数]
 今まで何回かこの言葉を使ってきましたが、命令との違いについて説明してきませんでした。ここまでのレベルのプログラムではこの違いがわからなくてもとくに支障はありませんでしたが、コンピュータのコンピュータらしいプログラムを作るには、知っておいた方がいいことなのでここで説明します。


図13_3.数学の関数


図13_3.は中学校でも習う一次関数のグラフです。数学でいう関数とは伴って変わる数という意味です。プログラミング言語における関数はこの意味もありますがどちらかというと「マジシャンの箱」のようなものと考えてください。


図13_4.プログラミング言語の関数


 マジシャンの箱はステッキで触れると中から鳩や万国旗が出てきますが(ネタ古っ)もちろんタネも仕掛けもあるわけです。プログラミング言語の関数とは、何か材料を入れると加工されて完成品が出てくる箱だと思ってください。この箱に入れる材料のことを引数(ひきすう)、箱から出てくる完成品を戻り値(もどりち)といいます。。Tiny Basic for Windowsの関数では引数が不要なものもあります。今まで出てきたサンプルプログラム中にもすでに登場している関数もあります。

[Tiny Basic for Windowsの便利な関数](一部)

SQR(正の数) 平方根を求める
INT(数)     数の小数点以下を切り捨てて整数化する
RND       0以上1未満の乱数を得る(*1)
PI 円周率 3.14159265358979324 を得る(*2)
SIN(数)     正弦を得る(*3)
COS(数)     余弦を得る(*3)
TAN(数)     正接を得る(*3)


図13_5.弧度法(ラジアン)

(*1)正式な書き方はRND(数)。普通に乱数を発生させる場合、数は正の数。省略した場合は正の数が指定されたものとみなす。
(*2)関数というよりプログラミング言語が提供する定数(予約変数)。
(*3)数は弧度法(ラジアン、図13_5)で与える。

  

サンプルプログラム

A=5
B=SQR(A)
C=INT(B)
PRINT B,C

R=10
S=PI*R^2
PRINT S
END

実行結果

2.2360679774997897  2
314.159265358979324
OK

 これらは戻り値が数値の関数なので数値関数とか数学関数とよばれます。プログラミング言語の関数には戻り値がストリングのものもあります。
DATE$ コンピュータが管理しているカレンダーの現在の日付を yyyy/mm/dd形式で得る
TIME$ コンピュータが管理している時計の現在時刻を hh:mm:ss形式で得る

サンプルプログラム

NOW$=DATE$+" "+ TIME$
PRINT NOW$
END

実行結果

2021/11/25 23:16:09
OK

 これらの関数はプログラミング言語が提供しているものなので「組込関数」とよばれることもあります。

- CafeNote -