情報技術検定1級の問題です。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
コアラ

情報技術検定1級の問題です。

#1

投稿記事 by コアラ » 8年前

アルゴリズムの問題でわからないところがあるので教えてください。
問題
次の流れ図は、底辺の半径が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]

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 情報技術検定1級の問題です。

#2

投稿記事 by usao » 8年前

オフトピック
>Sを出力
最後のオチがちょっと面白かったです.

白い変人

Re: 情報技術検定1級の問題です。

#3

投稿記事 by 白い変人 » 8年前

積分の原形とも言えるアルゴリズムと言えるでしょう。

ある程度数学関連の諸学への理解のある人からすれば「何故分からない?」と言われそうですが、更に深い数学の世界に身を投じた人からは「確かに分からないと言われても仕方がないね。」と言い出しそうな問題に思える。

では、私なりに解説してみましょう。


まず、アルゴリズムとしては、円錐を短い円柱のピラミッドの様なものに分割し、最下段の円柱の体積から最上段の円柱の体積までの総和を求めるような物をイメージすると良いでしょう。




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級の問題です。

#4

投稿記事 by かずま » 8年前

コアラ さんが書きました:アルゴリズムの問題でわからないところがあるので教えてください。
回答ではありませんが、参考までに。

コード:

#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 * r2 * 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: .
円柱が円錐の外側にできるので、
体積は大きくなります。

返信

“C言語何でも質問掲示板” へ戻る