[BASICのはじめ方] Part15: 構造化BASIC(FUNCTION、SUB)の基礎

BASIC

はじめに

これまでのステップで、GOTOGOSUB...RETURN を使ったプログラムの流れの制御を学びましたね。これらは特定の場所へジャンプしたり、簡単なサブルーチン(一連の処理のまとまり)を呼び出したりするのに便利でした。😊

しかし、プログラムが大きくなってくると、GOTOGOSUB だけではコードが複雑になりがちです。「スパゲッティコード」と呼ばれる、流れが追いづらいプログラムになってしまうことも…🍝

そこで登場するのが構造化BASICの機能、SUBFUNCTION です! これらは、プログラムをより整理された、読みやすく、再利用しやすい部品(モジュール)に分割するための強力なツールです。構造化プログラミングは、コードの品質を向上させるための重要な考え方です。

このステップでは、SUBFUNCTION の基本的な使い方を学び、GOSUB との違いを理解していきましょう。💡

SUB プロシージャ:値を返さない処理のまとまり

SUB (サブルーチンやプロシージャとも呼ばれます) は、特定のタスクを実行する一連の命令をまとめたものです。GOSUB と似ていますが、SUB値を返さないという特徴があります。主に、画面に何かを表示したり、ファイルに書き込んだりといった、一連の操作を実行するために使われます。

基本的な構文は以下のようになります (具体的な構文はBASICの処理系によって多少異なります):

SUB SubName (parameter1, parameter2, ...)
    ' ここにプロシージャの処理を書く
    ' ...
END SUB

SUBEND SUB で処理のまとまりを定義します。SubName がこのプロシージャの名前です。括弧 () の中には、引数 (ひきすう、parameter) を指定できます。引数は、プロシージャを呼び出すときに外部から情報を受け取るための変数です。

SUBの例:メッセージを表示する

指定したメッセージを画面に表示する簡単な SUB を作ってみましょう。

' メッセージを表示するSUBプロシージャの定義
SUB PrintMessage (msg AS STRING)
    PRINT "メッセージ: "; msg
END SUB

' メインの処理
PRINT "プログラム開始"
CALL PrintMessage("こんにちは!") ' SUBを呼び出す
CALL PrintMessage("元気ですか?")   ' 引数を変えて再度呼び出す
PRINT "プログラム終了"

この例では、PrintMessage という名前の SUB を定義しています。この SUBmsg という文字列型の引数を一つ受け取ります。メインの処理部分で CALL PrintMessage(...) のようにして SUB を呼び出しています (CALL は省略できる処理系もあります)。呼び出す際に括弧の中に渡している値 ("こんにちは!" など) が引数 msg に渡され、PRINT 文で表示されます。👍

変数スコープについて

SUB の中で宣言された変数 (例: DIM 文で作った変数) は、通常、その SUB の中でしか使えません。これをローカル変数と呼びます。これにより、他の場所で同じ名前の変数を使っていても、互いに影響を与えないようになり、プログラムの見通しが良くなります。

FUNCTION プロシージャ:値を返す処理のまとまり

FUNCTION (関数とも呼ばれます) は、SUB と非常によく似ていますが、大きな違いは値を返すことです。計算結果などを呼び出し元に返したい場合に使います。

基本的な構文は以下のようになります:

FUNCTION FunctionName (parameter1, parameter2, ...) AS ReturnType
    ' ここに関数の処理を書く
    ' ...
    FunctionName = ReturnValue ' 関数名に返す値を代入
END FUNCTION

FUNCTIONEND FUNCTION で関数のまとまりを定義します。FunctionName が関数名です。AS ReturnType の部分で、この関数が返す値のデータ型 (例: INTEGER, STRING) を指定します。関数の中で、関数名と同じ名前の変数に値を代入することで、その値が呼び出し元に返されます (処理系によっては RETURN ReturnValue のような構文を使う場合もあります)。

FUNCTIONの例:二つの数を足し算する

二つの数を受け取って、その合計を返す簡単な FUNCTION を作ってみましょう。

' 二つの整数の合計を返すFUNCTION
FUNCTION AddNumbers (a AS INTEGER, b AS INTEGER) AS INTEGER
    DIM result AS INTEGER
    result = a + b
    AddNumbers = result ' 関数名に結果を代入して返す
