2018年02月18日
《その296》 問題演習 p.381演習10-3 (4)
新版明解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() << "]";
}
// 解答<今回は (4) のみ>
// 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_4.cpp
// ・九州,四国,中国 各地方の
// 人口密度を 各県のデータ
// から算出します。
#include <string>
#include <vector>
#include <iostream>
#include "Twin.h"
using namespace std;
// 地方毎の人口密度の計算
int density(vector<Twin<unsigned long> >& x) {
unsigned long popl = 0;
unsigned long area = 0;
for (unsigned i = 0; i < x.size(); i++) {
popl += x[i].first();
area += x[i].second();
}
return popl / area;
}
int main() {
// 県の人口(人)と面積(平方キロメートル)
// 九州地方
vector<Twin<unsigned long> > data_kyuushuu {
// 人口↓ 面積↓
Twin<unsigned long>(5110338, 4986), // 福岡
Twin<unsigned long>(1151853, 6341), // 大分
Twin<unsigned long>(1088136, 7735), // 宮崎
Twin<unsigned long>(1624801, 9187), // 鹿児島
Twin<unsigned long>(1443802, 2281), // 沖縄
Twin<unsigned long>(1765518, 7409), // 熊本
Twin<unsigned long>( 823620, 2241), // 佐賀
Twin<unsigned long>(1353550, 4132) // 長崎
};
// 県の人口(人)と面積(平方キロメートル)
// 四国地方
vector<Twin<unsigned long> > data_shikoku {
// 人口↓ 面積↓
Twin<unsigned long>( 967640, 1877), // 香川
Twin<unsigned long>( 743356, 4147), // 徳島
Twin<unsigned long>( 713465, 7104), // 高知
Twin<unsigned long>(1363907, 5676) // 愛媛
};
// 県の人口(人)と面積(平方キロメートル)
// 中国地方
vector<Twin<unsigned long> > data_chuugoku{
Twin<unsigned long>(1908447, 7114), // 岡山
Twin<unsigned long>(2830069, 8479), // 広島
Twin<unsigned long>(1381584, 6112), // 山口
Twin<unsigned long>( 684668, 6708), // 島根
Twin<unsigned long>( 565233, 3507) // 鳥取
};
// 列数が行によって異なる2次元配列 data_1
vector<vector<Twin<unsigned long> > > data_1 {
data_kyuushuu,
data_shikoku,
data_chuugoku
};
string region[]
= { "九州地方", "四国地方", "中国地方" };
cout << "人口密度 (人 / 平方キロメートル)\n";
for (unsigned i = 0; i < data_1.size(); i++) {
cout << region[i] << " : "
<< density(data_1[i]) << '\n';
}
}
この記事へのトラックバックURL
https://fanblogs.jp/tb/7333908
※ブログオーナーが承認したトラックバックのみ表示されます。