Обработка данных примитивных типов

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

Поскольку основной целевой аудиторией задач всё-таки являются начинающие, комментарии к решениями довольно подробны.

Задача 1

Дана любая строчная буква английского алфавита. Буква может быть введена пользователем или закодирована в текст программы. Программа должна вывести в консоль все оставшиеся буквы до z включительно. Если введено z, то вывести просто z.

Решение задачи базируется на целочисленной сущности типа char. То есть на том факте, что char — это целое число, являющееся кодом позиции символа в таблице символов. К счастью, символы в таблице расположены в алфавитном порядке, поэтому, например, если у нас есть код символа 'a', то увеличив его на 1, мы получим код символа 'b'.

Таким образом, чтобы вывести все символы до 'z' достаточно увеличивать позицию символа на единицу, пока не будет достигнута позиция символа 'z'.

При этом как-то выяснять конкретные номера позиций не нужно. Приведём пример решения, в котором для простоты опустим ввод пользователя и проверку исходных данных.

char c = 'a';
while (c <= 'z') {
System.out.print(c);

с++;
}

Выведет: abcdefghijklmnopqrstuvwxyz

Вывод в консоль и инкремент переменной можно объединить в одну инструкцию: System.out.print(c++); В этом случае, поскольку оператор инкремента ++ стоит после переменной, то сначала будет прочитано текущее значение переменной (в первой итерации — 'a') и отправлено на консоль. И только затем значение будет увеличено на единицу.

Задача 2

Напишите код, записывающий в целочисленные переменные два числа. Затем запишите отношение суммы к произведению (то есть поделите сумму на произведение) значений этих переменных в третью переменную, выведите результат в консоль.

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

Если потеря данных неприемлема, то результат нужно сохранить в переменную типа double. Хотя у этого типа также есть ограничения точности, но потери в общем случае несоизмеримо меньше, чем простое отбрасывание цифр после запятой. Код решения может выглядеть, например, так:

int a = 10;
int b = 20;

int x = (a + b) / (a * b);
double y = (double) (a + b) / (a * b);

System.out.println("int x: " + x);
System.out.println("double y: " + y);

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

int x: 0
double y: 0.15

Обратим внимание на то, что делимое (a + b) обязательно должно быть в скобках, иначе сложение будет последней операцией всего выражения и результат будет другим (неверным). В то же время делитель (a * b) взят в скобки для наглядности.

Если мы хотим получить результат в виде double, то мы должны хотя бы один из операндов привести к double. В нашем примере мы привели к double результат сложения, но могли и результат умножения, а также просто a или b. Приведение, например, a к double повлекло бы за собой продвижение типов во всех следующих по цепочке операциях и итог также стал бы типом double.

Задача 3

Переменная типа double инициализирована каким-то значением. Напишите выражение, которое возвращает true, если в данной переменной целое число, и false, если переменная оказалась инициализированной числом с дробной частью.

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

В нашем же случае, если мы возьмём остаток от деления числа на 1, то получим всю его дробную часть. Например, выражение 1.5 % 1 вернёт 0.5. У целого числа остаток от деления на 1 всегда равен нулю. Итоговое решение может быть таким:

double x = 1.55;
System.out.println(x % 1 == 0);

В данном случае код выведет на консоль false, но если инициализировать x целым числом, то выражение в скобках вернёт true.

Задача 4

Дана переменная типа char со значением 'А' (заглавная кириллическая "А"). Выведите на экран строку с русским алфавитом, в такой форме: "Аа Бб Вв ... Яя". Подберите такой алгоритм, который будет вычислять все остальные символы, не используя других переменных. Пробел можно и не делать и писать буквы слитно.

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

Если мы выполним следующий код

System.out.println('а' - 'А');

то увидим, что символ 'а' находится на 32 позиции дальше, чем 'А'.

Если мы выполним такой код

char a = 'А';

System.out.println(++a);

то обнаружим, что символы в таблице расположены в алфавитном порядке.

Таким образом, довольно просто вычислить все символы русского алфавита и вывести их в консоль в том числе парами заглавных и строчных букв. Например, так:

char ch = 'А';


while (ch <= 'Я') {


System.out.print(ch); // Выведет 'А'

ch = (char) (ch + 32); // Получим 'а'

System.out.print(ch + " "); // Выведет 'а' с пробелом

ch = (char) (ch - 31); // Получим 'Б'

}

Задача 5

Напишите код, который определит, какой символ находится в позиции 100 в таблице символов.

Решение базируется на целочисленной сущности типа char. Каждая переменная этого типа представляет собой с одной стороны номер позиции символа в таблице символов, а с другой — сам символ.

Таким образом, достаточно присвоить переменной типа char целочисленное значение 100, но вывести её в консоль как обычный символ. Например, так:

char ch = 100;

System.out.println(ch); // Выведет d