LoginSignup
82
31

More than 3 years have passed since last update.

【Ruby】今日のプログラミング学習時間を入力すると、学習進捗を教えてくれるプログラム

Last updated at Posted at 2019-09-28

プログラミングの勉強を初めてもうすぐ60日になる。
プログラミングを習得するには最低でも600時間勉強しなければいけないらしい。

フルタイムで働いている私は、毎日学習時間の確保との戦いだ。

  • トータル何時間勉強したのだろう?
  • 今月の目標勉強時間に何時間足りないんだろう?

毎日気になってしかたないので、
「自分の今日のプログラミング学習時間を入力すると、学習進捗を教えてくれるプログラム」をRubyで作った。

完成形

programingtime.rb

def time
  sum = 0
  while sum >= 0 
    puts "学習時間を入力してください"
    line = "---------------------"
    time = gets.to_f
    sum += time

    puts <<~EOS
      今月#{sum}時間勉強したよ!
      #{line}
      残り時間は#{100 - sum}です
      #{line}
      今月の学習時間の#{(sum / 100) * 100 }%を勉強しました
      #{line}
    EOS
  end
end

time

わたしの毎月の学習時間目標が100時間なので、
足りない時間を 100 - sum
学習進捗を (sum / 100) * 100
で出している。

ターミナルでの表示はこんな感じ。

学習時間を入力してください
2
今月2.0時間勉強したよ!
---------------------
残り時間は98.0です
---------------------
今月の学習時間の2.0%を勉強しました
---------------------
学習時間を入力してください
3
今月5.0時間勉強したよ!
---------------------
残り時間は95.0です
---------------------
今月の学習時間の5.0%を勉強しました
---------------------

Rubyエンジニアにとっては簡単なプログラムだと思うが、
完成形に到るまで初心者にとっては紆余曲折あったため
その過程も書いておこうと思う。

完成形に到るまで

to_fメソッドとto_iメソッド

学習時間は数字だから、gets メソッドとto_i メソッドでいけるっしょー

programingtime.rb

    puts "学習時間を入力してください"
    time = gets.to_i

    puts "残り時間は#{100 - time}です"
    puts "今月の学習時間の#{(time / 100) * 100 }%を勉強しました" 

実行!

学習時間を入力してください
2
残り時間は98です
今月の学習時間の0%を勉強しました

あれ、2時間って入力したのに0%になってる。なんでだろ…
to_i だと整数に変換されるから、(time/100)の部分が0.2なのに0になるのでは…?
ということは少数点を残してくれる to_f 使うべきなのか。
to_iメソッドをto_fメソッドへ変更。

programingtime.rb

    puts "学習時間を入力してください"
    time = gets.to_f

    puts "残り時間は#{100 - time}です"
    puts "今月の学習時間の#{(time / 100) * 100 }%を勉強しました" 

実行!

学習時間を入力してください
2
残り時間は98.0です
今月の学習時間の2.0%を勉強しました

今回はちゃんと2%に表示された!
けどこれだと今日の学習時間の進捗だけしか表示がされない。
困った。数字を足していきたいなぁ。

数字を足すためにsumと繰り返しのためにreturnをつかう

数字を足していくならsumだし、
また戻ってくるならreturnかな…?
とりあえずやってみよう。

programingtime.rb
def time
  puts "学習時間を入力してください"
  time = gets.to_f
  sum = 0
  sum += sum + time

  puts "今月#{sum}時間勉強したよ!"
  puts "残り時間は#{100 - sum}です"
  puts "今月の学習時間の#{(sum / 100) * 100 }%を勉強しました"

  return time
end

実行!

エラー

プログラムが動かない…

あ、time関数をよびだしてないからか。
定義しただけで呼び出していないというミス。

programingtime.rb
def time
  puts "学習時間を入力してください"
  time = gets.to_f
  sum = 0
  sum += sum + time

  puts "今月#{sum}時間勉強したよ!"
  puts "残り時間は#{100 - sum}です"
  puts "今月の学習時間の#{(sum / 100) * 100 }%を勉強しました"

  return time
end

time

これでいける!実行!

今月2.0時間勉強したよ!
残り時間は98.0です
今月の学習時間の2.0%を勉強しました

さっきと変わらない。
繰り返しってreturnじゃなかったっけ。
while文とかfor文だったきもするな。そろそろググろ(もっとはやくググれ)

while文で繰り返す

programingtime.rb
def time
  sum = 0
  while sum >= 0
    puts "学習時間を入力してください"
    time = gets.to_f
    sum += sum + time

    puts "今月#{sum}時間勉強したよ!"
    puts "残り時間は#{100 - sum}です"
    puts "今月の学習時間の#{(sum / 100) * 100 }%を勉強しました"
  end
end

time

while文で実行!

学習時間を入力してください
3
今月3.0時間勉強したよ!
残り時間は97.0です
今月の学習時間の3.0%を勉強しました
学習時間を入力してください
4
今月10.0時間勉強したよ!
残り時間は90.0です
今月の学習時間の10.0%を勉強しました

