SlideShare a Scribd company logo
アルゴリズムとデータ構造

  2011.12.16 (WEB用)
今日の内容
           第4章 ループと配列

• 4.2   while ループ

• 4.3   配列でデータの集合を扱う
• 4.4   配列データをforループで扱う
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ループはある条件が
よって、ループ回数を指定                満たされる限り、ループを
                            続ける
whileloop1.rb
1   # whileloop1.rb
2   i = 100
3   while i > 0
4      puts i
5      i -= 7
6   end
whileloop1.rb
1   # whileloop1.rb
2   i = 100
3   while i > 0
4      puts i
5      i -= 7
6   end

                while 論理式
                  処理文
                end
       while ループは上記のような構造になっている
whileloop1.rb
1   # whileloop1.rb
2   i = 100         # まず始めに 変数 i に 100を代入
3   while i > 0
4      puts i
5      i -= 7
6   end

               while 論理式
                 処理文
               end
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 を返せば、処理文が実行される
whileloop1.rb
1   # whileloop1.rb
2   i = 100
3   while i > 0
4      puts i
5      i -= 7
6   end

                while 論理式
                  処理文
                end
      処理が終了したら、一旦 while がある行まで戻る
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 を返す限り処理が実行されループを繰り返す
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
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
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
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

               処理が実行されずループを抜ける
無限ループ
1   # whileloop1.rb
2   i = 100
3   while i > 0
4      puts i
5      i -= 7
6   end

ちなみに whileloop1.rb の5行目を削除すると・・・
無限ループ
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 である限りループはまわり続けるので
       ループが止まらない!(無限ループの完成)
強制終了の仕方
収束の判定
初項が 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
                                        となる。
収束の判定
初項が a で公比が r である数列の和は r < 1 のとき,
以下のように収束することがわかっている
                                    
                                              a
 a  ar  ar  ar    ar       ar 
            2     3        i             i

                                      i      1 r



この部分の計算をある程度の項数まで行うプログラム
を作成し、結果の値がどれだけ近いかを見てみる
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
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
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 より
    小さくなれば、十分収束していると考え、ループの終了
    条件としている
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
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 の値を出力
出力結果
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
問題
whileloop2.rb で出力した和の値(1.99999998509884)
は、実際、第何項までを足し合わせたものか。

ループした回数をカウントするようにプログラムを改良
し、ループ回数を出力して答えなさい。
解答例
# 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
ループの細かい制御

ループは break, next, redo を使って制御することも出来る


 命令                   用途
 break   繰り返しを中断し、ループから抜ける
 next    残りの処理を飛ばし、次のループに入る
 redo    同じ条件で繰り返しをやり直す
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
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
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

ちょっとした仕掛けが隠されている
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

ちょっとした仕掛けが隠されている
配列データ
たくさんのデータ(変数)がある場合、それらを一つの
箱(配列)に入れて整理すると、扱いやすくなります

                  変数3 = 3
                                   変数6 = 10
    変数1 = 5
                         変数4 = 6
       変数2 = 7                     変数5 = 9




    配列 =      5      7     3   6    9   10
配列のデータ構造
      例:6個の数値データが入った配列

                5    7      3   6   9   10



ar = [5 , 7, 3, 6, 9, 10]       # 配列データの生成




大括弧の中にカンマ区切りで各データを記述し、
           ar という変数に代入している
配列のデータ構造
       0から始まる!
          ↓
    添え字 → ⓪ ①               ②   ③   ④   ⑤

                5    7      3   6   9   10



ar = [5 , 7, 3, 6, 9, 10]       # 配列データの生成




     配列には添え字(0〜n)がついている
  各添え字に対応するデータを要素と呼ぶ
配列のデータ構造
    添え字 → ⓪          ①      ②   ③    ④      ⑤

     配列 =       5    7      3    6      9   10



ar = [5 , 7, 3, 6, 9, 10]
puts ar[0]                      #=> 5
puts ar[1]                      #=> 7
puts ar[5]                      #=> 3


          各要素は添え字番号を用いて
          配列から参照することが出来る
配列のデータ構造
     添え字 → ⓪         ①    ②    ③   ④   ⑤

      配列 =      5    7    3    6   9   10



 ar = [5 , 7, 3, 6, 9, 10]
 puts ar[0]
 puts ar[1]
 puts ar[5]
 puts ar.size              #=> 6

配列に対して .size (もしくは .length )メソッドを
働かせると、配列のサイズ(要素数)が返ってくる
配列の特徴
• 一つの変数を用意するだけで、たくさんのデータを
  扱うことができる。

