TEHC CAMP 91期夜間休日 卒業後活動記録

7月2日 学習したこと

Rubyドリル

預金システムのアルゴリズム

要件

銀行口座に10万円の預金残高があり、お金を引き出すプログラムを作成します。
・お金を引き出すwithdrawメソッドを作成する
・お金を引き出すと手数料110円かかり、「◯◯円引き落としました。残高は◯◯円です」と表示する(残高は手数料を引いた額を表示します)
・もし預金残高より多く引き落としたら「残高不足です」と表示する

参考

def withdraw(balance, amount)
  fee = 110  # 手数料
# 引き落とし額と残高を表示する、もしくは残高より多く引き落としたら残高不足と表示
end

balance = 100000  # 残高
puts "いくら引き落としますか?(手数料110円かかります)"
money = gets.to_i
withdraw(balance, money)

回答

def withdraw(balance, amount)
 fee = 110
 if balance >= (amount + fee)
  balance -= (amount + fee)
  puts "#{amount}円引き落としました。残高は#{balance}円です"
 else
  puts "残高不足です"
 end
end

balance = 100000
puts "いくら引き落としますか?(手数料110円かかります)"
money = gets.to.i
withdraw(balance, money)

解説

入力した金額(amount)と手数料(fee)の合計が100000以上かどうかを

if文で条件分岐しています。

100000以上の場合は、balance -= (amount + fee)

が処理されます。

配列に格納された数値の合計値を算出するプログラム

要件

  • 配列に格納された3つの数値の合計を出力する
  • ただし、同じ数値が2つ以上含まれている場合、その数値は合計する要素に含めない

出力例

  • lone_sum([1, 2, 3]) → 6
  • lone_sum([3, 2, 3]) → 2
  • lone_sum([3, 3, 3]) → 0

参考

def lone_sum(ary)
  # 処理を記述
end

# 呼び出し例
lone_sum([1, 2, 3])

回答

def lone_sum(ary)
  uniq_nums = []
  ary.each do |num|
    count = 0
    ary.each do |i|
      if num == i
        count += 1
      end
    end
    if count < 2
      uniq_nums << num
    end
  end

  # uniq_nums
  sum = 0
  uniq_nums.each do |unique_num|
    sum += unique_num
  end
  puts sum
end

# 呼び出し例
lone_sum([1, 2, 3])

解説

2〜13行目で重複しない値のみ取り出す処理を、16〜19行目で重複しない値のみになった配列内の合計を求める処理を行っています。

num == i で重複したときcountが増えるようになります。

重複した値が1つのときだけ、uniq_nums配列に値を追加します。

これを配列の数だけ繰り返します。

そして、uniq_nums配列内の合計を求めます。

Rubyの検索

配列に任意の値が存在するかどうか、そして何番目に存在するか、

検索するコードを作ります。

要件

  • 添字が0の要素の配列における「1」は「配列の0番目に存在する」と表現します。
  • 任意の値が配列内に存在しない場合は、「値は配列内に存在しません」と表示する
  • 存在する場合は、配列の何番目にあるかを表示する。

バイナリーサーチ

配列に入ったデータに対する検索を行うときに用いられる手法。

まず、中央の値を確認し、検索したい値との大小関係を用いて、検索したい値が中央の右にあるか、左にあるかを判断します。それを繰り返し、片側には存在しないことを確かめながら検索していく方法。

https://tech-master.s3.amazonaws.com/uploads/curriculums//353ef454a5c0be1064c8256f72998bac.png

出力例

検索したい数字を入力してください
5
5は配列の2番目に存在します 

検索したい数字を入力してください
7
7は配列内に存在しません

回答

def binary_search(array, right, target)
  left = 0
  while left <= right
    center = (left + right) / 2
    if array[center] == target
      return center
    elsif array[center] < target
      left = center + 1
    else
      right = center - 1
    end
  end
  return -1 
end

array=[1,3,5,6,9,10,13,20,26,31]

puts "検索したい数字を入力してください"
target = gets.to_i
number_of_elements = array.count

result = binary_search(array, number_of_elements, target)

if result == -1
  puts "#{target}は配列内に存在しません"
else
  puts "#{target}は配列の#{result}番目に存在します "
end

1〜14行目で中央の値を見て、検索したい値との大小関係を用いて、検索したい値が中央の値の右にあるか、左にあるかを判断して、片側には存在しないことを確かめながら検索を行う処理を行っています。13行目のreturn -1は何も当てはまるときがないときに、最終的な返り値になります。

条件演算子

要件

3桁の整数を入力し、その整数の「百の位・十の位・一の位の和」が

10の倍数からの差が

・2以内であるときは"True"
・それ以外は"10の倍数との差は○です"

と表示されるようにします。

出力例

  • near_ten(117)→True
  • near_ten(123)→10の倍数との差は4です
  • near_ten(111)→10の倍数との差は3です

*百の位・十の位・一の位の和が6などの時に、「10の倍数との差は6です」と出力せずに、「10の倍数との差は4です」と10の倍数から近い方の差を出力するようする。また、0も10の倍数に含むものとする。

回答

def near_ten(num)
  total = (num/100) + (num/10 % 10) + (num % 10)
  remainder = total % 10
  if remainder <= 2 || remainder >= 8
    puts "True"
  elsif remainder <= 5
    puts "10の倍数との差は#{remainder}です"
  else 
    puts "10の倍数との差は#{10 - remainder}です"
  end
end

(num/100) + (num/10 % 10) + (num % 10)で百の値・十の位・一の位を

それぞれ足し合わせています。

<num/100 (百の位)>
num = 117の場合

117/100 は1.17になります。integer型の計算では小数点以下は切り捨て

になるので「1」になります。

<num/10 % 10(十の位)>

num = 117の場合

117/10 は11.7になり、小数点を切り捨てられ11になります。

11 % 10 は10で割った余りを計算結果とするので、余り1となり

十の位は「1」となります。

<num % 10の場合(一の位)>

num = 117の場合

117 % 10 は117を割った際の余りを計算結果とするので、

余りは7となります。

よって、一の位は「7」になります。

progate

Ruby on Rails 学習コースⅧ

10ページまでクリア