3. while ループ
forループ while ループ
# forloop.rb # whileloop.rb
n = ARGV[0].to_i i= 100
sum = 0 where i > 0
for i in 1 .. n puts i
sum += i ** 2 i -= 7
end end
puts sum
forループは範囲オブジェクトに whileループはある条件が
よって、ループ回数を指定 満たされる限り、ループを
続ける
4. whileloop1.rb
1 # whileloop1.rb
2 i = 100
3 while i > 0
4 puts i
5 i -= 7
6 end
5. whileloop1.rb
1 # whileloop1.rb
2 i = 100
3 while i > 0
4 puts i
5 i -= 7
6 end
while 論理式
処理文
end
while ループは上記のような構造になっている
6. whileloop1.rb
1 # whileloop1.rb
2 i = 100 # まず始めに 変数 i に 100を代入
3 while i > 0
4 puts i
5 i -= 7
6 end
while 論理式
処理文
end
7. whileloop1.rb
1 # whileloop1.rb
2 i = 100 true
3 while i > 0
4 puts i #=> 100
5 i -= 7 # この時点で i の値は 93 になる
6 end
true
while 論理式
処理文
end
もし論理式が true を返せば、処理文が実行される
8. whileloop1.rb
1 # whileloop1.rb
2 i = 100
3 while i > 0
4 puts i
5 i -= 7
6 end
while 論理式
処理文
end
処理が終了したら、一旦 while がある行まで戻る
9. whileloop1.rb
1 # whileloop1.rb
2 i = 100 true
3 while i > 0 # 93 > 0 なので true
4 puts i #=> 93
5 i -= 7 # この時点で i の値は 86 になる
6 end
true
while 論理式
処理文
end
論理式が true を返す限り処理が実行されループを繰り返す
10. whileloop1.rb
1 # whileloop1.rb
2 i = 100 true
3 while i > 0
4 puts i
5 i -= 7 # ループごとに7がひかれていく
6 end
> ruby whileloop1.rb
100
93
86
79
72
65
11. whileloop1.rb
1 # whileloop1.rb
2 i = 100 true
3 while i > 0
4 puts i
5 i -= 7 # ループごとに7がひかれていく
6 end
58
51
44
37
30
23
16
12. whileloop1.rb
1 # whileloop1.rb
2 i = 100 true
3 while i > 0
4 puts i #=> 2
5 i -= 7 # この時点で i の値は -5 になっている
6 end
9
2
13. whileloop1.rb
1 # whileloop1.rb
2 i = 100 false
3 while i > 0 # -5 < 0 なので false
4 puts i
5 i -= 7
6 end
論理式が false を返した場合
false
while 論理式
処理文
end
処理が実行されずループを抜ける
14. 無限ループ
1 # whileloop1.rb
2 i = 100
3 while i > 0
4 puts i
5 i -= 7
6 end
ちなみに whileloop1.rb の5行目を削除すると・・・
15. 無限ループ
1 # whileloop1.rb
true!
出番がない・・・
2 i = 100true! false
true!
true!
3 while i > 0 true!
4 puts i true!
5 i -= 7
6 end
ちなみに whileloop1.rb の5行目を削除すると・・・
論理式が true である限りループはまわり続けるので
ループが止まらない!(無限ループの完成)
17. 収束の判定
初項が a で公比が r である数列の和は r < 1 のとき,
以下のように収束することがわかっている
a
a ar ar ar ar ar
2 3 i i
i 1 r
例えば初項が 1、公比が 0.5 の場合
a 1
2
1 r 1 0.5
となる。
18. 収束の判定
初項が a で公比が r である数列の和は r < 1 のとき,
以下のように収束することがわかっている
a
a ar ar ar ar ar
2 3 i i
i 1 r
この部分の計算をある程度の項数まで行うプログラム
を作成し、結果の値がどれだけ近いかを見てみる
19. whileloop2.rb
1 # whileloop2.rb
2 a = 1.0
3 r = 0.5
4 sum = 0
5 while a > 1.0e-8
6 sum += a
7 a *= r
8 end
9 puts sum
初項 1、公比 0.5 の場合、収束和は1.0 /(1 – 0.5) = 2
20. whileloop2.rb
1 # whileloop2.rb
2 a = 1.0 # 初項
3 r = 0.5 # 公比
4 sum = 0 #和
5 while a > 1.0e-8
6 sum += a
7 a *= r
8 end
9 puts sum
21. whileloop2.rb
1 # whileloop2.rb
2 a = 1.0
3 r = 0.5
4 sum = 0
5 while a > 1.0e-8 # 項の値が十分小さくなるまで*
6 sum += a # sumに足し続ける
7 a *= r
8 end
9 puts sum
*ここでは項の値が 1.0e-8、つまり0.00000001 より
小さくなれば、十分収束していると考え、ループの終了
条件としている
22. whileloop2.rb
1 # whileloop2.rb
2 a = 1.0
3 r = 0.5
4 sum = 0
5 while a > 1.0e-8
6 sum += a
7 a *= r # 次のループに移る前に
8 end # 公比をかけてaの値を次項に更新
9 puts sum
23. whileloop2.rb
1 # whileloop2.rb
2 a = 1.0
3 r = 0.5
4 sum = 0 false
5 while a > 1.0e-8 # a の値が1.0e-8を下回ったら
6 sum += a
7 a *= r
8 end # ループを抜け
9 puts sum # sum の値を出力
24. 出力結果
1 # whileloop2.rb
2 a = 1.0
3 r = 0.5
4 sum = 0
5 while a > 1.0e-8
6 sum += a
7 a = r
8 end
*
9 puts sum
> ruby whileloop2.rb
1.99999998509884
26. 解答例
# whileloop2.rb
a = 1.0
r = 0.5
sum = 0
count = 0 # ループ回数をカウントする変数を用意
while a > 1.0e-8
sum += a
a = r
*
count += 1 # ループの度に一つずつ増やす
end
puts sum
puts count # ループ回数(項数)の出力
#=> 27
28. break の使い方
1 # whilebreak.rb
2 while true
3 n = rand(100)
4 puts n
5 if n % 45 == 0 then
6 break
7 end
8 end
29. break の使い方
1 # whilebreak.rb
2 while true # 常に true を返す→無限ループ
3 n = rand(100)
4 puts n
5 if n % 45 == 0 then
6 break
7 end
8 end
30. break の使い方
1 # whilebreak.rb
2 while true
3 n = rand(100) # ランダムに0から99の数を取得
4 puts n # その数を出力
5 if n % 45 == 0 then
6 break
7 end
8 end
ちょっとした仕掛けが隠されている
31. break の使い方
1 # whilebreak.rb
2 while true
3 n = rand(100)
4 puts n
5 if n % 45 == 0 then # もしその数が45で割れたら
6 break # ループを抜け出せる
7 end
8 end
ちょっとした仕掛けが隠されている