3+4で7時間になるはずなのに、10時間になっている。
sumの式あってたっけ。ググる。

sum式を正しくする

sum += sum + time としてたので無駄にsumされていた。

programingtime.rb
def time
  sum = 0
  while sum >= 0
    puts "学習時間を入力してください"
    time = gets.to_f
    sum += time

    puts "今月#{sum}時間勉強したよ!"
    puts "残り時間は#{100 - sum}です"
    puts "今月の学習時間の#{(sum / 100) * 100 }%を勉強しました"
  end
end

time

これでただしくsumされるでしょう!実行

学習時間を入力してください
2
今月2.0時間勉強したよ!
残り時間は98.0です
今月の学習時間の2.0%を勉強しました
学習時間を入力してください
3
今月5.0時間勉強したよ!
残り時間は95.0です
今月の学習時間の5.0%を勉強しました

完成!!
これで毎日の数字が足されていくプログラムができた!
式もあってるし、完璧!

もっと見やすくしてみる

改行とlineを追加してみる

もっとターミナル上でみやすく表示させたい!
改行とline追加してみよ。

programingtime.rb
def time
  sum = 0
  while sum >= 0
    puts "学習時間を入力してください"
    line = "---------------------"
    time = gets.to_f
    sum += time

    puts "今月#{sum}時間勉強したよ!\n#{line}"
    puts "残り時間は#{100 - sum}です\n#{line}"
    puts "今月の学習時間の#{(sum / 100) * 100 }%を勉強しました\n#{line}"
  end
end

time

実行

学習時間を入力してください
2
今月2.0時間勉強したよ!
---------------------
残り時間は98.0です
---------------------
今月の学習時間の2.0%を勉強しました
---------------------
学習時間を入力してください
3
今月5.0時間勉強したよ!
---------------------
残り時間は95.0です
---------------------
今月の学習時間の5.0%を勉強しました
---------------------

いいかんじ。
満足してると同期エンジニアから、「改行したいならもっと書きやすいヒアドキュメントあるよ」と。

ヒアドキュメントを使ってみる

ぐぐってみると、
Ruby のヒアドキュメントすごい - Qiita
なるほど。まとまった文章を書くのにはたしかにヒアドキュメントすごそう。

programingtime.rb
def time
  sum = 0
  while sum >= 0 
    puts "学習時間を入力してください"
    line = "---------------------"
    time = gets.to_f
    sum += time

    puts <<-EOS
      今月#{sum}時間勉強したよ!
      #{line}
      残り時間は#{100 - sum}です
      #{line}
      今月の学習時間の#{(sum / 100) * 100 }%を勉強しました
      #{line}
    EOS
  end
end

time

なるほどこれはコードが綺麗だ。
さすが綺麗なコードを書くで有名な同期エンジニア。

学習時間を入力してください
2
      今月2.0時間勉強したよ!
      ---------------------
      残り時間は98.0です
      ---------------------
      今月の学習時間の2.0%を勉強しました
      ---------------------
学習時間を入力してください
3
      今月5.0時間勉強したよ!
      ---------------------
      残り時間は95.0です
      ---------------------
      今月の学習時間の5.0%を勉強しました

ターミナルでもしっかり表示されてるが
ちょっとインデントが右寄りになるのが気になるらしい(私は特に気にならない)

ヒアドキュメントはコードのインデントもそのまま反映するらしい。
そのインデントを解除するには puts <<-EOS を puts <<~EOS に変えるだけでいいらしい。なんと簡単。

programingtime.rb
def time
  sum = 0
  while sum >= 0 
    puts "学習時間を入力してください"
    line = "---------------------"
    time = gets.to_f
    sum += time

    puts <<~EOS
      今月#{sum}時間勉強したよ!
      #{line}
      残り時間は#{100 - sum}です
      #{line}
      今月の学習時間の#{(sum / 100) * 100 }%を勉強しました
      #{line}
    EOS
  end
end

time

さてさて、ターミナルはどうなる。

学習時間を入力してください
2
今月2.0時間勉強したよ!
---------------------
残り時間は98.0です
---------------------
今月の学習時間の2.0%を勉強しました
---------------------
学習時間を入力してください
3
今月5.0時間勉強したよ!
---------------------
残り時間は95.0です
---------------------
今月の学習時間の5.0%を勉強しました
---------------------

おぉ!インデントも左寄せですっきり!
これで完成!

これからの課題

これで「自分の今日のプログラミング学習時間を入力すると、学習進捗を教えてくれるプログラム」をRubyで作るのは実行できた。

ただこれだと一生ターミナルを閉じれない。
データベースにデータを保存する必要があるし、
その後はブラウザからでも入力できるようにビューファイルも作成しないと…
あれそのためにはサーバーを立てないと。

こんなに簡単なプログラムでもいろいろやるべきことがあるんだと実感できた。
少しずつやっていこう。今回はここまで。

82
31
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
82
31