Skip to content

Commit 9bf5d0a

Browse files
committed
第6章の修正
1 parent 9be1d98 commit 9bf5d0a

14 files changed

Lines changed: 455 additions & 103 deletions

File tree

docs/.vitepress/config.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,25 @@ export default withMermaid({
137137
],
138138
},
139139
{
140-
text: "[WIP] 6. 繰り返し処理",
140+
text: "6. 繰り返し処理",
141141
link: "/cpp/chapter-6/",
142142
items: [
143-
{ text: "[WIP] 6.1 for文", link: "/cpp/chapter-6/1" },
144-
{ text: "[WIP] 6.2 while文", link: "/cpp/chapter-6/2" },
145-
{ text: "[WIP] 6.3 配列", link: "/cpp/chapter-6/3" },
146-
{ text: "[WIP] 6.4 string型②とchar型", link: "/cpp/chapter-6/4" },
147-
{ text: "[WIP] 6.5 continueとbreak", link: "/cpp/chapter-6/5" },
143+
{ text: "6.1 for文", link: "/cpp/chapter-6/1" },
144+
{ text: "6.2 while文", link: "/cpp/chapter-6/2" },
145+
{ text: "6.3 配列", link: "/cpp/chapter-6/3" },
146+
{ text: "6.4 string型②とchar型", link: "/cpp/chapter-6/4" },
147+
{ text: "6.5 continueとbreak", link: "/cpp/chapter-6/5" },
148+
{
149+
text: "6.Q 練習問題",
150+
link: "/cpp/chapter-6/problems/",
151+
collapsed: true,
152+
items: [
153+
{ text: "Fibonatti", link: "/cpp/chapter-6/problems/fibonatti" },
154+
{ text: "DO NOT FAIL", link: "/cpp/chapter-6/problems/do-not-fail" },
155+
{ text: "lower or UPPER", link: "/cpp/chapter-6/problems/lower-or-upper" },
156+
{ text: "fizz-buzz 2D", link: "/cpp/chapter-6/problems/fizz-buzz-2d" },
157+
],
158+
},
148159
],
149160
},
150161
{

docs/cpp/chapter-6/1.md

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# [WIP] 6.1 for文
1+
# 6.1 for文
22

3-
繰り返しの処理 `for` は以下のように記述する。
3+
繰り返しの処理`for`は以下のように記述する。
44

55
```cpp:line-numbers
66
for (int i=0; i<5; i++) {
@@ -17,9 +17,9 @@ for (int i=0; i<5; i++) {
1717
4
1818
```
1919

20-
新しい演算`++` が出ているが、これは **変数の値を1増やす** という演算である。 `i = i+1;` と同値。
20+
新しい演算`++`が出ているが、これは**変数の値を1増やす**という演算である。`i = i+1;`と同値。
2121

22-
for 文がどのように動作しているかを解説すると`for` の後に `;` 区切りで 3 つ情報を指定している
22+
for文がどのように動作しているかを解説すると`for`の後に`;`区切りで3つ情報を指定している
2323

2424
```cpp
2525
for ([初期化];[条件];[継続処理]) {
@@ -49,4 +49,35 @@ flowchart LR
4949
cond --> |No| e["End"]
5050
```
5151

52-
つまり、0,1,2,3,4 の整数を出力するプログラムである。これを使えば、例えば $7^4$ 等がプログラムで計算できる。
52+
つまり、0,1,2,3,4の整数を出力するプログラムである。これを使えば、例えば$7^4$等がプログラムで計算できる。
53+
54+
## 6.1.1. 多重ループ
55+
56+
```cpp:line-numbers
57+
for (int i=0; i<2; i++) {
58+
for (int j=0; j<3; j++) {
59+
cout << i << " " << j << endl;
60+
}
61+
}
62+
```
63+
64+
```
65+
[output]
66+
0 0
67+
0 1
68+
0 2
69+
1 0
70+
1 1
71+
1 2
72+
```
73+
74+
for文の内側に更にfor文を書いて、二重forを書くことができる。
75+
また、配列の配列という形で二次元配列を作ることもできる。(オセロ盤みたいなイメージ)
76+
77+
```cpp:line-numbers
78+
vector<vector<int>> v = {
79+
{1, 2, 3, 4},
80+
{3, 5, 1, 2},
81+
{10, 20, 10, 20},
82+
};
83+
```

docs/cpp/chapter-6/2.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# [WIP] 6.2 while文
1+
# 6.2 while文
22

33
```cpp:line-numbers
44
int a = 10;
@@ -8,9 +8,9 @@ while (a > 0) {
88
}
99
```
1010

11-
while文は、 `while` の中の条件文が真の間実行される繰り返し処理。
11+
while文は、`while`の中の条件文が真の間実行される繰り返し処理。
1212

13-
上記のコードだと、 10,9,8,7,6,5,4,3,2,1 と順に出力される
13+
上記のコードだと、10,9,8,7,6,5,4,3,2,1と順に出力される
1414

1515
```mermaid
1616
flowchart LR

docs/cpp/chapter-6/3.md

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
# [WIP] 6.3 配列
1+
# 6.3 配列
22

33
プログラミングでは、同じ様な変数を複数作りたいときがある。例えば、100人の点数の平均点を取りたい時に変数は100個必要となる。このときに、配列を使う。
44

55
配列とは、変数の集合のようなものである。
66

7-
C++ において配列を使う時は、`vector` を用いる。`string` と同様にして、`vector`をインクルードする。
7+
C++において配列を使う時は、`vector`を用いる。`string`と同様にして、`vector`をインクルードする。
88

99
```cpp:line-numbers
1010
#include <vector>
@@ -23,8 +23,7 @@ vector<string> strarray;
2323
vector<int> arr = {10, 20, 30, 40, 50};
2424
```
2525

26-
以下のように、 `[]` の中に数字を書くことで要素を取得できる。数列を考えた時の $a_i$ の $i$ だと思うと良い。この時要素番号は*
27-
*0始まり**である。
26+
以下のように、`[]`の中に数字を書くことで要素を取得できる。数列を考えた時の$a_i$の$i$だと思うと良い。この時要素番号は**0始まり**である。
2827

2928
```cpp:line-numbers
3029
vector<int> arr = {10, 20, 30, 40, 50};
@@ -39,7 +38,7 @@ cout << arr[1] << endl;
3938
100
4039
```
4140

42-
`.size()` とすると、配列の要素数を調べることができる。
41+
`.size()`とすると、配列の要素数を調べることができる。
4342

4443
```cpp:line-numbers
4544
vector<int> arr = {10, 20, 30, 40, 50};
@@ -52,7 +51,7 @@ cout << siz << endl;
5251
5
5352
```
5453

55-
これと、`for` を用いれば、配列の要素を全て取得することができる。
54+
これと、`for`を用いれば、配列の要素を全て取得することができる。
5655

5756
```cpp:line-numbers
5857
vector<int> arr = {10, 20, 30, 40, 50};
@@ -61,10 +60,9 @@ for (int i=0; i < arr.size(); i++) {
6160
}
6261
```
6362

64-
`for` 文の中で、 `arr[0]` から `arr[4]` までが1つずつ出力されるコードだという事が理解できるだろうか。`i < arr.size()`
65-
の条件から、`i` は 0 から 4 までの場合で実行される。(5 は `5 < 5` となり条件を満たさない。)
63+
`for`文の中で、`arr[0]`から`arr[4]`までが1つずつ出力されるコードだという事が理解できるだろうか。`i < arr.size()`の条件から、`i`は0から4までの場合で実行される。(5は`5 < 5`となり条件を満たさない。)
6664

67-
`.push_back()` を用いると、配列の末尾に新しい要素を追加することができる。
65+
`.push_back()`を用いると、配列の末尾に新しい要素を追加することができる。
6866

6967
```cpp:line-numbers
7068
vector<int> arr = {10, 20, 30, 40, 50};
@@ -81,4 +79,3 @@ cout << arr.size() << endl;
8179
```
8280

8381
for文と組み合わせると、できる事が非常に広がる。
84-

docs/cpp/chapter-6/4.md

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# [WIP] 6.4 string型②とchar型
1+
# 6.4 string型②とchar型
22

3-
string は、実際には文字の配列であると捉えると、文字列に対する操作を行うことができる。
3+
stringは、実際には文字の配列であると捉えると、文字列に対する操作を行うことができる。
44

55
一度、アルファベットと数字・一部の記号だけ、いわゆる「**1バイト文字**」のみで考えよう。ひらがなやカタカナについては後で説明する。
66

@@ -22,24 +22,24 @@ for (int i=0; i<s.size(); i++) {
2222

2323
## 6.4.1. バイト・ビット
2424

25-
**ビット**(bit) は、1ビットは `0``1` かの情報のみを持つ。
25+
**ビット**(bit) は、1ビットは`0``1`かの情報のみを持つ。
2626

2727
**バイト**(Byte) は、パソコンが一般的に処理するデータの単位。基本的に 8bit = 1Byte。
2828
よくスマホの通信量とかの「キロバイト」等のバイトはこれを指している。
2929

30-
8bit なので、1バイトで扱える情報は `0` から `255` の256($=2^8$)種類である。
30+
8bitなので、1バイトで扱える情報は`0`から`255`の256($=2^8$)種類である。
3131

3232
## 6.4.2. char 型
3333

34-
文字1文字を扱う時は、 `char` 型を用いる。
34+
文字1文字を扱う時は、`char`型を用いる。
3535

3636
```cpp:line-numbers
3737
string s = "Hello";
3838
char c = s[1];
3939
cout << c << endl; // output: e
4040
```
4141

42-
1文字を扱う時は、`''` **シングル**クォーテーション)で囲う。
42+
1文字を扱う時は、`''`**シングル**クォーテーション)で囲う。
4343

4444
```cpp:line-numbers
4545
string s = "traP";
@@ -50,18 +50,18 @@ cout << s << endl; // output: traQ
5050

5151
## 6.4.3. ASCII
5252

53-
各文字には、文字コード(ASCIIコード)と呼ばれる番号が定められていて、内部的に char 型には数値が格納されている。
53+
各文字には、文字コード(ASCIIコード)と呼ばれる番号が定められていて、内部的に`char`型には数値が格納されている。
5454

5555
```cpp:line-numbers
5656
char c = 'e';
5757
int a = c;
5858
cout << a << endl; // output: 101
5959
```
6060

61-
ASCII コード表https://e-words.jp/p/r-ascii.html
61+
ASCIIコード表https://e-words.jp/p/r-ascii.html
6262
ここで、アルファベットは順番に並んでいるという事実は覚えておくと良い。
6363

64-
逆に、char に数値を代入によって文字を代入することもできる
64+
逆に、charに数値を代入によって文字を代入することもできる
6565

6666
```cpp:line-numbers
6767
char c = 81;
@@ -70,19 +70,19 @@ cout << c << endl; // output: Q
7070

7171
## 6.4.4. 文字の比較
7272

73-
4.4.3. によれば、1文字1文字は、実際は数値として扱われているのであった。よって、数値と同じように扱えるということは、以下のように比較できるということである。
73+
6.4.3.によれば、1文字1文字は、実際は数値として扱われているのであった。よって、数値と同じように扱えるということは、以下のように比較できるということである。
7474

7575
```cpp:line-numbers
7676
cout << ('A' < 'B') << endl;
7777
```
7878

7979
ここで、アルファベットはASCIIコード上で順番に並んでいるということを思い返すと、
80-
`('A' <= x && x <= 'Z')` で「文字$x$が大文字アルファベットかどうか」が判定できる。
81-
更にこれと for 文をうまく使えば、(アルファベットの)辞書順でどちらが先かを実装することができるだろう。
80+
`('A' <= x && x <= 'Z')`で「文字$x$が大文字アルファベットかどうか」が判定できる。
81+
更にこれとfor文をうまく使えば、(アルファベットの)辞書順でどちらが先かを実装することができるだろう。
8282

8383
::: tip
8484

85-
実際には、文字列の辞書順で先かどうかは、`<` `>` の不等号演算子で簡単に実装できる。
85+
実際には、文字列の辞書順で先かどうかは、`<``>`の不等号演算子で簡単に実装できる。
8686

8787
```cpp:line-numbers
8888
string s = "Hello";
@@ -95,7 +95,7 @@ cout << (s < t) << endl;
9595
0
9696
```
9797

98-
string 型同士で比較するときに、1文字目を比較→同じなら2文字目を比較→… という処理を行って比較されている。
98+
string型同士で比較するときに、1文字目を比較→同じなら2文字目を比較→… という処理を行って比較されている。
9999

100100
:::
101101

@@ -107,11 +107,10 @@ string 型同士で比較するときに、1文字目を比較→同じなら2
107107

108108
ところで、ASCIIコード表には日本語特有の文字(ひらがな・カタカナ・漢字)が存在しないことに気づくだろうか。
109109

110-
これは1バイトで扱える情報が 256 通りしかないから、日本語は1バイトだけでは扱うことができない。
110+
これは1バイトで扱える情報が256通りしかないから、日本語は1バイトだけでは扱うことができない。
111111
それゆえ、日本語(ひらがなカタカナ等)はマルチバイト文字で表現されている(複数バイトで1文字を表す方式)。
112112

113-
ここで、`char` 型は、正確には「1バイトの整数型」である。よって、`char`
114-
型ではひらがな等の字を扱うことができない。実際に試してみると、5文字なのに長さは15と表示されてしまうし、1文字目を出力してみようと思ってもうまく出力されない。例えば「こ」の場合は、3文字出力してようやく「こ」が表示されるのである。
113+
ここで、`char`型は、正確には「1バイトの整数型」である。よって、`char`型ではひらがな等の字を扱うことができない。実際に試してみると、5文字なのに長さは15と表示されてしまうし、1文字目を出力してみようと思ってもうまく出力されない。例えば「こ」の場合は、3文字出力してようやく「こ」が表示されるのである。
115114

116115
```cpp:line-numbers
117116
string dame = "こんにちは";
@@ -128,7 +127,7 @@ cout << dame[0] << dame[1] << dame[2] << endl;
128127
```
129128

130129
多バイト文字を扱える型も存在するが、非常に扱いが面倒なのでここでは扱わない。
131-
C++ 以外の言語でも大体は文字列を扱えるが、マルチバイト文字に対する扱いは言語によってまちまちだったりするので、よく調べること。
130+
C++以外の言語でも大体は文字列を扱えるが、マルチバイト文字に対する扱いは言語によってまちまちだったりするので、よく調べること。
132131

133132
::: tip
134133

@@ -138,15 +137,15 @@ C++ 以外の言語でも大体は文字列を扱えるが、マルチバイト
138137

139138
**歴史的な経緯**
140139

141-
ASCII では日本語文字を扱えないのは明らかだったので、1文字で2バイトを使う文字コード体系が考案された。2バイトであれば
142-
$2^{16}=65536$ 文字を扱えるので、これだけあれば十分だという事である。
140+
ASCIIでは日本語文字を扱えないのは明らかだったので、1文字で2バイトを使う文字コード体系が考案された。2バイトであれば
141+
$2^{16}=65536$文字を扱えるので、これだけあれば十分だという事である。
143142
しかし、結果としては国内で文字コードが乱立し(Shift-JIS, EUC-JP
144143
等…)、様々衝突するようになった上、国内にとどまらず各国で独自の文字コードが作成されてしまい、混乱を極めてしまったのである(ASCII
145144
で表せないのは日本語だけではなく、アラビア文字・簡体字・ギリシャ文字など様々…)。
146145

147146
最終的には、世界の全文字を扱う文字コードとして Unicode (≒ UTF-8)
148-
が策定され、今日ではこれが普及している。しかし完全に普及している訳でもなく、よって、今日見かける文字化けはもっぱら「UTF-8 か
149-
UTF-8 以外か」の文字コードを使って発生しているパターンである。
147+
が策定され、今日ではこれが普及している。しかし完全に普及している訳でもなく、よって、今日見かける文字化けはもっぱら「UTF-8か
148+
UTF-8以外か」の文字コードを使って発生しているパターンである。
150149

151150
**CJK 問題**
152151

@@ -160,7 +159,5 @@ UTF-8 以外か」の文字コードを使って発生しているパターン
160159
:::
161160

162161
::: tip
163-
`int` 型は 4バイトの整数型である。扱える情報は $2^{32}$ で、整数は負と正の値を取るから非負整数の部分にに $2^{31}$
164-
個を割り当てる。$2^{31}=2147483648
165-
$ なのだが、実はこの値は既にテキストで一度出現している。さてどこだろうか?
162+
`int`型は4バイトの整数型である。扱える情報は$2^{32}$で、整数は負と正の値を取るから非負整数の部分に$2^{31}$個を割り当てる。$2^{31}=2147483648$なのだが、実はこの値は既にテキストで一度出現している。さてどこだろうか?
166163
:::

docs/cpp/chapter-6/5.md

Lines changed: 2 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
# [WIP] 6.5 continueとbreak
1+
# 6.5 continueとbreak
22

33
## 6.5.1. break
44

5-
for文・while 文はbreakを用いて途中で終了して抜け出すことができる
5+
for文・while文はbreakを用いて途中で終了して抜け出すことができる
66

77
```cpp:line-numbers
88
vector<int> v = {1, 4, 0, 6, 10};
@@ -61,41 +61,3 @@ flowchart LR
6161
end
6262
cond --> |No| e["End"]
6363
```
64-
65-
## 6.5.3. 多重ループ
66-
67-
```cpp:line-numbers
68-
for (int i=0; i<2; i++) {
69-
for (int j=0; j<3; j++) {
70-
cout << i << " " << j << endl;
71-
}
72-
}
73-
```
74-
75-
```
76-
[output]
77-
0 0
78-
0 1
79-
0 2
80-
1 0
81-
1 1
82-
1 2
83-
```
84-
85-
for 文の内側に更に for 文を書いて、二重 for を書くことができる。
86-
また、配列の配列という形で二次元配列を作ることもできる。(オセロ盤みたいなイメージ)
87-
88-
```cpp:line-numbers
89-
vector<vector<int>> v = {
90-
{1, 2, 3, 4},
91-
{3, 5, 1, 2},
92-
{10, 20, 10, 20},
93-
};
94-
```
95-
96-
::: info
97-
[**\[ IV の練習問題へ\]**](https://md.trap.jp/IE4NUAc_RR-USMIXlevsgA#Section-IV)
98-
99-
[**\[講習会ページに戻る\]**](https://wiki.trap.jp/Event/welcome/23/lecture/pg-basic)
100-
:::
101-

docs/cpp/chapter-6/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# [WIP] 6. 繰り返し処理
1+
# 6. 繰り返し処理
22

33
第六章では、繰り返し処理について紹介します。
44
ここまで身につけてしまえば、とりあえず頭の中に思い浮かべたものは理論上は作れるようになります。

0 commit comments

Comments
 (0)