gb-java-devel/jtc2-02-workshop.tex

429 lines
28 KiB
TeX
Raw Permalink Normal View History

2023-01-20 00:56:30 +03:00
\documentclass[j-spec.tex]{subfiles}
2022-12-14 14:43:40 +03:00
\usepackage{spreadtab}
\begin{document}
\setcounter{section}{1}
2022-12-14 14:43:40 +03:00
\section{Семинар: данные и функции}
\subsection{Инструментарий}
\begin{itemize}
2022-12-20 23:51:19 +03:00
\item \href{https://docs.google.com/presentation/d/1GBiXN2dfVc0LlDi4AXpnJMcJZnvK4WHZnIY34Sd3EE0/edit}{Презентация} для преподавателя, ведущего семинар;
2022-12-14 14:43:40 +03:00
\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.
\end{itemize}
\subsection{Цели семинара}
\begin{itemize}
\item Закрепить полученные на лекции знания, хранения примитивных и ссылочных типов данных;
\item Получить практический навык создания функций по описанию;
\item Попрактиковаться в написании простых функций, манипулирующих ссылочными данными.
\end{itemize}
\subsection{План-содержание}
\noindent
\begin{spreadtab}{{longtable}{|p{37mm}|l|l|p{90mm}|}}
\hline
@ Что происходит & @ Время & @ Слайды & @ Описание \\
\hline
\endhead
2022-12-20 23:51:19 +03:00
@ Организационный момент & 5 tag(beg) & @ 1-5 & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучиает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\
2022-12-14 14:43:40 +03:00
\hline
2022-12-20 23:51:19 +03:00
@ Quiz & 5 & @ 6-18 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (4 вопроса, по минуте на ответ) \\
2022-12-14 14:43:40 +03:00
\hline
2022-12-20 23:51:19 +03:00
@ Рассмотрение ДЗ лекции & 10 & @ 19-23 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
2022-12-14 14:43:40 +03:00
\hline
2022-12-20 23:51:19 +03:00
@ Вопросы и ответы & 10 & @ 24 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
2022-12-14 14:43:40 +03:00
\hline
2022-12-20 23:51:19 +03:00
@ Задание 1 & 10 & @ 25-28 & @ Сравнить насколько разные могут быть прочтения одного и того же технического задания - одна функция для двух значений, возврат значений, возврат индекса, объявление исходного массива внутри функции поиска и др); \\
2022-12-15 10:24:31 +03:00
\hline
2022-12-20 23:51:19 +03:00
@ Задание 2 & 10 & @ 29-32 & @ Корректная манипуляция индексами, как следствие, сокращение числа возможных проходов по массиву и ускорение работы приложени \\
2022-12-14 14:43:40 +03:00
\hline
2022-12-20 23:51:19 +03:00
@ Перерыв (если нужен) & 5 & @ 33 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
2022-12-14 14:43:40 +03:00
\hline
2022-12-20 23:51:19 +03:00
@ Задание 3 & 20 & @ 34-37 & @ Формирование алгоритмического мышления при решении задач с описанием верхнего уровня \\
2022-12-15 10:24:31 +03:00
\hline
2022-12-20 23:51:19 +03:00
@ Задание 4 & 15 & @ 38-41 & @ Понимание внутренней механики работы фреймворка коллекций, повышение уровня абстракции написанного кода \\
2022-12-14 14:43:40 +03:00
\hline
2022-12-20 23:51:19 +03:00
@ Задание 5 (необязат) & 20 & @ 42-44 & @ Описание базовых алгоритмов манипуляции данными с применением вспомогательных массивов \\
2022-12-14 14:43:40 +03:00
\hline
2022-12-20 23:51:19 +03:00
@ Домашнее задание & 5 & @ 45-46 & @ Объясните домашнее задание, подведите итоги урока \\
2022-12-14 14:43:40 +03:00
\hline
2022-12-20 23:51:19 +03:00
@ Рефлексия & 10 tag(end) & @ 47-48 & @ Преподаватель запрашивает обратную связь \\
2022-12-14 14:43:40 +03:00
\hline
@ Длительность & sum(cell(beg):cell(end)) & & \\
\hline
\end{spreadtab}
\subsection{Подробности}
\subsubsection{Организационный момент}
\begin{itemize}
\item \textbf{Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
\item \textbf{Тайминг:} 3-5 минут.
\item \textbf{Действия преподавателя:}
\begin{itemize}
\item Презентует название курса (первый раз) и семинара;
\item Рассказывает немного о себе;
\item Запрашивает активность от аудитории в чате;
\item Презентует цели курса и семинара;
\item Презентует краткий план семинара и что студент научится делать.
\end{itemize}
\end{itemize}
\subsubsection{Quiz}
\begin{itemize}
\item \textbf{Цель этапа:} Вовлечение аудитории в обратную связь.
\item \textbf{Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
\item \textbf{Действия преподавателя:}
\begin{itemize}
\item Преподаватель задаёт вопросы викторины, представленные на слайдах презентации;
\item через 30 секунд демонстрирует слайд-подсказку и ожидает ответов.
\end{itemize}
\item \textbf{Вопросы и ответы:}
\begin{enumerate}
\item Магическое число -- это: (1)
\begin{enumerate}
\item числовая константа без пояснений;
\item число, помогающее в вычислениях;
\item числовая константа, присваиваемая при объявлении переменной.
\end{enumerate}
\item Какое значение будет содержаться в переменной a после выполнения строки \code{int а = 10.0f/3.0f;} (3)
\item Сколько будет создано одномерных массивов при инициализации массива 3х3x3? (13)
\item \code{2 + 2 * 2 == 2 << 2 >> 1}? (false? 6 != 4)
2022-12-14 14:43:40 +03:00
\end{enumerate}
\end{itemize}
\subsubsection{Рассмотрение ДЗ}
\begin{itemize}
\item \textbf{Цель этапа:} Пояснить неочевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
\item \textbf{Тайминг:} 15-20 минут.
\item \textbf{Действия преподавателя:}
\begin{itemize}
\item Преподаватель демонстрирует свой вариант решения домашнего задания из лекции;
\item возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов.
\end{itemize}
\item \textbf{Домашнее задание из лекции:}
\begin{itemize}
2022-12-15 10:24:31 +03:00
\item Написать метод «Шифр Цезаря», с булевым параметром зашифрования/расшифрования, и числовым ключом;
2022-12-14 14:43:40 +03:00
\textbf{Вариант решения}
2022-12-15 10:24:31 +03:00
\lstinputlisting[language=Java,style=JCodeStyle,caption={Шифр Цезаря}]{src/s02-h1-caesar.java}
2022-12-14 14:43:40 +03:00
2022-12-15 10:24:31 +03:00
\item Написать метод, принимающий на вход массив чисел и параметр \code{n}. Метод должен осуществить циклический (последний элемент при сдвиге становится первым) сдвиг всех элементов массива на n позиций;
2022-12-14 14:43:40 +03:00
\textbf{Вариант решения}
2022-12-15 10:24:31 +03:00
\lstinputlisting[language=Java,style=JCodeStyle,caption={Сдвиговый метод}]{src/s02-h2-shifter.java}
2022-12-14 14:43:40 +03:00
2022-12-15 10:24:31 +03:00
\item Написать метод, которому можно передать в качестве аргумента массив, состоящий строго из единиц и нулей (целые числа типа \code{int}). Метод должен заменить единицы в массиве на нули, а нули на единицы и не содержать ветвлений. Написать как можно больше вариантов метода
2022-12-14 14:43:40 +03:00
2022-12-15 10:24:31 +03:00
\textbf{Вариант решения}
2022-12-14 14:43:40 +03:00
2022-12-15 10:24:31 +03:00
\lstinputlisting[language=Java,style=JCodeStyle,caption={Инверсия}]{src/s02-h3-inverse.java}
2022-12-14 14:43:40 +03:00
\end{itemize}
\end{itemize}
\subsubsection{Вопросы и ответы}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf{Тайминг} 5-15 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы;
\item Если преподаватель затрудняется с ответом, необходимо мягко предложить студенту ответить на его вопрос на следующем семинаре (и не забыть найти ответ на вопрос студента!);
\item Предложить и показать пути самостоятельного поиска студентом ответа на заданный вопрос;
\item Посоветовать литературу на тему заданного вопроса;
\item Дополнительно указать на то, что все сведения для выполнения домашнего задания, прохождения викторины и работы на семинаре были рассмотрены в методическом материале к этому или предыдущим урокам.
\end{itemize}
\end{itemize}
\subsubsection{Задание 1}
\begin{itemize}
2022-12-15 10:24:31 +03:00
\item \textbf{Ценность этапа} Базовая манипуляция данными внутри массива.
\item \textbf{Тайминг} 10-15 минут.
2022-12-14 14:43:40 +03:00
\item \textbf{Действия преподавателя}
\begin{itemize}
2022-12-15 10:24:31 +03:00
\item Первые пять минут уклоняться от ответов на уточняющие вопросы
\item Пояснить студентам ценность опыта (сравнить насколько разные могут быть прочтения одного и того же технического задания - одна функция для двух значений, возврат значений, возврат индекса, объявление исходного массива внутри функции поиска и др);
2022-12-14 14:43:40 +03:00
\item Выдать задание группам студентов, показать где именно следует искать терминал ОС;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задания}:
\begin{itemize}
2022-12-15 10:24:31 +03:00
\item Задать одномерный массив. Написать методы поиска в нём минимального и максимального элемента;
2022-12-14 14:43:40 +03:00
\textbf{Вариант решения}
2022-12-15 10:24:31 +03:00
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Поиск минимального значения}]
private static int findMin(int[] a) { // returns the minimum value
int min = a[0];
for (int i = 1; i < a.length; i++) {
if (a[i] < min) {
min = a[i];
}
2022-12-14 14:43:40 +03:00
}
2022-12-15 10:24:31 +03:00
return min;
2022-12-14 14:43:40 +03:00
}
\end{lstlisting}
2022-12-15 10:24:31 +03:00
\item [$*_1$] Привести функции к корректному виду и дополнительно написать ещё две функции так, чтобы получились (четыре) функции поиска минимального и максимального как значения, так и индекса.
2022-12-14 14:43:40 +03:00
\textbf{Вариант решения}
2022-12-15 10:24:31 +03:00
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Поиск индекса максимального значения}]
private static int findMax(int[] a) { // returns the maximum index
int max = 0;
for (int i = 1; i < a.length; i++) {
if (a[i] > a[max])
max = i;
}
return max;
}
\end{lstlisting}
2022-12-14 14:43:40 +03:00
\end{itemize}
\end{itemize}
\subsubsection{Задание 2}
\begin{itemize}
2022-12-15 10:24:31 +03:00
\item \textbf{Ценность этапа} Оптимизация сложности алгоритмов при работе с многомерными массивами.
2022-12-14 14:43:40 +03:00
\item \textbf{Тайминг} 10-15 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
2022-12-15 10:24:31 +03:00
\item Пояснить студентам ценность этого опыта (корректная манипуляция индексами, как следствие, сокращение числа возможных проходов по массиву и ускорение работы приложения);
2022-12-14 14:43:40 +03:00
\item Пояснить студентам в каком виде выполнять и сдавать задания;
\item Выдать задание группам студентов, показать где и как скачивать необходимый инструментарий, если он ещё не установлен;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
2022-12-15 10:24:31 +03:00
\item Создать квадратный целочисленный массив (количество строк и столбцов одинаковое), заполнить его диагональные элементы единицами, используя цикл(ы)
2022-12-14 14:43:40 +03:00
2022-12-15 10:24:31 +03:00
\textbf{Вариант решения}
2022-12-14 14:43:40 +03:00
2022-12-15 10:24:31 +03:00
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Заполнение диагональных элементов}]
private static void fillDiagonal(int[][] a) {
for (int i = 0; i < a.length; i++) {
a[i][i] = 1;
a[i][a.length - 1 - i] = 1;
}
}
2022-12-14 14:43:40 +03:00
\end{lstlisting}
2022-12-15 10:24:31 +03:00
\item [$*_1$] дописать функцию вывода двумерного массива в консоль
2022-12-14 14:43:40 +03:00
2022-12-15 10:24:31 +03:00
\textbf{Вариант решения}
2022-12-14 14:43:40 +03:00
2022-12-15 10:24:31 +03:00
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вывод массива в терминал}]
private static void printTwoDimArray(int[][] a) {
for (int i = 0; i < a.length; i++) {
System.out.println(Arrays.toString(a[i]));
}
}
\end{lstlisting}
2022-12-14 14:43:40 +03:00
\end{itemize}
\end{itemize}
\subsubsection{Задание 3}
\begin{itemize}
2022-12-15 10:24:31 +03:00
\item \textbf{Ценность этапа} Формирование алгоритмического мышления при решении задач с описанием верхнего уровня.
2022-12-14 14:43:40 +03:00
\item \textbf{Тайминг} 15-20 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
2022-12-15 10:24:31 +03:00
\item Пояснить студентам ценность этого опыта (ТЗ довольно редко бывают чёткими и никогда не говорят программисту, что именно нужно написать);
\item Выдать задание группам студентов;
2022-12-14 14:43:40 +03:00
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
2022-12-15 10:24:31 +03:00
\item Написать метод, в который передается не пустой одномерный целочисленный массив, метод должен вернуть true если в массиве есть место, в котором сумма левой и правой части массива равны. Примеры:
\begin{itemize}
\item [] \code{checkBalance([1, 1, 1, || 2, 1])} $\to$ \code{true},
\item [] \code{checkBalance([2, 1, 1, 2, 1])} $\to$ \code{false},
\item [] \code{checkBalance([10, || 1, 2, 3, 4])} $\to$ \code{true}.
\end{itemize}
Абстрактная граница показана символами \code{||}, эти символы в массив не входят.
2022-12-14 14:43:40 +03:00
\textbf{Вариант решения}
2022-12-15 10:24:31 +03:00
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вариант со сложностью $O(n^2)$}]
private static boolean checkBalance(int[] a) {
int left = 0;
for (int i = 0; i < a.length - 1; i++) {
left += a[i];
int right = 0;
for (int j = i + 1; j < a.length; j++) {
right += a[j];
}
if (left == right) return true;
}
return false;
}
\end{lstlisting}
2022-12-14 14:43:40 +03:00
2022-12-15 10:24:31 +03:00
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вариант со сложностью $O(2n)$}]
private static boolean checkBalance2(int[] a) {
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
if (sum % 2 != 0) return false;
int left = 0;
for (int i = 0; i < a.length; i++) {
left += a[i];
sum -= a[i];
if (left == sum) return true;
}
return false;
}
2022-12-14 14:43:40 +03:00
\end{lstlisting}
2022-12-15 10:24:31 +03:00
2022-12-14 14:43:40 +03:00
2022-12-15 10:24:31 +03:00
\item [$*_1$] написать этот же метод таким образом, чтобы в нём использовался только один цикл.
2022-12-14 14:43:40 +03:00
2022-12-15 10:24:31 +03:00
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={* Вариант со сложностью $O(n)$}]
private static boolean checkBalance3(int[] a) {
int lbound = 0;
int rbound = a.length - 1;
int left = 0;
int right = 0;
while (lbound <= rbound) {
if (left > right)
right += a[rbound--];
else
left += a[lbound++];
}
return left == right;
}
\end{lstlisting}
\end{itemize}
\end{itemize}
\subsubsection{Задание 4}
\begin{itemize}
\item \textbf{Ценность этапа} Понимание внутренней механики работы фреймворка коллекций, повышение уровня абстракции написанного кода.
\item \textbf{Тайминг} 15-20 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (написание собственных функций, реализующих алгоритмы часто помогает в ситуациях, когда задача не решается стандартными средствами)
\item Выдать задание группам студентов
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой».
\item Если нужно, через 7 минут после старта, дать подсказку для первой части задания (сигнатура функции должна содержать не только передаваемый массив, но и его текущее заполнение, которое нужно отслеживать самостоятельно)
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item Написать функцию добавления элемента в конец массива таким образом, чтобы она расширяла массив при необходимости.
Здесь нет смысла показывать не лучшее, но самое популярное решение, поэтому можно продемонстрировать сразу вариант решения «со звёздочкой».
\item [$*_1$] Функция должна возвращать ссылку на вновь созданный внутри себя массив, а не использовать глобальный
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={* Вариант без глобального массива}]
int[] add(int[] arr, int current, int value) {
if (current == arr.length) {
int[] temp = new int[arr.length * 2];
System.arraycopy(arr, 0, temp, 0, arr.length);
arr = temp;
}
arr[current++] = value;
return arr;
}
// main
int[] array = {1,2};
int size = 2;
System.out.println(size + " = " + Arrays.toString(array));
array = add(array, size++, 6);
System.out.println(size + " = " + Arrays.toString(array));
array = add(array, size++, 6);
\end{lstlisting}
\end{itemize}
\end{itemize}
\subsubsection{Задание 5 (необязательное)}
\begin{itemize}
\item \textbf{Ценность этапа} Описание базовых алгоритмов манипуляции данными с применением вспомогательных массивов.
\item \textbf{Тайминг} 15-20 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Объяснить студентам, в чём заключается алгоритм сортировки подсчётом. Для сортировки подсчётом алгоритм совершает проход по исходному массиву, подсчитывая количество повторений каждого значения, и записывая эту информацию в промежуточный (частотный) массив. Вторым шагом алгоритма совершается обход вспомогательного массива и запись нужного количества значений по возрастанию в исходный массив. Сложность сортировки $O(2n)$. Например:
\[ x[2,1,0,4,3,0,0,1,2] \to t[3(x_0),2(x_1),2(x_2),1(x_3),1(x_4)] \to x[0,0,0,1,1,2,2,3,4] \]
\item Выдать задание группам студентов
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item Написать метод, осуществляющий сортировку одномерного массива подсчётом. Важное ограничение состоит в том, что для этой сортировки диапазон значений исходного массива должен находиться в разумных пределах, например, не более 1000.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Pigeonhole sort}]
void pigeon(int[] arr) {
final int min = getMin(arr);
final int max = getMax(arr);
int[] freq = new int[max - min + 1];
2022-12-20 23:51:19 +03:00
for (int i = 0; i < arr.length; i++)
2022-12-15 10:24:31 +03:00
freq[arr[i] - min]++;
int arrIndex = 0;
for (int i = 0; i < freq.length; i++)
for (int elems = freq[i]; elems > 0; elems--)
arr[arrIndex++] = i + min;
}
2022-12-14 14:43:40 +03:00
\end{lstlisting}
2022-12-15 10:24:31 +03:00
2022-12-14 14:43:40 +03:00
\end{itemize}
\end{itemize}
\subsubsection{Домашнее задание}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf{Тайминг} 5-10 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам в каком виде выполнять и сдавать задания
\item Уточнить кто будет проверять работы (преподаватель или ревьювер)
\item Объяснить к кому обращаться за помощью и где искать подсказки
\item Объяснить где взять проект заготовки для дз
\end{itemize}
\item \textbf{Задания}
\begin{enumerate}
\item [5-25 мин] Решить все задания (в том числе «со звёздочкой»), если они не были решены на семинаре, без ограничений по времени;
Все варианты решения приведены в тексте семинара выше
\item [5-10 мин] Написать метод, возвращающий количество чётных элементов массива.
\begin{itemize}
\item [] \code{countEvens([2, 1, 2, 3, 4])} $\to$ \code{3}
\item [] \code{countEvens([2, 2, 0])} $\to$ \code{3}
\item [] \code{countEvens([1, 3, 5])} $\to$ \code{0}
\end{itemize}
\lstinputlisting[language=Java,style=JCodeStyle,caption={CountEvens.java}]{src/s02-hw2-count.java}
\item [10 мин] Написать функцию, возвращающую разницу между самым большим и самым маленьким элементами переданного не пустого массива.
\lstinputlisting[language=Java,style=JCodeStyle,caption={Spread.java}]{src/s02-hw2-spread.java}
\item [10 мин] Написать функцию, возвращающую истину, если в переданном массиве есть два соседних элемента, с нулевым значением.
\lstinputlisting[language=Java,style=JCodeStyle,caption={Zero2.java}]{src/s02-hw2-zeros.java}
2022-12-14 14:43:40 +03:00
\end{enumerate}
\end{itemize}
\subsubsection{Рефлексия и завершение семинара}
\begin{itemize}
\item \textbf{Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
\item \textbf{Тайминг:} 5-10 минут
\item \textbf{Действия преподавателя:}
\begin{itemize}
\item Запросить обратную связь от студентов.
\item Подчеркните то, чему студенты научились на занятии.
\item Дайте рекомендации по решению заданий, если в этом есть необходимость
\item Дайте краткую обратную связь студентам.
\item Поделитесь ощущением от семинара.
\item Поблагодарите за проделанную работу.
\end{itemize}
\end{itemize}
\end{document}