From a6ee5a7e47c032f0d60ee8c794002489a1d662af Mon Sep 17 00:00:00 2001 From: czertyaka Date: Wed, 15 Oct 2025 20:47:16 +0500 Subject: [PATCH 1/6] Add homerowk submodule --- .gitmodules | 3 +++ Homeworks/06-Hide-Secret/hw-project | 1 + 2 files changed, 4 insertions(+) create mode 160000 Homeworks/06-Hide-Secret/hw-project diff --git a/.gitmodules b/.gitmodules index 7eeb3c4..40bcc2f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "Homeworks/04-Guessing-Game/hw-project"] path = Homeworks/04-Guessing-Game/hw-project url = git@github.com:czertyaka/CppDevCourse-hw-guessing-game.git +[submodule "Homeworks/06-Hide-Secret/hw-project"] + path = Homeworks/06-Hide-Secret/hw-project + url = git@github.com:czertyaka/CppDevCourse-hw-hide-secret.git diff --git a/Homeworks/06-Hide-Secret/hw-project b/Homeworks/06-Hide-Secret/hw-project new file mode 160000 index 0000000..2d5ac84 --- /dev/null +++ b/Homeworks/06-Hide-Secret/hw-project @@ -0,0 +1 @@ +Subproject commit 2d5ac8462df7122efbb4c80b205ebbc803e45dd8 From d55e1fc4e7d32c36188dbd0ef59bd5a7d9561617 Mon Sep 17 00:00:00 2001 From: czertyaka Date: Wed, 15 Oct 2025 20:48:14 +0500 Subject: [PATCH 2/6] Fix submodule path --- .gitmodules | 2 +- Homeworks/{06-Hide-Secret => 05-Hide-Secret}/hw-project | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename Homeworks/{06-Hide-Secret => 05-Hide-Secret}/hw-project (100%) diff --git a/.gitmodules b/.gitmodules index 40bcc2f..c006848 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,5 +8,5 @@ path = Homeworks/04-Guessing-Game/hw-project url = git@github.com:czertyaka/CppDevCourse-hw-guessing-game.git [submodule "Homeworks/06-Hide-Secret/hw-project"] - path = Homeworks/06-Hide-Secret/hw-project + path = Homeworks/05-Hide-Secret/hw-project url = git@github.com:czertyaka/CppDevCourse-hw-hide-secret.git diff --git a/Homeworks/06-Hide-Secret/hw-project b/Homeworks/05-Hide-Secret/hw-project similarity index 100% rename from Homeworks/06-Hide-Secret/hw-project rename to Homeworks/05-Hide-Secret/hw-project From 8be029dc0cb993a2843e82bc6280ffdb66f2b83d Mon Sep 17 00:00:00 2001 From: czertyaka Date: Wed, 15 Oct 2025 22:46:20 +0500 Subject: [PATCH 3/6] Add hide-secret.tex --- Homeworks/05-Hide-Secret/hide-secret.tex | 179 +++++++++++++++++++++++ Makefile | 12 ++ 2 files changed, 191 insertions(+) create mode 100644 Homeworks/05-Hide-Secret/hide-secret.tex diff --git a/Homeworks/05-Hide-Secret/hide-secret.tex b/Homeworks/05-Hide-Secret/hide-secret.tex new file mode 100644 index 0000000..3ba0d56 --- /dev/null +++ b/Homeworks/05-Hide-Secret/hide-secret.tex @@ -0,0 +1,179 @@ +\documentclass[14pt]{extarticle} + +\usepackage{homeworktemplate} +\usepackage[askip=3mm, bskip=3mm]{terminal} +\usepackage[askip=3mm, bskip=3mm]{mylisting} +\usepackage{tcolorbox} +\usepackage{csquotes} + +\title{Домашняя работа 5 \\ Hide Secret} + +\begin{document} + +\maketitle + +\tableofcontents + +\section{Описание задания} + + \subsection{Проблема} + + В этом домашнем задании вам предлагается решить следующую проблему: + + \begin{tcolorbox}[title=Проблема] + + Имея заданный \textit{открытый текст}, найти в нём все вхождения известного + \textit{секретного текста}, и заменить его на строки той же длины, состоящие + из символа \texttt{x}. + + \end{tcolorbox} + + Пример работы программы, решающей эту проблему: + + \begin{terminalwindow} +!\shellcommand{./build/main "My silly password is '12345678'" "12345678"}! +My silly password is 'xxxxxx' + \end{terminalwindow} + + \subsection{Шаблон проекта} + + Для выполнения задания подготовлен проект C++ с настроенной системой сборки, + написанными тестами и частью кода такой программы. + GitHub проекта: \url{https://github.com/czertyaka/CppDevCourse-hw-hide-secret}. + + В этом шаблоне проекта уже написана функция \texttt{main}, обрабатывающая + пользовательский ввод: \textit{открытый текст} и \textit{секретный текст}. + После валидации ввода функция передает управление вместе с входными данными + функции \texttt{hide\_secret}. + За вывод результата обработки \textit{открытого текста} так же отвечает + функция \texttt{main}. + В \textit{main.cpp} в рамках домашнего задания ничего менять не нужно. + + В файле \textit{hide-secret.hpp} содержится объявление функции \\ \texttt{hide\_secret}: + + \myinputlisting[minted language=cpp] + {Homeworks/05-Hide-Secret/hw-project/} + {hide-secret.hpp} + + В домашнем задании вам необходимо добавить файл \textit{hide-secret.cpp} в корень + проекта с определением этой функции. + + В файле \textit{README.md} содержатся инструкции по сборке проекта после добавления + \textit{hide-secret.cpp}. + + \subsection{Описание входных данных} + + Функция \texttt{hide\_secret} имеет два параметра: + + \begin{enumerate} + + \item \texttt{text} \textemdash \space указатель на массив символов + \textit{открытого текста}. + Массив мутабельный, функция имеет возможность менять его содержимое. + Указатель иммутабельный, функция не может менять этот параметр. + + \item \texttt{secret} \textemdash \space указатель на массив символов + \textit{секретного текста}. + Функция не может менять его содержимое и сам параметр. + + \end{enumerate} + + Гарантировано, что массивы текстов имеют конечную длину (очевидно) и что + последним символом каждого массива является null-terminator \verb|\0|. + + \subsection{Замечания по реализации функции} \label{stdstring} + + Для программистов, знакомых с классами из стандартной библиотеки C++, + не составит труда написать решение задания, используя класс \texttt{std::string}. + + В качестве основы для решения можно было бы взять такой код: + + \begin{myinplacelisting}[minted language=cpp] +std::string text {"My silly password is '12345678'"}; +std::string_view secret {"12345678"}; + +const auto pos = text.find(secret); +if (pos == std::string::npos) { + return; +} + +text.replace(pos, secret.size(), secret.size(), 'x'); + \end{myinplacelisting} + + В большинстве реальных проектов это было бы абсолютно верным решением. + С точки зрения поддержки и читаемости такой код значительно проще + \enquote{магии} с сырыми указателями. + Однако в этой домашней работе вам предлагается поупражняться + именно в такой \enquote{магии}. + Понимание принципов, лежащих в основе реализации более высоких уровней + абстракции, полезно. + + Также стоит добавить, что приведенное выше решение не универсально + и имеет недостатки. + Самый большой из них \textemdash \space оно не очень эффективно. + Для манипуляций с \textit{открытым текстом} в нем создается объект + \texttt{textStr} с типом \texttt{std::string}. + Этот объект скопирует в свою память содержимое \texttt{text}. + При этом, если окажется, что размер \textit{открытого текста} слишком + велик, то для этого будет выделена память в куче. + Это выделение при некоторых условиях может оказаться затратной по времени + операцией. + Код, написанный на сырых указателях, может избежать ненужного копирования + и потенциальной аллокации памяти в куче, что позволит ему работать быстрее. + + \subsection{Требования} \label{requirements} + + \begin{enumerate} + + \item Функция должна заменить \textit{секретный текст} на последовательность + симолов \verb|x| в массиве, на который указыват параметр \texttt{text}. + + \item Длина последовательности \verb|x| должна быть равной длине + \textit{секретного текста}. + Т.е. \verb|123| \rightarrow \space \verb|xxx|, и \verb|12345| + \rightarrow \space \verb|xxxxx|. + + \item Если в \textit{открытом тексте} содержится несколько вхождений + \textit{секретного текста}, то заменены должны быть все вхождения: + \verb|123 + 123| \rightarrow \space \verb|xxx + xxx|. + + \item Функция \texttt{hide\_secret} не должна содержать неопределенного + поведения или приводить к нештатному завершению работы программы. + + \item Функция не должна выполнять ненужных аллокаций и копирования + текстов (см. \ref{stdstring}). + + \end{enumerate} + +\section{Порядок выполнения} + + \begin{enumerate} + + \item Создайте форк репозитория \url{https://github.com/czertyaka/CppDevCourse-hw-hide-secret}. + + \item Добавьте в форк файл \textit{hide-secret.cpp} c реализацией функции \texttt{hide\_secret}. + + \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 0cd1749..5eba614 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ BUILD_DIR := build hw-02 \ hw-03 \ hw-04 \ + hw-05 \ install \ pr-01 \ pr-02 \ @@ -33,6 +34,7 @@ build: \ hw-02 \ hw-03 \ hw-04 \ + hw-05 \ pr-01 \ pr-02 \ pr-03 \ @@ -67,6 +69,7 @@ install: build cp "$(BUILD_DIR)/hw-02.pdf" "$(PREFIX)/Домашние задания/02 Git & Github.pdf" 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" mkdir -p "$(PREFIX)/Проекты" cp "$(BUILD_DIR)/prj-auth-lib.pdf" "$(PREFIX)/Проекты/Библиотека идентификации и аутентификации.pdf" cp "$(BUILD_DIR)/prj-enc-exch.pdf" "$(PREFIX)/Проекты/Baremetal шифрование обмена.pdf" @@ -83,6 +86,7 @@ help: @printf "hw-02\tbuild homework hw-02.pdf\n" @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 "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" @@ -116,6 +120,7 @@ hw-01: hw-01.pdf hw-02: hw-02.pdf hw-03: hw-03.pdf hw-04: hw-04.pdf +hw-05: hw-05.pdf prj-auth-lib: prj-auth-lib.pdf prj-enc-exch: prj-enc-exch.pdf @@ -291,6 +296,13 @@ hw-04.pdf: \ Packages/mylisting.sty $(call generate_pdf,$<,$@) +hw-05.pdf: \ + Homeworks/05-Hide-Secret/hide-secret.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) \ From 4f853b10fe00b9a7f0d379f9954ee4bbc575f55a Mon Sep 17 00:00:00 2001 From: czertyaka Date: Wed, 15 Oct 2025 22:46:48 +0500 Subject: [PATCH 4/6] Update submodule commit --- Homeworks/05-Hide-Secret/hw-project | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Homeworks/05-Hide-Secret/hw-project b/Homeworks/05-Hide-Secret/hw-project index 2d5ac84..18df02a 160000 --- a/Homeworks/05-Hide-Secret/hw-project +++ b/Homeworks/05-Hide-Secret/hw-project @@ -1 +1 @@ -Subproject commit 2d5ac8462df7122efbb4c80b205ebbc803e45dd8 +Subproject commit 18df02a713fda20991874ec8cad9d2285791e8d3 From 56964eda025b5f02b3ba6e463db8d691c9c6d5e8 Mon Sep 17 00:00:00 2001 From: czertyaka Date: Wed, 15 Oct 2025 22:58:17 +0500 Subject: [PATCH 5/6] dummy commit From 246059a24035433c5abfcb42fe81473c407a93c6 Mon Sep 17 00:00:00 2001 From: czertyaka Date: Wed, 15 Oct 2025 23:10:03 +0500 Subject: [PATCH 6/6] Clone submodules in CI --- .github/workflows/compile.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml index 7f06eb8..45645c0 100644 --- a/.github/workflows/compile.yml +++ b/.github/workflows/compile.yml @@ -13,6 +13,8 @@ jobs: steps: - uses: actions/checkout@v5 + with: + submodules: true - uses: cachix/install-nix-action@v31