Compare commits

..

No commits in common. "bef670829134a8f9da9f0300df66aa83f3a3681d" and "c6d3ea0d887362e2e4fc824bf3301ce53cb1d48b" have entirely different histories.

61 changed files with 207 additions and 2545 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,76 +1,44 @@
\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}
\title{Техническая специализация Java\\\small{(1. Java Core)}}
\author{Иван Игоревич Овчинников}
\date{\today{} (\DTMcurrenttime)}
% defining if document is compiled as book or as articles
\def\isSingle{1}
\usepackage{subfiles}
\begin{document}
\maketitle
\ifx\isSingle\undefined
\tableofcontents
\fi
\pagestyle{plain}
\sloppy
%\chapter{Java Core}
\newpage
\ifx\isSingle\undefined
\chapter{Java Core}
\fi
\subfile{jtc1-01-abstract}
\subfile{jtc1-01a}
\newpage
\subfile{jtc2-02-abstract}
\subfile{jtc2-02a}
\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{jtc3-03a}
%\newpage
%\subfile{jtd6-11a}
\appendix
%\section{Специализация: ООП}
\setcounter{secnumdepth}{5}
\ifx\isSingle\undefined
\printnomenclature[40mm]
%\section{Специализация: Тонкости работы}
%Файловая система и представление данных; Пакеты \code{java.io}, \code{java.nio}, \code{String}, \code{StringBuilder}, string pool, ?JSON/XML?
\newpage
\appendix
\chapter*{Семинары}
\addcontentsline{toc}{chapter}{Семинары}
\fi
\sloppy
\printnomenclature[27mm]
\chapter*{Приложения}
%\addcontentsline{toc}{chapter}{Приложения}
\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,9 +3,8 @@
\begin{document}
\pagestyle{plain}
\tableofcontents
\section{Платформа: история и окружение}
\subsection*{В этом разделе}
\subsection{В этом разделе}
Краткая история (причины возникновения); инструментарий, выбор версии; CLI; структура проекта; документирование; некоторые интересные способы сборки проектов.
В этом разделе происходит первое знакомство со внутреннем устройством языка Java и фреймворком разработки приложений с его использованием. Рассматривается примитивный инструментарий и базовые возможности платформы для разработки приложений на языке Java. Разбирается структура проекта, а также происходит ознакомление с базовым инструментарием для разработки на Java.
@ -467,7 +466,6 @@ Docker-образ и, как следствие, Docker-контейнеры в
\item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере подьзователя, а второй забирать скомпилированные классы и исполнять их.
\end{itemize}
\newpage
\printnomenclature[40mm]
\end{document}

View File

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

View File

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

View File

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

View File

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

BIN
seminars/build/jtc1-02c.pdf Normal file

Binary file not shown.

BIN
seminars/build/jtc3-03c.pdf Normal file

Binary file not shown.

BIN
seminars/build/jtc4-04c.pdf Normal file

Binary file not shown.

BIN
seminars/build/jtc5-05c.pdf Normal file

Binary file not shown.

View File

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

