Compare commits
3 Commits
c6d3ea0d88
...
bef6708291
Author | SHA1 | Date |
---|---|---|
Ivan I. Ovchinnikov | bef6708291 | |
Ivan I. Ovchinnikov | 6f0bcb21c6 | |
Ivan I. Ovchinnikov | 88a759b9ca |
BIN
build/j-spec.pdf
68
j-spec.tex
|
@ -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}
|
||||
|
|
|
@ -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}
|
|
@ -1,4 +1,4 @@
|
|||
\documentclass[../j-spec.tex]{subfiles}
|
||||
\documentclass[j-spec.tex]{subfiles}
|
||||
|
||||
\begin{document}
|
||||
\sloppy
|
|
@ -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{Метод}{функция в языке программирования, принадлежащая классу};
|
|
@ -1,4 +1,4 @@
|
|||
\documentclass[../j-spec.tex]{subfiles}
|
||||
\documentclass[j-spec.tex]{subfiles}
|
||||
\usepackage{spreadtab}
|
||||
|
||||
\begin{document}
|
|
@ -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}, расширять. Важно, что класс-родитель расширяется функциональностью или свойствами класса-наследника. Это позволило, например, добавить в птичку такое свойство как высота полёта и такой метод как летать, в дополнение к тому, что умеют все животные.
|
||||
|
|
@ -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}
|
|
@ -6,11 +6,12 @@
|
|||
\pagestyle{plain}
|
||||
\sloppy
|
||||
\tableofcontents
|
||||
|
||||
\section{Специализация: ООП и исключения}
|
||||
\subsection{В предыдущем разделе}
|
||||
\subsection*{В предыдущем разделе}
|
||||
Была рассмотрена реализация объектно-ориентированного программирования в Java. Рассмотрели классы и объекты, а также наследование, полиморфизм и инкапсуляцию. Дополнительно был освещён вопрос устройства памяти.
|
||||
|
||||
\subsection{В этом разделе}
|
||||
\subsection*{В этом разделе}
|
||||
В дополнение к предыдущему, будут разобраны такие понятия, как внутренние и вложенные классы; процессы создания, использования и расширения перечислений. Более детально будет разобрано понятие исключений и их тесная связь с многопоточностью в Java. Будут рассмотрены исключения с точки зрения ООП, процесс обработки исключений.
|
||||
\begin{itemize}
|
||||
\item \nom{Перечисление}{это упоминание объектов, объединённых по какому-либо признаку. Фактически, представляет новый тип данных, поэтому возможно определить переменную данного типа и использовать её.};
|
|
@ -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}
|
|
@ -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 состоит из трех частей:
|
||||
|
|
@ -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}
|
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 374 KiB After Width: | Height: | Size: 374 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 234 KiB After Width: | Height: | Size: 234 KiB |
Before Width: | Height: | Size: 255 KiB After Width: | Height: | Size: 255 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
@ -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}
|
||||
|
|