2024年10月30日 | 公開 |
記事にふりがなを付けたいときは、次のチェックボックスをクリックしてください。
前のページで、プログラム実行時にユーザーが入力した値を変数に代入できるINPUT文について紹介しましたが、この節では、INPUT文のさらに詳しい使い方について説明します。
既に説明した通り、INPUT
の後に変数名を付けると、ユーザーが入力した値を、指定した変数に代入する事ができます。例えば、INPUT A
なら、ユーザーが入力した値を、A
という数値変数に代入します。
INPUT A
というINPUT文で、数値の入力をユーザーに求めている場合に、ユーザーが、数値とは解釈できない文字列(例えばabc
)を入力すると、どうなるでしょうか?
実際に試してみましょう。下の画面39で、INPUT A ENTERと入力し、次にabcENTERと入力してください。
INPUT AENTERと入力し、次にabcENTERと入力してください。
そうすると、実行例67に示す様に、?Redo from startと表示されるはずです。
Syn BASIC Version 0.31α ©2021-2022 Hiroshi Tanigawa(Synapse) Ok INPUT A ← INPUT文を入力 ? abc ← 数値が要求されているのにabcと入力 ?Redo form start ← 再入力が要求された ?
このRedo from startというメッセージは、「最初から(入力を)し直してください」という意味です。このメッセージが出たら、もう一度入力し直す必要があります。
それでは、実際に入力し直してみましょう。実行例67の状態で、画面39で123ENTERと入力してください。
そうすると、実行例68に示す様に、今度はRedo from startというメッセージは表示されずに、今度はOKが表示されます。これで、数値変数A
に、123が代入されます。
Syn BASIC Version 0.31α ©2021-2022 Hiroshi Tanigawa(Synapse) Ok INPUT A ? abc ?Redo form start ? 123 ← 今度は数字を入力 Ok ← INPUT文の実行が終わり、Okと表示された
本当にA
に123が代入されたかを確認するには、さらにPRINT AENTERと入力して、A
の値を表示してください。
複数の変数をカンマ(,)で区切って並べると、1つのINPUT文で、複数の変数に、ユーザーが入力した値を代入できます。
例えば、INPUT X,Y
なら、X
とY
の2つの変数に、ユーザーが入力した数値を代入します。
INPUT X,Y,Z
という具合に、3つの変数を指定する事もできます。
INPUT NAME$,AGE
の様に、数値変数と文字列変数を混ぜる事もできます。
2つの数値変数X
とY
の値を、INPUT文で入力する場合ついて、実際に試してみましょう。下の画面40で、INPUT X,YENTER、3,8ENTER、PRINT X,YENTERと、順に入力してください。
INPUT X,YENTER、3,8ENTER、PRINT X,YENTERと、順に入力してください。
そうすると、実行例69に示す表示になるはずです。
Syn BASIC Version 0.31α ©2021-2022 Hiroshi Tanigawa(Synapse) Ok INPUT X,Y ← XとYの値を入力するINPUT文 ? 3,8 ← 3と8を入力する Ok PRINT X,Y ← XとYの値を確認するためのPRINT文 3 8 ← 3と8が代入されていた Ok
この例で示す様に、1つのINPUT文で2つの変数の値を入力する場合は、カンマで区切って、複数の変数の値を入力します。
ユーザーは、INPUT文で指定した変数の数だけ、値を入力する必要があります。
INPUT X,Y
と、2つの変数の値を入力するINPUT文で、3ENTERと1つの値を入力したり、3,8,5ENTERと3つの値を入力したりすると、Redo from startのメッセージが出て、入力し直す必要があります。
前のページで少し説明したのですが、INPUT文でユーザーに入力を求める際に、メッセージを表示させることができます。
例えば、INPUT "数字を入力してください: ",A
とすると、ユーザーに変数A
の値を入力してもらう際に、数字を入力してください:
というメッセージを表示する事ができます。
実際に試してみましょう。下の画面41で、INPUT "数字を入力してください: ",AENTERと入力してください。
INPUT "数字を入力してください: ",AENTERと入力してください。
そうすると、実行例70に示す様に、数字を入力してください: というメッセージを表示してから、入力状態になります。
Syn BASIC Version 0.31α ©2021-2022 Hiroshi Tanigawa(Synapse)
Ok
INPUT "数字を入力してください: ",A
数字を入力してください:
↑ メッセージ表示後に入力状態になる
先程は、メッセージの文字列と変数の間をカンマ(,)で区切りましたが、セミコロン(;)で区切る事もできます。セミコロンを使うと、メッセージに続いてクエスチョンマーク(?)が表示されます。
実際に試してみましょう。下の画面42で、INPUT "Xの値は";XENTERと入力してください。
INPUT "Xの値は";XENTERと入力してください。
そうすると、実行例71に示す様に、Xの値はというメッセージの後に、さらに?を表示してから、入力状態になります。
Syn BASIC Version 0.31α ©2021-2022 Hiroshi Tanigawa(Synapse)
Ok
INPUT "Xの値は";X
Xの値は?
↑ メッセージと?を表示してから入力状態になる
INPUT A$
を実行すると、ユーザーが入力した文字列を、文字列変数A$
に代入します。この際、ユーザーが入力した文字列の中に、カンマ(,)が含まれていると、正常に処理されません。
実際に試してみましょう。下の画面43で、INPUT A$ENTER、abc,defENTERと、順に入力してください。
INPUT A$ENTER、abc,defENTERと、順に入力してください。
そうすると、実行例72に示す表示になります。
Syn BASIC Version 0.31α ©2021-2022 Hiroshi Tanigawa(Synapse) Ok INPUT A$ ← 1つの文字列を入力するためのINPUT文 ? abc,def ← abcとdefの2つの文字列と解釈される ?Redo form start ← エラー表示 ? ← 再度の入力が求められる
この様に、Redo from startのエラー表示が出て、文字列の再入力が求められます。
これは、入力した文字列が、abc,def
という1つの文字列ではなく、abc
とdef
の2つの文字列がカンマで区切られていると解釈されるからです。INPUT文では、1つの文字列の入力を期待しているのに、2つの文字列を入力したのでRedo from startのメッセージが表示されたのです。
どうすればカンマを含んだ文字列を入力できるかというと、ダブルクオーテーションマーク(")で囲めばいいのです。
引き続き、画面43で、"abc,def"ENTERと入力すると、今度はRedo from startのエラーメッセージは出ずに、INPUT文の実行が終了します。その後にPRINT A$ENTERと入力して文字列変数A$
の値を調べると、ちゃんとabc,defが表示されます。(実行例73参照)
Syn BASIC Version 0.31α ©2021-2022 Hiroshi Tanigawa(Synapse) Ok INPUT A$ ? abc,def ?Redo form start ? "abc,def" ← "で囲って文字列を入力 Ok ← エラーにならずにINPUT文の実行が終了 PRINT A$ ← PRINT文でA$の値を確認 abc,def ← abc,defが表示される
この様に、入力する文字列の中にカンマが含まれると、ダブルクオーテーションマークで囲って入力しないと正常に入力できないのですが、入力する文字列の先頭や末尾にスペースが含まれる文字列を入力する場合にも、問題が発生します。
下の画面44で、INPUT A$ENTER、 abc ENTER(abcの前後にスペースを1つずつ)と入力してください。
INPUT A$ENTER、 abc ENTER(abcの前後にスペースを1つずつ)と入力してください。
そうすると、実行例74の様な表示になります。
Syn BASIC Version 0.31α ©2021-2022 Hiroshi Tanigawa(Synapse) Ok INPUT A$ ← 文字列を入力するINPUT文 ? abc ← abcの前後にスペース Ok ← Okが出て、INPUT文の実行が終了した
Okと表示されて、INPUT文の実行が終了しているので、一見、正しくA$
に abc
(abcの前後にスペース)という文字列が代入されたように思えます。
ここで、変数A$
の値を表示して確認してみましょう。普通ならPRINT A$
を実行するのですが、それでは、A$
の末尾にスペースが入っている事が分かりません。
そこで、PRINT "#";A$;"#"
を実行する事にします。つまり、A$
に代入されている文字列の前後に、#
を表示させるのです。
こうすれば、例えばA$
に abc
(abcの前後にスペース)と正しく入力されていれば、画面には# abc #と、#、スペース、abc、スペース、#という文字列が表示されるはずです。もしA$
の値が、 abc
と、abcの後にスペースがなかったり、abc
と、abcの前にスペースがなかったりすると、表示はそれぞれ、# abc#や#abc #となり、スペースが抜けている事がはっきりと分かります。
それでは、画面44で、引き続きPRINT "#";A$;"#"ENTERと入力してください。
そうすると、実行例75の様な表示になります。
Syn BASIC Version 0.31α ©2021-2022 Hiroshi Tanigawa(Synapse) Ok INPUT A$ ? abc Ok PRINT "#";A$;"#" ← A$の値を確認するPRINT文 #abc# ← abcの前後にスペースがない Ok
この様に、#abc#と表示されるので、A$
の値は、前後にスペースがないabc
だった事になります。
この例で示す様に、INPUT文で文字列を入力する際は、先頭のスペースと末尾のスペースは、削除されてしまいます。
先頭と末尾のスペースが削除されないようにするためには、文字列の前後を"で囲みます。例えば、 abc
という具合に、abcの前後にスペースが1つずつ付いた文字列を入力したい場合は、" abc "
という具合に、文字列の前後に"を付けてください。
それでは、実際に試してみましょう。下の画面45で、INPUT A$ENTER、" abc "ENTER(abcの前後にスペース)、PRINT "#";A$;"#"ENTERと、順に入力してください。
INPUT A$ENTER、" abc "ENTER(abcの前後にスペース)、PRINT "#";A$;"#"ENTERと、順に入力してください。
今度は、実行例76に示す様に、# abc #と、abc
の前後にスペースが表示されるはずです。この様に、"で文字列を囲む事で、先頭や末尾のスペースを正しく入力できる事が、確認できました。
Syn BASIC Version 0.31α ©2021-2022 Hiroshi Tanigawa(Synapse) Ok INPUT A$ ? " abc " ← 文字列を"で囲む Ok PRINT "#";A$;"#" # abc # ← abcの前後にスペースがある Ok
リスト9に示す、変数Xの値を画面に表示するプログラムが入力してある状態で、X=1ENTER、RUNENTERと順に入力すると、何が表示されるでしょうか?ちょっと、考えてみてください。
X=1
で、変数X
に1を代入してからRUN
でプログラムを実行しているので、画面には1が表示されそうな気もするのですが···。
10 PRINT X
それでは、実際に試してみましょう。下の画面46で、10 PRINT XENTER、X=1ENTER、RUNENTERと、順に入力してください。
10 PRINT XENTER、X=1ENTER、RUNENTERと、順に入力してください。
そうすると、実行例77に示す様に、1ではなく0が表示されます。
Syn BASIC Version 0.31α ©2021-2022 Hiroshi Tanigawa(Synapse) Ok 10 PRINT X ← リスト9を入力 X=1 ← Xに1を代入 Ok RUN ← プログラムを実行 0 ← Xの値は0だった Ok
X
に1を代入した後にリスト9のプログラムを実行した例これは、RUN命令でプログラムを実行する際に、プログラムの実行に先立って、全ての変数を消去するからです。リスト9のプログラムを実行し始める時には、変数X
は、消去されてなくなっています。一度も代入されていない数値変数を読むと、0が読みだされるので、10 PRINT X
で、0が表示されたのです。
ちなみに、一度も代入されていない文字列変数を読むと、空文字列(文字数が0文字の文字列)が読みだされます。
参考:RUN命令は、プログラムを実行する前に、全ての変数を消去して、変数が全くない状態でプログラムを実行するのですが、これを、「全ての数値変数に0を代入し、全ての文字列変数に空文字列を代入してからプログラムを実行する」と考えても、プログラムの実行結果に違いはありません。
RUN命令でプログラムを実行する時以外に、NEW命令でプログラムを消去する際にも、全ての変数が消去されます。
次回から、プログラムの流れの制御に関して説明する予定です。