機能の簡単な理解

関数

関数を使用してコードの可読性と実行を改善する

関数とは

関数は関数であり、各関数が特定のタスクを実行するために使用するプログラムコードの個別の単位であり、関数の名前は関数の名前です。

通常、入力パラメータと戻り値があります

機能の分類

関数はライブラリ関数とカスタム関数に分けられます(カスタム関数に焦点を当てます)

ライブラリ関数

C言語は、直接使用できる機能を提供します

移植性をサポートし、プログラムの効率を向上させるために、一連の同様のライブラリ関数がC言語の基本ライブラリで提供されます。これは、プログラマーがソフトウェアを開発するのに便利です。
共通のprintf関数とscanf関数を含むのがIO関数です。

ライブラリ関数の使用にはヘッダーファイルがあります


単純なライブラリ関数strcpyの例を次に示します。

char* strcpy(char* destination, const char* source);

検索で取得したstrcpy関数の使い方です。この関数で検索できるヘッダーファイルは<string.h>です。


#include<stdio.h>
#include<string.h>//头文件
int main()
{
    
    
    char arr[20] = "abc";
    char b[20] = {
    
     0 };

    strcpy(b, arr);//括号里面的叫做参数
    //这个函数的返回值是char类型
    printf("%s", b);

    return 0;
}

ライブラリ機能については、Webサイトを検索してください。

クエリツールの使用方法を学ぶ必要があります:
1.MSDN(Microsoft Developer Network)
2.www.cplusplus.com
3.http://en.cppreference.com(英語版)
4.http://zh.cppreference.com (中国語版)バージョン)

カスタム関数

自作関数

ライブラリ関数と同様に、カスタム関数には関数名、戻り値の型、および関数パラメーターがあります。

//定义函数
type name(parameter)
{
    
    
    
}
//定义函数可以没有括号内的参数,但是返回值类型与函数名以及函数名后面的括号不能少

関数名

後で呼び出す関数の名前を指定します

戻り値のタイプ

戻り値があります
#include<stdio.h>
int Add()
{
    
    
    return 9;
}//这是一个自定义的函数,函数名叫做Add,返回值类型是int型的
//return 后面的值就是返回的内容,这个值也可以是表达式
int main()
{
    
    
    int x = 0;
    x = Add();//函数返回值会被赋给x,但是要求x的类型与函数返回类型相同
    printf("%d",x);//9
    return 0;
}
戻り値なし

戻り値のない関数もあるため、戻り値の位置に入力された型は無効である必要があります。つまり、次のようになります。

void func()
{
    
    
    //这中情况下可以有return,也可以没有return,但是都不会返回到主函数里面
}

関数パラメーター

実際のパラメータ

関数に渡される実際のパラメーターは、実際のパラメーターと呼ばれます。
実際のパラメーターは、定数、変数、式、関数など
です。実際のパラメーターの値のタイプに関係なく、この値は仮パラメーターに渡されます。

正式なパラメータ

正式なパラメーターは、関数名の後の括弧内の変数を参照します。これは、正式なパラメーターは、呼び出される関数のプロセスでのみインスタンス化(割り当てられたメモリー単位)されるため、正式なパラメーターと呼ばれます。関数呼び出しが完了すると、正式なパラメーターは自動的に破棄されます。
したがって、仮パラメータは関数内でのみ有効です。

 #include<stdio.h>
int Add(int c,int d)//被调函数
    //被调函数里面的参数叫做形参
{
    
    
    return c+d;
}
int main()
{
    
    
    int a = 20;
    int b = 30;
    int x = 0;
    x = Add(a,b);//主调函数
    //这里Add函数括号里就是函数的参数
    //主调函数里面的参数叫做实参
    
    printf("%d",x);//50
    return 0;
}

正式なパラメータに実際のパラメータと同じ名前を付けることはできますか?
はい、正式なパラメータと実際のパラメータは異なるメモリユニットで機能するため、スコープは異なり、相互に影響を与えることはありません。

