プログラミング入門 2
この入門講座では第一部をお読みになり、少なくとも最後に出題した課題を解こうとしたでしょう。恐らく、今までにプログラミング言語を使用したことのある経験者であれば、さほど頭を悩ませることなく課題をこなすことはできると思います。しかしながら、これはプログラミング入門です。読者は課題を解き終えられないか、非常に時間がかかると筆者は仮定します。読者にも考えがあると思いますが、このような単純明快なプログラムを書くのが困難であれば、ゲームのようなものや、一般大衆向けの各種実用ソフトウェア・プログラムの開発方法についても決して学ぶ機会を得ることはないと断言します。信じようが信じまいが、すべてのプログラマは変数がなんたるものなのか、あるいは関数の使い方など大事な基礎を知ろうとせずにプログラムを書き始めてしまいます。
最初の課題はユーザに数値の入力を求めた後にユーザが入力した数値をもとに 1 を起点としたすべての数値を出力することです。入門講座の最後で Input$( ) 関数を紹介したことは覚えていますか。これが Input$( ) 関数です:
Input$ ( "プロンプトテキスト" ) '----- これはプロンプトテキストをコンソールへ出力後にユーザが入力し終えるまで待機します
このようにすればユーザから数値の入力を求めることができます:
Input$ ( "数値を入力してください: " ) '----- ユーザに数値の入力を求めますが、ユーザが入力し終えるまで待機します。
しかしながら、この行には三種類の問題が存在します。第一の問題は、ユーザが入力した数値をプログラムから後で利用する方法はありますか? この問題の解決策は数値を変数へ代入することです。第一部を覚えているのでしたら、変数は値を表すために使われる文字などの記号、単語、または文字と数値の集合であることです。 変数には二種類の型があります: 数値と文字列です。数値の変数には数値を保持します。そしてプログラムの算術処理で使用できます。数値も含め文字列の変数には、あらゆる種類のテキストを保持できますが、文字列の変数へ代入した数値は算術処理で使用できません。さて、変数を数値へ代入する必要があることを理解したところで第二の問題があります。 Input$() 関数は文字列関数であるため、代入できる値は文字列の変数に限ります。しかしながら、 1 からユーザが入力した数値までカウントするのであれば変数を用いて算術処理を行う必要があります。 幸いにも RCBasic は数値と文字列との間で変換を行う組み込み関数があります。さて、この問題を以下のとおりにすることで解決してみましょう。
user_input$ = Input$("番号を入力してください: ")
user_number = Val(user_input$)
さて、上述のコードを一行ずつ解析してみましょう。
まずはユーザへ数値の入力を求めた後に作成した文字列変数 user_input$ へ数値を代入します。
user_input$ = Input$("番号を入力してください: ")
さて、Val( ) 関数で文字列の変数へ user_input$ 代入されたテキストを数値へ変換後に数値の変数 user_number へ数値を代入します。
user_number = Val(user_input$)
実際のところ、三番目の問題は現時点ではなくプログラムを終了時に発生する問題です。さて、ユーザが入力した数値があり、それを算術処理を継続するために使うとします。1 から指定値まで数えるにはループを使います。 これを達成するための最も簡単な方法は FOR ループを使うことです。 第一回入門講座の最後では FOR ループを扱いましたが、こちらは FOR ループの動作に関する概要です。以下を参照してください:
For 変数 = 初期値 To 最終値 Step 増分量
...ループ処理をするコード....
Next
FOR を使うには初期値の後に "=" で変数を設定します。続いて TO には最終値を指定します。必要に応じて STEP キーワードを指定します。STEP の指定を省略するとループを通るたびに変数を 1 ずつ自動増分をします。STEP を使う場合は、ループを通るたび増分する変数の値を指定してください。さて、この目的のためにプログラムを以下のとおりにします。
For n = 1 to user_number
Print n
Next
上述のコードでは変数 n へ 1 を代入後に FOR ~ NEXT の行間にある PRINT コマンドをループ実行します。なお、ループ処理中は n と user_number が等しくなるまで n を 1 増分をします。さて、このプログラムは以下の通りになります。
user_input$ = Input$("番号を入力してください: ")
user_number = Val(user_input$)
For n = 1 to user_number
Print n
Next
このプログラムの実行後に数値を入力してみましょう。これは是非とも挑んでいただきたい課題です。その前に、言及した第三の問題を思い出してください。この問題はプログラムに残ったままです。これはどういうことなのか説明するために、プログラムを実行後に 1 以下の数値を入力してください。プログラムが絶えずカウントしていることを確認できるはずです。さて、問題はなんでしょうか? FOR ループにおいて STEP の省略時は変数を 1 だけ自動増分するのを以前述べましたが覚えているでしょうか? つまり、 user_number が n に設定された初期値よりも小さければ、決して n には数値が渡されないため無限にカウントが続いたままになります。この最終問題の解法として、ユーザが 1 かそれ以上の数値を入力した場合は STEP キーワードで変数 n を 1 ずつ増分、あるいはユーザが 1 かそれ以下の数値を入力した場合は変数 n を 1 ずつ減らすことです。この処理をするには IF ブロックを使います。さて軽く IF ブロックについて復習しましょう。以下を参照してください。
If condition Then --- 条件が true ならば後続のコードを実行します。
...実行可能コード...
ElseIf condition Then -- 先行条件が非 true であり、この条件が then ならば後続のコードを実行します。
...実行可能コード...
Else --- ほかの条件のいずれも true でなければ後続のコードを実行します。
...実行可能コード...
End If
IF ブロックで STEP に 1 や -1 を設定するかどうかを決めるために 1 個以上の変数の作成が求められます。これを変数 increase (増分) と呼びます。そのため、 user_number が 1 かそれ以上ならば increase へ 1 を代入します。また、 user_number が 1 かそれ以下ならば increase へ -1 を代入します。こちらで処理方法を確認してみましょう。
increase = 1
If user_number >= 1 Then
increase = 1
Else
increase = -1
End If
上述のコードでは変数 increase を作成後に 1 を代入します。 user_number が1かそれ以上ならば increase は 1 のままになります。また、 user_number が1かそれ以上でなければ変数 increase へ -1 を代入します。
ユーザが入力した数値に従い増分量の変数を増やしたり減らすために FOR ブロックで STEP を書き加える必要があります。新しい FOR 行は以下の通りとなります。
For n = 1 To user_number Step increase
さて、完成後のプログラムは以下のとおりです。
user_input$ = Input$("番号を入力してください: ")
user_number = Val(user_input$)
increase = 1
If user_number >= 1 Then
increase = 1
Else
increase = -1
End If
For n = 1 To user_number Step increase
Print n
Next
違う数値でプログラムを試してみて正しい値が出力されるか確認してみましょう。
第二の課題は名前として "Bob" が入力されるまでユーザに入力を求め続けるプログラムを書いてみましょう。その後、ユーザに "Good by Bob" と伝えます。実のところ、このプログラムは Input$( ) 関数から得たテキストを数値へ変換する必要はないため簡単に書けます。この課題と最初の課題との最大の違いはユーザが "Bob" を入力するまで継続的にユーザからの入力を取得し続けることです。今回はユーザからの入力を取得し続ける必要があるため、ループの内側でユーザの入力を取得します。ですが、ループの開始前にユーザ入力の格納先となる変数を作成します。ループ回数は不定であるため最後の用例と同じく WHILE ループを使います。このプログラムの基本構成は以下の通りです。
user_name$ = ""
While user_name$ <> "Bob"
Wend
まず、上述のコードでは文字列の変数 user_name$ の作成後に空文字を代入します。この変数はループ内でユーザの入力を格納するために使いますが、今は空のままにしておきます。次に WHILE ループを開始します。
WHILE ループは変数 user_name$ が "Bob" と等しくない間はループ処理を行います ("<>" 演算子は数値同士が等しくはないか判定します)。WEND キーワードは user_name$ が "Bob" と等しいか判定後に、等しくなければ場合にループの起点へ直帰するようコンピュータへ指示します。これが等しくない場合は、ループに存在するコードを繰り返し実行します。さて、ここで繰り返し実行したいコードを記述する必要があります。繰り返し実行する必要のあることはユーザに名前を尋ねた後に変数 user_name$ へ名前を代入することだけです。ぼほ同様に、最後の課題では Input$( ) 関数を使います。よって、ループの内側は以下の通りになります。
user_name$ = Input$("お名前は?")
最後に、ユーザが "Bob" と入力したときに「またね! Bob」と伝えたいです。これをするために必要なことは PRINT ステートメント
を使うだけです。
Print "またね! Bob"
さて、完成後のプログラムはこうなります。
user_name$ = ""
While user_name$ <> "Bob"
user_name$ = Input$("お名前は?")
Wend
Print "またね! Bob"
さて、以下の課題に挑んでみましょう。
1. ユーザに 5 個の数値入力を求めた後に平均値を得るプログラムを書いてみましょう。
2. 簡単な複数選択を用いた雑学クイズゲームを書いてみましょう。ユーザには少なくとも三種類の質問、および質問ごとに三種類の選択肢を与えましょう。
3. 英数大小同一視である最後の講義にある第二課題を改良してみましょう。