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++標準ライブラリには含まれています。マニュアルや参考書などを見てみましょう。
