マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第7章 関数の学習

第1話 関数とは?

プログラミングの単位を関数と言います。

でもプログラミングの細胞のことをなぜ関数というのでしょうか。

数学で習った関数とは

y = f(x)

だったはずです。

そして、中学校や高校では次のような図を授業中に示されたはずです。


でもこの図だと今一歩わからないというところが本当のところではないでしょうか。

私の実家は鬼怒川温泉でペンションをやっていました。

2、3階がホテルの部屋で、

1階にはレストランとお饅頭の工場がありました。

お饅頭を生産する機械は上から皮の材料とあんこを入れてやると、

下からお饅頭が生産されて出てきました。

皮の材料とあんこを使ってお饅頭を作る機械でした。

関数の上の図もxが入力されて加工されてyとなって出て来るというようなイメージなのです。

y = f(x)と学んだはずです。

ところが、私が社員と呼んだ関数は入力のxも出力のyも出てきません。

なのになぜ関数と呼ぶのか、

不思議だったはずです。

新しいプロジェクトを作り、次のコードをコピペしてください。

プロジェクト名は関数とすることにしましょう。

#include<iostream>//インクルードファイルiostreamの読み込み

#include<conio.h>//while(!_kbhit());を使うためのお呪い

#include<string> //文字列変数を使えるようにするために組み込む

#include <iomanip> //setprecisionを使えるように組み込む

#include <cmath>//powなどを使うときに必要

#include <ctime>//time()(←現時刻発生する関数)を使うために必要

using namespace std;//coutを使うときに必要なお呪い

int f(int x);//関数です。←
プロトタイプ宣言と呼びます。

int main() {//私は社長だ。

  int y, x;

  x = 5;

  y = f(x);

  cout << "y = f(" << x << ") = " << y << endl;

  while (!_kbhit());//待機させるための命令

  return 0;//int main() を終わるためのお呪い

}

int f(int x) {

  int y=2 * x + 3;

  return(y);

}

実行画面

これなら数学で習った関数と同じですね。

左からxは入り加工されて13となって出てきたわけです。

そして、xを引数(いんすうとは読まず、ひきすうと読みます)と呼び、yを戻り値と言います。

ほとんどの入門書や入門サイトでは次のように書きます。
#include<iostream>//インクルードファイルiostreamの読み込み

#include<conio.h>//while(!_kbhit());を使うためのお呪い

#include<string> //文字列変数を使えるようにするために組み込む

#include <iomanip> //setprecisionを使えるように組み込む

#include <cmath>//powなどを使うときに必要

#include <ctime>//time()(←現時刻発生する関数)を使うために必要

using namespace std;//coutを使うときに必要なお呪い

int f(int x);//関数です。

int main() {//私は社長だ。

  cout << "y = f(5) = " << f(5) << endl;

  while (!_kbhit());//待機させるための命令

  return 0;//int main() を終わるためのお呪い

}

int f(int x) {

  return(2 * x + 3);

}

もちろん、間違ってはいません。

ただ、この書き方だとy=f(x)だとはイメージできないので、

私は最初の書き方を好みます。

int f(int x)は戻り値がint型で、引数もint型を意味しています。

void 魔方陣();//横と縦の2方向を持つ2次元for文体験

とはだいぶイメージが異なると思うでしょう。

ですが、voidの意味は空を意味しました。

ですから、イメージとしては

void 魔方陣(void);//横と縦の2方向を持つ2次元for文体験

なのです。つまり、引数も空、戻り値も空です。

空とは 0 に相当するものです。

数学では 0 の発見は大きな発見でした。

ですから、実はvoidも実は大変重要な概念なのす。

数学において 0 が極めて重要な働きをするのと同じです。

この説明を聞いて

void 魔方陣();//横と縦の2方向を持つ2次元for文体験

も関数ということが初めてイメージできるのではないでしょうか。

数学で学んだ関数は引数も戻り値もvoid型ではないわけです。

数学にとってもプログラミングにとっても関数はとても大切で重要な概念です。

そして、数学では理解できなかった人もプログラミングをやると関数が理解できます。

つまり、引数を加工してそれを戻り値として仕事を依頼した人に返すわけです。

まだ、

y = 2x + 3

という単純な関数ですが、

これからもっと複雑な関数を取り扱っていきます。

すっかり使いこなせば、学生時代に関数が苦手だった人も、

関数のイメージを掴み、とても重要なものであることを理解することでしょう。

実は、数学を理解するために重要な要素は、

『熟れる』ということだったのです。

最も言語の学習もその他の学習も実は『熟れる』ということは生命線とも言えるものなのです。

最初の説明を聞いてまったく理解できなかったとしても、

演習をやって『熟れる』と概念がすぽっと落ちてくるものなのです。

数学にコンプレックスを抱いている方は、

この機会を利用して数学を学び直すことを強くお勧めします。

本サイトのプログラミング学習は実は数学の学習でもあるのです。

さらに、コツを言うと数学の概念は幸運なことにすべて有意文字である漢字で書いてあります。

概念が理解できない方は、漢字を読むという習慣を身につけると大分変ってきます。

それとは、IT業界は正反対な社会であってカタカナを乱発してきました。

講義の最初に書きましたが、

入門書や入門サイトで一生懸命勉強してきたのに、

少しも頭に入らなかったが、

本サイトに出会って「初めてプログラミングが理解できた」人はたくさんいます。

他サイトや入門書籍が必要としないカタカナと長い英単語を乱発してきたことが原因です。

そして、プログラミング教育も明確に変わりつつあります。

カタカナをなるべく使わない、不要な長い英単語はつかわない、と変わってきたわけです。

(注)main() の前で関数の宣言を行うことをプロトタイプ宣言と呼びます。←2026年3月1日に加えました。

名称は覚えなくても理解できるように本サイトでは進めますが、

他のサイトや入門書などで専門用語は出てきますので、

覚えておくと便利です。




第6章第15話へ 第7章第2話へ

本講義トップへ