END FUNCTION

' メインの処理
DIM num1 AS INTEGER
DIM num2 AS INTEGER
DIM sumResult AS INTEGER

num1 = 10
num2 = 5
sumResult = AddNumbers(num1, num2) ' FUNCTIONを呼び出し、戻り値を受け取る

PRINT num1; " + "; num2; " = "; sumResult

sumResult = AddNumbers(100, 200) ' 別の値で呼び出す
PRINT "100 + 200 = "; sumResult

この例では、AddNumbers という名前の FUNCTION を定義しています。これは整数型の引数 ab を受け取り、整数型 (AS INTEGER) の値を返します。関数の中で計算した結果 (result) を関数名 AddNumbers に代入しています。メイン処理では、sumResult = AddNumbers(num1, num2) のようにして関数を呼び出し、返された値を変数 sumResult で受け取っています。💯

FUNCTION 内の変数 (例: result) も通常はローカル変数です。

GOSUB と SUB/FUNCTION の比較

GOSUBSUB/FUNCTION は、どちらも処理をまとめる機能ですが、いくつかの重要な違いがあります。

機能GOSUB … RETURNSUBFUNCTION
定義方法ラベルと RETURNSUB ... END SUBFUNCTION ... END FUNCTION
呼び出し方GOSUB labelCALL SubName(args) (CALL は省略可な場合も)result = FunctionName(args) (式の中で使用)
引数 (パラメータ)渡せない (共有変数を使う必要あり)渡せる渡せる
戻り値返せない (共有変数を使う必要あり)返せない返せる
変数スコープ通常グローバル (どこからでもアクセス可)通常ローカル (プロシージャ内のみ)通常ローカル (プロシージャ内のみ)
構造化低い (流れが追いづらくなる可能性)高い (モジュール化しやすい)高い (モジュール化しやすい)

SUBFUNCTION を使うことで、引数を使ってデータを明確に渡し、FUNCTION では結果を戻り値として受け取ることができます。また、ローカル変数によって、意図しない変数の書き換えを防ぎやすくなります。

構造化のメリット ✨

SUBFUNCTION を使ってプログラムを構造化(モジュール化)することには、たくさんの利点があります。

  • 読みやすさ向上: 処理のまとまりに名前が付くため、コードの目的が理解しやすくなります。
  • 保守しやすさ向上: 特定の機能を修正したい場合、該当する SUBFUNCTION だけを修正すれば良いため、影響範囲が限定され、デバッグが容易になります。
  • 再利用性の向上: 一度作成した SUBFUNCTION は、プログラム内の他の場所や、別のプログラムからでも呼び出して再利用できます。
  • 開発効率の向上: 処理を部品化することで、分担して開発したり、既存の部品を組み合わせて新しいプログラムを素早く作成したりできます。

GOTOGOSUB が完全に不要になるわけではありませんが、プログラムを整理し、より良いコードを書くためには、SUBFUNCTION を積極的に活用していくことが推奨されます。

まとめ

今回は、構造化BASICの重要な要素である SUBFUNCTION について学びました。

  • SUB は値を返さない処理のまとまりです。
  • FUNCTION は値を返す処理のまとまりです。
  • どちらも引数を受け取ることができ、コードをモジュール化するのに役立ちます。
  • ローカル変数により、変数の影響範囲が限定され、コードの安全性が高まります。
  • GOSUB と比べて、より構造化され、読みやすく、保守しやすいプログラムを作成できます。

最初は少し難しく感じるかもしれませんが、実際に使ってみることで、その便利さがわかってくるはずです。色々な処理を SUBFUNCTION にまとめてみましょう! 💪

参考情報

使用しているBASIC処理系(QBasic, FreeBASIC, QB64など)のマニュアルや、オンラインのチュートリアルで SUBFUNCTION の詳細な構文や機能を確認することをお勧めします。

例えば、以下のようなキーワードで検索すると情報が見つかるでしょう。

  • 「FreeBASIC SUB documentation」
  • 「QBasic FUNCTION examples」
  • 「構造化プログラミング BASIC」

コメント

タイトルとURLをコピーしました