C++言語講座 第1章 3回 関数

さて、前回からだいぶ細かい話が出てきましたが、ついて来れてますか? ちょっとキツイと思っているかも知れませんが、大丈夫。ここに書いてあることを全部覚える必要なんか、全くありません。C++の文法は非常に複雑です。全部を完全に覚えている人なんか、世界中探してもいるかどうかわかりません。分からなくなったら、この文章を読み直せば良いだけです。そうすれば、いつの間にか大体のことは覚えてしまいます。気楽にいきましょう。

関数

関数

今まで、関数と言えばmain関数しか出てきませんでした。ですが、C++のプログラムというのは、main関数が他の関数を実行して、またその関数が他の関数を実行して…というようにして出来ています。この章ではいくつか、C++標準ライブラリに入っている関数を紹介して、その実行方法を解説します。

そもそも関数とはなんでしょう?関数とは以前も説明しまたしが、いくつかの処理をまとめたものです。まず簡単なものからみていきましょう。

max関数とmin関数

まず、以下の[List 1]をコンパイル、実行してください。

[List 1]

   1 #include <iostream>
   2 #include <algorithm>
   3 using namespace std;
   4 
   5 int main()
   6 {
   7     int x;
   8 
   9     x = max(10, 20);
  10 
  11     cout << x << endl;
  12 
  13     return 0;
  14 }

画面には

20

と表示されましたよね?上のプログラムは何をしているか分かりましたか?まず、main()関数の中を順に見て行きましょう。


   1 int x;

int型(整数型)のオブジェクト x を宣言しています。これはもう分かりますよね。忘れていたら、復習、復習!


   1 x = max(10, 20);

これが新しいところですね。x に何か値を代入しているようですが、代入しているのは max(10, 20) というもののようです。これは一体なんでしょう? max とは「最大」という意味です。実はこの max(10, 20) というのは 10 と 20 の大きい方を表しているのです。つまり、ここでは x に 10 と 20 で大きい方を代入しているわけです。また後で、ここは詳しく見てみましょう。


   1 cout << x << endl;

これもOKですね?x の内容を画面に表示しています。 --- もう一度、

   1 x = max(10, 20);

という所を見てみましょう。この max というのが関数です。ここでは、「max」という名前の関数に、10 と 20 という二つの数値を渡して、実行しているわけです。関数 max は渡された二つの数値の大きい方を結果として「返して」くれます。これが x に代入されているんですね。

ここでは max に 10 と 20 という数値を渡していますが、色々と渡す数値を変えて、実際に大きい方が表示されるか調べてみましょう。また、max と対応して、小さい方の数値を返してくれる min という名前の関数もあります。 [List 1]の max と書かれているところを min に変えて実行してみましょう。


プログラムの冒頭には

   1 #include <algorithm>

という行も追加されてます。これは、#include <iostream> と同じ様に、C++ 標準ライブラリから max() と min() という二つの関数を読み込んでいます。 cout や endl と同じ様に、max() と min() も正式名称は std::max() 、 std::min() ですが、すぐ下に

   1 using namespace std;

と書いてあるので、std:: を省略しています。

引数と返値

上の例では max という名前の関数に 10 と 20 という値(オブジェクト)を渡しました。このように、関数を実行するときに渡すオブジェクトのことを 引数(ひきすう)と呼びます。また、関数 max は渡された二つの引数のうち、大きい方を返してくれていました。関数が実行された後に返すオブジェクトを返値(へんち)と呼びます。そう、main() 関数が return 文で返しているのと同じものです。

min, max を使ったサンプルプログラム

[List 1]を改良して、ちゃんと使えるプログラムを作りましょう。[List 2]を入力、実行してみてください。

[List 2]

   1 #include <iostream>
   2 #include <algorithm>
   3 using namespace std;
   4 
   5 int main()
   6 {
   7     double num1, num2;
   8 
   9     cout << "小数を2つ入力してください:";
  10 
  11     cin >> num1;
  12     cin >> num2;
  13 
  14     cout << num1 << "と" << num2 << "のうち大きいのは"
  15          << max(num1, num2) << endl;
  16 
  17     return 0;
  18 }

