C言語入門|関数でプログラムを整理する

「うーん……やっぱりゴチャゴチャしてきたなぁ……」

配列や構造体を使えるようになって、
C言語でできることは一気に増えました。
データの整理は、かなり上手くなったはずです。

それなのに――
プログラム全体を眺めてみると、
main関数の中がどんどん長くなっている
そんな状態になっていませんか?

これは、とても自然な壁です。

データは整理できた。でも処理が整理できない

これまでの章では、

  • 構造体で「ひとかたまりのデータ」を整理し
  • 配列で「たくさんのデータ」を並べて扱えるように

なりました。

しかし、いざ本格的なプログラムを書こうとすると、
今度はこんな悩みが出てきます。

  • main関数が何百行にもなってしまう。
  • どこで何をしているのか分からない。
  • 修正したい場所を探すだけで疲れる。

これは、処理が整理されていない ことが原因です。

main関数が肥大化すると何が起こる?

main関数の中に、すべての処理を書き並べていくと、
次のような問題が起こります。

問題点何が困るか
全体像が見えないどんな順番で処理しているのか分かりにくい。
修正が怖いどこを直せばいいのか判断できない。
バグが増える関係ない部分まで壊してしまう。

特に、処理の流れを頭に入れながら
細かいコードを書くのは、かなり大変です。

この状態が続くと、
「自分で書いたプログラムなのに理解できない」
という事態になりかねません。

次に立ち向かう壁は「処理の複雑さ」

ここまで来た皆さんが、
次にぶつかる大きな壁。

それが、

処理の複雑性

です。

  • データは整理できた
  • でも、処理が一か所に集まりすぎている

この問題を解決するために、
C言語には強力な仕組みが用意されています。

それが、関数(function) です。

関数とは何か

関数とは、

複数の文をまとめて
1つの処理として名前を付けたもの

です。

とてもシンプルですね。

言い換えると、
処理のかたまりを部品として切り出す仕組み
とも言えます。

処理を部品に分けるという考え方

たとえば、main関数の中に
次のような処理が並んでいたとします。

  • ユーザー入力を受け取る。
  • 入力内容を計算する。
  • 結果を表示する。

これらを全部 main関数に書くと、
中身はどんどん長くなっていきます。

そこで、それぞれを
役割ごとに関数に分ける のです。

部品化する前と後の違い

部品化する前

main関数の中に、

  • 入力処理
  • 計算処理
  • 表示処理

がすべて混ざって書かれている状態です。

読む人は、
「今どの処理をしているのか」
を常に意識しなければなりません。

部品化した後

main関数は、こんな役割になります。

  • 入力担当の関数を呼ぶ
  • 計算担当の関数を呼ぶ
  • 表示担当の関数を呼ぶ

中身の細かい処理は、
それぞれの関数に任せます。

すると、main関数は
プログラム全体の流れを示す設計図
のような存在になります。

関数を使うメリット

関数を使ってプログラムを整理すると、
次のようなメリットがあります。

メリット何が良くなる?
見通しがよくなる処理の流れを一目で把握できる。
修正しやすい問題のある処理だけを直せる。
再利用できる同じ処理を何度も書かなくてよい。

特に、
「ここだけ直したい」
という場面で威力を発揮します。

関数は仕事を分担する仕組み

関数のイメージとして、
こんな例えがよく使われます。

  • main関数:上司
  • そのほかの関数:部下

上司(main関数)は、

  • 「入力処理をお願い」
  • 「計算をお願い」
  • 「結果を表示して」

と指示を出します。

部下(関数)は、
自分の担当作業だけを集中して行います。

とても分かりやすい関係ですね。

この章で学ぶこと

この章では、

  • 関数の基本的な書き方
  • 関数の呼び出し方
  • 処理をどう分割するとよいか

といった内容を、
実際のコードを使いながら 学んでいきます。

配列や構造体と組み合わせることで、
C言語のプログラムは一気に
「読みやすく・直しやすく」 なります。

まとめ:関数は整理整頓のための道具

ここまでの内容を、ひと言でまとめると――

関数は、プログラムの整理整頓をするための道具

です。

データを整理するために構造体や配列があったように、
処理を整理するために関数があります。

この考え方を身につけると、
「プログラムを書くのがつらい」
から
「プログラムを組み立てるのが楽しい」
へと変わっていきます。

さあ、次は
関数の書き方と使い方
ひとつずつ見ていきましょう 😊