ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

自己代入でカウンターをつくる

今回はカウンターと剰余を使って配列を組み直してみる。

目次


カウンターで繰り返しの回数を数える

eachメソッドは配列から要素を取りだす動作を要素がなくなるまで繰り返す。
eachメソッドが繰り返した回数を数えることができるとなにかと便利になる。
自己代入という方法を使ってカウンターをつくってみる。
コードを書く。

test.rb

crews = [
    "A-1crew",
    "A-2crew",
    "A-3crew",
    "A-4crew",
    "A-5crew",
    "A-6crew",
    "B-1crew",
    "B-2crew",
    "B-3crew",
    "B-4crew",
    "B-5crew",
    "B-6crew"
]
count = 0
crews.each do |crew|
    count += 1
    puts "#{count}番目のクルー: #{crew}"
end
puts "合計#{count}クルー"
1番目のクルー: A-1crew
2番目のクルー: A-2crew
3番目のクルー: A-3crew
4番目のクルー: A-4crew
5番目のクルー: A-5crew
6番目のクルー: A-6crew
7番目のクルー: B-1crew
8番目のクルー: B-2crew
9番目のクルー: B-3crew
10番目のクルー: B-4crew
11番目のクルー: B-5crew
12番目のクルー: B-6crew
合計12クルー


コードの説明。

  • 12個の要素が入った配列をつくる
  • 数値の0を変数countに代入する(初期化する)
  • eachメソッドで繰り返しを開始する
  • +=メソッドで変数countに自己代入する
    • 自身を変更して自身に代入し直すことを自己代入という
    • count += 1count = count + 1と同じ意味
      • 今回の例では繰り返される度countに1が足される
  • putsメソッドで変数を出力する
    • countの最終回数が出力される


変数countがeachメソッドの繰り返す回数を数えた。

剰余をもとめる演算子 %

割り算の余りを返すメソッドに%がある。
試してみる。

コメントに実行結果を書いておく。

p 12 % 6 #=> 0
p 13 % 6 #=> 1
p 14 % 6 #=> 2


コードの説明。
最初の式は12を6で割った余りを返す。割り切れるので0が返っている。
2番目の式は13を6で割った余りの1が返っている。
3番目の式は14を6で割った余りの2が返っている。

配列の要素を指定の数ずつ配列に格納し直す

カウンターと剰余を使って配列の要素を3つずつにわけるテストをする。

test.rb

numbers = [1,2,3,4,5,6,7,8,9,10,11,12]
unit_numbers = []
new_numbers = []
count = 0
numbers.each do |number|
    count += 1
    if count % 3 == 1
        unit_numbers = []
    end
    unit_numbers << number
    if count % 3 == 0
        new_numbers << unit_numbers
    end
end
p new_numbers


実行結果
見やすいように改行を入れました。

[
    [1, 2, 3], 
    [4, 5, 6], 
    [7, 8, 9], 
    [10, 11, 12]
]


コードの説明。

  • 12個の要素が入った配列numbersをつくる
  • 空の配列unit_numbersをつくる(初期化する)
  • 空の配列new_numbersをつくる(初期化する)
  • 変数countに0を代入する(初期化する)
  • eachメソッドで繰り返しを開始する
  • 繰り返すごとcountに1を自己代入する(カウンターを回す)
  • if文で条件判断
    • countを3で割った剰余が1のとき(1,4,7,10.....)
    • 配列unit_numbersを空にする
  • <<メソッドでunit_numbersに要素を追加する
  • if文で条件判断
    • countが3で割り切れたら
    • unit_numbersをnew_numbersに格納する
  • 繰り返しが終わったらpメソッドでnew_numbersを出力する


3で割って剰余が1の度に配列が空になる、ということは3つの要素が取り出された次のタイミングでunit_numbersがリセットされる、ということ。

3で割り切れるとき、つまりunit_numbersにオブジェクトが3つ入ったとき、unit_numbersはnew_numbersに格納されていく。

配列の要素を3つずつに分けることに成功した。

今回の動作確認環境

Ruby 2.4.3p205
macOS 10.13.4
ターミナル 2.8.2
Windows10 1709
Windows PowerShell 5.1.16299.251