2011年11月25日

425 views
393 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
425
On SlideShare
0
From Embeds
0
Number of Embeds
58
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

2011年11月25日

  1. 1. アルゴリズムとデータ構造 2011.11.25(WEB用)
  2. 2. 今日の内容• 3.1 if を用いた構文• 3.2 論理式と論理演算
  3. 3. 第3章:条件判断• プログラムをもっとプログラムっぽくするには条件に 応じて異なる処理をし、結果を出力するようなことが 求められる。• ここでは if 文や論理演算子を使った、ちょっと複雑 な条件判断を学習していきます。
  4. 4. if 文を使った制御1 # if1.rb2 # 最も簡単な条件判断3 str = ARGV[0]4 n = str.to_i5 if n > 10 then6 puts “#{n} は 10 より大きい”7 end8 puts “おわり” まずはこのスクリプトを作成してください。 6行めの puts の前は [TAB] キーを入力して 字下げしてください。
  5. 5. if1.rb 解説1 # if1.rb2 # 最も簡単な条件判断3 str = ARGV[0]4 n = str.to_i5 if n > 10 then6 puts “#{n} は 10 より大きい”7 end8 puts “おわり” まず最初に引数から値を受け取り(3行目) それを整数値に変換して n に代入(4行目)
  6. 6. if1.rb 解説1 # if1.rb2 # 最も簡単な条件判断3 str = ARGV[0]4 n = str.to_i Yes5 if n > 10 then6 puts “#{n} は 10 より大きい”7 end8 puts “おわり” if文で n の値が10より大きいか評価(5行目) もしそうであれば6行目が実行され、7行目で 終了、8行目と続く
  7. 7. if1.rb 解説1 # if1.rb2 # 最も簡単な条件判断3 str = ARGV[0]4 n = str.to_i No5 if n > 10 then6 puts “#{n} は 10 より大きい”7 end8 puts “おわり” n の値が 10 より小さければ6行目は実行されず (何も起こらず)8行目へ飛ぶ
  8. 8. if1.rb 解説1 # if1.rb2 # 最も簡単な条件判断3 str = ARGV[0]4 n = str.to_i5 if n > 10 then6 puts “#{n} は 10 より大きい”7 end8 puts “おわり” ちなみにif-end文と処理部分(if ブロック)がわかり やすいように、6行目を [TAB] で字下げしました これをインデントと言います
  9. 9. if 文を使った制御21 # if2.rb2 # else で場合分け3 n = ARGV[0].to_i4 if n > 10 then5 puts “#{n} は 10 より大きい”6 else7 puts “#{n} は 10 より大きくありません.”8 end9 puts “おわり”
  10. 10. if2.rb 解説1 # if2.rb2 # else で場合分け3 n = ARGV[0].to_i4 if n > 10 then5 puts “#{n} は 10 より大きい”6 else7 puts “#{n} は 10 より大きくありません.”8 end9 puts “おわり” ここでは if 文の条件に合わなかった場合、「それ以 外」として else文以下で処理しています
  11. 11. if2.rb 解説1 # if2.rb2 # else で場合分け3 n = ARGV[0].to_i4 if n > 10 then5 puts “#{n} は 10 より大きい”6 else7 puts “#{n} は 10 より大きくありません.”8 end9 puts “おわり” これは単純に If A then do XX, else do YY という英文章を表しているに過ぎません
  12. 12. if 文を使った制御21 # if2.rb2 # else で場合分け3 n = ARGV[0].to_i4 if n > 10 then5 puts “#{n} は 10 より大きい”6 else7 puts “#{n} は 10 より大きくありません.”8 end9 puts “おわり” ちなみに3行目で引数の読み込みと整数変換を 同時に行っています。Rubyではこのように複数の 処理を1行内に連続して記述することが出来ます
  13. 13. if 文を使った制御3 1 # if3.rb 2 # elsif で細かい場合分け 3 str = ARGV[0] 4 n = str.to_i 5 if n < 10 then 6 puts “#{n} は 10 より小さい.” 7 elsif n == 10 then 8 puts “#{n} はちょうど 10 です.” 9 elsif n < 20 then10 puts “#{n} は10 より大きく 20 未満です.”11 else12 puts “#{n} は それ以外です.”13 end
  14. 14. if 文を使った制御3 1 # if3.rb 2 # elsif で細かい場合分け 3 str = ARGV[0] 4 n = str.to_i 5 if n < 10 then if X 6 puts “#{n} は 10 より小さい.” ~ 7 elsif n == 10 then elsif Y 8 puts “#{n} はちょうど 10 です.” ~ 9 elsif n < 20 then elsif Z10 puts “#{n} は10 より大きく 20 未満です.” ~11 else else12 puts “#{n} は それ以外です.” ~13 end end
  15. 15. if 文を使った制御3 1 # if3.rb 2 # elsif で細かい場合分け 条件評価は上から順に 3 str = ARGV[0] 行われ、条件に合わな 4 n = str.to_i い限り、下に進んでいく 5 if n < 10 then 6 puts “#{n} は 10 より小さい.” 7 elsif n == 10 then 8 puts “#{n} はちょうど 10 です.” 9 elsif n < 20 then10 puts “#{n} は10 より大きく 20 未満です.”11 else12 puts “#{n} は それ以外です.”13 end
  16. 16. if 文を使った制御3 1 # if3.rb 2 # elsif で細かい場合分け n = 15 の場合 3 str = ARGV[0] 4 n = str.to_i false 10より小さくも10ちょうど 5 if n < 10 then でもないので5, 7 行目は 6 puts “#{n} は 10 false より小さい.” falseを返す 7 elsif n == 10 then 8 puts “#{n} はちょうど 10 です.” 9 elsif n < 20 then10 puts “#{n} は10 より大きく 20 未満です.”11 else12 puts “#{n} は それ以外です.”13 end
  17. 17. if 文を使った制御3 1 # if3.rb 2 # elsif で細かい場合分け n = 15 の場合 3 str = ARGV[0] 4 n = str.to_i false 20よりも小さいという条件 5 if n < 10 then を満たすので9行目が true 6 puts “#{n} は 10 false より小さい.” と評価され10行目の 7 elsif n == 10 then 処理に入る 8 puts “#{n} はちょうど 10 です.” true 9 elsif n < 20 then10 puts “#{n} は10 より大きく 20 未満です.”11 else12 puts “#{n} は それ以外です.”13 end
  18. 18. if 文を使った制御3 1 # if3.rb 2 # elsif で細かい場合分け 条件式において「等しい」 3 str = ARGV[0] かどうか評価するには 4 n = str.to_i ただの “=“ ではなく ”==“ 5 if n < 10 then (ダブルイコール)を使う 6 puts “#{n} は 10 より小さい.” 7 elsif n == 10 then 8 puts “#{n} はちょうど 10 です.” 9 elsif n < 20 then10 puts “#{n} は10 より大きく 20 未満です.”11 else12 puts “#{n} は それ以外です.”13 end
  19. 19. 論理式と論理値age = ARGV[0].to_iif n < 10 then puts “お子さまですね。”end
  20. 20. 論理式と論理値 true(真)age = ARGV[0].to_iif n < 10 then # n = 5 の時 puts “お子さまですね。”end“n は10より小さいか?” という式に対してtrue(真)という値が返される
  21. 21. 論理式と論理値 false(偽)age = ARGV[0].to_iif n < 10 then # n = 11 の時 puts “お子さまですね。”end“n は10より小さいか?” という式に対してfalse(偽)という値が返される
  22. 22. 論理式と論理値true(真) orfalse(偽) age = ARGV[0].to_i if n < 10 then puts “お子さまですね。” end true もしくは false の二値を論理値と呼び、 評価結果として論理値を返す式のことを 論理式と言う
  23. 23. 論理式と論理値比較演算子age = ARGV[0].to_iif n < 10 then puts “お子さまですね。”end論理式で使われる演算子は論理演算子と呼ばれ特に2つのデータを比較する論理演算子は比較演算子と言う
  24. 24. 比較演算子一覧Rubyでの論理式 数学的な意味 意味 a == b a=b a と b は等しい a != b a≠b a と b は異なる a>b a>b a は b より大きい a >= b a≥b a は b 以上 a<b a<b a は b より小さい a <= b a≤b a は b 以下
  25. 25. 比較演算子一覧Rubyでの論理式 数学的な意味 意味 a == b a=b a と b は等しい a != b a≠b a と b は異なる a>b a>b a は b より大きい a >= b a≥b a は b 以上 a<b a<b a は b より小さい a <= b a≤b a は b 以下プログラム内でa = b と記述すると代入式になるので注意!
  26. 26. 比較演算子一覧Rubyでの論理式 数学的な意味 意味 a == b a=b a と b は等しい a != b a≠b a と b は異なる a>b a>b a は b より大きい a >= b a≥b a は b 以上 a<b a<b a は b より小さい a <= b a≤b a は b 以下!記号(エクスクラメーション)は否定演算子とも呼ばれる
  27. 27. 比較演算子一覧Rubyでの論理式 数学的な意味 意味 a == b a=b a と b は等しい a != b a≠b a と b は異なる a>b a>b a は b より大きい a >= b a≥b a は b 以上 a<b a<b a は b より小さい a <= b a≤b a は b 以下以上・以下の比較演算子は不等号(>か<)、等号(=)の順 (逆だとエラーになるので注意)
  28. 28. 練習問題 1• テキスト43ページの問題3-1で、- もしも年齢差が15以上の場合には、「年の差がありますね.」- 上記のいずれでもない場合には、「お幸せに.」と出力する の2通りだけ判別するプログラムを作成しなさい (ただし、男性のほうが年上と仮定する)。
  29. 29. 解答例 # marriage.rb m_age = ARGV[0].to_i f_age = ARGV[1].to_i diff = m_age – f_age if diff > 15 then puts “年の差がありますね.” else puts “お幸せに.” endこれ例では、男性の方が年上なら常に差は正の整数になるが、女性の方が年上の場合は負の整数になり、15歳以上年齢差が あっても「お幸せに.」と出力されてしまう。
  30. 30. 解答例(絶対数を使う)# marriage.rbm_age = ARGV[0].to_if_age = ARGV[1].to_idiff = m_age – f_ageif diff.abs > 15 then puts “年の差がありますね.”else puts “お幸せに.”end年齢差を絶対数に変換すると、女性の方が年上の場合にも 対応できる。 .abs は数値を絶対数に変換するメソッド。
  31. 31. 練習問題 2• 練習問題1で作成したプログラムでは、日本の法的 に問題のある解答をしてしまう可能性があります ^^;) 次に、年齢制限を設けるために- もしも男性の年齢が18未満、または女性の年齢が16未満で あった場合には、「結婚出来ません.」と出力する という条件を足して改良しなさい。
  32. 32. 解答例 # marriage.rb m_age = ARGV[0].to_i f_age = ARGV[1].to_i diff = m_age – f_age if m_age < 18 puts “結婚できません.” elsif f_age < 16 puts “結婚できません.” elsif diff.abs > 15 then puts “年の差がありますね.” else puts “お幸せに.” end 条件式の順番に注意。最初に年齢チェックを行い、その後に年齢差をチェックしている。
  33. 33. 間違った例 # marriage.rb m_age = ARGV[0].to_i f_age = ARGV[1].to_i true diff = m_age – f_age if diff.abs > 15 then puts “年の差がありますね.” → true だと、ここで終了 elsif m_age < 18 puts “結婚できません.” elsif f_age < 16 puts “結婚できません.” else puts “お幸せに.” end最初に年齢差チェックの条件式をもってくると、18未満・16未満に 関わらず、「年の差がありますね.」とおせっかいを出すだけで 結婚を容認してしまうことになる。

×