# ジュニアドクター教材

1. (0) 基礎内容
2. (1) 変数
3. (2)値
4. (3)入出力処理
5. (4)制御構造
6. (5)配列
7. (6)メソッド
8. (7)プログラムをもっと楽しくしてみよう！

# (0) 基礎内容

## ［1］キーボードについて

キーボードの配置は主に以下の通りである。

赤丸で囲まれている部分を【コントロール】といい、プログラムの操作をする上で大事なキーとなるため必ず覚えておく。他にも、【shift(シフト)】というキーもよく使うものであるので必ず覚えておくこと。コントロールを押しながら別のキーを押す、シフトを押しながら別のキーを押すというように別のキーと組み合わせて使うので、その組み合わせをしっかり記憶しておくことでプログラムを書く際にスムーズに進めることが出来る。このJD説明書と別冊の教科書ではコントロールを押しながら、１を押すことを【C-1】と記載する。【C-●】と出てきたら、それはコントロールを押しながら●のキーを押す操作である。

- キーボードの配置は覚えておくこと。特にコントロールとシフトは大事
- 【C-1】とはコントロールを押しながら１を押すことである
- 【C-●】とはコントロールを押しながら別のキーを押す説明である

## ［2］画面の操作について

### emacs

【C-1】と入力することで、emacs(いーまっくす)というタブを選択することが出来る。このタブを使ってプログラムを作成することが出来る。もしemacsというタブを選択することが出来ない場合、何もない場所を左クリックしてメニューを表示し、上にあるemacsを選んで新しくタブを出す。

### kterm

【C-2】と入力することで、kterm(けーたーむ)というタブを選択することが出来る。このタブを使ってプログラムを実行したり、作ったプログラムを確認したり出来る。もしktermというタブを選択することが出来ない場合、何もない場所を右クリックしてメニューを表示し、上にあるktermを選んで新しくタブを出す。

- 【C-1】でemacsを選ぶ事ができ、ここでプログラムを作成する
- 【C-2】でktermを選ぶ事ができ、ここでプログラムを実行する

## ［3］プログラムの基本的なルール

プログラムは上から１行づつ書いていき、上から順に実行されていく。途中から・下からは実行はされない。プログラムは１文字でもおかしい部分があると動いてはくれないため、誤字脱字などに気をつける。

        #!/usr/bin/env ruby
        #-*- coding: utf-8 -*-

        print("こんにちは！")
        print("JD 鳥海塾の〇〇〇〇です。\n")

        こんにちは！

        JD 鳥海塾の〇〇〇〇です。

プログラムは必ず保存してから実行する。保存を行うときには【C-x】【C-s】保存が出来ると、左下にある＊＊のマークが--に変わる。＊＊が保存できていないという証で、ーーが保存完了の証。

- プログラムは上から１行づつ書いていき、上から順に実行されていく
- 【C-x】【C-s】でプログラムを保存することが出来る

## ［4］プログラムファイルの作り方

プログラムファイルを作るためにはemacs上で【C-x】【C-f】を入力する。すると下の部分に青文字で　Find file: ~/　というテキストが出てくる。

        Find file: ~/

そこに続けて Ruby/my1.rb と入力することでmy1.rbというプログラムファイルを作成することが出来る。my1 の部分は自分の好きな名前を入れる事が出来る。 kudamono.rb yasai.rb keisan.rb　などである。作成出来ると何も書いていない真っ白なページが出来るので、そこにプログラムを書くことが出来る。書き終わったら保存を忘れないこと。

        Find file: ~/Ruby/my1.rb #my1.rbは自分が分かりやすい名前にしておく

- プログラムファイルを新しく作るにはemacs上で【C-x】【C-f】を入力
- Ruby/my1.rb と入力することでmy1.rbというプログラムファイルを作成することが出来る。my1 の部分は自分の好きな名前を入れる事が出来る。

# (1) 変数

## ［1］変数について

変数とは「値」を入れておく「箱」のようなもので、事前に「値」を格納しておき、後で簡単に取り出せるように出来る。

変数を用意するにはプログラムにはこのように書く。

      apple = #appleという名前をつけた「変数」を用意

この記述だけで「apple」という「変数」を作ることが出来る。では早速この変数に値を格納する。

      apple = 3 #「変数」に3を格納

これでappleという「変数」に３という「値」を格納することが出来た。この格納する動きのことを代入と表現する。変数を利用して計算のプログラムを作成する。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      apple = 3 #appleという「変数」に「３」を代入
      print(appel + 17) #appleには「３」が格納されているので、3 + 17 になる

      20

## ［2］変数のルール

変数には自分の好きな名前をつけることが出来るが、使える文字は英数字とアンダースコア(_)のみで、最初の文字は英語の小文字でなければならない

