2013-03-08 3 views
0

Я новичок в java, и я делаю некоторые вопросы, чтобы освежить мои навыки java.if-else-else if

Напишите метод, названный сезоном, который принимает два целых числа в качестве параметров, представляющих месяц и день, и возвращает строку, указывающую сезон в течение этого месяца и дня. Предположим, что месяцы указаны как целое число от 1 до 12 (1 на 2 января за февраль и т. Д.) И что день месяца составляет от 1 до 31.

Если дата составляет от 12 до 12/16 и 3/15, вы должны вернуть «Зиму». Если дата находится между 3/16 и 6/15, вы должны вернуть «Весна». Если дата находится между 6/16 и 9/15, вы должны вернуть «Лето». И если дата выпадает между 9/16 и 12/15, вы должны вернуть «Падение».

public static String season(int month,int day){ 
    
    if(month>=9 && month<=12 && day==15||day==16){ 
        return "Fall"; 
    } 
    else if (month>=4 && month<=6 && day==16||day==15){ 
       return "Spring"; 
     } 
    else if (month>=6 && month<=9 && day==16||day==15){ 
         return "Summer"; 
     } 
     else { 
          return"Winter"; 

          
      } 

   
} 

Но я не получаю выход. Но это кажется правильным для меня. Любой может сказать мне, где я ошибся?

+0

РЕКОМЕНДУЕМОГО 'месяца == 4' будет' месяц> = 4'? –

+0

Во втором, если 'месяц <= 6' бесполезен, потому что вы тестируете' month == 4' –

+0

Ваши условия неверны. Например: Применяя второй октябрь, который осенью, вы получаете зиму. – GeorgeVremescu

ответ

8

|| has lower precendence than && и ваши условия не выглядеть правильно - вы, вероятно, хотел написать что-то вроде:

if((month == 9 && day >= 16) //September, on or after the 16th 
     || month == 10   //or October 
     || month == 11   //or November 
     || (month == 12 && day <=15)) { //or December, but before or on the 15th 
    return "Fall"; 
} 

(такой же комментарий для других условий)


Вы могли бы сделать его короче с использованием небольшого взлома, но читаемость, возможно, не такая хорошая (спорная):

int mdd = month * 100 + day; //date in MDD format, for example 507 for May 7th 

if (mdd >= 916 && mdd <= 1215) { 
    return "Fall"; 
} 
+0

Не означает ли это, что только 9/15, 9/16, 12/15 и 12/16 были зимой? – christopher

+0

Один вопрос. Я понимаю, что часть дня повторяется. Так есть способ сохранить его? – user2148463

+0

@ChrisCooney Да, вы правы. – assylias

3

Вы должны попытаться написать что-то вроде этого:

if((month>9 && month<12) || (month==9 && day>=16) || (month==12 && day<=15)){ 
    return "Fall"; 
} else if 
    ... 
} 

В старшинство имеют важное значение, а также, но вы должны думать над тем, что вы действительно хотите достичь, и строить ваше выражение в соответствии с этим.

1
if(month>=9 && month<=12 && (day==15||day==16)){ 
    return "Fall"; 
} 

Этот вопрос заключается в том, что только 15 и 16 месяцев 9-12 считаются зимой.

Решение

Если бы это было до меня, я бы вновь профакторизовать если-то еще дерево первой проверки в течение нескольких месяцев, а затем проверить дни. Так, например:

if(month>=9 && month<=12) 
{ 
    // Some special cases. 
    if((month == 9 && day < 15) || (month == 12 && day > 16)) 
    { 
     // It isn't fall. 
    } 
    else 
    { 
     // It is fall. 
    } 
} 
+0

Чертовы бессонные ночи. Спасибо, я отредактирую. – christopher

+1

Добро пожаловать в клуб '2000' :) – gaborsch

0

Это нормально. Вы были некоторая Minow ошибка я исправил

public static String season(int month,int day){ 

    if((month>=9 && month<=12) && (day==15||day==16)) 
     return "Fall";  
    else{ 
     if ((month>=4 && month<=6) && (day==16||day==15)) 
      return "Spring";   
     else{ 
      if ((month>=6 && month<=9) && (day==16||day==15)) 
       return "Summer";  
      else 
       return"Winter"; 
     } 
    } 

}