Compare commits

..

3 Commits

61 changed files with 2547 additions and 209 deletions

Binary file not shown.

BIN
build/jtc1-01-abstract.pdf Normal file

Binary file not shown.

BIN
build/jtc2-02-abstract.pdf Normal file

Binary file not shown.

BIN
build/jtc2-02-workshop.pdf Normal file

Binary file not shown.

BIN
build/jtc3-03-abstract.pdf Normal file

Binary file not shown.

BIN
build/jtc3-03-workshop.pdf Normal file

Binary file not shown.

BIN
build/jtc4-04-abstract.pdf Normal file

Binary file not shown.

BIN
build/jtc4-04-workshop.pdf Normal file

Binary file not shown.

BIN
build/jtc5-05-abstract.pdf Normal file

Binary file not shown.

BIN
build/jtc5-05-workshop.pdf Normal file

Binary file not shown.

Binary file not shown.

View File

@ -1,44 +1,76 @@
\immediate\write18{texcount -sum -1 -inc j-spec.tex > /tmp/wordcount.tex}
% report is for the complete book
%\documentclass[a4paper,12pt]{report}
% article is for single section compilation
\documentclass[a4paper,12pt]{article}
\usepackage[english,russian]{babel}
\usepackage{ifthen}
\input{settings/main-style-preamble}
\input{settings/fancy-listings-preamble}
\graphicspath{{./pics/}}
\title{Техническая специализация Java\\\small{(1. Java Core)}}
\title{Техническая специализация Java}
\author{Иван Игоревич Овчинников}
\date{\today{} (\DTMcurrenttime)}
% defining if document is compiled as book or as articles
\def\isSingle{1}
\usepackage{subfiles}
\begin{document}
\maketitle
\tableofcontents
\pagestyle{plain}
%\chapter{Java Core}
\ifx\isSingle\undefined
\tableofcontents
\fi
\pagestyle{plain}
\sloppy
\newpage
\subfile{jtc1-01a}
\ifx\isSingle\undefined
\chapter{Java Core}
\fi
\subfile{jtc1-01-abstract}
\newpage
\subfile{jtc2-02a}
\subfile{jtc2-02-abstract}
\newpage
\subfile{jtc3-03a}
%\newpage
\subfile{jtc3-03-abstract}
\newpage
\subfile{jtc4-04-abstract}
\newpage
\subfile{jtc5-05-abstract}
\newpage
\ifx\isSingle\undefined
\chapter{Java Development Kit}
\fi
%\subfile{jtd6-11a}
%\section{Специализация: ООП}
%\section{Специализация: Тонкости работы}
%Файловая система и представление данных; Пакеты \code{java.io}, \code{java.nio}, \code{String}, \code{StringBuilder}, string pool, ?JSON/XML?
\newpage
\appendix
\sloppy
\printnomenclature[27mm]
\chapter*{Приложения}
%\addcontentsline{toc}{chapter}{Приложения}
\setcounter{secnumdepth}{5}
\ifx\isSingle\undefined
\printnomenclature[40mm]
\appendix
\chapter*{Семинары}
\addcontentsline{toc}{chapter}{Семинары}
\fi
\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}

View File

@ -3,8 +3,9 @@
\begin{document}
\pagestyle{plain}
\tableofcontents
\section{Платформа: история и окружение}
\subsection{В этом разделе}
\subsection*{В этом разделе}
Краткая история (причины возникновения); инструментарий, выбор версии; CLI; структура проекта; документирование; некоторые интересные способы сборки проектов.
В этом разделе происходит первое знакомство со внутреннем устройством языка Java и фреймворком разработки приложений с его использованием. Рассматривается примитивный инструментарий и базовые возможности платформы для разработки приложений на языке Java. Разбирается структура проекта, а также происходит ознакомление с базовым инструментарием для разработки на Java.
@ -466,6 +467,7 @@ Docker-образ и, как следствие, Docker-контейнеры в
\item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере подьзователя, а второй забирать скомпилированные классы и исполнять их.
\end{itemize}
\newpage
\printnomenclature[40mm]
\end{document}

View File

@ -1,4 +1,4 @@
\documentclass[../j-spec.tex]{subfiles}
\documentclass[j-spec.tex]{subfiles}
\begin{document}
\sloppy

View File

