プログラミング入門 3
このシリーズのこれまでの講義を理解しているかたは課題を全て終えれば変数についてかなり自信がつくと思います。ですが、多くの場面において要所要所でデータ別に単体変数を作成するのは現実的ではありません。この解説のために前回の講義にある冒頭の課題を扱います。この課題ではユーザに 5 個の数値を求めた後に入力された数値の平均値を出力するプログラムを書いてみましょう。以下はプログラムの書き方です。
user_input$ = ""
Print "番号を 5 回入力してください: "
user_input$ = Input$("1 番目を入力してください: ")
number1 = Val(user_input$)
user_input$ = Input$("2 番目を入力してください: ")
number2 = Val(user_input$)
user_input$ = Input$("3 番目を入力してください: ")
number3 = Val(user_input$)
user_input$ = Input$("4 番目を入力してください: ")
number4 = Val(user_input$)
user_input$ = Input$("5 番目を入力してください: ")
number5 = Val(user_input$)
average = (number1 + number2 + number3 + number4 + number5) / 5
Print "平均値は "; average
このプログラムの先頭で変数 user_input$ を作成後に内容として空文字列を代入します。そして PRINT コマンドは「番号を 5 回入力してください」の出力で使います。 数値ごとに INPUT$ 関数でユーザに数値の入力を促した後にユーザの入力テキストを変数 user_input$ へ代入します。 ご存じの通り INPUT$ 関数で返された文字列を代入できる文字列の変数だけです。ユーザが入力した数値を加算するために VAL 関数で数値から文字列へ変換します。その後に数値の変数へ数値を代入します。 数値の変数 number1 から number5 までをプログラムで宣言しました。 ユーザが入力した 5 個の数値をすべて取得後、結果の代入で使う変数 average の作成と演算順序 (PEMDAS) を使い、数値をすべて合計してから合計値を 5 で除算します。 結果として平均値をコンソールへ出力します。
このプログラムは 5 個の数値を扱うだけなのでわりと単純です。 ですが、もし 20 ~ 100 まで数値に関する平均値を得たいときはどうなるでしょうか。大量の変数をひとつずつ連続作成するのは現実的ではありません。 このような同じ型のデータを大量保持する必要がある状況で配列を用いるのは得策です。配列は同型の値を大量に保持できる単体変数です。強調しますが配列は同一型の値に限り保持可能であり配列は変数、文字列や数値の同様のものであると理解することは重要です。 配列は DIM キーワードで作成します。なお、角括弧 "[]" は配列で保持できるデータ量を指定します。 以下の用例を参照してください。
Dim number_array[5]
Dim string_array$[7]
上述の用例において、一行目では 5 値を保持できる数値配列 number_array を作成します。二行目では 7 本の文字列を代入できる文字列配列 string_array$ を作成します。 配列は変数の亜種であるため、通常の変数で命名できるものは配列の命名でも使えます。 上述の用例において、 number_array には 5 個の数値が存在しており 5 個の独立変数の領域はデータの保持に使えます。 ここでの独立変数は配列のインデックスのことを指します。 配列の各インデックスは角括弧の内側にインデックス番号を記入することでアクセスできます。この用例を確認してください。
Dim x[4]
x[0] = 13
x[1] = 15
x[2] = 29
x[3] = 47
Print x[2]
'上述にて x[2] へ 29 を代入したので、コンソールに 29 を表示します。
上記のコードは 29 をコンソールへ出力します。注意点として x[4] に数値は代入しません。 この用例において、配列のインデックス上限は 3 までであるためです。RCBasic の配列はインデックスが 0 から始まります。そのため、 4 個のインデックスがある x を作成すると合計 4 個のインデックスから成る x[0] ~ x[3] が使えるようになります。 さて、配列の記法について基本を理解したと思います。習得内容をもとにユーザが入力した 5 の数値から平均値を求めるプログラムを書き直してみましょう。 5 個の値で 5 個ずつ変数を使うのではなく 5 個すべての数値を一括保持する配列を作成します。プログラムの動作は同じですが 5 個のインデックスがある配列 numbers を作成します。さて、プログラムを書いてみましょう。
Dim numbers[5]
user_input$ = ""
Print "番号を 5 回入力してください"
上述のコードでは、 5 個のインデックスがある配列変数 numbers を一行目で作成します。 二行目は、この入門講座の冒頭で説明した最初のバージョンとぼぼ同じ文字列の変数をプログラムで作成します。再び「番号を 5 回入力してください」のテキストを出力します。 このプログラムのそれ以外の部分は以前のバージョンとほとんど同じであるものの、 5 個の変数を別々に作成するのではなく numbers 配列のインデックスごとに数値を代入しています。
user_input$ = Input$("1 番目を入力してください: ")
numbers[0] = Val(user_input$)
user_input$ = Input$("2 番目を入力してください: ")
numbers[1] = Val(user_input$)
user_input$ = Input$("3 番目を入力してください: ")
numbers[2] = Val(user_input$)
user_input$ = Input$("4 番目を入力してください: ")
numbers[3] = Val(user_input$)
user_input$ = Input$("5 番目を入力してください: ")
numbers[4] = Val(user_input$)
上述の用例において、このプログラムは 5 個の異なる数値の変数を使わず数値の配列を使う以外は、この入門講座の冒頭で説明したものと同じです。 そして最後に平均値の取得してコンソールへ出力する必要があります。
average = (numbers[0] + numbers[1] + numbers[2] + numbers[3] + numbers[4]) / 5
Print "平均値は "; average
上述のコードでは配列を使う以外は最後の用例からほぼ変更していません。 さて、完成後のプログラムはこうなります。
Dim numbers[5]
user_input$ = ""
Print "番号を 5 回入力してください"
user_input$ = Input$("1 番目を入力してください: ")
numbers[0] = Val(user_input$)
user_input$ = Input$("2 番目を入力してください: ")
numbers[1] = Val(user_input$)
user_input$ = Input$("3 番目を入力してください: ")
numbers[2] = Val(user_input$)
user_input$ = Input$("4 番目を入力してください: ")
numbers[3] = Val(user_input$)
user_input$ = Input$("5 番目を入力してください: ")
numbers[4] = Val(user_input$)
average = (numbers[0] + numbers[1] + numbers[2] + numbers[3] + numbers[4]) / 5
Print "平均値は "; average
恐らく、これにはどういう意味があるのか疑問に思うでしょう。このプログラムは、ほかよりも実コード行数は多いため、ユーザから数値を得るために同量の作業が必要です。 これに関してただし答えるには、記述方法の説明を書いただけであってプログラムで配列を使う方法は説明していませんでした。 この入門講座の冒頭で説明した方法では、ユーザから追加情報を得る必要があるときに、配列を使うよりもコードの記述量が多くなります。 プログラムで配列を効果的に使うには、データが配列に保持される事実をうまく利用したプログラムを記述してください。さて、この説明のためにこのプログラムをもう一度書き直してみましょう。プログラム動作は同じです。さて、こちらはプログラムの冒頭になります。
Dim numbers[5]
user_input$ = ""
Print "番号を 5 回入力してください"
このコードは前述の用例と全く同じです。ユーザから数値を取得する部分のコードを思い切って変更してみましょう。 入力の取得後に全 5 個の数値を変換して数値化するコードを手作業で書かずに、ループを 5 回繰り返すことでユーザからの入力を一度に取得してみましょう。 ループを 5 回繰り返しますので FOR ループを使うのが望ましいです。 FOR ループの処理方法について忘れているならば、前回の講義にある FOR ループの解説を再読してください。 準備ができましたら以下のループを参照してください。
For index = 0 To 4
user_input$ = Input$("番号を入力してください" + Str$(index+1) + ": ")
numbers[index] = Val(user_input$)
Next
一行目は FOR ループの起点です。数値の変数 index の作成後に初期値として 0 を代入します。その後、 FOR と NEXT 行の間で index が 4 になるまでコードのループ処理をコンピュータに指示します。 これまで見てきたものと比べて二行目は少し複雑です。 ですが、理解するのはあまり難しくはありません。 ユーザから数値を求めるのに INPUT$ 関数を使います。 この行を解析してみるとわかりますが、解説済みの概念をいくつか応用していることに気がつくと思います。 こちらは部分ごとに解析したものです。
|
| Input$ 関数の用法 | 文字列 |
| 文字列へ変換されるインデックス |
| 数値の末尾に ":" を追加 |
|
user_input$ | = | Input$ ( | "数値を入力してください" | + | Str$( index + 1 ) | + | ": " | ) |
STR$ 関数の index へ 1 を加算する理由として index は 0 ~ 4 までと等しいため、最初の数値で「1 番目を入力してください」を、最後の数値で「5 番目を入力してください」を出力したいからです。したがって index + 1 を文字列へ変換します。ここで index + 1 を文字列へ変換する理由は、この数値で別の文字列を連結するためです。以前のバージョンとほぼ同じく、ユーザの入力を取得した直後に文字列の変数 user_input$ へ代入します。次の行では数値の配列においてユーザから得た数値の代入先となるインデックスを指定するために変数 index (ループの起点 は 0 であり、ループの終点は 4 です) を使います。 NEXT の行は変数 index が未だ 4 でなければ FOR ループの起点へ直帰するようコンピュータへ指示を出します。 index が 4 となり配列へ最後の数値が代入された直後に平均値を出力する必要があります。 これは以前のバージョンと全く同じです。
average = (numbers[0] + numbers[1] + numbers[2] + numbers[3] + numbers[4]) / 5
Print "平均値は "; average
さて、完成後のプログラムはこうなります。
Dim numbers[5]
user_input$ = ""
Print "番号を 5 回入力してください"
For index = 0 To 4
user_input$ = Input$("番号を入力してください" + Str$(index+1) + ": ")
numbers[index] = Val(user_input$)
Next
average = (numbers[0] + numbers[1] + numbers[2] + numbers[3] + numbers[4]) / 5
Print "平均値は "; average
配列には得るものが沢山あることを筆者は理解しています。先へ進む前に、この入門講座を何度も繰り返しお読みことを奨励します。
さて、以下の課題に挑んでみましょう。
1. 四人の名前 (ここでは氏名のみ) と年齢の入力をユーザに求める単機能データベースを書いてみましょう。文字列配列へ名前を代入後に数値配列へ年齢を代入してみましょう。四人の名前 (ここでは氏名のみ) と年齢を得た後に、ループの開始とユーザに年齢を知りたい人名の入力を続けて求めます。ユーザが "quit" と入力すると "Have a good day" を表示後にプログラムを終了します。