From e8796bd49452889d8455941edf4ef1431b0a8a6a Mon Sep 17 00:00:00 2001 From: czertyaka Date: Wed, 29 Oct 2025 23:37:31 +0500 Subject: [PATCH 1/2] Homework submodule --- .gitmodules | 3 +++ Homeworks/06-LIFO-Stack/hw-project | 1 + 2 files changed, 4 insertions(+) create mode 160000 Homeworks/06-LIFO-Stack/hw-project diff --git a/.gitmodules b/.gitmodules index c006848..23575cf 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "Homeworks/06-Hide-Secret/hw-project"] path = Homeworks/05-Hide-Secret/hw-project url = git@github.com:czertyaka/CppDevCourse-hw-hide-secret.git +[submodule "Homeworks/06-LIFO-Stack/hw-project"] + path = Homeworks/06-LIFO-Stack/hw-project + url = git@github.com:czertyaka/CppDevCourse-hw-lifo-stack.git diff --git a/Homeworks/06-LIFO-Stack/hw-project b/Homeworks/06-LIFO-Stack/hw-project new file mode 160000 index 0000000..42ba93a --- /dev/null +++ b/Homeworks/06-LIFO-Stack/hw-project @@ -0,0 +1 @@ +Subproject commit 42ba93a9d353d38af8fee3a0c7a6b4be7a2222d6 From cd073f3fe33c09f7286018c6db2456a15dd84bd8 Mon Sep 17 00:00:00 2001 From: czertyaka Date: Thu, 30 Oct 2025 00:40:32 +0500 Subject: [PATCH 2/2] Add homerowk itself --- Homeworks/06-LIFO-Stack/lifo-stack.tex | 163 +++++++++++++++++++++++++ Makefile | 12 ++ 2 files changed, 175 insertions(+) create mode 100644 Homeworks/06-LIFO-Stack/lifo-stack.tex diff --git a/Homeworks/06-LIFO-Stack/lifo-stack.tex b/Homeworks/06-LIFO-Stack/lifo-stack.tex new file mode 100644 index 0000000..cfff28d --- /dev/null +++ b/Homeworks/06-LIFO-Stack/lifo-stack.tex @@ -0,0 +1,163 @@ +\documentclass[14pt]{extarticle} + +\usepackage{homeworktemplate} +\usepackage[askip=3mm, bskip=3mm]{terminal} +\usepackage[askip=3mm, bskip=3mm]{mylisting} +\usepackage{tcolorbox} +\usepackage{csquotes} + +\title{Домашняя работа 6 \\ LIFO Stack} + +\begin{document} + +\maketitle + +\tableofcontents + +\section{Описание задания} + + \subsection{Проблема} + + В этом домашнем задании вам предлагается разработать библиотеку, + реализующую примитивный вариант структуры данных \textit{стек LIFO}\footnotemark{}. + + \footnotetext{\url{https://ru.wikipedia.org/wiki/LIFO}} + + Библиотека позволит создавать несколько \enquote{контейнеров}-стеков и + управлять временем их жизни. + + Пользователь библиотеки работает с разными объектами стеков через + уникальный идентификатор с типом \texttt{Handle}. + Такой подход очень распространен в тех случаях, когда работа с объектами + и их типами напрямую нежелателен. + Он является идеологическим преемником другого подхода, который называется + \textit{opaque pointer}\footnotemark{}. + + \footnotetext{\url{https://ru.wikipedia.org/wiki/Opaque\_pointer}} + + Библиотека не будет хранить информацию о типе данных, передаваемых в + стек. + Это позволит пользователю библиотеки хранить в одном стеке данные разных + типов, но и обязует его помнить тип данных. + + \subsection{Шаблон проекта} + + Для выполнения задания подготовлен проект C++ с настроенной системой сборки, + написанными тестами и частью кода такой программы. + GitHub проекта: \url{https://github.com/czertyaka/CppDevCourse-hw-lifo-stack}. + + В шаблоне написан заголовочной файл библиотеки с объявлениями + ее функций. + + \myinputlisting[minted language=cpp] + {Homeworks/06-LIFO-Stack/hw-project/} + {stack.hpp} + + Все функции объявлены в пространстве имен \texttt{stack}. + Набор этих функций является API разрабатываемой библиотеки. + + Определения этих функций также уже имеются в шаблоне проекта + в файле \textit{stack.cpp}. + В этих определениях нет никакой полезной функциональности. + По своей сути они являются \enquote{заглушками}, нужными лишь затем, + чтобы проект можно было скомпилировать. + + В этом домашнем задании нужно вместо этих \enquote{заглушек} написать + определения, удовлетворяющие требованиям из следующего подраздела. + + \subsection{Требования к функциям библиотеки} \label{requirements} + + \begin{itemize} + + \item \verb|Handle create()| + + \textbf{Описание}: Создать новый стек. + + \textbf{Возвращаемое значение}: \texttt{-1} в случае ошибки выполнения, + хэндлер нового стека с неотрицательным значением в случае успеха. + + \item \verb|void destroy(const Handle handle)| + + \textbf{Описание}: Удалить стек, если соответствующий хэндлеру + стек существует. + + \textbf{Параметры}: \texttt{handle} \textemdash \space хэндлер стека. + + \item \verb|bool valid(const Handle handle)| + + \textbf{Описание}: Проверить хэндлер. + + \textbf{Параметры}: \texttt{handle} \textemdash \space хэндлер стека. + + \textbf{Возвращаемое значение}: \texttt{true} - соответствующий + хэндлеру стек существует, \texttt{false} - нет. + + \item \verb|std::size_t count(const Handle handle)| + + \textbf{Описание}: Получить количество элементов в стеке, если + соответствующий хэндлеру стек существует. + + \textbf{Параметры}: \texttt{handle} \textemdash \space хэндлер стека. + + \textbf{Возвращаемое значение}: количество элементов в стеке, если + соответствующий хэндлеру стек существует, \texttt{0} в противном случае. + + \item \verb|void push(const Handle handle, const void* const data,| \break + \verb|const std::size_t size)| + + \textbf{Описание}: Добавить элемент данных из буфера в стек, если + соответствующий хэндлеру стек существует. + + \textbf{Параметры}: \texttt{handle} \textemdash \space хэндлер стека; \hfill \break + \texttt{data} \textemdash \space указатель на буфер с данными; \hfill \break + \texttt{size} \textemdash \space размер буфера с данными. + + \item \verb|std::size_t pop(const Handle handle, void* const data,| \break + \verb|const std::size_t size)| + + \textbf{Описание}: Извлечь элемент из стека и записать данные этого элемента + в буфер, если соответствующий хэндлеру стек существует и его размер не равен + \texttt{0}. + + \textbf{Параметры}: \texttt{handle} \textemdash \space хэндлер стека; \hfill \break + \texttt{data} \textemdash \space указатель на буфер для записи данных; \hfill \break + \texttt{size} \textemdash \space размер буфера для записи. + + \textbf{Возвращаемое значение}: размер записанных данных в байтах, если + соответствующий хэндлеру стек существует и его размер не равен \texttt{0}, + \texttt{0} в противном случае. + + \end{itemize} + +\section{Порядок выполнения} + + \begin{enumerate} + + \item Создайте форк репозитория \url{https://github.com/czertyaka/CppDevCourse-hw-lifo-stack}. + + \item Измените в форке файл \textit{stack.cpp}. + + \item Соберите проект и протестируйте решение (если получилось установить зависимости, + необходимые для тестирования). + Этот пункт не обязателен, потому что в pull request эти же тесты будут выполнены + в рамках GitHub Actions. + + \item Создайте pull request из вашего форка в оригинальный репозиторий, + в названии которого есть ваше ФИО. + + \end{enumerate} + +\section{Критерии выполнения} + + \begin{itemize} + + \item Выполнены все требования из \ref{requirements}. + + \item Pull request проходит автоматизированные проверки. + + \item Код в pull request прошел ревью преподавателем. + + \end{itemize} + +\end{document} + diff --git a/Makefile b/Makefile index 5eba614..73ddc67 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,7 @@ BUILD_DIR := build hw-03 \ hw-04 \ hw-05 \ + hw-06 \ install \ pr-01 \ pr-02 \ @@ -35,6 +36,7 @@ build: \ hw-03 \ hw-04 \ hw-05 \ + hw-06 \ pr-01 \ pr-02 \ pr-03 \ @@ -70,6 +72,7 @@ install: build cp "$(BUILD_DIR)/hw-03.pdf" "$(PREFIX)/Домашние задания/03 Two Sum.pdf" cp "$(BUILD_DIR)/hw-04.pdf" "$(PREFIX)/Домашние задания/04 The Guessing Game.pdf" cp "$(BUILD_DIR)/hw-05.pdf" "$(PREFIX)/Домашние задания/05 Hide Secret.pdf" + cp "$(BUILD_DIR)/hw-06.pdf" "$(PREFIX)/Домашние задания/06 LIFO Stack.pdf" mkdir -p "$(PREFIX)/Проекты" cp "$(BUILD_DIR)/prj-auth-lib.pdf" "$(PREFIX)/Проекты/Библиотека идентификации и аутентификации.pdf" cp "$(BUILD_DIR)/prj-enc-exch.pdf" "$(PREFIX)/Проекты/Baremetal шифрование обмена.pdf" @@ -87,6 +90,7 @@ help: @printf "hw-03\tbuild homework hw-03.pdf\n" @printf "hw-04\tbuild homework hw-04.pdf\n" @printf "hw-05\tbuild homework hw-05.pdf\n" + @printf "hw-06\tbuild homework hw-06.pdf\n" @printf "install\tinstall all presentations and homeworks\n" @printf "pr-01\tbuild presentation pr-01.pdf\n" @printf "pr-02\tbuild presentation pr-02.pdf\n" @@ -121,6 +125,7 @@ hw-02: hw-02.pdf hw-03: hw-03.pdf hw-04: hw-04.pdf hw-05: hw-05.pdf +hw-06: hw-06.pdf prj-auth-lib: prj-auth-lib.pdf prj-enc-exch: prj-enc-exch.pdf @@ -303,6 +308,13 @@ hw-05.pdf: \ Packages/mylisting.sty $(call generate_pdf,$<,$@) +hw-06.pdf: \ + Homeworks/06-LIFO-Stack/lifo-stack.tex \ + Homeworks/homeworktemplate.sty \ + Packages/terminal.sty \ + Packages/mylisting.sty + $(call generate_pdf,$<,$@) + prj-auth-lib.pdf: \ Projects/Identification-and-Authentication-Library/auth-library.tex \ $(wildcard Projects/images/*.jpg) \