戻り値のある関数(数学関数)

戻り値のある関数(数学関数)

戻り値のある関数についての解説。ここでは例として数学関数をとりあげる。
サイト全体の目次

稿


稿

数学関数

このセクションのソース

/*01*/ #include <stdio.h>
/*02*/ #include <math.h>    /* pow など */
/*03*/ 
/*04*/ main()
/*05*/ {
/*06*/   int x = 3;
/*07*/   double y;
/*08*/ 
/*09*/   y = pow(2, x);
/*10*/ 
/*11*/   printf("2 の %d 乗は %lf です。\n", x, y);
/*12*/ 
/*13*/   return 0;
/*14*/ }

list-1.5.1-09

ここまでの説明で「べき乗やルートは?使えないの?」と思った人も多いと思います。残念ながらこれらの演算子はありません。ですが、かわりに数学関数が用意されています。リストに載っている pow 関数はべき乗を求めるために使います。これらを使うにはまず「math.h」ヘッダー・ファイルをインクルードしてください。それぞれの関数は計算結果を戻り値として返してくるので、必要に応じてリストのように代入演算子「=」で結果を変数に格納してください。

戻り値のある関数についてもう少し説明しましょう。この行を見ると、pow 関数を double 型変数「y」に代入しているという、意味のわからない処理を指定しているように見えますが、これは正しい記述方法です。pow 関数は double 型の戻り値を返します。関数が出てくるとコンパイラはまず関数を呼び出し、戻り値があればその値がそこにあるかのように処理してくれるのでこのようなことができるのです。例えば double 関数が「128」という整数を返してきた場合、上の式は

y = 128;

というふうに置き換えて処理されます。ということは、次のようなものも正しいのです。
printf("2 の %d 乗は %lf です。\n", x, pow(2, x));

これは「x = 3」の時、変数 x が「3」に pow 関数が「8」に置き換えられて次のようになります。
printf("2 の %d 乗は %lf です。\n", 3, 8);

さて、数学関数の戻り値は double 型です。そこで、結果を変数に代入したい場合 double 型の変数を用意してください。「2 の 3 乗」のように返ってくる値が整数であるとわかっている場合は、キャストして int 変数等に代入しても良いでしょう。また、原則として引数も double 型ですから、それ以外の型の変数を渡すと自動的に double へキャストされます。ここで数学関数の一覧を.に示しておきます。

pow(x, y) x の y 乗
sqrt(x) 平方
sin(x) サイン
cos(x) コサイン
tan(x) タンジェント
asin(x) アーク・サイン
acos(x) アーク・コサイン
atan(x) アーク・タンジェント
sinh(x) ハイパボリック・サイン
cosh(x) ハイパボリック・コサイン
tanh(x) ハイパボリック・タンジェント
exp(x) e の x 乗
log(x) 自然対数
log10(x) 基底10の対数
ceil(x) 以上の最小の整数
floor(x) 以下の最大の整数
fabs(x) 絶対値
*三角関数の角度はラジアン

練習問題

問題-1.5.1

実数(浮動小数点型) x をキーボードから入力し、x のルートを求めてください。

問題-1.5.2

実数 x, y をキーボードから入力し、x の y 乗を求めてください。ただし結果を表示する際、小数点部分は二桁とします。

問題-1.5.3

実数 x, y をキーボードから入力し、x の y 乗根を求めてください。ただし結果を表示する際、小数点部分は二桁とします。
補足1:「z の y 乗 が x」なら「 x の y 乗根 は z」 - 例:「2 の 3 乗 = 8」なら「8 の 3 乗根 = 2」
補足2:「x の y 乗根」とは「x の 1/y 乗」のこと。

問題-1.5.4

実数 x をキーボードから入力し、三角関数の公式「sin(x) 2乗 + cos(x) 2乗 = 1」がどのような x でも成り立つことを確認してください。ただし結果を表示する際、小数点部分は二桁とします。

練習問題回答例

問題-1.5.1

scanf 関数で数値を読み込み、sqrt 関数で計算します。

#include <stdio.h>
#include <math.h>

main()
{
	double x;

	printf("x のルートを求めます。x を入力してください。: ");
	scanf("%lf", &x);
	printf("%lf\n", sqrt(x));

	return 0;
}

問題-1.5.2

scanf で数値を読み込み、pow 関数で計算します。表示桁数の指定については第3章を参照してください。

#include <stdio.h>
#include <math.h>

main()
{
	double x, y;

	printf("x の y 乗を求めます。x y を入力してください。: ");
	scanf("%lf%lf", &x, &y);
	printf("%.2lf\n", pow(x, y));

	return 0;
}

問題-1.5.3

一見、n 乗根というとルートの仲間だから sqrt 関数で、と思いがちですが、sqrt はルート、即ち 2乗根 しか計算できません。そこで問題の 補足2 をヒントに、x の 1/y 乗として pow 関数を使います。

#include <stdio.h>
#include <math.h>

main()
{
	double x, y;

	printf("x の y 乗を求めます。x y を入力してください。: ");
	scanf("%lf%lf", &x, &y);
	printf("%.2lf\n", pow(x, 1/y));

	return 0;
}

問題-1.5.4

関数 sin(x), cos(x) を呼び、その結果を pow 関数で 2乗 して足します。

#include <stdio.h>
#include <math.h>

main()
{
	double x, z;

	printf("sin(x) 2乗 + cos(x) 2乗 を求めます。x を入力してください。: ");
	scanf("%lf", &x);
	z = pow(sin(x), 2) + pow(cos(x), 2);
	printf("%.2lf\n", z);
	/* これまでの問題の解答例同様、「pow(sin(x), 2) + pow(cos(x), 2)」を
	printf に直接書いても良いが、あまり長いとみにくい。*/

	return 0;
}


読み込み中・・・
10秒待っても表示が変わらない場合、次の理由が考えられます。
・Javascript が無効になっています。
・検索エンジンのキャッシュを見ています。
サイトホームへ / 上位ページへ / ページトップへ / PAROFトレンドショッピングへ
Copyright (C) 2010 totobon all right reserved.