sem5 lec4hw

This commit is contained in:
Ivan I. Ovchinnikov 2023-01-17 23:40:14 +03:00
parent c662ae1464
commit bfef623cd1
2 changed files with 40 additions and 198 deletions

Binary file not shown.

View File

@ -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}