【C++】演習集1

注意: この記事は古い方針に基づいた内容であり、閲覧しないことを推奨します。学びたい人は [こちら](http://mikuroxina.github.io/cpp-book/) をどうぞ。

# はじめに

ここでは、C++ という言語に触れて
プログラミングを勉強する

この演習の流れとしては、

* 問題を解くためのいろんな概念を解説
* 覚えるためにまず手を動かす
* 覚えたことを応用する

をやっていくうちに、

パズルのような問題を解いたり
または自分でアプリを作るときに
プログラミングで解決できるようになれるかも

# プログラミングって何さ

これを作ること↓
「入力」→「システム」→「出力」

プログラミングという概念はまさにこれ

# Wandbox

ウェブで C++ が書けるサイト

三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ

まず最初は
このサイトの機能で用意したテンプレート上で
書いていってもらいます
問題が出る度にリンクがあるので解いてください

# 始まりの関数

## 関数

処理を書く場所で、
値を 0 つ以上受け取って
値を 0 ~ 1 つ返す

```cpp
// Like this!
int something(int v) { ~ }
// To explain ...
int // returns
something // named
(int v) // receives
{
  // function
}
```

まだ自分で関数を作るところまでは行かないから
詳しくは解説していないよ

## `int`

整数を表す型、いわば値の種類

```cpp
int v; // can have:
0;
1;
-3;
+2;
401;
24;
-314;
```

## `return`

関数から値を返す

```cpp
return;
return 1;
return 0;
```

## 例題 1

さぁ実際に書くよ
馬鹿らしくても必ず書いて

```cpp
auto echo_back(int val) {
  // val is parameter
  // Write here
  return 0;
}
```

[ここで関数を実装せよ](https://wandbox.org/permlink/373JXxLCWy1jGM6i)
値 `val` が入力される
これをそのまま返せ

ちなみにテスト用の
プログラムも仕込んである

### 解説

`return` に `val` と書くとこれを返せる

```cpp
auto echo_back(int val) {
  return val;
}
```

# 基本のアイテムたち

## 四則演算

それぞれ、

- 足し算
- 引き算
- 掛け算
- 割り算
- 剰余演算
- 括弧式

```cpp
a + b; // a plus b
a - b; // a minus b
a * b; // a times b
a / b; // a over b
a % b; // a mod b
a * (b + c); // with parenthesis
```

## 問 1

問に解説はありません
自力で解いて

```cpp
auto add(int a, int b) {
  // Write here
  return 0;
}
```

[ここで関数を実装せよ](https://wandbox.org/permlink/rPQE97SHoKyX1m1y)
値 `a` `b` が入力される
この和を返せ

## 問 2

```cpp
auto sum_1_to(int n) {
  // Write here
  return 0;
}
```

[ここで関数を実装せよ](https://wandbox.org/permlink/BaeyxAGo7FBEmpbm)
値 `n` が入力される
`1` から `n` の総和を返せ

計算式が分からなかったら検索してみよう
これ大事

## `double`

浮動小数点数 (小数に近いやつ) を表す値の種類

```cpp
double v;
// can have:
0.0;
1.;
-.3;
+2e0;
401e-8;
0.024e+5;
-3.14;
```

## 正負の演算子

`+` `-` で数に符号をつける

```cpp
double a;
+a; // 1 * a
-a; // -1 * a
```

## 問 3

```cpp
auto linear_eq(double a, double b) {
  // Write here
  return 0;
}

```

[ここで関数を実装せよ](https://wandbox.org/permlink/NrpgdfUlaCCmmDoE)
値 `a` `b` が入力される
`ax + b = 0` となる
`x` を返せ

式を `x` について変形してみよう

## `bool`

正しいか正しくないかを表す値の種類

```cpp
bool v;
// can only have:
true;
false;
```

## 比較演算

- 小さい
- 大きい
- 以下
- 以上
- 等しい
- 等しくない


```cpp
// They return bool
a < b; // a less b
a > b; // a greater b
a <= b; // a less-equal b
a >= b; // a greater-equal b
a == b; // a equal b
a != b; // a not-equal b
```

## 例題 2

```cpp
auto is_even(int val) {
  // Write here
  return false;
}
```

[ここで関数を実装せよ](https://wandbox.org/permlink/FMpXXR726i4OOgVi)
値 `val` が入力される
これが偶数かどうかを返せ

### 解説

`2` で割ったあまりが `0` になるのが偶数

演算子を繋げてこうする

```cpp
auto is_even(int val) {
  return val % 2 == 0;
}
```

## 問 4

```cpp
auto is_odd(int val) {
  // Write here
  return false;
}
```

[ここで関数を実装せよ](https://wandbox.org/permlink/wxpYBWL6d8xEDgsk)
値 `val` が入力される
これが奇数かどうかを返せ

負の数の剰余はマイナスになる可能性があることに注意
つまり、`val % 2 == 1` は不完全

## 論理演算

- OR (論理和)
- AND (論理積)
- NOT (論理否定)

```cpp
// They return bool
a || b; // a or b
a && b; // a and b
!a; // not a
true || false; // true
true && false; // false
!false; // true
```

## 例題 3

```cpp
auto is_leap(int year) {
  // Write here
  return false;
}
```

[ここで関数を実装せよ](https://wandbox.org/permlink/5DubvYQb3Oy73aJ6)
値 `year` が入力される
これが閏年かどうかを返せ
閏年とは、

1. 400 で割り切れる
2. 100 で割り切れず 4 で割り切れる

に当てはまる年のこと。

### 解説

OR と AND でそれぞれの条件をつなげます

```cpp
auto is_leap(int year) {
  return year % 400 == 0 // 1st condition
    || year % 100 != 0 && year % 4 == 0; // 2nd condition
}
```

# 分かれ道

## 分岐 `if`

```cpp
bool a;
if (a) {
  // when a is true
}
int b;
if (b < 5) {
  // when b less than 5
}
```

if (*真偽値*) { *処理* }

真偽値が `true` の時に
処理が実行される

## 分岐時の `return`

```cpp
bool a;
if (a) {
  // when a is true
  return;
  // this won’t run
}
// when a is false
return;
```

もともとそれ以降の処理は
実行されない

## 例題 4

```cpp
auto max(int a, int b) {
  // Write here
  return a;
}
```

[ここで関数を実装せよ](https://wandbox.org/permlink/Xn3aLFzfb6KDIlsy)
値 `a` `b` が入力される
このうち大きい方を返せ


### 解説

`a` より `b` が大きい時点で `b` を返せば、
あとのそれ以外の場合は `a` を返すだけです

```cpp
auto max(int a, int b) {
  if (a < b) { return b; }
  return a;
}
```

## 問 5

```cpp
auto negative(int a, int b) {
  // Write here
  return a;
}
```

[ここで関数を実装せよ](https://wandbox.org/permlink/RdasS0VbnOd4MzGN)
値 `a` が入力される
正の数なら負に、負の数ならそのまま返せ

# しめくくり

**お疲れ様！**

次回はもっとたくさんの処理を扱って、

「たくさんの入力」→「それぞれを加工するシステム」→「出力」

を実装するよ

次回もよしなに