上記のルールを守った上で複数の変数を使用したプログラムを作成する。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      apple = 3
      orange = 5
      japan = 2
      google_earth = apple + orange + japan
      #３つの変数の値の合計をgoogle_earthに代入する
      print(google_earth)

      10

- 変数とは「値」を入れておく「箱」のようなもので、事前に「値」を代入しておき、後で簡単に取り出せるように出来る。
- 変数 = 値で変数の中に値を代入することが出来る。
- 変数には自分の好きな名前をつけることが出来るが、使える文字は英数字とアンダースコア(_)のみで、最初の文字は英語の小文字でなければならない。

# (2)値

## ［1］値について

プログラム内において、値とはプログラムの処理の対象になるデータのこと。

これについてはプログラムを確認しながら説明していく。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      print(1 + 2)

      3

このプログラムはただ「１＋２」を行い「３」を出力しただけのプログラムであるが、この動き自体が実は凄いことをしている。

このプログラムには「３」という文字は一切書かれていない。それにも関わらず、プログラムは「１」と「２」という数字を対象として、「足し算という処理」を行い、「３」を導き出している。

今回のプログラムの「１」と「２」のように「処理の対処になるもの」のことを「値」と呼ぶ。

- 値とはプログラムの処理の対象になるデータのことである。

## ［2］値の形

日本語にひらがなとカタカナがあるように、値にも様々な種類がある。

その中で代表的なのか「数値」と「文字列」である。

### 数値

数値とは「1」や「3.5」のような整数や少数のことを意味する。足し算・引き算、掛け算などの計算をするときなどに使える。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      number1 = 3 #「数値」の3
      number2 = 5 #「数値」の5
      sum = number1 + number2
      print(sum)

      8　「数値」の3と「数値」の５の足し算になるのでそのまま計算し、「数値」の8という結果になる。

### 文字列

文字列とは複数の文字が組み合わさったもの。"（ダブルクオーテーション）で囲んで表現する。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      number1 = "3" #「文字列」の3
      number2 = "5" #「文字列」の5
      sum = number1 + number2 #「文字列」の5と「文字列」の３の足し算
      print(sum)

      35　「文字列」の３と「文字列」の５の足し算になるのでそのまま連結し、「文字列」35という結果になる。

どちらも３と５の足し算であるが、結果がこんなにも違ってくる。値の形を間違えてプログラムにエラーが起こることが多いので、十分注意する。

- 値には「数値」と「文字列」の２種類の形がある。
- 同じ文字でも「数値」と「文字列」では全く違う。
- 「数値」と「文字列」を間違うことで起こるエラーに注意する。

# (3)入出力処理

## ［1］gets

getsとはキーボードからの入力を読み込むもの。人間が打ち込む値で、必ず文字列となる。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      print("入力をおねがいします。\n")
      number1 = gets #キーボードに打ち込んだ値をnumber1に代入
      number2 = "さようなら"
      print("表示します。\n")
      print(number1)
      print(number2)

      入力をおねがいします。
      こんにちは[Enter] 入力待ちになるので「こんにちは」とキーボードで入力しEnterキーを押す
      表示します。
      こんにちは
      さようなら

「入力をおねがいします。」と表示された後にユーザーの入力待ちになる。ここで「こんにちは」と入力し、その文字列がnumber1という変数に代入され、そのままプログラムは進行し、結果が表示される。getsを使うとプログラムを動かした後で自由に変数の中身を変更出来る。

### .chomp

getsには打ち込んだ値の後ろに必ず「改行文字」が入力されている。改行文字とは改行の指示を出す文字のことである。「\n」と書く。

getsに.chompをつけて改行文字を切り取ることが出来る。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      print("入力をおねがいします。\n")
      number1 = gets.chomp #キーボードに打ち込んだ値をnumber1に代入
      number2 = "さようなら"
      print("表示します。\n")
      print(number1)
      print(number2)

      入力をおねがいします。
      こんにちは[Enter] 入力待ちになるので「こんにちは」とキーボードで入力しEnterキーを押す
      表示します。
      こんにちはさようなら 改行行文字を切り取ったので改行されずに並んで表示される

改行文字を切り取ったため、「こんにちは」の後ろで改行されずに次の結果が表示されている。

### .to_i

getsで打ち込んだ値は必ず文字列であるが、「.to_i」を後ろにつけることで整数に変換出来る。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      print("入力をおねがいします。\n")
      number1 = gets.chomp.to_i #キーボードに打ち込んだ値をnumber1に代入
      number2 = gets.chomp.to_i #キーボードに打ち込んだ値をnumber2に代入
      print("表示します。\n")
      print(number1 + number2)

      入力をおねがいします。
      3[Enter] 入力待ちになるので「3」とキーボードで入力しEnterキーを押す
      4[Enter] 入力待ちになるので「4」とキーボードで入力しEnterキーを押す
      表示します。
      7 整数に変換されているので計算が出来る。

