# 補足資料（１．５回目）　C言語の関数

# 🧩 補足資料：C言語の関数の基本

## 🧠 関数とは？

C言語の****関数****は、処理をひとまとめにして何度も呼び出せる仕組みです。  
プログラムの****再利用性****・****可読性****を高めるために使います。

```c
#include <stdio.h>

int main() {
    hello(); // 関数呼び出し
    return 0;
}

// 関数定義
void hello() {
    printf("Hello, world!\\n");
}
```

---

## 🔹 宣言と定義の違い

<table id="bkmrk-%E5%90%8D%E7%A7%B0%E5%BD%B9%E5%89%B2%E6%9B%B8%E3%81%8F%E5%A0%B4%E6%89%80%E4%BE%8B%E9%96%A2%E6%95%B0%E5%AE%A3%E8%A8%80%EF%BC%88%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97"><colgroup><col></col><col></col><col></col><col></col></colgroup><tbody><tr><th>名称

</th><th>役割

</th><th>書く場所

</th><th>例

</th></tr><tr><td>関数宣言（プロトタイプ宣言）

</td><td>関数があることをコンパイラに知らせる

</td><td>mainより上

</td><td>`<span class="editor-theme-code">int add(int a, int b);</span>`

</td></tr><tr><td>関数定義

</td><td>実際の処理内容を書く

</td><td>mainより下でもOK

</td><td>`<span class="editor-theme-code">int add(int a, int b) { return a + b; }</span>`

</td></tr></tbody></table>

<span style="white-space: pre-wrap;">💡 </span>****ポイント****

- 宣言と定義を分けることで、****関数を別ファイルに分割****できる。
- 宣言だけをヘッダファイル（`<span class="editor-theme-code">.h</span>`）に書くのが一般的。

---

## 🔸 引数と仮引数の違い

<table id="bkmrk-%E7%A8%AE%E9%A1%9E%E6%84%8F%E5%91%B3%E4%BE%8B%E4%BB%AE%E5%BC%95%E6%95%B0%EF%BC%88parameter%EF%BC%89%E9%96%A2"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>種類

</th><th>意味

</th><th>例

</th></tr><tr><td>仮引数（parameter）

</td><td>関数の受け取り側の変数

</td><td>`<span class="editor-theme-code">int add(int a, int b)</span>`

<span style="white-space: pre-wrap;"> の a,b</span>

</td></tr><tr><td>実引数（argument）

</td><td>関数を呼び出すときに渡す値

</td><td>`<span class="editor-theme-code">add(3, 5)</span>`

<span style="white-space: pre-wrap;"> の 3,5</span>

</td></tr></tbody></table>

<span style="white-space: pre-wrap;">🧭 </span>****イメージ図****

```
int add(int a, int b) ← 仮引数
        ↑      ↑
        |      |
   add(3, 5); ← 実引数
```

---

## 🧷 ポインタ渡し

関数に変数の\*\*アドレス（場所）\*\*を渡すことで、呼び出し元の値を直接変更できます。

```c
#include <stdio.h>

void addOne(int* x) {
    *x = *x + 1;
}

int main() {
    int num = 10;
    addOne(&num); // 変数のアドレスを渡す
    printf("%d\\n", num); // → 11
}
```

<span style="white-space: pre-wrap;">💬 </span>****ポイント****

- `<span class="editor-theme-code">int* x</span>`<span style="white-space: pre-wrap;"> は「int型のポインタ」</span>
- `<span class="editor-theme-code">*x</span>`<span style="white-space: pre-wrap;"> は「ポインタの指す実際の値」</span>
- 呼び出し元の変数を直接書き換えることができる

---

## ⚙️ 戻り値・void・手続きと関数

C言語の関数には、****値を返す関数****と\*\*値を返さない手続き（void関数）\*\*の2種類があります。

```c
// 値を返す関数
int add(int a, int b) {
    return a + b;
}

// 値を返さない（void関数）
void printHello() {
    printf("Hello!\\n");
}
```

