Математические и специальные операторы

 

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

Оператор Действие
+ Сложение двух значений
- Вычитание из одного значения другого
* Умножение двух значений

 

Разумеется, операторы эти могут использоваться как с числовыми значениями, так и с переменными – и порядок выполнения действий в сложных выражениях точно соответствует порядку выполнения действий, принятому в математике.

 

Аналогичным образом используются и скобки – только в языке Java, в отличие от математики, для записи сложных выражений используются только круглые скобки.

 

Гораздо сложнее обстоит дело с, казалось бы, простым оператором деления – это действия в языке Java обозначается символом "наклонная черта" (/), а также символом "процент" (%). Нередко можно встретить такие определения: оператор деления (/) и оператор вычисления остатка (%). Как видите, действие деления оказывается очень "многоликим" и далеко не всегда и в самом деле является оператором деления; все зависит от того, с переменными (и значениями) какого типа он используется!

 

Эта "многоликость" является источником многочисленных ошибок – в тех, разумеется, случаях, когда при написании класса забывают о необходимости точно представлять, какое из действий, обозначаемых символом "наклонная черта" придется иметь дело.

 

Рассмотрим в качестве примера следующий фрагмент класса (программный блок, набор кодов – можно использовать разные термины):

 

int a=reader.nextInt();

int b=2;

int c=a/b;

System.out.println(c);

 

Этот фрагмент будет давать для одних данных "ожидаемые" результаты, а для некоторых – вроде бы "неожиданные".

 

· При введении с клавиатуры (для переменной а) значения 4 – на экран выводится значение 2.

· При введении с клавиатуры (для переменной а) значения 5 – на экран выводится тожезначение 2.

 

Все дело в том, что при использовании с переменными только типа "целое число" знак "наклонная черта" (/) является оператором "вычисление частного", а вовсе не оператором "деление".

 

А теперь изменим этот фрагмент так, чтобы он выглядел следующим образом:

 

double a=reader.nextInt();

double b=2;

double c=a/b;

System.out.println(c);

 

Оказывается, работа, то есть исполнение фрагмента становится заметно иным!

 

· При введении с клавиатуры (для переменной а) значения 4 – на экран выводится значение 2.0

· При введении с клавиатуры (для переменной а) значения 5 – на экран выводится значение 2.5

 

Все дело в том, что в этом случае знак "наклонная черта" (/) действительно является оператором "деление".

 

В случае же использование переменных и значений разных типов то, какое действие будет выполнять знак "наклонная черта" (/), будет зависеть от комбинации переменных и использования операторов приведения типов…

 

Как видите, один и тот же символ ("наклонная черта") при всех своих использованиях так или иначе связан с операцией деления (ведь вычисление частного производится тоже в результате деления), однако значения, которые получаются в результате его использования, могут численно отличаться друг от друга.

 

Все это просто необходимо иметь в виду каждый раз, когда вы собираетесь использовать этот знак – и заранее, еще до написания кодов, четко себе представлять, какой из результатов вы хотите получить: "настоящий результат деления" или "частное от деления".

 

Кроме того, в языке Java имеются специальные (дополнительные) операторы для выполнения математических действий.

 

Оператор Действие Пример и объяснение
++ Увеличение значения переменной на 1 int х=reader.nextInt(); x++;   Если х получил с клавиатуры значение 6, то после выполнения оператора ++ переменная будет иметь значение 7  
-- Уменьшение значения переменной на 1 int х=reader.nextInt(); x--;   Если х получил с клавиатуры значение 6, то после выполнения оператора -- переменная будет иметь значение 5  
+= Увеличение значения переменной на значение, записанное после знака = int х=reader.nextInt(); x+=10;   Если х получил с клавиатуры значение 6, то после выполнения оператора +=10 переменная будет иметь значение 16  
-= Уменьшение значения переменной на значение, записанное после знака = int х=reader.nextInt(); x-=10;   Если х получил с клавиатуры значение 16, то после выполнения оператора -=10 переменная будет иметь значение 6  
*= Увеличение значения переменной в число раз, равное значению, записанному после знака = int х=reader.nextInt(); x*=10;   Если х получил с клавиатуры значение 6, то после выполнения оператора *=10 переменная будет иметь значение 60  
/= Деление (или вычисление частного) значения переменной на значение, записанное после знака = int х=reader.nextInt(); x/=10;   Если х получил с клавиатуры значение 67, то после выполнения оператора /=10 переменная будет иметь значение 6  
%= Вычисление остатка при делении значения переменной на значение, записанное после знака = int х=reader.nextInt(); x%=4;   Если х получил с клавиатуры значение 6, то после выполнения оператора *=10 переменная будет иметь значение 2  

 

 

