C++Siv3D入門講座 Vol.12 演習問題(コンソール)の解答

## 演習問題(コンソール)解答例
以下に演習問題(コンソール)の解答例を示す。  

## vol_1課題1(コンソール)
```cpp
#include <iostream>

int main() {
	int input;
	std::cout << "整数値を入力してください：" << std::endl;
	std::cin >> input;//inputに入力された数値を代入
	std::cout << "入力された値は、" << input << "です。" << std::endl;

	return 0;
}

```
## vol_1課題2(コンソール)
```cpp
#include <iostream>

class Vector3 {
public:
	int x, y, z;

	// コンストラクタ
	Vector3(int _x, int _y, int _z) {
		x = _x;
		y = _y;
		z = _z;
	}

	// x, y, zの値を表示
	void show() {
		std::cout << x << "," << y << "," << z << std::endl;
	}

	// x * y * zの値を表示
	void showMultiple() {
		std::cout << x *y* z << std::endl;
	}
};

int main() {
	Vector3 vec3(1, 2, 3);
	vec3.show();
	vec3.showMultiple();

	return 0;
}
```

## vol_3課題1(コンソール)

```cpp
#include <iostream>
#include <vector>

class MyClass {
public:
	int x;

	MyClass(int _x) {
		x = _x;
	}

	void show() {
		std::cout << "xは：" << x << std::endl;
	}
};

int main() {
	std::vector<MyClass> vec;
	for (int i = 0; i < 10; i++) {
		vec.emplace_back(MyClass(rand() % 100));
	}

	for (int i = 0; i < (int)vec.size(); i++) {
		vec[i].show();
	}

	return 0;
}
```

## vol_3課題2(コンソール)
```cpp
#include <iostream>
#include <vector>

class Vector2 {
public:
	int x;
	int y;

	Vector2(int _x, int _y) {
		x = _x;
		y = _y;
	}
};

int main() {
	std::vector<Vector2> vec;
	for (int i = 0; i < 10; i++) {
		vec.emplace_back(Vector2(rand() % 100, rand() % 100));
	}

	for (int i = 0; i < (int)vec.size(); i++) {
		std::cout << vec[i].x << ", " << vec[i].y << std::endl;
	}

	return 0;
}
```

## vol_4課題(コンソール)

```cpp
#include <iostream>

void twiceRef(int &x) {
	x *= 2;
}


int main() {

	int num = 3;

	std::cout << num << std::endl;

	twiceRef(num);

	std::cout << num << std::endl;

	return 0;
}
```


## vol_5課題1(コンソール)

```cpp
#include <iostream>

int mySquare(int x) {
	std::cout << "int型のmySquareが呼ばれました" << std::endl;
	return x * x;
}

float mySquare(float x) {
	std::cout << "float型のmySquareが呼ばれました" << std::endl;
	return x * x;
}

double mySquare(double x) {
	std::cout << "double型のmySquareが呼ばれました" << std::endl;
	return x * x;
}


int main() {
	int x = 1;
	float y = 0.5;
	double z = 2.1;
	std::cout << mySquare(x) << std::endl;
	std::cout << mySquare(y) << std::endl;
	std::cout << mySquare(z) << std::endl;
}
```

## vol_5課題2(コンソール)

```cpp
#include <iostream>

class Vector2 {
public:
	int x, y;

	Vector2(int _x, int _y) :
		x(_x),
		y(_y)
	{
		std::cout << "引数ありのコンストラクタが呼ばれました" << std::endl;
	}

	Vector2() :
		x(0),
		y(0)
	{
		std::cout << "引数なしのコンストラクタが呼ばれました" << std::endl;
	}

	~Vector2() {
		std::cout << "デストラクタが呼ばれました" << std::endl;
	}
};

int main() {
	std::cout << "メイン関数に入りました" << std::endl;
	Vector2 point1;
	Vector2 point2(2, 3);
	std::cout << "メイン関数を抜けました" << std::endl;
}
```


## vol_6課題(コンソール)

```cpp
#include <iostream>
#include <vector>

class MyClass {
public:
	int a;
	int b;

	MyClass(int _a, int _b) :
		a(_a),
		b(_b)
	{
	}
};

int main() {
	std::vector<MyClass> vec;

	for (int i = 0; i < 10; i++) {
		vec.emplace_back(MyClass(rand() % 10, rand() % 10));
	}

	for (auto iter = vec.begin(); iter < vec.end(); iter++) {
		std::cout << "(" << iter->a << ", " << iter->b << "), ";
	}

	std::cout << std::endl;

	auto iter = vec.begin();
	while (iter < vec.end()) {
		if (iter->a < iter->b) {
			iter = vec.erase(iter);
		}
		else iter++;
	}

	for (auto iter = vec.begin(); iter < vec.end(); iter++) {
		std::cout << "(" << iter->a << ", " << iter->b << "), ";
	}

	std::cout << std::endl;
}
```



## vol_7課題1(コンソール)

```cpp
#include <iostream>

int main() {

	auto twice = [](int x) {
		return x * 2;
	};

	int num = 3;
	
	std::cout << twice(num) << std::endl;

	return 0;
}
```

## vol_7課題2(コンソール)

