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

タンクが指定時間内にオーバーフロー・アンダーフロー・満水のどれになるかを判定するC++プログラム

タンクへの給水率・タンクの高さ・タンクの半径が与えられたとき、指定した時間内にタンクが「オーバーフロー」「アンダーフロー」「ちょうど満水」のどれになるかを判定するC++プログラムを紹介します。

実行例

入力: radius = 2, height = 5, rate = 10
出力: tank overflow(タンクがオーバーフローする)

入力: radius = 5, height = 10, rate = 10
出力: tank underflow(タンクがアンダーフローする)

判定のアプローチ

  • 給水率(rate)、タンクの高さ(height)、タンクの半径(radius)を入力として受け取ります。
  • タンクの体積を計算し、指定時間内に満水にするために必要な水の流量を求めます。
  • 以下の条件で結果を判定します。
    • 必要な流量(expected)が実際の流量(orignal)より小さい場合 → 水が多すぎるためタンクはオーバーフローします。
    • 必要な流量(expected)が実際の流量(orignal)より大きい場合 → 水が足りずタンクはアンダーフローします。
    • 必要な流量(expected)と実際の流量(orignal)が等しい場合 → タンクは時間どおりに満水になります。
  • 判定結果を出力します。

アルゴリズム

開始
ステップ1 → タンクの体積を計算する関数を宣言する
    float volume(int rad, int height)
    return ((22.0 / 7) * rad * rad * height)
ステップ2 → オーバーフロー・アンダーフロー・満水を判定する関数を宣言する
    void check(float expected, float orignal)
        IF (expected < orignal)
            "tank overflow" を出力
        End
        ELSE IF (expected > orignal)
            "tank underflow" を出力
        End
        ELSE
            "tank filled" を出力
        End
ステップ3 → main() 関数
    int rad = 2, height = 5, rate = 10 を設定
    float orignal = 70.0 を設定
    float expected = volume(rad, height) / rate を計算
    check(expected, orignal) を呼び出す
終了

サンプルコード

#include <bits/stdc++.h>
using namespace std;
// タンクの体積を計算する関数(円柱の体積:π × r² × h)
float volume(int rad, int height) {
    return ((22.0 / 7) * rad * rad * height);
}
// オーバーフロー・アンダーフロー・満水を判定する関数
void check(float expected, float orignal) {
    if (expected < orignal)
        cout << "tank overflow";
    else if (expected > orignal)
        cout << "tank underflow";
    else
        cout << "tank filled";
}
int main() {
    int rad = 2, height = 5, rate = 10;
    float orignal = 70.0;
    float expected = volume(rad, height) / rate;
    check(expected, orignal);
    return 0;
}

出力結果

tank overflow

補足:体積計算の注意点

タンクを円柱とみなすと、その体積は「π × 半径の2乗 × 高さ」で求められます。C++では 22 / 7 のように整数同士で割ると整数除算となり小数点以下が切り捨てられるため、22.0 / 7 のように浮動小数点数で記述するのがポイントです。また、半径の2乗は rad * rad と記述することで、より正確な体積を計算できます。

  1. C++でDFS(深さ優先探索)を使ってグラフが2部グラフかどうかを判定する方法

    連結グラフが与えられたとき、そのグラフが2部グラフ(bipartite graph)であるかどうかを判定することを考えます。2部グラフとは、頂点集合を2つのグループに分割でき、すべての辺が必ず異なるグループの頂点同士を結ぶようなグラフのことです。言い換えると、隣接する頂点同士が常に異なる色になるように、グラフ全体を2色で塗り分けられるグラフです。例えば、次のような6頂点のグラフを考えてみましょう。この場合、出力は True(1)となります。このグラフは偶数長の閉路を持ち、2色での塗り分けが可能だからです。解き方のアプローチこの問題は、DFS(深さ優先探索)を用いて頂点を順番に彩色していくことで

  2. C++で対合行列(インボリュートリー行列)を判定するプログラムの実装方法

    行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表します。ここでは r = c、つまり正方行列である場合を考えます。この記事では、与えられた正方行列が対合行列(インボリュートリー行列)であるかどうかを判定する方法を解説します。 対合行列とは 対合行列とは、ある行列を自分自身と掛け合わせたとき、その積が単位行列になるような行列のことです。単位行列 I とは、主対角成分がすべて 1 で、それ以外の要素がすべて 0 である行列を指します。 したがって、行列 M が対合行列であるための必要十分条件は次のように表せます。 M × M = I ここで、M は任意の行列、I は単位行列で