\documentclass[../j-spec.tex]{subfiles} \usepackage{spreadtab} \begin{document} \section{Семинар: данные и функции} \subsection{Инструментарий} \begin{itemize} \item Презентация для преподавателя, ведущего семинар; \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 @ Организационный момент & 5 tag(beg) & @ 1-4 & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучиает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\ \hline @ Quiz & 5 & @ 3-14 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (4 вопроса, по минуте на ответ) \\ \hline @ Рассмотрение ДЗ лекции & 10 & @ 15-18 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\ \hline @ Вопросы и ответы & 10 & @ 19 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\ \hline @ Задание 1 & 10 & @ 20-22 & @ Сравнить насколько разные могут быть прочтения одного и того же технического задания - одна функция для двух значений, возврат значений, возврат индекса, объявление исходного массива внутри функции поиска и др); \\ \hline @ Задание 2 & 10 & @ 23-25 & @ Корректная манипуляция индексами, как следствие, сокращение числа возможных проходов по массиву и ускорение работы приложени \\ \hline @ Перерыв (если нужен) & 5 & @ 26 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\ \hline @ Задание 3 & 20 & @ 27-29 & @ Формирование алгоритмического мышления при решении задач с описанием верхнего уровня \\ \hline @ Задание 4 & 15 & @ 27-29 & @ Понимание внутренней механики работы фреймворка коллекций, повышение уровня абстракции написанного кода \\ \hline @ Задание 5 (необязат) & 20 & @ 27-29 & @ Описание базовых алгоритмов манипуляции данными с применением вспомогательных массивов \\ \hline @ Домашнее задание & 5 & @ 39 & @ Объясните домашнее задание, подведите итоги урока \\ \hline @ Рефлексия & 10 tag(end) & @ 40-42 & @ Преподаватель запрашивает обратную связь \\ \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 \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} \item Написать метод «Шифр Цезаря», с булевым параметром зашифрования/расшифрования, и числовым ключом; \textbf{Вариант решения} \lstinputlisting[language=Java,style=JCodeStyle,caption={Шифр Цезаря}]{src/s02-h1-caesar.java} \item Написать метод, принимающий на вход массив чисел и параметр \code{n}. Метод должен осуществить циклический (последний элемент при сдвиге становится первым) сдвиг всех элементов массива на n позиций; \textbf{Вариант решения} \lstinputlisting[language=Java,style=JCodeStyle,caption={Сдвиговый метод}]{src/s02-h2-shifter.java} \item Написать метод, которому можно передать в качестве аргумента массив, состоящий строго из единиц и нулей (целые числа типа \code{int}). Метод должен заменить единицы в массиве на нули, а нули на единицы и не содержать ветвлений. Написать как можно больше вариантов метода \textbf{Вариант решения} \lstinputlisting[language=Java,style=JCodeStyle,caption={Инверсия}]{src/s02-h3-inverse.java} \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} \item \textbf{Ценность этапа} Базовая манипуляция данными внутри массива. \item \textbf{Тайминг} 10-15 минут. \item \textbf{Действия преподавателя} \begin{itemize} \item Первые пять минут уклоняться от ответов на уточняющие вопросы \item Пояснить студентам ценность опыта (сравнить насколько разные могут быть прочтения одного и того же технического задания - одна функция для двух значений, возврат значений, возврат индекса, объявление исходного массива внутри функции поиска и др); \item Выдать задание группам студентов, показать где именно следует искать терминал ОС; \item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой». \end{itemize} \item \textbf{Задания}: \begin{itemize} \item Задать одномерный массив. Написать методы поиска в нём минимального и максимального элемента; \textbf{Вариант решения} \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]; } } return min; } \end{lstlisting} \item [$*_1$] Привести функции к корректному виду и дополнительно написать ещё две функции так, чтобы получились (четыре) функции поиска минимального и максимального как значения, так и индекса. \textbf{Вариант решения} \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} \end{itemize} \end{itemize} \subsubsection{Задание 2} \begin{itemize} \item \textbf{Ценность этапа} Оптимизация сложности алгоритмов при работе с многомерными массивами. \item \textbf{Тайминг} 10-15 минут. \item \textbf{Действия преподавателя} \begin{itemize} \item Пояснить студентам ценность этого опыта (корректная манипуляция индексами, как следствие, сокращение числа возможных проходов по массиву и ускорение работы приложения); \item Пояснить студентам в каком виде выполнять и сдавать задания; \item Выдать задание группам студентов, показать где и как скачивать необходимый инструментарий, если он ещё не установлен; \item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой». \end{itemize} \item \textbf{Задания} \begin{itemize} \item Создать квадратный целочисленный массив (количество строк и столбцов одинаковое), заполнить его диагональные элементы единицами, используя цикл(ы) \textbf{Вариант решения} \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; } } \end{lstlisting} \item [$*_1$] дописать функцию вывода двумерного массива в консоль \textbf{Вариант решения} \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} \end{itemize} \end{itemize} \subsubsection{Задание 3} \begin{itemize} \item \textbf{Ценность этапа} Формирование алгоритмического мышления при решении задач с описанием верхнего уровня. \item \textbf{Тайминг} 15-20 минут \item \textbf{Действия преподавателя} \begin{itemize} \item Пояснить студентам ценность этого опыта (ТЗ довольно редко бывают чёткими и никогда не говорят программисту, что именно нужно написать); \item Выдать задание группам студентов; \item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой». \end{itemize} \item \textbf{Задания} \begin{itemize} \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{||}, эти символы в массив не входят. \textbf{Вариант решения} \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} \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; } \end{lstlisting} \item [$*_1$] написать этот же метод таким образом, чтобы в нём использовался только один цикл. \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]; for (int i = 0; i < size; i++) 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; } \end{lstlisting} \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 Решить все задания (в том числе «со звёздочкой»), если они не были решены на семинаре, без ограничений по времени; \item \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}