Skip to content

Commit 7ee2af0

Browse files
authored
演習問題ページの改善 (#39)
* 演習問題ページの改善 (chapter-2/practice) * 演習問題ページの改善 (chapter-3/practice) * 例のナンバリングのミスを修正 * 演習問題ページの改善 (chapter-4/practice) * 演習問題ページの改善 (chapter-5/practice) * 演習問題ページの改善 (chapter-6/practice) * 演習問題ページの改善 (chapter-7, 8/practice) * 演習問題ページの改善 (chapter-1/practice) * tip -> details, danger -> tipに変更
1 parent 95a9f75 commit 7ee2af0

18 files changed

Lines changed: 577 additions & 104 deletions

File tree

docs/text/chapter-1/practice/hello-shell.md

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,11 @@ cat index.txt
7171

7272
:::
7373

74-
::: spoiler hint 1
74+
### ヒント
75+
76+
::: info ヒント1
77+
78+
::: spoiler クリックして展開
7579

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

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

8286
:::
8387

84-
::: spoiler hint 2
88+
::: info ヒント2
89+
90+
::: spoiler クリックして展開
8591

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

8894
:::
8995

90-
::: spoiler hint 3
96+
::: info ヒント3
97+
98+
::: spoiler クリックして展開
9199

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

95103
:::
96104

97-
::: spoiler answer
105+
### 解答
106+
107+
::: tip 解答
108+
109+
::: spoiler クリックして展開
98110

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

docs/text/chapter-2/practice/4bit.md

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,65 @@
22

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

5-
:::spoiler Hint 1
6-
int型では、`5 / 3``1`になる。
5+
### 入力/出力例
6+
7+
::: details 例1
8+
9+
**入力**
10+
11+
```
12+
9
13+
```
14+
15+
**出力**
16+
17+
```
18+
1001
19+
```
720

821
:::
922

10-
:::spoiler Hint 2
23+
::: details 例2
24+
25+
**入力**
26+
27+
```
28+
13
29+
```
30+
31+
**出力**
32+
33+
```
34+
1101
35+
```
36+
37+
:::
38+
39+
### ヒント
40+
41+
::: details ヒント1
42+
`int`型では、`5 / 3``1`になる。
43+
44+
:::
45+
46+
::: details ヒント2
1147
整数型の余りは`%`で得ることができる。
1248

1349
:::
1450

15-
:::spoiler Hint 3
51+
::: details ヒント3
1652
1桁ずつ出力してみよう。
1753
:::
1854

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

23-
:::spoiler Answer
59+
### 解答例
60+
61+
::: tip 解答例1
62+
63+
::: spoiler クリックして展開
2464
```cpp
2565
#include <iostream>
2666
using namespace std;

docs/text/chapter-2/practice/multiplication.md

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,39 @@
22

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

5-
:::spoiler Hint 1
5+
### 入力/出力例
6+
7+
::: details 例1
8+
9+
**入力**
10+
11+
```
12+
3 4
13+
```
14+
15+
**出力**
16+
17+
```
18+
12
19+
```
20+
21+
:::
22+
23+
### ヒント
24+
25+
::: details ヒント1
26+
627
2つの値を入力から受け取るには、
728
```cpp
829
cin >> first_value >> second_value;
930
```
10-
1131
:::
1232

13-
:::spoiler Answer
33+
### 解答例
34+
35+
::: tip 解答例1
36+
37+
::: spoiler クリックして展開
1438

1539
```cpp
1640
#include <iostream>

docs/text/chapter-2/practice/sum.md

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,68 @@
22

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

5-
例えば `10` を受け取ったとき、 1+2+3+4+5+6+7+8+9+10 を計算して `55` を出力できれば OK です。
5+
### 入力/出力例
6+
7+
::: details 例1
8+
9+
**入力**
10+
11+
```
12+
10
13+
```
14+
15+
**出力**
16+
17+
```
18+
55
19+
```
20+
21+
> $1+2+3+4+5+6+7+8+9+10$ を計算します。
622
7-
::: spoiler Hint 1
8-
今までの知識で解けるはず。手で計算する時、わざわざ足していますか?
923
:::
1024

11-
::: spoiler Hint 2
25+
::: details 例2
26+
27+
**入力**
28+
29+
```
30+
100
31+
```
32+
33+
**出力**
34+
35+
```
36+
5050
37+
```
38+
39+
> $1+2+ \dots + 100$ を計算します。
40+
41+
:::
42+
43+
### ヒント
44+
45+
::: details ヒント1
46+
47+
実際に計算する際にどのような手順で行うかを考えてみましょう。100までの総和などは1つずつ足していくのではなく、なんらかの方法でもっと簡単に求めていたはずです。
48+
:::
49+
50+
::: details ヒント2
51+
1252
総和を求める公式は $\dfrac{1}{2} n (n+1)$ でした。
1353
:::
1454

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

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

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

23-
::: spoiler Answer
62+
### 解答例
63+
64+
::: tip 解答例1
65+
66+
::: spoiler クリックして展開
2467

2568
```cpp
2669
#include <iostream>

docs/text/chapter-3/practice/de-morgans-laws.md

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 3-B2. De Morgan's laws
22

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

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

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

1111
:::
1212

13+
### 入力/出力例
1314

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

17-
| (P,Q) | P = false | P = true |
18-
| --- | --- | --- |
19-
| Q = false | (false, false) | (true, false) |
20-
| Q = true | (false, true) | (true, true) |
17+
::: details 例1
2118

19+
**入力**
20+
21+
```
22+
true false
23+
```
24+
25+
**出力**
26+
27+
```
28+
case 1: ok
29+
case 2: ok
30+
```
31+
32+
:::
33+
34+
### ヒント
35+
36+
::: details ヒント1
37+
PとQが文字列として与えられるため、まずは`string`型で入力を受け取り、その値をチェックして`bool`型に変換しましょう。`==`演算子を用いればできるはず。
2238
:::
2339

24-
:::spoiler Answer
40+
::: details ヒント2
41+
受け取った文字列を比較し、`"true"`と比較した結果を`bool`型の変数に代入しましょう。
42+
43+
```cpp
44+
bool p = p_string == "true";
45+
```
46+
47+
`==`などの演算子も結果が`bool`型になるだけで、本質的には`+`などの演算と変わりありません。そのため、`if`文の条件などに使用するだけでなく、このようにして変数に結果を格納することも可能です。
48+
:::
49+
50+
### 解答例
51+
52+
::: tip 解答例1
53+
54+
::: spoiler クリックして展開
2555

2656
```cpp
2757
#include <iostream>
2858
using namespace std;
2959

3060
int main() {
61+
// 入力をstringとして受け取る
3162
string p_string, q_string;
3263
cin >> p_string >> q_string;
64+
65+
// 文字列が"true"かどうかをチェックし、bool型としてPとQを格納
3366
bool p = p_string == "true";
3467
bool q = q_string == "true";
68+
69+
// case 1
3570
if (!(p && q) == (!p || !q)) {
3671
cout << "case 1: ok" << endl;
3772
}
73+
74+
// case 2
3875
if (!(p || q) == (!p && !q)) {
3976
cout << "case 2: ok" << endl;
4077
}

docs/text/chapter-3/practice/echo.md

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,36 @@
22

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

5-
:::spoiler Hint 1
5+
### 入力/出力例
6+
7+
::: details 例1
8+
9+
**入力**
10+
11+
```
12+
Hello!
13+
```
14+
15+
**出力**
16+
17+
```
18+
Hello!
19+
```
20+
21+
:::
22+
23+
### ヒント
24+
25+
::: details ヒント1
26+
627
文字列型の変数を使うには、
728
```cpp
829
string s;
930
```
1031
:::
1132

12-
:::spoiler Hint 2
33+
::: details ヒント2
34+
1335
もしもこんなエラーが出たとしたら、
1436
```
1537
./Main.cpp:4:5: error: unknown type name 'string'; did you mean 'std::string'?
@@ -24,12 +46,16 @@ using namespace std;
2446
で、`std::`を省略できるようにしよう。
2547
:::
2648

27-
:::spoiler Hint 3
49+
::: details ヒント3
50+
2851
入力を受け取るには`cin`を、出力するには`cout`を使おう。
2952
:::
3053

54+
### 解答例
55+
56+
::: tip 解答例1
3157

32-
:::spoiler Answer
58+
::: spoiler クリックして展開
3359

3460
```cpp
3561
#include <iostream>

0 commit comments

Comments
 (0)