28226


１から５の数字を表示する処理を３回繰り返そうとして

[code]

    #! ruby -Ks
    #! ruby -Ks
    # coding: windows-31j
    # helloruby G05.rb
    STDOUT.sync = true 
    
    a=1
    b=0
    loop do
    print a,"\n"
    a=a+1
    if a == 5
    b=b+1
    redo
    end
    if b == 3
    break
    end
    
[/code]

としようとすると例によって  
ggruby.rb:19:syntax error,unexpected end-of-input,expecting keyword_end  
と言われます  
どこにendが足りないのか探しても分かりません  
どなたか分かる方教えて下さい。


CC BY-SA 3.0
2016-08-12T14:15:42.947
28224
2016-08-12T15:08:19.777
18452
question
ruby
ループ処理を指定回数ループさせる


`loop do`に対する`end`が足りません。  
インデントを付けると分かりやすいです。

[code]

    loop do
        print a,"\n"
        a=a+1
        if a == 5
            b=b+1
            redo
        end
        if b == 3
            break
        end
    end
    
[/code]

* * *

ちなみに  
`redo`は必要無い(`if b == 3` が実行されない。)です。

[code]

    a=a+1
    if a == 5
    
[/code]

（加算した後に１つのループの終わりのチェックとする）だと`5`が表示されないです。  
それで`a=a+1`の位置を変える必要があります。（またはチェックを`a > 5` に変更する、など）  
また、１セットの表示終わりに`a`をリセットする必要があります。  
なので  
アプローチをなるべく変えないで期待する動作のためにはループ部分を以下のようにします。  
一例：

[code]

    loop do
        print a,"\n"
        if a == 5
            b=b+1
            a = 0
        end
        a=a+1
        if b == 3
            break
        end
    end
    
[/code]

* * *

単純にｎ回繰り返すという場合には`times`を使った方が分かりやすいと思います。  
１～５というような繰り返しも`Range`を使った方が分かりやすいです。  
例：

[code]

    3.times do
        for v in 1..5
            print v, "\n";
        end
    end
    
[/code]


CC BY-SA 3.0
2016-08-12T14:38:59.140
28226
2016-08-12T15:08:19.777
2016-08-12T15:08:19.777
5044
5044
28224
answer