diff --git a/seminars/build/jtc5-05c.pdf b/seminars/build/jtc5-05c.pdf index dbf0baa..52993ed 100644 Binary files a/seminars/build/jtc5-05c.pdf and b/seminars/build/jtc5-05c.pdf differ diff --git a/seminars/jtc5-05c.tex b/seminars/jtc5-05c.tex index 6cd1b75..6cb7de8 100644 --- a/seminars/jtc5-05c.tex +++ b/seminars/jtc5-05c.tex @@ -73,25 +73,25 @@ \end{itemize} \item \textbf{Вопросы и ответы:} \begin{enumerate} - \item Что такое GPT? + \item Что такое GPT? (2) \begin{enumerate} \item General partition trace; \item GUID partition table; \item Greater pass timing. \end{enumerate} - \item Строки в языке Java -- это: + \item Строки в языке Java -- это: (3) \begin{enumerate} \item классы; \item массивы; \item объекты. \end{enumerate} - \item Ссылка на местонахождение -- это: + \item Ссылка на местонахождение -- это: (2) \begin{enumerate} \item URI; \item URL; \item URN. \end{enumerate} - \item Возможно ли чтение совершенно случайного байта данных из потока, к которому подключен объект \code{BufferedInputStream}? + \item Возможно ли чтение совершенно случайного байта данных из потока, к которому подключен объект \code{BufferedInputStream}? (2) \begin{enumerate} \item да; \item нет; @@ -230,7 +230,7 @@ private static boolean fileScanner(String fileName, String word) throws IOExcept } \end{lstlisting} -Но более гибким получится алгоритм, ищущий непосредственно последовательность символов, сравнивая их по одному, это позволяет искать не только словосочетания, но и, например, диалоги персонажей в книге. +Но более гибким получится алгоритм, ищущий непосредственно последовательность символов, сравнивая их по одному, это позволяет искать не только словосочетания, но и, например, диалоги персонажей в книге. Данная ниже реализация может найти представленную в комментарии комбинацию, когда неверный символ слова является началом верной последовательности. \begin{lstlisting}[language=Java,style=JCodeStyle,label={},caption={}] private static boolean isInFile(String fileName, String search) throws IOException { FileInputStream fis = new FileInputStream(fileName); @@ -253,6 +253,30 @@ private static boolean isInFile(String fileName, String search) throws IOExcepti return false; } \end{lstlisting} + +Ещё более точной будет реализация, в которой формируется некоторое окно поиска, фактически, буфер, смещающийся посимвольно по читаемому файлу, это позволяет найти слово «гоголь» в комбинации «гогоголь». + +\begin{lstlisting}[language=Java,style=JCodeStyle,label={},caption={}] +private static boolean isInFile(String fileName, String search) throws IOException { + try (FileInputStream fis = new FileInputStream(fileName)) { + int ch; + StringBuilder sb = new StringBuilder(); + while ((ch = fis.read()) != -1 && sb.length() < search.length()) { + sb.append((char) ch); + } + + do { + if (sb.toString().equals(search)) + return true; + sb.deleteCharAt(0); + sb.append((char) ch); + } while ((ch = fis.read()) != -1); + } catch (IOException e) { + throw new RuntimeException(e); + } + return false; +} +\end{lstlisting} \end{itemize} \end{itemize} @@ -270,209 +294,27 @@ private static boolean isInFile(String fileName, String search) throws IOExcepti \end{itemize} \end{itemize} + +% Практика создания, отправки и принятия данных; +% сохранение и загрузка состояния программы между запусками; +% работа с большими текстами (поиск, замена, генерация); +% начало рассмотрения популярных пакетов ввода-вывода. + \subsubsection{Задание 1} \begin{itemize} -\item \textbf{Ценность этапа} Написание почти полноценной механики по краткому ТЗ. -\item \textbf{Тайминг} 25-30 минут. +\item \textbf{Ценность этапа} +\item \textbf{Тайминг} \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.", - ((badlen) ? "in" : ""), - ((badlen) ? ", expected > 20, given" : ","), - currentLength, - (matchConfirm) ? "" : "doesn't "); - } -} - \end{lstlisting} - \begin{lstlisting}[language=Java,style=JCodeStyle,caption={Создание тестовой среды}] -public static void main(String[] args) { - String[][] credentials = { - {"ivan", "1i2v3a4n5i6v7a8n91011", "1i2v3a4n5i6v7a8n91011"}, //correct - {"1i2v3a4n5i6v7a8n91011", "", ""}, //wrong login length - {"ivan", "1i2v3a4n5i6v7a8n91011", "1i2v3a4n5"}, //confirm mismatch - {"ivan", "1i2v3a4n5", "1i2v3a4n5"},//wrong password length - {"ivan", "1i2v3a4n5", "1i"} //wrong password length and confirm mismatch - }; - for (int i = 0; i < credentials.length; i++) { - try { - System.out.println(checkCredentials(credentials[i][0], credentials[i][1], credentials[i][2])); - } catch (WrongLoginException e) { - e.printStackTrace(); - } catch (WrongPasswordException e) { - System.out.println(e.getMessage()); - } - } -} - \end{lstlisting} - \begin{lstlisting}[language=Java,style=JCodeStyle,caption={Метод проверки}] -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} +\item \textbf{Задание}: + + \textbf{Вариант решения} \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={Создание базовых классов (идентично)}] -private static class Item { - String name; - int cost; - - public Item(String name, int cost) { - this.name = name; - this.cost = cost; - } - - @Override - public String toString() { - return "Item{name='" + name + "', cost=" + cost + "}"; - } -} - \end{lstlisting} - \begin{lstlisting}[language=Java,style=JCodeStyle,caption={Создание пользовательских исключений}] - public static class CustomerException extends RuntimeException { - public CustomerException(String message) { - super(message); - } - } - \end{lstlisting} - \begin{lstlisting}[language=Java,style=JCodeStyle,caption={Создание массивов}] -private final static Customer[] people = { - new Customer("Ivan", 20, "+1-222-333-44-55"), - new Customer("Petr", 30, "+2-333-444-55-66"), -}; -private final static Item[] items = { - new Item("Ball", 100), - new Item("Sandwich", 1000), - new Item("Table", 10000), - new Item("Car", 100000), - new Item("Rocket", 10000000) -}; -private static Order[] orders = new Order[5]; - \end{lstlisting} - \begin{lstlisting}[language=Java,style=JCodeStyle,caption={Описание тестовой среды}] -Object[][] info = { - {people[0], items[0], 1}, //good - {people[1], items[1], -1}, //bad amount -1 - {people[0], items[2], 150}, //bad amount >100 - {people[1], new Item("Flower", 10), 1}, //no item - {new Customer("Fedor", 40, "+3-444-555-66-77"), items[3], 1}, //no customer -}; -int capacity = 0; -int i = 0; -while (capacity != orders.length - 1 || i != info.length) { - try { - orders[capacity] = buy((Customer) info[i][0], (Item) info[i][1], (int) info[i][2]); - capacity++; - } catch (ProductException e) { - e.printStackTrace(); - } catch (AmountException e) { - orders[capacity++] = buy((Customer) info[i][0], (Item) info[i][1], 1); - } catch (CustomerException e) { - throw new RuntimeException(e); - } finally { - System.out.println("Orders made: " + capacity); - } - ++i; -} - \end{lstlisting} - \begin{lstlisting}[language=Java,style=JCodeStyle,caption={Написание и \textbf{отладка} основного метода}] -private static boolean isInArray(Object[] arr, Object o) { - for (int i = 0; i < arr.length; i++) - if (arr[i].equals(o)) return true; - return false; -} - -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}