目次に戻る


このエントリーをはてなブックマークに追加


関数

1次関数、2次関数、三角関数...など誰もが聞いたことがある言葉「関数」

ところで関数って何??

説明するとなると難しい。
例えばこんな関数があったとする。

f(x) = 3x + 2

簡単ですね。 x = 2 のときの f(x) は、 f(2) = 8 となる。

そう!!これが関数!!!!


...ようわからん??

つまり、あらかじめ「f(x)=3x+2」って定義しておくと、f(1)とかf(2)って呼び出すだけでそれぞれに対応した結果が返ってくる!! 

ちなみに f(x) のカッコ内の文字は引数(ひきすう)っていう名前がついていて、f(x,y)みたいに2つ以上でも可能。

この関数はプログラミングの世界でもたくさん登場します。今回はこの「関数」を解説していく。




C++で関数を使う

前章で使った素数判定プログラム(ソース)を例に解説していくよ。ついでに関数って何が便利なのかも実感できるよ!!!

それではコーディングしていきましょう。

まずは今回扱う「素数判定してくれるプログラム(関数)」の名前を仮に Prime() としておきましょう。
そうすると素数判定プログラムのmain関数内は以下のようになるよ。

                      #include< iostream >
                      #include< math.h >
                      using namespace std;

                      int main(){

                          int num;

                          cout << "素数判定する数字を入力 : ";
                          cin >> num;

                          Prime ( num ); //素数判定を関数化!! (もちろんこれだけじゃ動かない)

                          return 0;
                      }
                  

見てわかるように、main関数内がめちゃくちゃシンプルじゃない??
これが関数を扱う上での大きなメリット。

つまりコーディングの時に、先にどんな流れの処理をするかmain関数内に記述しておいて、後から処理内容を追加していけば良いだけ!

そうしたら今度はこの素数発停をする関数Prime()をmain関数外に記述する。
記述の仕方はまたあとで説明するとしてこんな感じ。

                    #include< iostream >
                    #include< math.h >
                    using namespace std;

                    //関数のプロトタイプ宣言
                    void Prime ( int x );

                    int main(){

                        int num;

                        cout << "素数判定する数字を入力 : ";
                        cin >> num;

                        Prime ( num ); //引数 num を渡しているが、関数内では引数の x が num として振る舞う

                        return 0;
                    }

                    /**
                     * 素数判定を行う関数 Prime ()
                     */
                    void Prime ( int x ){ //プロトタイプ宣言と同じ形に

                        if ( x == 2 ){
                            cout << x << "は素数です" << endl;
                            return ;
                        }

                        if( x % 2 == 0 ){
                            cout << "は素数ではありません" << endl;
                            return ;
                        }

                        int i = 3;

                        while ( i <= sqrt( x ) ){
                            if( x % i == 0 ){
                                cout << x << "は素数ではありません" << endl;
                                return ;
                            }
                            i += 2;
                        }

                        cout << x << "は素数です" << endl;

                        return ;
                    }
                  
まず前提として覚えておいてほしいことは、プログラムは上から順に処理されていくということ。
なのでまずこんな関数を使うよ!ってmain関数より前に書いておかなければいけません。

これを関数のプロトタイプ宣言と言います(なんかかっこいい)。

そして関数のカッコ内に書いてある変数は、さっき話題にあがった引数(ひきすう)。main関数で扱っていた値や変数を違う関数内でも扱うことができる。

今回の場合、num に入力された値がPrime()に渡され、Prime()関数内でその値を使った処理がされている。


スポンサーリンク



戻り値(返り値)と型の話

関数には基本戻り値(返り値)という概念が存在する。

関数内の return がそれ。
戻り値は簡潔に言うならば関数の終わりを指す。
そしてしかも演算結果などをmain関数に持って帰ることができる。

説明がわかりにくいですね。

実際に簡単なソースコードを見てみましょう。

#include< iostream >
using namespace std;

/**
 * 階乗を求める関数 Fact()
 */
int Fact ( int x ){ //プロトタイプ宣言ではなく、先に関数定義を書くのもOK

  int answer = 1;

  for( int i = 0; i <= x; i++ )
    answer *= i;

  return answer; //answerを呼び出した所に持って帰る
}

int main(){

  cout << "5の階乗は" << Fact ( 5 ) << "です" << endl;

  return 0;
}
                  

上記の出力結果は、
5の階乗は 120 です。
となり、しっかりFact()関数の戻り値 answer がmain関数内で扱うことができている。

そしてお気づきだろうか...。

関数にもがあることを。

さっきのPrime()は void 、Fact()は int という型を使っている。
この違いは戻り値にあって、戻り値が整数なら int だし、小数なら double である。

ちなみにvoid は戻り値は扱わない型で、単に return; か return 0; の形が多い。
もはや return なしでもコンパイルエラーにはならない。




さて次回は、 8, 配列を使ってみる・その1【array[0],array[1]...】



スポンサーリンク






このエントリーをはてなブックマークに追加