Comments
Description
Transcript
課題 1: 球の体積を計算して返す関数を pow()を使って実装
#02 の解答例 展開プログラム言語/演習 http://kujiraiken.sit.ac.jp/lecture.html 課題 1: 球の体積を計算して返す関数を pow()を使って実装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <stdio.h> #include <math.h> #define PI 3.14159265358979 /* 球 の 体 積 を 計 算 し て 返 す 関 数 */ double kyuu_taiseki(double hankei) { double taiseki; taiseki = 4.0 / 3.0 * PI * pow(hankei, 3.0); return(taiseki); } /* kyuu_taiseki() を テ ス ト す る */ void test_kyuu_taiseki(void) { double radius = 2.0; printf("半径が %f な 球 の 体 積は Yn", radius); printf("%f で す。 Yn", kyuu_taiseki(radius)); } /* エ ン ト リ ポ イ ン ト */ int main(void) { test_kyuu_taiseki(); return 0; } • 9 行め: この関数の返却値は 7 行めで「double型である」と宣言しているので,返却値用の変数を宣言 するときももちろん double 型で宣言しましょう。 • 10 行め: 左辺は double 型の変数なのだから,右辺もすべて double 型で統一しないといけません。 そのため,右辺内のリテラルはすべて,コンパイラに double型と認識してもらえるよう, 「.0」をつけ とくべきです。具体的には,4.0 と 3.0 です。 また,pow()関数の実引数には double型を書かないといけない,ということもわかっているので,そ こも「3」ではダメ。3.0です。 また,pow()関数の返却値は double 型なので,なんのキャストもせずに,この右辺の計算に参加させ て問題ないですね。 • 17 行め: ここの右辺も同様な理由で, 「2」では間違い。「2.0」などとしないといけません。 ※ 課題 2 は裏面 1 / 2 #02 の解答例 課題 2: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 展開プログラム言語/演習 http://kujiraiken.sit.ac.jp/lecture.html sin()関数を自作する #include <stdio.h> #include <math.h> /* for pow() */ #define PI 3.14159265358979 /* 階 乗 関 数 */ double kaijou(double x) { double tmp = 1.0; double kotae; int i; for(i=1; i<=x; i++){ tmp *= i; } kotae = tmp; return(kotae); } /* my_sin() 関 数 */ double my_sin(double kakudo) { int i; double tmp = 0.0; double kotae; for(i=0; i<10; i++){ tmp += pow(-1.0, (double)i) / kaijou(2.0*i+1.0) * pow(kakudo, 2.0*i+1.0); } kotae = tmp; return(kotae); } /* my_sin() を テ ス ト す る */ void test_my_sin(void) { double kotae; /* 自 作 の my_sin() 関 数 を 呼 び 出 す */ /* 数 学 の sinπ は 0.0 な の で my_sin() も そ れ に 近 い 値 に な る は ず */ kotae = my_sin(3.14159); printf("my_sin: [%f]Yn", kotae); /* 比 較 の た め 標 準 ラ イ ブ ラ リ 関 数 の sin() 関 数 も 呼 び 出 し て み る */ kotae = sin(3.14159); printf("sin: [%f]Yn", kotae); } /* エ ン ト リ ポ イ ン ト */ int main(void) { test_my_sin(); return 0; } • 意図としては,引き続き,関数定義・関数呼び出し,数値の扱いに慣れてもらうための問題でした。ルー プで値を次々に更新していくというパターンに慣れてもらう問題でもあります。 • また,当然今日の主題でもあるリテラルの書き方も注意が必要です。 • なお,M_PIというマクロを使っている人を例年見受けますが,M_PIというのは C の標準規格にはあり ません (たまたま gcc や VC がオプションで勝手に用意してくれているだけ)。ので,移植性が悪くな るので M_PI はお勧めできません。 代案としては,今回の 4 行目のように直接#defineで定義してしまうか,あるいは, #define PI 4.0*atan(1.0) とすると,精度の良い π が得られます。これは,tan π = 2 / 2 1 4 であるということを利用しています。