3 プログラムの発展:文字列の操作

大筋

例題 (再掲)

  1. 読みこんだもの(gets) を
  2. (以下のa~eのようにさまざまな)加工をして
  3. 印字(puts など) する
  4. というのを 繰り返し行うプログラム を考える

hello を入力した場合の出力例を示す

a 左右ひっくり返す olleh
b 一文字一文字区切る h e l l o
c 3回繰り返す hello hello hello
d 大文字にする HELLO
e 各文字を3つずつ重ね hhheeellllllooo

簡単な問いから解いてみる

String

Case の意味についてはたとえばここに解説あり

補足1(行末文字の扱い)

もう一歩

split

b について:

c について考えてみる

以下では課題cについて様々な方法を考察する。

    課題c:読んだ文字列を 3回リピート  
      *ex.*     hello   → hello hello hello  
数字のクラス階層
方法1(縦に並ぶバージョン)

プログラム例:

while gets do
    3.times { puts $_}
end
方法2(横方向に3回繰り返すことを考える)
  1. puts 以外の 出力メソッドを探す
    たとえば print を使う

  2. 読みこんだ文字列 $_ の末尾に付加されている、
    改行文字 “” を 切り落としておく
    => chop メソッドを使う(Stringクラスのメソッド)

    3.times {print $_.chop}
  3. 最後に改行させる
    puts (だけ) または print “”

方法3?

間にスペースをいれて3回リピート する:

例(中身だけ)

3.times { print $_.chop+'  '} ; puts
方法3’

最後の(改行の直前の)スペースは不要 だと考えると、

while gets do
    3.times { |i|
        if i < 2 then
            print $_.chop+" "
        else
            print $_.chop
        end
    }
    puts
end     # と、ずいぶん長くなってしまう
方法4 配列を使う rubyらしい書き方
while gets do  
    puts Array.new(3,$_.chop).join(' ')  
        # ([$_.chop]*3).join(' ') や  
        # [$_.chop]*3*' ' でもいい
end

ここでチェックすべき文法要素: *