JAVA BEGINNER: оператор IF не работает должным образом - тело кода не вызывается, когда это необходимо? - PullRequest
1 голос
/ 23 октября 2019

Пару недель нового в кодировании! Мне было поручено создать метод, при котором пользователь сможет записаться на «встречу» с 9:00 до 17:00. Я создал логический массив размером 8 с именем «Доступность» (0 = 9:00, 1 = 10:00, 2 = 11:00, 3 = 12:00 ... 8 = 17:00.) True означает, что время доступно, false означает, что время недоступно.

Метод имеет параметры описания, час и продолжительность. Мой метод способен записаться на прием в выбранное время.

Однако, допустим, я забронировал встречу в 9 утра с продолжительностью 1. -> 0 теперь ложно. Затем, я забронировал встречу в 11 утра с продолжительностью 1. -> 2 теперь ложно. Затем я записываюсь на встречу в 10:00 с продолжительностью 2. -> 1 (10:00) должен оставаться верным, поскольку пользователь не должен иметь возможность записываться на 2 часа, если следующий час (11:00) уже забронирован, верно?

Я пытался заставить это произойти в моем коде, но безрезультатно. Мой код все еще записывает 10 утра и устанавливает слот в ложь! Из того, что я понял, я считаю, что проблема в строке 96, оператор , если , проверяющий, является ли какой-либо из слотов в течение продолжительности ложным.

Я пытался установить булеву переменную равной true в начале кода, а если оператор if обнаружил ложную доступность, установите переменную check как false. Это останавливает следующий блок кода, где оператор IF проверяет, является ли 'check' истинным (если все слоты в течение продолжительности являются истинными, поскольку он не был установлен в ложное значение).

public boolean makeAppointment(String desc, int duration, int hour) {
  boolean check = true;
  if (!((hour + (duration - 1) > 17))) { // it'll be 10
    int booleanHour = hour - 9; // it'll be 1

    if (booleanHour <= availability.length && booleanHour >= 0 && duration > 0 && duration <= 4) { // This 4 is a placeholder, subject to change.  


      for (int i = booleanHour; i < booleanHour + duration; i++) { 
        if (availability[i] == false) { // This isn't working? Confusion. 
          System.out.println( // response to if false
            "This has hour been booked, please choose another time. We open at 9am, and close at 5pm.");
          System.out.println(check);
          check = false;
          return false;
        } 
        if (check) {
          for (int b = booleanHour; b < booleanHour + duration; b++) {
            availability[b] = false;
            Appointment appoint = new Appointment(desc, duration, b + 9);
            schedule.put(b + 9, appoint);
          }
          return true;
        }

      }
    } else {
      System.out.println("The max duration of a         meeting is 4 hours.");
    }
  }
  return false;
}

Этои мой тестовый код.

Day day5 = new Day();
    day5.makeAppointment("hello", 1, 9);
    assertEquals(day5.getAvailability(0), false);

    day5.makeAppointment("hello", 1, 11);
    assertEquals(day5.getAvailability(2), false);

    day5.makeAppointment("hello", 2, 10);
    assertEquals(day5.getAvailability(1), true);

Я пытался найти проблему и исправить ее, не обращаясь за помощью к сторонним разработчикам, но дошло до того, что смотреть на экран компьютера не очень хороший способучиться и иметь кого-то, кто может указать на проблему, из которой я могу учиться, является лучшим вариантом!

Если я получу ответ, спасибо! :) Если что-то в этом посте не разрешено, извините, в первый раз!

1 Ответ

0 голосов
/ 23 октября 2019

Вы пропустили закрывающую скобку и вместо того, чтобы зацикливаться все дни, проверяя, забронированы они или нет, вы проверяете только первый и затем назначаете встречу. Это работает, потому что 10, очевидно, бесплатно - программа не будет проверять 11 тогда, даже если вы хотите

for (int i = booleanHour; i < booleanHour + duration; i++) { 
    if (availability[i] == false) {
      System.out.println("This has hour been booked, please choose another time. We open at 9am, and close at 5pm.");
      System.out.println(check);
      check = false;
      return false;
    } // this is the end of IF not FOR - only first element was checked!
    if (check) { // yup it's true because 10 is free...
      for (int b = booleanHour; b < booleanHour + duration; b++) {
        availability[b] = false; // here we are making all hours booked no matter they are booked or not already
        Appointment appoint = new Appointment(desc, duration, b + 9);
        schedule.put(b + 9, appoint);
      }
      return true;
    }
  } // and finally this is the end of FOR but it's too late

Обратите внимание также, что если вы используете return false, вы не получаете доступ к коду после return ключевое слово больше - ваше check условие не имеет смысла, тогда


Фиксированный код может выглядеть следующим образом:

public boolean makeAppointment(String desc, int duration, int hour) {

  //...

  for (int i = booleanHour; i < booleanHour + duration; i++) { 
    if (!availability[i]) {
      System.out.println("This has hour been booked, please choose another time. We open at 9am, and close at 5pm.");
      return false;
    }
  } 

  for (int b = booleanHour; b < booleanHour + duration; b++) {
      availability[b] = false; // here we are making all hours booked no matter they are booked or not already
      Appointment appoint = new Appointment(desc, duration, b + 9);
      schedule.put(b + 9, appoint);
  }

  return true;

  //...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...