第5回のレポート課題です。 氏名: 時田佳穂 学籍番号: C1101603 語学クラス: 中国語3 コース(系): 環境サイエンス 1-A. k…0x6b = 0d107 a…0x61 = 0d97 h…0x68 = 0d104 o…0x6f = 0d111 0x6b + 0x61 + 0x68 + 0x6f 0x6b 10-a 11-b 12-c 13-d 14-e 15-f 0x61 0x68 + 0x6f ---------- 0x1a3 文字コードを16進数で足し合わせると、0x1a3 0d107 + 0d97 + 0d104 + 0d111 pan{c110160}% bc -l [~] 107 + 97 + 104 + 111 419 文字コードを10進数で足し合わせると、0d419 0x1a3を16(0x10)で割ると 19 ------- 10 ) 1a3 10 ------- 93 90 ------- 3 余りは0x3 0d419を16で割ると 26 ------- 16 ) 419 32 ------- 99 96 ------- 3 余りは0d3 0x3 = 0d3 であるので、計算は正しい。 1-B. 学校への道順をプログラム風に書き直します。 def way(home,cycle,corner,distance) home を出る cycle に乗る coener に曲がって distance メートル進む end way(アパート,自転車,右,60) #学校に行くので呼び出す print"学校に着きました\n" 2-A. ◯作成したプログラム・説明 #!/usr/koeki/bin/ruby #入力を読み込み、処理するときに呼び出す関数 def read() number = [] while line = gets n = line.chomp! #配列の中の要素の数を数えるため、to_iメソッドで #整数値にしなくてもいい if n == "quit" break #quit と入力されたら終了 elsif n =~ /\D+/ #0個以上の0〜9の数字以外 #この場合、文字列に数字を混ぜてもひっかかる。 print"数字を入力して下さい(終了は quit)\n" redo #数字でなかった場合もう一度入力させる else #それ以外(数字の場合)そのまま進む end number.push(n) #nを配列変数numberに代入 end number #numberを返す end #組み合わせを計算するときの関数 def factorial(n) if n <= 1 1 else n * factorial(n-1) #関数factorialの定義の中で、再度factorialを呼び出す #→factorial(n-1)を、1になるまで繰り返す #→階乗ができる end end STDERR.print"好きな数をいくつか入力して下さい(終了は quit)\n" number = read() #関数readを呼び出し #p number number.delete_if {|x| x == nil} #数字以外は"nil"と表示されるので、配列からnilを削除 #p number count = number.length #lengthで配列の長さをcountに代入 #p count #p factorial(count) #nCm (n個からm個選ぶ組合せ) #ここでは、 n = count m = 1から足していく m = 1 sum = 0 print"これらの数字から\n" while true if m <= count # m が count と同じになるまで繰り返す fac = factorial(count) / (factorial(m) * factorial(count - m)) # count!(countの階乗 = factorial関数) #count C m = --------------------------------------- # m!(count - m)! printf(" %d つ選ぶ選び方は %d 通りです。\n",m,fac) else break end m += 1 # 1ずつ足していく end ◯実行結果 pan{c110160}% ./def_combination.rb [~/Ruby] 好きな数をいくつか入力して下さい(終了は quit) 1 2 3 4 quit これらの数字から 1 つ選ぶ選び方は 4 通りです。 2 つ選ぶ選び方は 6 通りです。 3 つ選ぶ選び方は 4 通りです。 4 つ選ぶ選び方は 1 通りです。 ◯考察 数字だけでの並び替えにしたので、無駄に苦労してしまった。 数字とquit以外のとき、redoを使っても push で numberには代入 されてしまい後でdelete_ifを使うことになったが、 入力している側に文字を入力しないように警告しなくては 組み合わせの計算結果が違うと思われてしまうのでredoを使った。 ちなみにredoを消すと文字列がそのままnumberに入るので 後でnilとして削除できなくなってしまう。 一、数字以外を入力した場合の実行結果 pan{c110160}% ./def_combination.rb [~/Ruby] 好きな数をいくつか入力して下さい(終了は quit) 1 2 3 e 数字を入力して下さい(終了は quit) f 数字を入力して下さい(終了は quit) 1 quit これらの数字から 1 つ選ぶ選び方は 4 通りです。 2 つ選ぶ選び方は 6 通りです。 3 つ選ぶ選び方は 4 通りです。 4 つ選ぶ選び方は 1 通りです。 二、数字と文字を混ぜて入力した場合 pan{c110160}% ./def_combination.rb [~/Ruby] 好きな数をいくつか入力して下さい(終了は quit) 1 2 3 g4 数字を入力して下さい(終了は quit) 4g 数字を入力して下さい(終了は quit) quit これらの数字から 1 つ選ぶ選び方は 3 通りです。 2 つ選ぶ選び方は 3 通りです。 3 つ選ぶ選び方は 1 通りです。 3.感想 機械的な動作として一番に出てくるのは、 工場などでの流れ作業です。 同じ行程を同じ手順で何度も繰り返すところが 機械的だと思いました。 4. 参考: Life with IT 配列 (kogurek1) http://l-w-i.net/t/ruby/array_001.txt 基礎プログラミングII 第8回 (神田直弥) http://roy/~naoya/rubyII/8.html 共同学習者: 赤石亜希子 佐藤千香