文字列のままでは計算が出来ないが、整数に変換されているので「3 + 4」の計算が可能となり、結果は７が表示される。

### .to_f

こちらはto_iと違い、少数に変換することの出来るもの。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      print("入力をおねがいします。\n")
      number1 = gets.chomp.to_f #キーボードに打ち込んだ値をnumber1に代入
      number2 = gets.chomp.to_f #キーボードに打ち込んだ値をnumber2に代入
      print("表示します。\n")
      print(number1 + number2)

      入力をおねがいします。
      3.5[Enter] 入力待ちになるので「3.5」とキーボードで入力しEnterキーを押す
      4.2[Enter] 入力待ちになるので「4.2」とキーボードで入力しEnterキーを押す
      表示します。
      7.7 少数に変換されているので計算が出来る。

少数も扱えるようになり、「3.5 + 4.2」の計算が可能となり、結果は7.7が表示される。

- getsとはキーボードからの入力を読み込むもの。人間が打ち込む値で、必ず文字列となる。
- getsに.chompをつけて改行文字を切り取ることが出来る。
- .to_iを後ろにつけることで整数に変換出来る。
- .to_fを後ろにつけることで少数に変換出来る。

## ［2］printf

指定した値と組み合わせて文章を出力することの出来るもの。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      name = "さとうたろう"
      number1 = 15
      number2 = 1.7

      printf("私の名前は%sです。\n",name) #組み合わせたい値が文字列のときは%sを使う
      printf("年齢は%d歳です。\n",number1) #組み合わせたい値が整数のときは%dを使う
      printf("身長は%fメートルです。\n",number2) #組み合わせたい値が少数のときは%fを使う

      私の名前はさとうたろうです。
      年齢は１５歳です。
      身長は1.700000メートルです。

変数の中身を使って文章を作成することが出来る。これを使えば名前をユーザーに入力させてそれを表示するプログラムも作ることが出来る。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      name = gets.chomp

      printf("私の名前は%sです。\n",name) #組み合わせたい値が文字列のときは%sを使う

      さとうたろう[Enter]入力待ちになるので「さとうたろう」とキーボードで入力しEnterキーを押す
      私の名前はさとうたろうです。

- printfを使うと、指定した値と組み合わせて文章を出力することが出来る。

# (4)制御構造

## ［1］if

ifはプログラムに分かれ道を作ることが出来る。「もしも○○であるならば、△△の処理を行う」というような動きをつけられる。

if文を書き始める場合には、最初に「if」「end」を記述する。

      if
        この中に特定の動きをするプログラムを書く
      end

その後はどんな条件の時に「if」「end」の間に記述した動きをするか決める。今回はnumberが「数値の１」の時という条件をつける。

      if number == 1
        この中に特定の動きをするプログラムを書く
      end

最後にどんな動きをするのかを記述する。

      if number == 1
        print("ありがとう")
      end

今回は「ありがとう」と出力する動きを記述した。これで、「もしもnumberが数値の１であるならば、「ありがとう」と出力する処理を行う」という動きを作成することが出来た。

ここからもう１手順加える。

      if number == 1
        print("ありがとう")
      else
        この中に特定の動きをするプログラムを書く
      end

elseは、指定した条件が合わない時の処理を作成することが出来る。今回の場合は、「もしもnumberが数値の１以外であるならば、△△の処理を行う」という条件を作ることが出来る。

      if number == 1
        print("ありがとう")
      else
        print("ごめんなさい")
      end

これで、「もしもnumberが数値の１であるならば、「ありがとう」と出力する処理を行う」、「もしもnumberが数値の１以外であるならば、「ごめんなさい」と出力する処理を行う」という動きを作成することが出来た。

では、動かしてみる。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      print("数字を入力してください。\n")
      number = gets.chomp.to_i

      if number == 1
        print("ありがとう")
      else
        print("ごめんなさい")
      end

      数値を入力してください。
      1[Enter]
      ありがとう

      数値を入力してください。
      6739[Enter]
      ごめんなさい

これで１を入力するとありがとう、１以外を入力するとごめんなさいを出力するプログラムを作成することが出来た。

最後にここで、もう１つ動きを加えてみる。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      print("数字を入力してください。\n")
      number = gets.chomp.to_i

      if number == 1
        print("ありがとう")
      elsif number == 2 #追加した部分
        print("どういたしまして") #追加した部分
      else
        print("ごめんなさい")
      end

      数値を入力してください。
      1[Enter]
      ありがとう

      数値を入力してください。
      2[Enter]
      どういたしまして

      数値を入力してください。
      846[Enter]
      ごめんなさい

elsifは、「もしも○○であるならば、△△の処理を行う」という処理を追加することが出来る。

これでこのプログラムは、「もしもnumberが数値の１であるならば、「ありがとう」と出力する処理を行う」、「もしもnumberが数値の２であるならば、「どういたしまして」と出力する処理を行う」、「もしもnumberが数値の１と２以外であるならば、「ごめんなさい」と出力する処理を行う」という動きをするようになった。