• 数値だけでなく、文字列や論理値といった異なる
  データ型をひとつの配列内に収めることができる。
  (配列の中に配列を入れることも可能)

• 配列に対するメソッドが充実しており、効率のよい
  データ処理ができる。
総和や平均の計算
82 24 12 27 18 78 19 86 45 41 64 16 86 11 16 15 30 25 10 26



  多数の数値の総和、平均を計算するプログラムを
  配列とループを用いて書いてみましょう。


     データの総和                           82 + 24 + ・・・ + 26
平均 =                           =
     データの総数                                  20
総和や平均の計算
1   # average.rb
2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
3   n = ar.size
4   sum = 0
5   for i in 0 .. n-1
6     sum += ar[i]
7   end
8   average = sum.to_f / n
9   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
総和や平均の計算
1   # average.rb
2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
3   n = ar.size               # 数値が入った配列 ar を用意
4   sum = 0
5   for i in 0 .. n-1
6     sum += ar[i]
7   end
8   average = sum.to_f / n
9   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
総和や平均の計算
1   # average.rb
2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
3   n = ar.size               # .size メソッドで配列内の
4   sum = 0                   # データ数を n に代入(n = 20)
5   for i in 0 .. n-1
6     sum += ar[i]
7   end
8   average = sum.to_f / n
9   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
総和や平均の計算
1   # average.rb
2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
3   n = ar.size
4   sum = 0                   # 総和を求めるため
5   for i in 0 .. n-1         # 変数sumを用意
6     sum += ar[i]
7   end
8   average = sum.to_f / n
9   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
総和や平均の計算
1   # average.rb
2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
3   n = ar.size
4   sum = 0
5   for i in 0 .. n-1
6     sum += ar[i]            # for ループで各数を足していく
7   end
8   average = sum.to_f / n
9   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
総和や平均の計算
1   # average.rb
2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
3   n = ar.size
4   sum = 0
5   for i in 0 .. n-1
6     sum += ar[i]            # 範囲オブジェクトの初期値に
7   end                       # 注目! 0から始まっている
8   average = sum.to_f / n
9   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)



 ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩                            ⑲
[82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
総和や平均の計算
1   # average.rb
2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
3   n = ar.size
4   sum = 0                   # 最初に i に 0 が代入され
5   for i in 0 .. n-1         # 配列の0番目(=82)を参照
6     sum += ar[i]            # += で sumに自己代入
7   end
8   average = sum.to_f / n
9   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)



 ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩                            ⑲
[82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
総和や平均の計算
1   # average.rb
2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
3   n = ar.size
4   sum = 0
5   for i in 0 .. n-1         # 次にループで戻り i に 1 が
6     sum += ar[i]            # 代入され、配列の次の要素を
7   end                       # 参照し、sum に自己代入
8   average = sum.to_f / n
9   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)



 ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩                            ⑲
[82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
総和や平均の計算
 1   # average.rb
 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
 3   n = ar.size
 4   sum = 0
                               # 以後、i が n – 1になるまで
 5   for i in 0 .. n-1
 6     sum += ar[i]            # 繰り返し
 7   end
 8   average = sum.to_f / n
 9   print “和は ”, sum, “, 平均は “, average, “です。¥n”
10   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)

  ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩                            ⑲
 [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
総和や平均の計算
1   # average.rb
2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
3   n = ar.size
4   sum = 0                   # 添え字は0 から始まるので
5   for i in 0 .. n-1         # n 個目のデータは n -1 番目
6     sum += ar[i]            # となり、これがループの終値
7   end
8   average = sum.to_f / n
9   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)



 ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩                            ⑲
