Найти тему

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

Задача 1.1.

Здесь всё просто и легко. Задача решается аналогично тому, как решён пример с месяцами в уроке 15.

Объявляем переменную с номером дня недели

int num_day = 3;

Теперь самое время воспользоваться оператором switch case.

В данном случае проверяемая переменная у нас num_day (номер дня недели).

switch ( num_day )

{

Теперь для каждого значения, которое может принимать переменная num_day пишем код для исполнения.

Если num_day равно 1, то выводим на экран "Сегодня понедельник". Если num_day равно 2, то выводим на экран "Сегодня вторник". И так далее. И, наконец, если num_day равно 7, то выводим "Сегодня воскресенье". Теперь в виде кода

case 1: System.out.println("Сегодня понедельник!"); break;

case 2: System.out.println("Сегодня вторник!"); break;

case 3: System.out.println("Сегодня среда!"); break;

case 4: System.out.println("Сегодня четверг!"); break;

case 5: System.out.println("Сегодня пятница!"); break;

case 6: System.out.println("Сегодня суббота!"); break;

case 7: System.out.println("Сегодня воскресенье!"); break;

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

default: System.out.println("Неверно указан номер дня недели!"); break;

}

Всё, основной код программы готов.

Осталось скомпилировать и запустить

-2

Задача 1.2.

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

Итак, поехали.

Объявляем переменную и присваиваем ей наименование месяца

String mes = "Апрель";

Теперь проверяемая переменная у нас mes. С ней и работаем. И не забываем по то, что пользователь может ввести как с большой, так и с маленькой буквы номер месяца.

switch ( mes )

{

Теперь вспоминаем форму записи, при которой если при двух значениях проверяемой переменной должно быть выполнено одно и то же действие (или действия)

case "Январь": case "январь": System.out.println("Номер месяца " + mes + " - 1"); break;

При такой форме записи независимо от того, с большой или маленькой буквы написано название месяца (в нашем случае содержится в переменной mes) программа совершит одни и те же действия - выведет на экран нужный нам текст.

Аналогично для других месяцев:

case "Февраль": case "февраль": System.out.println("Номер месяца " + mes + " - 2"); break;

case "Март": case "март": System.out.println("Номер месяца " + mes + " - 3"); break;

...

и так до декабря

case "Декабрь": case "декабрь": System.out.println("Номер месяца " + mes + " - 12"); break;

Если название месяца введено неправильно (в нашем случае присвоено переменной mes), выведем соответствующее сообщение

default: System.out.println("Неверно указано наименование месяца!"); break;

}

Осталось сохранить файл с кодом программы

-3

Скомпилировать и запустить

-4

Задача 1.3.

Итак, смотрим условие задачи. Объявлено 2 переменных. Объявим их и мы.

Текстовая с днём недели 1-го числа.

String day1 = "Среда";

Целочисленная - с днём месяца, в который нам нужно определить день недели.

int chislo = 19;

Теперь нужно подумать, как нам получить искомый день недели, который приходится на 19 число. Нужно придумать алгоритм решения.

Сначала давайте подумаем, как поступить, если 1-е число месяца - понедельник. В неделе 7 дней. Поэтому в любом случае нужно произвести какие-то действия с числами 19 и 7.

Тут нам поможет оператор остатка от деления %.

Остаток от деления 19 на 7 равен 5. На всякий случай напоминаю, как считается.

19 / 7 = 2,714...

Отбрасываем дробную часть. Значит в числе 19 содержится два целых числа 7.

7 * 2 = 14.

Считаем остаток от деления 19 - 14 = 5.

Теперь мыслим следующим образом. Если 1-е число понедельник, то 5-е число - пятница. Значит, полученная нами цифра 5 (остаток от деления) соответствует пятнице.

То есть если 1-е число - понедельник, то 19-е число - пятница.

А что делать, если 1-е число среда? Сначала определимся с тем, что среда - это третий день недели. То есть её номер - 3.

На сколько дней номер среды больше номера понедельника? На 2. То есть на 3 - 1.

Итак, у нас родилась формула, как вычислить номер искомого дня недели

19 % 7 + 3 - 1 = 5 + 3 - 1 = 7.

Получается, что если 1-е число это среда, то 19-е число - воскресенье.

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

Но есть ещё 2 момента:

1. А что если в результате вычислений по нашей формуле получится число, большее чем 7? Например, 9.

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