- if文は「もしも○○であるならば、△△の処理を行う」というように、プログラムに分かれ道を作ることが出来る。
- if文を書き始める場合には、最初に「if」「end」を記述する。
- elseは、指定した条件が合わない時の処理を作成することが出来る。
- elsifは、「もしも○○であるならば、△△の処理を行う」という処理を追加することが出来る。

## ［2］while

whileは「条件〇〇が正しいとき、△△を繰り返す処理を行う」という繰り返しの処理を行うときに使う。何度も繰り返すことをループという

while文を書き始める場合には、最初に「while」「end」を記述する。

      while
        この中に特定の動きをするプログラムを書く
      end

その後はどんな条件の時に「while」「end」の間に記述した動きをループさせるか決める。今回はnumberが「数値の5」以下の時はループさせ続けるという条件をつける。

      while number < 5
        この中に特定の動きをするプログラムを書く
      end

最後にどんな動きをするのかを記述する。

      while number < 5
        print("ありがとう\n")
        number -= 1
      end

これで「number < 5 が正しいとき、ありがとうを出力し、numberの値を１増やす動きを繰り返す処理を行う」というプログラムが作成出来た。

では、動かしてみる。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      number = 0

      while number < 5
        print("ありがとう\n")
        number += 1
      end

      ありがとう
      ありがとう
      ありがとう
      ありがとう
      ありがとう
      この回の繰り返しでnumbreは5になり、次の繰り返しの時に条件を満たしていないので
    繰り返しは終了する。

１回の繰り返しごとにnumberに１づつ代入され、numberが５になったので６回目の繰り返しが条件を満たせず終了した。

### break

繰り返しの実行を中止し、繰り返しから抜けることが出来る。

今回はif文と組み合わせて作成する。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      number = 0
      sum = 0
      print("テストの合計点を計算しましょう。\n")

      while true #繰り返しの条件を「true」とすることで永遠にループさせることが出来る。
        print("テストの点数を入力してください\n")
        test = gets.chomp.to_i
        if test == 0 #もしもtestが0であるならば
          break #繰り返しの実行を中止し、繰り返しから抜ける
        end #if文のend
        printf("%d点\n",test)
        sum += test
        number += 1
      end #while文のend
      printf("あなたの%d回分のテストの合計得点は%d点です。\n", number, sum)

      テストの合計点を計算しましょう。
      テストの点数を入力してください。
      80[Enter]
      80点
      テストの点数を入力してください。
      75[Enter]
      75点
      テストの点数を入力してください。
      70[Enter]
      70点
      テストの点数を入力してください。
      0[Enter]
      あなたの３回分のテストの合計点は225点です。

このプログラムは、キーボードで点数を打ち込み、テストの合計点数を計算するプログラムである。

繰り返しの条件を「true」とすることで、whileの中を永遠に繰り返し続ける処理を書くことが出来る。このような場合にbreakは役に立つ。10・11・12行目のif文に注目してもらいたい。

      if test == 0
        break
      end

このif文で「もしもtestが0であるならば、繰り返しの実行を中止し、繰り返しから抜ける処理を行う」という動きを作成している。

こうすることで、ユーザーの好きなタイミングで繰り返しを抜けさせることも出来るようになる。

制御構造を１度に２つも使用しているため、endも２つ出てきている。混乱しないように、「if」と「while」を書くときは、最初に「end」とセットで書くように心がける。

### redo

その繰り返しを無効化し、その繰り返しの先頭からやりなおす事が出来る。

先程のテストの点数の合計を出すプログラムに、点数を打ち間違えた時にやり直せる機能をredoを使って作成する。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      number = 0
      sum = 0
      print("テストの合計点を計算しましょう。\n")

      while true
        print("テストの点数を入力してください。\n")
        test = gets.chomp.to_i
        if test == 0
          break
        end #breakのif文用のend
        printf("%d点\n",test)
        print("間違いありませんか？ 訂正したければno,問題なければno以外を入力してください。\n")

        #確認用のテキストを追加
        choose = gets.chomp #chooseにキーボードで入力したものを代入
        if choose == "no" #もしもchooseがnoであるならば
          print("今の入力をなかったことにします。\n")
          redo #この繰り返しを無効化し、この繰り返しの先頭からやりなおす
        else #もしもchooseがno以外であるならば
        sum += test
        number += 1
        end #redoのif文用のend
      end #while文用のend
      printf("あなたの%d回分のテストの合計得点は%d点です。\n", number, sum)

      テストの合計点を計算しましょう。
      テストの点数を入力してください。
      80[Enter]
      80点
      間違いありませんか？ 訂正したければno,問題なければno以外を入力してください。
      yes[Enter]
      テストの点数を入力してください。
      75[Enter]
      75点
      間違いありませんか？ 訂正したければno,問題なければno以外を入力してください。
      no[Enter]
      今の入力をなかったことにします。
      テストの点数を入力してください。
      70[Enter]
      70点
      間違いありませんか？ 訂正したければno,問題なければno以外を入力してください。
      はい[Enter]
      テストの点数を入力してください。
      0[Enter]
      あなたの2回分のテストの合計点は150点です。

