From 2973b7ca22c52d24dcc88f2f9d4e53ce179f596b Mon Sep 17 00:00:00 2001 From: Arity-T Date: Sun, 9 Mar 2025 12:09:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D1=85=D0=BE=D0=B4=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BE=D0=B4=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab1/report.tex | 200 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 185 insertions(+), 15 deletions(-) diff --git a/lab1/report.tex b/lab1/report.tex index 09f682f..0f10afd 100644 --- a/lab1/report.tex +++ b/lab1/report.tex @@ -37,19 +37,6 @@ \usepackage{hyperref}% для гиперссылок \usepackage{enumitem} %для перечислений -% Настраиваем листинги, чтобы они использовали счётчик figure -\AtBeginDocument{ - \renewcommand{\thelstlisting}{\thefigure} % Листинги используют тот же счетчик, что и рисунки - \renewcommand{\lstlistingname}{Рис.} % Меняем подпись на "Рисунок" -} - -% Автоматически увеличиваем счетчик figure перед каждым листингом -\let\oldlstlisting\lstlisting -\renewcommand{\lstlisting}[1][]{% - \refstepcounter{figure}% Увеличиваем счетчик figure - \oldlstlisting[#1]% Вызываем оригинальную команду lstlisting -} - \newcommand{\specialcell}[2][l]{\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}} @@ -99,11 +86,11 @@ % Настройка листингов \lstset{ - language=SQL, + language=C++, extendedchars=\true, inputencoding=utf8, keepspaces=true, - captionpos=b, + % captionpos=b, % подписи листингов снизу } \begin{document} % начало документа @@ -252,7 +239,190 @@ тех же программ со стороны других рецензентов~\cite{mayers} + \section{Технология инспекции кода} + \subsection{Состав группы} + + Заседание происходило в следущем составе: + + \begin{itemize} + \item секретарь Кондраев Дмитрий, исполняющий роль координатора; + \item специалист по тестированию Астафьев Игорь; + \item программист Тищенко Артём, он же проектировщик программы. + \end{itemize} + + \subsection{Исходный код программы} + + Код исходного файла программы представлен в листинге~\ref{lst:source}. + +\begin{lstlisting}[caption={Исходный код программы \texttt{bubble\_sort.cpp}.}, label={lst:source}] +#include +#include +#include +#include +#include + +using namespace std; + +struct BSTNode { + string word; + BSTNode* left; + BSTNode* right; + BSTNode(const string& w) : word(w), left(nullptr), right(nullptr) {} +}; + +class BST { + BSTNode* root; + + bool insertNode(BSTNode*& node, const string& w) { + if (!node) { + node = new BSTNode(w); + return true; + } + if (w == node->word) return false; + if (w < node->word) return insertNode(node->left, w); + return insertNode(node->right, w); + } + + bool removeNode(BSTNode*& node, const string& w) { + if (!node) return false; + if (w < node->word) return removeNode(node->left, w); + if (w > node->word) return removeNode(node->right, w); + if (!node->left) { + BSTNode* temp = node->right; + delete node; + node = temp; + } else if (!node->right) { + BSTNode* temp = node->left; + delete node; + node = temp; + } else { + BSTNode* minNode = findMin(node->right); + node->word = minNode->word; + removeNode(node->right, minNode->word); + } + return true; + } + + BSTNode* findMin(BSTNode* node) { + if (!node) return nullptr; + while (node->left) node = node->left; + return node; + } + + void clearTree(BSTNode*& node) { + if (!node) return; + clearTree(node->left); + clearTree(node->right); + delete node; + node = nullptr; + } + + void inorder(BSTNode* node, vector& result) const { + if (!node) return; + inorder(node->left, result); + result.push_back(node->word); + inorder(node->right, result); + } + +public: + BST() : root(nullptr) {} + bool insert(const string& w) { return insertNode(root, w); } + bool remove(const string& w) { return removeNode(root, w); } + void clear() { clearTree(root); } + vector getAllWords() const { + vector result; + inorder(root, result); + return result; + } +}; + +int main() { + SetConsoleCP(1251); + SetConsoleOutputCP(1251); + setlocale(LC_ALL, "Russian"); + BST dictionary; + + cout << "Команды:\n" + << "0 - очистить словарь;\n" + << "1,<строка> - добавить строку;\n" + << "2,<строка> - удалить строку;\n" + << "3 - вывести все слова;\n" + << "4 - завершить работу.\n\n"; + + while (true) { + string input; + if (!getline(cin, input)) break; + if (input.empty()) { + cout << "Некорректный ввод!\n"; + continue; + } + int commaPos = input.find(','); + int command; + string cmdStr, word; + if (commaPos == (int)string::npos) { + cmdStr = input; + } else { + cmdStr = input.substr(0, commaPos); + if (commaPos + 1 < (int)input.size()) { + word = input.substr(commaPos + 1); + } + } + try { command = stoi(cmdStr); } + catch (...) { + cout << "Некорректный ввод!\n"; + continue; + } + + switch (command) { + case 0: + dictionary.clear(); + cout << "Словарь очищен\n"; + break; + case 1: + if (word.empty()) { + cout << "Некорректный ввод!\n"; + break; + } + if (dictionary.insert(word)) + cout << "Строка \"" << word << "\" добавлена в словарь\n"; + else + cout << "Строка \"" << word << "\" уже есть в словаре\n"; + break; + case 2: + if (word.empty()) { + cout << "Некорректный ввод!\n"; + break; + } + if (dictionary.remove(word)) + cout << "Строка \"" << word << "\" удалена из словаря\n"; + else + cout << "Строка \"" << word << "\" не найдена в словаре\n"; + break; + case 3: { + vector allWords = dictionary.getAllWords(); + if (allWords.empty()) { + cout << "Словарь пуст\n"; + break; + } + for (int i = 0; i < (int)allWords.size(); i++) { + cout << allWords[i]; + if (i + 1 < (int)allWords.size()) cout << ", "; + } + cout << "\n"; + break; + } + case 4: + return 0; + default: + cout << "Некорректный ввод!\n"; + break; + } + } + return 0; +} +\end{lstlisting} + \newpage \section*{Заключение} \addcontentsline{toc}{section}{Заключение}