アルゴリズムとデータ構造  2011.12.9 (WEB用)
今日の内容           第4章 ループと配列• 4.1   for ループ
プログラムの処理イメージ # datatype.rb str 1= ARGV[0] str2 = ARGV[1] print str1 + str2      # oddeven.rb n1 = str1.to_i         n = AR...
for ループで繰り返す 1 # forloop1.rb 2 for i in 5 .. 10 3     puts i 4 end上のスクリプト実行すると以下のように6行の結果が出力される   > ruby forloop1.rb   5  ...
for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 103     puts i4 end  for ループを使って繰り返し処理をしている。
for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 103     puts i4 end          ループ変数      範囲リテラル             ↓        ↓          ...
for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10     #i=53     puts i4 end    まずはじめに”5”が i に代入され、3行目を実行。  > ruby forloop1.rb  5
for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10     #i=63     puts i4 end      次に一旦2行目に戻り、”6”が i に代入される  > ruby forloop1.rb  5
for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10      #i=63     puts i4 end                     再び3行目を実行  > ruby forloop1.rb ...
for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10     #i=73     puts i4 end                これを1つずつ繰り返す  > ruby forloop1.rb  5 ...
for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10     #i=83     puts i4 end                これを1つずつ繰り返す  > ruby forloop1.rb  5 ...
for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10     #i=93     puts i4 end                これを1つずつ繰り返す  > ruby forloop1.rb  5 ...
for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10     # i = 103     puts i4 end  範囲の終値(ここでは10)までくると、ループはストップ  > ruby forloop1....
範囲オブジェクト[初期値] .. [終値] のように書かれたリテラルは    範囲オブジェクトとして扱われる           5 .. 10            ↑          範囲演算子
範囲オブジェクト 下の例では 「5から10までの整数」 を表しており初期値と終値(初期値<終値)には整数しか使えない            5 .. 10       [5, 6, 7, 8, 9, 10]
問題 4-1• for ループを使って、”おはよう!” という文字列を  100回改行しながら出力するプログラムを書きなさい。• ファイル名は “ohayou.rb”  (自分が分かればファイル名は何でも構いません)
問題 4-1 解答例# ohayou.rbfor i in 1 .. 100   puts “おはよう!”end
出力行数の調べ方  # ohayou.rb  for i in 1 .. 100     puts “おはよう!”  end 実際に何行出力されたかを調べるには、以下のようにruby の実行コマンドの後にパイプ (|)とwc コマンド (wc ...
問題 4-2• for ループを使って、 5, 10, 15, .... , 100 と、100まで  の5の倍数を改行しながら出力するプログラムを書  きなさい。• ヒント:終値は 100 にする必要はない。• ファイル名は “multipl...
問題 4-2 解答例1# multiple.rbfor i in 1 .. 20   puts i * 5end
問題 4-2 解答例2# multiple.rbfor i in 1 .. 100   # 1から100まで全ての整数   if i % 5 == 0    # 5の倍数かチェック       puts i   endend
和を計算する 1   # sumsquare.rb 2   n = ARGV[0].to_i 3   sum = 0 4   for i in 1 .. n 5      sum += i 6   end 7   puts sum 繰り返し処理...
和を計算する 1   # sumsquare.rb 2   n = ARGV[0].to_i 3   sum = 0 4   for i in 1 .. n 5      sum += i 6   end 7   puts sum範囲オブジェク...
和を計算する1   # sumsquare.rb2   n = ARGV[0].to_i3   sum = 04   for i in 1 .. n5      sum += i6   end7   puts sum    あとは 1からn ま...
和を計算する1   # sumsquare.rb2   n = ARGV[0].to_i3   sum = 04   for i in 1 .. n5      sum += i6   end7   puts sum      足し合わされた合...
問題 4-3• 正の整数 n が与えられたとき、 2n - 1 は 1, 3, 5, ....  と、「1から数えて n番目」の奇数の値になる。コマン  ドラインから正の整数 n を受け取って、1 から 2n - 1  までの奇数の和を求めるプ...
問題 4-3 解答例# odd_sum.rbn = ARGV[0].to_isum = 0for i in 1 .. n   sum += 2 * i - 1endputs sum
for の二重ループ1 # 9x9.rb2 for i in 1 .. 93    for j in 1 .. 94        print “#{i * j} “5    end6    puts7 end forループの中に別のforルー...
for の二重ループ1 # 9x9.rb                 第1ループ2 for i in 1 .. 9 第2ループ3    for j in 1 .. 94        print “#{i * j} “5    end6  ...
for の二重ループ1 # 9x9.rb2 for i in 1 .. 9            #i=13    for j in 1 .. 94        print “#{i * j} “5    end6    puts7 endi...
9x9.rb の実行結果> ruby 9x9.rb1234567892 4 6 8 10 12 14 16 183 6 9 12 15 18 21 24 274 8 12 16 20 24 28 32 365 10 15 20 25 30 35...
問題4-49x9.rb を改良して、下のように整形された出力をしなさい。      (ヒント: 数字は常に3桁の幅に納まっている) > ruby 9x9.rb  1 2 3 4 5 6 7 8 9  2 4 6 8 10 12 14 16 18...
問題4-4 解答例# 9x9.rbfor i in 1 .. 9   for j in 1 .. 9       printf (%3d, i * j)   end   putsend
Upcoming SlideShare
Loading in …5
×

