AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
サブルーチンBASIC(12)
前回のキー入力をもう少し考えてみます。
10 B$=""
20 A$=INPUT$(1)
30 IF ASC(A$)=13 THEN 70
40 IF ASC(A$)<32 THEN 20
50 PRINT A$:B$=B$+A$
60 GOTO 20
70 〜
これでは画面上のどこでキー入力するのか分かりません。画面上の位置を示すのにLOCATE文を入れましょう。
10 B$=""
15 LOCATE 10,10
20 A$=INPUT$(1)
30 IF ASC(A$)=13 THEN 70
40 IF ASC(A$)<32 THEN 20
50 PRINT A$:B$=B$+A$
60 GOTO 20
70 〜
 
さて、入力を2箇所で行いたい場合は、どのようにするでしょうか? 上記を2回やればいいという訳で単純に2回書いてみましょう。
10 B$=""
15 LOCATE 10,10
20 A$=INPUT$(1)
30 IF ASC(A$)=13 THEN 80
40 IF ASC(A$)<32 THEN 20
50 PRINT A$:B$=B$+A$
60 GOTO 20
70 '
80 C$=""
90 LOCATE 10,11
100 A$=INPUT$(1)
110 IF ASC(A$)=13 THEN 150
120 IF ASC(A$)<32 THEN 100
130 PRINT A$:C$=C$+A$
140 GOTO 100
150 〜
面倒ですね。行番号付けもラベルを使うにしても面倒です。それでは、GOTO文で書いてみましょう。
10 B$=""
20 LOCATE 10,10
30 GOTO *NYURYOKU
40 '
50 C$=""
60 LOCATE 10,11
70 GOTO *NYURYOKU
80 '
90 END
100 '
110 *NYURYOKU
120 A$=INPUT$(1)
130 IF ASC(A$)=13 THEN 元に戻りたい〜
140 IF ASC(A$)<32 THEN 120
150 PRINT A$:B$=B$+A$?C$=C$+A$?
160 GOTO 120
GOTO文で書こうとして悩んでしまいました。元に戻るには?どうやって変数の値を得るの?これをクリアするには、何個目の入力かを区別する変数を使うしかありません。
10 N=1
20 LOCATE 10,10
30 GOTO *NYURYOKU
35 B$=M$
40 '
50 N=2
60 LOCATE 10,11
70 GOTO *NYURYOKU
75 C$=M$
80 '
90 END
100 '
110 *NYURYOKU
115 M$=""
120 A$=INPUT$(1)
130 IF ASC(A$)=13 THEN 170
140 IF ASC(A$)<32 THEN 120
150 PRINT A$:M$=M$+A$
160 GOTO 120
170 IF N=1 THEN 35
180 GOTO 75
プログラムは、30行・70行でGOTO文でどこかに飛んで行ったはずなのに直ぐ後ろに戻って来させる「奇妙さ」に加え、わざわざ変数を設定して、入力部を終了する際に判定して戻し場所へGOTOさせる、というのも全然美しくありません。
こういう時に登場するのが、サブルーチンです。
 
サブルーチンは、GOSUB文・RETURN文をペアで使います。GOSUB文の使い方はGOTO文と同じです。が、ジャンプした先でRETURN文が見つかると、自動的に、元のGOSUB文の次の文に戻ってきてくれます。
10 LOCATE 10,10
20 GOSUB *NYURYOKU
30 B$=M$
40 '
50 LOCATE 10,11
60 GOSUB *NYURYOKU
70 C$=M$
80 '
90 END
100 ' --- 入力ルーチン ---
110 *NYURYOKU
115 M$=""
120 A$=INPUT$(1)
130 IF ASC(A$)=13 THEN RETURN
140 IF ASC(A$)<32 THEN 120
150 PRINT A$:M$=M$+A$
160 GOTO 120
ついでに、LOCATE文も何個もあると美しくないですから入力ルーチンの中に入れてしまいましょう。座標値が違いますが、これは変数を使って受け渡すようにします。こういう変数の事を「引数」や「パラメータ」という言い方をします。また、入力した文字内容を受け取る値は「返り値」のように言います。
10 X=10:Y=10:GOSUB *NYURYOKU:B$=M$
20 X=10:Y=11:GOSUB *NYURYOKU:C$=M$
30 END
100 ' --- 入力ルーチン ---
101 'in X,Y:入力座標
102 'out M$:入力した文字列
110 *NYURYOKU
115 M$="":LOCATE X,Y
120 A$=INPUT$(1)
130 IF ASC(A$)=13 THEN RETURN
140 IF ASC(A$)<32 THEN 120
150 PRINT A$:M$=M$+A$
160 GOTO 120
なお、N88BASIC(86)には、C言語等のようなローカル変数というのはありません。プログラムが複雑になってくると、どこでどんな変数名を使ったのかをちゃんと管理しておかないと深刻な不具合の原因となります。サブルーチン内で使う変数名は少し特殊なものにしておくとか、使った変数名はコメントにしておきましょう。例えば、以下のようにするとか・・・
100 ' --- 入力ルーチン ---
101 'in NYU.X,NYU.Y:入力座標
102 'out NYU.R$:入力した文字列
110 *NYURYOKU
115 NYU.R$="":LOCATE NYU.X,NYU.Y
120 NYU.A$=INPUT$(1)
130 IF ASC(NYU.A$)=13 THEN RETURN
140 IF ASC(NYU.A$)<32 THEN 120
150 PRINT NYU.A$:NYU.R$=NYU.R$+NYU.A$
160 GOTO 120

バッチファイル
BASIC
 1 2 3 4 5
 6 7 8 9 A
 B C D E F
 G H I J
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.