1

Rubyを学んでいます。そして、私は小さなプログラムを書きました。これまでに修正できない論理エラーに直面しています。これがコードです。

 1:  puts 'Please enter the starting Year'  
 2:  startingYear = gets.chomp  
 3:  puts 'Please enter the ending Year'  
 4:  endingYear = gets.chomp  
 5:  while(startingYear.to_i <= endingYear.to_i)  
 6:     if(startingYear%4 == 0)
 7:            if((startingYear%400 == 0) or (startingYear%100 != 0))
 8:                   puts startingYear
 9:            end
10:     end
11:     startingYear = startingYear.to_i + 1
12:  end

このプログラムが行うことは次のとおりです。
これは、開始年と終了年を要求し、それらの間にすべてのうるう年を「配置」します (うるう年でもある場合は、それらも含めます)。うるう年は 4 で割り切れる年です (1984 年や 2004 年など)。ただし、100 で割り切れる年 (1800 や 1900 など) は、400 で割り切れない限り (実際にはうるう年だった 1600 や 2000 など)、うるう年ではありません。

Rubyデバッガーも使用しました。プログラムを実行すると、最初の繰り返しで行番号 6 が単純にスキップされます。その後、完全に正常に動作します。
例: 開始年に 1600 を入力し、終了年に 2000 を使用する場合。次に、出力は次から始まります。

1604年、1608年、1612年、. . . . . 1696年、1704年、1708年、. . . . . . 1992, 1996, 2000
論理的には 1600 も表示されるはずですが、プログラムは単純にそれをスキップします。私はそれが単なるヘアラインのようなエラーであることを知っています. しかし、私はそれを理解することができません。

PS 私は初心者なので、愚かな間違いは無視してください。ありがとう

4

2 に答える 2

3

最初に文字列を整数に変換します。

startingYear = gets.chomp.to_i 
endingYear = gets.chomp.to_i

to_iその後、コード内の他の場所を使用する必要はありません。

あなたのプログラムは最初の反復で 6 行目をスキップstartingYearしています。これは、最初のループであなたが文字列であるためです。

于 2013-02-21T21:43:17.553 に答える
0

"1600"問題は、文字列フォーマットメソッドが適用される文字列を最初に渡して%、を返すことselfです。ではない0ので、条件を満たしていません。2回目の反復から、整数に変換されるため、意図したとおりに機能します。入力の直後に文字列を1回変換する必要があります。

startingYear = gets.to_i
endingYear = gets.to_i

また、ロジックの冗長性にも注意してください。たとえば、年が400で割り切れる場合、4で割り切れるということになります。したがって、前者のテストを後者のテスト内にネストすることは冗長です。よりクリーンなロジックは次のようになります。

(startingYear..endingYear).each do |year|  
  if    (year % 400).zero? then puts year
  elsif (year % 100).zero?
  elsif (year %   4).zero? then puts year
  end
end
于 2013-02-21T21:49:01.793 に答える