<span style="white-space: pre-wrap;">💡 </span>****return文****

- 関数の実行を終了し、呼び出し元に値を返す。
- void関数では return を省略可能。

---

## 🧾 C言語の関数まとめ

<table id="bkmrk-%E5%88%86%E9%A1%9E%E8%AA%AC%E6%98%8E%E4%BE%8B%E5%AE%A3%E8%A8%80%EF%BC%88%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97%EF%BC%89%E9%96%A2%E6%95%B0%E3%81%AE%E5%AD%98%E5%9C%A8"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>分類

</th><th>説明

</th><th>例

</th></tr><tr><td>宣言（プロトタイプ）

</td><td>関数の存在を知らせる

</td><td>`<span class="editor-theme-code">int add(int a, int b);</span>`

</td></tr><tr><td>定義

</td><td>実際の処理を書く

</td><td>`<span class="editor-theme-code">{ return a + b; }</span>`

</td></tr><tr><td>実引数／仮引数

</td><td>呼び出す値と受け取る変数

</td><td>`<span class="editor-theme-code">add(3, 5)</span>`

／

`<span class="editor-theme-code">int add(int a, int b)</span>`

</td></tr><tr><td>値渡し

</td><td>値のコピーを渡す

</td><td>元の変数は変わらない

</td></tr><tr><td>ポインタ渡し

</td><td>アドレスを渡す

</td><td>元の変数が変わる

</td></tr><tr><td>戻り値

</td><td>処理結果を返す

</td><td>`<span class="editor-theme-code">return</span>`

を使う

</td></tr><tr><td>void関数

</td><td>戻り値なしの手続き

</td><td>画面出力など

</td></tr></tbody></table>

---

## 🧠 まとめ

- 宣言＝関数の存在を伝える
- 定義＝関数の中身を書く
- 引数はコピーか参照かで挙動が変わる
- ポインタ渡しはC言語の“参照渡し”のようなもの
- 戻り値の有無で「手続き」と「関数」を区別できる

### 練習問題！

## <span style="white-space: pre-wrap;">🧮 </span>****第1問：平均点と評価を返す関数****

3科目の点数を入力し、****平均点を返す関数****と、  
その平均に応じて****評価（A〜D）を返す関数****を作れ。

```c
float getAverage(int a, int b, int c);
char getRank(float avg);
```

<span style="white-space: pre-wrap;">📘 </span>****仕様****

- `<span class="editor-theme-code">getAverage()</span>`<span style="white-space: pre-wrap;"> … 平均値を計算して返す</span>
- `<span class="editor-theme-code">getRank()</span>`<span style="white-space: pre-wrap;"> … 80点以上→A、60点以上→B、40点以上→C、それ以下→D</span>

<span style="white-space: pre-wrap;">💡 </span>**例**  
<span style="white-space: pre-wrap;">入力: </span>`<span class="editor-theme-code">80 70 90</span>`  
出力:

```
平均点 = 80.0
評価 = A
```

---

## <span style="white-space: pre-wrap;">🔄 </span>****第2問：配列の最大値と最小値を求める関数****

配列とその要素数を受け取り、最大値と最小値を****ポインタ経由で返す関数****を作れ。

```c
void getMinMax(int arr[], int n, int* min, int* max);
```

<span style="white-space: pre-wrap;">📘 </span>****仕様****

- ループで配列を走査し、`<span class="editor-theme-code">*min</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">*max</span>`<span style="white-space: pre-wrap;"> に代入</span>
- mainで表示する

<span style="white-space: pre-wrap;">💡 </span>**例**  
<span style="white-space: pre-wrap;">入力: </span>`<span class="editor-theme-code">{3, 9, 2, 5}</span>`  
<span style="white-space: pre-wrap;">出力: </span>`<span class="editor-theme-code">最大値=9, 最小値=2</span>`

### 💡 ヒント：ポインタで関数内の変数を書き換える例

