-
Notifications
You must be signed in to change notification settings - Fork 0
Домашняя работа 5 Cpp (STL-совместимый контейнер) #2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
mmikhail2001
wants to merge
20
commits into
main
Choose a base branch
from
hw2
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
20 commits
Select commit
Hold shift + click to select a range
8b01225
fix readme
mmikhail2001 2e221d3
avl tree
mmikhail2001 f4c102c
smart ptr, one simple test, comparator
mmikhail2001 557ef85
parent link, next, prev
mmikhail2001 b149256
merory leak
mmikhail2001 37fa3f4
merory leak
mmikhail2001 6116112
mini refactor
mmikhail2001 e016d46
clear stupid solutions
mmikhail2001 1479c4c
ready to work!
mmikhail2001 614b5b1
global refactor, add list
mmikhail2001 ccfffe6
ctor, copy ctor, assign operator
mmikhail2001 d9bdd21
tests, *(--set.end())
mmikhail2001 d0a0548
add after_end, before_begin in Iterator
3213925
row pointers, destructor
947a33a
fix memory leak, tests alexey
mmikhail2001 51ffbb2
fix ci
mmikhail2001 22b86d8
fix comments
mmikhail2001 4c30352
coverage libs
mmikhail2001 50e588e
fix tests, fix ci
mmikhail2001 d4dd974
small fix tests
mmikhail2001 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| BasedOnStyle: Microsoft | ||
| IndentWidth: 4 | ||
| UseTab: Always | ||
| AccessModifierOffset: 0 | ||
| AccessModifierOffset: -4 | ||
| AlwaysBreakTemplateDeclarations: Yes | ||
| # IndentAccessModifiers: false | ||
| # does not work | ||
| # https://clang.llvm.org/docs/ClangFormatStyleOptions.html |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,65 @@ | ||
| on: push | ||
|
|
||
| jobs: | ||
| # check: | ||
| # runs-on: ubuntu-latest | ||
| # container: mikhail2001/young_devs_image | ||
| # steps: | ||
| # - uses: actions/checkout@v2 | ||
| # - name: GO LINTER CHECK | ||
| # run: make check || exit 0 | ||
| build: | ||
| runs-on: ubuntu-latest | ||
| container: mikhail2001/young_devs_image | ||
| steps: | ||
| - uses: actions/checkout@v2 | ||
| - name: GO BUILD | ||
| run: make build | ||
| - name: Upload artifacts (EXECUTABLE FILE) | ||
| uses: actions/upload-artifact@v2 | ||
| with: | ||
| name: executable-file | ||
| path: build/fib | ||
| test: | ||
| runs-on: ubuntu-latest | ||
| container: mikhail2001/young_devs_image | ||
| steps: | ||
| - uses: actions/checkout@v2 | ||
| - run: make build TEST_OPT=ON | ||
| - run: make run | ||
| - run: ./build/tests/test_set --gtest_filter=TestBasicsFunctional* | ||
| - name: GO MY TESTS COVERAGE | ||
| run: | | ||
| make lcov | ||
| lcov --remove ./build/coverage.info -o ./build/coverage.info '/usr/include/*' '/usr/lib/*' $(echo $(pwd)/tests/\*) | ||
| make genhtml | ||
| - name: Upload artifacts (COVERAGE REPORT) | ||
| uses: actions/upload-artifact@v2 | ||
| with: | ||
| name: coverage-report-my-tests | ||
| path: build/report | ||
| - run: make build TEST_OPT=ON | ||
| - run: make run | ||
| - run: make test | ||
| - name: GO ALL TESTS COVERAGE | ||
| run: | | ||
| make lcov | ||
| lcov --remove ./build/coverage.info -o ./build/coverage.info '/usr/include/*' '/usr/lib/*' $(echo $(pwd)/tests/\*) | ||
| make genhtml | ||
| - name: Upload artifacts (COVERAGE REPORT) | ||
| uses: actions/upload-artifact@v2 | ||
| with: | ||
| name: coverage-report-all-tests | ||
| path: build/report | ||
| - name: GO VALGRIND TESTS | ||
| run: make valgrind_tests | ||
| - name: GO VALGRIND TARGET | ||
| run: make valgrind_target | ||
| - name: GO SANITIZER | ||
| run: | | ||
| make build SANITIZE_OPT=ON | ||
| make run | ||
| - name: GO SCAN-BUILD | ||
| run: | | ||
| make build | ||
| make scan_build |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| /build | ||
| /.vscode | ||
| test.cpp |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| cmake_minimum_required(VERSION 3.0.0) | ||
| project(main) | ||
|
|
||
| set(CMAKE_CXX_STANDARD 17) | ||
|
|
||
| find_package(Threads REQUIRED) | ||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") | ||
|
|
||
| option(TEST_OPT "build test version" OFF) | ||
| option(DEBUG_OPT "build debug version" ON) | ||
| option(SANITIZE_OPT "build with flags -fsanitize" OFF) | ||
|
|
||
| add_subdirectory(set_lib) | ||
|
|
||
| add_executable(${PROJECT_NAME} main.cpp) | ||
|
|
||
| if(TEST_OPT) | ||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -fPIC -O0") | ||
| set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -coverage -lgcov" ) | ||
| endif() | ||
|
|
||
| if(DEBUG_OPT) | ||
| set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g2 -fPIC -O0") | ||
| endif() | ||
|
|
||
| if(SANITIZE_OPT) | ||
| set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address,undefined" ) | ||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address,undefined") | ||
| endif() | ||
|
|
||
|
|
||
| target_include_directories(${PROJECT_NAME} PUBLIC ${SET_LIB_INCLUDE_DIRS}) | ||
| target_link_libraries(${PROJECT_NAME} PRIVATE ${SET_LIB_LIBRARIES}) | ||
|
|
||
| if (TEST_OPT) | ||
| enable_testing() | ||
| add_subdirectory(tests) | ||
| endif() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| headers=h | ||
| linelength=110 | ||
| filter=-whitespace/tab | ||
| filter=-runtime/int | ||
| filter=-legal/copyright | ||
| filter=-build/header_guard | ||
| filter=-build/include_subdir | ||
| filter=-build/include | ||
| filter=-readability/casting | ||
| filter=-whitespace/braces |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,14 @@ | ||
| FROM ubuntu:latest | ||
| RUN apt update -y && \ | ||
| apt install -y wget g++ make binutils cmake cppcheck clang-tidy python3-pip libc6-dbg cmake libgtest-dev lcov clang-tools vim | ||
| RUN apt install -y libboost-dev libboost-all-dev | ||
| RUN apt install -y clang-format | ||
| RUN apt install -y git curl | ||
| RUN pip install cpplint | ||
| RUN wget https://sourceware.org/pub/valgrind/valgrind-3.18.1.tar.bz2 && \ | ||
| tar xfv valgrind-3.18.1.tar.bz2 && \ | ||
| cd valgrind-3.18.1 && \ | ||
| ./autogen.sh && \ | ||
| ./configure && \ | ||
| make && \ | ||
| make install |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| BUILD_DIR = build | ||
| TESTS_DIR = tests | ||
| LIB_DIR = set_lib | ||
|
|
||
| # project(xxx) on CMakeLists | ||
| TESTS_EXE = test_set | ||
| TARGET_EXE = main | ||
|
|
||
| PATH_LINTERS_SCRIPT = linters/run.sh | ||
|
|
||
| TEST_OPT = OFF | ||
| DEBUG_OPT = OFF | ||
| SANITIZE_OPT = OFF | ||
|
|
||
| .PHONY: check build test clean run coverage | ||
|
|
||
| # Изменения в CMakeLists требует make build | ||
| # make build = cmake && cmake --build | ||
| build: clean | ||
| mkdir ${BUILD_DIR} | ||
| cd ${BUILD_DIR} && cmake .. -DTEST_OPT=${TEST_OPT} -DDEBUG_OPT=${DEBUG_OPT} -DSANITIZE_OPT=${SANITIZE_OPT} && $(MAKE) --no-print-directory | ||
|
|
||
| clean: | ||
| (rm -r ${BUILD_DIR} 2>/dev/null) || exit 0 | ||
|
|
||
| # инкрементальная сборка и запуск исполняемого файла | ||
| run: | ||
| cd ${BUILD_DIR} && $(MAKE) --no-print-directory | ||
| ./${BUILD_DIR}/${TARGET_EXE} | ||
|
|
||
| # запуск исполняемого файла с тестированием | ||
| test: | ||
| ./${BUILD_DIR}/${TESTS_DIR}/${TESTS_EXE} | ||
|
|
||
| # проверка исходного кода | ||
| check: | ||
| chmod u+x ${PATH_LINTERS_SCRIPT} && ./${PATH_LINTERS_SCRIPT} | ||
|
|
||
| lcov: | ||
| cd ${BUILD_DIR} && lcov -t "testing_${LIB_DIR}" -o coverage.info -c -d ./${TESTS_DIR}/ | ||
| genhtml: | ||
| cd ${BUILD_DIR} && genhtml -o report coverage.info | ||
|
|
||
| valgrind_tests: | ||
| valgrind --tool=memcheck --leak-check=yes ./${BUILD_DIR}/${TESTS_DIR}/${TESTS_EXE} | ||
|
|
||
| valgrind_target: | ||
| valgrind --tool=memcheck -s --leak-check=yes --error-exitcode=1 ./${BUILD_DIR}/${TARGET_EXE} | ||
|
|
||
| scan_build: | ||
| cd ${BUILD_DIR} && scan-build $(MAKE) --no-print-directory | ||
|
|
||
| formating: | ||
| clang-format -i -style=file main.cpp ${LIB_DIR}/include/*.h ${LIB_DIR}/include/*.hpp ${LIB_DIR}/src/*.cpp ${TESTS_DIR}/*.cpp | ||
|
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,2 +1,23 @@ | ||
| # techopark_cpp_hw | ||
| Репозиторий для сдачи домашних работ по С++ в Технопарке | ||
|
|
||
| ### Мяделец Михаил WEB-11 | ||
| **STL-совместимый контейнер** | ||
|
|
||
| Необходимо реализовать упрощённую версию упорядоченного множества из STL Set<T>. Асимптотики всех операций должны быть аналогичными std::set. Сравнение элементов типа T осуществлять только при помощи оператора <. | ||
| Необходимо поддержать следующие методы: | ||
| 1) методы жизненного цикла - 4б | ||
| - конструктор по умолчанию; | ||
| - конструктор, принимающий пару итераторов элементов типа T, последовательно вставляемых в контейнер; | ||
| - конструктор, принимающий std::initializer_list элементов типа T; | ||
| - конструктор копирования ("глубокое копирование всех узлов контейнера"); | ||
| - оператор присваивания; | ||
| - деструктор; | ||
|
|
||
| 2) класс должен предоставлять const bidirectional-итератор для доступа к элементам, а также методы begin и end, и позволять просматривать все элементы контейнера без возможности их изменения, перемещаясь от каждого к следующему/предыдущему за O(1). Так как контейнер упорядоченный, то подразумевается их перебор в порядке возрастания - 4б; | ||
|
|
||
| 3) методы insert и erase вставки и удаления элементов из контейнера. Тип возвращаемого значения - void, При наличии/отсутствии элемента ничего делать не нужно. При модификации контейнера любой из этих операций итераторы могут инвалидироваться - 3б; | ||
|
|
||
| 4) константные методы: | ||
| - size и empty, возвращающие количество элементов и true/false в зависимости от наличия элементов в контейнере - 1б; | ||
| - find и lower_bound, которые возвращают соответственно итератор на искомый элемент во множестве/первый элемент, который не меньше искомого (или end() при его отсутствии) - 3б. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,50 @@ | ||
| #!/usr/bin/env bash | ||
|
|
||
| set -o pipefail | ||
|
|
||
| SRC_PATHS="main.cpp set_lib/src/*.cpp" | ||
| INCLUDE_PATHS="set_lib/include/*.h" | ||
| INCLUDE_PATHS_HPP="set_lib/include/*.hpp" | ||
| TESTS_PATHS="tests/*.cpp" | ||
|
|
||
| INCLUDE_DIRECTORIES="set_lib/include" | ||
|
|
||
| function print_header() { | ||
| echo -e "\n***** ${1} *****" | ||
| } | ||
|
|
||
| function check_log() { | ||
| LOG=$( { ${1}; } 2>&1 ) | ||
| STATUS=$? | ||
| echo "$LOG" | ||
| if echo "$LOG" | grep -q -E "${2}" | ||
| then | ||
| exit 1 | ||
| fi | ||
|
|
||
| if [ $STATUS -ne 0 ] | ||
| then | ||
| exit $STATUS | ||
| fi | ||
| } | ||
|
|
||
| # ********** cppcheck ********** | ||
| print_header "RUN cppcheck" | ||
| check_log "cppcheck ${SRC_PATHS} ${INCLUDE_PATHS} ${INCLUDE_PATHS_HPP} ${TESTS_PATHS} --enable=all --inconclusive --error-exitcode=1 -I${INCLUDE_DIRECTORIES} --suppress=missingIncludeSystem" "\(information\)" | ||
|
|
||
| # # ********** clang-tidy ********** | ||
| print_header "RUN clang-tidy" | ||
| check_log "clang-tidy ${SRC_PATHS} ${TESTS_PATHS} -warnings-as-errors=* -extra-arg=-std=c++17 -- -I${INCLUDE_DIRECTORIES} -x c++" "Error (?:reading|while processing)" | ||
|
|
||
|
|
||
| # # ********** cpplint ********** | ||
| print_header "RUN cpplint" | ||
| check_log "cpplint --extensions=cpp ${SRC_PATHS} ${TESTS_PATHS}" "Can't open for reading" | ||
| check_log "cpplint --extensions=h ${INCLUDE_PATHS} ${INCLUDE_PATHS_HPP}" "Can't open for reading" | ||
|
|
||
|
|
||
| # # ********** clang-format ********** | ||
| print_header "RUN clang-format" | ||
| diff <(clang-format --style=Microsoft ${SRC_PATHS} ${INCLUDE_PATHS} ${INCLUDE_PATHS_HPP} ${TESTS_PATHS}) <(cat ${SRC_PATHS} ${INCLUDE_PATHS} ${INCLUDE_PATHS_HPP} ${TESTS_PATHS}) || exit 1 | ||
|
|
||
| print_header "SUCCESS" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| #include "iterator.h" | ||
| #include "set.h" | ||
| #include <vector> | ||
|
|
||
| using std::cout; | ||
| using std::endl; | ||
|
|
||
| int main(int argc, const char *argv[]) | ||
| { | ||
| Set<int> set = {1, 5, 3, 7, 34, 88, 23}; | ||
| // for (auto elem : set) | ||
| // { | ||
| // std::cout << elem << std::endl; | ||
| // } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| cmake_minimum_required(VERSION 3.0.0) | ||
| project(set_lib) | ||
|
|
||
| set(CMAKE_CXX_STANDARD 17) | ||
| # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic -Werror") | ||
|
|
||
| find_package(Threads REQUIRED) | ||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") | ||
|
|
||
| if(TEST_OPT) | ||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -fPIC -O0") | ||
| set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -coverage -lgcov" ) | ||
| endif() | ||
|
|
||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -O0") | ||
| set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -coverage -lgcov" ) | ||
|
|
||
| if(DEBUG_OPT) | ||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g2 -fPIC -O0") | ||
| endif() | ||
|
|
||
| if(NOT DEBUG_OPT AND NOT TEST_OPT) | ||
| # релиз-версия | ||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -O3") | ||
| endif() | ||
|
|
||
| if(SANITIZE_OPT) | ||
| set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address,undefined" ) | ||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address,undefined") | ||
| endif() | ||
|
|
||
| file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) | ||
| file(GLOB INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include) | ||
|
|
||
| add_library(${PROJECT_NAME} ${SOURCES}) | ||
| target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDE_DIRS}) | ||
|
|
||
| message("SOURCES = ${SOURCES}") | ||
| message("INCLUDE_DIRS = ${INCLUDE_DIRS}") | ||
|
|
||
| set(SET_LIB_LIBRARIES ${PROJECT_NAME} PARENT_SCOPE) | ||
| set(SET_LIB_INCLUDE_DIRS ${INCLUDE_DIRS} PARENT_SCOPE) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| #pragma once | ||
|
|
||
| #include "set.h" | ||
|
|
||
| template <typename T, typename Cmp> | ||
| class Iterator | ||
| { | ||
| public: | ||
| using key_type = T; | ||
| using value_type = T; | ||
| using size_type = std::size_t; | ||
| using difference_type = std::ptrdiff_t; | ||
| using key_compare = Cmp; | ||
| using value_compare = Cmp; | ||
| using reference = T &; | ||
| using const_reference = const T &; | ||
| using pointer = T *; | ||
| using const_pointer = const T *; | ||
| using iterator_category = std::bidirectional_iterator_tag; | ||
|
|
||
| Iterator(typename Set<T, Cmp>::Node *node, typename Set<T, Cmp>::Node *root, bool after_end = false, | ||
| bool before_begin = false); | ||
| Iterator() = default; | ||
|
|
||
| Iterator &operator=(const Iterator &) = default; | ||
|
|
||
| Iterator &operator++(); | ||
| Iterator operator++(int); | ||
| Iterator &operator--(); | ||
| Iterator operator--(int); | ||
|
|
||
| const_reference operator*(); | ||
| const_pointer operator->(); | ||
|
|
||
| bool operator==(const Iterator &); | ||
| bool operator!=(const Iterator &); | ||
|
|
||
| private: | ||
| typename Set<T, Cmp>::Node *node; | ||
| typename Set<T, Cmp>::Node *root; | ||
| // признаки местоположения итератора перед первым элементом и после последнего | ||
| bool before_begin = false; | ||
| bool after_end = false; | ||
| }; | ||
|
|
||
| #include "iterator_definition.hpp" |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Добавь само задание в ридми, подпиши работу