@ Что происходит & @ Время & @ Слайды & @ Описание \\
\hline
\endhead
@ Организационный момент & 5 tag(beg) & @ 1-5 & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучиает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\
\hline
@ Quiz & 5 & @ 6-18 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (6 вопросов, по минуте на ответ) \\
\hline
@ Рассмотрение ДЗ лекции & 10 & @ 19-23 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
\hline
@ Вопросы и ответы & 10 & @ 24 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
\hline
@ Задание 1 & 30 & @ 25-35 & @ Сквозное задание, состоящее из объяснений в 6 пунктах, обязательных к исполнению. Всё задание выдаётся сразу целиком и является неделимым. \\
\hline
@ Перерыв (если нужен) & 5 & @ 36 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
\hline
@ Задание 2 & 40 & @ 37-49 & @ Сквозное задание, состоящее из объяснений в 6 пунктах, обязательных к исполнению. Всё задание выдаётся сразу целиком и является неделимым. \\
\item Создать пару-тройку текстовых файлов. Для упрощения (чтобы не разбираться с кодировками) внутри файлов следует писать текст только латинскими буквами.
Задание не предполагало кода, но будет плюсом, если студенты создали файлы не вручную, а программным кодом. Для этого и последующих заданий понадобится набор констант и вспомогательный массив с названиями файлов
private static final String WORD_TO_SEARCH = "geekbrains";
String[] fileNames = new String[FILES_AMOUNT];
for (int i = 0; i < fileNames.length; i++)
fileNames[i] = "file_" + i + ".txt";
\end{lstlisting}
Файл записывается простым выходным потоком, в который (в приведённом ниже примере) записывается строка, сгенерированная методом. Из строки выделяется массив байтов методом \code{getBytes()}.
\item Написать метод, осуществляющий конкатенацию (соединение) переданных ей в качестве параметров файлов (не особенно важно, в первый допишется второй или во второй первый, или файлы вовсе объединятся в какой-то третий);
Метод конкатенации моет также быть написан множеством способов, но важно, чтобы при буферизации (чаще всего решения содержат именно буферизованные варианты) не терялись символы, например, пробелы или переходы на новую строку. Также часто встречается дополнительная буферизация внутри программы, например, в строку, при помощи \code{StringBuilder}, что будет являться грубой ошибкой при конкатенации больших или бинарных файлов. Поэтому ниже представлен вариант решения с посимвольным чтением и записью в результирующий файл.
System.out.println("Second task result is in FILE_OUT.");
}
catch (Exception ex) { throw new RuntimeException(ex); }
\end{lstlisting}
\item Написать метод поиска слова внутри файла.
\textbf{Вариант решения}
Для поиска слова понадобится файл не со сплошными символами (хотя и в таком алгоритм поиска должен отработать нормально), асо словами, разделёнными пробелами. Для этого можно видоизменить метод генерации файла и написать перегруженный, который будет по некоторому псевдослучайному условию вставлять в файл через пробел либо случайно сгенерированную последовательность символов, либо слово, заранее определённое, как искомое.
Scanner sc = new Scanner(new FileInputStream(fileName));
word = word.toLowerCase(); // \n
while (sc.hasNext()) {
String line = sc.nextLine();
line = line.toLowerCase();
if (line.contains(word)) return true;
}
return false;
}
\end{lstlisting}
Но более гибким получится алгоритм, ищущий непосредственно последовательность символов, сравнивая их по одному, это позволяет искать не только словосочетания, но и, например, диалоги персонажей в книге.
\item\textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item\textbf{Тайминг} 5-15 минут
\item\textbf{Действия преподавателя}
\begin{itemize}
\item Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы;
\item Если преподаватель затрудняется с ответом, необходимо мягко предложить студенту ответить на его вопрос на следующем семинаре (и не забыть найти ответ на вопрос студента!);
\item Предложить и показать пути самостоятельного поиска студентом ответа на заданный вопрос;
\item Посоветовать литературу на тему заданного вопроса;
\item Дополнительно указать на то, что все сведения для выполнения домашнего задания, прохождения викторины и работы на семинаре были рассмотрены в методическом материале к этому или предыдущим урокам.
\end{itemize}
\end{itemize}
\subsubsection{Задание 1}
\begin{itemize}
\item\textbf{Ценность этапа} Написание почти полноценной механики по краткому ТЗ.
\item\textbf{Тайминг} 25-30 минут.
\item\textbf{Действия преподавателя}
\begin{itemize}
\item Выдать задание студентам;
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций.
\end{itemize}
\item\textbf{Задание}: Класс «Проверка логина и пароля».
\begin{enumerate}
\item Создать статический метод который принимает на вход три параметра: \code{login}, \code{password} и \code{confirmPassword}.
\item Длина \code{login} должна быть \textbf{меньше} 20 символов. Если \code{login} не соответствует этому требованию, необходимо выбросить \code{WrongLoginException}.
\item Длина \code{password} должна быть \textbf{не меньше} 20 символов. Также \code{password} и \code{confirmPassword} должны быть равны. Если \code{password} не соответствует этим требованиям, необходимо выбросить \code{WrongPasswordException}.
\item\code{WrongPasswordException} и \code{WrongLoginException} -- пользовательские классы исключения с двумя конструкторами –- один по умолчанию, второй принимает параметры исключения (неверные данные) и возвращает пользователю в виде «ожидалось/фактически».
\itemВ основном классе программы необходимо по-разному обработать исключения.
\item Метод возвращает \code{true}, если значения верны или \code{false} в противном случае.
\end{enumerate}
\textbf{Вариант исполнения класса в приложении \ref{appendix:ct1}}
\textbf{Вариант маршрута решения задачи}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Описание класса исключения логина}]
public static class WrongLoginException extends RuntimeException {
private int currentLength;
public WrongLoginException(int currentLength) {
super();
this.currentLength = currentLength;
}
@Override
public String getMessage() {
return String.format("Your login is of incorrect length, expected < 20, given %d.",
currentLength);
}
}
\end{lstlisting}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Формирование сообщения для класса исключения пароля}]
public static class WrongPasswordException extends RuntimeException {
private int currentLength;
private boolean matchConfirm;
public WrongPasswordException(int currentLength, boolean matchConfirm) {
super();
this.currentLength = currentLength;
this.matchConfirm = matchConfirm;
}
@Override
public String getMessage() {
boolean badlen = currentLength <= 20;
return String.format("Your password is of %scorrect length%s %d. Password %smatch the confirmation.",
public static boolean checkCredentials(String login, String password, String confirmPassword) {
boolean conf = password.equals(confirmPassword);
int llen = login.length();
int plen = password.length();
if (llen >= 20)
throw new WrongLoginException(llen);
else if (plen < 20 || !conf)
throw new WrongPasswordException(plen, conf);
else
return true;
}
\end{lstlisting}
\end{itemize}
\subsubsection{Задание 2}
\begin{itemize}
\item\textbf{Ценность этапа} Написание наброска пет-проекта, повторение информации об ООП, работа с исключениями.
\item\textbf{Тайминг} 35-40 минут.
\item\textbf{Действия преподавателя}
\begin{itemize}
\item Выдать задание студентам;
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций.
\item обратить внимание на порядок обработки исключений, повторная попытка купить товар может производиться только тогда, когда остальные параметры покупки уже проверены.
\end{itemize}
\item\textbf{Задание}: Класс «Эмуляция интернет-магазина».
\begin{enumerate}
\item Написать классы покупатель (ФИО, возраст, телефон), товар (название, цена) и заказ (объект покупатель, объект товар, целочисленное количество).
\item Создать массив покупателей (инициализировать 2 элемента), массив товаров (инициализировать 5 элементов) и массив заказов (пустой на 5 элементов).
\item Создать статический метод «совершить покупку» со строковыми параметрами, соответствующими полям объекта заказа. Метод должен вернуть объект заказа.
\item Если в метод передан несуществующий покупатель -- метод должен выбросить исключение \code{CustomerException}, если передан несуществующий товар, метод должен выбросить исключение \code{ProductException}, если было передано отрицательное или слишком больше значение количества (например, 100), метод должен выбросить исключение \code{AmountException}.
\item Вызвать метод совершения покупки несколько раз таким образом, чтобы заполнить массив покупок возвращаемыми значениями. Обработать исключения следующим образом (в заданном порядке):
\begin{itemize}
\item если был передан неверный товар -- вывести в консоль сообщение об ошибке, не совершать данную покупку;
\item если было передано неверное количество -- купить товар в количестве 1;
\item если был передан неверный пользователь -- завершить работу приложения с исключением.
\end{itemize}
\item Вывести в консоль итоговое количество совершённых покупок после выполнения основного кода приложения.
\end{enumerate}
\textbf{Вариант исполнения класса в приложении \ref{appendix:ct1}}
\textbf{Вариант маршрута решения задачи}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Создание базовых классов (идентично)}]
public static Order buy(Customer who, Item what, int howMuch) {
if (!isInArray(people, who))
throw new CustomerException("Unknown customer: " + who);
if (!isInArray(items, what))
throw new ProductException("Unknown item: " + what);
if (howMuch < 0 || howMuch > 100)
throw new AmountException("Incorrect amount: " + howMuch);
return new Order(who, what, howMuch);
}
\end{lstlisting}
\end{itemize}
\subsubsection{Домашнее задание}
\begin{itemize}
\item\textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item\textbf{Тайминг} 5-10 минут.
\item\textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам в каком виде выполнять и сдавать задания
\item Уточнить кто будет проверять работы (преподаватель или ревьювер)
\item Объяснить к кому обращаться за помощью и где искать подсказки
\item Объяснить где взять проект заготовки для дз
\end{itemize}
\item\textbf{Задания}
\begin{enumerate}
\item [5-25 мин] Выполнить все задания семинара, если они не были решены, без ограничений по времени;
\textbf{Все варианты решения приведены в тексте семинара выше}
\item [15 мин] 1. В класс покупателя добавить перечисление с гендерами, добавить в сотрудника свойство «пол» со значением созданного перечисления. Добавить геттеры, сеттеры.
public Employee(String name, String midName, String surName, String phone, String position, int salary, int birth, Genders gender) {
// ...
this.gender = gender;
}
public Genders getGender() {
return gender;
}
public void setGender(Genders gender) {
this.gender = gender;
}
\end{lstlisting}
\item [20-25 мин] 2. Добавить в основную программу перечисление с праздниками (нет праздника, Новый Год, 8 марта, 23 февраля), написать метод, принимающий массив сотрудников, поздравляющий всех сотрудников с Новым Годом, женщин с 8 марта, а мужчин с 23 февраля, если сегодня соответствующий день.