関数とは何か〜

## 関数の概要

関数とは何か？
<font color="red">エンジニアが楽をする仕組み</font>
関数がなかったら困ることはたくさんあります。関数がないと、プログラムが複雑で長くなり、理解やメンテナスが難しくなってしまいます。
例えば、プログラム中で、「12+10」処理が何回も必要な場合、関数があれば、1回定義して呼び出すことで呼び出すだけで済みますが、関数がないとその計算式を何度も書くことになり、ミスや修正が難しくなります。

関数を使わなかった場合、
```c
#include <stdio.h>

int main() {
    int result1, result2, result3;

    // 最初の計算
    int a = 5, b = 3;
    result1 = a + b;
    printf("Result 1: %d\n", result1);

    // 次の計算
    int c = 10, d = 7;
    result2 = c + d;
    printf("Result 2: %d\n", result2);

    // さらに別の計算
    int e = 2, f = 8;
    result3 = e + f;
    printf("Result 3: %d\n", result3);

    return 0;
}
```
関数を使えば、2つの数を足す処理を1つの関数にまとめておき、必要な時にその関数を呼び出すだけで済みます。これにより、コードがシンプルで分かりやすくなり、計算方法を変更したいときも関数ないの1箇所を修正するだけで済みます。
```c
#include <stdio.h>

// 2つの数を足す関数を定義
int add(int x, int y) {
    return x + y;
}

int main() {
    int result1, result2, result3;

    // 最初の計算
    result1 = add(5, 3);
    printf("Result 1: %d\n", result1);

    // 次の計算
    result2 = add(10, 7);
    printf("Result 2: %d\n", result2);

    // さらに別の計算
    result3 = add(2, 8);
    printf("Result 3: %d\n", result3);

    return 0;
}
```

`add`という関数を一度定義すると、(a+b)の記述を3度もしなくて良くなります。また計算方法に変更があっても、関数ないのコードを1箇所を修正するだけで全体に適応されます。

```c
int add(int x, int y) {
    return x + y;
}
```
`int add`
`int`：関数が整数(int型)の値を返すことを示している。
`add`：関数の名前。`add`とつけられているため、2つの数を足す関係であることを示している。

`(int x, int y)`
この関数を指定する部分。関数に渡される値（入力）を受け取るための「変数」を宣言。
`int x`：関数の1つ目の引数。整数型(int型)の変数`x`に、関数を呼び出す時に渡された最初の数が代入されます。
`int y`：関数の2つ目の引数。整数型(int型)の変数`y`に関数を呼び出すときに渡された2番目の数を代入されます。
`{・・・}`
`{}`：この中に、関数の具体的な処理を書く部分を**関数本体**と呼びます。この`add`関数では、引数`x`と`y`の合計を計算して返す処理が書かれています。
`return x + y;`
`return`：この関数が計算結果を返すためのキーワードです。関数が計算を終えたら、`return`文で結果を返します。
`x + y`:`x`と`y`を足した合計です。この計算結果が、関数の呼び出し元に戻されます。
例えば、`add(5,3)`と呼び出した場合、この関数は`5 + 3`を計算して、その結果である`8`を返します。


:::note
・メモリにプログラムをロード
・プログラムをメモリからレジスタへ移動
・CPUでデータを処理
・ディスプレイとの連携
・キーボードとの出力連携
・Hello Worldと入力
:::
これらは一般的にハードや周辺装置を制御する機能はOSの役割

:::note
メモリ
:::
データを一時保存する記憶装置

:::note
レジスタ
:::
コンピューターのCPU（中央記憶装置）内部にある、演算やデータ処理を行い際に火つよな一時的なデータを格納するための記憶装置

:::note info
CPU
:::
Central Processing Uint
セントラル　プロセッシング　ユニット
コンピュータ全体の頭脳

## 関数とは？
値を入力すると、何かしらの処理をして、新しい結果を返す。

<font color="blue">printf関数</font>

①Hello Worldと書く（値を入力）
<font color="blue">②ハードや周辺装置と連携（何かしらの処理）</font>
③ディスプレイに出力(新しい結果を返す)

C言語は関数が集まって出来ている。
<font color="red">関数という小さな部品を組み合わせて</font>大きなプログラムを作っている。
pcを動かすには関数が必要になってくる。
入出力やハードや周辺装置など制御するための<font color="red">大切な機能が詰まっている</font>

## Hello Worldと出力
```c
#include <stdio.h>
int main(void) {
    printf("Hello World");
    return 0;
}
```

一つずつ解説していきます。

```c
#include <stdio.h>
```
関数を使うための、前設定。実は関数を使うためのプログラムは100行ぐらいある。
これらを楽にするための記述である。

include:取り組む　stdio:説明書

.h:ヘッダーファイル

**結論**：<font color="Red">標準的な入出力の機能が入ったファイル（関数）を取り組んでいる。</font>

:::note
標準入出力
:::
最低限の基本的な入出力の機能をまとめたもの

:::note
ライブラリー
:::
便利なプログラムの部品を集めたファイル
→本棚から関数を引っ張り出してくる
※ライブラリーにもたくさんの種類が存在

stdio.h:基本的な入出力機能
math.h:計算関係のファイル
　　　　　　　　　　　　　・・・など

#include　はコンパイルの一番最初に実行される

関数を実行するには、<font color="red">その前に関数の準備をする必要がある</font>
→#includeで準備します。

:::note
コンパイル
:::
ソースコードをコンピューターが直接実行できる言語に変換するプロセスを進めます。
つまり、コンピューターは直接理解できないので、変換する必要がある。

```c
int main(void) {
```
C言語では実行する関数の順番は決められていない。
関数の中では、上から順番に実行されるが、関数自体はどれでもいい。
→そうなると最初にどの順番で実行すれば良いのか困ってしまう、、、
mainという関数が<font color="red">1番最初に動作する</font>
（main関数がなかった場合、プログラムは動作しない）

```
int　        main      (void) {
メモリの容量　関数の名前   引数
具体的な処理(printfなど)
}
```

int:main関数をどのくらいのスペースを使うのかをintで表している。
<font color="red">4バイト（32ビット）文のメモリのスペースを使っている。</font>

:::note
1バイト＝8ビット　1バイトで256通り　（2の8乗）
ビット（bit）はコンピューターでの情報の最小単位
:::

main:関数の名前を宣言

(void):引数:外部から投入する値のこと
voidこの関数は引数を受け取らない