ここでは[List 1]とは違って、小数を比較しています。max()関数は整数だけではなく、小数も比較できるのです。このプログラムでは小数を代入するために、

   1 double num1, num2;

と、double 型のオブジェクト num1 と num2 を宣言しています。小数を代入するには通常、double 型を使います。[List 1]ではmax()の返値は一度、

   1 x = max(10, 20);

のようにオブジェクト x に代入していましたが、そんなことをせずとも、

   1 cout << max(num1, num2)

のように、直接表示することも出来ます。

いくつかの数学系の関数

C++標準ライブラリに含まれる関数として、他の例もいくつか挙げましょう。数学の宿題を解くのに最適な関数たちです。以下の[List 3]と[List 4]を実行して下さい。

[List 3]

   1 #include <iostream>
   2 #include <cmath>
   3 using namespace std;
   4 
   5 int main()
   6 {
   7     double d;
   8 
   9     cout << "小数をひとつ入力して下さい:" << endl;
  10     cin >> d;
  11 
  12     cout << d << " の平方根は " << sqrt(d) << endl;
  13 
  14     return 0;
  15 }

[List 4]

   1 #include <iostream>
   2 #include <cmath>
   3 using namespace std;
   4 
   5 int main()
   6 {
   7     double d1, d2;
   8 
   9     cout << "小数をふたつ入力して下さい:" << endl;
  10     cin >> d1;
  11     cin >> d2;
  12 
  13     cout << d1 << " の " << d2 << " 乗は " << pow(d1, d2) << endl;
  14 
  15     return 0;
  16 }

それぞれ、平方根を求める関数 sqrt() (SQuare RooT=平方根の略)と、べき乗を求める関数 pow() をつかいました。これらの数学系の関数を使うには、最初に

   1 #include <cmath>

と、cmath をインクルードしておきます。

キーボードから行を読み込む

いままでキーボードから入力を受け取るには、

   1 cin >> str;

などとしていました。しかし、この方法では、スペースなどの空白で区切られた文字列をうまく読み込めません。実際にやってみましょう。

[List 5]

   1 #include <iostream>
   2 #include <string>
   3 using namespace std;
   4 
   5 int main()
   6 {
   7     string str;
   8 
   9     cout << "なにか、文字列を入力して下さい:";
  10     cin >> str;
  11     cout << "あなたが入力した文字列は「" << str
  12          << "」" << endl;
  13 
  14     return 0;
  15 }

このプログラムを実行して、空白文字を含む文字列を入力してみて下さい。たとえば、「hoge fuga」と入力すると、画面に表示されるのは、

なにか、文字列を入力して下さい:hoge fuga
あなたが入力した文字列は「hoge」

となってしまうはずです。つまり、最初の空白文字までの文字列しか str に代入されていないのです。そうでなく、改行まで一気に文字列を読み込みたい場合は、getline() 関数を使います。次のようにしてみましょう。

[List 6]

   1 #include <iostream>
   2 #include <string>
   3 using namespace std;
   4 
   5 int main()
   6 {
   7     string str;
   8 
   9     cout << "なにか、文字列を入力して下さい:";
  10     getline(cin, str);
  11     cout << "あなたが入力した文字列は「" << str
  12          << "」" << endl;
  13 
  14     return 0;
  15 }

今度は空白の入った文字列でも、ちゃんと改行まで全部 str に入っているはずです。getline() 関数は、

   1 getline(cin, 文字列の読み込み先);

と使うことで、キーボードから1行まるまる読み込めるのです。これから先、文字列を読み込む場合は大体これを使っていくので、覚えておきましょう。

他にも多くの関数が C++標準ライブラリには含まれています。マニュアルや参考書などを見てみましょう。

wiredBeep/topics/Programming/Lang/Cpp/n1-03 (last edited 2007-10-24 13:53:13 by beeplex)