diff --git a/seminars/build/jtc5-05c.pdf b/seminars/build/jtc5-05c.pdf index 52993ed..b224058 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 6cb7de8..8d94855 100644 --- a/seminars/jtc5-05c.tex +++ b/seminars/jtc5-05c.tex @@ -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}