2. Получившийся номер дня недели может быть равен, в частности, как 0, так и 7. И оба этих номера будут соответствовать воскресенью.

Эти 2 момента могут всплыть при тестировании программы при разных значениях исходных данных. Сразу про них можно не догадаться.

Теперь собираем в кучу все наши умозаключения и пишем код.

У нас есть день недели, приходящийся на 1-е число месяца. В виде текста. Найдём его номер в неделе.

Для хранения номера дня недели создадим новую целочисленную переменную

int num_day1;

Найдём номер дня недели первого числа месяца с помощью оператора switch case

switch ( day1 )

{

case "Понедельник": case "понедельник": num_day1 = 1; break;

case "Вторник": case "вторник": num_day1 = 2; break;

case "Среда": case "среда": num_day1 = 3; break;

case "Четверг": case "четверг": num_day1 = 4; break;

case "Пятница": case "пятница": num_day1 = 5; break;

case "Суббота": case "суббота": num_day1 = 6; break;

case "Воскресенье": case "воскресенье": num_day1 = 7; break;

default: System.out.println("Неверно указан день недели первого числа месяца!"); break;

}

Теперь применяем полученную нами формулу и вычисляем номер искомого дня недели (номер в неделе).

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

int num_day_x = chislo % 7 + num_day1 - 1;

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

Можно воспользоваться оператором if вот таким образом

if ( num_day_x > 7) num_day_x = num_day_x -7;

Либо воспользоваться тернарным оператором

num_day_x > 7 ? num_day_x - 7: num_day_x;

Любой из этих двух вариантов имеет право на жизнь.

Всё, теперь осталось вывести на экран необходимый текст. Что мы и сделаем

switch ( num_day_x )

{

case 0: case 7: System.out.println(chislo + "е число месяца - это " + воскресенье); break;

case 1: System.out.println(chislo + "е число месяца - это понедельник"); break;

case 2: System.out.println(chislo + "е число месяца - это вторник"); break;

case 3: System.out.println(chislo + "е число месяца - это среда"); break;

case 4: System.out.println(chislo + "е число месяца - это четверг"); break;

case 5: System.out.println(chislo + "е число месяца - это пятница"); break;

case 6: System.out.println(chislo + "е число месяца - это суббота"); break;

}

Кажется, что всё - задача решена. Можно сохранять код, компилировать и запускать. Но нет!

Есть ещё один нюанс. Если компилировать в таком виде:

-5

то компилятор выдаст ошибку:

-6

И связана она вот с чем.

Мы не присвоили переменной num_day1 начального значения. Мы только объявили эту переменную.

При этом код программы написан так, что этой переменной значение может быть присвоено только в процессе исполнения оператора switch (day1) case. И ей будет присвоено значение 1 только при значениях переменной day1, равных "Понедельник" или "понедельник", значение 2 - при значении переменной day1, равном "Вторник" или "вторник" и так далее.

А если значение переменной day1 не будет равно ни одному из значений, указанных после case, то выполнится код после ключевого слова default, и получится ситуация, при которой переменной num_day1 не будет присвоено никакого значения. То есть она объявлена, но в ней нет значения. Поэтому произвести вычисления по формуле в строке, которую выдал компилятор, не представляется возможным.

Плюс для улучшения кода нужно учесть ещё один нюанс. Если значение переменной day1 не совпадёт ни с одним из значений после case, то выполнится код по умолчанию после ключевого слова default. На экран будет выведено сообщение "Неверно указан день недели первого числа месяца!". В принципе после этого сообщения выполнять дальнейший код не имеет смысла. Более того, этот код в принципе не должен выполниться, результат его выполнения будет неверен.

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

1. Переменной num_day1 присвоить значение 0 для случая когда значение переменной day1 не совпадёт ни с одним из вариантов, указанных после всех case.

Присвоение можно сделать при объявлении переменной, либо после default.

Таким образом, при любом раскладе у переменной num_day1 будет какое-то значение.

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

Получаем изменённый код

-7

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

-8

Вот теперь код выполняется верно. Попробуйте самостоятельно прогнать его при различных значениях переменных day1 и chislo.

Можно сделать код ещё чуть лучше. Предусмотрите вариант, когда переменной chislo присвоено значение более 31.

Я писать код для такого улучшения не буду. Вы можете сделать это самостоятельно...

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

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

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