```cpp
#include <iostream>
using namespace std;

void AddOne(int* x) {
    *x = *x + 1;  // *xを通して実際の変数の中身を変更する
}

int main() {
    int num = 10;
    AddOne(&num);  // numのアドレスを渡す
    cout << "num = " << num << endl;  // 出力：num = 11
}
```

<span style="white-space: pre-wrap;">👉 </span>`<span class="editor-theme-code">*x</span>`<span style="white-space: pre-wrap;"> はアドレス先の実体、</span>`<span class="editor-theme-code">&num</span>`<span style="white-space: pre-wrap;"> は「numの住所」です。</span>

---

## <span style="white-space: pre-wrap;">🔁 </span>****第3問：配列の平均値より大きい値を表示****

整数配列と要素数を引数に受け取り、  
****平均値を求めて、その平均より大きい要素だけを出力****する関数を作れ。

```c
void printAboveAverage(int arr[], int n);
```

<span style="white-space: pre-wrap;">📘 </span>****仕様****

- 関数内で平均値を計算
- 平均より大きい要素をすべて表示

<span style="white-space: pre-wrap;">💡 </span>**例**  
<span style="white-space: pre-wrap;">入力: </span>`<span class="editor-theme-code">{60, 80, 70, 90}</span>`  
出力:

```
平均値: 75.0
平均より大きい値: 80 90
```

---

## <span style="white-space: pre-wrap;">🧷 </span>****第4問：文字列中の特定文字を数える関数****

文字列と文字を受け取り、その文字がいくつ含まれているか数える関数を作れ。

```c
int countChar(char str[], char target);
```

または

```cpp
int CountChar(const string& str, char target);
```

<span style="white-space: pre-wrap;">📘 </span>****仕様****

- `<span class="editor-theme-code">for</span>`<span style="white-space: pre-wrap;">文で </span>`<span class="editor-theme-code">str[i] != '\\0'</span>`<span style="white-space: pre-wrap;"> まで走査</span>
- 一致したらカウントを増やす

<span style="white-space: pre-wrap;">💡 </span>**例**  
<span style="white-space: pre-wrap;">入力: </span>`<span class="editor-theme-code">"banana"</span>`<span style="white-space: pre-wrap;">, 文字 </span>`<span class="editor-theme-code">'a'</span>`  
<span style="white-space: pre-wrap;">出力: </span>`<span class="editor-theme-code">文字 'a' は 3 個含まれています</span>`

### 💡 ヒント：`<span class="editor-theme-code">std::string</span>`を1文字ずつ調べるには？

```cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    string word = "banana";
    for (int i = 0; i < word.size(); i++) {
        cout << word[i] << " ";  // 1文字ずつ出力
    }
    cout << endl;
}
```

<span style="white-space: pre-wrap;">👉 </span>`<span class="editor-theme-code">string</span>`<span style="white-space: pre-wrap;"> は </span>`<span class="editor-theme-code">[]</span>`<span style="white-space: pre-wrap;"> で1文字ずつアクセスできる。</span>  
<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">word.size()</span>`<span style="white-space: pre-wrap;"> で文字数（終端の'\\0'を除く）を取得できる。</span>

---

## <span style="white-space: pre-wrap;">🧩 </span>****第5問：関数を組み合わせて統計出力****

以下の関数を組み合わせて、5人の点数から平均・最高・最低を出力するプログラムを作れ。

```c
float getAverage(int arr[], int n);
int getMax(int arr[], int n);
int getMin(int arr[], int n);
```

<span style="white-space: pre-wrap;">📘 </span>****仕様****

- mainで配列を作り、関数を順に呼び出す
- 結果を整形して表示

<span style="white-space: pre-wrap;">💡 </span>**例**  
<span style="white-space: pre-wrap;">入力: </span>`<span class="editor-theme-code">{70, 85, 60, 90, 75}</span>`  
出力:

```
平均点: 76.0
最高点: 90
最低点: 60
```