アルゴリズムとデータ構造  2012.1.13 (WEB用)
今日の内容          第5章 基本的なアルゴリズム• 5.1.1   最大最小値を探す• 5.1.2   逐次検索
最大値を探すアルゴリズム82 24 12 27 18 78 19 86 45 41 64 16 86 11 16 15 30 25 10 26配列に入った数値の中から最大のものを探す   手順(=アルゴリズム)考える   手順① 仮の最大値と配...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
findmax.rb 1   # findmax.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = -1000...
問題5-1• findmax.rb を最大値ではなく、最小値を求め  るように変更しなさい(ファイル名は findmin、  変数名は min にすること)。
問題5-1 解答例 1   # findmin.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   min = 1000 5...
問題5-2• findmax.rb では,最大値の初期値として  −1000 を与えている。これは調べ ようとしてい  るデータの集合の値の範囲が予め分ってい  るからである。それでは,どのよ うなデータで  あればこのプログラムは誤動作するか...
問題5-2• findmax.rb では,最大値の初期値として  −1000 を与えている。これは調べ ようとしてい  るデータの集合の値の範囲が予め分ってい  るからである。それでは,どのよ うなデータで  あればこのプログラムは誤動作するか...
問題5-3• 5-2の問題点を踏まえて、どんなデータの集  合が与えられても最大値が求められるように  するには、ソースをどう書き換えたらよいか  (ファイル名は findmax2.rb)。         ヒント配列内の数値のどれかを仮の最大...
問題5-3 解答例 1   # findmax2.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = ar[0]...
問題5-4• findmax2.rb 書き換えて、   “最大値は 〜 で、〜 番目にあります。” という形で表示するようにしなさい。
問題5-4 解答例 1   # findmax3.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   max = ar[0]...
逐次検索配列の中の数値を一つずつ足して総和を求めたり、比較して最大値または最小値を求めたりと、これまで for ループで配列の中の値を逐次的に処理してきた。⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩                       ...
任意の値を探すアルゴリズム82 24 12 27 18 78 19 86 45 41 64 16 86 11 16 15 30 25 10 26配列に入った数値の中から探索キーが存在するか どうかを判定するプログラムの手順を考える   手順① ...
seqsearch.rb 1   # seqsearch.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   key = A...
seqsearch.rb 1   # seqsearch.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   key = A...
seqsearch.rb 1   # seqsearch.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   key = A...
seqsearch.rb 1   # seqsearch.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   key = A...
seqsearch.rb 1   # seqsearch.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   key = A...
seqsearch.rb 1   # seqsearch.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   key = A...
seqsearch.rb 1   # seqsearch.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   key = A...
seqsearch.rb 1   # seqsearch.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   key = A...
seqsearch.rb 1   # seqsearch.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   key = A...
seqsearch.rb 1   # seqsearch.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   key = A...
seqsearch.rb 1   # seqsearch.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   key = A...
問題5-X• seqsearch.rb では値が見つかると break で即  座にループを終了している。しかし、配列の  中には 86 のように複数個存在しているもの  もあり、この場合一番最初の 86 について添  字番号が出力されるが、2...
問題5-X 解答例 1   # seqsearch.rb 2   ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3   n = ar.size 4   key = ARGV...
今日のまとめ• 最大値と最小値を探すアルゴリズム        → findmax.rb / findmin.rb• 探索キーが存在するかを判別するアルゴリズム        → seqseach.rbどちらも配列の要素を逐次的に処理する方法で実装
来週は• 1月20日• 第5章残り(素数判定のアルゴリズム)• プログラミング道場の補足• 授業アンケート
Upcoming SlideShare
Loading in...5
×

2012年1月13日

659

Published on

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

  • Be the first to like this

No Downloads
Views
Total Views
659
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

