(DAY4) 俺と学ぶRust言語~for~

## 今日の内容
- for文

# はじめに
[前回](https://qiita.com/FUKAch/items/e2830371179a0ee8a2a4)はFizzBuzz問題に挑戦してみました。今回は、for文について学んでいきます。また、実際にfor文を使って、九九の表と累乗の表を作ってみましょう。

# for文
[前回](https://qiita.com/FUKAch/items/e2830371179a0ee8a2a4)でもfor文について少し学びましたが、もう一度復習してみましょう。
for文とは、ループ処理のうちの一つで、主に「この処理を、n回繰り返したい」というときに使われる構文です。
文法は言語によって異なりますが、Rustでは次のようになります。
for 変数 in a..b {処理}
これは「変数」が「a」から「bの1つ前」まで繰り返します。
また、
for 変数 in a..=b {処理}
このようにすることで、「a」から「b」まで繰り返すこともできます。

# 九九の表を作ろう
さて、for文を使って、九九の表を作成してみましょう。以下のような表になります。
```
1,  2,  3,  4,  5,  6,  7,  8,  9,
2,  4,  6,  8, 10, 12, 14, 16, 18,
3,  6,  9, 12, 15, 18, 21, 24, 27,
4,  8, 12, 16, 20, 24, 28, 32, 36,
5, 10, 15, 20, 25, 30, 35, 40, 45,
6, 12, 18, 24, 30, 36, 42, 48, 54,
7, 14, 21, 28, 35, 42, 49, 56, 63,
8, 16, 24, 32, 40, 48, 56, 64, 72,
9, 18, 27, 36, 45, 54, 63, 72, 81,
```
for文を使ってどのようにすれば九九の表を作れるでしょうか。
答えはこのようになります。
```rust
fn main(){
    for y in 1..10{
        for x in 1..10{
            print!("{:3},",x*y);
        }
        println!("");
    }
}
/******** 出力結果 *******
  1,  2,  3,  4,  5,  6,  7,  8,  9,
  2,  4,  6,  8, 10, 12, 14, 16, 18,
  3,  6,  9, 12, 15, 18, 21, 24, 27,
  4,  8, 12, 16, 20, 24, 28, 32, 36,
  5, 10, 15, 20, 25, 30, 35, 40, 45,
  6, 12, 18, 24, 30, 36, 42, 48, 54,
  7, 14, 21, 28, 35, 42, 49, 56, 63,
  8, 16, 24, 32, 40, 48, 56, 64, 72,
  9, 18, 27, 36, 45, 54, 63, 72, 81,
*************************/
```
for文の中にfor文が入っていますね。
上から1行ずつ実行されるので、その順番に動作を予測していきましょう。
1行目のmain関数は既に学んだので大丈夫ですね。
2行目が早速for文になっています。変数「y」が「1」から「10の1つ前」まで[インクリメント](https://wa3.i-3-i.info/word1697.html)しながら繰り返されます。
3行目もfor文になっています。変数「x」が「1」から「10の1つ前」まで[インクリメント](https://wa3.i-3-i.info/word1697.html)しながら繰り返されます。ここで、2行目のfor文の「{ }（ブロック）」の中に入っているので「y」が1増えるたびに「x」が1から9まで繰り返されます。
4行目はprint!マクロになっています。これは**改行なし**で文字列を画面出力するマクロです。ここまではすでに第二回「画面出力」で学びました。しかし、その中身が異様ですね。"{}"（プレースホルダ）も学びましたが、"{:3}"は初めて見る方もいるかと思います。まあ、なんてことないのですが、右詰めです。今回のように文字列を揃えて綺麗に出力したいときによくつかわれます。今回は":3"となっているので、右に文字を詰めて、足りない文字数分は、スペースで埋める、という意味になります。ですので、
```
1,2,3,4,5,6,7,8,9
2,4,6,8,10,12,14,16,18,
```
ではなく、
```
  1,  2,  3,  4,  5,  6,  7,  8,  9
  2,  4,  6,  8, 10, 12, 14, 16, 18,
```
このように揃えて出力することができます。
5行目は閉じカッコですので、二個目のforのループ処理の端を示しています。
6行目は、横に全て表示しきったとき、改行をはさみたいので、println!マクロをつかって、改行だけをしています。
7行目はまた閉じカッコです。これは一個目のforのループ処理の端を示しています。
8行目はmain関数の端を示しています。

このようにして、九九の表を作成することができました。
次はx,x^2,x^3の表を（1≦x≦100）で出力するプログラムを作成してみましょう。
完成した表はこちらです。
```
  x   x^2     x^3
  1     1       1
  2     4       8
  3     9      27
  4    16      64
  5    25     125
  6    36     216
  7    49     343
  8    64     512
  9    81     729
 10   100    1000
 11   121    1331
 12   144    1728
 13   169    2197
 14   196    2744
 15   225    3375
 16   256    4096
 17   289    4913
 18   324    5832
 19   361    6859
 20   400    8000
 21   441    9261
 22   484   10648
 23   529   12167
 24   576   13824
 25   625   15625
 26   676   17576
 27   729   19683
 28   784   21952
 29   841   24389
 30   900   27000
 31   961   29791
 32  1024   32768
 33  1089   35937
 34  1156   39304
 35  1225   42875
 36  1296   46656
 37  1369   50653
 38  1444   54872
 39  1521   59319
 40  1600   64000
 41  1681   68921
 42  1764   74088
 43  1849   79507
 44  1936   85184
 45  2025   91125
 46  2116   97336
 47  2209  103823
 48  2304  110592
 49  2401  117649
 50  2500  125000
 51  2601  132651
 52  2704  140608
 53  2809  148877
 54  2916  157464
 55  3025  166375
 56  3136  175616
 57  3249  185193
 58  3364  195112
 59  3481  205379
 60  3600  216000
 61  3721  226981
 62  3844  238328
 63  3969  250047
 64  4096  262144
 65  4225  274625
 66  4356  287496
 67  4489  300763
 68  4624  314432
 69  4761  328509
 70  4900  343000
 71  5041  357911
 72  5184  373248
 73  5329  389017
 74  5476  405224
 75  5625  421875
 76  5776  438976
 77  5929  456533
 78  6084  474552
 79  6241  493039
 80  6400  512000
 81  6561  531441
 82  6724  551368
 83  6889  571787
 84  7056  592704
 85  7225  614125
 86  7396  636056
 87  7569  658503
 88  7744  681472
 89  7921  704969
 90  8100  729000
 91  8281  753571
 92  8464  778688
 93  8649  804357
 94  8836  830584
 95  9025  857375
 96  9216  884736
 97  9409  912673
 98  9604  941192
 99  9801  970299
100 10000 1000000
```
まずは自分で考えて作成してみましょう。
また、模範解答を載せますが、解説はしません。九九の表の解説がわかれば、それより簡単なのですぐに理解できると思います。
```rust
//答え
fn main(){
    println!("  x   x^2     x^3");
    for x in 1..101{
        println!("{:3} {:5} {:7}", x, x*x, x*x*x);
    }
}
```
どうでしょうか。できましたでしょうか。

# おわりに
おつかれさまでした。今回は、100DaysOfCode 四日目として、for文について学びました。
mapを使ったりしてもっと美しく表示できるようにしたかったですが、時間がないのでここまでにします。（そもそもmapをあまり理解できてないということはおいといて）
次回はフィボナッチ数列を求めるプログラムを作成します。
ご精読、ありがとうございました。