View File

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

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:sem3-hw1}}
\textbf{Вариант решения в приложении \ref{appendix:hw1}}
\item Написать классы кота и собаки, наследники животного. У всех есть три действия: бежать, плыть, прыгать. Действия принимают размер препятствия и возвращают булев результат. Три ограничения: высота прыжка, расстояние, которое животное может пробежать, расстояние, которое животное может проплыть. Следует учесть, что коты не любят воду.
\textbf{Вариант решения в приложении \ref{appendix:sem3-hw2}}
\textbf{Вариант решения в приложении \ref{appendix: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:sem3-ct1}}
\textbf{Вариант исполнения класса в приложении \ref{appendix: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,22 +529,21 @@ for (int i = 0; i < employees.length; i++) {
\newpage
\appendix
\subsection*{Приложения}
\addcontentsline{toc}{subsection}{Приложения}
\setcounter{subsubsection}{0}
\renewcommand{\thesubsubsection}{\Asbuk{subsubsection}}
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}
\subsubsection{Домашнее задание 1}
\label{appendix:sem3-hw1}
\subsection{Домашнее задание 1}
\label{appendix:hw1}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Кот}]{src/s03-hw1-cat.java}
\subsubsection{Домашнее задание 2}
\label{appendix:sem3-hw2}
\subsection{Домашнее задание 2}
\label{appendix: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}
\subsubsection{Практическое задание 1}
\label{appendix:sem3-ct1}
\subsection{Практическое задание 1}
\label{appendix:ct1}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Сотрудник}]{src/s03-ct1-employee.java}
\end{document}

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:sem4-hw3}}
\textbf{Вариант решения представлен в приложении \ref{appendix: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:sem4-ct1}}
\textbf{Вариант исполнения класса в приложении \ref{appendix: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:sem4-ct1}}
\textbf{Вариант исполнения класса в приложении \ref{appendix: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,21 +447,20 @@ private static void celebrate(Employee[] emp) {
\newpage
\appendix
\subsection*{Приложения}
\addcontentsline{toc}{subsection}{Приложения}
\setcounter{subsubsection}{0}
\renewcommand{\thesubsubsection}{\Asbuk{subsubsection}}
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}
\subsubsection{Домашнее задание 3}
\label{appendix:sem4-hw3}
\subsection{Домашнее задание 3}
\label{appendix:hw3}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Основная программа}]{src/s04-hw3-exceptional.java}
\subsubsection{Практическое задание 1}
\label{appendix:sem4-ct1}
\subsection{Практическое задание 1}
\label{appendix:ct1}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Логин}]{src/s04-ct1-sign.java}
\subsubsection{Практическое задание 2}
\label{appendix:sem4-ct2}
\subsection{Практическое задание 2}
\label{appendix:ct2}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Магазин}]{src/s04-ct2-shop.java}
\end{document}

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/1zW_qrNiH5xH0jRZApzWQWH3eC_qJuzRJAPPsnpNDSig}{Презентация} для преподавателя, ведущего семинар;
\item \href{https://docs.google.com/presentation/d/}{Презентация} для преподавателя, ведущего семинар;
\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,21 +31,15 @@
\hline
@ Quiz & 5 & @ 6-18 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (6 вопросов, по минуте на ответ) \\
\hline
@ Рассмотрение ДЗ лекции & 10 & @ 19-27 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
@ Рассмотрение ДЗ лекции & 10 & @ 19-23 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
\hline
@ Вопросы и ответы & 10 & @ 28 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
@ Вопросы и ответы & 10 & @ 24 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
\hline
@ Задание 1 & 10 & @ 29-33 & @ Сохранение состояния приложения между запусками \\
@ Задание 1 & 30 & @ 25-35 & @ Сквозное задание, состоящее из объяснений в 6 пунктах, обязательных к исполнению. Всё задание выдаётся сразу целиком и является неделимым. \\
\hline
@ Задание 2 & 15 & @ 34-37 & @ Загрузка состояния приложения при запуске \\
@ Перерыв (если нужен) & 5 & @ 36 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
\hline
@ Перерыв (если нужен) & 5 & @ 38 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
\hline
@ Задание 3 & 10 & @ 39-42 & @ Работа с текстом (автоматизированный поиск и замена текста в файле или группе файлов) \\
\hline
@ Задание 4 & 15 & @ 43-46 & @ Работа с файловой системой \\
\hline
@ Задание 5 (необязат) & 20 & @ 47-49 & @ Описание часто недостающих механик операционной системы по «массовой» работе с файлами \\
@ Задание 2 & 40 & @ 37-49 & @ Сквозное задание, состоящее из объяснений в 6 пунктах, обязательных к исполнению. Всё задание выдаётся сразу целиком и является неделимым. \\
\hline
@ Домашнее задание & 5 & @ 50-51 & @ Объясните домашнее задание, подведите итоги урока \\
\hline
@ -56,7 +50,7 @@
\end{spreadtab}
\subsection{Подробности}
\subsubsection*{Организационный момент}
\subsubsection{Организационный момент}
\begin{itemize}
\item \textbf{Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
\item \textbf{Тайминг:} 3-5 минут.
@ -68,7 +62,7 @@
\end{itemize}
\end{itemize}
\subsubsection*{Quiz}
\subsubsection{Quiz}
\begin{itemize}
\item \textbf{Цель этапа:} Вовлечение аудитории в обратную связь.
\item \textbf{Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
@ -106,7 +100,7 @@
\end{enumerate}
\end{itemize}
\subsubsection*{Рассмотрение ДЗ}
\subsubsection{Рассмотрение ДЗ}
\begin{itemize}
\item \textbf{Цель этапа:} Пояснить не очевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
\item \textbf{Тайминг:} 15-20 минут.
@ -286,9 +280,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}
@ -300,10 +294,15 @@ private static boolean isInFile(String fileName, String search) throws IOExcepti
\end{itemize}
\end{itemize}
\subsubsection*{Задание 1}
% чтение содержимого текущей папки (*указанной папки)
% batch prefix adder ('file1 file2 file3' 'prefix')
% программа заменяющая символ в файле, сохраняющая результат в новый файл (*заменяющая слово)
\subsubsection{Задание 1}
\begin{itemize}
\item \textbf{Ценность этапа} Сохранение состояния приложения между запусками
\item \textbf{Тайминг} 10-15 мин
\item \textbf{Тайминг} 15-20 мин
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Выдать задание студентам;
@ -344,12 +343,29 @@ 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 мин
@ -379,7 +395,7 @@ fis.close();
System.out.println(Arrays.toString(ar00));
\end{lstlisting}
\item [$*_1$] Прочитать данные из файла с числами, предполагая, что разделитель -- это число 0.
\item [$*_1$] Прочитать из файла с числами, предполагая, что разделитель -- это число 0.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle]
@ -398,143 +414,31 @@ fis.close();
System.out.println(Arrays.toString(ar10));
\end{lstlisting}
\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 Написать программу заменяющую указанный символ в текстовом файле на пробел, сохраняющую получившийся текст в новый файл.
\item [$*_2$] Прочитать из файла, полученного в результате выполнения задания $1*_2$.
\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");
int[] ar20 = new int[9];
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);
}
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;
}
}
fos.write(sb.toString().getBytes());
\end{lstlisting}
fis.close();
System.out.println(Arrays.toString(ar20));
\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{Тайминг} 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*{Домашнее задание}
\subsubsection{Домашнее задание}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf{Тайминг} 5-10 минут.
@ -550,54 +454,55 @@ for (String fileName : a) {
\item [5-25 мин] Выполнить все задания семинара, если они не были решены, без ограничений по времени;
\textbf{Все варианты решения приведены в тексте семинара выше}
\item [15 мин] 1. Написать функцию, создающую резервную копию всех файлов в директории (без поддиректорий) во вновь созданную папку \code{./backup}
\begin{lstlisting}[language=Java,style=JCodeStyle]
Files.createDirectory(Path.of("./backup"));
\item [15 мин] 1. В класс покупателя добавить перечисление с гендерами, добавить в сотрудника свойство «пол» со значением созданного перечисления. Добавить геттеры, сеттеры.
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Свойства сотрудника}]
enum Genders{MALE, FEMALE};
DirectoryStream<Path> dir = Files.newDirectoryStream(Path.of("."));
for (Path file : dir) {
if (Files.isDirectory(file)) continue;
Files.copy(file, Path.of("./backup/" + file.toString()));
// ...
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;
}
\end{lstlisting}
\item [20-25 мин] 2. Предположить, что числа в исходном массиве из 9 элементов имеют диапазон $[0, 3]$, и представляют собой, например, состояния ячеек поля для игры в крестики-нолики, где 0 -- это пустое поле, 1 -- это поле с крестиком, 2 -- это поле с ноликом, 3 -- резервное значение. Такое предположение позволит хранить в одном числе типа \code{int} всё поле 3х3. Записать в файл 9 значений так, чтобы они заняли три байта.
\begin{lstlisting}[language=Java,style=JCodeStyle]
int[] ar2 = {0,1,2,3,0,1,2,3,0};
\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;
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;
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!");
}
}
}
fis.close();
System.out.println(Arrays.toString(ar20));
\end{lstlisting}
\end{lstlisting}
\end{enumerate}
\end{itemize}
\subsubsection*{Рефлексия и завершение семинара}
\subsubsection{Рефлексия и завершение семинара}
\begin{itemize}
\item \textbf{Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
\item \textbf{Тайминг:} 5-10 минут
@ -613,4 +518,13 @@ System.out.println(Arrays.toString(ar20));
\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

View File

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

File diff suppressed because it is too large Load Diff