...

課題 1: 球の体積を計算して返す関数を pow()を使って実装

by user

on
Category: Documents
8

views

Report

Comments

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
であるということを利用しています。
Fly UP