Урок J-13. Арифметические операторы и математика в Java.

В уроке 8 мы затронули логические операторы, они нам были необходимы для формирования логического выражения в условиях if. Этот урок будет посвящен математике в Java, и поэтому мы рассмотрим подробнее арифметические операторы и  частично возможности класса Math.

Но для начала, выясним, что же такое операторы. Операторы это специальные символы, отвечающие за ту или иную операцию, например сложение, умножение, сравнение. Все операторы в Java можно разбить на 4 класса — арифметические, битовые, операторы сравнения  и логические. 

Арифметические операторы в Java

Для стандартных арифметических операций, таких как сложение, вычитание, умножение, деление в Java используются традиционные символы, к которым мы привыкли со школы:

int a, b;
int sum = a + b;
int sub = a - b;
int mult = a * b;
int div = a / b;

Примечание: при операции деления, если оба аргумента являются целыми числами, то в результате получим целое число. Дробная часть, если такая имеется, отбросится. Если хотим получить число с дробной частью, то нужно, чтобы один из аргументов был типа double. Это можно указать в самом выражении при помощи добавления после числа .0 или .d. Пример:

System.out.println (18 / 5); // на консоль выведет число 3
double div = 18 / 5;
System.out.println (div); // на консоль выведет число 3.0
System.out.println (18.0 / 5); // на консоль выведет число 3.6
System.out.println (18 / 5.d); // на консоль выведет число 3.6

В Java также имеется специальный оператор %, обозначающий остаток от делния.

int mod;
mod = 15 % 10; // остаток от деления 15 на 10 равно 5, mod = 5
mod = 16 % 2; // mod = 0
mod = 82 % 9; // mod = 1

Пример использования: дан массив целых чисел, вывести на консоль только те числа, которые делятся на 3.

int[] intArr = {9, 1, 3, 2, 7, 4, 6};
for(int i=0; i< intArr.length; i++){
	if(intArr[i] % 3 == 0){
		System.out.print(intArr[i] + " ");
	}
}

Операции с присваиванием

Рассмотрим задачу вывода на экран 10 первых четных чисел чисел

int count=0;
for(int i = 0; i <= 10; i++){
	count = count + 2;
	System.out.println(count);
}

строку

count = count + 2;

мы можем записать сокращенно

count += 2;

+= это оператор сложения с присваиванием. Подобные операторы есть для всех основных 5 операций, рассмотренных выше

int a = 5;
int sum += a; // эквивалентно sum = sum + a;
int sub -= a; // эквивалентно sub = sub - a;
int mult *= a; // эквивалентно mult = mult * a;
int div /= a; // эквивалентно div = div / a;
int mod %= a; // эквивалентно mod = mod % a;

Пример использования: Найти факториал числа 7.

int n = 7;
int result = 1;
for(int i = 1; i <= n; i ++){
	result *= i; 
}
System.out.print(result);

Инкрементирование и декрементирование

Инкремент, обозначается ++ и увеличивает значение переменной на единицу. Декремент обозначается — и уменьшает значение на единицу. С инкрементом и декрементом мы часто встречаемся в цикле for.

Инкремент  и декремент бывают двух форм

Префиксная форма:

int k = 3;
++k; // k = 4
--k; // k = 3

Постфиксная форма

int k = 3;
k++; // k = 4
k--; // k = 3

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

int a = 3, b = 3;
int prefix = 15 / 3 - ++a; // итог prefix = 1 
int postfix = 15 / 3 - b++; // итог postfix = 2

В первом случае сначала переменная a увеличится на 1, потом произойдет вычисление всего выражения. Во втором случае произойдет вычисление выражения при старом значении b = 3, и после вычисления b увеличится на 1, на результат в postfix это уже не повлияет.

int a = 3, b = 3;
System.out.println(++a);// на консоль выведет 4
System.out.println(b++);//на консоль выведет 3

Если вы поняли принцип работы постфиксного и префиксного инкремента/декремента, то предлагаю решить в уме такую задачу:

int x = 3, y = 3;
x = x++ + ++x;
y = --y - y--;

Вопрос: чему в итоге равны x и y? После того, как вы сделали предположение, проверьте его в java.

Задача со зведочкой.  Дан код:

int i = 1;
i = i++ + (( i > 2 )? i++: (i++ * i++)) + i++ ;
System.out.println(i);
i = 2;
i = i++ + (( i > 2 )? i++: (i++ * i++)) + i++ ;
System.out.println(i);

