Циклы while и for . Объектно-ориентированное программирование на Java. Платформа Java SE
Давайте представим, что мы хотим разделить целое число m на другое целое число n.
И мы хотим получить результат целочисленного деления, то есть самое большое количество раз, которое n вписывается в m.
Например, целочисленное деление 7 на 2, равно 3, потому что 2 по 3 раза, это 6.
Остаток равен 1.
И представьте себе, что у нас нет встроенной операции, которая выполняет эту операцию для нас.
Поэтому нам нужно сделать повторяемые вычитания.
И если нам удастся вычесть 2 из 7 три раза, это означает, что целочисленное деление равно 3.
Целочисленное деление y и целочисленный остаток x соответствуют формуле, m равно y умножить на n плюс x.
Предположим, что нам даны целые числа m и n.
А в x сохраняется оставшееся значение после вычитаний.
Итак, давайте начнем с x равно m.
y содержит результат целочисленного деления.
Мы инициализируем y 0 и приращиваем y на 1 каждый раз, когда мы вычитаем n из x.
И мы продолжаем вычитать n из x, пока x не меньше n.
Если x больше или равно n, мы вычитаем n из x и увеличим y на 1.
Таким образом, эта программа делает то, что мы хотим, но тут есть проблема.
Мы не знаем, сколько операторов if мы должны добавить.
Потому что это зависит от фактических значений m и n.
Например, с 7 и 2, это будет три выражения if.
При других входных данных это должно быть другое число if выражений.
В Java эту проблему решает оператор while.
Теперь эта программа делает то же самое, что и прежде, повторяет выражение, пока выполняется условие.
Но теперь у нас есть одно большое преимущество.
Выражения повторяются столько раз, сколько это необходимо, автоматически.
Но теперь вы должны быть очень осторожны при написании условия while.
Потому что есть опасность войти в бесконечный цикл, если условие while никогда не прекратится.
Преимущество цикла while заключается в том, что нам не нужно заранее знать, сколько раз мы должны что-либо повторять.
Мы повторяем, пока не будет достигнута цель, выраженная логическим условием.
Иногда, однако, мы знаем, сколько раз нам нужно что-либо повторить.
Это легко реализовать подсчетом.
Хитрость заключается в том, чтобы ввести счетчик.
Это целочисленная переменная, которую мы обновляем на каждой итерации.
Здесь существует три важных элемента: величина, с которой мы хотим начать, значение в конце и шаг между значениями.
Здесь мы начинаем с 0 и заканчиваем 3. И шаг 1.
Поэтому мы выполняем четыре итерации для i равного 0, 1, 2 и 3.
Теперь, помимо подсчета, мы можем захотеть что-то сделать в теле цикла.
В этом случае предположим, что у нас есть другая переменная, n, которую мы хотим умножать на 2 при каждой итерации.
Так как такого рода подсчет используется часто, в Java для этого есть специальная конструкция.
А именно, цикл for.
Этот цикл объединяет три важных момента для переменной счетчика:
Ее инициализацию, условие остановки, и выражение обновления.
Имейте в виду, что обновление выполняется после того, как выполняется тело цикла, а не раньше.
Для цикла for скобки являются обязательными, а также две точки с запятой внутри.
Фигурные скобки необходимы только в том случае, если есть более одного выражения в теле цикла.
Но это хорошая практика, чтобы всегда писать их.
Как вы видели, если в начальный момент условное выражение, управляющее циклом while, ложно, тело цикла вообще не будет выполняться.
Однако иногда желательно выполнить тело цикла хотя бы один раз, даже если в начальный момент условное выражение ложно.
Иначе говоря, существуют ситуации, когда проверку условия прерывания цикла желательно выполнять в конце цикла, а не в его начале.
И в Java есть именно такой цикл: do-while.
Этот цикл всегда выполняет тело цикла хотя бы один раз, так как его условное выражение проверяется в конце цикла.
В приведенном примере тело цикла выполняется до первой проверки условия завершения.
Мы уже видели оператор break в выражении switch.
Но оператор break также может прерывать любой цикл.
Предположим, у вас есть цикл.
И иногда желательно немедленно завершить цикл, не проверяя условие.
В таких случаях используется оператор break.
Оператор break немедленно завершает цикл, и управление программой переходит к следующему выражению, следующему за циклом.
Оператор break почти всегда используется вместе с выражением if else.
Также иногда желательно не прервать цикл, а пропустить код тела цикла и перейти к следующей итерации.
Оператор continue пропускает текущую итерацию цикла и когда выполняется оператор continue, управление программой переходит к концу цикла.
Затем проверяется условие, которое управляет циклом.
Оператор continue также почти всегда используется вместе с выражением if else.
Данный текст является ознакомительным фрагментом.
Арифметические операции | Документация AnyLogic
Java поддерживает следующие арифметические операции:
Оператор | Операция |
---|---|
+ | Сложение |
— | Вычитание |
* | Умножение |
/ | Деление |
% | Остаток от целочисленного деления |
Приоритет операций умножения и деления выше, чем у сложения и вычитания. Операции с одинаковыми приоритетами выполняются слева направо. Вы можете изменять порядок выполнения операций с помощью скобок:
a + b / c ≡ a + ( b / c ) a * b — c ≡ ( a * b ) — c a / b / c ≡ ( a / b ) / c
Рекомендуется всегда явно задавать порядок выполнения операций с помощью скобок — в этом случае вам не придется думать о том, приоритет какой операции выше.
Стоит уделить особое внимание целочисленному делению.
Результат деления в Java зависит от типов операндов. Если оба операнда — целые числа, то результат будет тоже целым. Поэтому непреднамеренное использование целочисленного деления может привести к существенной потере точности. Чтобы произвести обычное деление, получив в качестве результата вещественное значение, в Java нужно явно указать, что хотя бы один из операндов является вещественным числом.
Например:
3 / 2 ≡ 1 2 / 3 ≡ 0
потому что это целочисленное деление. Однако
3 / 2. ≡ 1.5 2.0 / 3 ≡ 0.66666666…
потому что 2. и 2.0 являются вещественными числами. Если k и n являются переменными типа int, то k/n будет производить целочисленное деление и выдавать в качестве результата целое число (значение типа int). Чтобы получить вещественный результат при делении двух целочисленных переменных (или выражений), вы должны заставить Java рассматривать хотя бы одну переменную как вещественную.
Это делается с помощью приведения типов: для этого вам нужно перед именем переменной написать в скобках имя типа, к которому вы хотите преобразовать значение, например, (double)k/n даст вещественный результат деления (значение типа double).Целочисленное деление часто используется вместе с операцией взятия остатка от деления для получения номера строки и столбца элемента по его порядковому номеру. Предположим, что есть коллекция из 600 элементов, задающая, скажем, места в театре, и мы хотим условно расположить эти места в 20 рядов, каждый из которых содержит по 30 мест. В этом случае получить номер ряда и номер места в этом ряду можно будет с помощью следующих выражений:
Номер места: index % 30 (остаток от деления индекса на 30: 0 — 29)
Номер ряда: index / 30 (целочисленное деление индекса на 30: 0 — 19)
где порядковый номер (индекс) index принимает значения от 0 до 599. Например, место с индексом 247 будет соответствовать месту 7 в ряду 8.
pow( a, b ) ≡ ab
Java поддерживает несколько упрощенных операторов для часто используемых операций с численными переменными:
i++ ≡ i = i + 1 (увеличение значения i на 1)
i— ≡ i = i — 1 (уменьшение значения i на 1)
a += 100.0 ≡ a = a + 100.0 (увеличение значения a на 100.0)
b -= 14 ≡ b = b — 14 (уменьшение значения b на 14)
Обратите внимание, что хотя такие операторы могут использоваться в выражениях, их вычисление изменяет значение операндов.
Как мы можем улучшить эту статью?
НУМ02-ДЖ. Убедитесь, что операции деления и остатка не приводят к ошибкам деления на ноль — SEI CERT Oracle Coding Standard for Java
Перейти к концу метаданных
Операции деления и остатка, выполняемые над целыми числами, подвержены ошибкам деления на ноль. Следовательно, делитель в операции деления или остатка над целочисленными типами должен быть проверен на ноль перед операцией. Это правило не распространяется на операции деления и остатка, выполняемые над числами с плавающей запятой.
Пример кода несоответствия (деление)
Результатом оператора /
является частное от деления первого арифметического операнда на второй арифметический операнд. Операции деления подвержены ошибкам деления на ноль. Переполнение также может произойти во время деления целого числа со знаком с дополнением до двух, когда делимое равно минимальному (отрицательному) значению для целочисленного типа со знаком, а делитель равен -1 (дополнительную информацию см. в разделе NUM00-J. Обнаружение или предотвращение переполнения целых чисел). ). Этот несоответствующий пример кода может привести к ошибке деления на ноль при делении операндов со знаком число1
и число2
:
длинное число1, число2, результат; /* Инициализировать num1 и num2 */ результат = число1 / число2;
Совместимое решение (подразделение)
Это совместимое решение проверяет делитель, чтобы гарантировать отсутствие вероятности ошибок деления на ноль:
long num1, num2, result; /* Инициализировать num1 и num2 */ если (число2 == 0) { // Обработка ошибки } еще { результат = число1 / число2; }
Пример кода несоответствия (оставшаяся часть)
%
оператор дает остаток при делении двух операндов целочисленного типа. Этот несоответствующий пример кода может привести к ошибке деления на ноль во время операции остатка для операндов со знаком число1
и число2
:
длинное число1, число2, результат; /* Инициализировать num1 и num2 */ результат = число1 % число2;
Соответствующее решение (остаток)
Это совместимое решение проверяет делитель, чтобы гарантировать отсутствие вероятности ошибки деления на ноль:
длинное число1, число2, результат; /* Инициализировать num1 и num2 */ если (число2 == 0) { // Обработка ошибки } еще { результат = число1 % число2; }
Оценка риска
Деление или остаток на ноль может привести к аварийному завершению программы и отказу в обслуживании (DoS).
Правило | Серьезность | . 0003 | Priority | Level | |
---|---|---|---|---|---|
NUM02-J | Low | Likely | Medium | P6 | L2 |
Автоматическое обнаружение
DIVIDE_BY_ZERO | Implemented | ||
Parasoft Jtest | 2022.2 | CERT.NUM02.ZERO | Avoid division by zero |
PVS-Studio | 7.23 | V6020 | |
SonarQube | 6.7 | S3518 | 6 Нуль не должен быть знаменателем0086
Дополнительные рекомендации
Стандарт кодирования SEI CERT C | INT33-C. Ensure that division and remainder operations do not result in divide-by-zero errors |
MITRE CWE | CWE-369, Divide by Zero |
Bibliography
[ISO /МЭК 9899:1999] | Подключение 6.5.5, «Мультипликативные операторы» |
[SeaCord 05] | Глава 5, «Целые числа» |
[SeaCord 2015] | |
[SeaCord 2015] | |
. Убедитесь, что операции подразделения и модуля не приводят к ошибкам разделения на нулевые. , деление по модулю,java деление без остаткаОстаток — это целое число, оставшееся после деления одного целого числа на другое. Частное — это количество, полученное делением двух чисел. Например, (7/2) = 3. В приведенном выше выражении 7 делится на 2, поэтому частное равно 3, а остаток равен 1. Деление Оператор в Java включает в себя операторы деления, модуля и оператора деления и присваивания. Давайте работать с ними один за другим — Оператор отдела. Оператор деления делит левый операнд на правый операнд. Модульный оператор. Оператор модуля делит левый операнд на правый операнд и возвращает остаток. При целочисленном делении остаток — это то, что не помещается в делитель, т. е. если вычислить 11/4, целочисленный результат будет 2 (4 умещается 2 раза в 11) и остаток 3 (поскольку 11 — 2* 4 = 3). Или, другими словами, если у вас есть 11 яблок и вы хотите раздать их поровну 4 людям, вы можете дать каждому человеку только по 2 яблока, и тогда у вас останется 3 (оставшихся). Аналогично, чтобы найти остаток, мы используем оператор %. Таким образом, остаток от 25/4, т. е. 1, хранится в целочисленной переменной остатка. Наконец, частное и остаток выводятся на экран с помощью функции println(). Оператор остатка или модуля в Java. В Java есть один важный арифметический оператор, с которым вы, возможно, не знакомы, %, также известный как оператор модуля или остатка. Оператор % возвращает остаток двух чисел. Например, 10 % 3 равно 1, потому что 10, разделенное на 3, дает в остатке 1. Вы можете использовать % точно так же, как любой другой более распространенный оператор, например + или -. Рабочие листы на длинное деление без остатка Эти рабочие листы на длинное деление — отличное место для начала обучения шагам на длинное деление. Каждый набор рабочих листов представляет все более сложные задачи на деление в длину, хотя ни на одном из рабочих листов в этом разделе нет задач на деление с остатками или десятичными дробями. деление по модулюМодульное деление определяется, когда существует модульная инверсия делителя. Обратное целое число «x» — это другое целое число «y», такое что (x*y) % m = 1, где m — модуль. Когда существует инверсия? Как обсуждалось здесь, обратное число ‘a’ существует по модулю ‘m’, если ‘a’ и ‘m’ взаимно просты, т. е. НОД их равен 1. Каждый класс остатков по модулю n может быть представлен любым одним его членов, хотя мы обычно представляем каждый остаточный класс наименьшим неотрицательным целым числом, которое принадлежит этому классу (поскольку это правильный остаток, который получается в результате деления). |