大きな追加部分は17行目〜23行目の部分

      if choose == "no"
        print("今の入力をなかったことにします。\n")
        redo
      else
      sum += test
      number += 1
      end

このif文で「もしもchooseがnoであるならば、この繰り返しを無効化し、この繰り返しの先頭からやりなおす」,「もしもchooseがno以外であるならば、sumに入力したテストの点数を加算し、numberを１増やす」という動きを作成している。

- while文は「条件〇〇が正しいとき、△△を繰り返す処理を行う」というように、プログラムに繰り返し処理する部分を作成すること出来る。
- while文を書き始める場合には、最初に「while」「end」を記述する。
- 制御構造を１度に２つ以上使用する場合、endも２つ以上書かなければならず、どの制御構造とセットのendか解らなくなる危険性がかる。混乱しないように、「if」と「while」を書くときは、最初に「end」とセットで書くように心がける。
- breakは繰り返しの実行を中止し、繰り返しから抜けることが出来る。
- redoはその繰り返しを無効化し、その繰り返しの先頭からやりなおす事が出来る。

# (5)配列

## [1]配列とは

配列とは、データをたくさん詰めることの出来る引き出しのようなもので、複数の値をひとまとめにすることが出来る。

      yasai = "きゅうり" #yasaiという名前の「変数」

      kudamono = ["りんご", "みかん", "バナナ"]
      #kudamonoという名前の「配列」

kudamono =["りんご", "みかん", "バナナ"]のように

配列は[ ]のなかにいくつもの値を格納して表現される。配列に格納されている１つ１つの値のことを要素と呼ぶ。

配列の要素を１つ取り出したい場合は、配列の名前[ x ]で取り出すことが出来る。配列の先頭は０から始まることに注意。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      kudamono = ["りんご", "みかん", "バナナ"]
      #kudamonoという名前の「配列」

      printf("%s\n", kudamono[0])
      printf("%s\n", kudamono[1])
      printf("%s\n", kudamono[2])

      りんご
      みかん
      バナナ

[ ]の中の数字のことを添字という。

- 配列とは、データをたくさん詰めることの出来る引き出しのようなもので、複数の値をひとまとめにすることが出来る。
- 配列に格納されている１つ１つの値のことを要素と呼ぶ。
- 配列の要素を１つ取り出したい場合は、配列の名前[ x ]で取り出すことが出来る。配列の先頭は０から始まることに注意。
- 配列の名前[ x ]の中のxの数字のことを添字という。

## [2]配列への値の格納方法

配列とはkudamono = ["りんご", "みかん", "バナナ"]のようにkudamonoと名前のつけた配列に値を格納することが出来る。しかし、値の格納方法はこれ１つではない。

      kudamono = []
      #配列の中身を空にして、何も格納されていない空の配列を用意する

      kudamono[0] = "りんご"
      #空の配列の先頭に値を格納
      kudamono[1] = "みかん"

      #空の配列の２番めに値を格納
      kudamono[2] = "バナナ"
      #空の配列の３番目に値を格納

この方法でもkudamono = ["りんご", "みかん", "バナナ"]の配列は作ることが出来る。しかし、この添字で直接格納するのではなく

      kudamono = []  #配列の中身を空にして、何も格納されていない空の配列を用意する

      kudamono << "りんご"
      #空の配列の末尾にりんごを追加
      kudamono << "みかん"
      #りんごが先頭に格納されている配列の末尾にみかんを追加
      kudamono << "バナナ"
      #りんごが先頭、2番めにみかんが格納されている配列の末尾にバナナを追加

というように「<<」を使って末尾に追加していくほうが便利に格納出来る。

- 事前に値を格納する方法以外にも配列に値を格納する方法はある。
- 空の配列の用意の仕方は、変数　=　[ ]
- 空の配列に添字で直接値を格納出来る。
- 「<<」を使うと、配列の末尾に値を追加で格納出来る。

## [3]forの使い方

forは配列の中にある複数の値を、順に変数へ代入する処理を行う時に使う。

whileと似ていて、forは配列の中身を順に取り出していき、取り出せる中身がなくなったら繰り返しを終了する。

      #!/usr/bin/env ruby
      #-*- coding: utf-8 -*-

      kudamono = ["りんご", "みかん", "バナナ"]

      for i in kudamono #kudamonoの先頭から順に取り出しiに代入する。
        printf("%sを食べました。\n", i)
      end

      りんごを食べました。　iにはりんごが代入されていた。
      みかんを食べました。　iにはみかんが代入されていた。
      バナナを食べました。　iにはバナナが代入されていた。

