From 28d08cd1fbe2f6fd2994313868211fd63f3c073f Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Tue, 25 Nov 2025 23:46:35 +0500 Subject: [PATCH 01/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20addition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01_week/tasks/addition/addition.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/01_week/tasks/addition/addition.cpp b/01_week/tasks/addition/addition.cpp index 92872802..3ca160a1 100644 --- a/01_week/tasks/addition/addition.cpp +++ b/01_week/tasks/addition/addition.cpp @@ -1,7 +1,10 @@ -#include -#include - +#include // заголовочный файл с целочисленными типами фиксированного размера +#include // из этого мы ничего не используем +// функция принимает две перменных типа int и возвращает число типа int64_t int64_t Addition(int a, int b) { - throw std::runtime_error{"Not implemented"}; -} \ No newline at end of file + + // Чтобы сложение выполнялось в int64_t, приводим a и b к этому типу +// static_cast<новый тип>(переменная) + return static_cast(a) + static_cast(b); +} From 74d74dfee412a61bd0e0330cb9c5bde8bf29b3b1 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Tue, 25 Nov 2025 23:57:20 +0500 Subject: [PATCH 02/24] Update testing.yml --- .github/workflows/testing.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 4f8292b7..12eef829 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -1,7 +1,9 @@ name: Testing Tasks -on: [push] - +on: + push: + branches: + - development jobs: test: runs-on: ubuntu-latest @@ -46,4 +48,4 @@ jobs: exit 1 fi fi - done \ No newline at end of file + done From 69700c170b8becf7dea0913c178c50cb7f696221 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Thu, 27 Nov 2025 00:55:42 +0500 Subject: [PATCH 03/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20print=5Fbits.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01_week/tasks/print_bits/print_bits.cpp | 27 +++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/01_week/tasks/print_bits/print_bits.cpp b/01_week/tasks/print_bits/print_bits.cpp index a48a43c1..7eb6e900 100644 --- a/01_week/tasks/print_bits/print_bits.cpp +++ b/01_week/tasks/print_bits/print_bits.cpp @@ -1,7 +1,30 @@ #include #include - +// value - целое число, его нужно вывести в двоичной форме +// bytes типа size_t потому что bytes это количсевто байт void PrintBits(long long value, size_t bytes) { - throw std::runtime_error{"Not implemented"}; + // по условию мы не можем выполнить функцию когда у нас + // количсевто байт = 0, либо количесвто байт > 8 + if (bytes == 0 || bytes > 8) { + return; + } + // Считаем общее количсевто бит, 1 байт = 1 бит + size_t bits = bytes * 8; + // выводим префикс "0b", дальше будет идти предствление числа + std::cout << "0b"; + // цикл будет выполняться bits раз + for (size_t i = 0; i < bits; ++i) { + size_t bit_index = bits - 1 - i; + // побитовый сдвиг, сравниваем младший бит с 1 и выводим результат + std::cout << ((value >> bit_index) & 1); + + // если i + 1 делится на 4 без остатка и это не полседний бит, + // ставим "'" + if ((i + 1) % 4 == 0 && (i + 1) != bits) { + std::cout << "'"; + } + } + // перевод строки + std::cout << '\n'; } From b83a96f855ec4a374fc6ff0351c17c818967ccdf Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Thu, 27 Nov 2025 01:13:41 +0500 Subject: [PATCH 04/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20print=5Fbits.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01_week/tasks/print_bits/print_bits.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01_week/tasks/print_bits/print_bits.cpp b/01_week/tasks/print_bits/print_bits.cpp index 7eb6e900..69e712a7 100644 --- a/01_week/tasks/print_bits/print_bits.cpp +++ b/01_week/tasks/print_bits/print_bits.cpp @@ -19,7 +19,7 @@ void PrintBits(long long value, size_t bytes) { // побитовый сдвиг, сравниваем младший бит с 1 и выводим результат std::cout << ((value >> bit_index) & 1); - // если i + 1 делится на 4 без остатка и это не полседний бит, + // если i + 1 делится на 4 без остатка и это не полседний бит, // ставим "'" if ((i + 1) % 4 == 0 && (i + 1) != bits) { std::cout << "'"; From 9ac64e2157c247c964b99a1f8db0364b2304938a Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Thu, 27 Nov 2025 01:21:07 +0500 Subject: [PATCH 05/24] Update testing.yml --- .github/workflows/testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 12eef829..8d0896ea 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -28,7 +28,7 @@ jobs: echo "Changed files: $changed_files" - tasks=("addition" "rms" "print_bits" "check_flags" "length_lit" "quadratic" "char_changer") + tasks=("addition" "print_bits" "check_flags" "length_lit" "quadratic" "char_changer") for task in "${tasks[@]}"; do if echo "$changed_files" | grep -q "$task/"; then From 62eec260508fec250f8afba89d28489650fcc241 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Fri, 28 Nov 2025 23:17:31 +0500 Subject: [PATCH 06/24] Update testing.yml --- .github/workflows/testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 8d0896ea..12eef829 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -28,7 +28,7 @@ jobs: echo "Changed files: $changed_files" - tasks=("addition" "print_bits" "check_flags" "length_lit" "quadratic" "char_changer") + tasks=("addition" "rms" "print_bits" "check_flags" "length_lit" "quadratic" "char_changer") for task in "${tasks[@]}"; do if echo "$changed_files" | grep -q "$task/"; then From 934f30db6644a38271f1a55017d5c0a4ab11d84f Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Fri, 28 Nov 2025 23:21:07 +0500 Subject: [PATCH 07/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20rms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01_week/tasks/rms/rms.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/01_week/tasks/rms/rms.cpp b/01_week/tasks/rms/rms.cpp index 6882f0a9..6376eb5a 100644 --- a/01_week/tasks/rms/rms.cpp +++ b/01_week/tasks/rms/rms.cpp @@ -1,7 +1,19 @@ -#include +#include #include - +#include double CalculateRMS(double values[], size_t size) { - throw std::runtime_error{"Not implemented"}; -} \ No newline at end of file + + // в случае пустовго массива возращаем 0.0 + if (size == 0) { + return 0.0; + } + + double sumSq = 0.0; + // сумма квадратов + for (size_t i = 0; i < size; ++i) { + sumSq += values[i] * values[i]; + } + // RMS + return std::sqrt(sumSq /size); +} From 7b757565014ac80db658ae41865f17c86144c0c3 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Fri, 28 Nov 2025 23:31:44 +0500 Subject: [PATCH 08/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D1=86=D0=B0=D0=B8=D1=8F=20check=5Fflags?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01_week/tasks/check_flags/check_flags.cpp | 87 +++++++++++++++++++++-- 1 file changed, 81 insertions(+), 6 deletions(-) diff --git a/01_week/tasks/check_flags/check_flags.cpp b/01_week/tasks/check_flags/check_flags.cpp index 75e7c652..665139dd 100644 --- a/01_week/tasks/check_flags/check_flags.cpp +++ b/01_week/tasks/check_flags/check_flags.cpp @@ -1,8 +1,8 @@ -#include -#include + #include + #include - -enum class CheckFlags : uint8_t { + // каждый флаг это один бит в маске, флаг занимает ровно один + enum class CheckFlags : uint8_t { NONE = 0, TIME = (1 << 0), DATE = (1 << 1), @@ -12,7 +12,82 @@ enum class CheckFlags : uint8_t { DEST = (1 << 5), ALL = TIME | DATE | USER | CERT | KEYS | DEST }; + void PrintCheckFlags(CheckFlags flags) { + // мы не можем напрямую работать с flags, поэтому преобразуем + // flags из типа CheckFlags в обычное число типа uint8_t + // uint8_t потому что все флаги храняться в одном байте + uint8_t mask = static_cast(flags); + // так как маска = 8 бит, то и все разрешенные флаги тоже 8 бит (поэтому uint8_t) + // но в целом как для mask, так и для allowedFlags могли написать int и не париться, но с uint8_t корректнее + uint8_t allowedFlags = static_cast(CheckFlags::ALL); + + // Если передано значение выходит из возможного диапазона значений, то вывод следует оставить пустым. + // к примеру если мы на вход подаем значение 128, а 128 в двочиной это 10000000 (mask), allowedFlags = 01111111, то + // 10000000 + // 11000000 (инверсия) + // -------- + // 10000000 (такого флага в маске нет) + if (mask & ~allowedFlags) { + return; + } + + // Если передан флаг отсутствия проверок, то выводим пустые `[]` + if (mask == 0) { + std::cout << "[]"; + return; + } + + // дальше расматриваем все возможные случаи проверок + std::cout << "["; + // флаг состояний для запятой + bool first = true; + + if (mask & static_cast(CheckFlags::TIME)) { + if (!first) { + std::cout << ","; + } + std::cout << "TIME"; + first = false; + } + + if (mask & static_cast(CheckFlags::DATE)) { + if (!first) { + std::cout << ","; + } + std::cout << "DATE"; + first = false; + } + + if (mask & static_cast(CheckFlags::USER)) { + if (!first) { + std::cout << ","; + } + std::cout << "USER"; + first = false; + } + + if (mask & static_cast(CheckFlags::CERT)) { + if (!first) { + std::cout << ","; + } + std::cout << "CERT"; + first = false; + } + + if (mask & static_cast(CheckFlags::KEYS)) { + if (!first) { + std::cout << ","; + } + std::cout << "KEYS"; + first = false; + } + + if (mask & static_cast(CheckFlags::DEST)) { + if (!first) { + std::cout << ","; + } + std::cout << "DEST"; + } -void PrintCheckFlags(CheckFlags flags) { - throw std::runtime_error{"Not implemented"}; + std::cout << "]"; } From 8b8b294e209424e9850f23b934bd5a2ea064b04d Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Fri, 28 Nov 2025 23:33:11 +0500 Subject: [PATCH 09/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20length?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01_week/tasks/length_lit/length_lit.cpp | 62 +++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/01_week/tasks/length_lit/length_lit.cpp b/01_week/tasks/length_lit/length_lit.cpp index e69de29b..d90ec9f8 100644 --- a/01_week/tasks/length_lit/length_lit.cpp +++ b/01_week/tasks/length_lit/length_lit.cpp @@ -0,0 +1,62 @@ +// в метрах +const double INCH = 0.0254; +const double FOOT = 0.3048; +const double CM = 0.01; + +// перевод из дюймов в метры +double operator"" _in_to_m(long double v) { + return v * INCH; +} +// перевод из дюймов в сантиметры +double operator"" _in_to_cm(long double v) { + double m = v * INCH; + return m / CM; +} +// перевод из дюймов в футы +double operator"" _in_to_ft(long double v) { + double m = v * INCH; + return m / FOOT; +} + +// перевод из футов в метры +double operator"" _ft_to_m(long double v) { + return v * FOOT; +} +// перевод из футов в сантиметры +double operator"" _ft_to_cm(long double v) { + double m = v * FOOT; + return m / CM; +} +// перевод из футов в дюймы +double operator"" _ft_to_in(long double v) { + double m = v * FOOT; + return m / INCH; +} + +// перевод из сантиметров в метры +double operator"" _cm_to_m(long double v) { + return v * CM; +} +// перевод из сантиметров в дюймы +double operator"" _cm_to_in(long double v) { + double m = v * CM; + return m / INCH; +} +// перевод из сантиметров в футы +double operator"" _cm_to_ft(long double v) { + double m = v * CM; + return m / FOOT; +} + +// перевод из метров в сантиметры +double operator"" _m_to_cm(long double v) { + return v / CM; +} +// перевод из метров в дюймы +double operator"" _m_to_in(long double v) { + return v / INCH; +} +// перевод из метров в футы +double operator"" _m_to_ft(long double v) { + return v / FOOT; +} From ef05ef73c2ff699ba63abeaf1eb551d74ea71f1e Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Fri, 28 Nov 2025 23:35:18 +0500 Subject: [PATCH 10/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20quadratic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01_week/tasks/quadratic/quadratic.cpp | 85 ++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 3 deletions(-) diff --git a/01_week/tasks/quadratic/quadratic.cpp b/01_week/tasks/quadratic/quadratic.cpp index abf7d632..daa8eb20 100644 --- a/01_week/tasks/quadratic/quadratic.cpp +++ b/01_week/tasks/quadratic/quadratic.cpp @@ -1,6 +1,85 @@ -#include +#include +#include +#include void SolveQuadratic(int a, int b, int c) { - throw std::runtime_error{"Not implemented"}; -} \ No newline at end of file + // первый случай: если a = b = c = 0, то уравнение примнимает бесконченое количесвто решений + if (a == 0 && b == 0 && c == 0) { + std::cout << "infinite solutions"; + return; + } + + // второй случай: если a = b = 0, то уравнение решений не имеет + if (a == 0 && b == 0) { + std::cout << "no solutions"; + return; + } + + std::cout << std::setprecision(6); + + // третий случай: a == 0, b != 0 → b*x + c = 0 + if (a == 0) { + double x = -static_cast(c) / static_cast(b); // x = -c / b + + // Убираем возможный "-0" + if (x == -0.0) { + x = 0.0; + } + + std::cout << x; + return; + } + + // 4) четвертый случай: a неравно 0, то есть уже само квадартное уравнение + double A = static_cast(a); + double B = static_cast(b); + double C = static_cast(c); + + // Дискриминант + double D = B * B - 4 * A * C; + + // Нет вещественных корней + if (D < 0) { + std::cout << "no solutions"; + return; + } + + // Один вещественный корень + if (D == 0) { + double root = -B / (2 * A); + double x = static_cast(root); + + // Убираем "-0" + if (x == -0.0) { + x = 0.0; + } + + std::cout << x; + return; + } + + // если D > 0, то имеем два различных корня + double sqrtD = std::sqrt(D); + + double root1 = (-B - sqrtD) / (2 * A); + double root2 = (-B + sqrtD) / (2 * A); + + double x1 = static_cast(root1); + double x2 = static_cast(root2); + + // Убираем "-0" для каждого корня + if (x1 == -0.0) { + x1 = 0.0; + } + if (x2 == -0.0) { + x2 = 0.0; + } + + // выводим так, чтобы x1 < x2 + if (x1 > x2) { + std::swap(x1, x2); + } + + std::cout << x1 << ' ' << x2; +} From ac1a14588022f6d427a0d4a3dcbadfb4c9c4f140 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Fri, 28 Nov 2025 23:49:25 +0500 Subject: [PATCH 11/24] Update testing.yml --- .github/workflows/testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 12eef829..5da853bd 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -28,7 +28,7 @@ jobs: echo "Changed files: $changed_files" - tasks=("addition" "rms" "print_bits" "check_flags" "length_lit" "quadratic" "char_changer") + tasks=("addition" "print_bits" "check_flags" "length_lit" "quadratic" "rms" "char_changer") for task in "${tasks[@]}"; do if echo "$changed_files" | grep -q "$task/"; then From 3c0000c550217e8535d34ef680de46c45ef31f9e Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Sat, 29 Nov 2025 00:10:09 +0500 Subject: [PATCH 12/24] =?UTF-8?q?=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B0=D1=8F=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0,=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20values=20=3D=3D=20nullpt?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01_week/tasks/rms/rms.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01_week/tasks/rms/rms.cpp b/01_week/tasks/rms/rms.cpp index 6376eb5a..afc9b67c 100644 --- a/01_week/tasks/rms/rms.cpp +++ b/01_week/tasks/rms/rms.cpp @@ -5,7 +5,7 @@ double CalculateRMS(double values[], size_t size) { // в случае пустовго массива возращаем 0.0 - if (size == 0) { + if (size == 0 || values == nullptr) { return 0.0; } From d49f95d4f46ae1ff1d0e3200ee036a7e772b4760 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Mon, 1 Dec 2025 01:32:41 +0500 Subject: [PATCH 13/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20char=5Fchanger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01_week/tasks/char_changer/char_changer.cpp | 87 ++++++++++++++++++++- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/01_week/tasks/char_changer/char_changer.cpp b/01_week/tasks/char_changer/char_changer.cpp index 3a7344d9..6cec0357 100644 --- a/01_week/tasks/char_changer/char_changer.cpp +++ b/01_week/tasks/char_changer/char_changer.cpp @@ -1,7 +1,88 @@ #include -#include - +#include // применял isspace, isdigit, isupper, islower, toupper size_t CharChanger(char array[], size_t size, char delimiter = ' ') { - throw std::runtime_error{"Not implemented"}; + if (size == 0) { + return 0; + } + + size_t read = 0; // это индекс для чтения + size_t write = 0; // это индекс для запси символов + + // идем по массиву пока не выйдем за него + // и пока текущий символ не конец строки, конец строки по условию это '\0' + while (read < size && array[read] != '\0') { + // в cppreference указано, что isspace должно принимать безнаковый символ, + // поэтому преобразуем текущий символ из char в unsigned char + unsigned char uc = static_cast(array[read]); + // если текущий символ пробельный + if (std::isspace(uc)) { + + // пропускаем все подряд идущие пробельные символы + while (read < size && array[read] != '\0') { + unsigned char c = static_cast(array[read]); + if (!std::isspace(c)) { + break; // текущий символ больше не пробел — выходим + } + ++read; // пробел — пропускаем и идём дальше + } + // теперь когда мы прочитали все пробелы записывыем в write только один пробел + array[write++] = delimiter; + + } else { + // Теперь рассматриваем случай когда у нас идут подряд одинаковые символы + // Текущий символ массива + char current = array[read]; + size_t count = 0; // это как счетчик, то есть сколько повторябщихся символов + // идем пока текущий символ не превзойдет размер массива и + // символ не конец строки и символ на текущей позиции такой же как и currentт + while (read < size && array[read] != '\0' && array[read] == current) { + ++count; + ++read; + } + + // Определяем, какой символ писать по правилам + // в cppreference указано, что isdigit,isupper,islower должно принимать безнаковый символ, + // поэтому преобразуем текущий символ current из char в unsigned char + unsigned char cu = static_cast(current); + char Char; + + if (std::isdigit(cu)) { // цифры заменяем на '*' + Char = '*'; + } else if (std::isupper(cu)) { //прописные латинские не меняем + Char = current; + } else if (std::islower(cu)) { // строчные на прописные + Char = static_cast(std::toupper(cu)); + } else { // остальное на '_' + Char = '_'; + } + + // записываем символ в write + array[write++] = Char; + + // пишем количество повторений, если count > 1 + if (count > 1) { + if (count >= 10) { // Если повторений не менее 10, указывается `0` после символа + array[write++] = '0'; + } else { + // записываем в write число посторений (то есть елси 2222, то 4), + // Например, если было "2222", то count = 4, и мы должны записать символ '4'. + // В кодировке ASCII код символа '0' равен 48 + // Поэтому, чтобы получить символ '4', берём код '0' (48) и прибавляем 4 (48 + 4 = 52 — это код '4') + array[write++] = static_cast('0' + count); // + } + } + } + } + + // завершаем строку + if (write >= size) { + write = size - 1; + } + array[write] = '\0'; + + return write; } + + + From 7977551642a300edb62c308224ab69a366820484 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Tue, 2 Dec 2025 19:51:54 +0500 Subject: [PATCH 14/24] Update testing.yml --- .github/workflows/testing.yml | 44 ++++++++++++++--------------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 802c39ab..68761ef4 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -1,4 +1,21 @@ - | +name: Testing Tasks + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install compiler and CMake + run: sudo apt install -y cmake build-essential g++-14 libgtest-dev libgmock-dev + + - name: Configure project + run: cmake -B build + + - name: Build and run tests for changed tasks + run: | # Проверяем, есть ли предыдущий коммит if git rev-parse HEAD~1 > /dev/null 2>&1; then @@ -10,9 +27,6 @@ echo "Changed files:" echo "$changed_files" -<<<<<<< HEAD - tasks=("addition" "print_bits" "check_flags" "length_lit" "quadratic" "rms" "char_changer") -======= tasks=("addition" "rms" "print_bits" "check_flags" "length_lit" "quadratic" "char_changer" "swap_ptr" "func_array" "longest" "last_of_us" "little_big" "pretty_array") @@ -21,25 +35,6 @@ declare -i task_count=0 echo "=== Starting tests for changed tasks ===" ->>>>>>> main -name: Testing Tasks - -on: [push, pull_request] - -jobs: - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install compiler and CMake - run: sudo apt install -y cmake build-essential g++-14 libgtest-dev libgmock-dev - - - name: Configure project - run: cmake -B build - - - name: Build and run tests for changed tasks - run: | for task in "${tasks[@]}"; do if echo "$changed_files" | grep -q "tasks/$task/"; then @@ -62,8 +57,6 @@ jobs: fi fi done -<<<<<<< HEAD -======= echo "=== Test Results Summary ===" echo "Total tasks in list: ${#tasks[@]}" @@ -81,4 +74,3 @@ jobs: echo "✅ All processed tasks passed!" exit 0 fi ->>>>>>> main From a328691cc67e7f6c3d48d127c4a98d1c1bb2158f Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Wed, 3 Dec 2025 21:44:21 +0500 Subject: [PATCH 15/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20swap=5Fptr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 02_week/tasks/swap_ptr/swap_ptr.cpp | 36 ++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/02_week/tasks/swap_ptr/swap_ptr.cpp b/02_week/tasks/swap_ptr/swap_ptr.cpp index 93db625d..354e217d 100644 --- a/02_week/tasks/swap_ptr/swap_ptr.cpp +++ b/02_week/tasks/swap_ptr/swap_ptr.cpp @@ -1,6 +1,36 @@ #include +#include +// Есть три вида Template parameters: +// 1. constant template parameter +// 2. type template parameter (нам нужен этот) +// 3. template template parameter +template // параметр-тип +void SwapPtr(T*& a, T*& b) { + T* ptr = a; // сохраняем адрес из a + a = b; // кладём в a адрес из b + b = ptr; // в b кладём старый адрес a +} -void SwapPtr(/* write arguments here */) { - throw std::runtime_error{"Not implemented"}; -} \ No newline at end of file + +// это для визуальной проверки +/* int main() { + int x = 1; + int y = 2; + + int* a = &x; + int* b = &y; + + std::cout << "До SwapPtr\n"; + std::cout << "Адрес a = " << a << ", *a = " << *a << "\n"; + std::cout << "Адрес b = " << b << ", *b = " << *b << "\n"; + + SwapPtr(a, b); + + std::cout << "После SwapPtr\n"; + std::cout << "Адрес a = " << a << ", *a = " << *a << "\n"; + std::cout << "Адрес b = " << b << ", *b = " << *b << "\n"; + + return 0; +} */ + \ No newline at end of file From 0ed0241a017100c018b12bb249b4151073f14612 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Thu, 4 Dec 2025 22:49:14 +0500 Subject: [PATCH 16/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20func=5Farray?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 02_week/tasks/func_array/func_array.cpp | 26 +++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/02_week/tasks/func_array/func_array.cpp b/02_week/tasks/func_array/func_array.cpp index b327e68d..068bf417 100644 --- a/02_week/tasks/func_array/func_array.cpp +++ b/02_week/tasks/func_array/func_array.cpp @@ -1,6 +1,28 @@ #include -double ApplyOperations(double a, double b /* other arguments */) { - throw std::runtime_error{"Not implemented"}; +double ApplyOperations( + double a, + double b, + double (*operations[])(double, double), + size_t size +) { + if (size == 0) { + return 0.0; + } + + double sum = 0.0; + + for (size_t i = 0; i < size; ++i) { + + // ---- ключевая защита ---- + if (operations[i] == nullptr) { + continue; // пропускаем пустую функцию + } + + double value = operations[i](a, b); + sum += value; + } + + return sum; } \ No newline at end of file From 23c09fde7ea47d106d8f8011ce3045017c68f29a Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Thu, 4 Dec 2025 22:50:42 +0500 Subject: [PATCH 17/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20func=5Farray?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 02_week/tasks/func_array/func_array.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/02_week/tasks/func_array/func_array.cpp b/02_week/tasks/func_array/func_array.cpp index 068bf417..3b332cb6 100644 --- a/02_week/tasks/func_array/func_array.cpp +++ b/02_week/tasks/func_array/func_array.cpp @@ -1,27 +1,28 @@ #include - double ApplyOperations( double a, double b, - double (*operations[])(double, double), - size_t size + double (*mathOperations[])(double, double), // массив указателей, который принимает два числа типа double + size_t size // рамзер массива ) { + // если массив пуст - возвращаем 0.0 if (size == 0) { return 0.0; } - + // переменная для суммы мат операций double sum = 0.0; - + // проходим по каждому элементу массива for (size_t i = 0; i < size; ++i) { - // ---- ключевая защита ---- - if (operations[i] == nullptr) { + // если один из указателей массива пустой, то пропускаем + if (mathOperations[i] == nullptr) { continue; // пропускаем пустую функцию } - - double value = operations[i](a, b); - sum += value; + // вызываем i-ю функцию с числами a и b, кладем в v + double v = mathOperations[i](a, b); + // прибавляем к общей сумме + sum += v; } return sum; From dc7e2ca733f2caa29fcfd77571b2540d4e59d680 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Sat, 6 Dec 2025 14:47:17 +0500 Subject: [PATCH 18/24] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20swap=5Fptr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 02_week/tasks/swap_ptr/swap_ptr.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/02_week/tasks/swap_ptr/swap_ptr.cpp b/02_week/tasks/swap_ptr/swap_ptr.cpp index 354e217d..dc835ee2 100644 --- a/02_week/tasks/swap_ptr/swap_ptr.cpp +++ b/02_week/tasks/swap_ptr/swap_ptr.cpp @@ -7,11 +7,32 @@ template // параметр-тип void SwapPtr(T*& a, T*& b) { - T* ptr = a; // сохраняем адрес из a + T* tmp = a; // сохраняем адрес из a a = b; // кладём в a адрес из b - b = ptr; // в b кладём старый адрес a + b = tmp; // в b кладём старый адрес a } +// версия без использования парметр-тип: +/* void SwapPtr(int*& a, int*& b) { + int* tmp = a; + a = b; + b = tmp; +} + +void SwapPtr(const int*& a, const int*& b) { + const int* tmp = a; + a = b; + b = tmp; +} + +void SwapPtr(int**& a, int**& b) { + int** tmp = a; + a = b; + b = tmp; +} +*/ + + // это для визуальной проверки /* int main() { From 31c0c0ea938e9dd37b47c1b717c7f585055dce11 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Sat, 6 Dec 2025 19:58:20 +0500 Subject: [PATCH 19/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20longest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 02_week/tasks/longest/longest.cpp | 57 +++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/02_week/tasks/longest/longest.cpp b/02_week/tasks/longest/longest.cpp index 04b3c354..470cfbfe 100644 --- a/02_week/tasks/longest/longest.cpp +++ b/02_week/tasks/longest/longest.cpp @@ -1,6 +1,57 @@ -#include +#include +// Функция ищет самую длинную подпоследовательность одинаковых символов +// в диапазоне [begin, end). Длину подпоследовательности записывает в count. +// Возвращает указатель на начало найденной подпоследовательности. +// В случае ошибки возвращает nullptr. В count записывает 0. +char* FindLongestSubsequence(char* begin, char* end, size_t& count) { + // проверка корректнсти + if (begin == nullptr || end == nullptr || begin >= end) { + count = 0; + return nullptr; + } -/* return_type */ FindLongestSubsequence(/* ptr_type */ begin, /* ptr_type */ end, /* type */ count) { - throw std::runtime_error{"Not implemented"}; + char* best_start = begin; // начало лучшей подпоследовательности + size_t best_length = 1; // длина лучшей последовательности + + char* curr_start = begin; // начало текущей последовательности + size_t curr_length = 1; // длина текущей последовательности + + // Перебираем символы, начиная со второго + for (char* i = begin + 1; i < end; ++i) { + // тут проверка на совпадения + // если совпадает, то увеличивам длину текущей подпоследовательности curr_length + if (*i == *(i - 1)) { + ++curr_length; + } else { + // Если текущая последовательность строго длиннее лучшей, то + // обновляем результат. При равных длинах не обновляем, так как + // по условию возвращается первая + if (curr_length > best_length) { + best_start = curr_start; + best_length = curr_length; + } + curr_start = i; // начинаем новую подпоследовательность с текущего символа + curr_length = 1; // начало новой подпоследовательность + } + } + // Проверяем последнюю подпоследовательность (она могла закончится концом строки) + if (curr_length > best_length) { + best_length = curr_length; + best_start = curr_start; + } + // записываем в count лучшую длину + count = best_length; + return best_start; +} + + +// Перегрузка для const char*. +// Код поиска наибольшей подпоследовтаельности уже реализован в версии для char*, +// поэтому здесь будем использовать его, +// временно снимаем const, чтобы вызвать существующую логику +const char* FindLongestSubsequence(const char* begin, const char* end, size_t& count) { + char* result = FindLongestSubsequence(const_cast(begin), const_cast(end), count); + return result; } + From aba1f07b60a1bbb52f8c092a86a9076fbc00cd61 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Sun, 7 Dec 2025 00:47:42 +0500 Subject: [PATCH 20/24] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20last=5Fof=5Fus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 02_week/tasks/last_of_us/last_of_us.cpp | 27 +++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/02_week/tasks/last_of_us/last_of_us.cpp b/02_week/tasks/last_of_us/last_of_us.cpp index c7bf1a25..ae0eeec2 100644 --- a/02_week/tasks/last_of_us/last_of_us.cpp +++ b/02_week/tasks/last_of_us/last_of_us.cpp @@ -1,6 +1,29 @@ #include +// для случая (nullptr, nullptr) +int* FindLastElement(std::nullptr_t, std::nullptr_t, bool (*)(int)) { + return nullptr; +} +// Функция ищет последний элемент, удовлетворяющий предикату, +// в диапазоне [begin, end). Возвращает указатель на найденный элемент. +// Если элемент не найден или диапазон некорректный, возвращает end. +int* FindLastElement(int* begin, int* end, bool (*predicate)(int)) { + if (begin == nullptr || end == nullptr || begin > end || predicate == nullptr) { + return end; + } + // Перебираем элементы с конца диапазона + for (int* i = end - 1; i >= begin; --i) { + if (predicate(*i)) { + return i; // сразу возвращаем первый подходящий справа + } + } -/* return_type */ FindLastElement(/* ptr_type */ begin, /* ptr_type */ end, /* func_type */ predicate) { - throw std::runtime_error{"Not implemented"}; + // если ничего не нашли, то возвращаем end + return end; +} + +// Перегрузка для const int*. +// Снимаем const, чтобы переиспользовать логику из версии для int*. +const int* FindLastElement(const int* begin, const int* end, bool (*predicate)(int)) { + return FindLastElement(const_cast(begin), const_cast(end), predicate); } \ No newline at end of file From fa0ab6929c19ab3c4b0a4b385407f3a20fb7e40f Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Sun, 7 Dec 2025 17:38:06 +0500 Subject: [PATCH 21/24] fix --- 02_week/tasks/longest/longest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/02_week/tasks/longest/longest.cpp b/02_week/tasks/longest/longest.cpp index 470cfbfe..e4a78575 100644 --- a/02_week/tasks/longest/longest.cpp +++ b/02_week/tasks/longest/longest.cpp @@ -51,7 +51,7 @@ char* FindLongestSubsequence(char* begin, char* end, size_t& count) { // поэтому здесь будем использовать его, // временно снимаем const, чтобы вызвать существующую логику const char* FindLongestSubsequence(const char* begin, const char* end, size_t& count) { - char* result = FindLongestSubsequence(const_cast(begin), const_cast(end), count); + char* result = FindLongestSubsequence(const_cast(begin), const_cast(end), count); return result; } From 1ddb73c16e0ac4f04271ff68c791cfbf9d196a47 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Sun, 7 Dec 2025 22:29:32 +0500 Subject: [PATCH 22/24] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=84=D0=BB?= =?UTF-8?q?=D0=B8=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 68761ef4..3309c63c 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -73,4 +73,4 @@ jobs: else echo "✅ All processed tasks passed!" exit 0 - fi + fi \ No newline at end of file From 31865a2d7cba10d81544081d02d1e3993de53750 Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Sun, 7 Dec 2025 22:41:46 +0500 Subject: [PATCH 23/24] Fix test.cpp Added a newline at the end of the file for consistency. From 376dc4981acb9eb2fbd1f3c386d2570ed6b5ea9f Mon Sep 17 00:00:00 2001 From: GushchinAndrei1 Date: Sun, 7 Dec 2025 22:51:06 +0500 Subject: [PATCH 24/24] Sync pretty_array from main --- 02_week/tasks/pretty_array/test.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/02_week/tasks/pretty_array/test.cpp b/02_week/tasks/pretty_array/test.cpp index 93cfe013..3224871a 100644 --- a/02_week/tasks/pretty_array/test.cpp +++ b/02_week/tasks/pretty_array/test.cpp @@ -27,16 +27,6 @@ class PrintArrayTest : public ::testing::Test { std::streambuf* origin_cout; }; -TEST(FunctionSignatureTest, IntSignature) { - static_assert(std::is_same_v(&PrintMemory)), void (*)(int, bool)>, - "function must have signature: void PrintMemory(int, bool)"); -} - -TEST(FunctionSignatureTest, DoubleSignature) { - static_assert(std::is_same_v(&PrintMemory)), void (*)(double, bool)>, - "function must have signature: void PrintMemory(double, bool)"); -} - TEST_F(PrintArrayTest, EmptyArray) { int arr[] = {1}; PrintArray(arr, arr);