```cpp
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
	std::vector<int> vec;
	
	// vectorに0から9の数を入れる
	for (int i = 0; i < 10; i++) {
		vec.emplace_back(i);
	}

	//表示
	for (auto i = vec.begin(); i < vec.end(); ++i) {
		std::cout << *i << " ";
	}
	std::cout << std::endl;

	// 2の倍数を後ろに詰め、削除
	auto rmvIter = std::remove_if(vec.begin(), vec.end(), 
		[](int i) {return i % 2 == 0; }
	);
	vec.erase(rmvIter, vec.end());

	//表示
	for (auto i = vec.begin(); i < vec.end(); ++i) {
		std::cout << *i << " ";
	}
	std::cout << std::endl;

	return 0;
}
```

## vol_7課題3(コンソール)

```cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <memory>

class MyClass {
public:
	int a;

	MyClass(int _a) :
		a(_a)
	{
	}
};


int main() {

	std::vector<MyClass> vec;

	for (int i = 0; i < 10; i++) {
		vec.emplace_back(MyClass(rand() % 10));
	}

	// vectorの中身を表示
	for (auto i = vec.begin(); i < vec.end(); i++) {
		std::cout << i->a << " ";
	}
	std::cout << std::endl;

	// vecの中から5以下のaを持つ要素を後ろに詰める
	auto rmvIter = std::remove_if(vec.begin(), vec.end(), [](const MyClass& ins) {
		return ins.a <= 5;
	});

	// 実際に削除
	vec.erase(rmvIter, vec.end());

	// vectorの中身を表示
	for (auto i = vec.begin(); i < vec.end(); i++) {
		std::cout << i->a << " ";
	}
	std::cout << std::endl;

	return 0;
}
```



## vol_10課題(コンソール)
```cpp
#include <iostream>
#include <vector>

class MyClass {
public:
	int a;

	MyClass(int _a) :
		a(_a)
	{
	}
};

int main() {
	std::vector<MyClass*> vec;

	// 適当な数でMyClassを追加
	for (int i = 0; i < 10; i++) {
		vec.emplace_back(new MyClass(rand() % 10));
	}

	// vectorの中身を表示
	for (const auto& i : vec) {
		std::cout << i->a << " ";
	}
	std::cout << std::endl;

	// 5以下の要素を削除
	auto it = vec.begin();
	while (it != vec.end()) {
		if ((*it)->a <= 5) {
			delete *it;
			it = vec.erase(it);
		}
		else {
			it++;
		}
	}

	// vectorの中身を表示
	for (const auto& i : vec) {
		std::cout << i->a << " ";
	}
	std::cout << std::endl;

	return 0;
}
```

## vol_11課題(コンソール)

```cpp
#include <iostream>
#include <vector>

class IAnimal {
public:
	double weight;//重さ

	IAnimal(int w) : weight(w) {

	}
	virtual ~IAnimal() = default;

	virtual void talk() {
		std::cout << "基底クラスのtalk関数が呼ばれました。 重さは:" << weight << std::endl;
	}

};

class Dog : public IAnimal {
public:
	Dog(int w) : IAnimal(w) {

	}

	~Dog() = default;

	void talk() override {
		std::cout << "わんわん　重さは:" << weight << std::endl;
	}
};

class Yojo : public IAnimal {
public:
	Yojo(int w) : IAnimal(w) {

	}

	~Yojo() = default;

	void talk() override {
		std::cout << "ふぇぇ…　重さは:" << weight << std::endl;
	}
};

class Cat : public IAnimal {
public:
	Cat(int w) : IAnimal(w) {

	}

	~Cat() = default;

	void talk() override {
		std::cout << "にゃー　重さは:" << weight << std::endl;
	}
};

int main() {
	std::vector<IAnimal*> animals;
	animals.emplace_back(new Dog(10));
	animals.emplace_back(new Yojo(20));
	animals.emplace_back(new Cat(30));
	
	for (const auto& animal : animals) {
		animal->talk();
	}

	return 0;
}
```


## Vol_12課題(コンソール)

```cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <memory>

class Vector2 {
public:
	int x, y;
	Vector2(int _x, int _y)
		:x(_x),
		y(_y)
	{
	}
	~Vector2() {
		std::cout << "Vector2のデストラクタが呼ばれました(x, y) = " 
			<< "(" << x << "," << y << ") " << std::endl;
	}
};

int main() {
	std::vector<std::shared_ptr<Vector2>> vec;

	// 適当な数でMyClassを追加
	for (int i = 0; i < 10; i++) {
		vec.emplace_back(std::make_shared<Vector2>(rand() % 10, rand() % 10));
	}

	// vectorの中身を表示
	for (const auto& i : vec) {
		std::cout << "(" << i->x << "," << i->y << ") ";
	}
	std::cout << std::endl;

	
	// x > yの要素を削除
	auto rmvIter = std::remove_if(vec.begin(), vec.end(), [](const std::shared_ptr<Vector2>& a) {
		return a->x > a->y;
	});
	vec.erase(rmvIter, vec.end());

	// vectorの中身を表示
	for (const auto& i : vec) {
		std::cout << "(" << i->x << "," << i->y << ") ";
	}
	std::cout << std::endl;

	return 0;
}
```

## リンク
[前の回-Vol.11 スマートポインタ・最終課題](http://qiita.com/yagiri000/items/6ffc155e41ebe740c598)

[初回-Vol.00 はじめに](http://qiita.com/yagiri000/items/22e3df60f60d38c0854d)