- •Лекция № 2
- •Управление выполнением программ
- •1. Условные операторы if-else
- •If (логическое выражение) {оператор1;} [ else {оператор2;}]
- •2. Оператор break
- •3. Оператор switch
- •4. Оператор return
- •5. Циклы
- •5.1. Оператор цикла while
- •5.2. Оператор цикла do-while
- •5.3. Оператор цикла for
- •6. Оператор запятая
- •7. Оператор continue
- •Вычисления в Java. Math. StrictMath.
- •Потоки ввода/вывода и строки в Java
- •Задачи для самостоятельной проработки материала
- •Контрольные вопросы Литература
7. Оператор continue
В некоторых ситуациях возникает потребность досрочно перейти к выполнению следующей итерации, проигнорировав часть операторов тела цикла, еще не выполненных в текущей итерации. Для этой цели в Java предусмотрен оператор continue. Ниже приведен пример, в котором оператор continue используется для того, чтобы в каждой строке печатались два числа.
class ContinueDemo {
public static void main(String args[]) {
for (int i=0; i < 10; i++) {
System.out.print(i + " ");
if (i % 2 == 0) continue;
System.out.println("");
} } }
Если индекс четный, цикл продолжается без вывода символа новой строки. Результат выполнения этой программы таков:
0 1
2 3
4 5
6 7
8 9
Как и в случае оператора break, в операторе continue можно задавать метку, указывающую, в каком из вложенных циклов вы хотите досрочно прекратить выполнение текущей итерации. Для иллюстрации служит программа, использующая оператор continue с меткой для вывода треугольной таблицы умножения для чисел от 0 до 9:
class ContinueLabel {
public static void main(String args[]) {
outer: for (int i=0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (j > i) { System.out.println(""); continue outer;
}
System.out.print(" " + (i * j));
} } } }
Оператор continue в этой программе приводит к завершению внутреннего цикла со счетчиком j и переходу к очередной итерации внешнего цикла со счетчиком i. В процессе работы эта программа выводит следующие строки:
0
0 1
0 2 4
0 3 6 9
0 4 8 12 16
0 5 10 15 20 25
0 6 12 18 24 30 36
0 7 14 21 28 35 42 49
0 8 16 24 32 40 48 56 64
0 9 18 27 36 45 54 63 72 81
Вычисления в Java. Math. StrictMath.
В стандартной библиотеке языка Java содержатся два класса для произведения базовых математических операций, таких как возведение в степень, взятие логарифма, синуса, косинуса и так далее. Эти классы отличаются между собой различной точностью представления чисел на разных архитектурах процессора. Это классы Math и StrictMath
При использовании StrictMath получаем абсолютно одинаковый результат вычислений не зависимо от процессора, который установлен у пользователя программы. Это потому, что эта функция задумывалась создателями языка как базовая для всех примитивных типов данных и манипуляций с ними. Но как оказалось это не такая простая задача и обеспечение одинаковых результатов на различных платформах значительно уменьшают быстродействие. Большинство задач просто не требуют такой точности в вычислениях, для них гораздо важнее скорость этих вычислений. Это привело к разделению математической части библиотеки на быструю и выдающую одинаковый результат на разных процессорах.
Таким образом, если в решении вашей задачи важнее скорость — используйте класс Math, если же вам необходимо одинаковая работа (с точностью до бита) с примитивными типами данных, то ваш выбор — StrictMath. Константы и методы у них одинаковы, и более того некоторые методы класса Math просто вызывают аналогичные методы класса StrictMath.
Далее рассмотрим класс Math, содержащий различные математически функции. Рассмотрим некоторые из них:
арифметические |
Math.abs(n) |
возвращает модуль числа n. |
Math.sqrt(n) |
возвращает квадратный корень из n |
|
Math.cbrt(n) |
возвращает кубический корень аргумента |
|
Math.pow(n,b) |
возвращает значение степенной функции n в степени b (n и b могут быть вещественными). |
|
Math.log(n) |
возвращает значение натурального логарифма числа n |
|
Math.log10(n) |
возвращает значение десятичного логарифма числа n. |
|
Math.signum(n) |
возвращает 1.0 если число больше 0 и -1.0 если число меньше нуля и ноль, если аргумент равен нулю; |
|
Math.hypot(x,y) |
возвращает квадратный корень из суммы аргументов: sqrt(x2+y2); |
|
Math.max(n1,n2) |
возвращает большее из двух чисел |
|
Math.min(n1,n2) |
возвращает меньшее из двух чисел; |
|
округление |
Math.round(n) |
обычное округление |
Math.ceil(n) |
округляет значение в большую сторону |
|
Math. floor(n) |
округляет в меньшую сторону; |
|
тригометрические |
Math.cos(n), Math.sin(n), Math.tan(n) |
тригонометрические функции sin, cos и tg от аргумента n, указанного в радианах. |
Math.acos(n), Math.asin(n), Math.atan(n) |
обратные тригонометрические функции, возвращают угол в радианах |
|
Math.toDegrees(n) |
переводит радианы в градусы |
|
Math.toRadians(n) |
переводит градусы в радианы |
Пример:
System.out.println(Math.cbrt(8)); // 2.0
System.out.println(Math.ceil(2.1)); // 3.0
System.out.println(Math.copySign(3.4, -11.2)); // -3.4
System.out.println(Math.floor(9.999)); // 9.0
System.out.println(Math.hypot(3,4)); // 5.0
System.out.println(Math.max(3, 2)); // 3
System.out.println(Math.min(3, 2)); // 2
System.out.println(Math.nextAfter(4.45634D, -100)); //4.456339999999999
System.out.println(Math.nextUp(4.45634D)); // 4.456340000000001
System.out.println(Math.random()); // 0.45357720245424116
System.out.println(Math.round(4.5)); // 5
System.out.println(Math.round(Math.PI)); // выведет 3
System.out.println(Math.round(9.5)); // выведет 10
System.out.println(Math.round(9.5-0.001)); // выведет 9
System.out.println(Math.signum(-34.78)); // -1.0
System.out.println(Math.toDegrees(Math.PI)); // 180.0
System.out.println(Math.toRadians(180)); // 3.141592653589793
System.out.println(Math.abs(-2.33)); // выведет 2.33
Подведя итог можно сказать, что если добавлять к классу, интерфейсу и методам ключевое слово strictfp, то можем быть уверены, что на всех платформах при работе с числами мы получим одинаковый результат.
Все перечисленные функции принимают вещественные аргументы, а тип возвращаемого значения зависит от типа аргумента и от самой функции.
Кроме функций в рассматриваемом классе имеются две часто используемых константы:
Math.PI |
число «пи», с точностью в 15 десятичных знаков |
Math.E |
число Неппера (основание экспоненциальной функции), с точностью в 15 десятичных знаков. |
В классе Math есть полезная функция без аргументов, которая позволяет генерировать псевдослучайные значения, т.е. при каждом вызове этой функции она будет возвращать новое значение.
Math.random() |
возвращает псевдослучайное вещественное число из промежутка [0;1). |
Если требуется получить число из другого диапазона, то значение функции можно умножать на что-то, сдвигать и, при необходимости, приводить к целым числам.
Например:
System.out.println(Math.random()); // вещественное число из [0;1)
System.out.println(Math.random()+3); // вещественное число из [3;4)
System.out.println(Math.random()*5); // вещественное число из [0;5)
System.out.println( (int)(Math.random()*5) ); // целое число из [0;4]
System.out.println(Math.random()*5+3); // вещественное число из [3;8)
System.out.println( (int)(Math.random()*5+3)); // целое число из [3;7]
System.out.println( (int)(Math.random()*11)-5); // целое число из [-5;5]
Псевдослучайные числа имеют серьёзнейшие практические приложения и используются, например, в криптографии.
