Прежде чем описать процесс работы присваиваний и арифметических операций, введем понятие алгоритма и программы.
Согласно ГОСТ 34.003-90, алгоритм – конечный набор предписаний для получения решения задачи посредством конечного количества операций [1].
Иначе говоря, алгоритм представляет собой точное описание процесса выполнения какой-либо задачи. Простым примером алгоритма является рецепт приготовления какого-либо блюда – это последовательность действий, в результате которой из продуктов получается готовая пища.
С точки зрения информационных технологий, можно ввести иное определение алгоритма. Алгоритм (algorithm) – это формально описанная вычислительная процедура, получающая исходные данные (input), называемые также входом алгоритма или его аргументом, и выдающая результат вычислений на выход (output) [2].
Под компьютерной программой же мы будем понимать реализацию алгоритма с помощью средств языка программирования. Создавая программу, мы решаем ту или иную задачу, которая может быть описана в форме алгоритма.
Для того, чтобы программа (и алгоритм) решали поставленную перед ней задачу, она тем или иным оперирует с доступными её данными. В достаточно грубой формулировке данные для работы программы располагаются в памяти компьютера и представляются в программе с помощью переменных.
Согласно ГОСТ 28397-98, переменная – языковый объект, который может принимать различные значения. Приведем аналогию на примере решения арифметического уравнения.
Пусть дано уравнение:
(1)
Здесь – неизвестная величина, корень уравнения, которая также называется переменной. Очевидно, что
– некоторое число (для нашего уравнения это 9), которое записано в виде символа.
Мы можем заменить и другие числа в данном уравнении на символы. Пусть:
Тогда мы можем записать исходное уравнение в следующем виде:
(2)
Опишем теперь процесс решения уравнения с помощью алгоритма. Будем описывать процесс решения с помощью формул, которые мы будем получать из уравнений (1) и (2).
Прежде всего перенесем известные величины в правую часть со сменой знака. В (1) это число 17, а в (2) это символ c:
Теперь мы можем провести вычитание в правой части. Пусть результат этого действия будет также в процессе описания алгоритма вычисления (2) представлен как d:
Очевидно, что:
Остается только выразить x и найти тем самым корень уравнения:
Очевидно, что (1) является частным случаем (2): если на месте a, b и c подставить другие значения, то получится другое уравнение, которое, тем не менее может быть решено с помощью описанного нами алгоритма.
С точки же зрения программирования, мы объявили переменные a, b и c и присвоили им значения. После этого мы провели ряд вычислений и их результат присвоили переменной x.
Введем, наконец, определения объявления и присваивания.
Согласно ГОСТ 28397-89, объявление – это соглашение о характеристике языкового объекта или выполняемом действии при отсутствии их явного описания.
В случае переменных это обозначает, что утверждаем, что переменная существует и имеет определенный тип данных.
Согласно этому же ГОСТу, присваивание – это механизм придания значения переменной в языке программирования.
В нашем случае присваивание значит то, что переменная получит какое-либо значение.
Закончим ввод определений понятием типа данных.
Снова обратившись к ГОСТу, мы обнаружим следующее определение:
тип данных - множество значений вместе с множеством допустимых над ними операций.
В случае программирования мы имеем ввиду следующее:
1. все данные в программе могут быть тем или иным образом классифицированы – например, символы, целые числа, дробные числа и т.д.;
2. каждый тип данных имеет ряд операций, которые можно проводить над объектами этого типа: например, числа можно складывать, вычитать, умножать и т.д.
Объявление переменной на языке Java имеет следующий вид:
Рассмотрим эту конструкцию.
1. Сперва записывается список модификаторов – ключевых слов, которые могут добавить дополнительные свойства для переменной: например, модификатор final запрещает дальнейшее изменение переменной. Важно: модификаторы не являются обязательными прим объявлении, а потому их может и не быть!
2. Затем записывается тип данных переменной. Подробнее с типами данных мы познакомимся ниже.
3. После типа данных записывается имя переменной – последовательность символов, по которой разработчик сможет понять, с какой переменной он работает.
4. Команда заканчивается точкой с запятой.
Конструкция присваивания имеет следующий вид:
Рассмотрим эту конструкцию.
1. Сперва записывается имя той переменной, котором мы собираемся присвоить значение.
2. После имени записывается знак «=».
3. После знака «=» записывается само значение переменной.
4. Команда заканчивается точкой с запятой.
Важно: объявление и присваивание могут быть записаны в виде одной команды:
Рассмотрим, как это выглядит на примере.
Листинг 1 – Объявления переменных
int a;
float b;
double c, d, e; byte f = 1; e = 2.2; long g, h = 202;
final String s = "FINAL";
В строке 1 листинга 1 мы видим объявление целочисленной переменной a. Сперва записан тип данных int, затем имя переменной. Операция (как и почти все другие операции в Java) заканчивается точкой с запятой.
В строке 2 мы видим аналогичное объявление переменной b типа float – числа с плавающей запятой (дробного числа – ознакомьтесь с понятием плавающей запятой самостоятельно).
В строке 3 представлено объявление нескольких переменных типа double. Переменные перечислены через запятую.
В строке 4 показано одновременной объявление переменной и присваивание ей значения. Как и в случае объявления, сперва записывается тип данных, затем имя, после чего пишется знак «=», после чего записывается присваиваемое значение.
В строке 5 показано присваивание значения переменной. Слева от знака «=» записывается имя переменной, справа – присваиваемое значение.
В строке 6 мы видим присваивание значения переменной во время их перечисления. Синтаксис такого действия во многом аналогичен предыдущим.
Наконец, в строке 7 записано одновременное объявление и присвоение значения строковой переменной s с модификатором final. Сперва записан модификатор, затем тип данных, затем имя переменной. После этого записан знак «=», после чего записано значение переменной.
Опишем теперь типы данных, доступные в языке Java.
Типы данных в Java могут быть разделены на две большие группы:
1. примитивные;
2. ссылочные.
Примитивные типы данных – это 8 простейших типов данных, которые должны быть инициализированы (иметь присвоенное значение) перед использованием. К ним относятся:
· byte;
· short;
· int;
· long;
· float;
· double;
· boolean;
· char.
Примитивные типы данных имеют заданные размеры объектов (переменных) и ведут себя одинаково в различных реализациях Java. Разрядности и пределы числовых типов представлены в таблице 1.
Таблица 1 – характеристики числовых примитивов
Тип | Разрядность | MIN | MAX |
byte | 8 бит | -128 | |
short | 16 бит | -32768 | |
int | 32 бит | -2147483648 | |
long | 64 бит | -9223372036854775808 | |
float | 32 бит | -3.4E+38 | 3.4E+38 |
double | 64 бит | -1.7E+308 | 1.7E+308 |
Тип данных boolean имеет только два доступных значения: true и false. Этот тип не является числовым – в отличии от, например языка C++, где за ложь отвечает 0, а за истину другое число, в Java тип boolean не представляется с помощью чисел, а его размер зависит от виртуальной машины.
Тип данных char представляет собой представление 16-битного символа Юникода. Этот тип может быть представлен с помощью числа и может быть задействован в арифметических операциях.
Важно: имея ввиду понятие «символ», мы подразумеваем не только те символы, которые нам видны, но также и рядом управляющих символов:
· ‘\n’ – перенос строки;
· ‘\t’ – табуляция;
· ‘\r’ – перемещает каретку (позицию печати) в крайнюю левую позицию строки без перехода на новую строку;
· и т.д.
Рассмотрим пример присваивания значения типа char на примере листинга 2.
Листинг 2 – Объявления символов
char a=’a’;
char b=97;
В строке 1 показана первая форма присвоения записи символа «a» переменной a. Символы отмечаются одинарными кавычками.
В строке 2 показано представление символа «a» в виде числа. Это возможно в силу того, что символы закодированы с помощью таблиц кодировок (рассмотрите это понятие самостоятельно).
Ссылочные типы имеют отличную от примитивов природу. Объекты данных типов не имеют строго заданного размера и могут быть использованы после их объявления, но до их инициализации.
Важно: названия ссылочных типов данных в большинстве случаев начинаются с прописной (большой) буквы. Например: Scanner, String, PrintWriter.
Важным примером ссылочных типов данных является String.
String – строковой тип данных, представляющие собой последовательность символов. Рассмотрим пример присвоения строки:
Листинг 3 – Объявления строк
String s = "string";
String s2 = new String("String 2");
String s3 = new String();
System.out.print(s+"\n"+s2+"\n"+s3+"\n");
Важно: строковые значения помещаются в двойные кавычки, как это показано в первой строке листинга 3.
В строках 2 и 3 показано создание строки с помощью оператора new (аналогично созданию сканера)– подробнее об этом будет рассказано в модуле 2.
Важно: строка 3 корректна – мы не указали, какое значение должна принять строка, поэтому она примет значение по умолчанию – пустая строка.
В строке 4 показан вывод трех строк с помощью символа перевода строки и команды System.out.print. Аналогичный вывод можно было бы получить, выведя каждую строку отдельно с помощью команды System.out.println (проверьте это самостоятельно).
Важно: для строк определена операция сложения, называемая конкатенацией. При её выполнении к концу первой строки дописывается вторая строка. Синтаксис сложения строк аналогичен сложению чисел. Другие арифметические операции для строк не определены.
Арифметические операции в Java:
· сложение;
· вычитание;
· умножение;
· деление;
· остаток от деления (деление по модулю).
Как правило, результат выполнения арифметических операций заносится в переменную, как это показано в листинге 4.
Листинг 4 – Примеры арифметики
int x = 4+3;
int b;
b = 7*x;
Кроме того, имеются сокращенные записи арифметических команд для случая, когда результат арифметической операции над переменной сохраняется в ту же переменную.
Таблица 1 – характеристики числовых примитивов
Операция | Обычная запись | Сокращенная запись |
Сложение | int a=a+b; | a+=b; |
Вычитание | int a=a-b; | a-=b; |
Умножение | int a=a*b; | a*=b; |
Деление | int a=a/b; | a/=b; |
Деление по модулю | int a=a%b; | a%=b; |
Важно: работа с арифметикой требует внимательности. Если результат арифметической операции будет иметь дробную часть, то при попытке сохранения его (результата) в целочисленную переменную эта дробная часть будет потеряна. Например:
Листинг 5 – Пример потери точности
int x = 7/2;//сохранится 3, будет потеряно 0.5
Типы могут быть приведены к другим. Схема приведения типов представлена на рисунке 1.
Рисунок 1 – Схема приведения типов
Типы с меньшей размерностью приводятся к типам с большей размерностью автоматически:
Листинг 6 – Пример автоматического приведения типов
float x=1;
double y=x;
Типы с большей или равной размерностью могут быть приведены требуемым вручную. Это связано с тем, что при таких приведениях возможна потеря данных – например, дробной части числа. Кроме того, приведение дробного числа к целому всегда производится вручную по той же причине:
Листинг 7 – Пример автоматического приведения типов
float x=1;
long y=(long) x;
Важно: ни один из типов не может быть приведен к типу boolean т.к. он имеет особое представление в памяти. Тип boolean не может быть приведен ни к одному из примитивных типов. Все типы могут быть приведены к типу String (не отображено на схеме). Простейший способ сделать это: выполнить сложение строки (String) и переменной другого типа с сохранением в переменную типа String, например, так:
Листинг 8 – Приведение к строке
String x = “Answer: “+(1+2);
Задание: повторить материал презентаций и учебника ИТ-школы, выполнить задания (включая доп. задания) пунктов 1.2; задачник «1000 задач по программированию», том 1, блок Integer – минимум 7 задач.