Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 14 additions & 17 deletions docs/.vitepress/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,6 @@ export default withMermaid({

sidebar: {
"/cpp/": [
{
text: "2025年度版テキスト",
link: "/text/chapter-0/",
},
{
text: "はじめに",
link: "/cpp/preface/",
Expand All @@ -47,8 +43,8 @@ export default withMermaid({
text: "1. 環境構築",
link: "/cpp/chapter-1/",
items: [
{ text: "1-A. Macの環境構築", link: "/cpp/chapter-1/1-A" },
{ text: "1-B. Windowsの環境構築", link: "/cpp/chapter-1/1-B" },
{ text: "1.1-A. Macの環境構築", link: "/cpp/chapter-1/1-A" },
{ text: "1.1-B. Windowsの環境構築", link: "/cpp/chapter-1/1-B" },
],
},
{
Expand All @@ -59,12 +55,12 @@ export default withMermaid({
{ text: "2.2 作業環境の構築", link: "/cpp/chapter-2/2" },
{ text: "2.3 はじめてのプログラミング", link: "/cpp/chapter-2/3" },
{
text: "練習問題",
text: "2.Q 練習問題",
link: "/cpp/chapter-2/problems/",
collapsed: true,
items: [
{
text: "2-Q1. Hello, Shell!",
text: "Hello, Shell!(★★★)",
link: "/cpp/chapter-2/problems/hello-shell",
},
],
Expand All @@ -75,28 +71,29 @@ export default withMermaid({
text: "3. 変数と入出力",
link: "/cpp/chapter-3/",
items: [
{ text: "3.1 Hello, traP! の解説", link: "/cpp/chapter-3/1" },
{ text: "3.1 Hello, traP!の解説", link: "/cpp/chapter-3/1" },
{ text: "3.2 int型変数", link: "/cpp/chapter-3/2" },
{ text: "3.3 標準入出力", link: "/cpp/chapter-3/3" },
{
text: "練習問題",
text: "3.Q 練習問題",
link: "/cpp/chapter-3/problems/",
collapsed: true,
items: [
{
text: "3-A1. Multiplication",
link: "/cpp/chapter-3/problems/multiplication",
},
{ text: "3-B1. 4bit", link: "/cpp/chapter-3/problems/4bit" },
{ text: "3-B2. Sum", link: "/cpp/chapter-3/problems/sum" },
{ text: "Multiplication(★☆☆)", link: "/cpp/chapter-3/problems/multiplication" },
{ text: "Sum of n(★★☆)", link: "/cpp/chapter-3/problems/sum-of-n" },
{ text: "4bit(★★☆)", link: "/cpp/chapter-3/problems/4bit" },
],
},
],
},
{
text: "2025年度版テキスト",
link: "/text/chapter-0/",
},
],
"/text/": [
{
text: "2026年度版テキスト [WIP]",
text: "[WIP] 2026年度版テキスト",
link: "/cpp/preface/",
},
{
Expand Down
4 changes: 4 additions & 0 deletions docs/.vitepress/theme/custom.css
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@ mjx-container.MathJax svg {
summary {
list-style-type: revert;
}

.vp-doc :not(pre) > code {
margin: 0 3px;
}
2 changes: 1 addition & 1 deletion docs/cpp/chapter-2/3.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ int main() {
4. 実行に成功すると、画面下部に「出力」と書かれた画面が出てきて、`Hello, traP!`と表示される。
5. プログラム中の`Hello, traP!`となっている部分を書き換えると出力が変わる。実際に試してみよう。

::: tip 2章のまとめ
::: tip 第2章のまとめ

- プログラミングとは、「コンピューターにどのような動作をさせるかを予め指示する行為」
- プログラムは、コンパイルして実行される
Expand Down
2 changes: 1 addition & 1 deletion docs/cpp/chapter-2/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ prev:
講習後に環境構築の続きをするようにお願いします。
:::

この章ではまず、「プログラミングとは何か」という話をした後に、第1章で作成した環境を使って、
この章ではまず、「プログラミングとは何か」という話をした後に、第1章で作成した環境を使って、プログラムを動かしてみよう。
2 changes: 1 addition & 1 deletion docs/cpp/chapter-2/problems/hello-shell.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 2-C1. Hello shell
# 2.Q Hello, Shell(★★★)

ターミナル (シェル) のファイルを検索するコマンド、 `find` コマンドで遊んでみましょう。

Expand Down
10 changes: 9 additions & 1 deletion docs/cpp/chapter-2/problems/index.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# 練習問題

- [2-C1. Hello, Shell!](hello-shell)
::: tip
練習問題の難易度は3段階に分かれています。

* ★☆☆:**できれば解いて理解して欲しい問題**です。とにかく手を動かしましょう。
* ★★☆:ぜひ解いて欲しいですが、解けなくても問題はありません。
* ★★★:ややトリッキーな問題が並んでいます。余裕があれば取り組んでみましょう。
:::

- [Hello, Shell!(★★★)](hello-shell)
200 changes: 115 additions & 85 deletions docs/cpp/chapter-3/1.md
Original file line number Diff line number Diff line change
@@ -1,152 +1,182 @@
# 3.1 Hello, traP! の解説
# 3.1 Hello, traP!の解説

おさらい:第1章のコード
## 3.1.1 全体像

<<<@/cpp/chapter-3/hello-world.cpp{cpp:line-numbers}
まずは、第2章の最後に登場したプログラムをおさらいしよう。

1行目から順に、まずは「用語」を説明していく。
新しい単語がどんどん出てくるが、単語の説明は 3.1.1. 以降で行う。今は単語を頭の片隅に入れておくレベルで良いだろう。
1行目から順に、まずは「用語」を説明していく。
新しい単語がどんどん出てくるが、単語の説明は3.1.2以降で行う。今は単語を頭の片隅に入れておくレベルで良いだろう。

```cpp:no-line-numbers
#include <iostream>
```
<<< @/cpp/chapter-3/Hello-traP.cpp{1 cpp:line-numbers}

`iostream` と呼ばれるファイルを「インクルード」している。
`iostream`と呼ばれるファイルを「**インクルード**」している。

```cpp:no-line-numbers
using namespace std;
```
<br>

`std::` を省略できるようにする。
<<< @/cpp/chapter-3/Hello-traP.cpp{2 cpp:line-numbers}

```cpp
int main() {
```
`std::`を省略できるようにする。

`main` という名前の「関数」を宣言している。
プログラムは、ここから実行される。
<br>

```cpp:no-line-numbers
cout << "Hello, traP!" << endl;
```
<<< @/cpp/chapter-3/Hello-traP.cpp{4 cpp:line-numbers}

コンソールに `Hello traP!` を出力する。
`"` で囲うのは、これが文字列なのか、命令なのかを区別するため。(`VSCode`を使っていれば `"Hello traP!"`
の部分だけ色分けされているはず。) `endl` についても 3.1.2. で解説する。
`main`という名前の「**関数**」を定義している。プログラムはここから実行される。

```cpp:no-line-numbers
// Hello, traP を出力する
```
<br>

コメントを書いている。
<<< @/cpp/chapter-3/Hello-traP.cpp{5 cpp:line-numbers}

```cpp:no-line-numbers
}
```
コンソールに`Hello, traP!`を「**出力**」する。

`"`で囲うのは、これが文字列なのか、命令なのかを区別するため。(VSCodeを使っていれば`"Hello, traP!"`の部分だけ色分けされているはず。)

`endl`については3.1.3で解説する。

<br>

<<< @/cpp/chapter-3/Hello-traP.cpp{6 cpp:line-numbers}

「**コメント**」を書いている。

<br>

<<< @/cpp/chapter-3/Hello-traP.cpp{7 cpp:line-numbers}

波括弧を閉じている。

## 3.1.1. コメント
## 3.1.2 コメント

<<<@/cpp/chapter-3/hello-world.cpp{6 cpp:line-numbers}
<<< @/cpp/chapter-3/Hello-traP.cpp{6 cpp:line-numbers}

`//` と書くと、その行の `//` 以降の部分はコメントになり、プログラム実行時には無視される
`//`と書くと、その行の`//`以降の部分はコメントとなる。すなわち、プログラム実行時には無視され、無いものとして扱われる

::: tip
プログラムの先頭に `//` を付けてコメントにする事をコメントアウトする、と呼ぶことがある。
プログラムの先頭に`//`を付けてコメントにする事をコメントアウトする、と呼ぶことがある。
:::

プログラムがどのような動作をするのか、どういう目的のプログラムなのか、を簡易的に記述すると良い。見たら分かるというレベルになれば、コメントを書く必要はない。
プログラムがどのような動作をするのか、どういう目的のプログラムなのか、を簡潔に記述すると良い。見たら分かるというレベルになれば、コメントを書く必要はない。

## 3.1.3 cout

<<< @/cpp/chapter-3/Hello-traP.cpp{5 cpp:line-numbers}

`cout`は値を出力するための仕組みである。`<<`を使って値を渡すと、その値が文字として画面に表示される。文字列を出力するときは、命令と区別するため、`"`で文字列を囲むようにする。

このプログラムを実行すると、ターミナルに次のように出力される。

## 3.1.2. cout
```Output:line-numbers
Hello, traP!
```

<<<@/cpp/chapter-3/hello-world.cpp{5}
(Code Runnerを使ってプログラムを実行すると、他にもいろいろなものが表示されるかもしれないが、今は気にしなくて良い。)

`cout` はコンソール(画面)に文字列を出力する命令である。C++特有の記法で、 `<<` が ← みたいなものだと考えると良い。`cout`
に向かって文字列を送信しているイメージ。複数つなげることもできる。(以下の例を参照)
`<<`は、複数つなげることもできる。例えば、以下のように書いても出力は変わらない。

```cpp:no-line-numbers
```cpp:line-numbers=4
cout << "Hello, " << "traP!" << endl;
```

また、`endl` は改行の命令を意味する
`endl`と書くと、出力は改行される。例えば、プログラムを次のように書き換えてみる

:::: tip エスケープシーケンス
```cpp:line-numbers=4
cout << "Hello, " << endl << "traP!" << endl;
```

出力に `"` を含めたい場合、 `cout << "Hello, "traP"!" << endl;` と記述してもコンパイルができない。これは `"Hello, "` で文字列が区切られてしまっているためである。
これを回避するために、(Windows: ¥ キー, Mac: Option (⌥) キーを推しながら ¥ キー) `\` という文字を使って `\"` と書くことで、 `"` を出力することができる。
このように `\` を使った文字の出力の仕方をエスケープシーケンスと呼ぶ。
すると、出力は次のように変わる。

```cpp:no-line-numbers
cout << "Hello, \"traP\"!" << endl; // output: Hello, "traP"!
```Output:line-numbers
Hello,
traP!
```

他にも以下 `Hello, \n traP!` のように文字列中に `\n` と書くと改行され、この場合は `"Hello, "`と`"traP!"` の間に改行が入る。
::: tip エスケープシーケンス

出力に`"`を含めたい場合、`cout << "Hello, "traP"!" << endl;`と記述してもコンパイルができない。これは`"Hello, "`で文字列が区切られてしまっているためである。
これを回避するために、`\`という文字を使って`\"`と書くことで、`"`を出力することができる。

このように`\`を使った文字の出力の仕方をエスケープシーケンスと呼ぶ。

``` cpp:no-line-numbers
`\`は、Windowsであれば`¥`キーを押すことで、Macであれば`Option(⌥)`キーを押しながら`¥`キーを押すことで入力できる。

```cpp:line-numbers=4
cout << "Hello, \"traP\"!" << endl; // 「Hello, "traP"!」と出力される
```

他にも`Hello, \ntraP!`のように文字列中に`\n`と書くと改行ができる。

``` cpp:line-numbers=4
cout << "Hello, \ntraP!" << endl;
```

```txt
[output]
この場合は`Hello, `と`traP!`の間に改行が入り、出力は以下のようになる。

```Output:line-numbers
Hello,
traP!
```

また、`\`を文字列内で使いたい場合は、`\\` と書く。
また、`\`を文字列内で使いたい場合は、`\\`と書く。文字列中では、`//`と書いてもコメントアウトされない

```cpp:no-line-numbers
cout << "\\\\ Hello, traP!! //" << endl;
```cpp:line-numbers=4
cout << "\\\\ Hello, traP!! //" << endl; // 「\\ Hello, traP!! //」と出力される
```
:::

```txt
[output]
\\ Hello, traP!! //
```
## 3.1.4 セミコロン

C++では、`;`(セミコロン)を多用する。`;`は「命令の区切り」を示す。C++においては、関数を呼び出すときや、「変数」の定義時など、各命令の終わりには`;`を記述しなければならない。

::: tip
文字列中では `//` を書いてもコメントアウトされない
最終的にはコンピューターが機械語に変換する必要があり、その際に命令の区切りをはっきりさせるために`;`を使うと考えると良い
:::

::::
## 3.1.5 include命令

<<< @/cpp/chapter-3/Hello-traP.cpp{1 cpp:line-numbers}

## 3.1.3. セミコロン
`#include`は、外部の関数(やその他もろもろ)が実装されているファイルを取り込んで、使えるようにする命令である。

C++では、`;` を多用する。`;` は「命令の区切り」を示す。C++
においては、関数を呼び出すときや、次に出てくる「変数」の宣言時など、各命令の終わりには `;` を記述しなければならない。
このプログラムでは`iostream`と呼ばれるファイルをインクルードしている。これは入出力に関する便利な関数(など)が用意されているファイルである。例えば、`cout`は`iostream`に含まれているものの一つである。

::: tip
最終的にはコンピューターが機械語に変換する必要があり、その際に命令の区切りをはっきりさせるために `;`を使うと考えると良い。
:::
自分一人で一から作る事は非常に難しいので、予め用意されたプログラムを適宜用いてプログラミングをするのである。

## 3.1.4. include命令
## 3.1.6 using namespace std

<<<@/cpp/chapter-3/hello-world.cpp{1 cpp:line-numbers}
<<< @/cpp/chapter-3/Hello-traP.cpp{2 cpp:line-numbers}

`#include` は、外部の関数(やその他もろもろ)が実装されているファイルを取り込んで、使えるようにする命令である
これまで出力を`cout`と記述してきたが、これは本来ならば`std::cout`と書く必要がある。(`std::`が何を意味しているかは深くは解説しないがstdがstandardの略であることくらいは知っておいても良いだろう。)毎回`std::`と書かなければいけないのは少し不便なので、これを書かない(省略する)という宣言をしている

このソースコードでは `iostream`
と呼ばれるファイルをインクルードしている。これは入出力に関する便利な関数(など)が用意されているファイルである。具体的には、 `cout`
が `iostream` に含まれている。
## 3.1.7 main関数

自分一人で一から作る事は非常に難しいので、予め用意されたソースコードを適宜用いてプログラミングをするのである。
<<< @/cpp/chapter-3/Hello-traP.cpp{4 cpp:line-numbers}

## 3.1.5. using namespace std
プログラムは実行されるとき、このmain関数から実行が始まる。すなわち、main関数の中身がプログラムの最も主な処理であると捉えても良い。「関数」についての詳細は第7章で扱う。

<<<@/cpp/chapter-3/hello-world.cpp{2 cpp:line-numbers}
したがって、**main関数はプログラム中にただ1つ存在していなければならない**。main関数が無かったり、複数個存在していたりしてはいけない。

`cout` と記述しているが、本来ならば `std::cout` と書く必要がある。 `std::` が何を意味しているかは深くは解説しないが(std =
standard くらいは知っても良いだろう)、毎回`std::`と書くのは少し不便なので、これを書かない(省略する)という宣言をしている。
プログラムの中で`int main()`の後の`{`と、最終行の`}`は対応していて、`{}`の内側がmain関数の内容である。今のところは、「**main関数の`{`と`}`の間に処理を書く**」と思っていれば十分である。

## 3.1.6. main関数
## 3.1.8 インデント

<<<@/cpp/chapter-3/hello-world.cpp{4 cpp:line-numbers}
プログラムが長くなってくると、`{}`が何個も入れ子になって出てくるようになる。そこで、`{`が1つ始まるごとに、インデント(字下げ)を行う。すなわち、各行の最初に空白を入れる。

コンピューターはmain関数を実行する。main関数の中身がプログラムのメインの部分と捉えても良い。
「関数」についての詳細は5章で扱う。
以下は、第4章で学ぶif文を用いたプログラムである。今はまだ意味を理解する必要はないが、`{`が始まるごとに行頭の半角スペースが2つずつ増えていることがわかるだろう。VSCodeなどのエディタであれば、こうした作業はある程度自動で行ってくれる。

ソースコードの中で `int main()` の後の `{` と、最終行の `}` は対応していて、 `{ }` の内側が main
関数の内容である。
```cpp:line-numbers
#include <iostream>
using namespace std;

今のところは、「`{` からプログラムが始まって、末尾の`}` で終わる」と考えれば十分である。
int main() {
cout << "点数を入力してください。" << endl;
int score = 0;
cin >> score;

if (score >= 60) {
cout << "合格です。" << endl;
}
if (score < 60) {
cout << "不合格です。" << endl;
}
}
```
Loading
Loading