@ -1,12 +1,11 @@
\documentclass[j-spec.tex]{subfiles}
\begin{document}
%\setcounter{tocdepth}{3}
\setcounter{section}{1}
\pagestyle{plain}
\tableofcontents
\section{Специализация: данные и функции}
\subsection{В предыдущем разделе}
\subsection*{В предыдущем разделе}
\begin{itemize}
\item Краткая история (причины возникновения);
\item инструментарий, выбор версии;
@ -16,7 +15,7 @@
\item некоторые интересные способы сборки проектов.
\end{itemize}
\subsection{В этом разделе}
\subsection*{В этом разделе}
Будет рассмотрен базовый функционал языка, то есть основная встроенная функциональность, такая как математические операторы, условия, циклы, бинарные операторы. Далее способы хранения и представления данных в Java, и в конце способы манипуляции данными, то есть функции (в терминах языка называющиеся методами).
\begin{itemize}
\item \nom{Метод}{функция в языке программирования, принадлежащая классу};

View File

@ -1,4 +1,4 @@
\documentclass[../j-spec.tex]{subfiles}
\documentclass[j-spec.tex]{subfiles}
\usepackage{spreadtab}
\begin{document}

View File

@ -6,11 +6,12 @@
\pagestyle{plain}
\sloppy
\tableofcontents
\section{Специализация: ООП}
\subsection{В предыдущем разделе}
\subsection*{В предыдущем разделе}
Будет рассмотрен базовый функционал языка, то есть основная встроенная функциональность, такая как математические операторы, условия, циклы, бинарные операторы. Далее способы хранения и представления данных в Java, и в конце способы манипуляции данными, то есть функции (в терминах языка называющиеся методами).
\subsection{В этом разделе}
\subsection*{В этом разделе}
Разберём такие основополагающих в Java вещи, как классы и объекты, а также с тем, как применять на практике основные принципы ООП: наследование, полиморфизм и инкапсуляцию. Дополнительно рассмотрим устройство памяти в джава.
\begin{itemize}
\item \nom{Класс}{определяет форму и сущность объекта и является логической конструкцией, на основе которой построен весь язык Java. Определяет новый тип данных};
@ -330,13 +331,26 @@ public class Cat {
}
\end{lstlisting}
Помимо того, что статические поля - это полезный инструмент создания общих свойств это ещ§ и опасный инструмент создания общих свойств. Так, например, мы знаем, что у котов четыре лапы, а не 6 и не 8. Не создавая никакого барсика будет понятно, что у кота - 4 лапы. Это полезное поведение.
Помимо того, что статические поля -- это полезный инструмент создания общих свойств это ещё и опасный инструмент создания общих свойств. Так, например, мы знаем, что у котов четыре лапы, а не шесть и не восемь. Не создавая никакого Барсика будет понятно, что у кота -- четыре лапы. Это полезное поведение любого класса и его объектов.
лайвкод 03-статическое-поле-ошибка Посмотрим на опасность. Мы видим, что у каждого кота есть имя, и помним, что коты хранят значение своего имени каждый сам у себя. А знают экземпляры о названии поля потому что знают, какого класса они экземпляры. Но что если мы по невнимательности добавим свойство статичности к имени кота?
\begin{lstlisting}[language=Java,style=JCodeStyle]
public class Cat {
static int pawsCount = 4;
03-статическое-поле-признак Создав тех же самых котов, которых мы создавали весь урок, мы получим двух мурзиков и ни одного барсика. Почему это произошло? По факту переменная у нас одна на всех, и значение тоже одно, а значит каждый раз мы меняем именно его, а все остальные коты ничего не подозревая смотрят на значение общей переменной и бодро его возвращают. Поэтому, чтобы не запутаться, к статическим переменным, как правило, обращаются не по ссылке на объект — cat1.name, а по имени класса — Cat.name.
static String name;
String color;
int age;
03-статические-поля К слову, статические переменные — редкость в Java. Вместо них применяют статические константы. Они определяются ключевыми словами static final и по соглашению о внешнем виде кода пишутся в верхнем регистре.
// ...
}
\end{lstlisting}
У каждого кота есть имя, и коты хранят значение своего имени каждый сам у себя. А знают экземпляры о названии поля потому что знают, какого класса они экземпляры. В чём опасность? Что если по невнимательности добавить свойство статичности к имени кота?
Создав тех же котов, такой класс вернёт двух Мурзиков и ни одного Барсика. Почему это произошло? По факту переменная одна на всех, и значение тоже одно, а значит при каждом вызове конструктора меняется именно оно, а все остальные коты, ничего не подозревая, смотрят на значение общей переменной и возвращают его. Поэтому, к статическим переменным, как правило, обращаются не по ссылке на объект -- \code{cat1.name}, а по имени класса -- \code{Cat.name}.
\begin{frm} \info Статические переменные -- редкость в Java. Вместо них применяют статические константы. Они определяются ключевыми словами \code{static final} и по соглашению о внешнем виде кода пишутся в верхнем регистре, разделяя слова символом нижнего подчёркивания, так называемым \code{UPPER_SNAKE_CASE}.
\end{frm}
\subsubsection{Задание для самопроверки}
\begin{enumerate}
@ -681,8 +695,9 @@ public class Cat {
Представим, что есть необходимость создать помимо класса котиков, класс собачек. Данный класс будет выглядеть очень похожим образом, только он будет не мяукать, а гавкать, и заменим обоим животным прыжок на простое перемещение на лапках.
\begin{multicols}{2}
\begin{lstlisting}[language=Java,style=JCodeStyle,label={lst:cmpcat},caption={Класс кота}]
\begin{figure}[H]
\begin{multicols}{2}
\begin{lstlisting}[language=Java,style=JCodeStyle,label={lst:cmpcat},caption={Класс кота}]
public class Cat {
private String name;
private String color;
@ -695,27 +710,27 @@ public class Cat {
}
public String getName() {
return name;
return name;
}
public String getColor() {
return color;
return color;
}
public int getAge() {
return age;
return age;
}
public void setName(String name) {
this.name = name;
this.name = name;
}
public void setColor(String color) {
this.color = color;
this.color = color;
}
public void setAge(int age) {
this.age = age;
this.age = age;
}
void voice() {
@ -726,9 +741,9 @@ public class Cat {
System.out.println(name + " walks on paws");
}
}
\end{lstlisting}
\columnbreak
\begin{lstlisting}[language=Java,style=JCodeStyle,label={lst:cmpdog},caption={Класс собаки}]
\end{lstlisting}
\columnbreak
\begin{lstlisting}[language=Java,style=JCodeStyle,label={lst:cmpdog},caption={Класс собаки}]
public class Dog {
private String name;
private String color;
@ -741,27 +756,27 @@ public class Dog {
}
public String getName() {
return name;
return name;
}
public String getColor() {
return color;
return color;
}
public int getAge() {
return age;
return age;
}
public void setName(String name) {
this.name = name;
this.name = name;
}
public void setColor(String color) {
this.color = color;
this.color = color;
}
public void setAge(int age) {
this.age = age;
this.age = age;
}
void voice() {
@ -772,8 +787,9 @@ public class Dog {
System.out.println(name + " walks on paws");
}
}
\end{lstlisting}
\end{multicols}
\end{lstlisting}
\end{multicols}
\end{figure}
Очевидно это не DRY и неприемлемо, если появится необходимость описать классы для целого зоопарка. В приведённых классах есть очень много абсолютно одинаковых и очень похожих полей и методов.
@ -819,6 +835,7 @@ public class Animal {
Простой перенос кода в родительский класс показал наличие проблемы. Модификатор \code{private} определяет область видимости только внутри класса, а если нужно чтобы переменную было видно ещё и в классах-наследниках, нужен хотя бы модификатор доступа по умолчанию. Если же класс наследник создаётся в каком-то другом пакете, то и default не подойдёт.
\begin{figure}[H]
\begin{multicols}{2}
\begin{lstlisting}[language=Java,style=JCodeStyle,label={lst:cmpdog1},caption={Класс собаки}]
public class Dog extends Animal {
@ -856,6 +873,7 @@ public class Cat extends Animal {
}
\end{lstlisting}
\end{multicols}
\end{figure}
То есть, к членам данных и методам класса можно применять следующие модификаторы доступа
\begin{itemize}
@ -882,6 +900,7 @@ public class Cat extends Animal {
При описании класса, можно явно вызвать конструктор базового класса в конструкторе класса-потомка. Базовый класс еще называют «суперклассом», поэтому в Java для его обозначения используется ключевое слово \code{super}. Здесь такое же ограничение, как и при вызове конструкторов данного класса (через \code{this}) - вызов такого конструктора может быть только один и быть только первой строкой. Таким образом, код, для всех животных в программе будет выглядеть следующим образом:
\begin{figure}[H]
\begin{multicols}{2}
\begin{lstlisting}[language=Java,style=JCodeStyle,label={lst:animal-full},caption={Класс животного}]
public class Animal {
@ -968,6 +987,7 @@ public class Bird extends Animal {
}
\end{lstlisting}
\end{multicols}
\end{figure}
Для примера, создали ещё один класс, наследника животного, чтобы использовать наследование по назначению. Наследование реализуется через ключевое слово \code{extends}, расширять. Важно, что класс-родитель расширяется функциональностью или свойствами класса-наследника. Это позволило, например, добавить в птичку такое свойство как высота полёта и такой метод как летать, в дополнение к тому, что умеют все животные.

View File

@ -1,4 +1,4 @@
\documentclass[../j-spec.tex]{subfiles}
\documentclass[j-spec.tex]{subfiles}
\usepackage{spreadtab}
\begin{document}
@ -56,7 +56,7 @@
\end{spreadtab}
\subsection{Подробности}
\subsubsection{Организационный момент}
\subsubsection*{Организационный момент}
\begin{itemize}
\item \textbf{Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
\item \textbf{Тайминг:} 3-5 минут.
@ -68,7 +68,7 @@
\end{itemize}
\end{itemize}
\subsubsection{Quiz}
\subsubsection*{Quiz}
\begin{itemize}
\item \textbf{Цель этапа:} Вовлечение аудитории в обратную связь.
\item \textbf{Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
@ -118,7 +118,7 @@
\end{enumerate}
\end{itemize}
\subsubsection{Рассмотрение ДЗ}
\subsubsection*{Рассмотрение ДЗ}
\begin{itemize}
\item \textbf{Цель этапа:} Пояснить не очевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
\item \textbf{Тайминг:} 15-20 минут.
@ -131,11 +131,11 @@
\begin{itemize}
\item Написать класс кота так, чтобы каждому объекту кота присваивался личный порядковый целочисленный номер;
\textbf{Вариант решения в приложении \ref{appendix:hw1}}
\textbf{Вариант решения в приложении \ref{appendix:sem3-hw1}}
\item Написать классы кота и собаки, наследники животного. У всех есть три действия: бежать, плыть, прыгать. Действия принимают размер препятствия и возвращают булев результат. Три ограничения: высота прыжка, расстояние, которое животное может пробежать, расстояние, которое животное может проплыть. Следует учесть, что коты не любят воду.
\textbf{Вариант решения в приложении \ref{appendix:hw2}}
\textbf{Вариант решения в приложении \ref{appendix:sem3-hw2}}
\item Добавить механизм, создающий 25\% разброс значений каждого ограничения для каждого объекта.
@ -157,7 +157,7 @@
\end{itemize}
\end{itemize}
\subsubsection{Вопросы и ответы}
\subsubsection*{Вопросы и ответы}
\begin{itemize}
\item \textbf{Ценность этапа} Вовлечение аудитории в обратную связь, пояснение неочевидных моментов в материале лекции и другой проделанной работе.
\item \textbf{Тайминг} 5-15 минут
@ -171,7 +171,7 @@
\end{itemize}
\end{itemize}
\subsubsection{Задание 1}
\subsubsection*{Задание 1}
\begin{itemize}
\item \textbf{Ценность этапа} Создание класса и объекта.
\item \textbf{Тайминг} 5 минут.
@ -184,7 +184,7 @@
\begin{itemize}
\item Создать класс "Сотрудник" с полями: ФИО, должность, телефон, зарплата, возраст;
\textbf{Вариант исполнения класса в приложении \ref{appendix:ct1}}
\textbf{Вариант исполнения класса в приложении \ref{appendix:sem3-ct1}}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Создание объекта класса}]
Employee employeeIvan = new Employee("Ivan", "Igorevich",
@ -194,7 +194,7 @@ Employee employeeIvan = new Employee("Ivan", "Igorevich",
\end{itemize}
\end{itemize}
\subsubsection{Задание 2}
\subsubsection*{Задание 2}
\begin{itemize}
\item \textbf{Ценность этапа} Манипуляция информацией об объекте.
\item \textbf{Тайминг} 10 минут.
@ -259,7 +259,7 @@ Employee employeeIvan = new Employee("Ivan", "Igorevich",
\end{itemize}
\end{itemize}
\subsubsection{Задание 3}
\subsubsection*{Задание 3}
\begin{itemize}
\item \textbf{Ценность этапа} Создание и манипуляция множествами объектов.
\item \textbf{Тайминг} 20-25 минут.
@ -335,7 +335,7 @@ Employee[] employees = {
\end{itemize}
\end{itemize}
\subsubsection{Задание 4}
\subsubsection*{Задание 4}
\begin{itemize}
\item \textbf{Ценность этапа} Манипуляция информацией об объекте.
\item \textbf{Тайминг} 15-20 минут.
@ -410,7 +410,7 @@ for (int i = 0; i < employees.length; i++) {
\end{itemize}
\end{itemize}
\subsubsection{Задание 5}
\subsubsection*{Задание 5}
\begin{itemize}
\item \textbf{Ценность этапа} Соблюдение атомарности методов, независимость методов, манипулирующих данными от окружения.
\item \textbf{Тайминг} 10-15 минут.
@ -445,7 +445,7 @@ private static float averageAge(Employee[] emp){
\end{lstlisting}
\end{itemize}
\subsubsection{Домашнее задание}
\subsubsection*{Домашнее задание}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf{Тайминг} 5-10 минут.
@ -512,7 +512,7 @@ for (int i = 0; i < employees.length; i++) {
\end{itemize}
\end{itemize}
\subsubsection{Рефлексия и завершение семинара}
\subsubsection*{Рефлексия и завершение семинара}
\begin{itemize}
\item \textbf{Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
\item \textbf{Тайминг:} 5-10 минут
@ -529,21 +529,22 @@ for (int i = 0; i < employees.length; i++) {
\newpage
\appendix
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}
\subsection*{Приложения}
\addcontentsline{toc}{subsection}{Приложения}
\setcounter{subsubsection}{0}
\renewcommand{\thesubsubsection}{\Asbuk{subsubsection}}
\subsection{Домашнее задание 1}
\label{appendix:hw1}
\subsubsection{Домашнее задание 1}
\label{appendix:sem3-hw1}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Кот}]{src/s03-hw1-cat.java}
\subsection{Домашнее задание 2}
\label{appendix:hw2}
\subsubsection{Домашнее задание 2}
\label{appendix:sem3-hw2}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Общий класс животного}]{src/s03-hw2-animal.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Кот}]{src/s03-hw2-cat.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Собака}]{src/s03-hw2-dog.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Марафон}]{src/s03-hw2-marathon.java}
\subsection{Практическое задание 1}
\label{appendix:ct1}
\subsubsection{Практическое задание 1}
\label{appendix:sem3-ct1}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Сотрудник}]{src/s03-ct1-employee.java}
\end{document}

View File

@ -6,11 +6,12 @@
\pagestyle{plain}
\sloppy
\tableofcontents
\section{Специализация: ООП и исключения}
\subsection{В предыдущем разделе}
\subsection*{В предыдущем разделе}
Была рассмотрена реализация объектно-ориентированного программирования в Java. Рассмотрели классы и объекты, а также наследование, полиморфизм и инкапсуляцию. Дополнительно был освещён вопрос устройства памяти.
\subsection{В этом разделе}
\subsection*{В этом разделе}
В дополнение к предыдущему, будут разобраны такие понятия, как внутренние и вложенные классы; процессы создания, использования и расширения перечислений. Более детально будет разобрано понятие исключений и их тесная связь с многопоточностью в Java. Будут рассмотрены исключения с точки зрения ООП, процесс обработки исключений.
\begin{itemize}
\item \nom{Перечисление}{это упоминание объектов, объединённых по какому-либо признаку. Фактически, представляет новый тип данных, поэтому возможно определить переменную данного типа и использовать её.};

View File

@ -1,4 +1,4 @@
\documentclass[../j-spec.tex]{subfiles}
\documentclass[j-spec.tex]{subfiles}
\usepackage{spreadtab}
\begin{document}
@ -51,7 +51,7 @@
\end{spreadtab}
\subsection{Подробности}
\subsubsection{Организационный момент}
\subsubsection*{Организационный момент}
\begin{itemize}
\item \textbf{Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
\item \textbf{Тайминг:} 3-5 минут.
@ -63,7 +63,7 @@
\end{itemize}
\end{itemize}
\subsubsection{Quiz}
\subsubsection*{Quiz}
\begin{itemize}
\item \textbf{Цель этапа:} Вовлечение аудитории в обратную связь.
\item \textbf{Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
@ -101,7 +101,7 @@
\end{enumerate}
\end{itemize}
\subsubsection{Рассмотрение ДЗ}
\subsubsection*{Рассмотрение ДЗ}
\begin{itemize}
\item \textbf{Цель этапа:} Пояснить не очевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
\item \textbf{Тайминг:} 15-20 минут.
@ -143,14 +143,14 @@ private static final class RowMismatchException extends RuntimeException {
\item для проверки напишите программу, преобразующую квадратный массив целых чисел 5х5 в сумму чисел в этом массиве, при этом, программа должна выбросить исключение, если строк или столбцов в исходном массиве окажется не 5.
\textbf{Вариант решения представлен в приложении \ref{appendix:hw3}}
\textbf{Вариант решения представлен в приложении \ref{appendix:sem4-hw3}}
\end{itemize}
\end{itemize}
\subsubsection{Вопросы и ответы}
\subsubsection*{Вопросы и ответы}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf{Ценность этапа} Вовлечение аудитории в обратную связь, пояснение неочевидных моментов в материале лекции и другой проделанной работе.
\item \textbf{Тайминг} 5-15 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
@ -162,7 +162,7 @@ private static final class RowMismatchException extends RuntimeException {
\end{itemize}
\end{itemize}
\subsubsection{Задание 1}
\subsubsection*{Задание 1}
\begin{itemize}
\item \textbf{Ценность этапа} Написание почти полноценной механики по краткому ТЗ.
\item \textbf{Тайминг} 25-30 минут.
@ -180,7 +180,7 @@ private static final class RowMismatchException extends RuntimeException {
\item В основном классе программы необходимо по-разному обработать исключения.
\item Метод возвращает \code{true}, если значения верны или \code{false} в противном случае.
\end{enumerate}
\textbf{Вариант исполнения класса в приложении \ref{appendix:ct1}}
\textbf{Вариант исполнения класса в приложении \ref{appendix:sem4-ct1}}
\textbf{Вариант маршрута решения задачи}
@ -256,7 +256,7 @@ public static boolean checkCredentials(String login, String password, String con
\end{itemize}
\subsubsection{Задание 2}
\subsubsection*{Задание 2}
\begin{itemize}
\item \textbf{Ценность этапа} Написание наброска пет-проекта, повторение информации об ООП, работа с исключениями.
\item \textbf{Тайминг} 35-40 минут.
@ -280,7 +280,7 @@ public static boolean checkCredentials(String login, String password, String con
\end{itemize}
\item Вывести в консоль итоговое количество совершённых покупок после выполнения основного кода приложения.
\end{enumerate}
\textbf{Вариант исполнения класса в приложении \ref{appendix:ct1}}
\textbf{Вариант исполнения класса в приложении \ref{appendix:sem4-ct1}}
\textbf{Вариант маршрута решения задачи}
@ -366,7 +366,7 @@ public static Order buy(Customer who, Item what, int howMuch) {
\end{lstlisting}
\end{itemize}
\subsubsection{Домашнее задание}
\subsubsection*{Домашнее задание}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf{Тайминг} 5-10 минут.
@ -430,7 +430,7 @@ private static void celebrate(Employee[] emp) {
\end{enumerate}
\end{itemize}
\subsubsection{Рефлексия и завершение семинара}
\subsubsection*{Рефлексия и завершение семинара}
\begin{itemize}
\item \textbf{Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
\item \textbf{Тайминг:} 5-10 минут
@ -447,20 +447,21 @@ private static void celebrate(Employee[] emp) {
\newpage
\appendix
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}
\subsection*{Приложения}
\addcontentsline{toc}{subsection}{Приложения}
\setcounter{subsubsection}{0}
\renewcommand{\thesubsubsection}{\Asbuk{subsubsection}}
\subsection{Домашнее задание 3}
\label{appendix:hw3}
\subsubsection{Домашнее задание 3}
\label{appendix:sem4-hw3}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Основная программа}]{src/s04-hw3-exceptional.java}
\subsection{Практическое задание 1}
\label{appendix:ct1}
\subsubsection{Практическое задание 1}
\label{appendix:sem4-ct1}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Логин}]{src/s04-ct1-sign.java}
\subsection{Практическое задание 2}
\label{appendix:ct2}
\subsubsection{Практическое задание 2}
\label{appendix:sem4-ct2}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Магазин}]{src/s04-ct2-shop.java}
\end{document}

View File

@ -6,11 +6,12 @@
\pagestyle{plain}
\sloppy
\tableofcontents
\section{Специализация: тонкости работы}
\subsection{В предыдущем разделе}
\subsection*{В предыдущем разделе}
Рассмотрены понятия внутренних и вложенных классов; процессы создания, использования и расширения перечислений. Подробно рассмотрены исключения с точки зрения ООП, их философия и тесная связь с многопоточностью в Java, обработка, разделение понятия штатных и нештатных ситуаций.
\subsection{В этом разделе}
\subsection*{В этом разделе}
Файловые системы и представление данных в запоминающих устройствах; Начало рассмотрения популярных пакетов ввода-вывода \code{java.io}, \code{java.nio}. Более подробно будет разобран один из самых популярных ссылочных типов данных \code{String} и механики вокруг него.
\begin{itemize}
\item \nom{Файл}{именованная область данных на носителе информации, используемая как базовый объект взаимодействия с данными в операционных системах.};
@ -710,8 +711,6 @@ cat0 equal to cat3? false
\end{document}
% Основная загрузочная запись (MBR)
% Основная загрузочная запись (MBR) — это устаревшая форма разделения загрузочного сектора. Это первый сектор диска, который содержит информацию о том, как разбит диск. Он также содержит загрузчик, который сообщает вашей машине, как загрузить ОС.
% MBR состоит из трех частей:

View File

@ -1,12 +1,12 @@
\documentclass[../j-spec.tex]{subfiles}
\documentclass[j-spec.tex]{subfiles}
\usepackage{spreadtab}
\begin{document}
\setcounter{section}{4}
\section{Семинар: обработка исключений}
\section{Семинар: тонкости работы}
\subsection{Инструментарий}
\begin{itemize}
\item \href{https://docs.google.com/presentation/d/}{Презентация} для преподавателя, ведущего семинар;
\item \href{https://docs.google.com/presentation/d/1zW_qrNiH5xH0jRZApzWQWH3eC_qJuzRJAPPsnpNDSig}{Презентация} для преподавателя, ведущего семинар;
\item \href{https://drive.google.com/file/d/1LWyE8aEy4-1gsognqhXIXwDcoLviVge4/view}{Фон} GeekBrains для проведения семинара в Zoom;
\item JDK любая 11 версии и выше;
\item \href{https://www.jetbrains.com/idea/download}{IntelliJ IDEA Community Edition} для практики и примеров используется IDEA.
@ -31,15 +31,21 @@
\hline
@ Quiz & 5 & @ 6-18 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (6 вопросов, по минуте на ответ) \\
\hline
@ Рассмотрение ДЗ лекции & 10 & @ 19-23 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
@ Рассмотрение ДЗ лекции & 10 & @ 19-27 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
\hline
@ Вопросы и ответы & 10 & @ 24 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
@ Вопросы и ответы & 10 & @ 28 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
\hline
@ Задание 1 & 30 & @ 25-35 & @ Сквозное задание, состоящее из объяснений в 6 пунктах, обязательных к исполнению. Всё задание выдаётся сразу целиком и является неделимым. \\
@ Задание 1 & 10 & @ 29-33 & @ Сохранение состояния приложения между запусками \\
\hline
@ Перерыв (если нужен) & 5 & @ 36 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
@ Задание 2 & 15 & @ 34-37 & @ Загрузка состояния приложения при запуске \\
\hline
@ Задание 2 & 40 & @ 37-49 & @ Сквозное задание, состоящее из объяснений в 6 пунктах, обязательных к исполнению. Всё задание выдаётся сразу целиком и является неделимым. \\
@ Перерыв (если нужен) & 5 & @ 38 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
\hline
@ Задание 3 & 10 & @ 39-42 & @ Работа с текстом (автоматизированный поиск и замена текста в файле или группе файлов) \\
\hline
@ Задание 4 & 15 & @ 43-46 & @ Работа с файловой системой \\
\hline
@ Задание 5 (необязат) & 20 & @ 47-49 & @ Описание часто недостающих механик операционной системы по «массовой» работе с файлами \\
\hline
@ Домашнее задание & 5 & @ 50-51 & @ Объясните домашнее задание, подведите итоги урока \\
\hline
@ -50,7 +56,7 @@
\end{spreadtab}
\subsection{Подробности}
\subsubsection{Организационный момент}
\subsubsection*{Организационный момент}
\begin{itemize}
\item \textbf{Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
\item \textbf{Тайминг:} 3-5 минут.
@ -62,7 +68,7 @@
\end{itemize}
\end{itemize}
\subsubsection{Quiz}
\subsubsection*{Quiz}
\begin{itemize}
\item \textbf{Цель этапа:} Вовлечение аудитории в обратную связь.
\item \textbf{Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
@ -100,7 +106,7 @@
\end{enumerate}
\end{itemize}
\subsubsection{Рассмотрение ДЗ}
\subsubsection*{Рассмотрение ДЗ}
\begin{itemize}
\item \textbf{Цель этапа:} Пояснить не очевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
\item \textbf{Тайминг:} 15-20 минут.
@ -280,9 +286,9 @@ private static boolean isInFile(String fileName, String search) throws IOExcepti
\end{itemize}
\end{itemize}
\subsubsection{Вопросы и ответы}
\subsubsection*{Вопросы и ответы}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf{Ценность этапа} Вовлечение аудитории в обратную связь, пояснение неочевидных моментов в материале лекции и другой проделанной работе.
\item \textbf{Тайминг} 5-15 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
@ -294,15 +300,10 @@ private static boolean isInFile(String fileName, String search) throws IOExcepti
\end{itemize}
\end{itemize}
% чтение содержимого текущей папки (*указанной папки)
% batch prefix adder ('file1 file2 file3' 'prefix')
% программа заменяющая символ в файле, сохраняющая результат в новый файл (*заменяющая слово)
\subsubsection{Задание 1}
\subsubsection*{Задание 1}
\begin{itemize}
\item \textbf{Ценность этапа} Сохранение состояния приложения между запусками
\item \textbf{Тайминг} 15-20 мин
\item \textbf{Тайминг} 10-15 мин
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Выдать задание студентам;
@ -343,29 +344,12 @@ for (int i = 0; i < ar0.length; 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}
\subsubsection*{Задание 2}
\begin{itemize}
\item \textbf{Ценность этапа} Загрузка состояния приложения при запуске
\item \textbf{Тайминг} 15-20 мин
@ -395,7 +379,7 @@ fis.close();
System.out.println(Arrays.toString(ar00));
\end{lstlisting}
\item [$*_1$] Прочитать из файла с числами, предполагая, что разделитель -- это число 0.
\item [$*_1$] Прочитать данные из файла с числами, предполагая, что разделитель -- это число 0.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle]
@ -414,31 +398,143 @@ fis.close();
System.out.println(Arrays.toString(ar10));
\end{lstlisting}
\end{itemize}
\end{itemize}
\item [$*_2$] Прочитать из файла, полученного в результате выполнения задания $1*_2$.
\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]
int[] ar20 = new int[9];
FileInputStream fis = new FileInputStream("Main.java");
int i;
char what = ',';
char to = '!';
FileOutputStream fos = new FileOutputStream("Main.java.new");
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;
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);
}
}
}
fis.close();
System.out.println(Arrays.toString(ar20));
\end{lstlisting}
fos.write(sb.toString().getBytes());
\end{lstlisting}
\end{itemize}
\end{itemize}
\subsubsection{Домашнее задание}
\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{Тайминг} 20-25 мин
\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*{Домашнее задание}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf{Тайминг} 5-10 минут.
@ -454,55 +550,54 @@ System.out.println(Arrays.toString(ar20));
\item [5-25 мин] Выполнить все задания семинара, если они не были решены, без ограничений по времени;
\textbf{Все варианты решения приведены в тексте семинара выше}
\item [15 мин] 1. В класс покупателя добавить перечисление с гендерами, добавить в сотрудника свойство «пол» со значением созданного перечисления. Добавить геттеры, сеттеры.
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Свойства сотрудника}]
enum Genders{MALE, FEMALE};
\item [15 мин] 1. Написать функцию, создающую резервную копию всех файлов в директории (без поддиректорий) во вновь созданную папку \code{./backup}
\begin{lstlisting}[language=Java,style=JCodeStyle]
Files.createDirectory(Path.of("./backup"));
// ...
Genders gender;
public Employee(String name, String midName, String surName, String phone, String position, int salary, int birth, Genders gender) {
// ...
this.gender = gender;
}
public Genders getGender() {
return gender;
}
public void setGender(Genders gender) {
this.gender = gender;
DirectoryStream<Path> dir = Files.newDirectoryStream(Path.of("."));
for (Path file : dir) {
if (Files.isDirectory(file)) continue;
Files.copy(file, Path.of("./backup/" + file.toString()));
}
\end{lstlisting}
\item [20-25 мин] 2. Добавить в основную программу перечисление с праздниками (нет праздника, Новый Год, 8 марта, 23 февраля), написать метод, принимающий массив сотрудников, поздравляющий всех сотрудников с Новым Годом, женщин с 8 марта, а мужчин с 23 февраля, если сегодня соответствующий день.
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Праздники}]
enum Parties{NONE, NEW_YEAR, MARCH_8, FEB_23}
private static final Parties today = Parties.NONE;
\item [20-25 мин] 2. Предположить, что числа в исходном массиве из 9 элементов имеют диапазон $[0, 3]$, и представляют собой, например, состояния ячеек поля для игры в крестики-нолики, где 0 -- это пустое поле, 1 -- это поле с крестиком, 2 -- это поле с ноликом, 3 -- резервное значение. Такое предположение позволит хранить в одном числе типа \code{int} всё поле 3х3. Записать в файл 9 значений так, чтобы они заняли три байта.
private static void celebrate(Employee[] emp) {
for (int i = 0; i < emp.length; i++) {
switch (today) {
case NEW_YEAR:
System.out.println(emp[i].name + ", happy New Year!");
break;
case FEB_23:
if (emp[i].gender == Employee.Genders.MALE)
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!");
}
\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}
\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;
}
}
\end{lstlisting}
fis.close();
System.out.println(Arrays.toString(ar20));
\end{lstlisting}
\end{enumerate}
\end{itemize}
\subsubsection{Рефлексия и завершение семинара}
\subsubsection*{Рефлексия и завершение семинара}
\begin{itemize}
\item \textbf{Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
\item \textbf{Тайминг:} 5-10 минут
@ -518,13 +613,4 @@ private static void celebrate(Employee[] emp) {
\end{itemize}
\newpage
\appendix
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}
\subsection{Домашнее задание 3}
\label{appendix:hw3}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Основная программа}]{src/s04-hw3-exceptional.java}
\end{document}

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.

View File

@ -21,6 +21,7 @@
\usepackage{amsmath}
\usepackage{spreadtab}
\usepackage{svg}
\usepackage{afterpage}
\newcommand{\tabitem}{~~\llap{\textbullet}~~}
@ -66,10 +67,10 @@
}
\geometry{
left=2cm,
right=1cm,
top=2cm,
bottom=2cm
lmargin=1.5cm,
rmargin=2.5cm,
tmargin=2.5cm,
bmargin=2.5cm,
}
\setlist{nolistsep}

2196
sources-draft/notebook.ipynb Normal file

File diff suppressed because it is too large Load Diff