ページ 1 / 1
情報技術検定1級の問題です。
Posted: 2017年6月16日(金) 16:04
by コアラ
アルゴリズムの問題でわからないところがあるので教えてください。
問題
次の流れ図は、底辺の半径がr、高さがhの円錐の体積を求める処理を表している。
流れ図の中の空欄①~④に入れるべきものを図にならって記入し、流れ図を完成しなさい。
考え方
円錐の高さhをn等分し、右図のように高さdh、半径riの円柱に近似して分割する。分割数nを十分大きなかずにして円柱の体積を合計すれば円錐の体積の近似値を求めることができる。
流れ図
はじめ
↓
PI←3,14159
V←0
↓
底辺の半径r、
高さh、
分割数nを入力
↓
dh←①
ループ開始
i=1,2,・・・・、②
↓
ri←③
↓
Vi←PI×ri×ri×dh
↓
V←④
↓
ループ終了
↓
Sを出力
↓
おわり
答え
①h÷n②n③(nーi)÷n×r④V+Vi
①から④までどうしてそうなるのかわかりません。教えてください。[album][album][album]

[/album][/album][/album]
Re: 情報技術検定1級の問題です。
Posted: 2017年6月16日(金) 17:33
by usao
オフトピック
>Sを出力
最後のオチがちょっと面白かったです.
Re: 情報技術検定1級の問題です。
Posted: 2017年6月16日(金) 21:41
by 白い変人
積分の原形とも言えるアルゴリズムと言えるでしょう。
ある程度数学関連の諸学への理解のある人からすれば「何故分からない?」と言われそうですが、更に深い数学の世界に身を投じた人からは「確かに分からないと言われても仕方がないね。」と言い出しそうな問題に思える。
では、私なりに解説してみましょう。
まず、アルゴリズムとしては、円錐を短い円柱のピラミッドの様なものに分割し、最下段の円柱の体積から最上段の円柱の体積までの総和を求めるような物をイメージすると良いでしょう。
①
dhは分割された短い円柱1本の高さを表すものでしょう。
故に高さhをn等分すれば良いと言えるでしょう。
②
分割された円柱はn個あるからnと言う事でしょう。
実際にプログラムとしてコーディングする際にもnにするべきなのかどうかは状況次第では別問題と言えるのかもしれません。
③
半径を段数に応じて減少させているだけだと考えればイメージし易いでしょう。
但し、回答に記されている「(n-i)÷n×r」だけが当アルゴリズムを動作させる唯一の回答とは言えません。
④
「Vi←PI×ri×ri×dh」でViに上記段に於ける体積が求められたので、全ての体積?を表すだろうVにViを加算すれば良いと思われるので、「V+Vi」で良いような気はします。
但し、usao氏が指摘している様に「Sを出力」のSが、上記体積であるならば、④の回答は「S←V+Vi」にした方が良いのかもしれません。
Re: 情報技術検定1級の問題です。
Posted: 2017年6月18日(日) 01:20
by かずま
コアラ さんが書きました:アルゴリズムの問題でわからないところがあるので教えてください。
回答ではありませんが、参考までに。
コード:
#include <stdio.h> // scanf, printf
int main(void)
{
const double PI = 3.141592653589793238;
double r, h;
printf("底辺の半径 r; "); scanf("%lf", &r);
printf("高さ h; "); scanf("%lf", &h);
while (1) {
double V = 0;
int n;
printf("分割数 n: ");
if (scanf("%d", &n) != 1) break;
double dh = h / n; // (1)
for (int i = 1; i <= n; i++) { // ループ開始 (2)
double ri = r * (n - i) / n; // (3)
double Vi = PI * ri * ri * dh;
V = V + Vi; // (4)
} // ループ終了
printf("円錐の体積 V = %g\n", V); // V を出力
}
return 0;
}
実行結果
コード:
底辺の半径 r; 10
高さ h; 20
分割数 n: 1024
円錐の体積 V = 2091.33
分割数 n: 4096
円錐の体積 V = 2093.63
分割数 n: 16384
円錐の体積 V = 2094.2
分割数 n: .
これだと円柱が円錐の内側にできるので、
体積は小さくなります。
円錐の体積の公式 V = PI * r
2 * h / 3 = 2094.395
for文を次のように変えると、
コード:
for (int i = 0; i < n; i++) { // ループ開始 (2)
実行結果
コード:
底辺の半径 r; 10
高さ h; 20
分割数 n: 1024
円錐の体積 V = 2097.46
分割数 n: 4096
円錐の体積 V = 2095.16
分割数 n: 16384
円錐の体積 V = 2094.59
分割数 n: .
円柱が円錐の外側にできるので、
体積は大きくなります。