C プログラミングの関数と例: 再帰的およびインライン
Cの関数とは何ですか?
Cプログラミングにおける関数 は、プログラムの理解とテストを容易にし、呼び出し元のプログラムを変更せずに簡単に変更できる再利用可能なコード ブロックです。 関数はコードを分割し、プログラムをモジュール化して、より良い効果的な結果を実現します。 つまり、より大きなプログラムは、関数として呼び出されるさまざまなサブプログラムに分割されます。
大規模なプログラムをさまざまな関数に分割すると、各関数を個別に管理することが容易になります。 プログラムでエラーが発生した場合は、問題のある機能を簡単に調査し、それらのエラーのみを修正できます。 必要なときにいつでも簡単に機能を呼び出して使用できるため、時間とスペースの節約につながります。
図書館 vs. ユーザー定義関数
すべての「C」プログラムにはメイン関数である関数が少なくとも XNUMX つありますが、プログラムには任意の数の関数を含めることができます。 C の main () 関数はプログラムの開始点です。
「C」プログラミングでは、関数は XNUMX つのタイプに分類されます。
- ライブラリ関数
- ユーザー定義関数
C のライブラリ関数とユーザー定義関数の違いは、ライブラリ関数のコードを記述する必要がないことです。 これは、プログラムの先頭に常に含めるヘッダー ファイル内にすでに存在します。 関数の名前を入力し、適切な構文とともに使用するだけです。 ライブラリ関数の例としては、printf、scanf があります。
一方、ユーザー定義関数は、関数の本体を記述し、プログラム内で何らかの操作を実行するために関数が必要なときにその関数を呼び出す必要があるタイプの関数です。
C のユーザー定義関数は常にユーザーによって作成されますが、後で 'C' ライブラリの一部にすることができます。これは 'C' プログラミングの大きな利点です。
C プログラミング関数は、次の XNUMX つのアクティビティに分かれています。
- 関数宣言
- 関数定義
- 関数呼び出し
関数宣言
関数宣言とはプログラムの名前を書くことです。 コード内で関数を使用する場合は必須の部分です。 関数宣言では、変数宣言と同様に、プログラムで使用する関数の名前を指定するだけです。 関数はプログラム内で宣言しないと使用できません。 関数宣言は「関数」とも呼ばれます。 プロトタイプに設立された地域オフィスに加えて、さらにローカルカスタマーサポートを提供できるようになります。」
関数宣言 (プロトタイプと呼ばれる) は通常、main () 関数の上で行われ、一般的な形式を取ります。
return_data_type function_name (data_type arguments);
- この 戻りデータの種類: は、呼び出し側ステートメントに返される値関数のデータ型です。
- この 関数名: の後に括弧が続きます
- Arguments データ型宣言を含む名前は、オプションで括弧内に配置されます。
整数変数の立方値を計算する立方関数を宣言する方法を示す次のプログラムを検討します。
#include <stdio.h> /*Function declaration*/ int add(int a,b); /*End of Function declaration*/ int main() {
関数は必ずしも値を返すわけではないことに注意してください。 この場合、キーワード void が使用されます。
たとえば、output_message 関数宣言は、関数が値を返さないことを示します。
関数定義
関数定義とは、関数の本体を記述するだけです。 関数の本体は、特定のタスクを実行するステートメントで構成されます。 関数本体は、単一またはステートメントのブロックで構成されます。 これは関数の必須の部分でもあります。
int add(int a,int b) //function body { int c; c=a+b; return c; }
関数呼び出し
関数呼び出しとは、プログラムで必要なときにいつでも関数を呼び出すことを意味します。関数を呼び出すたびに、関数は設計された操作を実行します。関数呼び出しは、プログラムのオプション部分です。
result = add(4,5);
完全なコードは次のとおりです。
#include <stdio.h> int add(int a, int b); //function declaration int main() { int a=10,b=20; int c=add(10,20); //function call printf("Addition:%d\n",c); getch(); } int add(int a,int b) //function body { int c; c=a+b; return c; }
出力:
Addition:30
関数の引数
関数の引数は、関数呼び出しによって必要な値を受け取るために使用されます。 これらは位置によって照合されます。 最初の引数は最初のパラメータに渡され、XNUMX 番目の引数は XNUMX 番目のパラメータに渡されます。
デフォルトでは、 引数は値によって渡されます データのコピーが呼び出された関数に渡されます。 実際に渡される変数は変わりません。
値渡しされるパラメータを示す次のプログラムを検討します。
int add (int x, int y); int main() { int a, b, result; a = 5; b = 10; result = add(a, b); printf("%d + %d\ = %d\n", a, b, result); return 0;} int add (int x, int y) { x += y; return(x);}
プログラムの出力は次のとおりです。
5 + 10 = 15
add 関数に渡された a と b の値は、その値のみがパラメータ x に渡されたため、変更されないことに注意してください。
可変スコープ
変数スコープとは、プログラムのコード内の変数の可視性を意味します。
C では、関数内で宣言された変数はそのコード ブロックに対してローカルであり、関数の外部から参照することはできません。 ただし、すべての関数の外で宣言された変数はグローバルであり、プログラム全体からアクセスできます。 で宣言された定数 #定義する プログラムの先頭にある変数は、プログラム全体からアクセスできます。メイン関数とユーザー定義関数の両方からグローバル変数の値を出力する次のプログラムを考えます。
#include <stdio.h> int global = 1348; void test(); int main() { printf("from the main function : global =%d \n", global); test () ; return 0;} void test (){ printf("from user defined function : global =%d \n", global);}
結果:
from the main function : global =1348 from user defined function : global =1348
プログラムの詳細について説明します。
- 初期値として 1348 を使用して整数グローバル変数を宣言します。
- 引数も取らず、値も返さない test() 関数を宣言して定義します。 この関数は、プログラム内のどこからでもグローバル変数にアクセスできることを示すために、グローバル変数の値のみを出力します。
- main 関数内でグローバル変数を出力します。
- グローバル変数の値を出力するために、テスト関数を呼び出します。
C では、引数が関数のパラメータに渡されると、パラメータはローカル変数として機能し、関数の終了時に破棄されます。
この方法でエスプレッソの抽出を計量する場合、エスプレッソがスパウトから落ちるタイミングとスケールが反応するタイミングに時間差が生じます。エスプレッソがスパウトからエスプレッソカップに落ち、スケールが計量するまで若干の時間差が生じるため、抽出ボタンを止めた後、液量が約2~4g増加することを念頭に置いて抽出を止めてください。 グローバル変数エラーが発生する可能性があり、プログラム内の任意の場所で変更される可能性があるため、注意して使用してください。 使用する前に初期化する必要があります。
静的変数
静的変数はローカル スコープを持ちます。ただし、関数を終了しても破棄されません。したがって、静的変数は値を永久に保持し、関数に再度入ったときにアクセスできます。静的変数は宣言時に初期化され、プレフィックス static が必要です。
次のプログラムは静的変数を使用します。
#include <stdio.h> void say_hi(); int main() { int i; for (i = 0; i < 5; i++) { say_hi();} return 0;} void say_hi() { static int calls_number = 1; printf("Hi number %d\n", calls_number); calls_number ++; }
プログラムは次のように表示します。
Hi number 1 Hi number 2 Hi number 3 Hi number 4 Hi number 5
再帰関数
次のように計算される数値の階乗を考えてみましょう 6! =6*5*4*3*2*1。
この計算は、fact が 1 になるまで、fact * (fact -1) を繰り返し計算して実行されます。
再帰関数は、それ自体を呼び出す関数であり、再帰呼び出しを終了するための終了条件が含まれています。 階乗数計算の場合、終了条件は事実が 1 に等しいです。再帰は、終了条件が true になるまで呼び出しを「積み重ねる」ことによって機能します。
例:
#include <stdio.h> int factorial(int number); int main() { int x = 6; printf("The factorial of %d is %d\n", x, factorial(x)); return 0;} int factorial(int number) { if (number == 1) return (1); /* exiting condition */ else return (number * factorial(number - 1)); }
プログラムは次のように表示します。
The factorial of 6 is 720
ここでは、プログラムの詳細について説明します。
- 整数パラメータを受け取り、このパラメータの階乗を返す再帰階乗関数を宣言します。 この関数はそれ自体を呼び出し、終了するか基本条件に達するまで数値を減らします。 条件が true の場合、以前に生成された値が互いに乗算され、最終的な階乗値が返されます。
- 整数変数を値「6」で宣言して初期化し、factorial 関数を呼び出してその階乗値を出力します。
基本ケースまたは停止条件に達するまで関数自体を呼び出し、その後、以前の値を収集する再帰メカニズムをより理解するには、次の表を検討してください。
インライン関数
C プログラミングの関数は、最も頻繁に使用される命令を保存するために使用されます。 プログラムをモジュール化するために使用されます。
関数が呼び出されるたびに、命令ポインタは関数定義にジャンプします。 関数の実行後、命令ポインタは関数定義にジャンプした場所からステートメントに戻ります。
関数を使用するときは常に、追加の関数が必要です ポインタ head をクリックして関数定義にジャンプし、ステートメントに戻ります。 このようなポインターヘッドの必要性を排除するために、インライン関数を使用します。
インライン関数では、関数呼び出しが実際のプログラム コードに直接置き換えられます。すべての操作はインライン関数内で実行されるため、ブロックにジャンプすることはありません。
インライン関数は主に小規模な計算に使用されます。 大規模なコンピューティングが関与する場合には適していません。
インライン関数は、キーワード inline が関数名の前に配置される点を除いて、通常の関数と似ています。インライン関数は次の構文で作成されます。
inline function_name () { //function definition }
インライン関数を実装するプログラムを書いてみましょう。
inline int add(int a, int b) //inline function declaration { return(a+b); } int main() { int c=add(10,20); printf("Addition:%d\n",c); getch(); }
出力:
Addition: 30
上記のプログラムは、2 つの数値を加算するためのインライン関数の使用を示しています。ご覧のとおり、余分な行を記述せずに、インライン関数内でのみ 2 つの数値の加算を返しています。関数呼び出し中に、加算を実行する必要がある値を渡しただけです。
まとめ
- 関数はミニプログラムまたはサブプログラムです。
- 関数はプログラムをモジュール化するために使用されます。
- 関数にはライブラリ関数とユーザー定義関数の XNUMX 種類があります。
- 関数は、宣言、関数本体、関数呼び出し部分で構成されます。
- 関数宣言と本体は必須です。
- 関数呼び出しはプログラム内でオプションとして使用できます。
- C プログラムには少なくとも XNUMX つの関数があります。 それがメイン関数 () です。
- 各関数には、名前、戻り値のデータ型、または void のパラメータがあります。
- 各関数は C プログラム内で定義および宣言する必要があります。
- 普通ということを心に留めておいてください C 関数内の変数 関数呼び出しを終了するとすぐに破棄されます。
- 関数に渡される引数は、アドレスによって値渡しなしで渡されるため、変更されません。
- 変数スコープは、プログラム内の変数の可視性と呼ばれます。
- にはグローバル変数とローカル変数があります Cプログラミング