diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index d4949566..2ad7ef07 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -79,28 +79,61 @@ export default withMermaid({ link: "/cpp/chapter-3/problems/", collapsed: true, items: [ - { text: "Multiplication(★☆☆)", link: "/cpp/chapter-3/problems/multiplication" }, - { text: "Sum of n(★★☆)", link: "/cpp/chapter-3/problems/sum-of-n" }, + { + 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: "[WIP] 4. 条件分岐", + text: "4. 条件分岐", link: "/cpp/chapter-4/", items: [ - { text: "[WIP] 4.1 if文", link: "/cpp/chapter-4/1" }, - { text: "[WIP] 4.2 演算子", link: "/cpp/chapter-4/2" }, + { text: "4.1 if文", link: "/cpp/chapter-4/1" }, + { text: "4.2 演算子", link: "/cpp/chapter-4/2" }, + { + text: "4.Q 練習問題", + link: "/cpp/chapter-4/problems/", + collapsed: true, + items: [ + { + text: "Positive or Negative(★☆☆)", + link: "/cpp/chapter-4/problems/positive-or-negative", + }, + { + text: "Fraction(★★☆)", + link: "/cpp/chapter-4/problems/fraction", + }, + ], + }, ], }, { - text: "[WIP] 5. 型", + text: "5. 型", link: "/cpp/chapter-5/", items: [ - { text: "[WIP] 5.1 bool型", link: "/cpp/chapter-5/1" }, - { text: "[WIP] 5.2 double型", link: "/cpp/chapter-5/2" }, - { text: "[WIP] 5.3 string型①", link: "/cpp/chapter-5/3" }, + { text: "5.1 bool型", link: "/cpp/chapter-5/1" }, + { text: "5.2 double型", link: "/cpp/chapter-5/2" }, + { text: "5.3 string型①", link: "/cpp/chapter-5/3" }, + { + text: "5.Q 練習問題", + link: "/cpp/chapter-5/problems/", + collapsed: true, + items: [ + { + text: "Circle Area(★☆☆)", + link: "/cpp/chapter-5/problems/circle-area", + }, + { text: "Echo(★☆☆)", link: "/cpp/chapter-5/problems/echo" }, + ], + }, ], }, { diff --git a/docs/cpp/chapter-4/1.md b/docs/cpp/chapter-4/1.md index 8d6f4d2a..a6a11d16 100644 --- a/docs/cpp/chapter-4/1.md +++ b/docs/cpp/chapter-4/1.md @@ -1,8 +1,8 @@ -# [WIP] 4.1 if文 +# 4.1 if文 ## 4.1.1 if -特定の条件を満たす時だけ実行したい時は、if 文を用いる。if の後に条件を記し、その後の `{}` に条件を満たしていた時だけ実行したい命令を記述する。 +何らかの処理を、**特定の条件を満たすときにだけ実行したい**場合は、if文と呼ばれる構文を用いる。`if`の後に**条件**を記し、その後の`{}`の中に条件を満たしていたときだけ実行したい命令を記述する。 以下は、入力された点数が60点以上であれば「合格」、そうでなければ「不合格」と表示するプログラムである。 @@ -12,7 +12,7 @@ using namespace std; int main() { cout << "点数を入力してください。" << endl; - int score = 0; + int score; cin >> score; if (score >= 60) { @@ -37,7 +37,7 @@ flowchart LR condunder --> |No| e[End] ``` -`score >= 60` は、 $score \geq 60$ と同じである。 `+-/*` と同じくして、条件を記述する演算子も存在する。演算子は以下の通り。 +`score >= 60`は、$score \geq 60$と同じである。`+-/*`と同じくして、条件を記述する演算子も存在する。演算子は以下の通り。 | 演算子 | 数学の記号 | |------|--------| @@ -49,13 +49,12 @@ flowchart LR | `!=` | $\neq$ | :::warning -`==` と `=` を混同しないように注意。 `=` は**代入** 、 `==` が**等価** である。 +`==`と`=`を混同しないように注意。`=`は**代入**、`==`が**等価**である。 ::: ## 4.1.2 else -3.1.1. で示した例は、60点以上「でない」ときを `if (score < 60)` と記述することで実装した。ただ、実際には「そうでない時」を else -文によって簡単に記述できる。 +4.1.1で示した例は、60点以上「でない」ときを`if (score < 60)`と記述することで実装した。ただ、実際には「そうでないとき」を**else文**によって簡単に記述できる。 ```cpp:line-numbers #include @@ -63,19 +62,19 @@ using namespace std; int main() { cout << "点数を入力してください。" << endl; - int score = 0; - cin >> score; + int score; + cin >> score; if (score >= 60) { - cout << "合格です" << endl; + cout << "合格です。" << endl; } else { - cout << "不合格です" << endl; + cout << "不合格です。" << endl; } } ``` ::: tip -else 文は、if文の終わり( = `}` )の次に書く必要がある。 +else文は、if文の終わり(=`}`)の次に書く必要がある。 ::: ```mermaid @@ -89,7 +88,7 @@ flowchart LR ## 4.1.3 else if -3.1.2. のコード に「満点だったら」という条件を足す。 +4.1.2のコードに「満点だったら」という条件を足す。 ```cpp:line-numbers #include @@ -97,16 +96,16 @@ using namespace std; int main() { cout << "点数を入力してください。" << endl; - int score = 0; + int score; cin >> score; if (score == 100) { - cout << "満点です" << endl; + cout << "満点です。" << endl; } else { if (score >= 60) { - cout << "合格です" << endl; + cout << "合格です。" << endl; } else { - cout << "不合格です" << endl; + cout << "不合格です。" << endl; } } } @@ -124,7 +123,7 @@ flowchart LR printunder --> e ``` -ただ、このように書くのは冗長なので、`else if` と短縮する事が許されている。 +ただ、このように書くのは冗長なので、`else if`と短縮する事が許されている。 ```cpp:line-numbers #include @@ -132,15 +131,15 @@ using namespace std; int main() { cout << "点数を入力してください。" << endl; - int score = 0; + int score; cin >> score; if (score == 100) { - cout << "満点です" << endl; + cout << "満点です。" << endl; } else if (score >= 60) { - cout << "合格です" << endl; + cout << "合格です。" << endl; } else { - cout << "不合格です" << endl; + cout << "不合格です。" << endl; } } ``` @@ -149,23 +148,28 @@ int main() { ## 4.1.4 変数のスコープ -変数が使える範囲には制限があり、これを変数のスコープと呼ぶ。 +変数が使える範囲には制限があり、これを変数の**スコープ**と呼ぶ。 -具体的には、 `{}` の外からは変数にアクセスできない。 +具体的には、`{}`の外からは変数にアクセスできない。 -例えば次のソースコードで言えば、 変数 `z` は 4 ~ 6 行目でしか使用できない。 -**8 行目は正しく実行できない。(コンパイルエラーとなる)** +例えば次のプログラムで言えば、変数`z`は8行目から10行目まででしか使用できない。**12行目は正しく実行できない。(コンパイルエラーとなる。)** -変数 `x` は 1行目から 9 行目まで好きなところで使用できる。 +変数`x`は5行目から13行目まで好きなところで使用できる。 ```cpp:line-numbers -int x = 8; +#include +using namespace std; + +int main() { + int x = 8; -if (x < 10) { - int z = 10; - cout << z << endl; // OK ! - cout << x << endl; // OK ! + if (x < 10) { + int z = 10; + cout << z << endl; // OK! + cout << x << endl; // OK! + } + cout << z << endl; // NG + cout << x << endl; // OK! } -cout << z << endl; // NG -cout << x << endl; // OK ! + ``` diff --git a/docs/cpp/chapter-4/2.md b/docs/cpp/chapter-4/2.md index dbb24796..0756085c 100644 --- a/docs/cpp/chapter-4/2.md +++ b/docs/cpp/chapter-4/2.md @@ -1,12 +1,23 @@ -# [WIP] 4.2 演算子 +# 4.2 演算子 ## 4.2.1 比較演算子 +[4.1.1](1#_4-1-1-if)で説明したような、2つの値を比較する演算子のことを、**比較演算子**と呼ぶ。比較演算子を列挙した表を以下に再掲しておく。 + +| 演算子 | 数学の記号 | +|------|--------| +| `>=` | $\geq$ | +| `>` | $>$ | +| `<` | $<$ | +| `<=` | $\leq$ | +| `==` | $=$ | +| `!=` | $\neq$ | + ## 4.2.2 論理演算子 -条件が1つの変数のみに依存する時は `if` と `else` でわかりやすく書けた。 -しかし、条件が2つ以上になるとif と else だけでは煩雑になっていく。 -数学では「または」、「かつ」 「でない」($\lor,\land, \lnot$) をよく使ったと思うが、プログラミングでもそれに当たるものが存在する。 +条件が1つの変数のみに依存する時は`if`と`else`でわかりやすく書けた。では、条件が2つ以上ある場合はどうすればよいだろうか。if文の中にif文を書くことで、2つの条件の組み合わせを記述することができるが、煩雑にである。 + +数学では「または」「かつ」「でない」($\lor,\land, \lnot$)をよく使ったと思うが、プログラミングでもそれに当たるものが存在する。これらを**論理演算子**と呼ぶ。論理演算子を用いることで、比較的簡単に、複数の条件の組み合わせを書くことができる。 | 演算子 | 意味 | 意味・数学記号 | |------|-----|-------------| @@ -28,11 +39,10 @@ if (!(y >= 10)) { ## 4.2.3 演算子の優先順位 -数学と同じように、演算子には優先順位がついている。優先順位自体は覚えなくても良いが、たまに優先順位が自分の想定と違うときがある。そのようなときは `()` -で式をくくることで、計算順序を変えられるので覚えると良い(数学と同じ)。 +数学と同じように、演算子には優先順位がついている。優先順位自体は覚えなくても良いが、たまに優先順位が自分の想定と違うときがある。そのようなときは`()`で式をくくることで、計算順序を変えられる。 -特に、 `<<` は比較演算子より優先順位が高い。 -`cout << a <= b << endl;` と書くとコンパイルエラーとなってしまうので2行目のように書かなければならない。 +特に、`<<`は比較演算子より優先順位が高い。 +`cout << a <= b << endl;`と書くとコンパイルエラーとなってしまうので2行目のように書かなければならない。 ```cpp:line-numbers cout << ((a + b) * c) << endl; @@ -40,6 +50,15 @@ cout << (a <= b) << endl; ``` ::: tip -「じゃあ `<<` 演算子の優先度を一番低くすればいいじゃん」と思ったかもしれない。 +「じゃあ`<<`演算子の優先度を一番低くすればいいじゃん」と思ったかもしれない。 しかし、実際には複雑な事情があるのだ……。 ::: + +::: tip 第4章のまとめ + +* if文、else文で条件分岐ができます。 +* `if(x==0)`はどのような条件を表していますか? `==`は比較、`=`は代入です。 +* `<` `>` `<=` `>=`で大小の比較ができます。 +* `&&` `||` `!`でAND, OR, NOTを扱えます。 + +::: diff --git a/docs/cpp/chapter-4/index.md b/docs/cpp/chapter-4/index.md index e60d1c65..a52e9bf4 100644 --- a/docs/cpp/chapter-4/index.md +++ b/docs/cpp/chapter-4/index.md @@ -1 +1,3 @@ -# [WIP] 4. 条件分岐 +# 4. 条件分岐 + +プログラムの中では、「**指定した条件を満たすときにのみ**」実行してほしい処理というものが存在する。第4章では、この「**条件分岐**」を扱う。 diff --git a/docs/cpp/chapter-4/problems/fraction.md b/docs/cpp/chapter-4/problems/fraction.md new file mode 100644 index 00000000..13a2b53f --- /dev/null +++ b/docs/cpp/chapter-4/problems/fraction.md @@ -0,0 +1,91 @@ +# 4.Q Fraction(★★☆) + +## 問題 + +入力から整数$a,b,c,d$を受け取り、$\frac{a}{b}+\frac{c}{d}$を計算して、存在するなら分数`n/m`のような文字列として表示しよう。 + +結果を約分する必要はないものとします。 + +## 入出力例 + +### 例1 + +#### 入力 + +```Input:line-numbers +1 2 3 4 +``` + +#### 出力 + +```Output:line-numbers +10/8 +``` + +$\frac{1}{2} + \frac{3}{4} = \frac{10}{8}$ + +### 例2 + +#### 入力 + +```Input:line-numbers +1 3 5 7 +``` + +#### 出力 + +```Output:line-numbers +22/21 +``` + +$\frac{1}{3} + \frac{5}{7} = \frac{22}{21}$ + +### 例3 + +#### 入力 + +```Input:line-numbers +1 0 1 0 +``` + +#### 出力 + +```Output:line-numbers +``` + +0除算は定義されないため、$\frac{1}{0}$は存在しません。 + +## ヒント + +::: details ヒント1 +今回は約分が必要ないので、最小公倍数を求める必要はありません。素直に掛け算で分母を求めてしまってよいでしょう。 +::: + +## 解答例 + +::: details 解答例 + +```cpp +#include +using namespace std; + +int main() { + int a, b, c, d; + cin >> a >> b >> c >> d; + + // 分母が0でないなら + if (b != 0 && d != 0) { + // 分母を計算 (今回は約分が不要なため、最小公倍数でなくともよい) + int denominator = b * d; + + // 分子を計算 + int numerator = a * d + c * b; + + // 結果を出力 + cout << numerator << "/" << denominator << endl; + } +} +``` + +なお、約分をしたい場合は`std::gcd`などを使って最小公倍数を得ることができます。 +::: diff --git a/docs/cpp/chapter-4/problems/index.md b/docs/cpp/chapter-4/problems/index.md index c62e2659..897cce8f 100644 --- a/docs/cpp/chapter-4/problems/index.md +++ b/docs/cpp/chapter-4/problems/index.md @@ -1 +1,12 @@ -# 練習問題 +# 4.Q 練習問題 + +::: tip +練習問題の難易度は3段階に分かれています。 + +* ★☆☆:**できれば解いて理解して欲しい問題**です。とにかく手を動かしましょう。 +* ★★☆:ぜひ解いて欲しいですが、解けなくても問題はありません。 +* ★★★:ややトリッキーな問題が並んでいます。余裕があれば取り組んでみましょう。 +::: + +- [Positive or Negative(★☆☆)](positive-or-negative) +- [Fraction(★★☆)](fraction) diff --git a/docs/cpp/chapter-4/problems/positive-or-negative.md b/docs/cpp/chapter-4/problems/positive-or-negative.md new file mode 100644 index 00000000..638c6e0d --- /dev/null +++ b/docs/cpp/chapter-4/problems/positive-or-negative.md @@ -0,0 +1,83 @@ +# 4.Q Positive or Negative(★☆☆) + +## 問題 + +整数$x$を1つ入力として受け取り、$x$が正なら`positive`、負なら`negative`、0なら`zero`と出力するプログラムを作成しよう。 + +## 入出力例 + +### 例1 + +#### 入力 + +```Input:line-numbers +5 +``` + +#### 出力 + +```Output:line-numbers +positive +``` + +### 例2 + +#### 入力 + +```Input:line-numbers +-3 +``` + +#### 出力 + +```Output:line-numbers +negative +``` + +### 例3 + +#### 入力 + +```Input:line-numbers +0 +``` + +#### 出力 + +```Output:line-numbers +zero +``` + +## ヒント + +::: details ヒント1 +`if`文で$0$より大きいかを判定し、`else if`で$0$より小さいかを判定するのが分かりやすい。 +::: + +::: details ヒント2 +最後に残るのは$0$の場合なので、`else`にまとめてしまって良い。 +::: + +## 解答例 + +::: details 解答例 + +```cpp +#include +using namespace std; + +int main() { + int x; + cin >> x; + + if (x > 0) { + cout << "positive" << endl; + } else if (x < 0) { + cout << "negative" << endl; + } else { + cout << "zero" << endl; + } +} +``` + +::: diff --git a/docs/cpp/chapter-5/1.md b/docs/cpp/chapter-5/1.md index 168858f7..3ea785b8 100644 --- a/docs/cpp/chapter-5/1.md +++ b/docs/cpp/chapter-5/1.md @@ -1,8 +1,8 @@ -# [WIP] 5.1 bool型 +# 5.1 bool型 -何気なく if 文の中に `score >= 60` と書いているが、これ自体も `+` の演算などと同じように実際は値が定まっている。 +[4.1](../chapter-4/1.md)では何気なくif文の中に`score >= 60`と書いていたが、これ自体も`+`の演算などと同じように実際は値が定まっている。 -if 文の前に `cout` を挟んで、どんな値が出力されるか確かめてみよう。 +if文の前に`cout`を挟んで、どんな値が出力されるか確かめてみよう。 ```cpp:line-numbers #include @@ -10,22 +10,23 @@ using namespace std; int main() { cout << "点数を入力してください。" << endl; - int score = 0; + int score; cin >> score; cout << (score >= 60) << endl; if (score >= 60) { - cout << "合格です" << endl; + cout << "合格です。" << endl; } else { - cout << "不合格です" << endl; + cout << "不合格です。" << endl; } } ``` -返り値は `1` もしくは `0` である。真のときに `1` となり、偽のときに `0` となる。 -この0と1のみを持つ型を bool 型と呼ぶ。 +返り値は`1`もしくは`0`である。`score >= 60`という条件が正しい(真の)ときに`1`となり、謝っている(偽の)ときに`0`となる。この0と1のみを持つ型をbool型と呼ぶ。 -bool型の変数を使って、コードを以下のように書き換える事ができる。 +ここで、`0`を`false`、`1`を`true`と呼ぶ。 + +bool型の変数を使って、プログラムを以下のように書き換える事ができる。 ```cpp:line-numbers #include @@ -33,15 +34,15 @@ using namespace std; int main() { cout << "点数を入力してください。" << endl; - int score = 0; + int score; cin >> score; - bool isGood = score >= 60; + bool isGood = (score >= 60); if (isGood) { - cout << "合格です" << endl; + cout << "合格です。" << endl; } if (!isGood) { - cout << "不合格です" << endl; + cout << "不合格です。" << endl; } } ``` diff --git a/docs/cpp/chapter-5/2.md b/docs/cpp/chapter-5/2.md index 5494cd78..33c45218 100644 --- a/docs/cpp/chapter-5/2.md +++ b/docs/cpp/chapter-5/2.md @@ -1,12 +1,12 @@ -# [WIP] 5.2 double型 +# 5.2 double型 -小数について扱いたい時もあるだろう。小数は `double` 型によって表される。 +小数について扱いたい時もあるだろう。小数は`double`型によって表される。 ```cpp double y = 3.5; ``` -### 3.2.2.1. 小数型に潜む罠 +## 5.2.1 小数型に潜む罠 小数型は基本的に扱わない方が良いと言われている。以下のコードを見て欲しい。 @@ -14,26 +14,27 @@ double y = 3.5; double x = 0.1; double y = 0.2; double z = 0.3; -bool b = x+y == z; +bool b = (x+y == z); cout << b << endl; ``` -このコードの出力を考えて欲しい。明らかに `true` なはずである。 -しかし、実際に実行してみると `false` と表示される。 +このコードの出力を考えて欲しい。明らかに`true`なはずである。 +しかし、実際に実行してみると`0`(=`false`)と表示される。 -これは簡潔に言ってしまえば **double 型は2進数の小数に近似する型** だからである。 +これは簡潔に言ってしまえば**double型は2進数の小数に近似する型**だからである。 おそらく高校数学で勉強したと思うが、10進数の世界において 2 と 5 以外を因数に持つ整数で 1 を割った時、それは循環小数になる。 (例: $\dfrac13=0.\dot3_{(10)}=0.3333..._{(10)}$ ) -コンピューターの扱う 2 進数の世界でも同じ事が言えて、2進数で `0.1` や `0.2` 等の値は循環小数となる。 +コンピューターの扱う2進数の世界でも同じ事が言えて、2進数で`0.1`や`0.2`等の値は循環小数となる。 (例えば $0.2_{(10)}=0.\dot001\dot1_{(2)}=0.00110011..._{(2)}$ ) -この時、コンピューターは小数をある程度の位で打ち切って、値を丸め込んで保存する。この時に誤差が発生してしまい、故に上記のコードは `false` -を出力するのである。 +この時、コンピューターは小数をある程度の位で打ち切って、値を丸め込んで保存する。この時に誤差が発生してしまい、故に上記のコードは`0`(=`false`)を出力するのである。 + + -その為に、小数値を使って**正確な**演算をするのは基本的には**避けた方が良い** -と言われる。例えば単位の60点を超えているかどうかの判定で、60点ぴったりなはずだったのに誤差の関係で不合格と言われたらたまったものではない。 -(ゲーム製作においては座標計算の都合でどうしても小数を使うのだが…) +その為に、小数値を使って**正確な**演算をするのは基本的には**避けた方が良い**と言われる。例えば単位の60点を超えているかどうかの判定で、60点ぴったりなはずだったのに誤差の関係で不合格と言われたらたまったものではない。(ゲーム製作においては座標計算の都合でどうしても小数を使うのだが…) -ちなみに、整数でデータを上手に持つ事で小数を正確に扱う方法もある。(例えば 分母と分子で 2 -変数を持ってしまえば、有理数は常に正確に計算できる)。また、有理数・有限小数を正確に扱えるパッケージ(ライブラリ)も存在する。 +ちなみに、整数でデータを上手に持つ事で小数を正確に扱う方法もある。(例えば 分母と分子で2変数を持ってしまえば、有理数は常に正確に計算できる)。また、有理数・有限小数を正確に扱えるパッケージ(ライブラリ)も存在する。 diff --git a/docs/cpp/chapter-5/3.md b/docs/cpp/chapter-5/3.md index 41d15d39..6ab5462b 100644 --- a/docs/cpp/chapter-5/3.md +++ b/docs/cpp/chapter-5/3.md @@ -1,18 +1,18 @@ -# [WIP] 5.3 string型① +# 5.3 string型① 文字列も変数として扱うことができる。 -C++言語において、文字列を扱うときには `string` をインクルードする必要がある。 +C++言語において、文字列を扱うときには`string`をインクルードする必要がある。 ```cpp:line-numbers #include #include using namespace std; -... +// 省略 ``` -文字列は `string` 型によって表される。 +文字列は`string`型によって表される。 ```cpp:line-numbers string s = "Hello World!"; @@ -20,7 +20,7 @@ string t = "Hello traP!"; string empty = ""; // 文字列は空でも良い ``` -整数と同じようにして、入出力ができる。 +string型も整数と同じようにして、入出力ができる。string型の入出力は空白や改行で区切られる。すなわち、一度の`cin`で読み込まれるのは、次の空白や改行の前の文字までである。 ```cpp:line-numbers string s = ""; @@ -28,7 +28,7 @@ cin >> s; cout << s << endl; ``` -`+` によって string 型同士を結合させる事ができる。 +`+`によってstring型同士を結合させる事ができる。 ```cpp:line-numbers string s = "Hello"; @@ -37,12 +37,11 @@ string str = s + " " + t; cout << str << endl; ``` -``` -[output] +```Output:line-numbers Hello World! ``` -`==` で一致判定もできる。大文字と小文字は異なるものとして判定される。 +`==`で一致判定もできる。大文字と小文字は異なるものとして判定される。 ```cpp:line-numbers string s = "traP"; @@ -55,26 +54,15 @@ if (s == t) { } ``` -``` -[output] +```Output:line-numbers different ``` -他にも文字列に対して `>=` 、 `<=` などの演算が定義されているが、これは次章で少しだけ扱う(本日の講習は(予定通りなら)ここで終わるので、余裕があれば自分で色々調べてみても良いだろう)。 - -::: tip III 章まとめ +他にも文字列に対して`>=`、`<=`などの演算が定義されているが、これは次回以降に少しだけ扱う。(本日の講習は(予定通りなら)ここで終わるので、余裕があれば自分で色々調べてみても良いだろう)。 -* if 文、else 文で条件分岐ができます。 -* `if(x==0)` はどのような条件を表していますか? `==` は比較、 `=` は代入です。 -* bool 型は 0 か 1 の値を持つ型です。 -* `<` `>` `<=` `>=` で大小の比較ができます。 -* `&&` `||` `!` で AND, OR, NOT を扱えます。 -* `double` は小数型、 `string` は文字列型です。 - -::: +::: tip 第5章のまとめ -::: info -[**\[ III の練習問題へ\]**](https://md.trap.jp/IE4NUAc_RR-USMIXlevsgA#Section-III) +* bool型は0か1の値を持つ型です。 +* `double`は小数型、`string`は文字列型です。 -[**\[講習会ページに戻る\]**](https://wiki.trap.jp/Event/welcome/23/lecture/pg-basic) ::: diff --git a/docs/cpp/chapter-5/index.md b/docs/cpp/chapter-5/index.md index fd7f749a..e29c0d1c 100644 --- a/docs/cpp/chapter-5/index.md +++ b/docs/cpp/chapter-5/index.md @@ -1 +1,3 @@ -# [WIP] 5. 型 +# 5. 型 + +[3.2](../chapter-3/2.md)では、int型変数について学んだ。ここでは、int型以外の型を学んでいこう。 diff --git a/docs/cpp/chapter-5/problems/circle-area.md b/docs/cpp/chapter-5/problems/circle-area.md new file mode 100644 index 00000000..8f85e38f --- /dev/null +++ b/docs/cpp/chapter-5/problems/circle-area.md @@ -0,0 +1,66 @@ +# 5.Q Circle Area(★☆☆) + +## 問題 + +半径$r$を表す実数を1つ入力として受け取り、円の面積$\pi r^2$を求めて出力しよう。 + +ここでは$\pi = 3.14$として計算する。 + +## 入出力例 + +### 例1 + +#### 入力 + +```Input:line-numbers +2 +``` + +#### 出力 + +```Output:line-numbers +12.56 +``` + +### 例2 + +#### 入力 + +```Input:line-numbers +0.5 +``` + +#### 出力 + +```Output:line-numbers +0.785 +``` + +## ヒント + +::: details ヒント1 +`double`型を使うと小数を扱える。 +::: + +::: details ヒント2 +円の面積は`r * r * 3.14`で計算できる。 +::: + +## 解答例 + +::: details 解答例 + +```cpp +#include +using namespace std; + +int main() { + double r; + cin >> r; + + double area = r * r * 3.14; + cout << area << endl; +} +``` + +::: diff --git a/docs/cpp/chapter-5/problems/echo.md b/docs/cpp/chapter-5/problems/echo.md new file mode 100644 index 00000000..6d472fed --- /dev/null +++ b/docs/cpp/chapter-5/problems/echo.md @@ -0,0 +1,74 @@ +# 5.Q Echo(★☆☆) + +## 問題 + +入力から単語を1つ受け取り、それをそのまま出力しよう。 + +## 入出力例 + +### 例1 + +#### 入力 + +```Input:line-numbers +Hello! +``` + +#### 出力 + +```Output:line-numbers +Hello! +``` + +## ヒント + +::: details ヒント1 + +文字列型の変数を使うには、 + +```cpp +string s; +``` + +と書く。 +::: + +::: details ヒント2 + +もしもこんなエラーが出たとしたら、 + +``` +./Main.cpp:4:5: error: unknown type name 'string'; did you mean 'std::string'? + string s; + ^~~~~~ + std::string +``` + +```cpp +using namespace std; +``` + +で、`std::`を省略できるようにしよう。 +::: + +::: details ヒント3 + +入力を受け取るには`cin`を、出力するには`cout`を使おう。 +::: + +## 解答例 + +::: details 解答例 + +```cpp +#include +using namespace std; + +int main() { + string s; + cin >> s; + cout << s << endl; +} +``` + +::: diff --git a/docs/cpp/chapter-5/problems/index.md b/docs/cpp/chapter-5/problems/index.md index c62e2659..e8daeb8c 100644 --- a/docs/cpp/chapter-5/problems/index.md +++ b/docs/cpp/chapter-5/problems/index.md @@ -1 +1,12 @@ -# 練習問題 +# 5.Q 練習問題 + +::: tip +練習問題の難易度は3段階に分かれています。 + +* ★☆☆:**できれば解いて理解して欲しい問題**です。とにかく手を動かしましょう。 +* ★★☆:ぜひ解いて欲しいですが、解けなくても問題はありません。 +* ★★★:ややトリッキーな問題が並んでいます。余裕があれば取り組んでみましょう。 +::: + +- [Circle Area(★☆☆)](circle-area) +- [Echo(★☆☆)](echo)