2011年12月2日
Upcoming SlideShare
Loading in...5
×
 

2011年12月2日

on

  • 632 views

 

Statistics

Views

Total Views
632
Views on SlideShare
568
Embed Views
64

Actions

Likes
0
Downloads
1
Comments
0

1 Embed 64

http://www.cs.kyoto-wu.ac.jp 64

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

2011年12月2日 2011年12月2日 Presentation Transcript

  • アルゴリズムとデータ構造 2011.12.2(WEB用)
  • 今日の内容• 3.2 論理式と論理演算• 3.3 caseを使った多重分岐• 3.4 サンプルプログラム
  • 比較演算子一覧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 以下
  • 文字列の大小比較 1 # compstr.rb 2 str1 = ARGV[0] 3 str2 = ARGV[1] 4 if str1 == str2 then 5 puts “#{str1} は #{str2} と同じです。” 6 elsif str1 < str2 then 7 puts “#{str1} は #{str2} より前です。” 8 else 9 puts “#{str1} は #{str2} より後です。”10 end 比較演算は数値だけでなく文字列に対しても行えます。 上のスクリプトを作成して実行してみましょう。
  • 文字列の大小比較 1 # compstr.rb 2 str1 = ARGV[0] # str1 = “nyaa” 3 str2 = ARGV[1] # str2 = “myau” 4 if str1 == str2 then 5 puts “#{str1} は #{str2} と同じです。” 6 elsif str1 < str2 then 7 puts “#{str1} は #{str2} より前です。” 8 else 9 puts “#{str1} は #{str2} より後です。”10 end ここでは例としてコマンドライン上で 引数1に “nyaa”、引数2に”myau” と与えたとします。
  • 文字列の大小比較 1 # compstr.rb 2 str1 = ARGV[0] # str1 = “nyaa” 3 str2 = ARGV[1] false # str2 = “myau” 4 if str1 == str2 then 5 puts “#{str1} は #{str2} と同じです。” false 6 elsif str1 < str2 then 7 puts “#{str1} は #{str2} より前です。” 8 else 9 puts “#{str1} は #{str2} より後です。”10 end “nyaa” と “myau” はアルファベット順では “myau” が先に来て “nyaa” が後に来る。
  • 文字列の大小比較 1 # compstr.rb 2 str1 = ARGV[0] # str1 = “nyaa” 3 str2 = ARGV[1] false # str2 = “myau” 4 if str1 == str2 then 5 puts “#{str1} は #{str2} と同じです。” false 6 elsif str1 < str2 then 7 puts “#{str1} は #{str2} より前です。” true 8 else 9 puts “#{str1} は #{str2} より後です。”10 end 最初の2つの論理式がfalse値を返すのでelse文に入る。 このように文字列同士の比較では辞書順で先にくるか 後にくるかを判断する(文字数ではないので注意)
  • 論理演算と論理演算子 算術演算において演算子があるように 論理演算では論理値に対する演算子がある。 オペランド1 オペレーター オペランド2算術演算 数値、文字列 + - * / % 数値、文字列論理演算 論理値 論理値 && || ! (true or false) (true or false)
  • 論理演算(Boolean operation)演算子 意味 演算結果 true && true => true AND&& true && false => false (かつ、論理積) false && false => false true || true => true OR|| true || false => true (または、論理和) false || false => false NOT !true => false ! (否定) !false => true
  • 論理演算(Boolean operation)演算子 意味 演算結果 true && true => true AND&& true && false => false (かつ、論理積) false && false => false true || true => true OR|| true || false => true (または、論理和) false || false => false NOT !true => false ! (否定) !false => true 1(true) と 0(false) のかけ算と考える 1×1=1 1×0=0 0×0=0
  • 論理演算(Boolean operation)演算子 意味 演算結果 true && true => true AND&& true && false => false (かつ、論理積) false && false => false true || true => true OR|| true || false => true (または、論理和) false || false => false NOT !true => false ! (否定) !false => true 1(true) と 0(false) のたし算と考える 1+1=1 1+0=1 0+0=0
  • 論理演算(Boolean operation)演算子 意味 演算結果 true && true => true AND&& true && false => false (かつ、論理積) false && false => false true || true => true OR|| true || false => true (または、論理和) false || false => false NOT !true => false ! (否定) !false => true
  • richyoung.rb1 # richyoung.rb2 # 2個の引数(年齢, 所持金)を与えて判定をおこないます。3 age = ARGV[0].to_i4 money = ARGV[1].to_i5 if age <= 35 && money > 1000 then6 puts “若い金持ちやで。”7 else8 puts “びみょーやな。”9 end
  • richyoung2.rb1 # richyoung2.rb2 # 2個の引数(年齢, 所持金)を与えて判定をおこないます。3 age = ARGV[0].to_i4 money = ARGV[1].to_i5 if age <= 35 || money > 1000 then6 puts “若いか金持ちかやな。”7 else8 puts “びんぼーなおっさんやで。”9 end
  • case を使った多重分岐判定条件が多数ある場合、if-elseif-else 構文の代りにcase文や範囲リテラル使うと、可読性が高まるage = ARGV[0].to_iif age == 0 || age == 1 ・・・elsif age >= 2 && age <= 11 ・・・elsif age >= 12 && age <= 17 ・・・elsif age >= 18 && age <= 29 ・・・elsif age >= 30 && age <= 60 ・・・else ・・・end
  • case を使った多重分岐判定条件が多数ある場合、if-elseif-else 構文の代りにcase文や範囲リテラル使うと、可読性が高まるage = ARGV[0].to_i case ageif age == 0 || age == 1 when 0, 1 ・・・ ・・・elsif age >= 2 && age <= 11 when 2 .. 11 ・・・ ・・・elsif age >= 12 && age <= 17 when 12 .. 17 ・・・ ・・・elsif age >= 18 && age <= 29 when 18 .. 29 ・・・ ・・・elsif age >= 30 && age <= 60 when 30 .. 60 ・・・ ・・・else else ・・・ ・・・end end
  • case1.rb1 # case1.rb2 age = ARGV[0].to_i3 case age4 when 0, 15 guest = “赤ちゃん”6 when 2 .. 117 guest = “お子さま”8 when 12 .. 179 guest = “おませさん”10 when 18 .. 2911 guest = “お若いかた”12 when 30 .. 6013 guest = “おとなの方”14 else15 guest = “お年寄り”16 end17 puts “#{guest}さま、いらっしゃいませ。”
  • 倍数判定1 # olympicyear.rb2 year = ARGV[0].to_i3 if year % 4 == 0 then4 puts “#{year} 年には夏のオリンピックが開かれます。”5 end1 # toshionna.rb2 age= ARGV[0].to_i3 if age % 12 != 0 then4 puts “あなたは年女ではありません。”5 end
  • 倍数判定1 # olympicyear.rb2 year = ARGV[0].to_i # 4の倍数なら剰余が0になるので3 if year % 4 == 0 then # 評価結果は true となる。4 puts “#{year} 年には夏のオリンピックが開かれます。”5 end 西暦 ÷ 4 の余り1 # toshionna.rb2 age= ARGV[0].to_i # 同様に年齢が12の倍数かどうか3 if age % 12 != 0 then # を評価(倍数で無い場合 true)4 puts “あなたは年女ではありません。”5 end 年齢 ÷ 12 の余り
  • 偶数・奇数判定1 # oddeven.rb2 n = ARGV[0].to_i3 if n % 2 == 0 then4 puts “#{n} は偶数です。”5 else6 puts “#{n} は奇数です。”7 end
  • 偶数・奇数判定1 # oddeven.rb2 n = ARGV[0].to_i3 if n % 2 == 0 then4 puts “#{n} は偶数です。”5 else6 puts “#{n} は奇数です。”7 end 偶数なら2の倍数なので、n % 2 の結果が0の場合と それ以外(1の場合)で、偶数・奇数の判定が出来る
  • 条件判断と集合条件分岐を考える際、集合論に基づいて考えてみることで、場合分けについてより理解が深まります。
  • 条件判断と集合年齢を x (0から120)として、成人かどうか判断する場合について、以下のように整理します。 【命題 A】 x は20以上である。 U  {x | 0,1,2,...,120} (全体集合) A  {20,21,22,...,120} 真 A  {0,1,2,...,19} 偽(補集合)
  • 条件判断と集合 x U0 1 2 3 4 5 6 7 8 910 11 12 13 14 15 16 17 18 19 if x >= 20 A # 成人向けの処理 20 21 22 23 24 25 ・・・ else A # それ以外の処理 ・・・117 118 119 120 end 【命題 A】 x は20以上である。
  • 複合した論理式条件分岐に複数の論理式を用いる場合(つまり論理演算を行う場合)も、集合に基づいて考えてみましょう。 【命題 A】 生まれ年が2000年以前である。 【命題 B】 トラ年の生まれである。
  • 複合した論理式 まずは命題Aに対する論理式を与える。【命題 A】 生まれ年が2000年以前である。【命題 B】 トラ年の生まれである。if x <= 2000
  • 複合した論理式 次は命題Bに対する論理式を与える。トラ年の生まれ年は12で割った余りが6になる。 【命題 A】 生まれ年が2000年以前である。 【命題 B】 トラ年の生まれである。 if x % 12 == 6
  • ベン図 UA B
  • ベン図 U A IV B A B生まれが2000年以前でかつトラ年生まれの場合
  • ベン図 U II A B A B生まれが2000年以前かつトラ年生まれでない場合
  • ベン図 U III A B A B生まれが2000年以前でないかつトラ年生まれの場合
  • ベン図 U I A B A B生まれが2000年以前でないかつトラ年生まれでない場合
  • ド・モルガンの定理A B A  B  ( A  B)A B A  B  ( A  B)ド・モルガンの定理は上記の関係を示したもの
  • プログラム文へ置き換えif x <= 2000 && x % 12 == 6 then # (IV) A Belsif x <= 2000 && x % 12 != 6 then # (II) A Belsif x > 2000 && x % 12 == 6 then # (III) A Belse # (I) A Bend
  • 第3章まとめ• 3.1 if-elsif-else 構文• 3.2 論理式と論理演算(子)• 3.3 case文を使った多重分岐• 3.4 条件判断と集合