【C++】ボックスクラスの作成、体積計算、未満演算子による比較の実装方法
ボックス(Box)クラスの定義条件
ここでは、以下の条件に従ってボックスクラスを定義するC++プログラムを解説します。
- 長さ・幅・高さを表す3つの属性 l、b、h を持つ(これらは private 変数として定義)
- l、b、h をすべて 0 で初期化する引数なしコンストラクタと、初期値を設定できる引数付きコンストラクタを定義する
- 各属性に対応するゲッターメソッドを定義する
- ボックスの体積を求める calculateVolume() 関数を定義する
- 「<」(未満)演算子をオーバーロードし、現在のボックスが別のボックスより小さいかどうかを判定できるようにする
- 作成されたボックスの個数をカウントする変数を用意する
問題設定と期待される出力
例として、3つのボックス (0, 0, 0)、(5, 8, 3)、(6, 3, 8) のデータを入力し、各ボックスの情報を表示します。さらに「3番目のボックスが2番目のボックスより小さいか」を判定して小さい方のボックスの体積を求め、count 変数を使って作成済みボックスの総数も出力します。
このときの出力は次のようになります。
Box 1: (length = 0, breadth = 0, width = 0) Box 2: (length = 5, breadth = 8, width = 3) Box 3: (length = 6, breadth = 3, width = 8) Box 3 is smaller, its volume: 120 There are total 3 box(es)
解決のためのアプローチ
この問題は、以下の手順で解決できます。
- 体積を計算するには、l × b × h の結果を返す
- 「<」演算子をオーバーロードするには、次の優先順位で比較を行う
- まず、現在のオブジェクトの l が相手のオブジェクトの l と異なる場合
- 現在の l が相手の l より小さければ true を返す
- 次に、b が異なる場合
- 現在の b が相手の b より小さければ true を返す
- 最後に、h について同様に比較する
- 現在の h が相手の h より小さければ true を返す
ポイント解説
- CalculateVolume() 内では「1LL * l * b * h」と記述することで long long 型として計算され、int 型のオーバーフローを防げます。
- operator< は、l → b → h の順に比較する辞書式順序のような比較を実現しています。
- static int count はクラス全体で共有される静的メンバ変数で、コンストラクタが呼ばれるたびにインクリメントされるため、生成されたボックスの総数を把握できます。
実装例
以下の実装例を見ると、より理解が深まるでしょう。
#include <iostream>
using namespace std;
class Box {
int l, b, h;
public:
static int count;
Box() : l(0), b(0), h(0) { count++; }
Box(int length, int breadth, int height) : l(length), b(breadth), h(height) { count++; }
int getLength() const {return l;}
int getBreadth() const {return b;}
int getHeight() const {return h;}
long long CalculateVolume() const {
return 1LL * l * b * h;
}
bool operator<(const Box& another) const {
if (l != another.l) {
return l < another.l;
}
if (b != another.b) {
return b < another.b;
}
return h < another.h;
}
};
int Box::count = 0;
int main(){
Box b1;
Box b2(5,8,3);
Box b3(6,3,8);
printf("Box 1: (length = %d, breadth = %d, width = %d)\n",b1.getLength(), b1.getBreadth(), b1.getHeight());
printf("Box 2: (length = %d, breadth = %d, width = %d)\n",b2.getLength(), b2.getBreadth(), b2.getHeight());
printf("Box 3: (length = %d, breadth = %d, width = %d)\n",b3.getLength(), b3.getBreadth(), b3.getHeight());
if(b3 < b2){
cout << "Box 3 is smaller, its volume: " << b3.CalculateVolume() << endl;
}else{
cout << "Box 3 is smaller, its volume: " << b2.CalculateVolume() << endl;
}
cout << "There are total " << Box::count << " box(es)";
}入力
b1; b2(5,8,3); b3(6,3,8);
出力
Box 1: (length = 0, breadth = 0, width = 0) Box 2: (length = 5, breadth = 8, width = 3) Box 3: (length = 6, breadth = 3, width = 8) Box 3 is smaller, its volume: 120 There are total 3 box(es)
-
C++で対角行列・スカラー行列を判定するプログラムの書き方
行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表し、r = c のとき正方行列となります。本記事では、与えられた正方行列が対角行列であるか、スカラー行列であるかを判定し、該当する場合には「yes」を出力する方法を解説します。 対角行列とは 正方行列 m[][] が対角行列であるのは、主対角線以外の要素がすべてゼロである場合、かつその場合に限ります。 下図のように、赤色で示された要素が主対角成分(非ゼロ)であり、それ以外の要素はすべてゼロになっているため、この行列は対角行列です。 入出力例 Input: m[3][3] = { {7, 0, 0}, {0, 8, 0}
-
C++で立方体の体積と表面積を求めるプログラム
立方体とは? 立方体とは、正方形の面を6つ持つ三次元の立体図形です。すべての辺の長さが等しいという特徴があります。立方体は唯一の正六面体であり、以下のような性質を持ちます。 面の数:6つ 辺の数:12本 頂点の数:8つ 以下は立方体の図です。 問題の概要 立方体の一辺の長さが与えられたとき、その立方体の表面積と体積を求めることが課題です。ここで、表面積とは立方体の各面が占める面積の合計を指し、体積とはその図形が内包できる空間の大きさを指します。 立方体の表面積と体積を計算するには、次の公式を使用します。 表面積 = 6 × 辺 × 辺 体積 = 辺 × 辺 × 辺 入力例と出力例 入力