第2回　for文、if文を使ってみよう

前回でプログラマーとしての一歩を踏み出しましたが、今回はもう少し複雑なことをやってみましょう。
今回で、人間がやるには面倒な処理を、PCに一瞬でこなしてもらえるようになります。


## for文
同じような処理を何回もしてもらいたい時、ありますよね。そんな時に用いるのがfor文です。
~~~py
for i in range(5):
    print("Hello world")
~~~
を実行してみてください。Hello worldが5回出力されたと思います。
（":"やインデントに注意）
なんとなく想像がつくと思いますが、rangeの中身が5なので5回繰り返されました。こう書いても同じです。
~~~py
for i in range(0, 5):
    print("Hello world")
~~~
今回のfor文は、iというindexを0にセットし、それが4になるまで繰り返します。for文の中身、今回だと `print("Hello world!")`を終えるとindexが1増えます。つまり
Hello world ←i=0
Hello world ←i=1
Hello world ←i=2
Hello world ←i=3
Hello world ←i=4
みたいな状態になっています。`range(a, b)`だと、b-1まで繰り返されることに注意です。

文章で書くとなんだかややこしいですが、色々試してみれば実感できると思います。
これなら3回繰り返されますね。
~~~py
for i in range(2, 5):
    print(Hello world)
~~~
また、iというindexを出力することもできます。
~~~py
for i in range(0, 5):
    print(i)
~~~

indexはiじゃなくてもOKです。
~~~py
for j in range(5):
    print("Hello world")
~~~

~~~py
for _ in range(5):
    print("Hello world")
~~~

では、前回の復習も兼ねて、以下の例題を解いてください。

### 例題
整数a=1を用意して、aに2を4回足していくことで、10以下の正の奇数を出力せよ。
***
<details><summary>解答例</summary>

~~~py
a = 1
print(a)

for i in range(4):
    a = a + 2
    print(a)
~~~

多少コードの形が違っても、出力が合っていれば多分できています。
chatGPTに問題文、回答、解答例を送って合っているか聞いてみるのも良いです。

前回、イコールは代入の演算子だと強調しましたが、ここでもその気持ちを大事にしてください。

</details>




## if文
for文ともう1つ非常に重要なものが、このif文です。
この2つをマスターすれば、ほとんどのアルゴリズムを作成することができるようになるので、頑張りましょう。

if文は、その名の通り、条件判定を行うことができます。
以下のコードを実行してみましょう。
~~~py
a = 2024
b = a%2

if b==0:
  print(a, "は偶数")
~~~
このコードで2024が偶数かどうかを判定しています。%はあまりを求める演算子でした。
`if b==0`は文字通り「bが0なら」という意味で、成立していたら `print(a, "は偶数")`を実行します。
`if b==0`ではイコールが2つであることに注意してください。

また、条件を満たさなかった場合はelseで実行することができます。
~~~py
a = 2025
b = a%2

if b==0:
  print(a, "は偶数")
else:
  print(a, "は奇数")
~~~
2025を2で割った余りは0でないので、`print(a, "は奇数")`が実行されます。

### 例題
以下は500未満の非負整数をすべて出力するコードです。

~~~py
for i in range(500):
    print(i)
~~~
これをいじって、100未満の奇数をすべて出力するコードに変更せよ。
(`range(500)`は変えないこと）

-ヒント-
ifの条件はandやorで重ねることができます。
使い方を調べてみましょう。

<details><summary>解答例</summary>

「等しくなかったら」というのは`if i != b`のように書けます。
「2で割った余りが0でない」かつ 「100未満」をif文にしましょう。
~~~py
for i in range(500):
    if i%2 != 0 and i<100:
        print(i)
~~~

[別解]
`break`で、for文を抜けることができます。
これを用いると、こんな感じになります。
```py
for i in range(500):
    if i >= 100:
        break
    if i%2 != 0:
        print(i)
```
この場合、iが100以上になったら繰り返しをやめているので、余計な100~499の処理を行っていない分、若干処理が早いです。

</details>


## list
今回のメインテーマはfor文とif文だったのですが、list型の変数も重要な上に次回軽く使うので、もう少し頑張りましょう。

前回変数を学んで、これに数字を代入しました。
実は、この変数にまとめて情報を入れておくこともできます。その際用いるのがlist型の変数で、数学のベクトルっぽい気持ちです。

以下のコードを書き写してみてください。
~~~py
a = [1, 3, 5, 7, 9]

print(a)
print(a[0])
~~~
[1, 3, 5, 7, 9]
1
が出力されましたね。このように、[]の中にまとめて数字を入れておくことができます。その中のi番目の要素を取り出したいときは、a[i]のように指定してあげます。
プログラミングでは、大体0からカウントするので、今回はa[0]が1、a[4]が9になっています。

listを使えば、「10以下の奇数を出力する」例題をこのように解くこともできます。
~~~py
ans = []
a = 1

for i in range(5):
  ans.append(a)
  a += 2

print(ans)
~~~
中身のないリストansを用意しておいて、`ans.append()`でリストに要素を追加しています。

先ほどはaを1, 3, 5, ...と更新していたので、for文を終える頃にはa=9という情報しか残っていなかったのですが、listを使えば情報を取っておくことができます。

## 例題
2023が素数か判定せよ。素数でない場合、割れる数を出力せよ
<details><summary>解答例</summary>

2から"自身-1"のすべての整数で割ってみて、それぞれ余りが0かどうか判定すれば良いです。
~~~py
a = 2023
for i in range(2, a):
  if a%i == 0:
    print(i, "で割れる")
    break
  
  if i==a-1:
    print("素数")
~~~
2からどんどん割る数を増やしてみて、あまりが0だったら素数でないのでfor文を抜けます。きちx紹介していませんでしたが、`break`でfor文を抜けることができます。
a-1になっても抜けていなければ、それは素数です。

</details>

***

今回は、簡単なアルゴリズムをやりました。
もちろん、もっともっと色々なことができるのがプログラミングです。ただ、すべてのアルゴリズムの基礎は今回のif文とfor文なので、ぜひマスターしてください！

***
- 第0回　[はじめに](https://qiita.com/tau14/items/d6620cb24945d8e564c2)
- 第1回　[プログラミングをしてみよう](https://qiita.com/tau14/items/3d3086844c6eb9a05cca)
- 第2回　[if文、for文を使ってみよう](https://qiita.com/tau14/items/501abc293c5a93422c35)
- 第3回　[グラフを描いてみよう](https://qiita.com/tau14/items/68b92efe2bba7a6de5f1)
- 第4回　[物理の計算をしてみよう](https://qiita.com/tau14/items/3216260f786d49f807d4)
- 応用編　[関数（メソッド）を使ってみよう](https://qiita.com/tau14/items/6e875492afd3d5915ea0)
- 番外編　[環境構築をしてみよう](https://qiita.com/tau14/items/edc12e66548ad8c669f4)