Задача 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;
}
Всё, основной код программы готов.
Осталось скомпилировать и запустить
Задача 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;
}
Осталось сохранить файл с кодом программы
Скомпилировать и запустить
Задача 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;
}
Кажется, что всё - задача решена. Можно сохранять код, компилировать и запускать. Но нет!
Есть ещё один нюанс. Если компилировать в таком виде:
то компилятор выдаст ошибку:
И связана она вот с чем.
Мы не присвоили переменной 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.
Получаем изменённый код
Компилируем его и запускаем
Вот теперь код выполняется верно. Попробуйте самостоятельно прогнать его при различных значениях переменных day1 и chislo.
Можно сделать код ещё чуть лучше. Предусмотрите вариант, когда переменной chislo присвоено значение более 31.
Я писать код для такого улучшения не буду. Вы можете сделать это самостоятельно...
Ссылка на предыдущий урок
Ссылка на следующий урок
Ссылка на содержание курса