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

広告

posted by fanblog

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

f10_0304.png



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

お名前:

メールアドレス:


ホームページアドレス:

コメント:

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

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

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

 たまに、クリック お願いします 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日以上新しい記事の更新がないブログに表示されております。