C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で水槽にn個の球体ボールを沈めたときに水が溢れるかどうかを判定するプログラム

円柱形の水槽の半径と高さ、沈める球体ボールの個数「n」とそれぞれの半径、さらに水槽内の現在の水量が与えられたとき、ボールをすべて水槽に沈めた際に水が溢れる(オーバーフローする)かどうかを判定するのが本記事の目的です。

体積を求める公式

円柱(水槽)の場合

3.14 * r * r * h

ここで、rは水槽の半径、hは水槽の高さを表します。

球体(ボール)の場合

(4/3) * 3.14 * R * R * R

ここで、Rは球体ボールの半径を表します。

入力例

tank_height = 5
tank_radius = 2
water_volume = 10
capacity = 10
ball_radius = 2

出力例

It will overflow

判定までの流れ(アプローチ)

  • 水槽の半径や高さ、沈めるボールの個数、ボールの半径などの各パラメータを入力として受け取ります
  • 公式を用いて水槽の容量(容積)を計算します
  • 公式を用いて球体1個分の体積を計算します
  • ボールを水に沈めるたびに水位が上昇するため、現在の水量を考慮します
  • 水量とボール全体の体積を合計した総体積を求めます
  • 総体積と水槽の容量を比較し、オーバーフローの有無を判定します
    • 総体積が容量より大きい場合 → 水槽から水が溢れます
    • 総体積が容量より小さい場合 → 水は溢れません

アルゴリズム

Step 1→ 水槽がオーバーフローするかどうかを判定する関数を宣言
    void overflow(int H, int r, int h, int N, int R)
        float型 tank_cap = 3.14 * r * r * H を宣言
        float型 water_vol = 3.14 * r * r * h を宣言
        float型 balls_vol = N * (4 / 3) * 3.14 * R * R * R を宣言
        float型 vol = water_vol + balls_vol を宣言
        IF (vol > tank_cap)
            「it will overflow」と表示
        End
        Else
            「No it will not overflow」と表示
        End
Step 2→ main() 内での処理
    int型 tank_height = 5, tank_radius = 2, water_volume = 10,
    capacity = 10, ball_radius = 2 を宣言
    overflow(tank_height, tank_radius, water_volume, capacity, ball_radius) を呼び出す

C++による実装例

#include <bits/stdc++.h>
using namespace std;
// 水槽がオーバーフローするかどうかを判定する関数
void overflow(int H, int r, int h, int N, int R){
   float tank_cap = 3.14 * r * r * H;
   float water_vol = 3.14 * r * r * h;
   float balls_vol = N * (4 / 3) * 3.14 * R * R * R;
   float vol = water_vol + balls_vol;
   if (vol > tank_cap){
      cout<<"it will overflow";
   }
   else{
      cout<<"No it will not overflow";
   }
}
int main(){
   int tank_height = 5, tank_radius = 2, water_volume = 10, capacity = 10, ball_radius = 2;
   overflow(tank_height, tank_radius, water_volume, capacity, ball_radius);
   return 0;
}

出力結果

上記のコードを実行すると、以下の出力が得られます。

it will overflow

補足:より正確な計算のために

サンプルコードでは (4 / 3) の部分が整数同士の除算となるため、計算結果が「1」に丸められてしまう点に注意が必要です。球の体積を正確に求めるには、(4.0 / 3.0) のように浮動小数点数で記述しましょう。また、円周率についても M_PI3.14159 など、より高精度な値を使用することで計算全体の精度が向上します。

  1. BFS(幅優先探索)で無向グラフの連結性を判定するC++プログラム

    グラフの連結性とは グラフが連結(接続)されているかどうかを調べるには、何らかのグラフ探索アルゴリズムを使って、すべてのノードを訪問できるかどうかを確認します。探索を完了した時点で未訪問のノードが1つでも残っていれば、そのグラフは連結していないことになります。 無向グラフの場合は、任意の1つのノードを選び、そこから探索を開始します。本記事では、探索アルゴリズムとして幅優先探索(BFS:Breadth-First Search)を採用しています。 入力と出力の例 入力 − グラフの隣接行列 0110010110110110110100110 出力 − 「グラフは連結しています。」 アルゴリズム

  2. DFS(深さ優先探索)による有向グラフの連結性チェック ― C++プログラム解説

    グラフの連結性チェックの基本概念 グラフが連結しているかどうかを調べるには、何らかの探索アルゴリズムを用いてすべてのノードを巡回してみます。探索が完了した時点で、まだ一度も訪問されていないノードが残っていれば、そのグラフは連結ではないと判断できます。 有向グラフの場合のポイント 無向グラフと異なり、有向グラフの場合はすべてのノードを起点として探索を行う必要があります。理由は、あるエッジが外向きの辺しか持たず、内向きの辺を持たないケースが存在するためです。そのようなノードは、他のどのノードを出発点としても到達できない可能性があります。 本記事では、探索アルゴリズムとして再帰的なDFS(深さ優先