配列内の要素を先頭から順番に取り出し変数に代入しながら繰り返し処理を行う。全ての値を取り出したら繰り返し終了となる

      for 変数 in 配列
        繰り返したい処理
      end

これがforの基本構造となる。

- forは配列の中にある複数の値を、順に変数へ代入する処理を行う時に使う。
- whileと似ていて、forは配列の中身を順に取り出していき、取り出せる中身がなくなったら繰り返しを終了する。

## [4]配列の操作

### length

配列の長さ（要素の数）を返すことが出来る。

      #!/usr/bin/env ruby
      # -*- coding: utf-8 -*-

      kudamono =["りんご", "みかん", "バナナ"] #要素の数は３つ
      kazu = kudamono.length #kudamono.lenghtは3であるから、kuzuには3が代入される
      printf("%dです。\n", kazu)

      3です。

### push

配列の末尾に要素を追加する。 「<<」と同じ動きをする。

      #!/usr/bin/env ruby
      # -*- coding: utf-8 -*-

      kudamono = ["りんご", "みかん", "バナナ"]
      printf("%sです。\n", kudamono.push("もも"))

      ["りんご", "みかん", "バナナ", "もも"]です。

### shift

配列の先頭の要素を取り除き、その値を返す。

      #!/usr/bin/env ruby
      # -*- coding: utf-8 -*-

      kudamono =["りんご", "みかん", "バナナ"]
      sara = kudamono.shift #配列の先頭の要素を取り除きsaraに代入する
      printf("%sです。\n", sara)
      printf("%sです。\n", kudamono)

      りんごです。
      ["みかん", "バナナ"]です。

### sort

配列の要素を小さい順に並べ替える。文字列を要素に含む場合は、辞書順に並べ替える。

      #!/usr/bin/env ruby
      # -*- coding: utf-8 -*-

      kazu = [3, 1, 5, 4, 2]
      kudamono =["りんご", "みかん", "バナナ"]
      printf("%sです。\n", kazu.sort)
      printf("%sです。\n", kudamono.sort)

      [1, 2, 3, 4, 5]です。
      ["みかん", "りんご", "バナナ"]です。

### reverse

配列の要素の順序を逆にする。

      #!/usr/bin/env ruby
      # -*- coding: utf-8 -*-

      kazu = [3, 1, 5, 4, 2]
      kudamono =["りんご", "みかん", "バナナ"]
      printf("%sです。\n", kazu.reverse)
      printf("%sです。\n", kudamono.reverse)

      [2, 4, 5, 1, 3]です。
      ["バナナ", "みかん", "りんご"]です。

- lengthは配列の長さ（要素の数）を返すことが出来る。
- pushは配列の末尾に要素を追加する。 「<<」と同じ動きをする。
- shiftは配列の先頭の要素を取り除き、その値を返す。
- sortは配列の要素を小さい順に並べ替える。文字列を要素に含む場合は、辞書順に並べ替える。
- reverseは配列の要素の順序を逆にする。

## [5]破壊的メソッド

### 破壊的メソッド「!」

reverseやsortを使っても、元の配列の並びは変わらない。

      #!/usr/bin/env ruby
      # -*- coding: utf-8 -*-

      kudamono =["りんご", "みかん", "バナナ"]
      printf("%sです。\n", kudamono.reverse)
      printf("%sです。\n", kudamono)

      ["バナナ", "みかん", "りんご"]です。
      ["りんご", "みかん", "バナナ"]です。

しかし、「!」をつけ「sort!」「reverse!」のようにすると直接操作出来る。この操作のことを破壊的操作といい。「sort!」「reverse!」のことを破壊的メソッドと呼ぶ。

      #!/usr/bin/env ruby
      # -*- coding: utf-8 -*-

      kudamono =["りんご", "みかん", "バナナ"]
      printf("%sです。\n", kudamono.reverse!)
      printf("%sです。\n", kudamono)

      ["バナナ", "みかん", "りんご"]です。
      ["バナナ", "みかん", "りんご"]です。

- reverseやsortを使っても、元の配列の並びは変わらない。
- 「!」をつけ「sort!」「reverse!」のようにすると、元の配列の並びも変えることが出来る。
- この直接操作のことを破壊的操作と呼ぶ。
- 「sort!」「reverse!」のことを破壊的メソッドと呼ぶ。

# (6)メソッド

## [1]メソッドについて

決められた計算や処理に名前をつけて、いつでも何度でも呼び出すことが出来る。

この決められた計算や処理のことをメソッドという。メソッドは自分で変数を作るのと同じように自由に名前と処理を考え、作ることが出来る。

今まで出できた「printf」、「gets」、「to_i」もメソッドの仲間。「getsメソッド」なんて呼んだりする。

