This commit is contained in:
Ivan I. Ovchinnikov 2023-01-19 13:47:54 +03:00
parent bfef623cd1
commit c6d3ea0d88
2 changed files with 129 additions and 7 deletions

Binary file not shown.

View File

@ -295,24 +295,146 @@ private static boolean isInFile(String fileName, String search) throws IOExcepti
\end{itemize}
% Практика создания, отправки и принятия данных;
% сохранение и загрузка состояния программы между запусками;
% работа с большими текстами (поиск, замена, генерация);
% начало рассмотрения популярных пакетов ввода-вывода.
% чтение содержимого текущей папки (*указанной папки)
% batch prefix adder ('file1 file2 file3' 'prefix')
% программа заменяющая символ в файле, сохраняющая результат в новый файл (*заменяющая слово)
\subsubsection{Задание 1}
\begin{itemize}
\item \textbf{Ценность этапа}
\item \textbf{Тайминг}
\item \textbf{Ценность этапа} Сохранение состояния приложения между запусками
\item \textbf{Тайминг} 15-20 мин
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Выдать задание студентам;
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций.
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задание}:
\begin{itemize}
\item Создать массив из 9 цифр и записать его в файл, используя поток вывода.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle]
int[] ar0 = {1,2,3,4,5,6,7,8,0,8,7,6,5,4,3};
final int DIGIT_BOUND = 48;
FileOutputStream fos = new FileOutputStream("save.out");
fos.write('[');
for (int i = 0; i < ar0.length; i++) {
fos.write(DIGIT_BOUND + ar0[i]);
if (i < ar0.length - 1) fos.write(',');
}
fos.write(']');
fos.flush();
fos.close();
\end{lstlisting}
\item [$*_1$] Удостовериться, что числа записаны не символами, а цифрами, что сократит объём хранения в 8 и более раз (из-за представления цифр в виде ASCII символов). При этом важно помнить о допущениях такого способа записи, поскольку числа нужно как-то отделять друг от друга, а любой символ, например, пробел (32), имеет числовое представление, и внутри файла будет неотличим от числа 20. А любое отрицательное число будет воспринято потоком чтения как конец потока. Для выполнения задания сделать разделителем число 0.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle]
// assuming 0 is divider
int[] ar1 = {1,2,3,4,5,6,7,8,9,8,7,6,5,4,3};
FileOutputStream fos = new FileOutputStream("save0.out");
for (int i = 0; i < ar0.length; i++) {
fos.write(ar1[i]);
fos.write(0);
}
fos.flush();
fos.close();
\end{lstlisting}
\item [$*_2$] Предположить, что числа в исходном массиве имеют диапазон $[0, 3]$, и представляют собой, например, состояния ячеек поля для игры в крестики-нолики, где 0 -- это пустое поле, 1 -- это поле с крестиком, 2 -- это поле с ноликом, 3 -- резервное значение. Такое предположение позволит хранить в одном числе типа \code{int} всё поле 3х3. Записать в файл 9 значений так, чтобы они заняли три байта.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle]
int[] ar2 = {0,1,2,3,0,1,2,3,0};
FileOutputStream fos = new FileOutputStream("save1.out");
for (int b = 0; b < 3; b++) { // write to 3 bytes
byte wr = 0;
for (int v = 0; v < 3; v++) { // write by 3 values in each
wr += (byte) (ar2[3 * b + v] << (v * 2));
}
fos.write(wr);
}
fos.flush();
fos.close();
\end{lstlisting}
\end{itemize}
\end{itemize}
\subsubsection{Задание 2}
\begin{itemize}
\item \textbf{Ценность этапа} Загрузка состояния приложения при запуске
\item \textbf{Тайминг} 15-20 мин
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Выдать задание студентам;
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задание}:
\begin{itemize}
\item Создать массив целых чисел и заполнить его информацией из файла, записанного в предыдущем задании.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle]
int[] ar00 = new int[15];
final int DIGIT_BOUND = 48;
FileInputStream fis = new FileInputStream("save.out");
fis.read(); // '['
for (int i = 0; i < ar00.length; i++) {
ar00[i] = fis.read() - DIGIT_BOUND;
fis.read(); // ','
}
fis.close();
System.out.println(Arrays.toString(ar00));
\end{lstlisting}
\item [$*_1$] Прочитать из файла с числами, предполагая, что разделитель -- это число 0.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle]
int[] ar10 = new int[15];
// assuming 0 is divider
FileInputStream fis = new FileInputStream("save0.out");
int b;
int i = 0;
while ((b = fis.read()) != -1) {
if (b != 0) {
ar10[i++] = b;
}
}
fis.close();
System.out.println(Arrays.toString(ar10));
\end{lstlisting}
\item [$*_2$] Прочитать из файла, полученного в результате выполнения задания $1*_2$.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle]
int[] ar20 = new int[9];
FileInputStream fis = new FileInputStream("save1.out");
int b;
int i = 0;
while ((b = fis.read()) != -1) {
for (int v = 0; v < 3; ++v) { // 3 values of four possible
ar20[i++] = b >> (v * 2) & 0x3;
}
}
fis.close();
System.out.println(Arrays.toString(ar20));
\end{lstlisting}
\end{itemize}
\end{itemize}