sem5 lec4hw
This commit is contained in:
parent
c662ae1464
commit
bfef623cd1
Binary file not shown.
|
@ -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}
|
||||
|
|
Loading…
Reference in New Issue