05sem done, massive repo refactoring (not working separate file compilation yet)

This commit is contained in:
Ivan I. Ovchinnikov 2023-01-19 18:24:23 +03:00
parent c6d3ea0d88
commit 88a759b9ca
51 changed files with 2356 additions and 99 deletions

Binary file not shown.

Binary file not shown.

View File

@ -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}

View File

@ -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$]

View File

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 85 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 374 KiB

After

Width:  |  Height:  |  Size: 374 KiB

View File

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View File

Before

Width:  |  Height:  |  Size: 234 KiB

After

Width:  |  Height:  |  Size: 234 KiB

View File

Before

Width:  |  Height:  |  Size: 255 KiB

After

Width:  |  Height:  |  Size: 255 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

2155
sources-draft/notebook.ipynb Normal file

File diff suppressed because it is too large Load Diff