Skip to content
20 changes: 16 additions & 4 deletions docs/text/chapter-1/practice/hello-shell.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,11 @@ cat index.txt

:::

::: spoiler hint 1
### ヒント

::: info ヒント1

::: spoiler クリックして展開

ファイルの検索は `find` コマンドを使います。 `man find` で find コマンドについて調べることができます。ただし英語。

Expand All @@ -81,20 +85,28 @@ cat index.txt

:::

::: spoiler hint 2
::: info ヒント2

::: spoiler クリックして展開

`find . -name [探したいファイル]` で調べられます。 `*` を使うと、曖昧検索ができます。 `code-*` と書くと、 `code-` で始まるファイルを検索できます。

:::

::: spoiler hint 3
::: info ヒント3

::: spoiler クリックして展開

- `find . -name '*.txt'` でファイルを見つけることができます。
- `cat [FILE]` でファイルを開くことができます。 `TAB` キーを押すと、候補を選んでくれます。

:::

::: spoiler answer
### 解答

::: tip 解答

::: spoiler クリックして展開

`cat 6db1b5a2e7/08dc869896/memo.txt` でファイルを開いてみましょう。

Expand Down
52 changes: 46 additions & 6 deletions docs/text/chapter-2/practice/4bit.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,65 @@

入力から$0 <= n < 16$の整数値を受け取り、2進数で表記しよう。

:::spoiler Hint 1
int型では、`5 / 3`は`1`になる。
### 入力/出力例

::: details 例1

**入力**

```
9
```

**出力**

```
1001
```

:::

:::spoiler Hint 2
::: details 例2

**入力**

```
13
```

**出力**

```
1101
```

:::

### ヒント

::: details ヒント1
`int`型では、`5 / 3`は`1`になる。

:::

::: details ヒント2
整数型の余りは`%`で得ることができる。

:::

:::spoiler Hint 3
::: details ヒント3
1桁ずつ出力してみよう。
:::

:::spoiler Hint 4
::: details ヒント4
$\displaystyle\left\lfloor\frac{n}{2^k}\right\rfloor$を2進数表記すると、$n$の2進数表記の$k+1$桁目以上を得ることができる。
:::

:::spoiler Answer
### 解答例

::: tip 解答例1

::: spoiler クリックして展開
```cpp
#include <iostream>
using namespace std;
Expand Down
30 changes: 27 additions & 3 deletions docs/text/chapter-2/practice/multiplication.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,39 @@

cinでint型の整数を2つ受け取って、その積をターミナルに出力しよう。

:::spoiler Hint 1
### 入力/出力例

::: details 例1

**入力**

```
3 4
```

**出力**

```
12
```

:::

### ヒント

::: details ヒント1

2つの値を入力から受け取るには、
```cpp
cin >> first_value >> second_value;
```

:::

:::spoiler Answer
### 解答例

::: tip 解答例1

::: spoiler クリックして展開

```cpp
#include <iostream>
Expand Down
59 changes: 51 additions & 8 deletions docs/text/chapter-2/practice/sum.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,68 @@

cin で自然数 $n$ を受け取って、$1$ から $n$ までの和を出力するプログラムを作成してください。

例えば `10` を受け取ったとき、 1+2+3+4+5+6+7+8+9+10 を計算して `55` を出力できれば OK です。
### 入力/出力例

::: details 例1

**入力**

```
10
```

**出力**

```
55
```

> $1+2+3+4+5+6+7+8+9+10$ を計算します。

::: spoiler Hint 1
今までの知識で解けるはず。手で計算する時、わざわざ足していますか?
:::

::: spoiler Hint 2
::: details 例2

**入力**

```
100
```

**出力**

```
5050
```

> $1+2+ \dots + 100$ を計算します。

:::

### ヒント

::: details ヒント1

実際に計算する際にどのような手順で行うかを考えてみましょう。100までの総和などは1つずつ足していくのではなく、なんらかの方法でもっと簡単に求めていたはずです。
:::

::: details ヒント2

総和を求める公式は $\dfrac{1}{2} n (n+1)$ でした。
:::