2012年1月13日

  1. 1. アルゴリズムとデータ構造 2012.1.13 (WEB用)
  2. 2. 今日の内容 第5章 基本的なアルゴリズム• 5.1.1 最大最小値を探す• 5.1.2 逐次検索
  3. 3. 最大値を探すアルゴリズム82 24 12 27 18 78 19 86 45 41 64 16 86 11 16 15 30 25 10 26配列に入った数値の中から最大のものを探す 手順(=アルゴリズム)考える 手順① 仮の最大値と配列の数値を比べる。 手順② 比べた数値のほうが大きければ、 それを仮の最大値とする。 手順③ 手順①&② を配列の数値に対して 順に行う。
  4. 4. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 5 for i in 0 .. n-1 6 if max < ar[i] then 7 max = ar[i] 8 end 9 end10 print “最大値は #{max}です”
  5. 5. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 5 for i in 0 .. n-1 6 if max < ar[i] then 7 max = ar[i] 8 end 9 end10 print “最大値は #{max}です” 数値が入った配列 ar を用意(2行目) 配列の要素数を変数 n に代入(3行目)
  6. 6. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 5 for i in 0 .. n-1 6 if max < ar[i] then 7 max = ar[i] 8 end 9 end10 print “最大値は #{max}です” 仮の最大値を設定(4行目) ここでは -1000 としている
  7. 7. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 5 for i in 0 .. n-1 6 if max < ar[i] then 7 max = ar[i] 8 end 9 end10 print “最大値は #{max}です” 総和や平均を求めたときと同様に、forループで 配列の中の数字を一つずつ処理していく(5~9行目)
  8. 8. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 5 for i in 0 .. n-1 6 if max < ar[i] then # 現在の最大値と比較 7 max = ar[i] # 最大値の更新 8 end 9 end10 print “最大値は #{max}です” if 文に注目(6~8行目) 現在の最大値より大きければその値で max を更新
  9. 9. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 true 5 for i in 0 .. n-1 6 if max < ar[i] then # -1000 < 82 7 max = ar[i] # max = 82 8 end 9 end10 print “最大値は #{max}です” ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] max
  10. 10. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 false 5 for i in 0 .. n-1 6 if max < ar[i] then # 82 < 24 7 max = ar[i] # 更新無し 8 end 9 end10 print “最大値は #{max}です” ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] max
  11. 11. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 false 5 for i in 0 .. n-1 6 if max < ar[i] then # 82 < 12 7 max = ar[i] # 更新無し 8 end 9 end10 print “最大値は #{max}です” ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] max
  12. 12. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 false 5 for i in 0 .. n-1 6 if max < ar[i] then # 82 < 27 7 max = ar[i] # 更新無し 8 end 9 end10 print “最大値は #{max}です” ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] max
  13. 13. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 false 5 for i in 0 .. n-1 6 if max < ar[i] then # 82 < 18 7 max = ar[i] # 更新無し 8 end 9 end10 print “最大値は #{max}です” ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] max
  14. 14. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 false 5 for i in 0 .. n-1 6 if max < ar[i] then # 82 < 78 7 max = ar[i] # 更新無し 8 end 9 end10 print “最大値は #{max}です” ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] max
  15. 15. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 false 5 for i in 0 .. n-1 6 if max < ar[i] then # 82 < 19 7 max = ar[i] # 更新無し 8 end 9 end10 print “最大値は #{max}です” ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] max
  16. 16. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 true! 5 for i in 0 .. n-1 6 if max < ar[i] then # 82 < 86 7 max = ar[i] # max = 86 に更新 8 end 9 end10 print “最大値は #{max}です” ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] max
  17. 17. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 5 for i in 0 .. n-1 6 if max < ar[i] then # 以後、最後の数値まで 7 max = ar[i] # 同じ処理を繰り返す 8 end 9 end10 print “最大値は #{max}です” ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] max
  18. 18. findmax.rb 1 # findmax.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = -1000 5 for i in 0 .. n-1 6 if max < ar[i] then 7 max = ar[i] 8 end 9 end10 print “最大値は #{max}です” # max = 86 ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲ [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] max
  19. 19. 問題5-1• findmax.rb を最大値ではなく、最小値を求め るように変更しなさい(ファイル名は findmin、 変数名は min にすること)。
  20. 20. 問題5-1 解答例 1 # findmin.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 min = 1000 5 for i in 0 .. n-1 6 if min > ar[i] then 7 min = ar[i] 8 end 9 end10 print “最小値は #{min}です” 仮の最小値を1000のような 大きな数字にすること(4行目)
  21. 21. 問題5-2• findmax.rb では,最大値の初期値として −1000 を与えている。これは調べ ようとしてい るデータの集合の値の範囲が予め分ってい るからである。それでは,どのよ うなデータで あればこのプログラムは誤動作するか。配列 ar の数値を書き換えて,プロ グラムが間違っ た結果を出すようにしなさい
  22. 22. 問題5-2• findmax.rb では,最大値の初期値として −1000 を与えている。これは調べ ようとしてい るデータの集合の値の範囲が予め分ってい るからである。それでは,どのよ うなデータで あればこのプログラムは誤動作するか。配列 ar の数値を書き換えて,プロ グラムが間違っ た結果を出すようにしなさい -1000より小さい数値だけ入った配列
  23. 23. 問題5-3• 5-2の問題点を踏まえて、どんなデータの集 合が与えられても最大値が求められるように するには、ソースをどう書き換えたらよいか (ファイル名は findmax2.rb)。 ヒント配列内の数値のどれかを仮の最大値に設定する
  24. 24. 問題5-3 解答例 1 # findmax2.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = ar[0] 5 for i in 1 .. n-1 6 if max < ar[i] then 7 max = ar[i] 8 end 9 end10 print “最大値は #{max}です” 配列の一番最初の数値を仮の最大に設定(4行目) ループは0番目からではなく1番目から開始(5行目)
  25. 25. 問題5-4• findmax2.rb 書き換えて、 “最大値は 〜 で、〜 番目にあります。” という形で表示するようにしなさい。
  26. 26. 問題5-4 解答例 1 # findmax3.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 max = ar[0] 5 imax = 0 6 for i in 1 .. n-1 7 if max < ar[i] then 8 max = ar[i] 9 imax = i10 end11 end12 print “最大値は #{max} で #{imax} 番目にあります。”
  27. 27. 逐次検索配列の中の数値を一つずつ足して総和を求めたり、比較して最大値または最小値を求めたりと、これまで for ループで配列の中の値を逐次的に処理してきた。⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑲[82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] ひとつずつ くまなく 順番にチェック! = 逐次探索 (sequential search) = 線形探索 (linear search)この方法で、任意の値(探索キー)が配列内にあるかどうかを判定するプログラムを書いてみましょう
  28. 28. 任意の値を探すアルゴリズム82 24 12 27 18 78 19 86 45 41 64 16 86 11 16 15 30 25 10 26配列に入った数値の中から探索キーが存在するか どうかを判定するプログラムの手順を考える 手順① 配列の要素を一つずつ取り出す 手順② その値が探索キーと一致したら、 探索を終了し「見つかった」と出力 手順③ 最後まで見つからなかったら。 「見つからなかった」と出力
  29. 29. seqsearch.rb 1 # seqsearch.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 key = ARGV[0].to_i 5 found = false 6 for i in 0 .. n-1 7 if ar[i] == key then 8 found = true 9 ifound = i10 break11 end12 end13 if found then14 puts “#{key} は #{ifound} 番目にありました。”15 else16 puts “#{key} は見つかりませんでした。”17 end
  30. 30. seqsearch.rb 1 # seqsearch.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 key = ARGV[0].to_i ・・・・ # 探索キーをコマンドライン引数で 5 found = false 受け取り変数 key に代入 6 for i in 0 .. n-1 7 if ar[i] == key then 8 found = true 9 ifound = i10 break11 end12 end13 if found then14 puts “#{key} は #{ifound} 番目にありました。”15 else16 puts “#{key} は見つかりませんでした。”17 end
  31. 31. seqsearch.rb 1 # seqsearch.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 key = ARGV[0].to_i 5 found = false ・・・・ # 見つかったかどうかを判定するための 6 for i in 0 .. n-1 フラグ変数を用意。最初はfalse 7 if ar[i] == key then 8 found = true 9 ifound = i10 break11 end12 end13 if found then14 puts “#{key} は #{ifound} 番目にありました。”15 else16 puts “#{key} は見つかりませんでした。”17 end
  32. 32. seqsearch.rb 1 # seqsearch.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 key = ARGV[0].to_i 5 found = false 6 for i in 0 .. n-1 ・・・・・・ # 6行めから12行まで for ループ 7 if ar[i] == key then 配列の値をひとつずつ取り出して 8 found = true 逐次的に処理 9 ifound = i10 break11 end12 end13 if found then14 puts “#{key} は #{ifound} 番目にありました。”15 else16 puts “#{key} は見つかりませんでした。”17 end
  33. 33. seqsearch.rb 1 # seqsearch.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 key = ARGV[0].to_i 5 found = false 6 for i in 0 .. n-1 7 if ar[i] == key then ・・・・ # if 文で 配列の値 ar[i] と key が 8 found = true 一致するかどうかを判別 9 ifound = i10 break11 end12 end13 if found then14 puts “#{key} は #{ifound} 番目にありました。”15 else16 puts “#{key} は見つかりませんでした。”17 end
  34. 34. seqsearch.rb 1 # seqsearch.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 key = ARGV[0].to_i 5 found = false 6 for i in 0 .. n-1 7 if ar[i] == key then 8 found = true ・・・・ # もし一致すれば found を true に変更 9 ifound = I ・・・・・・ # その値の添字番号を ifound に記憶10 break ・・・・・・・・・ # break でループを終了し13行目に移る11 end12 end13 if found then14 puts “#{key} は #{ifound} 番目にありました。”15 else16 puts “#{key} は見つかりませんでした。”17 end
  35. 35. seqsearch.rb 1 # seqsearch.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 key = ARGV[0].to_i 5 found = false 6 for i in 0 .. n-1 7 if ar[i] == key then 8 found = true # 一致する値が見つかない場合は 9 ifound = I if 文は一度も実行されないので10 break found は false のままループが終了11 end12 end13 if found then14 puts “#{key} は #{ifound} 番目にありました。”15 else16 puts “#{key} は見つかりませんでした。”17 end
  36. 36. seqsearch.rb 1 # seqsearch.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 key = ARGV[0].to_i 5 found = false 6 for i in 0 .. n-1 7 if ar[i] == key then 8 found = true 9 ifound = i10 break11 end # 値が見つかっていればfound はtrueなので12 end 「~は~番目にありました」と出力(14行目)13 if found then14 puts “#{key} は #{ifound} 番目にありました。”15 else16 puts “#{key} は見つかりませんでした。”17 end
  37. 37. seqsearch.rb 1 # seqsearch.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 key = ARGV[0].to_i 5 found = false 6 for i in 0 .. n-1 7 if ar[i] == key then 8 found = true 9 ifound = i10 break11 end # そうでなければ else 文に入って12 end 「~は見つかりませんでした」と出力(16行目)13 if found then14 puts “#{key} は #{ifound} 番目にありました。”15 else16 puts “#{key} は見つかりませんでした。”17 end
  38. 38. seqsearch.rb 1 # seqsearch.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 key = ARGV[0].to_i 5 found = false 6 for i in 0 .. n-1 7 if ar[i] == key then 8 found = true 9 ifound = i10 break # 13行目は 以下のように記述しても良いが11 end 変数がそのものが 論理値の場合は12 end “== true”を省略出来る13 if found == true then14 puts “#{key} は #{ifound} 番目にありました。”15 else16 puts “#{key} は見つかりませんでした。”17 end
  39. 39. seqsearch.rb 1 # seqsearch.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 key = ARGV[0].to_i 5 found = false 6 for i in 0 .. n-1 この例の変数 found ように 7 if ar[i] == key then 「見つかった」という状態(= true) と 8 found = true 「見つからなかった」という状態(= false) 9 ifound = i どちらかを記憶させるために使われる場合10 break これをフラグ(flag) 変数という11 end12 end13 if found then ・・・・ # 見つかった場合14 puts “#{key} は #{ifound} 番目にありました。”15 else ・・・・ # 見つからなかった場合16 puts “#{key} は見つかりませんでした。17 end
  40. 40. 問題5-X• seqsearch.rb では値が見つかると break で即 座にループを終了している。しかし、配列の 中には 86 のように複数個存在しているもの もあり、この場合一番最初の 86 について添 字番号が出力されるが、2つ目以降は無視さ れる。• seqseach.rbを改良し、値が複数存在する場 合についても、全て添字番号が出力されるよ うにしなさい。
  41. 41. 問題5-X 解答例 1 # seqsearch.rb 2 ar = [82, 24, 12, 27, 18, 78, 19, 86, 45, 41, 64, ..., 26] 3 n = ar.size 4 key = ARGV[0].to_i 5 found = false 6 for i in 0 .. n-1 7 if ar[i] == key then 8 found = true 9 ifound = i10 puts “#{key} は #{ifound} 番目にありました。”11 end12 end13 if found != true14 puts “#{key} は見つかりませんでした。”15 end
  42. 42. 今日のまとめ• 最大値と最小値を探すアルゴリズム → findmax.rb / findmin.rb• 探索キーが存在するかを判別するアルゴリズム → seqseach.rbどちらも配列の要素を逐次的に処理する方法で実装
  43. 43. 来週は• 1月20日• 第5章残り(素数判定のアルゴリズム)• プログラミング道場の補足• 授業アンケート
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×