メソッドは「getsメソッド」や「printfメソッド」などの最初からRubyに用意されているものもあるが、自分で自由に用意することも出来る。

自分でメソッドを用意する時に使うものが「def」。

- メソッドとは決められた計算や処理に名前をつけて、いつでも何度でも呼び出せるようにしたもの。
- 今まで出できた「printf」、「gets」、「to_i」もメソッドの仲間。「getsメソッド」なんて呼んだりする。
- メソッドは「getsメソッド」や「printfメソッド」などの最初からRubyに用意されているものもあるが、自分で自由に用意することも出来る。
- 自分でメソッドを用意する時に使うものが「def」。

## [2]def

メソッドはdefを使って定義することが出来る。

defを書き始める場合は、最初に「def」「end」を記述する。

      def
        この中に特定の動きをするプログラムを書く
      end

次は今から作るメソッドに名前をつける。

      def hello
        この中に特定の動きをするプログラムを書く
      end

これで今から作るメソッドの名前は「helloメソッド」に決まった。

ここから「helloメソッド」に自分で自由に動きをつけることが出来る。

では今回は「helloメソッド」に、Helloとこんにちはを出力する動きをつけることにする。

      def hello
        print("Hello\n")
        print("こんにちは\n")
      end

これで、Helloとこんにちはを出力する「helloメソッド」を作成することが出来た。

この作成したメソッドを呼び出すのは簡単。いままで「getsメソッド」や「printfメソッド」を呼び出していたやり方と同じ。

      name = gets #「getsメソッド」を使いたいときにはgetsと書いていた。

ここまでで、知らず知らずのうちに「メソッドの呼び出し方」はマスターしている。

では、「helloメソッド」を呼び出してみる。

      #!/usr/bin/env ruby
      # -*- coding: utf-8 -*-

      def hello
        print("Hello\n")
        print("こんにちは\n")
      end

      hello #「helloメソッド」を呼び出す。

      Hello
      こんにちは

事前に「helloメソッド」を作成していたので、helloと書くだけで「helloメソッド」を呼び出すことが出来ている。

これで自分で新たにメソッドを作成することが出来た。

ここにもう一手間加えていく。

      #!/usr/bin/env ruby
      # -*- coding: utf-8 -*-

      def hello(x) #「helloメソッド」に「引数」を指定する。
        print("Hello\n")
        print("こんにちは\n")
        printf("私の名前は%sです。\n",x)
         #「helloメソッド」の「引数」を使って、printfを使用する。
      end

      hello("さとうたろう") #「helloメソッド」(引数)を呼び出す。

      Hello
      こんにちは
      私の名前はさとうたろうです。

まず注目してほしいのは４行目の「hello(x)」。これは「helloメソッド」に「引数」をつけたもの。

引数とは、プログラムの処理をする時に、別の場所から値を持ってこれるようにするために使うもの。

今回は「helloメソッド」の処理をする時に、別の場所から値を持ってくるために「引数」を指定した。

「hello(x)」とは、「helloメソッド」の「引数」にxを指定するという意味である。

      def hello(x) #「helloメソッド」に「引数」を指定する。

次に注目するべき部分は７行目の「printf("私の名前は%sです。\n",x)」。「printf」は指定した値と組み合わせて文章を出力することの出来るもの。今回は「helloメソッド」の引数ｘを活用することにしている。

      def hello(x) #「helloメソッド」に「引数」を指定する。

      printf("私の名前は%sです。\n",x)
      #「helloメソッド」の「引数」を使って、printfを使用する。

最後に見るべきは10行目の「hello("さとうたろう")」。今回の「helloメソッド」には「引数」xを指定している。つまり、「helloメソッド」は引数ｘに何かしらの値が代入されていなければ動かないということ。

そのため、引数のxに値を代入する必要がある。

値を代入するタイミングは「helloメソッド」を呼び出した時。

そのため「helloメソッド」の呼び出し方は、「hello("さとうたろう")」というように引数に値を代入しながら呼び出す。

      def hello(x) #「helloメソッド」に「引数」を指定してる。
      end

      hello("さとうたろう") #「引数」のxに値を代入しながら呼び出す。

引数を指定したメソッドは、引数に何かしらの値が代入されていなければ動かないということに注意する。

- メソッドはdefを使って定義することが出来る。
- defを書き始める場合は、最初に「def」「end」を記述する。
- defで作成したメソッドは、メソッドの名前を書くだけで呼び出すことが出来る。
- 引数とは、プログラムの処理をする時に、別の場所から値を持ってこれるようにするために使うもの。
- 引数を指定したメソッドを呼び出すときには、引数に値を代入しながら呼び出す。

## [3]返却値について

複数の文がメソッド定義されている場合、最後に実行した文の値がメソッドの実行結果として返される。

これを返却値という。