関数の宣言と定義

関数定義:関数関数の確立を指します。つまり、関数ヘッダーで始まり、関数本体で終わるコードセグメントです。

関数宣言
は、関数が何であるか、パラメーターが何であるか、そして戻り型が何であるかをコンパイラーに伝えます。しかし、それが存在するかどうかは、関数宣言によって決定されません。
関数の宣言は、通常、関数を使用する前に表示されます。使用前に宣言を満たすため。
関数宣言は通常、ヘッダーファイルに配置されます。

関数がメイン関数の前に定義されている
場合は、宣言なしで使用できます関数がメイン関数の後に定義されている場合は、関数を呼び出す前に関数を宣言する必要があります

関数呼び出しのためのデータ受け渡し

関数を呼び出すには2つの方法があります

値で呼び出す

実パラメータの値を仮パラメータに渡します。仮パラメータは、関数の呼び出し開始時にスペースを割り当て、実パラメータの値を格納します。この場合、仮パラメータと実パラメータの値は同じであり、異なるアドレス。呼び出し元の関数の仮パラメーターの値を変更しても、実際のパラメーターには影響しません。

#include<stdio.h>
void Func(int x,)
{
    
    
    x++;
    printf("%d",x);//11
}
int main()
{
    
    
    int a = 10;
    Add(a);
    printf("%d",a);//10
    return 0;
}
住所による電話

参照による呼び出しは、関数の外部で作成された変数のメモリアドレスを関数パラメーターに渡すことによって関数を呼び出す方法です。
パラメータを渡すこの方法により、関数は関数の外部の変数との実際の接続を確立できます。つまり、関数は関数の外部の変数を直接操作できます。

#include<stdio.h>
Func(int *pa)
{
    
    
*pa = *pa + 1;    
}
int main()
{
    
    
    int a = 10;
    Func(&a);
    printf("%d",a);//11
    return 0;
}//把变量a的地址存放在指针变量pa里面,后面*pa的操作就是在改变a的值
関数の使用に関する演習

1.数値が素数であるかどうかを判断する関数を記述します。

//是素数返回1;
//不是素数返回0;
#include<stdio.h>

int is_prime(int n)
{
    
    
	int j = 0;
	for (j = 2; j < n; j++)
	{
    
    
		if (n % j == 0)
		{
    
    
			return 0;//直接返回,程序直接结束
		}
}
	return 1;
}

int main()
{
    
    
	int a = 0;
	int b = 0;
	for (a = 100; a <= 200; a++)
	{
    
    
		if (is_prime(a))
            /*返回0就不打印,返回1就打印*/
		{
    
    
		printf("%d", a);
		}
	}
	return 0;
}

2.1年がうるう年かどうかを判断する関数を記述します。

#include<stdio.h>

int is_leap_year(int b)
{
    
    
if ((b % 4 == 0 && b % 100 != 0) || b % 400 == 0)
		return 1;
	else
		return 0;
}

int main()
{
    
    
	int a = 0;
	for (a = 1000; a <= 2000; a++)
	{
    
    //判断
		if (is_leap_year(a))
		{
    
    
			printf("%d  ", a);
		}
		
	}
    return 0;
}

3.整数でソートされた配列の二分探索を実装する関数を記述します

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int binary_serach(int arr[], int k,int sz) 
{
    
    

	int left = 0;
	int right = sz -1;//最右边的下标是数组元素个数-1

	while (left <= right)
	{
    
    
		int mid = (left + right) / 2;
	
		if (arr[mid] > k)
		{
    
    
			right = mid - 1;
		}
		else if (arr[mid] < k)
		{
    
    
			left = mid + 1;
		}
		else
		{
    
    
			return mid;
		}
	}
	return -1;//找不到了
}