[82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
総和や平均の計算
1   # average.rb
2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
3   n = ar.size
4   sum = 0
5   for i in 0 .. n-1         # ループ終了時点で sum は
6     sum += ar[i]            #全ての値の総和(=731)に
7   end                       # なっている
8   average = sum.to_f / n
9   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
総和や平均の計算
1   # average.rb
2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
3   n = ar.size
4   sum = 0
5   for i in 0 .. n-1
6     sum += ar[i]            # sum を n で割り、平均を計算
7   end                       # 結果を変数 averageに代入
8   average = sum.to_f / n # (731.0 ÷ 20)
9   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
総和や平均の計算
1   # average.rb
2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
3   n = ar.size
4   sum = 0
5   for i in 0 .. n-1
6     sum += ar[i]
                              # 結果を出力
7   end
8   average = sum.to_f / n
9   printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
第4章まとめ
• ループを使うことで同じような処理を繰り返し行う。
  - for ループ  ⇒ ループ回数を指定
  - whileループ ⇒ 条件に応じてループを継続

• たくさんのデータを扱うときは、ひとつの配列にまと
  めることで、処理が簡便になる。

• if文、ループ文、配列を組み合わせることで、プログ
  ラミングの幅が大分広がります。

More Related Content

What's hot

WUPC2012
WUPC2012WUPC2012
WUPC2012
Dai Hamada
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
 
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章
Yuta Yokoi
 
Parsing Left Recursive PEG
Parsing Left Recursive PEGParsing Left Recursive PEG
Parsing Left Recursive PEG
Takayuki Goto
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
 
モナドがいっぱい!
モナドがいっぱい!モナドがいっぱい!
モナドがいっぱい!
Kenta Sato
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイドShinta Hatatani
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
Kenta Hattori
 
詳説ぺちぺち
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺちdo_aki
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
Masao Kato
 
初めてのHaskell (表)
初めてのHaskell (表)初めてのHaskell (表)
初めてのHaskell (表)
karky7
 
2011年11月18日
2011年11月18日2011年11月18日
2011年11月18日nukaemon
 

What's hot (12)

WUPC2012
WUPC2012WUPC2012
WUPC2012
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章
 
Parsing Left Recursive PEG
Parsing Left Recursive PEGParsing Left Recursive PEG
Parsing Left Recursive PEG
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
モナドがいっぱい!
モナドがいっぱい!モナドがいっぱい!
モナドがいっぱい!
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイド
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
 
詳説ぺちぺち
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺち
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
初めてのHaskell (表)
初めてのHaskell (表)初めてのHaskell (表)
初めてのHaskell (表)
 
2011年11月18日
2011年11月18日2011年11月18日
2011年11月18日
 

Viewers also liked

2011年10月28日
2011年10月28日2011年10月28日
2011年10月28日nukaemon
 
2011年12月2日
2011年12月2日2011年12月2日
2011年12月2日nukaemon
 
2011年11月25日
2011年11月25日2011年11月25日
2011年11月25日nukaemon
 
2012年1月13日
2012年1月13日2012年1月13日
2012年1月13日nukaemon
 
2011年11月11日
2011年11月11日2011年11月11日
2011年11月11日nukaemon
 
2012年1月20日
2012年1月20日2012年1月20日
2012年1月20日nukaemon
 
公開鍵、秘密鍵ってなに?
公開鍵、秘密鍵ってなに?公開鍵、秘密鍵ってなに?
公開鍵、秘密鍵ってなに?
kenji4569
 

Viewers also liked (7)

2011年10月28日
2011年10月28日2011年10月28日
2011年10月28日
 
2011年12月2日
2011年12月2日2011年12月2日
2011年12月2日
 
2011年11月25日
2011年11月25日2011年11月25日
2011年11月25日
 
2012年1月13日
2012年1月13日2012年1月13日
2012年1月13日
 
2011年11月11日
2011年11月11日2011年11月11日
2011年11月11日
 
2012年1月20日
2012年1月20日2012年1月20日
2012年1月20日
 
公開鍵、秘密鍵ってなに?
公開鍵、秘密鍵ってなに?公開鍵、秘密鍵ってなに?
公開鍵、秘密鍵ってなに?
 

2011年12月16日

  • 2. 今日の内容 第4章 ループと配列 • 4.2 while ループ • 4.3 配列でデータの集合を扱う • 4.4 配列データをforループで扱う
  • 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
  • 27. ループの細かい制御 ループは break, next, redo を使って制御することも出来る 命令 用途 break 繰り返しを中断し、ループから抜ける next 残りの処理を飛ばし、次のループに入る redo 同じ条件で繰り返しをやり直す
  • 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 ちょっとした仕掛けが隠されている
  • 33. 配列のデータ構造 例:6個の数値データが入った配列 5 7 3 6 9 10 ar = [5 , 7, 3, 6, 9, 10] # 配列データの生成 大括弧の中にカンマ区切りで各データを記述し、 ar という変数に代入している
  • 34. 配列のデータ構造 0から始まる! ↓ 添え字 → ⓪ ① ② ③ ④ ⑤ 5 7 3 6 9 10 ar = [5 , 7, 3, 6, 9, 10] # 配列データの生成 配列には添え字(0〜n)がついている 各添え字に対応するデータを要素と呼ぶ
  • 35. 配列のデータ構造 添え字 → ⓪ ① ② ③ ④ ⑤ 配列 = 5 7 3 6 9 10 ar = [5 , 7, 3, 6, 9, 10] puts ar[0] #=> 5 puts ar[1] #=> 7 puts ar[5] #=> 3 各要素は添え字番号を用いて 配列から参照することが出来る
  • 36. 配列のデータ構造 添え字 → ⓪ ① ② ③ ④ ⑤ 配列 = 5 7 3 6 9 10 ar = [5 , 7, 3, 6, 9, 10] puts ar[0] puts ar[1] puts ar[5] puts ar.size #=> 6 配列に対して .size (もしくは .length )メソッドを 働かせると、配列のサイズ(要素数)が返ってくる
  • 37. 配列の特徴 • 一つの変数を用意するだけで、たくさんのデータを 扱うことができる。 • 数値だけでなく、文字列や論理値といった異なる データ型をひとつの配列内に収めることができる。 (配列の中に配列を入れることも可能) • 配列に対するメソッドが充実しており、効率のよい データ処理ができる。
  • 38. 総和や平均の計算 82 24 12 27 18 78 19 86 45 41 64 16 86 11 16 15 30 25 10 26 多数の数値の総和、平均を計算するプログラムを 配列とループを用いて書いてみましょう。 データの総和 82 + 24 + ・・・ + 26 平均 = = データの総数 20
  • 39. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 sum = 0 5 for i in 0 .. n-1 6 sum += ar[i] 7 end 8 average = sum.to_f / n 9 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
  • 40. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size # 数値が入った配列 ar を用意 4 sum = 0 5 for i in 0 .. n-1 6 sum += ar[i] 7 end 8 average = sum.to_f / n 9 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
  • 41. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size # .size メソッドで配列内の 4 sum = 0 # データ数を n に代入(n = 20) 5 for i in 0 .. n-1 6 sum += ar[i] 7 end 8 average = sum.to_f / n 9 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
  • 42. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 sum = 0 # 総和を求めるため 5 for i in 0 .. n-1 # 変数sumを用意 6 sum += ar[i] 7 end 8 average = sum.to_f / n 9 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
  • 43. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 sum = 0 5 for i in 0 .. n-1 6 sum += ar[i] # for ループで各数を足していく 7 end 8 average = sum.to_f / n 9 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
  • 44. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 sum = 0 5 for i in 0 .. n-1 6 sum += ar[i] # 範囲オブジェクトの初期値に 7 end # 注目! 0から始まっている 8 average = sum.to_f / n 9 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average) ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
  • 45. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 sum = 0 # 最初に i に 0 が代入され 5 for i in 0 .. n-1 # 配列の0番目(=82)を参照 6 sum += ar[i] # += で sumに自己代入 7 end 8 average = sum.to_f / n 9 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average) ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
  • 46. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 sum = 0 5 for i in 0 .. n-1 # 次にループで戻り i に 1 が 6 sum += ar[i] # 代入され、配列の次の要素を 7 end # 参照し、sum に自己代入 8 average = sum.to_f / n 9 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average) ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
  • 47. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 sum = 0 # 以後、i が n – 1になるまで 5 for i in 0 .. n-1 6 sum += ar[i] # 繰り返し 7 end 8 average = sum.to_f / n 9 print “和は ”, sum, “, 平均は “, average, “です。¥n” 10 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average) ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
  • 48. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 sum = 0 # 添え字は0 から始まるので 5 for i in 0 .. n-1 # n 個目のデータは n -1 番目 6 sum += ar[i] # となり、これがループの終値 7 end 8 average = sum.to_f / n 9 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average) ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26]
  • 49. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 sum = 0 5 for i in 0 .. n-1 # ループ終了時点で sum は 6 sum += ar[i] #全ての値の総和(=731)に 7 end # なっている 8 average = sum.to_f / n 9 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
  • 50. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 sum = 0 5 for i in 0 .. n-1 6 sum += ar[i] # sum を n で割り、平均を計算 7 end # 結果を変数 averageに代入 8 average = sum.to_f / n # (731.0 ÷ 20) 9 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
  • 51. 総和や平均の計算 1 # average.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 sum = 0 5 for i in 0 .. n-1 6 sum += ar[i] # 結果を出力 7 end 8 average = sum.to_f / n 9 printf( “和は %4d 平均は %5.2f です。¥n”, sum, average)
  • 52. 第4章まとめ • ループを使うことで同じような処理を繰り返し行う。 - for ループ ⇒ ループ回数を指定 - whileループ ⇒ 条件に応じてループを継続 • たくさんのデータを扱うときは、ひとつの配列にまと めることで、処理が簡便になる。 • if文、ループ文、配列を組み合わせることで、プログ ラミングの幅が大分広がります。