返却値で返せる実行結果は１つだけ。

      #!/usr/bin/env ruby
      # -*- coding: utf-8 -*-

      def sum(x) #「sumメソッド」に「引数」を指定する。
        a = x * 2 #引数を２倍に
        b = a + 2 #aに2を足す
        c = b + 5 #bに5を足す
      end

      y = 2
      printf("%d\n",sum(y)) #「sumメソッド」(引数)を呼び出す。

      11

この場合のメソッドの返却値は、最後に実行された「c = b + 5」の値。このプログラムの場合は11が返却値である。

### return

returnを使うと、「メソッドの処理を中止し、指定した返却値を返す」ことが出来る。

先程のプログラムにreturnを使用してみる。

      def sum(x)
        a = x * 2
        return a #メソッドの処理を中止し、指定した返却値を返す。
        b = a + 2
        c = b + 5
      end

      y = 2
      printf("%d\n",sum(y))

      4

「return a 」と記述することで、メソッドの処理を中止し、aを返却値として返しているので、実行結果は4となる。

- 複数の文がメソッド定義されている場合、最後に実行した文の値がメソッドの実行結果として返される。これを返却値という。
- 返却値で返せる実行結果は１つだけ。
- returnを使うと、「メソッドの処理を中止し、指定した返却値を返す」ことが出来る。

# (7)プログラムをもっと楽しくしてみよう！

## [1]乱数

数字の中からラングムに発生させる数を乱数といい、randを使って取り出 します。数値だけでなく、自分の作った配列から取り出すこともできます。 お祭りの屋台にある、おみくじ屋さんからくじを1枚とるイメージです。

### 数値の場合

変数名= rand(自然数)のようにして取り出すことができ、0から指定した 自然数未満の乱数が発生します。また、srand()によって、発生する乱数の種を初期化する必要があります。

- 自然数⋯個数や順番を表すような普段使っている数。プラスの整数。
- 種⋯乱数が発生するときの、最初に設定される値。
- 初期化⋯実行する度に、違う乱数を発生させるために行う処理。

saikoro.rb

            #!/usr/bin/env ruby
            # -*- coding: utf-8 -*-

            srand()#乱数の種を初期化
            saikoro = rand(6) + 1#1を足すことで7未満の整数を発生
            printf("振ったサイコロの目は%dでした。\n",saikoro)#saikoroが1から6までの内ランダムで出力

### 文字列の場合

取り出したい要素を含む配列と、乱数を発生させる変数を作り、配列名[変数名]のようにして出力します。ここで、rand()内の数字には、配列に並んでいる要素の数を入れます。

            #!/usr/bin/env ruby
            # -*- coding: utf-8 -*-

            coin=[”表”,”裏”]#2個なのでcoin.lengthは2
            srand()#乱数の種を初期化
            hyori = rand(coin. length)#よって0か1のどちらかになる
            printf("投げたコインは%sでした。\n",coin[hyori]) #coin[hyori]が表か裏のいずれかで出力

発展

Rubyの場合、配列の中からランダムに取り出す処理は、coin.sampleと書けます。

## [2]一時停止

プログラムは実行したらすぐに表示されます。逆にプログラムを一時停止することもできます。プログラムに動きをつけたいときに使ってみましょう。
一時停止させたいときはsleepを使い、sleep(秒数)のようにします。

rocket.rb

                #!/usr/bin/env ruby
                # -*- coding: utf-8 -*-

                puts"ロケット打ち上げまで..."
                sleep(1)#1秒間停止（以下同様)
                puts "3"
                sleep(1)
                puts "2"
                sleep(1)
                puts "1"
                sleep(1)
                puts ”発射!!”

## [3]時刻

Time.nowを使うと、現在の時刻を受け取ることができます。秒数を数えるときは、.to_iメソッドを利用しましょう。

stopwatch.rb

                #!/usr/bin/env ruby
                # -*- coding: utf-8 -*-

                puts"ストップウォッチスタート!(Enterを押すと止まるよ)"
                kaishi = Time.now.to_i#現在の時刻を代入
                teishi = gets.chomp#入力完了まで時間経過
                syuryo = Time.now.to_i#Enter を押した時刻を代入
                jikan = syuryo - kaishi#要した秒数を代入
                printf("タイムは%d秒です。\n",jikan)#要した秒数が出力

## [4]画像表示

spawn "display -geometry +x+y ファイル名"で画像を表示でき、xには画面左から、yには画面上からのドットの位置を指定します。 ずっと画面に残ってしまうため、出していた画像を消すにはProcess.killを使います。

gazo.rb

              #!/usr/bin/env ruby
              # -*- coding: utf-8 -*-

              pid = spawn "display -geometry +10+20 image.jpg"#image.jpgの場合
              #しばらく別の処理をする（sleepなど）
              Process.kill(:INT, pid)#:INTは信号の一種