Операции и вычисления играют чуть ли не самую главную роль в программировании. Это команды, которые позволяют управлять значениями, выполнять арифметические действия и управлять ходом программы. Давайте рассмотрим самые частые операторы Java для того, чтобы вы научились их применять в выражениях в своих программах.
Сложение строк
В первую очередь хочу поведать про сложение строк (это ещё в узких кругах называют конкатенацией). Эта операция не подразумевает именно математических вычислений – она просто позволяет “собрать” из нескольких элементов целую строку. Например, у нас есть переменная типа int, хранящая количество долларов. Мы хотим получить строку, где будет написано “Баланс”, это число плюс символ валюты. Как это сделать?
1 2 3 4 5 6 7 8 |
public class FirstProject { public static void main(String[] args) { int dollars = 85; String dollarStr = "Ваш баланс: " + dollars + "$"; System.out.println(dollarStr); } } |
В итоге выведена будет строка, содержащая все эти три элемента. Переменная dollarStr типа String хранит в себе значение “Ваш баланс: 85$“.
Строки можно складывать со строками, с примитивными типами и с объектами. В любом случае, сложение происходит со строковым представлением тех переменных, с которыми мы пытаемся сложить строку.
Арифметические операции
Как и в обычной всем известной математике, в Java присутствуют операции сложения (+), вычитания (-), умножения (*) и деления (/). Также существует оператор взятия остатка от деления (%). Однако лучше 1 раз увидеть код, чем 100 раз услышать его описание, поэтому примеры в студию.
1 2 3 4 5 6 7 8 9 10 11 |
public class FirstProject { public static void main(String[] args) { int whiteChess = 16; int blackChess = 16; int chessAtAll = whiteChess + blackChess; String chessResult = "Всего шахмат на доске: " + chessAtAll + " (" + whiteChess + " белых, " + blackChess + " чёрных)"; System.out.println(chessResult); System.out.println(); } } |
В переменной whiteChess хранилось число 16, аналогично в blackChess. В итоге переменная chessAtAll стала вместилищем их суммы – то есть 32. Столько шахмат на шахматной доске в начале игры, когда ещё никто никого не сбил.
В строчке с объявлением String chessResult видно, что содержимое переменной слишком длинное. Поэтому оно было перенесено на вторую строчку. В соглашении о кодировании рассказано, как правильно переносить длинные строки. Вдобавок там говорится, что каждая операция (до ; ) должна быть на отдельной строке. То есть не следует втискивать 3 операции на одну строку, даже если по длине они короткие.
Можно выполнять вполне конкретные операции, как мы с вами сейчас делаем. Однако иногда программы требуют некоторой случайности (например, случайный цвет). В таком случае применяется генерация случайных чисел.
Теперь рассмотрим расчёт результатов прохождения теста.
1 2 3 4 5 6 7 8 9 10 11 |
public class FirstProject { public static void main(String[] args) { int questionCount = 21; int correctAnswers = 17; double testResultInPercents = (correctAnswers * 1.0 / questionCount) * 100; String testResult = "Правильные ответы: " + correctAnswers + "/" + questionCount + ". Результат: " + testResultInPercents + "%"; System.out.println(testResult); System.out.println(); } } |
В переменной questionCount хранится 21 – общее число вопросов теста. Переменная correctAnswers указывает, что правильных ответов было дано 17. В итоге, если разделить одно на другое и умножить на 100%, получим примерно 80.95% (в программе не выполнялось округление).
Если вы приглядитесь к коду деления, то заметите один нюанс. Это очень важный нюанс для деления целых чисел в программировании. Не один и не два программиста попадались на эту ловушку. Они ломали голову, почему их программа делает не то, чего от неё ожидают. Если просто разделить целое число на целое, например, 20 на 3, то и результат тоже будет целым – 6. Для того, чтобы было произведено реальное деление дробных чисел, нужно хотя бы одно из чисел сделать дробным. Как? Да хоть как в примере – домножить на 1.0 – вполне себе дробное число. Да, “correctAnswers * 1.0 / questionCount” написано именно так для этой цели. Мы как бы сообщаем компилятору, что хотим видеть деление вещественных чисел.
Следующий пример покажет, как работать с остатком от деления. Помимо этого, в нём также показано, как делить целые числа без дробной части. Будем делить конфеты между ребятишками. Для этого нужно большое математическое выражение. Части этого выражения вынесем в отдельные операции и получится код:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class FirstProject { public static void main(String[] args) { int sweetsCount = 100; int sweetsTeacherAte = 2; int sweetsForChildren = sweetsCount - sweetsTeacherAte; int childrenInClass = 12; int sweetsForEachChild = sweetsForChildren / childrenInClass; int sweetsLeft = sweetsForChildren % childrenInClass; System.out.println("Всего в классе " + childrenInClass + " ребят, а конфет " + sweetsCount + "."); System.out.println("Учитель съел пару конфет (" + sweetsTeacherAte + "), и осталось " + sweetsForChildren + "."); System.out.println("Каждому ребёнку достанется по " + sweetsForEachChild + ", а останется лишних " + sweetsLeft + "."); } } |
С помощью целочисленного деления получилось узнать, что каждому из 12 ребят в классе достанется по 8 целых конфет. Не станет же учитель линейкой разрезать конфеты. Так как их изначально было 100, а после трапезы учителя стало 98, то лишних конфет останется 2. Кому они потом там достанутся – это уже не наша ответственность.
С помощью трёх примеров нам удалось попробовать различные математические операции. Это были сложение, вычитание, умножение, деление (как дробное, так и целочисленное), а также взятие остатка.
Сокращённые операции
Программисты любят простоту. А потому они стараются сократить количество необходимого к написанию кода. Для некоторых операций существуют более короткие формы записи, с которыми мы сейчас с вами познакомимся. В следующих двух примерах код выполняет абсолютно одинаковые операции – отличается лишь форма записи. Первая – короче. Вы, конечно, можете использовать и вторую поначалу, но первая гораздо более распространена и удобна.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class FirstProject { public static void main(String[] args) { int number = 0; number++; System.out.println(number); number += 10; System.out.println(number); number--; System.out.println(number); number /= 2; System.out.println(number); number -= 1; System.out.println(number); number *= 3; System.out.println(number); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class FirstProject { public static void main(String[] args) { int number = 0; number = number + 1; System.out.println(number); number = number + 10; System.out.println(number); number = number - 1; System.out.println(number); number = number / 2; System.out.println(number); number = number - 1; System.out.println(number); number = number * 3; System.out.println(number); } } |
Сначала number был 0. К нему прибавили 1, и получилось 1. Затем прибавили 10, стало 11. Отняли 1, вышло 10. Разделили на 2, оказалось 5. Отняли ещё 1, осталось 4. Под конец умножили на 3, чтобы получить 12.
Сокращение ++ называют инкрементом, а — декрементом.
Короткая форма записи операций позволяет оставлять код понятным, делая его короче – а это, по существу, отличный результат.
Операции и вычисления — это, мягко говоря, сердце программирования. Теперь, когда вы освоили эту информацию, у вас есть надёжная база для создания более сложных и увлекательных программ на языке Java.