2013-02-21 2 views
1

루비를 배웠습니다. 그리고 나는 작은 프로그램을 썼다. 지금까지 해결할 수없는 논리적 오류에 직면하고 있습니다. 여기에 코드가 있습니다.논리 오류 루블에서 모듈러스 % 연산자를 사용하는 동안

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으로 나눌 수있는 연도는 윤년이 아니며 (예 : 윤년 인 1600과 2000과 같이) 400으로 나눌 수있는 경우가 아니면 1800 년과 1900 년과 같은 윤년이 아닙니다.

Ruby 디버거도 사용했습니다. 프로그램을 실행하면 첫 번째 반복에서 행 번호 6을 건너 뜁니다. 그 후 완전히 잘 작동합니다.
예 : 시작 연도에 입력 1600을 사용하고 종료 연도에 2000을 사용할 때. 출력은

1604, 1608, 1612, 에서 시작됩니다. . . . . 1696, 1704, 1708, . . . . . . 1992 년, 1996 년, 논리적으로는 1600도 표시해야하지만 프로그램에서는이를 건너 뜁니다. 나는 그것이 단지 오류와 같은 헤어 라인이라는 것을 안다. 그러나 나는 그것을 알아낼 수 없다.

P. 나는 초보자이기 때문에 어떤 종류의 어리석은 실수라도 무시하십시오. 감사합니다

답변

3

한 번 시작 정수로 문자열을 변환 :

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

그런 다음 코드에서 다른 곳 to_i를 사용할 필요가 없습니다.

startingYear은 루프를 처음으로 통과 한 문자열이기 때문에 프로그램이 6 번째 줄을 건너 뜁니다.

+0

정말 고맙습니다. 당신은 내 하루를 구했다 :) –

0

처음에는 "1600" 문자열을 전달하는 중입니다. 문자열 서식 지정 방법 %이 적용되고 self을 반환합니다. 이는 0이 아니므로 조건을 만족하지 못합니다. 두 번째 반복에서 정수로 변환되므로 의도 한대로 작동합니다. 입력 한 직후 문자열을 한 번 변환해야합니다.

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 
+0

잡았어. 문제가 해결되었습니다. 고마워요. –

+0

고마워요. 이 충고는 나에게 또 다른 보석이다. 다음에이 사실을 명심하십시오. :) –

관련 문제