Разумеется, все эти операции можно записать в ином, без специфики языка Java, виде:

· х++ можно записать как х=х+1;

· х-- можно записать как х=х-1;

· х+=10 можно записать как х=х+10;

· х-=10 можно записать как х=х-10;

· х*=10 можно записать как х=х*10;

 

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

 

И хотя любой оператор с присваиванием с точки зрения получаемого результата эквивалентен выполнению соответствующей операции с последующим присваиванием, но работает он обычно быстрее.

 

В самом общем виде типичная для языка Java "сокращенная" форма записи строится следующим образом:

 

Существует одна особенность, связанная с использованием этих специальных операторов для изменения значения не одной и той же переменной, а разных переменных. Особенность эта связана с тем, где записывается указание на изменение – до или после переменной (пользуясь профессиональной терминологией: префиксная или постфиксная форма записи).

 

Вид блока команд Что выводится на экран? Объяснение
int a=6,b; b=a++; System.out.println(a+" & "+b);   7 & 6 Во второй строке переменная b сначала получает от переменной а значение 6 – и только потом значение переменной а увеличивается на 1
int a=6,b; b=++a; System.out.println(a+" "+b); 7 & 7 Во второй строке сначала значение переменной а увеличивается на 1, а только потом это увеличенное значение получает переменная b

 

Иными словами:

· команда b=a++; эквивалента командам b=a; a=a+1;

· команда b=++a; эквивалента командам a=a+1; b=a;

 

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

 


 

 

Раздел №7.
Вычисление частного и остатка

 

В одной из предыдущих тем мы уже рассматривали особенности работы в языке Java оператора, обозначаемого знаком "наклонная черта" (/). Там мы говорили о том, что этот знак может означать и операцию вычисления частного (при делении одного целого числа на другое), и операцию "истинного деления" (если используются переменные типа "десятичные дроби" – double или float).

 

В языке Java существует и оператор, который вычисляет математический остаток, который образуется при делении одного числа на другое. Обозначается этот оператор знаком "процент" (%).

 

Например, при выполнении следующего фрагмента класса (блока):

 

int a=7;

int b=5;

int c=a % b;

 

переменная с будет получать значение 2 – то есть остаток от деления 7 на 5.

 

Операторы / (вычисление частного) и % (вычисление остатка) связаны с несколькими чрезвычайно широкими группами задач, часть из которых происходят из "жизненной практики", а часть – из "хитрой математики".

 

К первой группе можно отнести, например такую задачу: "При выезде группы школьников на экскурсию администрация должна заказать нужное число автобусов. Напишите класс, который принимает с клавиатуры количество школьников, которые должны выехать на экскурсию, и определяет число автобусов, которые следует заказать. Известно, что в каждом автобусе имеется 40 мест для учеников".

 

Ко второй группе задач относятся такие, которые можно назвать "разложение целого числа на составляющие его числа или цифры". Это, например, такая задача: "Напишите класс, который принимает с клавиатуры целое трехзначное число и определяет, является ли произведение первой и последней его цифр (числа единиц и числа сотен) больше квадрата его средней цифры (числа десятков)".

 

Еще одна группа задач, в которых ключевым является определение остатка при делении, это те задачи, в которых требуется проверить, делится ли одно число на другое. Во всех этих случаях мы используем математическое правило "Число а делится на число b, если остаток при делении а на b равен нулю". А это означает необходимость вычисления остатка при делении, что и позволяет сделать оператор "процент" (%).

 

Для второй группы задач ("разложение целого числа на составляющее") особенно значение имеет использование степеней 10, то есть значений 10, 100, 1000, 10000 и так далее. Для пояснения приведем несколько конкретных числовых примеров.

 

Число Частное от деления числа на… Остаток от деления числа на…

При внимательном изучении таблицы можно сделать следующие общие выводы (они, собственно, понятны и из математики, просто мы сформулируем их в более "подходящем" для компьютерных наук виде):

· операция "вычисление частного при делении на 10" всегда "укорачивает" число на последнюю цифру;

· операция "вычисление частного при делении на 100" всегда "укорачивает" число на две последних цифры;

· операция "вычисление частного при делении на 1000" всегда "укорачивает" число на три последних цифры

· и так далее…

 

· операция "вычисление остатка при делении на 10" всегда "возвращает" одну последнюю цифру;

· операция "вычисление остатка при делении на 100" всегда "возвращает" две последних цифры;

· операция "вычисление остатка при делении на 1000" всегда "возвращает" три последних цифры;

· и так далее…

 

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

 

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