::: spoiler Hint 3 (なぜか計算が合わない人)
プログラムにおいては、計算は左から順番に行われ、途中計算は必ず int 型(=整数)に切り捨てられます。
::: details ヒント3 (なぜか計算が合わない人へ)

つまり、最初に `1/2` と書くとそこで 0 になってしまいます。
プログラムにおいては、計算は左から順番に行われ、途中計算は必ず `int` 型(=整数)に切り捨てられます。つまり、最初に `1/2` と書くとそこで 0 になってしまいます。

計算の順序を工夫する必要がありそうです。
:::

::: spoiler Answer
### 解答例

::: tip 解答例1

::: spoiler クリックして展開

```cpp
#include <iostream>
Expand Down
53 changes: 45 additions & 8 deletions docs/text/chapter-3/practice/de-morgans-laws.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 3-B2. De Morgan's laws

`bool`型の値`P`、`Q`が与えられるので、ド・モルガンの法則が成り立つことを実際に確かめよう。
`bool`型の値`P`、`Q`から、論理演算子(`!`, `&&`, `||`)を用いてド・モルガンの法則が成り立つことを実際に確かめよう。

::: tip ド・モルガンの法則

Expand All @@ -10,31 +10,68 @@ $\lnot(P \lor Q) \Leftrightarrow \lnot P \land \lnot Q$

:::

### 入力/出力例

:::spoiler Hint
考えられる$P,Q$の組は以下の4つ
以下の例では上のド・モルガンの法則の式の1つ目を`case 1`、2つ目を`case 2`としてコード内でチェックを行い、左辺と右辺の結果が一致している場合は`ok`と出力します。

| (P,Q) | P = false | P = true |
| --- | --- | --- |
| Q = false | (false, false) | (true, false) |
| Q = true | (false, true) | (true, true) |
::: details 例1

**入力**

```
true false
```

**出力**

```
case 1: ok
case 2: ok
```

:::

### ヒント

::: details ヒント1
PとQが文字列として与えられるため、まずは`string`型で入力を受け取り、その値をチェックして`bool`型に変換しましょう。`==`演算子を用いればできるはず。
:::

:::spoiler Answer
::: details ヒント2
受け取った文字列を比較し、`"true"`と比較した結果を`bool`型の変数に代入しましょう。

```cpp
bool p = p_string == "true";
```

`==`などの演算子も結果が`bool`型になるだけで、本質的には`+`などの演算と変わりありません。そのため、`if`文の条件などに使用するだけでなく、このようにして変数に結果を格納することも可能です。
:::

### 解答例

::: tip 解答例1

::: spoiler クリックして展開

```cpp
#include <iostream>
using namespace std;

int main() {
// 入力をstringとして受け取る
string p_string, q_string;
cin >> p_string >> q_string;

// 文字列が"true"かどうかをチェックし、bool型としてPとQを格納
bool p = p_string == "true";
bool q = q_string == "true";

// case 1
if (!(p && q) == (!p || !q)) {
cout << "case 1: ok" << endl;
}

// case 2
if (!(p || q) == (!p && !q)) {
cout << "case 2: ok" << endl;
}
Expand Down
34 changes: 30 additions & 4 deletions docs/text/chapter-3/practice/echo.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,36 @@

入力から単語を1つ受け取り、それを出力しよう。

:::spoiler Hint 1
### 入力/出力例

::: details 例1

**入力**

```
Hello!
```

**出力**

```
Hello!
```

:::

### ヒント

::: details ヒント1

文字列型の変数を使うには、
```cpp
string s;
```
:::

:::spoiler Hint 2
::: details ヒント2

もしもこんなエラーが出たとしたら、
```
./Main.cpp:4:5: error: unknown type name 'string'; did you mean 'std::string'?
Expand All @@ -24,12 +46,16 @@ using namespace std;
で、`std::`を省略できるようにしよう。
:::

:::spoiler Hint 3
::: details ヒント3

入力を受け取るには`cin`を、出力するには`cout`を使おう。
:::

### 解答例

::: tip 解答例1

:::spoiler Answer
::: spoiler クリックして展開

```cpp
#include <iostream>
Expand Down
Loading