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