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


が画面に表示されます。

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

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

サブルーチンには、プロシージャ 関数の 2 つのタイプがあります。

サブルーチンは、結果を特定の形式で画面に表示するなど、いくつかのアクションを実行します (簡単な例として、演算子 printf()  は、情報を画面に出力する標準サブルーチンです)。

関数サブルーチンはメイン プログラムで使用できる結果 (数値、文字列など) を返します

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

このような場合には手続きが必要
になります。 プロシージャを含むプログラムは次のようになります。 #include 名前空間 std を使用します。 void printError() // プロシージャの説明 { cout << "エラー"; // プロシージャ本体 - プロシージャが実行するコマンド } 主要() { ... printError() // 実行のためのプロシージャを開始します。実行したいプロシージャの名前を指定するだけです。 ... printError() ... } プロシージャは void という単語で始まります。プロシージャ名の後には空の括弧があります。
プロシージャ内で実行されるすべてのステートメントはインデントされます。

プロシージャはメイン関数 main() の前に記述されます

プロシージャを実行するには、メイン プログラムでプロシージャを名前で呼び出し、 かっこを忘れずに記述する必要があります
プログラム内のプロシージャは何度でも呼び出すことができます。

ここで、ユーザーのエラーに応じて、ユーザーが犯した間違いの種類に応じて異なるメッセージを表示する必要があると考えてみましょう。
この場合、エラーごとに独自のプロシージャを作成できます。 void printErrorZero() { cout << 「エラーです。ゼロ除算!"; } void printErrorInput() { cout << "入力エラー!"; } さらに多くのエラーの可能性がある場合はどうなるでしょうか?この解決策は私たちには合いません。
どのようなエラーメッセージを表示するかを指示してプロシージャを制御する方法を学ぶ必要があります。
これを行うには、プロシージャ名の後に括弧内に記述するパラメータが必要です。 void printError(文字列) { cout << s; } このプロシージャでは、 s はパラメータ、つまりプロシージャの制御を可能にする特別な変数です。
パラメータは、サブルーチンの動作方法を決定する変数です。パラメータ名は、サブプログラムのヘッダーにカンマで区切ってリストされます。パラメータの型はパラメータの前に記述されます。

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

ローカル変数とグローバル変数
多くの場合、サブルーチン内でのみ使用される追加の変数を使用する必要があります。このような変数はローカル (またはローカル) と呼ばれ、変数が作成されたサブルーチン内でのみ操作できます。
 
ローカル変数スコープは、その変数が宣言される中括弧で囲まれたブロックです

C++ のメイン プログラムもサブルーチンであるため、main() 内で宣言されたすべての変数はローカル変数です。
他のサブルーチンは、他のサブルーチンのローカル変数について何も「認識」しません。

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

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

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


3 つのプログラムを分析します。 <テーブル align="center" border="1" cellpadding="1" cellpacing="1" style="width:95%"> <本体>
1) このプログラムでは、変数 i はローカルです。ローカル変数がサブルーチン内で宣言されている 2) ここでは、メイン プログラムに変数 i (値 7) が存在する場合でも、値 5 の新しいローカル変数 i が作成されます。
このプログラムを実行すると、画面に値 75 が表示されます
3) このプログラムにはグローバル変数 i があります。その値はサブルーチン内およびメイン プログラム内で変更できます。
このプロシージャはグローバル変数 i を使用して動作し、新しい値 2 が割り当てられます。値 2
ボイドテスト() {   int i = 5; cout <<私; } ボイドテスト() {   int i = 5;   cout <<私; } 主要() { int i = 7;   cout <<私;  テスト(); } #include <iostream> 名前空間 std を使用します。 int i; ボイドテスト() {   i = 2; } 主要() { テスト(); cout <<私; }
タスク
2 つの変数の値を交換するプロシージャを作成します。

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

次のような手順を書いてみます。 void Swap ( int a, int b ) // このようなプロシージャパラメータの記述では、 { // 引数 (x と y) の値がコピーされます。 int c; // 変数 a と b は x と y に関係のない独立変数です c = a; a = b; b=c; } 主要() { int x=1、y=2; スワップ(x, y); // 変数 x と y (引数) の値がパラメータ a と b にコピーされます cout << 「x=」 << ×<< ", y=" << y; // x=1、y=2 } このプログラムを実行すると、変数 xy の値が変化していないことがわかります。パラメータで引数の値を変更するには、参照によるデータの受け渡しを使用する必要があります。これを行うには、データ型の名前の後に記述します。サブルーチンのヘッダーには、記号& (「アンパサンド」) を入れる必要があります。 void スワップ ( int & a, int & b ) // 変数 a と b はメモリ内の変数 x と y のアドレスを取得します { int c; c = a; a = b; b=c; } 使用法: 参照によって引数を渡す場合、プロシージャを呼び出すときにこの場所に含めることができるのは変数名 (数値や算術式ではありません) のみです。< br />
次のようなプロシージャを呼び出さないでください: Swap(x, 4 ); Swap(5+x, y);