2018年02月18日
《その295》 問題演習 p.381演習10-3 (3)
新版明解C++中級編 p.381 演習10-3
次の (1)〜(4) のプログラムを作成せよ。
(1) 演習2-1(本ブログの《116》)で作成した日付クラス Date の
2次元配列(列数は一定)を作成するプログラム。
(2)上の (1) で、列数が行によって異なる2次元配列を作成するプログラム。
(3) 下記の Twin<> を利用したクラスの2次元配列(列数は一定)を作成するプログラム。
(4) 上の (3) で、列数が行によって異なる2次元配列を作成するプログラム。
// Twin.h
#include <utility>
#include <algorithm>
// クラステンプレート Twin<>
template <class Type> class Twin {
Type v1; // データメンバ
Type v2; // データメンバ
public:
// コンストラクタ
Twin(const Type& f = Type(), const Type& s = Type())
: v1(f), v2(s) { }
// コピーコンストラクタ
Twin(const Twin<Type>& t)
: v1(t.first()), v2(t.second()) { }
// ゲッタ等
Type first() const { return v1; }
Type& first() { return v1; } // セッタ兼用
Type second() const { return v2; }
Type& second() { return v2; } // セッタ兼用
void set(const Type& f, const Type& s) {
v1 = f; v2 = s;
}
// 小さいほうの値を返却
Type min() const {
return v1 < v2 ? v1 : v2;
}
// v1 < v2 であるか
bool ascending() const { return v1 < v2; }
// v1 < v2 にする
void sort() { if (!(v1 < v2)) std::swap(v1, v2); }
};
// 挿入子の多重定義
template <class Type>
inline std::ostream& operator<<(std::ostream& os,
const Twin<Type>& t) {
return os << "[" << t.first() << ", "
<< t.second() << "]";
}
// 解答<今回は (3) のみ>
// Twin.h
#ifndef ___ClassTwin
#define ___ClassTwin
#include <utility>
#include <algorithm>
// クラステンプレート Twin<>
template <class Type> class Twin {
Type v1; // データメンバ
Type v2; // データメンバ
public:
// コンストラクタ
Twin(const Type& f = Type(), const Type& s = Type())
: v1(f), v2(s) { }
// コピーコンストラクタ
Twin(const Twin<Type>& t)
: v1(t.first()), v2(t.second()) { }
// ゲッタ等
Type first() const { return v1; }
Type& first() { return v1; } // セッタ兼用
Type second() const { return v2; }
Type& second() { return v2; } // セッタ兼用
void set(const Type& f, const Type& s) {
v1 = f; v2 = s;
}
// 小さいほうの値を返却
Type min() const {
return v1 < v2 ? v1 : v2;
}
// v1 < v2 であるか
bool ascending() const { return v1 < v2; }
// v1 < v2 にする
void sort() { if (!(v1 < v2)) std::swap(v1, v2); }
};
// 挿入子の多重定義
template <class Type>
inline std::ostream& operator<<(std::ostream& os,
const Twin<Type>& t) {
return os << "[" << t.first() << ", "
<< t.second() << "]";
}
#endif
// p381_10_3_3.cpp
// ・頂点の座標が既知の4つの三角形 abc,
// def, pqr, stu について、それぞれの
// 3頂点の座標,面積を表示します。
#include <string>
#include <iomanip>
#include <vector>
#include <iostream>
#include "Twin.h"
using namespace std;
// 三角形の面積
double f(vector<Twin<double> >& x) {
double a = x[1].first() - x[0].first();
double b = x[1].second() - x[0].second();
double c = x[2].first() - x[0].first();
double d = x[2].second() - x[0].second();
double s = (a * d - b * c) / 2;
if (s < 0) s = -s;
return s;
}
int main() {
// 三角形abcの3点の座標
vector<Twin<double> > abc{
Twin<double>(-1.5, 7.0),
Twin<double>( 1.0, 2.2),
Twin<double>( 3.3, 5.1)
};
// 三角形defの3点の座標
vector<Twin<double> > def{
Twin<double>(-2.1, 2.1),
Twin<double>( 1.4, 1.0),
Twin<double>( 3.3, 3.3)
};
// 三角形pqrの3点の座標
vector<Twin<double> > pqr{
Twin<double>( 7.0, -1.5),
Twin<double>( 2.2, 1.0),
Twin<double>( 5.1, 3.3)
};
// 三角形stuの3点の座標
vector<Twin<double> > stu{
Twin<double>( 2.1, -2.1),
Twin<double>( 1.0, 1.4),
Twin<double>( 3.3, 3.3)
};
vector<vector<Twin<double> > >
triangle{ abc, def, pqr, stu };
string name[]
= {"abc ", "def ", "pqr ", "stu "};
for (unsigned i = 0; i < triangle.size(); i++) {
cout << "三角形" << name[i] << "の3頂点の座標\n";
cout << showpoint << setprecision(2)
<< triangle[i][0] << ", "
<< triangle[i][1] << ", "
<< triangle[i][2] << '\n';
cout << "面積 … "
<< showpoint << setprecision(4)
<< f(triangle[i]) << "\n\n";
}
}
この記事へのトラックバックURL
https://fanblogs.jp/tb/7331523
※ブログオーナーが承認したトラックバックのみ表示されます。