『情報科学入門 Rubyを使って学ぶ』の練習問題の解答例の他、授業スライドの練習問題の解答例や、プログラミングのポイント等を掲載します。他クラスの方の利用歓迎。改良・訂正箇所ありましたらご指摘ください。

2011/01/01

[基]条件分岐と繰り返し(第三章)

条件分岐
さて、数学をやっていると、よく「場合分け」が必要になりますね。
Rubyで関数をつくるときも、場合分け、すなわち条件分岐が必須になります。

条件式
x>y   (>)xがyより大きい
x>=y   (≧)xがy以上
x==y   (=)xとyが等しい ←「=」じゃなく「==」なのに注意
x<y   (<)xがyより小さい
x<=y   (≦)xがy以下
x!=y    (≠)xとyが異なる


さて、では、xとyのうち大きい値を求める関数を作ってみましょう。
同時に条件分岐の仕方を学びましょう。

def  max2(x,y) ←変数x,yに関する関数、max2(x,y)を定義する
  if  x>=y    ←もしx≧yだったら
    x       ←xを出力
  else      ←違う場合(x<yだったら)
    y      ←yを出力
  end      ←条件分岐終了
end      ←定義終了

条件分岐で使うのは、このif-else-end式です。
さて、もっと複雑な条件分岐をつくる際はどうすればいいのでしょうか。
そんな時は、条件式を組み合わせ、さらにif-else-end式を組み合わせます。


条件式の組み合わせ
x>y || x==0  x>y または x==0
x<y && y<z  x<y かつ y<z
!(x<y && y<z) (x<y かつ y<z)でない


さて、この条件式の組み合わせを使って、
x,y,zのうち一番大きい値を求める関数を作りましょう。

def max3(x,y,z)
  if  x>y && x>z   ←もし「x>yかつx>z」だったら
    x         ←xを出力
  else       ←違う場合
    if  y>x && y>z  ←もし「y>xかつy>z」だったら(条件分岐の中に条件分岐)
      y       ←yを出力
    else      ←違う場合(z>xかつz>y)
      z       ←zを出力
    end       ←内側の条件分岐終了
  end       ←外側の条件分岐終了
end        ←関数定義終了


できましたか?
少し複雑ですが、練習問題で慣れてください。


論理演算
数学で、「命題」だの「真」だの「偽」だのやった覚えがあると思います。
Rubyでは、変数を含む命題をつくることができます。

たとえば、「xは偶数である」という命題を作りましょう。
作り方は関数を定義するのと同じです。

def  is_even(x) ←命題名
  x%2 == 0   ←「xが偶数」⇔「x÷2の余りが0」
end

これで、入力したxによって、真すなわちtrue、または偽すなわちfalseを返してくれます。
is_even(2)やis_even(8)とすれば、trueと返しますし、
is_even(5)やis_even(143)とすれば、falseと返します。

これをif文の条件式に使うことも出来ます。
たとえば、「nが偶数だったら1足して、奇数だったらそのまま返す」関数を作るとします。
その場合
def  examle(n)
  if  is_even(n)
    n+1
  else
    n
  end
end
とすればよいのです。


文字列(なんでここにこれwとか思ったら負け)
文字列を値として扱うことができます。「"」で囲むだけです。
s = "abra"
t = "cadabra"
と入力すると、変数sとtの値がそれぞれ"abra"、"cadabra"になります。
そのあと
s+t
と入力するとあら不思議。
"abracadabra"と死の呪文が返ってくるのです。
ちなみに「"」をつければ、数字も文字列として扱えます。

文字列の一部を抜き出すこともできます。
t [1..3]とすると
"aba"と返ってきます。
t[0..0]とすると
"c"と返ってきます。
注意しなければいけないのは、
一文字でも「0から0まで」のように書かなければならないこと。


繰り返し
はいはいはいやってまいりましたーーー
同じ操作を何回も繰り返すってことですよ。
これは練習問題やらないと出来るようにならないです頑張れ。

たとえば、「1からkまでの整数の和」を求める関数sum(k)を考えましょう。
1からkまでを繰り返し足すんですね。


def  sum(k)
  sum = 0     ←和を表す局所関数sum。最初は0。
  for  i  in 1..k   ←足す数を示す局所変数i。iは1〜kまで繰り返す
    sum = sum + i  ←iを足していく
  end       ←for〜に戻る。繰り返しがkまで終わったら、次の行へ進む。
  sum       ←最終的なsumを出力
end


もうお分かりですね…
for (変数)  in  (はじめの数値)..(終わりの数値)
  (命令)
end
が繰り返しの方法です。

0 件のコメント:

コメントを投稿