Какие числа будут выведены на экран? Почему? Разобраться самостоятельно.

Примечание: инкремент и декремент применяются только к переменной.  Выражение вида 7++  считается недопустимым.

Математические функции и константы (класс Math)

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

import static java.lang.Math.*;

Часто используемые математические функции

  • sqrt(a) — извлекает квадратный корень из числа а.
  • pow(a, n) —  a возводится в степень n.
  • sin(a), cos(a), tan(a) — тригонометрические функции sin, cos и tg угла a указанного в радианах.
  •  asin(n), acos(n), atan(n) — обратные тригонометрические функции, возвращают угол в радианах.
  • exp(a) — возвращает значение экспоненты, возведенной в степень a.
  • log(a) — возвращает значение натурального логарифма числа a.
  • log10(a) — возвращает значение десятичного логарифма числа a.
  • abs(a) — возвращает модуль числа a.
  • round(a) — округляет вещественное число до ближайшего целого.

Константы

  • PI — число «пи», с точностью в 15 десятичных знаков.
  • E — число «e»(основание экспоненциальной функции), с точностью в 15 десятичных знаков.

Примеры

System.out.println(sqrt(81));// выведет 9.0 
System.out.println(pow(2,10));// выведет 1024.0 
System.out.println(sin(PI/2));// выведет 1.0 
System.out.println(cos(PI));// выведет -1.0
System.out.println(acos(-1));// выведет 3.141592653589793
System.out.println(round(E));// выведет 3
System.out.println(abs(-6.7));// выведет 6.7

Упражнения 

  1. Дан массив целых чисел, найти среди элементов массива числа, которые делятся на 3 и на 6
  2. Посчитать среднее арифметическое чисел в массиве
  3. Известны катеты прямоугольного треугольника, найти его площадь и периметр
  4. Даны два целых числа, найти их наибольший общий делитель и наименьшее общее кратное
  5. Даны радиус вращения и высота конуса, вычислить объем конуса.

Комментарии и пинги к записи запрещены.

Комментариев к записи: 13

  1. MerzZly:

    Почему в выражении y = —y — y—; decrement со знаком минуса не срабатывает, а с плюсом работает?

    • Мария (admin):

      не знаю почему у вас не срабатывает.. все должно срабатывать.

      • MerzZly:

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

  2. Юра:

    Здравствуйте! Вот выполненные все задания :)
    http://pastebin.com/Q6aJY39p

    • Мария (admin):

      Здравствуйте,
      в первом задании можно было 1 цикл использовать с условием if(arr[i]%3==0 && arr[i]%6==0) Проверку на >0 делать не обязательно. При поиске среднего арифметического можно бы было сразу работаться типом double. 4 задание не учтен случай, если числа равны. Еще как вариант, в случае n2>n1, можно значения n2 и n1 поменять местами, чтобы не писать потом один и тот же код 2 раза.

  3. Юрец:

    Мария спасибо, за этот проект! У вас есть талант преподавания! Скажите проект будет до конца бесплатным, или как большинство, до определенного момента? И на каком этапе можно идти пытать силы устроиться жуниором?

    • Мария (admin):

      Курс по основам точно будет бесплатный (под основами подразумеваю синтаксис и принципы ООП), потом — не знаю, еще не решила каким образом буду монетизировать проект. По жуниору посмотрите тут написаны требования http://www.quizful.net/job-role/junior-java-developer

  4. Александр:

    Добрый день Мария!Если в первом задании использую if(arr[i]%3==0 && arr[i]%6==0),то выдает только числа которые деляться на 6
    http://pastebin.com/V2h5Dv0u

    • Мария (admin):

      Все верно, при таком условии у вас будут выводиться числа, которые одновременно делятся на 3 и на 6, то есть все, которые делятся на 6, ведь все они будут делиться и на 3. Если вы хотите, чтобы выводились числа, которые делятся на 3 или на 6 нужно использовать оператор или ||

Все материалы сайта study-java.ru являются результатом труда его авторов. Копирование материалов в некоммерческих целях без указания источника в виде прямой ссылки на сайт study-java.ru запрещено. Использование материалов в коммерческих целях разрешено только с письменного согласия автора. Нарушение авторских прав преследуется по закону.