アフィリエイト広告を利用しています

広告

posted by fanblog

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";
}
}

f10_0303.png



この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7331523
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。