2011年12月9日

560 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
560
On SlideShare
0
From Embeds
0
Number of Embeds
88
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

2011年12月9日

  1. 1. アルゴリズムとデータ構造 2011.12.9 (WEB用)
  2. 2. 今日の内容 第4章 ループと配列• 4.1 for ループ
  3. 3. プログラムの処理イメージ # datatype.rb str 1= ARGV[0] str2 = ARGV[1] print str1 + str2 # oddeven.rb n1 = str1.to_i n = ARGV[0].to_i n2 = str2.to_i if n % 2 == 0 then print n1 + n2, “¥n” puts “#{n}は偶数です.” print n1 / n2, “¥n” # sumsquare.rb else n = ARGV[0].to_i puts “#{n}は奇数です.” sum = 0 end for i in 1 .. n sum += I ** 2上から下へ1行1行 end単純処理 puts sum 条件分岐で実行文を 選択的に処理 ループ文で実行文を 繰り返し処理
  4. 4. for ループで繰り返す 1 # forloop1.rb 2 for i in 5 .. 10 3 puts i 4 end上のスクリプト実行すると以下のように6行の結果が出力される > ruby forloop1.rb 5 6 7 8 9 10
  5. 5. for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 103 puts i4 end for ループを使って繰り返し処理をしている。
  6. 6. for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 103 puts i4 end ループ変数 範囲リテラル ↓ ↓ for i in 5 .. 10 処理文 end
  7. 7. for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10 #i=53 puts i4 end まずはじめに”5”が i に代入され、3行目を実行。 > ruby forloop1.rb 5
  8. 8. for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10 #i=63 puts i4 end 次に一旦2行目に戻り、”6”が i に代入される > ruby forloop1.rb 5
  9. 9. for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10 #i=63 puts i4 end 再び3行目を実行 > ruby forloop1.rb 5 6
  10. 10. for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10 #i=73 puts i4 end これを1つずつ繰り返す > ruby forloop1.rb 5 6 7
  11. 11. for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10 #i=83 puts i4 end これを1つずつ繰り返す > ruby forloop1.rb 5 6 7 8
  12. 12. for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10 #i=93 puts i4 end これを1つずつ繰り返す > ruby forloop1.rb 5 6 7 8 9
  13. 13. for ループで繰り返す1 # forloop1.rb2 for i in 5 .. 10 # i = 103 puts i4 end 範囲の終値(ここでは10)までくると、ループはストップ > ruby forloop1.rb 5 6 7 8 9 10
  14. 14. 範囲オブジェクト[初期値] .. [終値] のように書かれたリテラルは 範囲オブジェクトとして扱われる 5 .. 10 ↑ 範囲演算子
  15. 15. 範囲オブジェクト 下の例では 「5から10までの整数」 を表しており初期値と終値(初期値<終値)には整数しか使えない 5 .. 10 [5, 6, 7, 8, 9, 10]
  16. 16. 問題 4-1• for ループを使って、”おはよう!” という文字列を 100回改行しながら出力するプログラムを書きなさい。• ファイル名は “ohayou.rb” (自分が分かればファイル名は何でも構いません)
  17. 17. 問題 4-1 解答例# ohayou.rbfor i in 1 .. 100 puts “おはよう!”end
  18. 18. 出力行数の調べ方 # ohayou.rb for i in 1 .. 100 puts “おはよう!” end 実際に何行出力されたかを調べるには、以下のようにruby の実行コマンドの後にパイプ (|)とwc コマンド (wc –l) を組み合わせることで確認できる > ruby ohayou.rb | wc -l 100 <= 100行出力されていることが分かる
  19. 19. 問題 4-2• for ループを使って、 5, 10, 15, .... , 100 と、100まで の5の倍数を改行しながら出力するプログラムを書 きなさい。• ヒント:終値は 100 にする必要はない。• ファイル名は “multiple.rb” (任意可)
  20. 20. 問題 4-2 解答例1# multiple.rbfor i in 1 .. 20 puts i * 5end
  21. 21. 問題 4-2 解答例2# multiple.rbfor i in 1 .. 100 # 1から100まで全ての整数 if i % 5 == 0 # 5の倍数かチェック puts i endend
  22. 22. 和を計算する 1 # sumsquare.rb 2 n = ARGV[0].to_i 3 sum = 0 4 for i in 1 .. n 5 sum += i 6 end 7 puts sum 繰り返し処理は数の和を計算する時によく使われます1からある数まで足し合わせるプログラムを見てみましょう
  23. 23. 和を計算する 1 # sumsquare.rb 2 n = ARGV[0].to_i 3 sum = 0 4 for i in 1 .. n 5 sum += i 6 end 7 puts sum範囲オブジェクトの終値をコマンドラインから取得(2行目) 数を足し合わせていくための変数を用意(3行目) (最初は0を代入しておく)
  24. 24. 和を計算する1 # sumsquare.rb2 n = ARGV[0].to_i3 sum = 04 for i in 1 .. n5 sum += i6 end7 puts sum あとは 1からn までの範囲で for ループにより sum += i の計算を繰り返す(4~6行目)
  25. 25. 和を計算する1 # sumsquare.rb2 n = ARGV[0].to_i3 sum = 04 for i in 1 .. n5 sum += i6 end7 puts sum 足し合わされた合計値を出力(7行目)
  26. 26. 問題 4-3• 正の整数 n が与えられたとき、 2n - 1 は 1, 3, 5, .... と、「1から数えて n番目」の奇数の値になる。コマン ドラインから正の整数 n を受け取って、1 から 2n - 1 までの奇数の和を求めるプログラムを書きなさい。• ファイル名は “odd_sum.rb” (任意可)
  27. 27. 問題 4-3 解答例# odd_sum.rbn = ARGV[0].to_isum = 0for i in 1 .. n sum += 2 * i - 1endputs sum
  28. 28. for の二重ループ1 # 9x9.rb2 for i in 1 .. 93 for j in 1 .. 94 print “#{i * j} “5 end6 puts7 end forループの中に別のforループを使っている例九九の計算をする場合について考えてみましょう
  29. 29. for の二重ループ1 # 9x9.rb 第1ループ2 for i in 1 .. 9 第2ループ3 for j in 1 .. 94 print “#{i * j} “5 end6 puts7 end 第1ループはループ変数が i 第2ループはループ変数が j
  30. 30. for の二重ループ1 # 9x9.rb2 for i in 1 .. 9 #i=13 for j in 1 .. 94 print “#{i * j} “5 end6 puts7 endi = 1 に対して 1×1, 1×2, ..., 1×9と順に計算され (3~5行目)、次の段に行く前に改行(6行目)
  31. 31. 9x9.rb の実行結果> ruby 9x9.rb1234567892 4 6 8 10 12 14 16 183 6 9 12 15 18 21 24 274 8 12 16 20 24 28 32 365 10 15 20 25 30 35 40 456 12 18 24 30 36 42 48 547 14 21 28 35 42 49 56 638 16 24 32 40 48 56 64 729 18 27 36 45 54 63 72 81
  32. 32. 問題4-49x9.rb を改良して、下のように整形された出力をしなさい。 (ヒント: 数字は常に3桁の幅に納まっている) > ruby 9x9.rb 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
  33. 33. 問題4-4 解答例# 9x9.rbfor i in 1 .. 9 for j in 1 .. 9 printf (%3d, i * j) end putsend

×