//如果找到了返回下标,找不到返回-1;
int main()
{
    
    
	int arr[10] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int sz = sizeof(arr) / sizeof(arr[0]);//可以计算数组元素个数

	int ret = binary_serach(arr,k,sz);
	//数组arr再传参的时候传递的是首元素的地址	--->接收的是指针,大小是4

	if (-1 == ret)
	{
    
    
		printf("找不到\n");
	}
	else
	{
    
    
		printf("找到了\n");
		printf("下标是%d", ret);
	}
	return 0;
}

ネストされた呼び出しと関数の連鎖アクセス

ネストされた呼び出し
#include <stdio.h>
void new_line()
{
    
    
 printf("hehe\n");
}
void three_line()
{
    
    
    int i = 0;
 for(i=0; i<3; i++)
   {
    
    
        new_line();//早这个函数中调用new_line函数
   }
}
int main()
{
    
    
 three_line();
 return 0;
}

関数はネストされたものと呼ぶことができますが、ネストされた定義は呼び出すことができません

連鎖アクセス

ある関数の戻り値を別の関数の引数として使用します。

int main()
{
    
    
    printf("%d", printf("%d", printf("%d", 43)));
    //注:printf函数的返回值是打印在屏幕上字符的个数
    //所以结果是4321
    return 0;
}

関数の再帰

再帰とは何ですか?プログラムがそれ自体を呼び出すプログラミング手法は、再帰と呼ばれます。
アルゴリズムとしての再帰は、プログラミング言語で広く使用されています。
定義または説明のプロシージャまたは関数には、それ自体を直接または間接的に呼び出す方法があります。これは通常、大きくて複雑な問題を、解決する元の問題と同様の小さな問題に変換します。
再帰的な戦略のみプログラムのコード量を大幅に削減する、問題解決プロセスに必要な繰り返し計算を説明するために使用されます。
再帰についての主な考え方は次のとおりです。大きなものを小さく
する再帰に必要な2つの条件
制限があり、制限が満たされると、再帰は続行されません。
再帰呼び出しを行うたびに、この制限にどんどん近づいていきます。

関数再帰に関する演習

整数値(符号なし)を取り、そのビットを順番に出力します。例:入力:1234、出力1 234。


#include <stdio.h>
void print(int n)
{
    
    
 if(n>9)
 {
    
    
 print(n/10);
 }
 printf("%d ", n%10);
}
int main()
{
    
    
 int num = 1234;
 print(num);
 return 0;
}

nの階乗を見つける



#include<stdio.h>
int func(int n)
{
    
    
    if (n == 1)
        return 1;
    else
        return n * func(n - 1);
}

int main()
{
    
    

    int n = 0;
    scanf("%d", &n);
    int ret = 0;
    ret  = func(n);
    printf("%d", ret);

    return 0;
}

strlen関数を再帰的に実装する



#include<stdio.h>

int my_strlen(char *s)
{
    
    
    if (*s == '\0')
        return 0;
    else
        return 1 + my_strlen(s+1);
}
int main()
{
    
    
    char arr[] = "abcd";
    int len = 0;
    len = my_strlen(arr);
    printf("%d", len);

    return 0;
}

フィボナッチ数を計算する



#include<stdio.h>

int fib(int n)
{
    
    
    if (n <= 2)
        return 1;
    else
        return fib(n - 1) + fib(n - 2);
}
int main()
{
    
    

    int n = 0;
    int num = 0;
    scanf("%d", &n);
    num = fib(n);
    printf("%d", num);
    return 0;
}

それ以外
の場合は1+my_strlen(s + 1);を返します。
}
int main()
{ char arr [] =“ abcd”; int len = 0; len = my_strlen(arr); printf( "%d"、len);



return 0;

}


计算斐波那契数

```c


#include<stdio.h>

int fib(int n)
{
    if (n <= 2)
        return 1;
    else
        return fib(n - 1) + fib(n - 2);
}
int main()
{

    int n = 0;
    int num = 0;
    scanf("%d", &n);
    num = fib(n);
    printf("%d", num);
    return 0;
}

おすすめ

転載: blog.csdn.net/cainiaochufa2021/article/details/121214674