#+OPTIONS: ^:{}
#+TITLE: はじめてのRuby
#+AUTHOR: Shun Takahashi
#+LANGUAGE: jp
#+OPTIONS: H:4 toc:t num:2
# -*- mode: org; -*-
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
# +SETUPFILE: /Users/bob/Github/org-html-themes/setup/theme-readtheorg-local-daddygongon.setup
# * drillを作ってみる
# 1. まず,Listを取り出す
# 1. 実行結果をつける
# 1. コードの振る舞いを記述するタイトルをつけていく.
* print,puts,pメソッド
** helloruby.rb
「Hello, Ruby.」という文字列を表示するプログラムを作成せよ。文字列の終わりは改行すること。
#+begin_src ruby
print "Hello, Ruby.\n"
#+end_src
#+begin_example
> answer.rb
Hello, Ruby.
#+end_example
** helloruby_2.rb
「Hello, "Ruby".」という文字列を表示するプログラムを作成せよ。文字列の終わりは改行すること。
#+begin_src ruby
print "Hello, \"Ruby\".\n"
#+end_src
#+begin_example
> answer.rb
Hello, "Ruby".
#+end_example
** p_method.rb
「"Hello,\n\tRuby."」という文字列を表示するプログラムを作成せよ。
#+begin_src ruby
p "Hello,\n\tRuby."
#+end_src
#+begin_example
> answer.rb
"Hello,\n\tRuby."
#+end_example
* コマンドラインからのデータの入力
** print_argv.rb
コマンドラインから5つの引数を受け取り、受け取った順に表示するプログラムを作成せよ。
#+begin_src ruby
puts ARGV[0]
puts ARGV[1]
puts ARGV[2]
puts ARGV[3]
puts ARGV[4]
#+end_src
#+begin_example
> ruby answer.rb 1st 2nd 3rd 4th 5th
1st
2nd
3rd
4th
5th
#+end_example
** arg_arith.rb
コマンドラインから2つの引数を受け取って数値に変換し、その和、差、積、商を表示するプログラムを作成せよ。
#+begin_src ruby
num0 = ARGV[0].to_i
num1 = ARGV[1].to_i
sum = num0 + num1
dif = num0 - num1
pro = num0 * num1
quo = num0 / num1
puts sum
puts dif
puts pro
puts quo
#+end_src
#+begin_example
> ruby answer.rb 5 3
8
2
15
1
#+end_example
* 変数
** area_volume.rb
3つの数値をx、y、zとして受け取り、縦x、横y、高さzの直方体の表面積と体積を求め、表示するプログラムを作成せよ。
#+begin_src ruby
x = ARGV[0].to_i
y = ARGV[1].to_i
z = ARGV[2].to_i
area = (x * y + y * z + z * x) * 2
volume = x * y * z
print '表面積=', area, "\n"
print '体積=' volume, "\n"
#+end_src
#+begin_example
> ruby answer.rb 10 20 30
表面積=2200
体積=6000
#+end_example
* 条件判断
** greater_smaller_else.rb
1つの数値を受け取り、それが10より大きければ「greater」小さければ「smaller」と表示するプログラムを作成せよ。
#+begin_src ruby
a = ARGV[0].to_i
if a >= 10
print "greater\n"
else
print "smaller\n"
end
#+end_src
#+begin_example ruby
>ruby answer.rb 20
greater
>ruby answer.rb 5
smaller
#+end_example
* 繰り返し
** 1_to_n.rb
1つの数値をnとして受け取り、1からnまでの数を順番に表示するプログラムを作成せよ。
#+begin_src ruby
n = ARGV[0].to_i
i = 1
while i <= n
print i, "\n"
i += 1
end
#+end_src
#+begin_example ruby
> ruby answer.rb 5
1
2
3
4
5
#+end_example
** five_times.rb
# while文と動作での差別化難しい
「All work and no play makes Jack a dull boy.」と5行表示するプログラムを作成せよ。
#+begin_src ruby
5.times do
print "All work and no play makes Jack a dull boy.\n"
end
#+end_src
#+begin_example
> answer.rb
All work and no play makes Jack a dull boy.
All work and no play makes Jack a dull boy.
All work and no play makes Jack a dull boy.
All work and no play makes Jack a dull boy.
All work and no play makes Jack a dull boy.
#+end_example
* 配列
** 配列からオブジェクトを取り出す
1つの数値をnとして受け取り、配列のn番目の要素を取り出し、表示するプログラムを作成せよ。ただし、配列はプログラム内で定義し、配列には数値が入るものとする。
#+begin_src ruby
nums = [3, 1, 4, 1, 5]
print nums[ARGV[0].to_i]
#+end_src
#+begin_example ruby
> ruby answer.rb 0
3
> ruby answer.rb 3
1
#+end_example
** 配列にオブジェクトを格納する
配列の先頭の要素をコマンドラインに入力した要素に変更するプログラムを作成せよ。
ただし、配列はプログラム内で定義し、配列には数値が入るものとする。
#+begin_src ruby
nums = [3, 1, 4, 1, 5]
nums[0] = ARGV[0].to_i
print nums
#+end_src
#+begin_example
> ruby answer.rb 5
[5, 1, 4, 1, 5]
#+end_example
** 配列の大きさ
配列を表示し、その配列の大きさも表示するプログラムを作成せよ。
ただし、配列はプログラム内で定義すること。
#+begin_src ruby
nums = [3, 1, 4, 1, 5]
print nums, "\n"
print nums.size, "\n"
#+end_src
#+begin_example
> ruby answer.rb
[3, 1, 4, 1, 5]
5
#+end_example
** 配列と繰り返し
配列全体を表示してから、配列の要素を順に表示するプログラムを作成せよ。
ただし、配列はプログラム内で定義すること。
#+begin_src ruby
nums = [3, 1, 4, 1, 5]
print nums, "\n"
nums.each do |n|
puts n
end
#+end_src
#+begin_example
> ruby answer.rb
[3, 1, 4, 1, 5]
3
1
4
1
5
#+end_example
* ハッシュ
** シンボル
1つの文字列を受け取り、シンボルに変換して表示するプログラムを作成せよ。
#+begin_src ruby
n = ARGV[0]
p n.to_sym
#+end_src
#+begin_example
> ruby answer.rb hash
:hash
#+end_example
** ハッシュの操作
:name, :furigana というそれぞれのキーに"高橋", "タカハシ"というオブジェクトが格納されているハッシュを作成、表示し、さらに:tel というキーに"000-1234-5678"を格納して再度表示するプログラムを作成せよ。
#+begin_src ruby
address = { name: "高橋", furigana: "タカハシ" }
puts address
address[:tel] = "000-1234-5678"
puts address
#+end_src
#+begin_example
> ruby answer.rb
{:name=>"高橋", :furigana=>"タカハシ"}
{:name=>"高橋", :furigana=>"タカハシ", :tel=>"000-1234-5678"}
#+end_example
* 正規表現
** パターンとマッチング
1つの文字列を受け取り、それが「Hello, Ruby」とマッチするなら「match.」マッチしないなら「not match.」と表示するプログラムを作成せよ。
#+begin_src ruby
n = /#{ARGV[0]}/
if n =~ "Hello, Ruby."
print "match.\n"
else
print "not match\n"
end
#+end_src
#+begin_example
> ruby answer.rb Ruby
match.
> ruby answer.rb RUBY
not match.
#+end_example
* ファイルからの読み込み
** read_text.rb
1つの文字列を受け取り、文字列と一致するファイル名のテキストデータを表示するプログラムを作成せよ。
#+begin_src ruby
filename = ARGV[0]
text = File.read(filename)
print text
#+end_src
#+begin_example
>ruby answer.rb [filename]
[text]
#+end_example
** read_line.rb
1つの文字列を受け取り、文字列と一致するファイル名のテキストデータを1行ずつ読み取り、表示するプログラムを作成せよ。
#+begin_src ruby
filename = ARGV[0]
file = File.open(filename)
file.each_line do |line|
print line
end
file.close
#+end_src
#+begin_example
#+end_example
** simple_grep.rb
2つの文字列を受け取り、2つ目の文字列に一致するファイル名のテキストデータの各行から、1つ目の文字列にマッチする行を出力するプログラムを作成せよ。
#+begin_src ruby
pattern = Regexp.new(ARGV[0])
filename = ARGV[1]
file = File.open(filename)
file.each_line do |line|
if pattern =~ line
print line
end
end
file.close
#+end_src
#+begin_example
>ruby answer.rb [pattern] [filename]
#+end_example
* メソッドの作成
** hello_ruby2.rb
「Hello, Ruby.」と表示するメソッドhelloを作成し、helloメソッドを用いて「Hello, Ruby.」と表示するプログラムを作成せよ。
#+begin_src ruby
def hello
puts 'Hello, Ruby.'
end
hello
#+end_src
#+begin_example
> ruby answer.rb
Hello, Ruby.
#+end_example
** hello_ruby3.rb
1つの文字列を受け取り、「Hello, 受け取った文字列.」と表示するメソッドhelloを作成し、
2つの文字列を受け取り、「Hello, 受け取った文字列.」と2行表示するプログラムを作成せよ。
#+begin_src ruby
def hello(name)
print 'Hello, ', name, ".\n"
end
hello(ARGV[0])
hello(ARGV[1])
#+end_src
#+begin_example
> ruby answer.rb Ruby Takahashi
Hello, Ruby.
Hello, Takahashi.
#+end_example
* 別のファイルを取り込む
** ディレクトリ内のファイルの取り込み
1つの文字列を受け取り、「Hello, 受け取った文字列.」と表示するメソッドhelloが書かれたプログラムhello.rbがある。
このプログラムを取り込んで、1つの文字列を受け取り、「Hello, 受け取った文字列.」と表示するプログラムを作成せよ。
- hello.rb
#+begin_src ruby
def hello(name)
print 'Hello, ', name, "\n"
end
#+end_src
#+begin_src ruby
require_relative "hello"
name = ARGV[0]
hello(name)
#+end_src
#+begin_example
> answer.rb Ruby
Hello, Ruby.
#+end_example
** Rubyの標準ライブラリ
Rubyの標準ライブラリ「date」を用いて、Rubyが誕生した1993年2月24日から、今日までの日数を表示するプログラムを作成せよ。
#+begin_src ruby
require "date"
days = Date.today - Date.new(1993, 2, 24)
puts days.to_i
#+end_src
#+begin_example
> ruby answer.rb
9302
#+end_example
- 2018/8/14時点