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

6/26 学習したこと&まとめ

Rubyドリル

if else

要件:

  • 購入金額が999円以下の場合、3%のポイント
  • 購入金額が1000円以上の場合、5%のポイン
  • 誕生日の場合はポイントが5倍

となるポイント付与サービスのメソッドを作ります。

誕生日の場合はtrue、誕生日でない場合はfalse

.floorメソッド

小数点の切り捨てを行うメソッド。

呼び出し方:

calculate_points(amount, is_birthday)

出力例:

calculate_points(500, false) → ポイントは15点です
calculate_points(2000, false) → ポイントは100点です
calculate_points(3000, true) → ポイントは750点です

def calculate_points(amount,is_birthday)
 if amount <= 999
  point = amount * 0.03
 else
  point = amount * 0.05
 end
 if is_birthday
  point = point * 5
 end
  puts "ポイントは#{point.floor}点です"
end
解説

購入金額が999円以下なのか1000円以上なのかを if amount <= 999

で判断して、購入金額に対して0.03または0.05をかけてポイント数を

計算してpointに代入させます。

その後に、is_birthdayがtrueの場合変数pointに5をかける処理にしています。

point.floorとして小数点を切り捨て、ポイント数を出力します。

FizzBuzz問題

1~100までの数字を出力して、

3の倍数のときは「Fizz
5の倍数のときは「Buzz」
両方の倍数である15の倍数のときは「FizzBuzz

と出力するプログラムを作ります。

whileメソッド

条件を指定して繰り返し処理をするメソッド

def fizz_buzz
 num = 1
 while (num <= 100) do
  if (num % 3 == 0) && (num % 5 == 0)
   puts "FizzBuzz"
  elsif (num % 3) == 0
   puts "Fizz"
  elsif (num % 5) == 0
   puts "Buzz"
  else
   puts num
  end

  num = num + 1
 end
end

fizz_buzz
解説

while (num <= 100)で1~100までの数字を出力します。

if文で条件分岐させ、3の倍数のとき、5の倍数のときを先に記述すると

15の倍数のときの処理をする前にtrueになってしまうので、15の倍数である条件式を一番に記述します。

15の倍数の条件式は(num % 15 == 0)でも可能です。

FizzBuzz問題の応用

いくつまでカウントするか、引数で指定できるようにします。

範囲を指定して繰り返しする場合
範囲演算子(..)
(開始する値..終了する値)

# 1~6までの範囲を指定して、繰り返し表示
(1..6).each do |num|
  puts num
end

を使います。

def fizzbuzz(max_num)

  (1..max_num).each do |num|
    if num % 15 == 0
      puts "FizzBuzz"
    elsif num % 5 == 0
      puts "Buzz"
    elsif num % 3 == 0
      puts "Fizz"
    else
      puts num
    end
  end
end

puts 'いくつまで数えますか?'
num = gets.to_i
fizzbuzz(num)
解説

1..max_num で1から入力した値まで繰り返すようにしています。

2つの文字列の末尾に対して一致、不一致を判断するプログラム

2つの文字列の末尾の文字を比較して、

一致する場合は、true

一致しない場合は、false

を出力するプログラムを作ります。

要件:

  • メソッドの引数に、任意の2つの文字列を指定する。
  • 引数に指定された2つの文字列のうち、どちらかがもう一方の文字列の末尾にある場合は、Trueを出力する
  • 上記を満たせていない場合は、Falseを出力する
  • 入力された文字が大文字でも小文字でも、同一の文字として処理を行う

出力例:

end_other('Hiabc', 'abc') → True
end_other('AbC', 'HiaBc') → True
end_other(‘abc’, ‘HaIoBc’) → False

sliceの範囲指定
#範囲を指定して要素を切り取る場合
# 要素を定義
array = "Hiabc"

#配列番号(インデックス番号)の-3から-1の範囲の文字列を切り取る
array.slice(-3..-1)
#=> abc
downcaseメッソド
大文字を小文字に変換するメソッド
# 大文字を含んだ文字列を定義
irb(main):001:0> name = "Hiabc"
=> "Hiabc"

# downcaseメソッドを使用し、小文字に変換
irb(main):002:0> name.downcase
=> “hiabc”

を使います。

def end_other(a, b)
  a_down = a.downcase
  b_down = b.downcase
  a_len = a_down.length
  b_len = b_down.length
  if b_down.slice(-(a_len)..- 1) == a_down || a_down.slice(-(b_len)..- 1) == b_down
    puts "True"
  else
    puts "False"
  end
end

# 呼び出し例
end_other('Hiabc', 'abc') 
解説

大文字と小文字を区別しないようにdowncaseメソッドを使い、

小文字に変換して、a_downとb_downに代入しています。

その後に、どちらかの文字列を小文字がもう一方の最後にある場合を

区別するための処理になります。

slice(-(a_len)..- 1)としているのは、対象の文字列分を切り取るためです。

if文でabcの最後にHiabcが含まれているか、Hiabcの最後にabcという文字列が含まれているかを判別しています。

b_down.slice(-(a_len)..- 1)は、b_down.slice(-5..-1)となります。しかし、b_down = abcとなっているので、インデックス番号-5から-1という条件で切り取ることができません。そのため、この部分はnilとなります。結果、nil == a_downは等しくないと評価されるので、falseになります。

続いて
a_down.slice(-(b_len)..- 1)は、a_down.slice(-3..-1)となります。

hiabcという文字列の最後にabcが含まれているかを確認したいので、abcという文字列分を左から数えます。すると、hiabcの最後までを範囲指定していることがわかります。そしてa_down = hiabcとなるので、インデックス番号-3から-1という条件で切り取るとabcが残ります。結果、abc == b_downは等しいと評価されるので、trueとなります。

progate

復習

rails g migrationコマンド

マイグレーションファイルのみを作成するコマンド

$ rails g migration ファイル名

カラムを追加するとき
add_column :テーブル名, :カラム名, :データ型
Fileクラス

ファイルを作成するために、Fileクラスのwriteメソッドを使います。

$ rails console
> File.write("public/sample.tet","Hello World")

画像を保存するには、File.binwriteを使います。

File.binwrite("public/user_images/#{@user.image_name}",image.read)
              #ファイルの場所                 #ファイルの中身

一言日記

同じRuby on Railsでもテックキャンプとプロゲートですこし違う。

ただ、違いはあれ基本は同じなので復習にも新しい学習にもなります。

あたらしいスキルを身につける時は、複数の媒体で学習する方が、ものになる

確率が上がるってのは、こういうことなのかと実感。

午前に会社説明会に参加しました。

プログラミングの教育事業をしている企業で、求人ページ見てて感じた

仲間と一緒に成長できるとか、熱意をもった仕事に夢中になれるとか

説明会でさらに感じました。

こうゆう会社で働けたら生きることが楽しくなるのかな…。

いまでなんとなく生きてたから(笑)

この年になってやっと、自分の成長とかやりたいこととか真剣に考えるように

なって、プログラミング勉強したり、瞑想したり、運動したり、もっと早く

気づいてたらって思うけど、過去の出来事があったから、今があって、

今やから考え行動することができた。って思う。

ただ、やっぱりふとした瞬間に過去を悔やんでしまう。

過去ではなくこれからどうするかってことが大事なのはわかってはいるのに…

今できることを少しずつ積み上げるしかないですよね。

さて、今日もがんばります。