関数
1. 機能の概念
- 関数は、特定のジョブを実行するためにパッケージ化された独立したプログラム モジュールです。関数の種類には、ライブラリ関数と自作関数があります。
- ライブラリ関数には、scanf()、printf() 関数などが含まれます。これら 2 つの関数は、stdio.h 関数ライブラリに含まれています。
- 自作関数とは、トピックの要件に従って設計し、その関数をカプセル化し、使用時に直接呼び出す関数です。主に自作関数の構造と使い方を学びます。
2. 自作関数の定義と適用
1. カスタム関数定義の一般的な形式は次のとおりです。
函数类型 函数名称(形式参数) \\函数首部\\
{
函数实现过程 \\函数体\\
return (需要返回的值);
}
- 関数の型には、double、char、int などの C 言語の任意のデータ型を指定できます。
- 関数名は識別子の一種であり、命名規則は識別子と同じです。関数名の後にless()を付けることはできません。
- 関数実装処理は、関数が実行する必要があるコードであり、関数の主体となるため、{}で囲む必要があります。
- 戻り値がある場合は、関数本体の return ステートメントを通じて返されます。また、戻り値は、定義した関数の型と一致している必要があります。
たとえば、1から計算する必要があります。+2!+3!+…+ん!
この問題が関数法を使用しない場合は非常に簡単ですが、プログラム内で 2 つの異なる値の乗算係数の合計を計算する必要がある場合、乗算係数を計算するために 2 つの for ループを入力する必要があります。 2 つの数値をそれぞれ計算し、最後に変数を使用してそれを保存し、最後に合計して結果を取得します。
関数メソッドを使用すると、乗数を計算する関数を設計し、最終的にその関数を参照して計算することができます。次に、関数を参照して計算します。
関数:
int fact(int n)
{
int a=1;
for(int i=1;i<=n;i++)
{
a=a*i;
}
return a;
}
最終結果は変数 a に保存され、最終的に return ステートメントを通じて返されます。a は int 型で、戻り値も int 型で、1 対 1 に対応します。
Return は C 言語のキーワードで、処理結果を返す関数内でのみ使用できます。
この関数はnの倍率を計算するための自作関数です。ただし、直接使用することはできず、main 関数で参照する必要があります。
もちろん、関数には戻り値のない関数もありますが、int やその他のデータ型の関数とは異なり、そのような関数のプレフィックスは viod であり、戻り値の型がないことを意味します。
関数:
void fact(int n)
{
int a=1;
for(int i;i<=n;i++)
a=a*i;
}
}
void は C 言語のキーワードで、空の型、または型がないことを意味し、多くの場合戻り値はありません。
3. 自作関数の呼び出し方法
1. 自作関数とmain関数が同じcppファイル内にあり、自作関数がmain関数の後にある場合、宣言した変数と同じ宣言形式で関数を宣言する必要があります。
#include <stdio.h>
int sum(int n); //调用函数//
int main()
{
intc x,y;
scanf("%d %d",&x,&y);
int result1=sum(x); //当n=x时的阶乘//
int result2=sum(y); //当n=y时的阶乘//
int result3=result1+result2;
printf("%d",result3);
}
int sum(int n){
//函数部分//
int i,a=1;
for(i=1; i<=n; i++){
a=a*i;
}
return a;
}
2. 自作関数と main 関数が同じ cpp ファイル内にあり、自作関数が main 関数より前にある場合、関数の宣言は不要です。
#include <stdio.h>
int sum(int n){
int i,a=1;
for(i=1; i<=n; i++){
a=a*i;
}
return a;
}
int main()
{
int x,y;
scanf("%d %d",&x,&y);
int result1=sum(x); //当n=x时的阶乘//
int result2=sum(y); //当n=y时的阶乘//
int result3=result1+result2;
printf("%d",result3);
}
3. 自作関数とメイン関数が同じ cpp ファイル内にない場合は、2 つの関数を同じフォルダーに配置し、#include "関数名.cpp" を使用してカスタム関数を宣言する必要があります。関数名は cpp の形式と一致しています。
#include <stdio.h>
#include "sum.cpp>
int sum(int n); //调用函数//
int main()
{
int x,y;
scanf("%d %d",&x,&y);
int result1=sum(x); //当n=x时的阶乘//
int result2=sum(y); //当n=y时的阶乘//
int result3=result1+result2;
printf("%d",result3);
}
自作関数には戻り値の型がないため、void 型の関数を参照することもできます。
- たとえば、1!+2!+3!+…+n! を見つけます。
関数:
#include <stdio.h>
void sum(int n); //调用函数//
int main()
{
int x;
scanf("%d",&x);
sum(x);
}
void sum(int n){
//函数部分//
int i,a=1;
for(i=1; i<=n; i++){
a=i*a;
}
printf("%d",a);
}
関数に戻り値の型がない場合、return を使用して a の値を返すことができないため、次の処理は自作関数で実装する必要があります。このとき、sum 関数はすでに実装されています
。には値が含まれているため、関数内で直接 sum を使用するだけで、値を取得できます。関数の戻り値の型が void として定義されると、その値を受け取ることができなくなります。したがって、この関数を直接使用してください。
##4. 実パラメータと仮パラメータ、グローバル変数とローカル変数。
###1. 実パラメータと仮パラメータ
1. 仮パラメータは、関数またはプロシージャを定義するときに名前が付けられるパラメータです。平たく言えば、マークです。実パラメータは、関数またはプロシージャが実行中に呼び出されたときに関数またはプロシージャに渡されるパラメータです。平たく言えば、実際の値です。パラメータは、ユーザーごとに変化する変数です。
例えば:
私は中学校で sin(x) 関数を学びました (x は仮パラメータ)。正弦値 1 を求める必要がある場合は、sin(1) (1 が実際のパラメータ) を使用します。4. 仮パラメータと実パラメータの関係: 両者は呼び出し時に結合されます。通常、実パラメータは値を仮パラメータに渡します。仮パラメータが削除された後、関数の処理操作が実行され、その後、いくつかの値が渡されます。パラメーターまたは関数シンボルを介して呼び出し元に返される場合があります。
#include <stdio.h>
int sum(int n){
//这里的int n就是形式参数//
int i,a=1;
for(i=1; i<=n; i++){
a=a*i;
}
return a;
}
int main()
{
int x,y;
scanf("%d %d",&x,&y);
int result1=sum(x); //当n=x时的阶乘// //这里的x就是实际参数//
int result2=sum(y); //当n=y时的阶乘//
int result3=result1+result2;
printf("%d",result3);
}
2. ローカル変数とグローバル変数
1. ローカル変数
関数内で定義された変数はローカル変数と呼ばれ、その有効範囲は関数内に限定され、関数から出た後は無効になります。
int f1(int a){
int b,c; //a,b,c仅在函数f1()内有效
return a+b+c;
}
int main(){
int m,n; //m,n仅在函数main()内有效
return 0;
}
- いくつかの点に注意してください。
-
- main関数内で定義した変数もローカル変数なのでmain関数内でのみ使用可能ですが、同時に他の関数内で定義した変数をmain関数内で使用することはできません。main 関数も関数であり、他の関数と同等のステータスを持ちます。
-
仮パラメータ変数と関数本体内で定義された変数はすべてローカル変数です。実パラメータから仮パラメータに値を転送するプロセスは、ローカル変数に値を割り当てるプロセスでもあります。
-
異なる関数で同じ変数名を使用すると、相互に干渉したり混乱を引き起こすことなく、異なるデータを表し、異なるメモリを割り当てることができます。
-
変数はステートメント ブロック内でも定義でき、そのスコープは現在のステートメント ブロックに限定されます。
2.グローバル変数
1. すべての関数の外で定義された変数はグローバル変数と呼ばれ、デフォルトでは、そのスコープはプログラム全体、つまり .c および .h ファイルを含むすべてのソース ファイルです。
int a, b; //全局变量
void func1(){
//TODO:
}
float x,y; //全局变量
int func2(){
//TODO:
}
int main(){
//TODO:
return 0;
}
- いくつかの点に注意してください。
a、b、x、y はすべて、関数の外部で定義されたグローバル変数です。C言語のコードは前から後ろへ順番に実行されますが、xとyは関数func1()の後に定義されているためfunc1()内では無効となり、aとbはソースプログラムの先頭で定義されているためfunc1(内では無効となります。 )、func2()、main() は有効です。
ローカル変数とグローバル変数の包括的な例:
#include <stdio.h>
int n = 10; //全局变量
void func1(){
int n = 20; //局部变量
printf("func1 n: %d\n", n);
}
void func2(int n){
printf("func2 n: %d\n", n);
}
void func3(){
printf("func3 n: %d\n", n);
}
int main(){
int n = 30; //局部变量
func1();
func2(n);
func3();
//代码块由{}包围
{
int n = 40; //局部变量
printf("block n: %d\n", n);
}
printf("main n: %d\n", n);
return 0;
}
5. 変数の格納カテゴリ
C 言語の変数には、自動クラスと静的クラスの 2 つの格納カテゴリがあります。
1. ローカル変数の格納カテゴリ:
(1)自動変数
int a; は auto int a; と同等です
auto 変数のストレージ クラスは動的です。一般に、コード ブロック内の変数はデフォルトでこの型であるため、プログラム内で変数を auto 型として明示的に宣言することはほとんどありません。
(2) 静的変数
static で宣言したものを静的ローカル変数と呼びます。この型は、ローカル変数だけでなくグローバル変数にも適用できます。静的ローカル変数の割り当てはコンパイル時に割り当てられ、プログラムの実行時に初期値を持ちます。関数が呼び出されるたびに再割り当てされることはなくなり、最後の関数呼び出しの終了時の値が保持されます。静的関数に初期値が割り当てられていない場合は、自動的に値 0 が割り当てられ、動的ローカル変数が割り当てられている場合は、システムが自動的に不確実な値を割り当てます。
例:
動的ローカル変数:
#include <stdio.h>
void test()
{
int num = 0;
num++;
printf("%d ", num);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
出力は 1 1 1 1 1 1 1 1 1 1 です。
関数が呼び出されるたびに num が 0 に等しいため、関数が呼び出されるたびに動的変数が num を 0 に再割り当てするためです。
#include <stdio.h>
void test()
{
static int num = 0;
num++;
printf("%d ", num);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
出力は 1 2 3 4 5 6 7 8 9 10 です。
静的変数は関数が呼び出されるたびに再割り当てされますが、最後の関数呼び出しの終了時の値が保持されるため、各関数の値は前回出力された値に 1 を加えたものになります。
再帰
1. 再帰とは何ですか?
再帰とは、関数が関数本体内でそれ自体を呼び出すことを指します。これは再帰呼び出しと呼ばれ、この種の関数は再帰関数と呼ばれます。
簡単に言うと、再帰とは、関数が直接または間接的にそれ自体を呼び出すことです。
例えば:
include <stdio.h>
void fact(int n);
int main()
{
fact(7);
return 0;
}
void fact(int n)
{
if(n==1){
printf("递归是我自己调用我自己\n");
}
else{
printf("%d\n",n);
fact(n-1);
}
}
実行結果は 7 6 5 4 3 2 です。再帰は、私が自分自身を呼び出すときです。
各呼び出しの後、関数はプログラムが終了する n=1 まで再度呼び出されます。これは再帰の最も単純な概念と使用法であり、自分自身を呼び出すことです。
編集長: 秦崇明
プロデューサー: マン・ティエンシン