Как я могу удостовериться, что подразделение целых чисел всегда окружается?

это произошло из-за неправильной записи. Расширить класс navbar-expand-custom Класс не существует в начальной загрузке 4, поэтому он создает проблему.

, поэтому я изменяю navbar-expand-custom на navbar-expand-lg, поэтому, когда экран меньше, чем 992px, отображается меню бургера.

@media (min-width: 1380px) {
  .navbar-expand-custom {
    flex-direction: row;
    flex-wrap: nowrap;
    justify-content: flex-start;
  }

  .navbar-expand-custom .navbar-nav {
    flex-direction: row;
  }

  .navbar-expand-custom .navbar-nav .nav-link {
    padding-right: .5rem;
    padding-left: .5rem;
  }

  .navbar-expand-custom .navbar-collapse {
    display: flex !important;
  }

  .navbar-expand-custom .navbar-toggler {
    display: none;
  }
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css">

<nav class="navbar navbar-expand-lg bg-dark navbar-dark">
  <a class="navbar-brand" href="landingPage(Stu).aspx">
    Trip Management System
  </a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>

  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownTrips" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          <i class="fas fa-globe" style="margin: 0px 3px 0px 3px"></i>Trips
        </a>
        <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuTrips">
          <a class="dropdown-item" href="tripRegistration.aspx">Apply For Trip</a>
          <a class="dropdown-item" href="viewtrips.aspx">View Trips</a>
          <a class="dropdown-item" href="viewReviewList.aspx">List of Reviews</a>
        </div>
      </li>

      <li class="nav-item">
        <a class="nav-link" href="tripApplicationList.aspx"><i class="fab fa-wpforms" style="margin: 0px 3px 0px 3px"></i>Application Status</a>
      </li>

      <li class="nav-item">
        <a class="nav-link" href="viewWeather.aspx"><i class="fas fa-sun" style="margin: 0px 3px 0px 3px"></i>Weather</a>
      </li>

      <li class="nav-item">
        <a class="nav-link" href="viewAnnouncement.aspx"><i class="fas fa-bullhorn" style="margin: 0px 3px 0px 3px"></i>Announcements</a>
      </li>

      <li class="nav-item dropdown" style="position: absolute; right: 80px;">
        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          <asp:Label ID="Labelusername" runat="server"></asp:Label>
        &nbsp;</a>
        <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
          <a class="dropdown-item" href="EditProfileStudent.aspx">Edit Profile</a>
          <a class="dropdown-item" href="profilePage.aspx">View Profile</a>
          <a class="dropdown-item" href="calendar.aspx">Trip Calendar</a>
          <a class="dropdown-item" href="viewTripHistory.aspx">View Trip History</a>
          <div class="dropdown-divider"></div>
          <a class="dropdown-item" href="signout.aspx">Sign out</a>
        </div>
      </li>
    </ul>
  </div>
</nav>

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js"></script>

235
задан Lightness Races with Monica 23 June 2011 в 04:55
поделиться

6 ответов

ОБНОВЛЕНИЕ: Этот вопрос был темой моего блога в январе 2013 года . Спасибо за отличный вопрос!


Получить правильную целочисленную арифметику сложно. Как уже было достаточно продемонстрировано, в тот момент, когда вы пытаетесь выполнить «умный» трюк, высока вероятность того, что вы допустили ошибку. А когда обнаруживается недостаток, изменение кода для исправления недостатка без учета того, ломает ли исправление что-то еще , не является хорошим методом решения проблем. На данный момент, я думаю, у нас есть пять различных неверных целочисленных арифметических решений для этой совершенно не особо сложной проблемы.

Правильный подход к задачам целочисленной арифметики, то есть способ, который увеличивает вероятность получения ответить правильно с первого раза - это внимательно подойти к проблеме, решайте ее поэтапно и используйте при этом хорошие инженерные принципы.

Начните с прочтения спецификации того, что вы пытаетесь заменить. В спецификации для целочисленного деления четко указано:

  1. При делении результат округляется до нуля

  2. Результат равен нулю или положительному, если два операнда имеют одинаковый знак, и нулю или отрицательному, если два операнда имеют противоположные знаки

  3. Если левый операнд - наименьшее представимое целое число, а правый операнд - –1, происходит переполнение. [...] это определяется реализацией относительно того, выбрасывается ли [ArithmeticException] или переполнение не сообщается с результирующим значением, равным значению левого операнда.

  4. Если значение правого операнда равно нулю, система .DivideByZeroException выбрасывается.

Нам нужна функция целочисленного деления, которая вычисляет частное, но округляет результат всегда в сторону увеличения , а не всегда в сторону нуля .

Итак, напишите спецификацию для этой функции. Наша функция int DivRoundUp (int divisor, int divisor) должна иметь поведение, определенное для каждого возможного ввода. Такое неопределенное поведение вызывает глубокое беспокойство, поэтому давайте его устраним. Мы скажем, что наша операция имеет следующую спецификацию:

  1. операция генерирует, если делитель равен нулю

  2. операция генерирует, если делимое равно int.minval, а делитель -1

  3. , если нет остатка - деление 'четное '- тогда возвращаемое значение является интегральным частным

  4. . В противном случае возвращается наименьшее целое число, которое на больше частного, то есть, он всегда округляется в большую сторону.

Теперь у нас есть спецификация, поэтому мы знаем, что можем предложить тестируемый дизайн . Предположим, мы добавляем дополнительный критерий проектирования, согласно которому проблема решается исключительно с помощью целочисленной арифметики, а не вычислением частного как двойного, поскольку «двойное» решение было явно отклонено в формулировке задачи.

Итак, что мы должны вычислить? Очевидно, чтобы соответствовать нашей спецификации, оставаясь исключительно в целочисленной арифметике, нам нужно знать три факта. Во-первых, каково целочисленное частное? Во-вторых, было ли разделение без остатка? И в-третьих, если нет, было ли целое частное вычислено округлением в большую или меньшую сторону?

Теперь, когда у нас есть спецификация и дизайн, мы можем начать писать код.

public static int DivRoundUp(int dividend, int divisor)
{
  if (divisor == 0 ) throw ...
  if (divisor == -1 && dividend == Int32.MinValue) throw ...
  int roundedTowardsZeroQuotient = dividend / divisor;
  bool dividedEvenly = (dividend % divisor) == 0;
  if (dividedEvenly) 
    return roundedTowardsZeroQuotient;

  // At this point we know that divisor was not zero 
  // (because we would have thrown) and we know that 
  // dividend was not zero (because there would have been no remainder)
  // Therefore both are non-zero.  Either they are of the same sign, 
  // or opposite signs. If they're of opposite sign then we rounded 
  // UP towards zero so we're done. If they're of the same sign then 
  // we rounded DOWN towards zero, so we need to add one.

  bool wasRoundedDown = ((divisor > 0) == (dividend > 0));
  if (wasRoundedDown) 
    return roundedTowardsZeroQuotient + 1;
  else
    return roundedTowardsZeroQuotient;
}

Это умно? Нет. Красиво? Нет. Короткий? Нет. Правильно по спецификации? Думаю, да, но я не тестировал его полностью. Хотя выглядит неплохо.

Мы здесь профессионалы; использовать передовой инженерный опыт. Изучите свои инструменты, укажите желаемое поведение, сначала рассмотрите случаи ошибок и напишите код, чтобы подчеркнуть его очевидную правильность. И когда вы обнаружите ошибку, подумайте, является ли ваш алгоритм глубоко ошибочным, прежде чем вы просто случайным образом начнете менять направления сравнений и сломать то, что уже работает.

662
ответ дан 23 November 2019 в 03:27
поделиться

Это было бы достаточно для решения для подкачки страниц, где int1 является количеством объектов, и int2 является размером страницы:

(int1 == 0) ? 1 : (int1 - 1) / int2 + 1;
-1
ответ дан 23 November 2019 в 03:27
поделиться

Вы можете написать помощника.

static int DivideRoundUp(int p1, int p2) {
  return (int)Math.Ceiling((double)p1 / p2);
}
17
ответ дан 23 November 2019 в 03:27
поделиться

Окончательный ответ на основе int

Для целых чисел со знаком:

int div = a / b;
if (((a ^ b) >= 0) && (a % b != 0))
    div++;

Для целых чисел без знака:

int div = a / b;
if (a % b != 0)
    div++;

Обоснование этого ответа

Целочисленное деление ' / 'определено с округлением до нуля (7.7.2 спецификации), но мы хотим округлить в большую сторону. Это означает, что отрицательные ответы уже округлены правильно, но положительные ответы необходимо скорректировать.

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

Самая безопасная ставка - определить, когда ответ должен быть положительным, проверяя идентичность знаков обоих целых чисел. Целочисленный оператор xor ' ^ ' для двух значений приведет к появлению знакового бита 0 в этом случае, что означает неотрицательный результат, поэтому проверка (a ^ b)> = 0 определяет, что результат должен был быть положительным до округления. Также обратите внимание, что для целых чисел без знака каждый ответ, очевидно, положительный, поэтому эту проверку можно опустить.

Единственная оставшаяся проверка - это было ли округление, для которого a% b! = 0 будет сделай свою работу.

Извлеченные уроки

Арифметика (целочисленная или нет) далеко не так проста, как кажется. Всегда необходимо тщательно обдумывать.

Кроме того, хотя мой окончательный ответ, возможно, не такой «простой», «очевидный» или, возможно, даже «быстрый», как ответы с плавающей запятой, он имеет для меня одно очень сильное искупающее качество; Я обдумал ответ, так что я действительно уверен, что он правильный (пока кто-то более умный не скажет мне обратное - украдкой взгляда на Эрика »
Учитывая ту же ошибку, что и другое целочисленное решение для отрицательных значений myInt1 , было бы проще сделать что-то вроде:

int rem;
int div = Math.DivRem(myInt1, myInt2, out rem);
if (rem > 0)
  div++;

Это должно дать правильный результат в div ] с использованием только целочисленных операций.

Причина, по которой это неверно : -1 и -5 должны давать 1, это дает 0

РЕДАКТИРОВАТЬ (еще раз, с чувством):
Оператор деления округляется до нуля ; в случае отрицательных результатов это совершенно верно, поэтому корректировки требуют только неотрицательные результаты. Также учитывая, что DivRem просто выполняет / и % в любом случае, давайте пропустим вызов (и начнем с простого сравнения, чтобы избежать вычисления по модулю, когда это не так. необходимо):

int div = myInt1 / myInt2;
if ((div >= 0) && (myInt1 % myInt2 != 0))
    div++;

Причина ошибки : -1 и 5 должны дать 0,

48
ответ дан 23 November 2019 в 03:27
поделиться

Вы можете использовать что-то вроде следующего:

a / b + ((Math.Sign(a) * Math.Sign(b) > 0) && (a % b != 0)) ? 1 : 0)
4
ответ дан 23 November 2019 в 03:27
поделиться

Прекрасный шанс использовать метод расширения:

public static class Int32Methods
{
    public static int DivideByAndRoundUp(this int number, int divideBy)
    {                        
        return (int)Math.Ceiling((float)number / (float)divideBy);
    }
}

Это делает ваш код более читабельным:

int result = myInt.DivideByAndRoundUp(4);
20
ответ дан 23 November 2019 в 03:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: