Найти в Дзене

Крутой курс Java для "чайников". Урок 13.2. Разбор решений задач урока 13. Часть 1.

Бесплатный курс теории и практики по программированию на Java, рассчитанный на тех, кто изучает программирование с нуля.

Задача 1.1.

Как я и говорил, ничего сложного. Нужно 4 раза воспользоваться оператором вывода на экран. Получаем код для решения:

После компиляции и запуска получаем выведенный текст:

-2

Цель достигнута! Искомый текст выведен на экран.

Задача 1.2.

Как требует условие задачи объявляем 5 переменных строкового типа и присваиваем им значения.

String slovo1 = "Java";

String slovo2 = "самый";

и так далее...

Затем с помощью конкатенации составляем сложное выражение для вывода на экран и используем оператор вывода

System.out.println(slovo1 + " - " + slovo2 + " " + slovo3 + " " + slovo4 + " " + slovo5 + "!");

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

Получился такой вот код-решение:

-3

И такой результат выполнения программы:

-4

Задача 1.3.

Здесь нужно вспомнить какие данные к какому типу относятся. И это

12321 - целочисленный

345.543 - вещественный

Иван - строковый

'z' - символьный

false - логический

Осталось объявить переменные, присвоить им значения и вывести на экран с комментариями. Код следующий:

-5

После его исполнения получаем следующий результат:

-6

Задача 1.4.

Предлагаю использовать в этой задаче строковый тип данных.

Алгоритм решения - простейший.

1. Объявляем переменную и задаём её начальное значение.

2. Рисуем песочные часты с помощью оператора вывода на экран.

-7

В своём примере я задал символ "О". Вы можете задать любой другой символ.

Компилируем и запускаем

-8

Задача 2.1.

Вспоминаем, как создаются константы - с помощью ключевого слова final.

Поскольку число 3.14 не целое, выбираем тип константы - вещественный.

Создаём одну переменную, в которой будем хранить значение радиуса окружности. Пусть она будет, например, целочисленной. Но Вы можете использовать и другой числовой тип данных - на Ваше усмотрение. И присваиваем ей значение.

Можно создать ещё одну переменную для хранения в ней значения полученной длины окружности (конечно же вещественного типа). Но я обойдусь без неё.

Итак код для решения:

-9

После компиляции и запуска:

-10

В одном из теоретических уроков (а именно в 12-м в части 1) я обращал внимание на точность типа данных float. Если мы посчитаем длину окружности при радиусе 5 при условии, что число π округлено до двух знаков после запятой, то есть до 3,14 то результат вычисления длины окружности должен быть точным до сотых долей.

2 * 5 * 3,14 = 31,4.

Но в нашем случае видим погрешность в сумме две миллионных - 0,000002. Это как раз то, о чём я говорил.

Задача 2.2.

На самом деле эту задачу можно решить в том числе двумя следующими вариантами:

1. Можно для квадрата и для куба числа создать отдельные переменные, затем их рассчитать и вывести значения на экран.

2. Можно создать одну переменную, например, chislo. При выводе текста на экран указывать для вывода chislo, в следующей строчке chislo * chislo, в третьей строчке chislo * chislo * chislo - как в предыдущей задаче. То есть вообще не менять значения переменной chislo. И не создавать отдельные переменные под квадрат и под куб искомого числа.

Код для варианта 1

-11

Код для варианта 2

-12

Результат исполнения кода

-13

Результат одинаков при использовании любого из двух вариантов.

Задача 2.3.

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

Я воспользуюсь своей подсказкой и буду использовать для этой цели оператор остатка от деления по модулю.

Алгоритм и логика здесь следующие.

Допустим, у нас есть четырёхзначное число 5678.

Сначала решим, как получить значение первой цифры этого числа.

Один из вариантов - поделить число на 1000. Тогда мы получим результат 5,678.

Ага, число 5 получили с дробной частью. Теперь нужно от неё (дробной части) избавиться. Как это сделать? А это нужно сделать при помощи оператора вычисления остатка от деления.

Остаток от деления 5678 на 1000 равен 678. Но это в 1000 раз больше, чем нам нужно.

Поэтому если это число поделить на 1000, то мы получим искомые 0,678.

Итак 5,678 - 0,678 получаем нужную нам цифру 5. Теперь в виде формулы:

цифра 5 = 5678/1000 - (5678 % 1000) / 1000 = 5,678 - (678)/1000 = 5,678 - 0,678 = 5.

Фух! Придумали формулу для получения первой цифры. Теперь нужно придумать формулы для получения следующих цифр.

Как из числа 5678 получить 6? Сначала сделать из 5678 число 678. Как?Правильно. Применить %. То есть 5678%1000 = 678.

Теперь из числа 678 нам нужно получить 6. Сделаем это по такому же принципу, как мы получили цифру 5.

цифра 6 = 678/100 - (678%100)/100 = 6,78 - (78)/100 = 6,78 - 0,78 = 6.

Дальше по такому же принципу получаем 3-ю цифру. Делаем из 678 число 78. И

цифра 7 = 78/10 - (78%10)/10 = 7,8 - (8)/10 = 7,8 - 0,8 = 7.

С последней цифрой нет смысла заморачиваться, получим её из числа 78 и успокоимся на этом

8 = 78%10 = 8.

Теперь в виде искомой части кода. Нам потребуются 5 целочисленных переменных. Допустим, искомое четырёхзначное число мы обзовём a. Значение его первой цифры - a1, второй цифры - a2, третьей цифры - a3, четвертой цифры - a4.

int a = 5678;

int a1;

int a2;

int a3;

int a4;

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

a1 = a / 1000 - (a % 1000) / 1000;

Всё, первую цифру посчитали.

Теперь нам нужно из искомого числа 5678 сделать 678 с помощью % и куда-то записать этот результат. В данной конкретной задаче нам изначально заданное число 5678 нам больше не понадобится. Поэтому можем смело использовать переменную a.

a %= 1000;

Маленькая хитрость, применимая именно для этой задачи. Поскольку в этой задаче все числа - целые, без дробных частей, то и тип данных для них используется int. Поэтому конкретно в этом случае можно поступить проще. Поскольку 5678 у нас типа int, и значение первой цифры у нас тоже типа int, результат операции (переменная a1) 5678/1000 будет цифрой 5. Если в результате деления данных типа int есть дробная часть, то она тупо отбрасывается. Поэтому вторую часть формулы, а именно (a%1000) / 1000 можно не писать.

Итак мы теперь имеем в переменной a трёхзначное число 678.

По такому же принципу получим из него 6.

a2 = a / 100 - (a % 100) / 100;

Затем сделаем из 678 число 78 и запишем результат в переменную a.

a %= 100;

Теперь получим из числа 78 число 7

a3 = a / 10 - (a % 10) / 10;

Ну и напоследок число 8

a %= 10;

a4 = a;

Для наглядности предлагаю вывести значения цифр на экран

System.out.println("Значение первой цифры " + a1);

System.out.println("Значение второй цифры " + a2);

System.out.println("Значение третьей цифры " + a3);

System.out.println("Значение четвертой цифры " + a4);

И для поверки правильности работы скомпилировать и запустить промежуточный вариант

-14

Получаем

-15

Итак, значения всех цифр получены верно. Теперь вернёмся к условию задачи. Нужно посчитать сумму всех цифр числа и с помощью инкремента прибавить к получившемуся числу 2.

Теперь это сделать легко.

Объявим для хранения суммы цифр переменную sum и присвоим ей стартовое значение

int sum = a1 + a2 + a3 + a4;

Теперь с помощью инкремента увеличим её значение на 2.

sum++;

sum++;

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

Теперь выведем на экран то, что должны получить по условию задачи.

System.out.println("Сумма цифр числа " + a1 + a2 + a3 + a4 + ", увеличенная на 2 равна " + sum);

Обращаю внимание на то, что в тексте для вывода здесь мы слепили искомое число с помощью конкатенации. Возникает вопрос, а почему сработала именно конкатенация, а не произошло так, что переменные сложились и выдалась их сумма? А потому что для того, чтобы они сложились, операцию сложения нужно было бы поместить в скобки. (a1+a2+a3+a4)

Дописываем остатки кода и получаем:

-16

Заново компилируем и получаем обновленный результат

-17

Задачу вымучали и решили.

Задача 2.4.

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

Скопируем соответствующий код из предыдущей задачи.

int a = 2345;

int a1;

int a2;

int a3;

int a4;

a1 = a / 1000 - (a % 1000) / 1000;

a %= 1000;

a2 = a / 100 - (a % 100) / 100;

a %= 100;

a3 = a / 10 - (a % 10) / 10;

a %= 10;

a4 = a;

Теперь у нас есть 4 переменных со значениями цифр - a1, a2, a3, a4.

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

Значение выражения ((a1 + a2) == (a3 + a4)) это либо правда, либо ложь. Вот его и подставим в оператор вывода на экран

System.out.println("Сумма первых двух цифр и вторых двух цифр числа " + a1 + a2 + a3 + a4 + " равны - это " + ((a1 + a2) == (a3 + a4)));

Теперь сохраняем

-18

Компилируем и запускаем

-19

Работает верно.

На всякий случай проверим, заменив число 2345 на 5234.

Заново компилируем и запускаем.

-20

По прежнему работает верно. Задача решена.

Если есть какие-то вопросы по решению задач, пишите в комментариях, обязательно разберём вместе!

Решения и разбор задач из урока 13 - с 3.1. по 4.4. опубликую в следующих уроках, чтобы не создавать громоздкость в этом.

Ссылка на предыдущий урок

Ссылка на следующий урок

Ссылка на содержание курса