05sem done, massive repo refactoring (not working separate file compilation yet)
BIN
build/j-spec.pdf
42
j-spec.tex
|
@ -1,12 +1,13 @@
|
||||||
\immediate\write18{texcount -sum -1 -inc j-spec.tex > /tmp/wordcount.tex}
|
\immediate\write18{texcount -sum -1 -inc j-spec.tex > /tmp/wordcount.tex}
|
||||||
\documentclass[a4paper,12pt]{article}
|
|
||||||
|
\documentclass[a4paper,12pt]{report}
|
||||||
\usepackage[english,russian]{babel}
|
\usepackage[english,russian]{babel}
|
||||||
|
|
||||||
\input{settings/main-style-preamble}
|
\input{settings/main-style-preamble}
|
||||||
\input{settings/fancy-listings-preamble}
|
\input{settings/fancy-listings-preamble}
|
||||||
|
|
||||||
\graphicspath{{./pics/}}
|
\graphicspath{{./pics/}}
|
||||||
\title{Техническая специализация Java\\\small{(1. Java Core)}}
|
\title{Техническая специализация Java}
|
||||||
\author{Иван Игоревич Овчинников}
|
\author{Иван Игоревич Овчинников}
|
||||||
\date{\today{} (\DTMcurrenttime)}
|
\date{\today{} (\DTMcurrenttime)}
|
||||||
|
|
||||||
|
@ -16,29 +17,38 @@
|
||||||
\maketitle
|
\maketitle
|
||||||
\tableofcontents
|
\tableofcontents
|
||||||
\pagestyle{plain}
|
\pagestyle{plain}
|
||||||
|
\sloppy
|
||||||
|
|
||||||
%\chapter{Java Core}
|
|
||||||
\newpage
|
\newpage
|
||||||
\subfile{jtc1-01a}
|
\chapter{Java Core}
|
||||||
|
\subfile{jtc1-01-abstract}
|
||||||
\newpage
|
\newpage
|
||||||
\subfile{jtc2-02a}
|
\subfile{jtc2-02-abstract}
|
||||||
\newpage
|
\newpage
|
||||||
\subfile{jtc3-03a}
|
\subfile{jtc3-03-abstract}
|
||||||
%\newpage
|
\newpage
|
||||||
|
\subfile{jtc4-04-abstract}
|
||||||
|
\newpage
|
||||||
|
\subfile{jtc5-05-abstract}
|
||||||
|
|
||||||
|
\newpage
|
||||||
|
\chapter{Java Development Kit}
|
||||||
%\subfile{jtd6-11a}
|
%\subfile{jtd6-11a}
|
||||||
|
|
||||||
%\section{Специализация: ООП}
|
|
||||||
|
|
||||||
%\section{Специализация: Тонкости работы}
|
|
||||||
%Файловая система и представление данных; Пакеты \code{java.io}, \code{java.nio}, \code{String}, \code{StringBuilder}, string pool, ?JSON/XML?
|
|
||||||
|
|
||||||
\newpage
|
\newpage
|
||||||
\appendix
|
\appendix
|
||||||
\sloppy
|
\printnomenclature[40mm]
|
||||||
\printnomenclature[27mm]
|
|
||||||
|
|
||||||
\chapter*{Приложения}
|
\chapter{Семинары}
|
||||||
%\addcontentsline{toc}{chapter}{Приложения}
|
|
||||||
\renewcommand{\thesection}{\Asbuk{section}}
|
\renewcommand{\thesection}{\Asbuk{section}}
|
||||||
|
\subfile{jtc1-01-workshop}
|
||||||
|
\newpage
|
||||||
|
\subfile{jtc2-02-workshop}
|
||||||
|
\newpage
|
||||||
|
\subfile{jtc3-03-workshop}
|
||||||
|
\newpage
|
||||||
|
\subfile{jtc4-04-workshop}
|
||||||
|
\newpage
|
||||||
|
\subfile{jtc5-05-workshop}
|
||||||
|
|
||||||
\end{document}
|
\end{document}
|
||||||
|
|
|
@ -294,11 +294,6 @@ private static boolean isInFile(String fileName, String search) throws IOExcepti
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
% чтение содержимого текущей папки (*указанной папки)
|
|
||||||
% batch prefix adder ('file1 file2 file3' 'prefix')
|
|
||||||
% программа заменяющая символ в файле, сохраняющая результат в новый файл (*заменяющая слово)
|
|
||||||
|
|
||||||
\subsubsection{Задание 1}
|
\subsubsection{Задание 1}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item \textbf{Ценность этапа} Сохранение состояния приложения между запусками
|
\item \textbf{Ценность этапа} Сохранение состояния приложения между запусками
|
||||||
|
@ -343,23 +338,6 @@ for (int i = 0; i < ar0.length; i++) {
|
||||||
fos.write(0);
|
fos.write(0);
|
||||||
}
|
}
|
||||||
fos.flush();
|
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();
|
fos.close();
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
@ -395,7 +373,7 @@ fis.close();
|
||||||
System.out.println(Arrays.toString(ar00));
|
System.out.println(Arrays.toString(ar00));
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
\item [$*_1$] Прочитать из файла с числами, предполагая, что разделитель -- это число 0.
|
\item [$*_1$] Прочитать данные из файла с числами, предполагая, что разделитель -- это число 0.
|
||||||
|
|
||||||
\textbf{Вариант решения}
|
\textbf{Вариант решения}
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
||||||
|
@ -414,29 +392,141 @@ fis.close();
|
||||||
|
|
||||||
System.out.println(Arrays.toString(ar10));
|
System.out.println(Arrays.toString(ar10));
|
||||||
\end{lstlisting}
|
\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}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Задание 3}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Ценность этапа} Работа с текстом (автоматизированный поиск и замена текста в файле или группе файлов)
|
||||||
|
\item \textbf{Тайминг} 10-15 мин
|
||||||
|
\item \textbf{Действия преподавателя}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Выдать задание студентам;
|
||||||
|
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций;
|
||||||
|
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Задание}:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Написать программу заменяющую указанный символ в текстовом файле на пробел, сохраняющую получившийся текст в новый файл.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
||||||
|
FileInputStream fis = new FileInputStream("Main.java");
|
||||||
|
int i;
|
||||||
|
char what = ',';
|
||||||
|
char to = '!';
|
||||||
|
FileOutputStream fos = new FileOutputStream("Main.java.new");
|
||||||
|
|
||||||
|
while ((i = fis.read()) != -1) {
|
||||||
|
if (i == what)
|
||||||
|
fos.write(to);
|
||||||
|
else
|
||||||
|
fos.write(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
fos.close();
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\item [$*_1$] Модифицировать алгоритм поиска замены символа так, чтобы программа осуществляла замену слова (последовательного набора символов) в исходном файле и записывала результат в новый файл.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
||||||
|
String search = "Hello";
|
||||||
|
String l = "Goodbye";
|
||||||
|
FileInputStream fis = new FileInputStream("Main.java");
|
||||||
|
FileOutputStream fos = new FileOutputStream("Main.java.new");
|
||||||
|
|
||||||
|
int ch;
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
while ((ch = fis.read()) != -1) {
|
||||||
|
sb.append((char) ch);
|
||||||
|
if (sb.length() == search.length()) {
|
||||||
|
if (sb.toString().equals(search)) {
|
||||||
|
fos.write(l.getBytes());
|
||||||
|
sb.delete(0, search.length());
|
||||||
|
} else {
|
||||||
|
fos.write(sb.charAt(0));
|
||||||
|
sb.deleteCharAt(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fos.write(sb.toString().getBytes());
|
||||||
|
\end{lstlisting}
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
|
\subsubsection{Задание 4}
|
||||||
|
\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 count = 0;
|
||||||
|
File path = new File( new File(".").getCanonicalPath() );
|
||||||
|
File[] dir = path.listFiles();
|
||||||
|
for (int i = 0; i < dir.length; i++) {
|
||||||
|
if (dir[i].isDirectory()) continue;
|
||||||
|
System.out.println(dir[i]);
|
||||||
|
}
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\item [$*_1$] Дописать программу таким образом, чтобы она рекурсивно выводила содержимое не только текущей папки, но и вложенных.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
||||||
|
void printContents(String path) throws IOException {
|
||||||
|
int count = 0;
|
||||||
|
File fullPath = new File(new File(path).getCanonicalPath() );
|
||||||
|
File[] dir = fullPath.listFiles();
|
||||||
|
for (int i = 0; i < dir.length; i++) {
|
||||||
|
if (dir[i].isDirectory()) printContents(dir[i].toString());
|
||||||
|
System.out.println(dir[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\end{lstlisting}
|
||||||
|
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
||||||
|
void printContents(".");
|
||||||
|
\end{lstlisting}
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Задание 5 (необязательное)}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Ценность этапа} Описание часто недостающих механик операционной системы по «массовой» работе с файлами.
|
||||||
|
\item \textbf{Тайминг} 15-20 мин
|
||||||
|
\item \textbf{Действия преподавателя}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Выдать задание студентам;
|
||||||
|
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций;
|
||||||
|
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Задание}: Написать функцию, добавляющую префикс к каждому из набора файлов, названия которых переданы ей в качестве параметров через пробел.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
||||||
|
String[] a = {"Main.java", "a.txt"};
|
||||||
|
|
||||||
|
for (String fileName : a) {
|
||||||
|
Path file = Path.of(fileName);
|
||||||
|
if (Files.exists(file)) {
|
||||||
|
Files.move(file, Paths.get("pre_" + file), REPLACE_EXISTING);
|
||||||
|
} else {
|
||||||
|
System.out.printf("No file with name '%s'", fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\end{lstlisting}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
\subsubsection{Домашнее задание}
|
\subsubsection{Домашнее задание}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
|
@ -454,50 +544,49 @@ System.out.println(Arrays.toString(ar20));
|
||||||
\item [5-25 мин] Выполнить все задания семинара, если они не были решены, без ограничений по времени;
|
\item [5-25 мин] Выполнить все задания семинара, если они не были решены, без ограничений по времени;
|
||||||
|
|
||||||
\textbf{Все варианты решения приведены в тексте семинара выше}
|
\textbf{Все варианты решения приведены в тексте семинара выше}
|
||||||
\item [15 мин] 1. В класс покупателя добавить перечисление с гендерами, добавить в сотрудника свойство «пол» со значением созданного перечисления. Добавить геттеры, сеттеры.
|
\item [15 мин] 1. Написать функцию, создающую резервную копию всех файлов в директории (без поддиректорий) во вновь созданную папку \code{./backup}
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Свойства сотрудника}]
|
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
||||||
enum Genders{MALE, FEMALE};
|
Files.createDirectory(Path.of("./backup"));
|
||||||
|
|
||||||
// ...
|
DirectoryStream<Path> dir = Files.newDirectoryStream(Path.of("."));
|
||||||
Genders gender;
|
for (Path file : dir) {
|
||||||
|
if (Files.isDirectory(file)) continue;
|
||||||
public Employee(String name, String midName, String surName, String phone, String position, int salary, int birth, Genders gender) {
|
Files.copy(file, Path.of("./backup/" + file.toString()));
|
||||||
// ...
|
|
||||||
this.gender = gender;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Genders getGender() {
|
|
||||||
return gender;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGender(Genders gender) {
|
|
||||||
this.gender = gender;
|
|
||||||
}
|
}
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
\item [20-25 мин] 2. Добавить в основную программу перечисление с праздниками (нет праздника, Новый Год, 8 марта, 23 февраля), написать метод, принимающий массив сотрудников, поздравляющий всех сотрудников с Новым Годом, женщин с 8 марта, а мужчин с 23 февраля, если сегодня соответствующий день.
|
\item [20-25 мин] 2. Предположить, что числа в исходном массиве из 9 элементов имеют диапазон $[0, 3]$, и представляют собой, например, состояния ячеек поля для игры в крестики-нолики, где 0 -- это пустое поле, 1 -- это поле с крестиком, 2 -- это поле с ноликом, 3 -- резервное значение. Такое предположение позволит хранить в одном числе типа \code{int} всё поле 3х3. Записать в файл 9 значений так, чтобы они заняли три байта.
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Праздники}]
|
|
||||||
enum Parties{NONE, NEW_YEAR, MARCH_8, FEB_23}
|
|
||||||
private static final Parties today = Parties.NONE;
|
|
||||||
|
|
||||||
private static void celebrate(Employee[] emp) {
|
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
||||||
for (int i = 0; i < emp.length; i++) {
|
int[] ar2 = {0,1,2,3,0,1,2,3,0};
|
||||||
switch (today) {
|
|
||||||
case NEW_YEAR:
|
FileOutputStream fos = new FileOutputStream("save1.out");
|
||||||
System.out.println(emp[i].name + ", happy New Year!");
|
for (int b = 0; b < 3; b++) { // write to 3 bytes
|
||||||
break;
|
byte wr = 0;
|
||||||
case FEB_23:
|
for (int v = 0; v < 3; v++) { // write by 3 values in each
|
||||||
if (emp[i].gender == Employee.Genders.MALE)
|
wr += (byte) (ar2[3 * b + v] << (v * 2));
|
||||||
System.out.println(emp[i].name + ", happy February 23rd!");
|
|
||||||
break;
|
|
||||||
case MARCH_8:
|
|
||||||
if (emp[i].gender == Employee.Genders.FEMALE)
|
|
||||||
System.out.println(emp[i].name + ", happy march 8th!");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
System.out.println(emp[i].name + ", celebrate this morning!");
|
|
||||||
}
|
}
|
||||||
|
fos.write(wr);
|
||||||
|
}
|
||||||
|
fos.flush();
|
||||||
|
fos.close();
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\item [20-25 мин] 3. Прочитать числа из файла, полученного в результате выполнения задания 2.
|
||||||
|
|
||||||
|
\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{lstlisting}
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
@ -525,6 +614,9 @@ private static void celebrate(Employee[] emp) {
|
||||||
|
|
||||||
\subsection{Домашнее задание 3}
|
\subsection{Домашнее задание 3}
|
||||||
\label{appendix:hw3}
|
\label{appendix:hw3}
|
||||||
\lstinputlisting[language=Java,style=JCodeStyle,caption={Основная программа}]{src/s04-hw3-exceptional.java}
|
%\lstinputlisting[language=Java,style=JCodeStyle,caption={Основная программа}]{src/s04-hw3-exceptional.java}
|
||||||
|
|
||||||
\end{document}
|
\end{document}
|
||||||
|
|
||||||
|
|
||||||
|
\item [$*_2$]
|
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 374 KiB After Width: | Height: | Size: 374 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 234 KiB After Width: | Height: | Size: 234 KiB |
Before Width: | Height: | Size: 255 KiB After Width: | Height: | Size: 255 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |