サブルーチン: プロシージャと関数 - 1


サブルーチンは、名前があり、独自の別個のタスクを解決するプログラムの別個の部分です。サブルーチンはメインプログラムの先頭に配置されており、名前を指定することでメインプログラムから起動(呼び出し)できます。

プログラムの別の場所に同じコードを記述する必要がある場合、サブルーチンを使用するとコードの重複を避けることができます。 . 
プログラム (システム など) にインポートされるライブラリは、誰かがすでにコンパイルしたルーチンで構成されます。プログラマは、どのようなアルゴリズムが実装されているかを考える必要はなく、正確に何をしているのかだけを考えて、それらを適用するだけです。これにより時間を大幅に節約できます。すでに誰かが書いたアルゴリズムを自分で書く必要は
ありません。
各サブルーチンは、何かを計算するか、データを出力するか、または他のことを行うタスクを 1 つだけ実行する必要があります


サブルーチン、つまりメソッドには、関数 (作業の結果を返すもの) と プロシージャ (結果を返さないもの) の 2 つのタイプがあります。

2 番目のタイプから始めましょう。簡単な例を書いてみま
しょう。 画面に「Error」という文字列を表示する必要があるとします。ユーザーの過失(例えば、間違ったデータを入力した場合など)によりコード内でエラーが発生する可能性があるたびに。
これは、ステートメント
を記述することで実行できます。 <プレ> Console.WriteLine("Error"); 次に、この行をプログラム内の多くの場所に挿入する必要があると想像してみましょう。もちろんどこにでも書いて大丈夫です。ただし、この解決策には 2 つの欠点があります。
1) この文字列はメモリに何度も保存されます。
2) エラー時の出力を変更したい場合は、プログラム全体でこの行を変更する必要があり、かなり不便です。

このような場合には方法や手順が
必要になります。 プロシージャを含むプログラムは次のようになります。

システムの使用;
クラスプログラム {
    static void PrintError() {
        Console.WriteLine("エラー");
    }
    static void Main() {
        PrintError();
    }
}

 

プロシージャはvoidという単語で始まります。プロシージャ名  空の括弧が書き込まれます。
プロシージャ内で実行されるすべてのステートメントはインデントされます。
Static  修飾子は、指定されたフィールド、メソッド、またはプロパティがクラスの各オブジェクトに属するのではなく、それらすべてに一緒に属することを意味します。
メソッドとプロシージャは、メイン メソッド Main() の前に記述されます。

プロシージャを参照するには、メイン プログラムでプロシージャを名前で呼び出す必要があり、かっこを書くことを忘れないでください。
プログラム内のプロシージャは何度でも呼び出すことができます。

次に、ユーザー エラーに応じて異なるメッセージを表示する必要があると想像してみましょう。まさに彼が犯した間違い
です。 この場合、エラーごとに独自の手順を作成できます。

 

void printErrorZero() {     Console.WriteLine("エラー。ゼロ除算!"); }

 

 

<プレ> void printErrorInput() { Console.WriteLine("入力エラー!"); } さらに多くのエラーが考えられる場合はどうなるでしょうか?そうなるとこの解決策は私たちには合わなくなり
ます。 どのようなエラーメッセージを表示するかを指示してプロシージャを制御する方法を学ぶ必要があります。
これを行うには、プロシージャ名の後に括弧内に記述するパラメータが必要です。
<プレ> void printError(string s) { Console.WriteLine; } この手順では、s はパラメータ、つまり特殊な変数です。プロシージャを制御できます。
パラメータは、サブルーチンの動作がその値に依存する変数です。パラメータ名は、サブプログラムのヘッダーにカンマで区切ってリストされます。パラメータのタイプはパラメータの前に記述されます。

ここで、プロシージャを呼び出すときに、割り当てられる実際の値を括弧内に指定する必要があります。プロシージャ内のパラメータ ( 変数 s) に変換します <プレ> printError("エラー! ゼロ除算!"); この値は引数と呼ばれます。
引数は、サブルーチンが呼び出されたときにサブルーチンに渡されるパラメータ値です。
引数には定数値だけでなく、変数や算術式も使用できます。< /スパン>< /スパン>

ローカル変数とグローバル変数
多くの場合、サブルーチン内でのみ使用される追加の変数を使用する必要があります。このような変数はローカル (またはローカル) と呼ばれ、変数が作成されたサブルーチン内でのみ操作できます。
 
ローカル変数スコープは、その変数が宣言される中括弧で囲まれたブロックです。
C# のメイン プログラムもサブルーチンであるため、void Main() 内で宣言された変数はすべてローカル変数になります。他のサブルーチンは、他のサブルーチンのローカル変数について何も「認識」しません。

したがって、変数の有効範囲 (スコープ) を、それが本当に必要なサブルーチンのみに制限することができます。プログラミングでは、この技術はカプセル化と呼ばれます。 - 変数が外部から変更されないように隠します。

プログラム内の任意の場所 (サブルーチン内) で参照できる変数を宣言する必要がある場合、そのような変数はすべてのサブルーチンの外側で宣言されます (以下の表のプログラム 3 を参照)。
このような変数はグローバルと呼ばれます。

C# では、プログラムの開始時に、すべてのグローバル変数が自動的に 0 に設定されます (ブール変数の値は false になります)。

3 つのプログラムを分析します。 <本体>

1) このプログラムでは、変数 i はローカルです。ローカル変数はサブルーチン内で宣言されます。 2) ここでは、メイン プログラムに変数 i (値 7) が存在する場合でも、値 5 の新しいローカル変数 i が作成されます。
このプログラムを実行すると、画面に値 75 が表示されます。
3) このプログラムにはグローバル変数 i があります。その値はサブルーチン内およびメインプログラム内で変更できます。
このプロシージャはグローバル変数 i を使用して動作し、新しい値 2 が割り当てられます。値 2 が表示されます。
静的 void テスト() {   int i = 5; Console.Write("i"); } 静的 void テスト() {   int i = 5;   Console.Write("i"); } 静的 void Main() { int i = 7;   Console.Write("i");  テスト(); } システムを使用する; クラス プログラム { int i; 静的 void テスト() {   i = 2; } 静的 void Main() { テスト(); Console.Write("i"); } }
タスク
2 つの変数の値を交換するプロシージャを作成します。

このタスクの特徴は、プロシージャで行われた変更を呼び出し側プログラムに認識させる必要があることです。

次のような手順を書いてみます。 static void Swap (int a, int b) // プロシージャパラメータのこのような記述では、 { // 引数 (x と y) の値をコピーします int c; // 変数 a と b は x と y に関係のない独立変数です c = a; a = b; b=c; } 静的 void Main() { int x=1、y=2; スワップ(x, y); //変数 x と y (引数) の値はパラメータ a と b にコピーされ、x = 1、y = 2 } このプログラムを実行すると、x 変数と y 変数の値が変わっていないことがわかります。パラメータで引数の値を変更するには、データの参照渡しを使用する必要があります。これを行うには、サブルーチンのヘッダーのデータ型の名前の前に、ref を記述する必要があります。 void Swap ( ref int a, ref int b ) // 変数 a と b はメモリ内の変数 x と y のアドレスを取得します { int c; c = a; a = b; b=c; } 静的 void Main() {   int x=1、y=2;  スワップ(ref x, ref y); アプリケーション: 参照によって引数を渡す場合、プロシージャを呼び出すときに、この場所に変数名 (数値や算術式ではありません) のみを置くことができます。

次のようなプロシージャを呼び出すことはできません。 <プレ> スワップ(x, 4); スワップ(5+x, y);