From 0e3d948c9f893d56e5953454e4b7062ec10ef5bf Mon Sep 17 00:00:00 2001 From: AZEN-SGG Date: Sun, 2 Mar 2025 14:38:34 +0300 Subject: [PATCH] Added last three homeworks --- 2025.02.14/1Ex/Linux/Makefile | 8 + 2025.02.14/1Ex/Linux/array.c | 71 ++ 2025.02.14/1Ex/Linux/array.h | 13 + 2025.02.14/1Ex/Linux/io_status.h | 13 + 2025.02.14/1Ex/Linux/main.c | 67 ++ 2025.02.14/1Ex/Makefile | 38 + 2025.02.14/1Ex/array.c | 74 ++ 2025.02.14/1Ex/array.h | 13 + 2025.02.14/1Ex/io_status.h | 13 + 2025.02.14/1Ex/main.c | 67 ++ 2025.02.14/1Ex/o.txt | 14 + 2025.02.14/1Ex/out.txt | 1 + 2025.02.14/1Ex/t.txt | 23 + 2025.02.14/1Ex/Примеры | 13 + 2025.02.14/2Ex/Linux/Makefile | 8 + 2025.02.14/2Ex/Linux/array.c | 75 ++ 2025.02.14/2Ex/Linux/array.h | 13 + 2025.02.14/2Ex/Linux/io_status.h | 13 + 2025.02.14/2Ex/Linux/main.c | 67 ++ 2025.02.14/2Ex/Makefile | 38 + 2025.02.14/2Ex/array.c | 78 ++ 2025.02.14/2Ex/array.h | 13 + 2025.02.14/2Ex/io_status.h | 13 + 2025.02.14/2Ex/main.c | 67 ++ 2025.02.14/2Ex/o.txt | 14 + 2025.02.14/2Ex/t.txt | 23 + 2025.02.14/2Ex/Примеры | 21 + 2025.02.14/3Ex/Linux/Makefile | 8 + 2025.02.14/3Ex/Linux/array.c | 125 ++++ 2025.02.14/3Ex/Linux/array.h | 14 + 2025.02.14/3Ex/Linux/io_status.h | 13 + 2025.02.14/3Ex/Linux/main.c | 69 ++ 2025.02.14/3Ex/Linux/o.txt | 2 + 2025.02.14/3Ex/Linux/t.txt | 2 + 2025.02.14/3Ex/Makefile | 38 + 2025.02.14/3Ex/array.c | 128 ++++ 2025.02.14/3Ex/array.h | 14 + 2025.02.14/3Ex/io_status.h | 13 + 2025.02.14/3Ex/main.c | 69 ++ 2025.02.14/3Ex/o.txt | 4 + 2025.02.14/3Ex/t.txt | 28 + 2025.02.14/3Ex/Примеры | 12 + 2025.02.14/4Ex/Makefile | 38 + 2025.02.14/4Ex/array.c | 135 ++++ 2025.02.14/4Ex/array.h | 14 + 2025.02.14/4Ex/io_status.h | 13 + 2025.02.14/4Ex/main.c | 69 ++ 2025.02.14/4Ex/o.txt | 0 2025.02.14/4Ex/t.txt | 23 + 2025.02.14/4Ex/Примеры | 12 + 2025.02.14/6Ex/Makefile | 38 + 2025.02.14/6Ex/array.c | 95 +++ 2025.02.14/6Ex/array.h | 13 + 2025.02.14/6Ex/io_status.h | 13 + 2025.02.14/6Ex/main.c | 67 ++ 2025.02.14/6Ex/o.txt | 14 + 2025.02.14/6Ex/t.txt | 23 + 2025.02.14/6Ex/Примеры.txt | 23 + 2025.02.14/7Ex/Makefile | 13 + 2025.02.14/7Ex/io_status.h | 13 + 2025.02.14/7Ex/main.c | 67 ++ 2025.02.14/7Ex/o.txt | 0 2025.02.14/7Ex/solve.c | 96 +++ 2025.02.14/7Ex/solve.h | 13 + 2025.02.14/7Ex/t.txt | 1 + 2025.02.14/7Ex/test_cases.json | 222 ++++++ 2025.02.14/7Ex/test_runner.py | 121 +++ 2025.02.14/7Ex/Примеры.txt | 35 + 2025.02.14/8Ex/Linux.rar | Bin 0 -> 2530 bytes 2025.02.14/8Ex/Linux/Makefile | 38 + 2025.02.14/8Ex/Linux/array.c | 115 +++ 2025.02.14/8Ex/Linux/array.h | 14 + 2025.02.14/8Ex/Linux/io_status.h | 13 + 2025.02.14/8Ex/Linux/main.c | 67 ++ 2025.02.14/8Ex/Linux/t.txt | 1 + 2025.02.14/8Ex/Makefile | 13 + 2025.02.14/8Ex/io_status.h | 13 + 2025.02.14/8Ex/main.c | 67 ++ 2025.02.14/8Ex/solve.c | 84 +++ 2025.02.14/8Ex/solve.h | 13 + 2025.02.14/8Ex/t.txt | 6 + 2025.02.14/8Ex/test_cases.json | 212 ++++++ 2025.02.14/8Ex/test_runner.py | 121 +++ 2025.02.14/8Ex/Примеры.txt | 76 ++ 2025.02.14/9Ex/Makefile | 38 + 2025.02.14/9Ex/array.c | 133 ++++ 2025.02.14/9Ex/array.h | 14 + 2025.02.14/9Ex/io_status.h | 13 + 2025.02.14/9Ex/main.c | 67 ++ 2025.02.14/9Ex/o.txt | 2 + 2025.02.14/9Ex/t.txt | 23 + 2025.02.14/9Ex/Примеры.txt | 47 ++ 2025.02.14/Krivoruchenko_SK.zip | Bin 0 -> 9560 bytes 2025.02.14/Krivoruchenko_SK/Makefile | 13 + 2025.02.14/Krivoruchenko_SK/a01.c | 59 ++ 2025.02.14/Krivoruchenko_SK/a02.c | 59 ++ 2025.02.14/Krivoruchenko_SK/a03.c | 56 ++ 2025.02.14/Krivoruchenko_SK/a04.c | 60 ++ 2025.02.14/Krivoruchenko_SK/a06.c | 55 ++ 2025.02.14/Krivoruchenko_SK/a07.c | 55 ++ 2025.02.14/Krivoruchenko_SK/a08.c | 56 ++ 2025.02.14/Krivoruchenko_SK/a09.c | 55 ++ 2025.02.14/Krivoruchenko_SK/io_status.h | 13 + 2025.02.14/Krivoruchenko_SK/solve.c | 886 ++++++++++++++++++++++ 2025.02.14/Krivoruchenko_SK/solve.h | 53 ++ 2025.02.14/Linux/Makefile | 13 + 2025.02.14/Linux/a01.c | 59 ++ 2025.02.14/Linux/a02.c | 59 ++ 2025.02.14/Linux/a03.c | 56 ++ 2025.02.14/Linux/a04.c | 60 ++ 2025.02.14/Linux/a06.c | 55 ++ 2025.02.14/Linux/a07.c | 55 ++ 2025.02.14/Linux/a08.c | 56 ++ 2025.02.14/Linux/a09.c | 55 ++ 2025.02.14/Linux/io_status.h | 13 + 2025.02.14/Linux/solve.c | 929 ++++++++++++++++++++++++ 2025.02.14/Linux/solve.h | 54 ++ 2025.02.14/Makefile | 13 + 2025.02.14/Tasks01.pdf | Bin 0 -> 121360 bytes 2025.02.14/a01.c | 59 ++ 2025.02.14/a02.c | 59 ++ 2025.02.14/a03.c | 56 ++ 2025.02.14/a04.c | 60 ++ 2025.02.14/a06.c | 55 ++ 2025.02.14/a07.c | 55 ++ 2025.02.14/a08.c | 56 ++ 2025.02.14/a09.c | 55 ++ 2025.02.14/io_status.h | 13 + 2025.02.14/solve.c | 929 ++++++++++++++++++++++++ 2025.02.14/solve.h | 54 ++ 2025.02.21/1Ex/Makefile | 16 + 2025.02.21/1Ex/array.c | 75 ++ 2025.02.21/1Ex/array.h | 16 + 2025.02.21/1Ex/io_status.h | 12 + 2025.02.21/1Ex/main.c | 63 ++ 2025.02.21/1Ex/solve.c | 16 + 2025.02.21/1Ex/solve.h | 10 + 2025.02.21/1Ex/t.txt | 3 + 2025.02.21/2Ex/Makefile | 16 + 2025.02.21/2Ex/array.c | 75 ++ 2025.02.21/2Ex/array.h | 16 + 2025.02.21/2Ex/io_status.h | 12 + 2025.02.21/2Ex/main.c | 63 ++ 2025.02.21/2Ex/solve.c | 18 + 2025.02.21/2Ex/solve.h | 10 + 2025.02.21/2Ex/t.txt | 5 + 2025.02.21/3Ex/Makefile | 16 + 2025.02.21/3Ex/array.c | 75 ++ 2025.02.21/3Ex/array.h | 16 + 2025.02.21/3Ex/io_status.h | 12 + 2025.02.21/3Ex/main.c | 63 ++ 2025.02.21/3Ex/solve.c | 20 + 2025.02.21/3Ex/solve.h | 10 + 2025.02.21/3Ex/t.txt | 5 + 2025.02.21/4Ex/Makefile | 16 + 2025.02.21/4Ex/array.c | 75 ++ 2025.02.21/4Ex/array.h | 16 + 2025.02.21/4Ex/io_status.h | 12 + 2025.02.21/4Ex/main.c | 63 ++ 2025.02.21/4Ex/solve.c | 29 + 2025.02.21/4Ex/solve.h | 10 + 2025.02.21/4Ex/t.txt | 11 + 2025.02.21/5Ex/Makefile | 16 + 2025.02.21/5Ex/array.c | 75 ++ 2025.02.21/5Ex/array.h | 16 + 2025.02.21/5Ex/io_status.h | 12 + 2025.02.21/5Ex/main.c | 63 ++ 2025.02.21/5Ex/solve.c | 44 ++ 2025.02.21/5Ex/solve.h | 12 + 2025.02.21/5Ex/t.txt | 3 + 2025.02.21/6Ex/Makefile | 16 + 2025.02.21/6Ex/array.c | 75 ++ 2025.02.21/6Ex/array.h | 16 + 2025.02.21/6Ex/io_status.h | 12 + 2025.02.21/6Ex/main.c | 63 ++ 2025.02.21/6Ex/solve.c | 39 + 2025.02.21/6Ex/solve.h | 11 + 2025.02.21/6Ex/t.txt | 3 + 2025.02.21/7Ex/Makefile | 16 + 2025.02.21/7Ex/array.c | 75 ++ 2025.02.21/7Ex/array.h | 16 + 2025.02.21/7Ex/io_status.h | 12 + 2025.02.21/7Ex/main.c | 63 ++ 2025.02.21/7Ex/solve.c | 39 + 2025.02.21/7Ex/solve.h | 11 + 2025.02.21/7Ex/t.txt | 3 + 2025.02.21/8Ex/Makefile | 16 + 2025.02.21/8Ex/array.c | 75 ++ 2025.02.21/8Ex/array.h | 16 + 2025.02.21/8Ex/io_status.h | 12 + 2025.02.21/8Ex/main.c | 63 ++ 2025.02.21/8Ex/solve.c | 77 ++ 2025.02.21/8Ex/solve.h | 13 + 2025.02.21/8Ex/t.txt | 9 + 2025.02.21/Example/array.c | 68 ++ 2025.02.21/Example/io_status.h | 13 + 2025.02.21/Example/main.c | 52 ++ 2025.02.21/Krivoruchenko_SK.zip | Bin 0 -> 8300 bytes 2025.02.21/Linux/Makefile | 13 + 2025.02.21/Linux/a01.c | 63 ++ 2025.02.21/Linux/a02.c | 63 ++ 2025.02.21/Linux/a03.c | 63 ++ 2025.02.21/Linux/a04.c | 63 ++ 2025.02.21/Linux/a05.c | 63 ++ 2025.02.21/Linux/a06.c | 63 ++ 2025.02.21/Linux/a07.c | 63 ++ 2025.02.21/Linux/a08.c | 63 ++ 2025.02.21/Linux/array.c | 66 ++ 2025.02.21/Linux/array.h | 15 + 2025.02.21/Linux/io_status.h | 12 + 2025.02.21/Linux/solve.c | 269 +++++++ 2025.02.21/Linux/solve.h | 27 + 2025.02.21/Makefile | 14 + 2025.02.21/Tasks02.pdf | Bin 0 -> 70417 bytes 2025.02.21/a01.c | 63 ++ 2025.02.21/a02.c | 63 ++ 2025.02.21/a03.c | 63 ++ 2025.02.21/a04.c | 63 ++ 2025.02.21/a05.c | 63 ++ 2025.02.21/a06.c | 63 ++ 2025.02.21/a07.c | 63 ++ 2025.02.21/a08.c | 63 ++ 2025.02.21/array.c | 66 ++ 2025.02.21/array.h | 15 + 2025.02.21/io_status.h | 12 + 2025.02.21/solve.c | 269 +++++++ 2025.02.21/solve.h | 27 + 2025.02.28/1Ex/Makefile | 19 + 2025.02.28/1Ex/a.txt | 5 + 2025.02.28/1Ex/array.c | 61 ++ 2025.02.28/1Ex/array.h | 14 + 2025.02.28/1Ex/io_status.h | 14 + 2025.02.28/1Ex/main.c | 66 ++ 2025.02.28/1Ex/solve.c | 14 + 2025.02.28/1Ex/solve.h | 8 + 2025.02.28/1Ex/sort.c | 23 + 2025.02.28/1Ex/sort.h | 11 + 2025.02.28/2Ex/Makefile | 19 + 2025.02.28/2Ex/a.txt | 4 + 2025.02.28/2Ex/array.c | 73 ++ 2025.02.28/2Ex/array.h | 15 + 2025.02.28/2Ex/b.txt | 5 + 2025.02.28/2Ex/io_status.h | 14 + 2025.02.28/2Ex/main.c | 120 +++ 2025.02.28/2Ex/solve.c | 24 + 2025.02.28/2Ex/solve.h | 9 + 2025.02.28/2Ex/sort.c | 23 + 2025.02.28/2Ex/sort.h | 11 + 2025.02.28/2Ex/test_cases.json | 19 + 2025.02.28/2Ex/test_runner.py | 130 ++++ 2025.02.28/3Ex/Makefile | 19 + 2025.02.28/3Ex/a.txt | 4 + 2025.02.28/3Ex/array.c | 61 ++ 2025.02.28/3Ex/array.h | 14 + 2025.02.28/3Ex/io_status.h | 14 + 2025.02.28/3Ex/main.c | 68 ++ 2025.02.28/3Ex/solve.c | 21 + 2025.02.28/3Ex/solve.h | 8 + 2025.02.28/3Ex/sort.c | 23 + 2025.02.28/3Ex/sort.h | 11 + 2025.02.28/3Ex/test_cases.json | 110 +++ 2025.02.28/3Ex/test_runner.py | 156 ++++ 2025.02.28/4Ex/Makefile | 19 + 2025.02.28/4Ex/a.txt | 4 + 2025.02.28/4Ex/array.c | 73 ++ 2025.02.28/4Ex/array.h | 15 + 2025.02.28/4Ex/io_status.h | 14 + 2025.02.28/4Ex/main.c | 68 ++ 2025.02.28/4Ex/solve.c | 20 + 2025.02.28/4Ex/solve.h | 8 + 2025.02.28/4Ex/sort.c | 23 + 2025.02.28/4Ex/sort.h | 11 + 2025.02.28/4Ex/test_cases.json | 76 ++ 2025.02.28/4Ex/test_runner.py | 153 ++++ 2025.02.28/5Ex/Makefile | 19 + 2025.02.28/5Ex/a.txt | 4 + 2025.02.28/5Ex/array.c | 73 ++ 2025.02.28/5Ex/array.h | 15 + 2025.02.28/5Ex/io_status.h | 14 + 2025.02.28/5Ex/main.c | 68 ++ 2025.02.28/5Ex/solve.c | 28 + 2025.02.28/5Ex/solve.h | 9 + 2025.02.28/5Ex/sort.c | 23 + 2025.02.28/5Ex/sort.h | 11 + 2025.02.28/5Ex/test_cases.json | 231 ++++++ 2025.02.28/5Ex/test_runner.py | 138 ++++ 2025.02.28/6Ex/Makefile | 19 + 2025.02.28/6Ex/a.txt | 4 + 2025.02.28/6Ex/array.c | 73 ++ 2025.02.28/6Ex/array.h | 15 + 2025.02.28/6Ex/io_status.h | 14 + 2025.02.28/6Ex/main.c | 68 ++ 2025.02.28/6Ex/solve.c | 21 + 2025.02.28/6Ex/solve.h | 10 + 2025.02.28/6Ex/sort.c | 23 + 2025.02.28/6Ex/sort.h | 11 + 2025.02.28/6Ex/test_cases.json | 231 ++++++ 2025.02.28/6Ex/test_runner.py | 138 ++++ 2025.02.28/7Ex/Makefile | 19 + 2025.02.28/7Ex/a.txt | 8 + 2025.02.28/7Ex/array.c | 73 ++ 2025.02.28/7Ex/array.h | 15 + 2025.02.28/7Ex/io_status.h | 14 + 2025.02.28/7Ex/main.c | 68 ++ 2025.02.28/7Ex/solve.c | 25 + 2025.02.28/7Ex/solve.h | 10 + 2025.02.28/7Ex/sort.c | 23 + 2025.02.28/7Ex/sort.h | 11 + 2025.02.28/7Ex/test_cases.json | 231 ++++++ 2025.02.28/7Ex/test_runner.py | 138 ++++ 2025.02.28/8Ex/' | 47 ++ 2025.02.28/8Ex/Makefile | 19 + 2025.02.28/8Ex/a.txt | 9 + 2025.02.28/8Ex/array.c | 73 ++ 2025.02.28/8Ex/array.h | 15 + 2025.02.28/8Ex/io_status.h | 14 + 2025.02.28/8Ex/main.c | 76 ++ 2025.02.28/8Ex/solve.c | 43 ++ 2025.02.28/8Ex/solve.h | 9 + 2025.02.28/8Ex/sort.c | 23 + 2025.02.28/8Ex/sort.h | 11 + 2025.02.28/8Ex/test_cases.json | 231 ++++++ 2025.02.28/8Ex/test_runner.py | 138 ++++ 2025.02.28/9Ex/Makefile | 19 + 2025.02.28/9Ex/a.txt | 10 + 2025.02.28/9Ex/array.c | 73 ++ 2025.02.28/9Ex/array.h | 15 + 2025.02.28/9Ex/io_status.h | 14 + 2025.02.28/9Ex/main.c | 68 ++ 2025.02.28/9Ex/solve.c | 41 ++ 2025.02.28/9Ex/solve.h | 9 + 2025.02.28/9Ex/sort.c | 23 + 2025.02.28/9Ex/sort.h | 11 + 2025.02.28/9Ex/test_cases.json | 231 ++++++ 2025.02.28/9Ex/test_runner.py | 138 ++++ 2025.02.28/Example/compare.c | 18 + 2025.02.28/Example/compare.h | 9 + 2025.02.28/Example/main.c | 52 ++ 2025.02.28/Example/solve.c | 13 + 2025.02.28/Example/sort.h | 6 + 2025.02.28/Krivoruchenko_SK.zip | Bin 0 -> 11186 bytes 2025.02.28/Linux/Makefile | 15 + 2025.02.28/Linux/a01.c | 66 ++ 2025.02.28/Linux/a02.c | 120 +++ 2025.02.28/Linux/a03.c | 68 ++ 2025.02.28/Linux/a04.c | 68 ++ 2025.02.28/Linux/a05.c | 68 ++ 2025.02.28/Linux/a06.c | 68 ++ 2025.02.28/Linux/a07.c | 68 ++ 2025.02.28/Linux/a08.c | 76 ++ 2025.02.28/Linux/a09.c | 68 ++ 2025.02.28/Linux/array.c | 73 ++ 2025.02.28/Linux/array.h | 15 + 2025.02.28/Linux/io_status.h | 14 + 2025.02.28/Linux/solve.c | 237 ++++++ 2025.02.28/Linux/solve.h | 42 ++ 2025.02.28/Linux/sort.c | 23 + 2025.02.28/Linux/sort.h | 11 + 2025.02.28/Tasks03.pdf | Bin 0 -> 115181 bytes 2025.03.07/Example/array_io.c | 41 ++ 2025.03.07/Example/init_f.c | 22 + 2025.03.07/Example/init_f.h | 9 + 2025.03.07/Example/main.c | 63 ++ 363 files changed, 18214 insertions(+) create mode 100644 2025.02.14/1Ex/Linux/Makefile create mode 100644 2025.02.14/1Ex/Linux/array.c create mode 100644 2025.02.14/1Ex/Linux/array.h create mode 100644 2025.02.14/1Ex/Linux/io_status.h create mode 100644 2025.02.14/1Ex/Linux/main.c create mode 100644 2025.02.14/1Ex/Makefile create mode 100644 2025.02.14/1Ex/array.c create mode 100644 2025.02.14/1Ex/array.h create mode 100644 2025.02.14/1Ex/io_status.h create mode 100644 2025.02.14/1Ex/main.c create mode 100644 2025.02.14/1Ex/o.txt create mode 100644 2025.02.14/1Ex/out.txt create mode 100644 2025.02.14/1Ex/t.txt create mode 100644 2025.02.14/1Ex/Примеры create mode 100644 2025.02.14/2Ex/Linux/Makefile create mode 100644 2025.02.14/2Ex/Linux/array.c create mode 100644 2025.02.14/2Ex/Linux/array.h create mode 100644 2025.02.14/2Ex/Linux/io_status.h create mode 100644 2025.02.14/2Ex/Linux/main.c create mode 100644 2025.02.14/2Ex/Makefile create mode 100644 2025.02.14/2Ex/array.c create mode 100644 2025.02.14/2Ex/array.h create mode 100644 2025.02.14/2Ex/io_status.h create mode 100644 2025.02.14/2Ex/main.c create mode 100644 2025.02.14/2Ex/o.txt create mode 100644 2025.02.14/2Ex/t.txt create mode 100644 2025.02.14/2Ex/Примеры create mode 100644 2025.02.14/3Ex/Linux/Makefile create mode 100644 2025.02.14/3Ex/Linux/array.c create mode 100644 2025.02.14/3Ex/Linux/array.h create mode 100644 2025.02.14/3Ex/Linux/io_status.h create mode 100644 2025.02.14/3Ex/Linux/main.c create mode 100644 2025.02.14/3Ex/Linux/o.txt create mode 100644 2025.02.14/3Ex/Linux/t.txt create mode 100644 2025.02.14/3Ex/Makefile create mode 100644 2025.02.14/3Ex/array.c create mode 100644 2025.02.14/3Ex/array.h create mode 100644 2025.02.14/3Ex/io_status.h create mode 100644 2025.02.14/3Ex/main.c create mode 100644 2025.02.14/3Ex/o.txt create mode 100644 2025.02.14/3Ex/t.txt create mode 100644 2025.02.14/3Ex/Примеры create mode 100644 2025.02.14/4Ex/Makefile create mode 100644 2025.02.14/4Ex/array.c create mode 100644 2025.02.14/4Ex/array.h create mode 100644 2025.02.14/4Ex/io_status.h create mode 100644 2025.02.14/4Ex/main.c create mode 100644 2025.02.14/4Ex/o.txt create mode 100644 2025.02.14/4Ex/t.txt create mode 100644 2025.02.14/4Ex/Примеры create mode 100644 2025.02.14/6Ex/Makefile create mode 100644 2025.02.14/6Ex/array.c create mode 100644 2025.02.14/6Ex/array.h create mode 100644 2025.02.14/6Ex/io_status.h create mode 100644 2025.02.14/6Ex/main.c create mode 100644 2025.02.14/6Ex/o.txt create mode 100644 2025.02.14/6Ex/t.txt create mode 100644 2025.02.14/6Ex/Примеры.txt create mode 100644 2025.02.14/7Ex/Makefile create mode 100644 2025.02.14/7Ex/io_status.h create mode 100644 2025.02.14/7Ex/main.c create mode 100644 2025.02.14/7Ex/o.txt create mode 100644 2025.02.14/7Ex/solve.c create mode 100644 2025.02.14/7Ex/solve.h create mode 100644 2025.02.14/7Ex/t.txt create mode 100644 2025.02.14/7Ex/test_cases.json create mode 100644 2025.02.14/7Ex/test_runner.py create mode 100644 2025.02.14/7Ex/Примеры.txt create mode 100644 2025.02.14/8Ex/Linux.rar create mode 100644 2025.02.14/8Ex/Linux/Makefile create mode 100644 2025.02.14/8Ex/Linux/array.c create mode 100644 2025.02.14/8Ex/Linux/array.h create mode 100644 2025.02.14/8Ex/Linux/io_status.h create mode 100644 2025.02.14/8Ex/Linux/main.c create mode 100644 2025.02.14/8Ex/Linux/t.txt create mode 100644 2025.02.14/8Ex/Makefile create mode 100644 2025.02.14/8Ex/io_status.h create mode 100644 2025.02.14/8Ex/main.c create mode 100644 2025.02.14/8Ex/solve.c create mode 100644 2025.02.14/8Ex/solve.h create mode 100644 2025.02.14/8Ex/t.txt create mode 100644 2025.02.14/8Ex/test_cases.json create mode 100644 2025.02.14/8Ex/test_runner.py create mode 100644 2025.02.14/8Ex/Примеры.txt create mode 100644 2025.02.14/9Ex/Makefile create mode 100644 2025.02.14/9Ex/array.c create mode 100644 2025.02.14/9Ex/array.h create mode 100644 2025.02.14/9Ex/io_status.h create mode 100644 2025.02.14/9Ex/main.c create mode 100644 2025.02.14/9Ex/o.txt create mode 100644 2025.02.14/9Ex/t.txt create mode 100644 2025.02.14/9Ex/Примеры.txt create mode 100644 2025.02.14/Krivoruchenko_SK.zip create mode 100644 2025.02.14/Krivoruchenko_SK/Makefile create mode 100644 2025.02.14/Krivoruchenko_SK/a01.c create mode 100644 2025.02.14/Krivoruchenko_SK/a02.c create mode 100644 2025.02.14/Krivoruchenko_SK/a03.c create mode 100644 2025.02.14/Krivoruchenko_SK/a04.c create mode 100644 2025.02.14/Krivoruchenko_SK/a06.c create mode 100644 2025.02.14/Krivoruchenko_SK/a07.c create mode 100644 2025.02.14/Krivoruchenko_SK/a08.c create mode 100644 2025.02.14/Krivoruchenko_SK/a09.c create mode 100644 2025.02.14/Krivoruchenko_SK/io_status.h create mode 100644 2025.02.14/Krivoruchenko_SK/solve.c create mode 100644 2025.02.14/Krivoruchenko_SK/solve.h create mode 100644 2025.02.14/Linux/Makefile create mode 100644 2025.02.14/Linux/a01.c create mode 100644 2025.02.14/Linux/a02.c create mode 100644 2025.02.14/Linux/a03.c create mode 100644 2025.02.14/Linux/a04.c create mode 100644 2025.02.14/Linux/a06.c create mode 100644 2025.02.14/Linux/a07.c create mode 100644 2025.02.14/Linux/a08.c create mode 100644 2025.02.14/Linux/a09.c create mode 100644 2025.02.14/Linux/io_status.h create mode 100644 2025.02.14/Linux/solve.c create mode 100644 2025.02.14/Linux/solve.h create mode 100644 2025.02.14/Makefile create mode 100644 2025.02.14/Tasks01.pdf create mode 100644 2025.02.14/a01.c create mode 100644 2025.02.14/a02.c create mode 100644 2025.02.14/a03.c create mode 100644 2025.02.14/a04.c create mode 100644 2025.02.14/a06.c create mode 100644 2025.02.14/a07.c create mode 100644 2025.02.14/a08.c create mode 100644 2025.02.14/a09.c create mode 100644 2025.02.14/io_status.h create mode 100644 2025.02.14/solve.c create mode 100644 2025.02.14/solve.h create mode 100644 2025.02.21/1Ex/Makefile create mode 100644 2025.02.21/1Ex/array.c create mode 100644 2025.02.21/1Ex/array.h create mode 100644 2025.02.21/1Ex/io_status.h create mode 100644 2025.02.21/1Ex/main.c create mode 100644 2025.02.21/1Ex/solve.c create mode 100644 2025.02.21/1Ex/solve.h create mode 100644 2025.02.21/1Ex/t.txt create mode 100644 2025.02.21/2Ex/Makefile create mode 100644 2025.02.21/2Ex/array.c create mode 100644 2025.02.21/2Ex/array.h create mode 100644 2025.02.21/2Ex/io_status.h create mode 100644 2025.02.21/2Ex/main.c create mode 100644 2025.02.21/2Ex/solve.c create mode 100644 2025.02.21/2Ex/solve.h create mode 100644 2025.02.21/2Ex/t.txt create mode 100644 2025.02.21/3Ex/Makefile create mode 100644 2025.02.21/3Ex/array.c create mode 100644 2025.02.21/3Ex/array.h create mode 100644 2025.02.21/3Ex/io_status.h create mode 100644 2025.02.21/3Ex/main.c create mode 100644 2025.02.21/3Ex/solve.c create mode 100644 2025.02.21/3Ex/solve.h create mode 100644 2025.02.21/3Ex/t.txt create mode 100644 2025.02.21/4Ex/Makefile create mode 100644 2025.02.21/4Ex/array.c create mode 100644 2025.02.21/4Ex/array.h create mode 100644 2025.02.21/4Ex/io_status.h create mode 100644 2025.02.21/4Ex/main.c create mode 100644 2025.02.21/4Ex/solve.c create mode 100644 2025.02.21/4Ex/solve.h create mode 100644 2025.02.21/4Ex/t.txt create mode 100644 2025.02.21/5Ex/Makefile create mode 100644 2025.02.21/5Ex/array.c create mode 100644 2025.02.21/5Ex/array.h create mode 100644 2025.02.21/5Ex/io_status.h create mode 100644 2025.02.21/5Ex/main.c create mode 100644 2025.02.21/5Ex/solve.c create mode 100644 2025.02.21/5Ex/solve.h create mode 100644 2025.02.21/5Ex/t.txt create mode 100644 2025.02.21/6Ex/Makefile create mode 100644 2025.02.21/6Ex/array.c create mode 100644 2025.02.21/6Ex/array.h create mode 100644 2025.02.21/6Ex/io_status.h create mode 100644 2025.02.21/6Ex/main.c create mode 100644 2025.02.21/6Ex/solve.c create mode 100644 2025.02.21/6Ex/solve.h create mode 100644 2025.02.21/6Ex/t.txt create mode 100644 2025.02.21/7Ex/Makefile create mode 100644 2025.02.21/7Ex/array.c create mode 100644 2025.02.21/7Ex/array.h create mode 100644 2025.02.21/7Ex/io_status.h create mode 100644 2025.02.21/7Ex/main.c create mode 100644 2025.02.21/7Ex/solve.c create mode 100644 2025.02.21/7Ex/solve.h create mode 100644 2025.02.21/7Ex/t.txt create mode 100644 2025.02.21/8Ex/Makefile create mode 100644 2025.02.21/8Ex/array.c create mode 100644 2025.02.21/8Ex/array.h create mode 100644 2025.02.21/8Ex/io_status.h create mode 100644 2025.02.21/8Ex/main.c create mode 100644 2025.02.21/8Ex/solve.c create mode 100644 2025.02.21/8Ex/solve.h create mode 100644 2025.02.21/8Ex/t.txt create mode 100644 2025.02.21/Example/array.c create mode 100644 2025.02.21/Example/io_status.h create mode 100644 2025.02.21/Example/main.c create mode 100644 2025.02.21/Krivoruchenko_SK.zip create mode 100644 2025.02.21/Linux/Makefile create mode 100644 2025.02.21/Linux/a01.c create mode 100644 2025.02.21/Linux/a02.c create mode 100644 2025.02.21/Linux/a03.c create mode 100644 2025.02.21/Linux/a04.c create mode 100644 2025.02.21/Linux/a05.c create mode 100644 2025.02.21/Linux/a06.c create mode 100644 2025.02.21/Linux/a07.c create mode 100644 2025.02.21/Linux/a08.c create mode 100644 2025.02.21/Linux/array.c create mode 100644 2025.02.21/Linux/array.h create mode 100644 2025.02.21/Linux/io_status.h create mode 100644 2025.02.21/Linux/solve.c create mode 100644 2025.02.21/Linux/solve.h create mode 100644 2025.02.21/Makefile create mode 100644 2025.02.21/Tasks02.pdf create mode 100644 2025.02.21/a01.c create mode 100644 2025.02.21/a02.c create mode 100644 2025.02.21/a03.c create mode 100644 2025.02.21/a04.c create mode 100644 2025.02.21/a05.c create mode 100644 2025.02.21/a06.c create mode 100644 2025.02.21/a07.c create mode 100644 2025.02.21/a08.c create mode 100644 2025.02.21/array.c create mode 100644 2025.02.21/array.h create mode 100644 2025.02.21/io_status.h create mode 100644 2025.02.21/solve.c create mode 100644 2025.02.21/solve.h create mode 100644 2025.02.28/1Ex/Makefile create mode 100644 2025.02.28/1Ex/a.txt create mode 100644 2025.02.28/1Ex/array.c create mode 100644 2025.02.28/1Ex/array.h create mode 100644 2025.02.28/1Ex/io_status.h create mode 100644 2025.02.28/1Ex/main.c create mode 100644 2025.02.28/1Ex/solve.c create mode 100644 2025.02.28/1Ex/solve.h create mode 100644 2025.02.28/1Ex/sort.c create mode 100644 2025.02.28/1Ex/sort.h create mode 100644 2025.02.28/2Ex/Makefile create mode 100644 2025.02.28/2Ex/a.txt create mode 100644 2025.02.28/2Ex/array.c create mode 100644 2025.02.28/2Ex/array.h create mode 100644 2025.02.28/2Ex/b.txt create mode 100644 2025.02.28/2Ex/io_status.h create mode 100644 2025.02.28/2Ex/main.c create mode 100644 2025.02.28/2Ex/solve.c create mode 100644 2025.02.28/2Ex/solve.h create mode 100644 2025.02.28/2Ex/sort.c create mode 100644 2025.02.28/2Ex/sort.h create mode 100644 2025.02.28/2Ex/test_cases.json create mode 100644 2025.02.28/2Ex/test_runner.py create mode 100644 2025.02.28/3Ex/Makefile create mode 100644 2025.02.28/3Ex/a.txt create mode 100644 2025.02.28/3Ex/array.c create mode 100644 2025.02.28/3Ex/array.h create mode 100644 2025.02.28/3Ex/io_status.h create mode 100644 2025.02.28/3Ex/main.c create mode 100644 2025.02.28/3Ex/solve.c create mode 100644 2025.02.28/3Ex/solve.h create mode 100644 2025.02.28/3Ex/sort.c create mode 100644 2025.02.28/3Ex/sort.h create mode 100644 2025.02.28/3Ex/test_cases.json create mode 100644 2025.02.28/3Ex/test_runner.py create mode 100644 2025.02.28/4Ex/Makefile create mode 100644 2025.02.28/4Ex/a.txt create mode 100644 2025.02.28/4Ex/array.c create mode 100644 2025.02.28/4Ex/array.h create mode 100644 2025.02.28/4Ex/io_status.h create mode 100644 2025.02.28/4Ex/main.c create mode 100644 2025.02.28/4Ex/solve.c create mode 100644 2025.02.28/4Ex/solve.h create mode 100644 2025.02.28/4Ex/sort.c create mode 100644 2025.02.28/4Ex/sort.h create mode 100644 2025.02.28/4Ex/test_cases.json create mode 100644 2025.02.28/4Ex/test_runner.py create mode 100644 2025.02.28/5Ex/Makefile create mode 100644 2025.02.28/5Ex/a.txt create mode 100644 2025.02.28/5Ex/array.c create mode 100644 2025.02.28/5Ex/array.h create mode 100644 2025.02.28/5Ex/io_status.h create mode 100644 2025.02.28/5Ex/main.c create mode 100644 2025.02.28/5Ex/solve.c create mode 100644 2025.02.28/5Ex/solve.h create mode 100644 2025.02.28/5Ex/sort.c create mode 100644 2025.02.28/5Ex/sort.h create mode 100644 2025.02.28/5Ex/test_cases.json create mode 100644 2025.02.28/5Ex/test_runner.py create mode 100644 2025.02.28/6Ex/Makefile create mode 100644 2025.02.28/6Ex/a.txt create mode 100644 2025.02.28/6Ex/array.c create mode 100644 2025.02.28/6Ex/array.h create mode 100644 2025.02.28/6Ex/io_status.h create mode 100644 2025.02.28/6Ex/main.c create mode 100644 2025.02.28/6Ex/solve.c create mode 100644 2025.02.28/6Ex/solve.h create mode 100644 2025.02.28/6Ex/sort.c create mode 100644 2025.02.28/6Ex/sort.h create mode 100644 2025.02.28/6Ex/test_cases.json create mode 100644 2025.02.28/6Ex/test_runner.py create mode 100644 2025.02.28/7Ex/Makefile create mode 100644 2025.02.28/7Ex/a.txt create mode 100644 2025.02.28/7Ex/array.c create mode 100644 2025.02.28/7Ex/array.h create mode 100644 2025.02.28/7Ex/io_status.h create mode 100644 2025.02.28/7Ex/main.c create mode 100644 2025.02.28/7Ex/solve.c create mode 100644 2025.02.28/7Ex/solve.h create mode 100644 2025.02.28/7Ex/sort.c create mode 100644 2025.02.28/7Ex/sort.h create mode 100644 2025.02.28/7Ex/test_cases.json create mode 100644 2025.02.28/7Ex/test_runner.py create mode 100644 2025.02.28/8Ex/' create mode 100644 2025.02.28/8Ex/Makefile create mode 100644 2025.02.28/8Ex/a.txt create mode 100644 2025.02.28/8Ex/array.c create mode 100644 2025.02.28/8Ex/array.h create mode 100644 2025.02.28/8Ex/io_status.h create mode 100644 2025.02.28/8Ex/main.c create mode 100644 2025.02.28/8Ex/solve.c create mode 100644 2025.02.28/8Ex/solve.h create mode 100644 2025.02.28/8Ex/sort.c create mode 100644 2025.02.28/8Ex/sort.h create mode 100644 2025.02.28/8Ex/test_cases.json create mode 100644 2025.02.28/8Ex/test_runner.py create mode 100644 2025.02.28/9Ex/Makefile create mode 100644 2025.02.28/9Ex/a.txt create mode 100644 2025.02.28/9Ex/array.c create mode 100644 2025.02.28/9Ex/array.h create mode 100644 2025.02.28/9Ex/io_status.h create mode 100644 2025.02.28/9Ex/main.c create mode 100644 2025.02.28/9Ex/solve.c create mode 100644 2025.02.28/9Ex/solve.h create mode 100644 2025.02.28/9Ex/sort.c create mode 100644 2025.02.28/9Ex/sort.h create mode 100644 2025.02.28/9Ex/test_cases.json create mode 100644 2025.02.28/9Ex/test_runner.py create mode 100644 2025.02.28/Example/compare.c create mode 100644 2025.02.28/Example/compare.h create mode 100644 2025.02.28/Example/main.c create mode 100644 2025.02.28/Example/solve.c create mode 100644 2025.02.28/Example/sort.h create mode 100644 2025.02.28/Krivoruchenko_SK.zip create mode 100644 2025.02.28/Linux/Makefile create mode 100644 2025.02.28/Linux/a01.c create mode 100644 2025.02.28/Linux/a02.c create mode 100644 2025.02.28/Linux/a03.c create mode 100644 2025.02.28/Linux/a04.c create mode 100644 2025.02.28/Linux/a05.c create mode 100644 2025.02.28/Linux/a06.c create mode 100644 2025.02.28/Linux/a07.c create mode 100644 2025.02.28/Linux/a08.c create mode 100644 2025.02.28/Linux/a09.c create mode 100644 2025.02.28/Linux/array.c create mode 100644 2025.02.28/Linux/array.h create mode 100644 2025.02.28/Linux/io_status.h create mode 100644 2025.02.28/Linux/solve.c create mode 100644 2025.02.28/Linux/solve.h create mode 100644 2025.02.28/Linux/sort.c create mode 100644 2025.02.28/Linux/sort.h create mode 100644 2025.02.28/Tasks03.pdf create mode 100644 2025.03.07/Example/array_io.c create mode 100644 2025.03.07/Example/init_f.c create mode 100644 2025.03.07/Example/init_f.h create mode 100644 2025.03.07/Example/main.c diff --git a/2025.02.14/1Ex/Linux/Makefile b/2025.02.14/1Ex/Linux/Makefile new file mode 100644 index 0000000..9393cd7 --- /dev/null +++ b/2025.02.14/1Ex/Linux/Makefile @@ -0,0 +1,8 @@ +all: main.o array.o + gcc main.o array.o -o a01.out && rm *.o + +main.o: main.c + gcc -c main.c + +array.o: array.c + gcc -c array.c diff --git a/2025.02.14/1Ex/Linux/array.c b/2025.02.14/1Ex/Linux/array.c new file mode 100644 index 0000000..da14f78 --- /dev/null +++ b/2025.02.14/1Ex/Linux/array.c @@ -0,0 +1,71 @@ +#include "array.h" + + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s) { + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) { + if (s[i] == '\\') { + if (i + 1 == len_s) return ERROR_PATTERN; + else { + s1[j] = 0; + s2[j++] = s[++i]; + } + } else if ((s[i] == '^') && (i == 0)) { + s1[j] = '1'; + s2[j++] = s[++i]; + } else { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r) { + FILE * fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE * fw = fopen(f_out, "w"); + int i; + + if (!fw) {fclose(fp); return ERROR_OPEN;} + for (i = 0; fgets(buf, sizeof(buf), fp);) { + size_t len_buf = strlen(buf); + bool is_approach = process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + } + + return SUCCESS; +} + +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf) { + if (len_buf < len_s) return false; + + if (s1[0] == '1') { + size_t i; + for (i = 0; i < len_s; ++i) { + if (buf[i] != s2[i]) return false; + } + } else { + char * s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + diff --git a/2025.02.14/1Ex/Linux/array.h b/2025.02.14/1Ex/Linux/array.h new file mode 100644 index 0000000..cb541d1 --- /dev/null +++ b/2025.02.14/1Ex/Linux/array.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/1Ex/Linux/io_status.h b/2025.02.14/1Ex/Linux/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/1Ex/Linux/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/1Ex/Linux/main.c b/2025.02.14/1Ex/Linux/main.c new file mode 100644 index 0000000..ba51a51 --- /dev/null +++ b/2025.02.14/1Ex/Linux/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 1; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task1(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/1Ex/Makefile b/2025.02.14/1Ex/Makefile new file mode 100644 index 0000000..669b997 --- /dev/null +++ b/2025.02.14/1Ex/Makefile @@ -0,0 +1,38 @@ +CFLAGS = -mfpmath=sse \ + -fstack-protector-all \ + -W \ + -Wall \ + -Wextra \ + -Wunused \ + -Wcast-align \ + -Werror \ + -pedantic \ + -pedantic-errors \ + -Wfloat-equal \ + -Wpointer-arith \ + -Wformat-security \ + -Wmissing-format-attribute \ + -Wformat=1 \ + -Wwrite-strings \ + -Wcast-align \ + -Wno-long-long \ + -std=gnu99 \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -Wmissing-declarations \ + -Wold-style-definition \ + -Wdeclaration-after-statement \ + -Wbad-function-cast \ + -Wnested-externs \ + -O3 \ + -D_DEBUG -g \ + -c + +all: main.o array.o + gcc main.o array.o -lssp && del *.o + +main.o: main.c + gcc $(CFLAGS) main.c + +array.o: array.c + gcc $(CFLAGS) array.c diff --git a/2025.02.14/1Ex/array.c b/2025.02.14/1Ex/array.c new file mode 100644 index 0000000..7159e2b --- /dev/null +++ b/2025.02.14/1Ex/array.c @@ -0,0 +1,74 @@ +#include "array.h" + + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s) { + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) { + if (s[i] == '\\') { + if (i + 1 == len_s) return ERROR_PATTERN; + else { + s1[j] = 0; + s2[j++] = s[++i]; + } + } else if ((s[i] == '^') && (i == 0)) { + s1[j] = '1'; + s2[j++] = s[++i]; + } else { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r) { + FILE * fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE * fw = fopen(f_out, "w"); + int i; + + if (!fw) {fclose(fp); return ERROR_OPEN;} + for (i = 0; fgets(buf, sizeof(buf), fp);) { + size_t len_buf = strlen(buf); + bool is_approach = process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf) { + if (len_buf < len_s) return false; + + if (s1[0] == '1') { + size_t i; + for (i = 0; i < len_s; ++i) { + if (buf[i] != s2[i]) return false; + } + } else { + char * s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + diff --git a/2025.02.14/1Ex/array.h b/2025.02.14/1Ex/array.h new file mode 100644 index 0000000..cb541d1 --- /dev/null +++ b/2025.02.14/1Ex/array.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/1Ex/io_status.h b/2025.02.14/1Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/1Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/1Ex/main.c b/2025.02.14/1Ex/main.c new file mode 100644 index 0000000..ba51a51 --- /dev/null +++ b/2025.02.14/1Ex/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 1; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task1(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/1Ex/o.txt b/2025.02.14/1Ex/o.txt new file mode 100644 index 0000000..38cc797 --- /dev/null +++ b/2025.02.14/1Ex/o.txt @@ -0,0 +1,14 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +.abs +abs +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss diff --git a/2025.02.14/1Ex/out.txt b/2025.02.14/1Ex/out.txt new file mode 100644 index 0000000..721387c --- /dev/null +++ b/2025.02.14/1Ex/out.txt @@ -0,0 +1 @@ +a^bs haha diff --git a/2025.02.14/1Ex/t.txt b/2025.02.14/1Ex/t.txt new file mode 100644 index 0000000..a2c71b8 --- /dev/null +++ b/2025.02.14/1Ex/t.txt @@ -0,0 +1,23 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss + + diff --git a/2025.02.14/1Ex/Примеры b/2025.02.14/1Ex/Примеры new file mode 100644 index 0000000..d2ed666 --- /dev/null +++ b/2025.02.14/1Ex/Примеры @@ -0,0 +1,13 @@ +Проверка на s: +- в конце есть \ +abs\ + +- в конце есть \\ +abs\\ + +- в начале есть ^ +^abs + +- в начале есть \^ + +- Есть \ и ^ diff --git a/2025.02.14/2Ex/Linux/Makefile b/2025.02.14/2Ex/Linux/Makefile new file mode 100644 index 0000000..882c677 --- /dev/null +++ b/2025.02.14/2Ex/Linux/Makefile @@ -0,0 +1,8 @@ +all: main.o array.o + gcc main.o array.o -o a02.out && rm *.o + +main.o: main.c + gcc -c main.c + +array.o: array.c + gcc -c array.c diff --git a/2025.02.14/2Ex/Linux/array.c b/2025.02.14/2Ex/Linux/array.c new file mode 100644 index 0000000..175cb8f --- /dev/null +++ b/2025.02.14/2Ex/Linux/array.c @@ -0,0 +1,75 @@ +#include "array.h" + + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s) { + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) { + if (s[i] == '\\') { + if (i + 1 == len_s) return ERROR_PATTERN; + else { + s1[j] = 0; + s2[j++] = s[++i]; + } + } else if ((s[i] == '$') && (i + 1 == len_s)) { + if (j != 0) + { + s1[j-1] = '1'; + } + } else { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r) { + FILE * fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE * fw = fopen(f_out, "w"); + int i; + + if (!fw) {fclose(fp); return ERROR_OPEN;} + for (i = 0; fgets(buf, sizeof(buf), fp);) { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf-1] == '\n') buf[--len_buf] = '\0'; + is_approach = process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + } + + return SUCCESS; +} + +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf) { + if (len_buf < len_s) return false; + + if (s1[len_s - 1] == '1') { + size_t i; + for (i = len_buf-1; i > len_buf-len_s-1; --i) { + if (buf[i] != s2[i-(len_buf-len_s)]) return false; + } + } else { + char * s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + diff --git a/2025.02.14/2Ex/Linux/array.h b/2025.02.14/2Ex/Linux/array.h new file mode 100644 index 0000000..cb541d1 --- /dev/null +++ b/2025.02.14/2Ex/Linux/array.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/2Ex/Linux/io_status.h b/2025.02.14/2Ex/Linux/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/2Ex/Linux/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/2Ex/Linux/main.c b/2025.02.14/2Ex/Linux/main.c new file mode 100644 index 0000000..ba51a51 --- /dev/null +++ b/2025.02.14/2Ex/Linux/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 1; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task1(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/2Ex/Makefile b/2025.02.14/2Ex/Makefile new file mode 100644 index 0000000..669b997 --- /dev/null +++ b/2025.02.14/2Ex/Makefile @@ -0,0 +1,38 @@ +CFLAGS = -mfpmath=sse \ + -fstack-protector-all \ + -W \ + -Wall \ + -Wextra \ + -Wunused \ + -Wcast-align \ + -Werror \ + -pedantic \ + -pedantic-errors \ + -Wfloat-equal \ + -Wpointer-arith \ + -Wformat-security \ + -Wmissing-format-attribute \ + -Wformat=1 \ + -Wwrite-strings \ + -Wcast-align \ + -Wno-long-long \ + -std=gnu99 \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -Wmissing-declarations \ + -Wold-style-definition \ + -Wdeclaration-after-statement \ + -Wbad-function-cast \ + -Wnested-externs \ + -O3 \ + -D_DEBUG -g \ + -c + +all: main.o array.o + gcc main.o array.o -lssp && del *.o + +main.o: main.c + gcc $(CFLAGS) main.c + +array.o: array.c + gcc $(CFLAGS) array.c diff --git a/2025.02.14/2Ex/array.c b/2025.02.14/2Ex/array.c new file mode 100644 index 0000000..3171842 --- /dev/null +++ b/2025.02.14/2Ex/array.c @@ -0,0 +1,78 @@ +#include "array.h" + + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s) { + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) { + if (s[i] == '\\') { + if (i + 1 == len_s) return ERROR_PATTERN; + else { + s1[j] = 0; + s2[j++] = s[++i]; + } + } else if ((s[i] == '$') && (i + 1 == len_s)) { + if (j != 0) + { + s1[j-1] = '1'; + } + } else { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r) { + FILE * fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE * fw = fopen(f_out, "w"); + int i; + + if (!fw) {fclose(fp); return ERROR_OPEN;} + for (i = 0; fgets(buf, sizeof(buf), fp);) { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf-1] == '\n') buf[--len_buf] = '\0'; + is_approach = process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf) { + if (len_buf < len_s) return false; + + if (s1[len_s - 1] == '1') { + size_t i; + for (i = len_buf-1; i > len_buf-len_s-1; --i) { + if (buf[i] != s2[i-(len_buf-len_s)]) return false; + } + } else { + char * s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + diff --git a/2025.02.14/2Ex/array.h b/2025.02.14/2Ex/array.h new file mode 100644 index 0000000..cb541d1 --- /dev/null +++ b/2025.02.14/2Ex/array.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/2Ex/io_status.h b/2025.02.14/2Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/2Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/2Ex/main.c b/2025.02.14/2Ex/main.c new file mode 100644 index 0000000..8ab4024 --- /dev/null +++ b/2025.02.14/2Ex/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 2; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task2(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/2Ex/o.txt b/2025.02.14/2Ex/o.txt new file mode 100644 index 0000000..38cc797 --- /dev/null +++ b/2025.02.14/2Ex/o.txt @@ -0,0 +1,14 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +.abs +abs +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss diff --git a/2025.02.14/2Ex/t.txt b/2025.02.14/2Ex/t.txt new file mode 100644 index 0000000..a2c71b8 --- /dev/null +++ b/2025.02.14/2Ex/t.txt @@ -0,0 +1,23 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss + + diff --git a/2025.02.14/2Ex/Примеры b/2025.02.14/2Ex/Примеры new file mode 100644 index 0000000..456bbc4 --- /dev/null +++ b/2025.02.14/2Ex/Примеры @@ -0,0 +1,21 @@ +Проверка на s: +- в конце есть \ +abs\ + +- в конце есть \\ +abs\\ + +- в конце есть $ +abs$ + +- в конце есть \$ +abs\$ + +- Есть \ и $ +\\abs\s\$\hello + +- в строке один $ +$ + +- дефолт +abs diff --git a/2025.02.14/3Ex/Linux/Makefile b/2025.02.14/3Ex/Linux/Makefile new file mode 100644 index 0000000..9cf7460 --- /dev/null +++ b/2025.02.14/3Ex/Linux/Makefile @@ -0,0 +1,8 @@ +all: main.o array.o + gcc main.o array.o -o "a03.out" && rm *.o + +main.o: main.c + gcc -c main.c + +array.o: array.c + gcc -c array.c diff --git a/2025.02.14/3Ex/Linux/array.c b/2025.02.14/3Ex/Linux/array.c new file mode 100644 index 0000000..c0e9613 --- /dev/null +++ b/2025.02.14/3Ex/Linux/array.c @@ -0,0 +1,125 @@ +#include "array.h" + + +io_status process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == 0) && (s[i + 1] == '<')) + { + s1[j] = '1'; + s2[j++] = s[i += 2]; + } + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + } + + return SUCCESS; +} + +bool process_string(const char* buf, const char* s1, const char* s2, const char* t, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[0] == '1') + { + size_t i, last_space = -1, per_sim = 0; // Percent of similarity + for (i = 0; i < len_buf; ++i) + { + if (is_space(buf[i], t)) + { + last_space = i; + per_sim = 0; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space + 1) || (per_sim)) + { + if (++per_sim == len_s) + { + return true; + } + } + } + else + { + per_sim = 0; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +bool is_space(char symbol, const char* t) +{ + int i; + for (i = 0; t[i] != '\0'; ++i) + { + if (t[i] == symbol) return true; + } + + return false; +} diff --git a/2025.02.14/3Ex/Linux/array.h b/2025.02.14/3Ex/Linux/array.h new file mode 100644 index 0000000..83a6939 --- /dev/null +++ b/2025.02.14/3Ex/Linux/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, const char * t, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const char * t, const size_t len_s, const size_t len_buf); +bool is_space(char symbol, const char * t); + +#endif diff --git a/2025.02.14/3Ex/Linux/io_status.h b/2025.02.14/3Ex/Linux/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/3Ex/Linux/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/3Ex/Linux/main.c b/2025.02.14/3Ex/Linux/main.c new file mode 100644 index 0000000..5c001c2 --- /dev/null +++ b/2025.02.14/3Ex/Linux/main.c @@ -0,0 +1,69 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t, int* res); + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, t, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 3; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + const char* spaces = 0; + int res = 0; + double t; + if (argc != 5) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + spaces = argv[4]; + t = clock(); + ret = task3(f_in, f_out, s, spaces, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/3Ex/Linux/o.txt b/2025.02.14/3Ex/Linux/o.txt new file mode 100644 index 0000000..93d631d --- /dev/null +++ b/2025.02.14/3Ex/Linux/o.txt @@ -0,0 +1,2 @@ +sasobsomcsome +hsome diff --git a/2025.02.14/3Ex/Linux/t.txt b/2025.02.14/3Ex/Linux/t.txt new file mode 100644 index 0000000..7eeb5e8 --- /dev/null +++ b/2025.02.14/3Ex/Linux/t.txt @@ -0,0 +1,2 @@ +sasobsomcsome +hsome \ No newline at end of file diff --git a/2025.02.14/3Ex/Makefile b/2025.02.14/3Ex/Makefile new file mode 100644 index 0000000..669b997 --- /dev/null +++ b/2025.02.14/3Ex/Makefile @@ -0,0 +1,38 @@ +CFLAGS = -mfpmath=sse \ + -fstack-protector-all \ + -W \ + -Wall \ + -Wextra \ + -Wunused \ + -Wcast-align \ + -Werror \ + -pedantic \ + -pedantic-errors \ + -Wfloat-equal \ + -Wpointer-arith \ + -Wformat-security \ + -Wmissing-format-attribute \ + -Wformat=1 \ + -Wwrite-strings \ + -Wcast-align \ + -Wno-long-long \ + -std=gnu99 \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -Wmissing-declarations \ + -Wold-style-definition \ + -Wdeclaration-after-statement \ + -Wbad-function-cast \ + -Wnested-externs \ + -O3 \ + -D_DEBUG -g \ + -c + +all: main.o array.o + gcc main.o array.o -lssp && del *.o + +main.o: main.c + gcc $(CFLAGS) main.c + +array.o: array.c + gcc $(CFLAGS) array.c diff --git a/2025.02.14/3Ex/array.c b/2025.02.14/3Ex/array.c new file mode 100644 index 0000000..2a15eff --- /dev/null +++ b/2025.02.14/3Ex/array.c @@ -0,0 +1,128 @@ +#include "array.h" + + +io_status process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == 0) && (s[i + 1] == '<')) + { + s1[j] = '1'; + i++; + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + if ((len_buf > 0) && (buf[len_buf - 1] == '\n')) buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool process_string(const char* buf, const char* s1, const char* s2, const char* t, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[0] == '1') + { + int last_space = -1, i; + size_t per_sim = 0; // Percent of similarity + for (i = 0; i < (int)len_buf; ++i) + { + if (is_space(buf[i], t)) + { + last_space = i; + per_sim = 0; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space + 1) || (per_sim)) + { + if (++per_sim == len_s) + { + return true; + } + } + } + else + { + per_sim = 0; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +bool is_space(char symbol, const char* t) +{ + int i; + for (i = 0; t[i] != '\0'; ++i) + { + if (t[i] == symbol) return true; + } + + return false; +} diff --git a/2025.02.14/3Ex/array.h b/2025.02.14/3Ex/array.h new file mode 100644 index 0000000..83a6939 --- /dev/null +++ b/2025.02.14/3Ex/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, const char * t, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const char * t, const size_t len_s, const size_t len_buf); +bool is_space(char symbol, const char * t); + +#endif diff --git a/2025.02.14/3Ex/io_status.h b/2025.02.14/3Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/3Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/3Ex/main.c b/2025.02.14/3Ex/main.c new file mode 100644 index 0000000..5c001c2 --- /dev/null +++ b/2025.02.14/3Ex/main.c @@ -0,0 +1,69 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t, int* res); + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, t, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 3; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + const char* spaces = 0; + int res = 0; + double t; + if (argc != 5) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + spaces = argv[4]; + t = clock(); + ret = task3(f_in, f_out, s, spaces, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/3Ex/o.txt b/2025.02.14/3Ex/o.txt new file mode 100644 index 0000000..22ea93c --- /dev/null +++ b/2025.02.14/3Ex/o.txt @@ -0,0 +1,4 @@ +somePalongPway +some +howPsomePitPbe +howPsomething diff --git a/2025.02.14/3Ex/t.txt b/2025.02.14/3Ex/t.txt new file mode 100644 index 0000000..6f50c61 --- /dev/null +++ b/2025.02.14/3Ex/t.txt @@ -0,0 +1,28 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss +abs* +somePalongPway +some +howPsomePitPbe +howPsomething +whyPanysome + diff --git a/2025.02.14/3Ex/Примеры b/2025.02.14/3Ex/Примеры new file mode 100644 index 0000000..42780d8 --- /dev/null +++ b/2025.02.14/3Ex/Примеры @@ -0,0 +1,12 @@ +Дефолт: Проверить что находит по паттерну: +{ + "pattern": "some", + "text": "some text" +} + +Проверка работы \<: +{ + "pattern": "\')) + { + if (j > 0) + { + s1[j++-1] = '1'; + } else + { + s1[j++] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool process_string(const char* buf, const char* s1, const char* s2, const char* t, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[len_s - 1] == '1') + { + size_t i, last_space = len_buf, per_sim = len_s - 1; // Percent of similarity + for (i = len_buf - 1; i < i + 2; --i) // i < i + 2 - size_t всегда положительный -> закончится когда случится переход от -1 к -2, а они сильно больше 0 + { + if (is_space(buf[i], t)) + { + last_space = i; + per_sim = len_s - 1; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space - 1) || ((per_sim + 1) < len_s)) + { + if (per_sim-- == 0) + { + return true; + } + } + } + else + { + per_sim = len_s - 1; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +bool is_space(char symbol, const char* t) +{ + int i; + for (i = 0; t[i] != '\0'; ++i) + { + if (t[i] == symbol) return true; + } + + return false; +} diff --git a/2025.02.14/4Ex/array.h b/2025.02.14/4Ex/array.h new file mode 100644 index 0000000..83a6939 --- /dev/null +++ b/2025.02.14/4Ex/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char * f_in, const char * f_out, const char * s1, const char * s2, const char * t, int * r); +bool process_string(const char * buf, const char * s1, const char * s2, const char * t, const size_t len_s, const size_t len_buf); +bool is_space(char symbol, const char * t); + +#endif diff --git a/2025.02.14/4Ex/io_status.h b/2025.02.14/4Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/4Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/4Ex/main.c b/2025.02.14/4Ex/main.c new file mode 100644 index 0000000..66decac --- /dev/null +++ b/2025.02.14/4Ex/main.c @@ -0,0 +1,69 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t, int* res); + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, t, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 4; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + const char* spaces = 0; + int res = 0; + double t; + if (argc != 5) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + spaces = argv[4]; + t = clock(); + ret = task4(f_in, f_out, s, spaces, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/4Ex/o.txt b/2025.02.14/4Ex/o.txt new file mode 100644 index 0000000..e69de29 diff --git a/2025.02.14/4Ex/t.txt b/2025.02.14/4Ex/t.txt new file mode 100644 index 0000000..a2c71b8 --- /dev/null +++ b/2025.02.14/4Ex/t.txt @@ -0,0 +1,23 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss + + diff --git a/2025.02.14/4Ex/Примеры b/2025.02.14/4Ex/Примеры new file mode 100644 index 0000000..b7e098b --- /dev/null +++ b/2025.02.14/4Ex/Примеры @@ -0,0 +1,12 @@ +Дефолт: Проверить что находит по паттерну: +{ + "pattern": "some", + "text": "some text" +} + +Проверка работы \>: +{ + "pattern": "some\>", + "spaces": "abc" + "text": "sasobsomcsome" +} \ No newline at end of file diff --git a/2025.02.14/6Ex/Makefile b/2025.02.14/6Ex/Makefile new file mode 100644 index 0000000..669b997 --- /dev/null +++ b/2025.02.14/6Ex/Makefile @@ -0,0 +1,38 @@ +CFLAGS = -mfpmath=sse \ + -fstack-protector-all \ + -W \ + -Wall \ + -Wextra \ + -Wunused \ + -Wcast-align \ + -Werror \ + -pedantic \ + -pedantic-errors \ + -Wfloat-equal \ + -Wpointer-arith \ + -Wformat-security \ + -Wmissing-format-attribute \ + -Wformat=1 \ + -Wwrite-strings \ + -Wcast-align \ + -Wno-long-long \ + -std=gnu99 \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -Wmissing-declarations \ + -Wold-style-definition \ + -Wdeclaration-after-statement \ + -Wbad-function-cast \ + -Wnested-externs \ + -O3 \ + -D_DEBUG -g \ + -c + +all: main.o array.o + gcc main.o array.o -lssp && del *.o + +main.o: main.c + gcc $(CFLAGS) main.c + +array.o: array.c + gcc $(CFLAGS) array.c diff --git a/2025.02.14/6Ex/array.c b/2025.02.14/6Ex/array.c new file mode 100644 index 0000000..ae39ce1 --- /dev/null +++ b/2025.02.14/6Ex/array.c @@ -0,0 +1,95 @@ +#include "array.h" + + +io_status process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if (s[i] == '.') + { + s1[j] = '1'; + s2[j++] = '.'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + if (s1[0] == '1' || buf[0] == s2[0]) + { + int j; + for (j = 1; j < (int)len_s; ++j) + { + if ((buf[j] != s2[j]) && (s1[j] == '0')) + { + break; + } + } + + if (j == (int)len_s && j == (int)len_buf) return true; + } + + return false; +} diff --git a/2025.02.14/6Ex/array.h b/2025.02.14/6Ex/array.h new file mode 100644 index 0000000..f4e19fe --- /dev/null +++ b/2025.02.14/6Ex/array.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r); +bool process_string(const char * buf, const char * s1, const char * s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/6Ex/io_status.h b/2025.02.14/6Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/6Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/6Ex/main.c b/2025.02.14/6Ex/main.c new file mode 100644 index 0000000..5a4bce3 --- /dev/null +++ b/2025.02.14/6Ex/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 6; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task6(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/6Ex/o.txt b/2025.02.14/6Ex/o.txt new file mode 100644 index 0000000..38cc797 --- /dev/null +++ b/2025.02.14/6Ex/o.txt @@ -0,0 +1,14 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +.abs +abs +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss diff --git a/2025.02.14/6Ex/t.txt b/2025.02.14/6Ex/t.txt new file mode 100644 index 0000000..a2c71b8 --- /dev/null +++ b/2025.02.14/6Ex/t.txt @@ -0,0 +1,23 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss + + diff --git a/2025.02.14/6Ex/Примеры.txt b/2025.02.14/6Ex/Примеры.txt new file mode 100644 index 0000000..a1bbee7 --- /dev/null +++ b/2025.02.14/6Ex/Примеры.txt @@ -0,0 +1,23 @@ +Дефолт: +{ + 's': 'some' + 'a': 'some\nhellosome\nsomeone' +} + +\ в конце: +{ + 's': 'some\\\' - ERROR + 'a': 'not important' +} + +замена \some на some: +{ + 's': '\.wh\at' + 'a': '.what' +} + +Проверка шаблона: +{ + 's': 's.m.' + 'a': 'some\nsone\nsumy\n.o.e\nsm' +} \ No newline at end of file diff --git a/2025.02.14/7Ex/Makefile b/2025.02.14/7Ex/Makefile new file mode 100644 index 0000000..75cb2c0 --- /dev/null +++ b/2025.02.14/7Ex/Makefile @@ -0,0 +1,13 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a07.exe: main.o solve.o + gcc main.o solve.o -o a07.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +clean: + del *.o *.exe \ No newline at end of file diff --git a/2025.02.14/7Ex/io_status.h b/2025.02.14/7Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/7Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/7Ex/main.c b/2025.02.14/7Ex/main.c new file mode 100644 index 0000000..4871e06 --- /dev/null +++ b/2025.02.14/7Ex/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = t7_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return t7_process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 7; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task7(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/7Ex/o.txt b/2025.02.14/7Ex/o.txt new file mode 100644 index 0000000..e69de29 diff --git a/2025.02.14/7Ex/solve.c b/2025.02.14/7Ex/solve.c new file mode 100644 index 0000000..4babb30 --- /dev/null +++ b/2025.02.14/7Ex/solve.c @@ -0,0 +1,96 @@ +#include "solve.h" + + +io_status t7_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '?') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t7_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = t7_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t7_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + bool is_approach = false; + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + + if (s1[0] == '1') + { + is_approach = t7_start(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + if (is_approach) return true; + } + if (len_buf != 0 && buf[0] == s2[0]) + { + is_approach = t7_start(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + if (is_approach) return true; + } + + + return false; +} diff --git a/2025.02.14/7Ex/solve.h b/2025.02.14/7Ex/solve.h new file mode 100644 index 0000000..e3d0479 --- /dev/null +++ b/2025.02.14/7Ex/solve.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status t7_process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status t7_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r); +bool t7_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/7Ex/t.txt b/2025.02.14/7Ex/t.txt new file mode 100644 index 0000000..2e65efe --- /dev/null +++ b/2025.02.14/7Ex/t.txt @@ -0,0 +1 @@ +a \ No newline at end of file diff --git a/2025.02.14/7Ex/test_cases.json b/2025.02.14/7Ex/test_cases.json new file mode 100644 index 0000000..40c64d7 --- /dev/null +++ b/2025.02.14/7Ex/test_cases.json @@ -0,0 +1,222 @@ +{ + "exe": "a07.exe", + "f_in": "input.txt", + "f_out": "output.txt", + "tests": [ + { + "s": "some", + "text": "some\nnotsome\nrandom", + "expected": "some\n" + }, + { + "s": "so?me", + "text": "some\nsme\nslome\nI'm sometimes", + "expected": "some\nsme\n" + }, + { + "s": "s\\ome\\\\", + "text": "some\\", + "expected": "some\\\n" + }, + { + "s": "some\\\\\\", + "text": "some\\", + "expected": "fall" + }, + { + "s": "?oho", + "text": "?oho\noho", + "expected": "?oho\n" + }, + { + "s": "a?", + "text": "\naha\na\na?\na????", + "expected": "\na\n" + }, + { + "s": "abs", + "text": "abs\n\\abs\nabsababa\nahahabs\nahahahabsahhaha\n^abs\nahahahabs$jajaja\nha\\abss$hello what!\npbs\nubs\n.abs\nabs\npbt\natn.b.\nbs\nbsaha\n?abs\naaaaaaaaaaaaabs\n+abs+\nabsssssss\n\n", + "expected": "abs\nabs\n" + }, + { + "s": "a??????", + "text": "a\naaa\n\n", + "expected": "a\n\n" + }, + { + "s": "a\\????", + "text": "a\naaa\na?\na??", + "expected": "a\na?\n" + }, + { + "s": "s\\ome\\\\", + "text": "some\\\nsome\ns\\ome\\\\\ns\\ome\\\nsome\\", + "expected": "some\\\nsome\\\n" + }, + { + "s": "some\\\\\\", + "text": "some\\", + "expected": "fall" + }, + { + "s": "ab????c", + "text": "abc\nac\nabbc\nab?c\nab???c\n", + "expected": "abc\nac\n" + }, + { + "s": "\\?some", + "text": "?some\n\\?some\n?someother\n?som\n", + "expected": "?some\n" + }, + { + "s": "", + "text": "hello\n\n\nabc", + "expected": "\n\n" + }, + { + "s": "te\\?st", + "text": "te?st\nte\\?st\nte\\st\ntest", + "expected": "te?st\n" + }, + { + "s": "hello?", + "text": "hello", + "expected": "hello\n" + }, + { + "s": "hello?", + "text": "hell", + "expected": "hell\n" + }, + { + "s": "hello?", + "text": "helloo", + "expected": "" + }, + { + "s": "he?llo", + "text": "hllo", + "expected": "hllo\n" + }, + { + "s": "he?llo", + "text": "hello", + "expected": "hello\n" + }, + { + "s": "he?llo", + "text": "heeello", + "expected": "" + }, + { + "s": "abc???", + "text": "abc", + "expected": "abc\n" + }, + { + "s": "abc???", + "text": "ab", + "expected": "ab\n" + }, + { + "s": "abc???", + "text": "abcd", + "expected": "" + }, + { + "s": "?abc", + "text": "abc", + "expected": "" + }, + { + "s": "?abc", + "text": "?abc", + "expected": "?abc\n" + }, + { + "s": "abc\\?", + "text": "abc?", + "expected": "abc?\n" + }, + { + "s": "abc\\?", + "text": "abc", + "expected": "" + }, + { + "s": "ab??c", + "text": "ac", + "expected": "ac\n" + }, + { + "s": "ab??c", + "text": "abc", + "expected": "abc\n" + }, + { + "s": "ab??c", + "text": "abbc", + "expected": "" + }, + { + "s": "a\\\\?", + "text": "a\\", + "expected": "a\\\n" + }, + { + "s": "a\\\\?", + "text": "a", + "expected": "a\n" + }, + { + "s": "\\?", + "text": "?", + "expected": "?\n" + }, + { + "s": "\\?", + "text": "a", + "expected": "" + }, + { + "s": "x??y??z", + "text": "xyz", + "expected": "xyz\n" + }, + { + "s": "x??y??z", + "text": "xyyz", + "expected": "" + }, + { + "s": "??abc", + "text": "abc", + "expected": "abc\n" + }, + { + "s": "a?b?c?", + "text": "abc", + "expected": "abc\n" + }, + { + "s": "a?b?c?", + "text": "ac", + "expected": "ac\n" + }, + { + "s": "a?b?c?", + "text": "c", + "expected": "c\n" + }, + { + "s": "a?b?c?", + "text": "ab", + "expected": "ab\n" + }, + { + "s": "a?b?c?", + "text": "", + "expected": "" + } + ] +} diff --git a/2025.02.14/7Ex/test_runner.py b/2025.02.14/7Ex/test_runner.py new file mode 100644 index 0000000..1865bfd --- /dev/null +++ b/2025.02.14/7Ex/test_runner.py @@ -0,0 +1,121 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, s, text, expected): + self.s = s + self.text = text + self.expected = expected + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.f_in = self.config["f_in"] + self.f_out = self.config["f_out"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, f_in, f_out = test_suite.exe, test_suite.f_in, test_suite.f_out + + # Write input data to a file + with open(f_in, "w", encoding="utf-8") as f: + f.write(test.text) + + # Windows fix: remove './' for executables + cmd = [exe, f_in, f_out, test.s] if platform.system() == "Windows" else [f"./{exe}", f_in, f_out, test.s] + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.s}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.s}' should have failed but did not.", Fore.RED)) + return + + # Read output file + try: + with open(f_out, "r", encoding="utf-8") as f: + output = f.read() + except FileNotFoundError: + output = None + + # Check result + if output == test.expected: + print(color_text(f"[PASS] Test '{test.s}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.s}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{output}") + + # Cleanup test files + for file in [f_in, f_out]: + try: + os.remove(file) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {file}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.14/7Ex/Примеры.txt b/2025.02.14/7Ex/Примеры.txt new file mode 100644 index 0000000..2dc6c40 --- /dev/null +++ b/2025.02.14/7Ex/Примеры.txt @@ -0,0 +1,35 @@ +Default: +{ + s: 'some' + t: 'someone\nsome' +} + +Проверка ?: +{ + s: 's?ome' + t: 'some\nhome' +} + +Проверка \s -> s: +{ + s: 's\ome\\' + t: 'some\' +} + +Проверка \: +{ + s: 'some\\\' + t: 'not important' +} + +Проверка \?: +{ + s: '?oho' + t: 'haha?oho!' +} + +Множество ?: +{ + s: 'ha????ha' + t: 'hihihhahoho' +} \ No newline at end of file diff --git a/2025.02.14/8Ex/Linux.rar b/2025.02.14/8Ex/Linux.rar new file mode 100644 index 0000000000000000000000000000000000000000..e1357cbdec7bed75f5a5ea5f363c75dfbb2e1bb4 GIT binary patch literal 2530 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 literal 0 HcmV?d00001 diff --git a/2025.02.14/8Ex/Linux/Makefile b/2025.02.14/8Ex/Linux/Makefile new file mode 100644 index 0000000..0ce8470 --- /dev/null +++ b/2025.02.14/8Ex/Linux/Makefile @@ -0,0 +1,38 @@ +CFLAGS = -mfpmath=sse \ + -fstack-protector-all \ + -W \ + -Wall \ + -Wextra \ + -Wunused \ + -Wcast-align \ + -Werror \ + -pedantic \ + -pedantic-errors \ + -Wfloat-equal \ + -Wpointer-arith \ + -Wformat-security \ + -Wmissing-format-attribute \ + -Wformat=1 \ + -Wwrite-strings \ + -Wcast-align \ + -Wno-long-long \ + -std=gnu99 \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -Wmissing-declarations \ + -Wold-style-definition \ + -Wdeclaration-after-statement \ + -Wbad-function-cast \ + -Wnested-externs \ + -O3 \ + -D_DEBUG -g \ + -c + +all: main.o array.o + gcc main.o array.o -o a08.out && rm *.o + +main.o: main.c + gcc $(CFLAGS) main.c + +array.o: array.c + gcc $(CFLAGS) array.c diff --git a/2025.02.14/8Ex/Linux/array.c b/2025.02.14/8Ex/Linux/array.c new file mode 100644 index 0000000..10c8784 --- /dev/null +++ b/2025.02.14/8Ex/Linux/array.c @@ -0,0 +1,115 @@ +#include "array.h" + + +io_status process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '+') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + } + if (recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1)) return true; + } + + return false; +} + +bool recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) return true; + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (recursion(buf + (i + 1) * char_s, s1, s2, len_s, len_buf - 1)) return true; + } + if (i + 1 == (int)len_s) return true; + } + else + { + return false; + } + } + + return false; + } +} diff --git a/2025.02.14/8Ex/Linux/array.h b/2025.02.14/8Ex/Linux/array.h new file mode 100644 index 0000000..9ec7e36 --- /dev/null +++ b/2025.02.14/8Ex/Linux/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r); +bool start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf); +bool recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/8Ex/Linux/io_status.h b/2025.02.14/8Ex/Linux/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/8Ex/Linux/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/8Ex/Linux/main.c b/2025.02.14/8Ex/Linux/main.c new file mode 100644 index 0000000..0fa6bd1 --- /dev/null +++ b/2025.02.14/8Ex/Linux/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 8; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task8(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/8Ex/Linux/t.txt b/2025.02.14/8Ex/Linux/t.txt new file mode 100644 index 0000000..4535b00 --- /dev/null +++ b/2025.02.14/8Ex/Linux/t.txt @@ -0,0 +1 @@ +haaaaaaaaha \ No newline at end of file diff --git a/2025.02.14/8Ex/Makefile b/2025.02.14/8Ex/Makefile new file mode 100644 index 0000000..5832fda --- /dev/null +++ b/2025.02.14/8Ex/Makefile @@ -0,0 +1,13 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a08.exe: main.o solve.o + gcc main.o solve.o -o a08.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +clean: + del *.o *.exe \ No newline at end of file diff --git a/2025.02.14/8Ex/io_status.h b/2025.02.14/8Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/8Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/8Ex/main.c b/2025.02.14/8Ex/main.c new file mode 100644 index 0000000..43caf1a --- /dev/null +++ b/2025.02.14/8Ex/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = t8_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return t8_process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 8; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task8(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/8Ex/solve.c b/2025.02.14/8Ex/solve.c new file mode 100644 index 0000000..2791bd9 --- /dev/null +++ b/2025.02.14/8Ex/solve.c @@ -0,0 +1,84 @@ +#include "solve.h" + + +io_status t8_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '+') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t8_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = t8_recursion(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t8_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_s == 0) return (len_buf == 0); + else if (len_buf == 0) return false; + + if (buf[0] == s2[0]) + { + if (s1[0] == '1') if (t8_recursion(buf + 1, s1, s2, len_s, len_buf - 1)) return true; + if (t8_recursion(buf + 1, s1 + 1, s2 + 1, len_s - 1, len_buf - 1)) return true; + } + return false; +} diff --git a/2025.02.14/8Ex/solve.h b/2025.02.14/8Ex/solve.h new file mode 100644 index 0000000..236c3d8 --- /dev/null +++ b/2025.02.14/8Ex/solve.h @@ -0,0 +1,13 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status t8_process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status t8_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r); +bool t8_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/8Ex/t.txt b/2025.02.14/8Ex/t.txt new file mode 100644 index 0000000..4245587 --- /dev/null +++ b/2025.02.14/8Ex/t.txt @@ -0,0 +1,6 @@ + +aha +a +a+ +a++ +aaaaaaaa \ No newline at end of file diff --git a/2025.02.14/8Ex/test_cases.json b/2025.02.14/8Ex/test_cases.json new file mode 100644 index 0000000..25570a9 --- /dev/null +++ b/2025.02.14/8Ex/test_cases.json @@ -0,0 +1,212 @@ +{ + "exe": "a08.exe", + "f_in": "input.txt", + "f_out": "output.txt", + "tests": [ + { + "s": "some", + "text": "some\nnotsome\nrandom", + "expected": "some\n" + }, + { + "s": "so+me", + "text": "some\nsooooome\nI'm sometimes", + "expected": "some\nsooooome\n" + }, + { + "s": "s\\ome\\\\", + "text": "some\\", + "expected": "some\\\n" + }, + { + "s": "some\\\\\\", + "text": "some\\", + "expected": "fall" + }, + { + "s": "+oho", + "text": "+oho\noho", + "expected": "+oho\n" + }, + { + "s": "a+", + "text": "\naha\na\na+\na++\naaaaaaaa\naa\naaaa\nbbb", + "expected": "a\naaaaaaaa\naa\naaaa\n" + }, + { + "s": "abs", + "text": "abs\n\\abs\nabsababa\nahahabs\nahahahabsahhaha\n^abs\nahahahabs$jajaja\nha\\abss$hello what!\npbs\nubs\n.abs\nabs\npbt\natn.b.\nbs\nbsaha\n?abs\naaaaaaaaaaaaabs\n+abs+\nabsssssss\n\n", + "expected": "abs\nabs\n" + }, + { + "s": "a+++++", + "text": "a\naaa\n\n", + "expected": "a\naaa\n" + }, + { + "s": "a\\+++++", + "text": "a\naaa\na+\na++", + "expected": "a+\na++\n" + }, + { + "s": "a+", + "text": "a\naa\naaa\naaaaaa\nb\naab\naaaaaax\n", + "expected": "a\naa\naaa\naaaaaa\n" + }, + { + "s": "a+b", + "text": "ab\naab\naaaab\nacb", + "expected": "ab\naab\naaaab\n" + }, + { + "s": "a++b", + "text": "ab\naab\naaaab", + "expected": "ab\naab\naaaab\n" + }, + { + "s": "a+++b", + "text": "ab\naab\naaaab", + "expected": "ab\naab\naaaab\n" + }, + { + "s": "+abc", + "text": "+abc\nabc\nxabc", + "expected": "+abc\n" + }, + { + "s": "abc+", + "text": "abc\nabcc\nabcccc\nab", + "expected": "abc\nabcc\nabcccc\n" + }, + { + "s": "a+b+c", + "text": "abc\naabbcc\naaaabbc", + "expected": "abc\naaaabbc\n" + }, + { + "s": "a+b+c", + "text": "ac\nabbc", + "expected": "abbc\n" + }, + { + "s": "a+b+c+", + "text": "abc\nabbcc\naaaabccccc", + "expected": "abc\nabbcc\naaaabccccc\n" + }, + { + "s": "a+b+c+", + "text": "ac\nabb\n", + "expected": "" + }, + { + "s": "a+b+c+d+", + "text": "abcd\naabbdcddd\naaaabbccddddd", + "expected": "abcd\naaaabbccddddd\n" + }, + { + "s": "hello+world", + "text": "helloworld\nhelloooooworld\nhelo+world", + "expected": "helloworld\nhelloooooworld\n" + }, + { + "s": "a\\+b", + "text": "a+b\nab\naab", + "expected": "a+b\n" + }, + { + "s": "a++", + "text": "a\naa\naaa\naaaa", + "expected": "a\naa\naaa\naaaa\n" + }, + { + "s": "a+++b+", + "text": "ab\naab\naaaabb\nabb", + "expected": "ab\naab\naaaabb\nabb\n" + }, + { + "s": "x+y+z+", + "text": "xyz\nxxyz\nxxxxyzzzz", + "expected": "xyz\nxxyz\nxxxxyzzzz\n" + }, + { + "s": "x+y+z+", + "text": "xz\nxyz\nxyzz", + "expected": "xyz\nxyzz\n" + }, + { + "s": "+abc", + "text": "+abc\nabc\nxabc", + "expected": "+abc\n" + }, + { + "s": "abc+", + "text": "abc\nabcc\nabccc\nab\n", + "expected": "abc\nabcc\nabccc\n" + }, + { + "s": "so+me", + "text": "some\nsooooome\nsometimes\n", + "expected": "some\nsooooome\n" + }, + { + "s": "a+b", + "text": "ab\naab\naaaab\nacb\n", + "expected": "ab\naab\naaaab\n" + }, + { + "s": "a++b", + "text": "ab\naab\naaaab\nazb\n", + "expected": "ab\naab\naaaab\n" + }, + { + "s": "a+++++b", + "text": "ab\naab\naaaab\naaaaaab\naxb\n", + "expected": "ab\naab\naaaab\naaaaaab\n" + }, + { + "s": "start+end", + "text": "startend\nstartttend\nstart\nstartende\n", + "expected": "startend\nstartttend\n" + }, + { + "s": "m++n", + "text": "mn\nmmn\nmmmn\nn\nmnn\n", + "expected": "mn\nmmn\nmmmn\n" + }, + { + "s": "z+z", + "text": "z\nzz\nzzz\nzzzz\nzzzza\n", + "expected": "zz\nzzz\nzzzz\n" + }, + { + "s": "++abc", + "text": "++abc\n+abc\n+++abc\n++++abc\n++abcd\n", + "expected": "++abc\n+abc\n+++abc\n++++abc\n" + }, + { + "s": "slash\\+slash", + "text": "slash+slash\nslashslash\nslash++slash\n", + "expected": "slash+slash\n" + }, + { + "s": "abc\\+def", + "text": "abc+def\nabc++def\nabcdef\nabc+defg\n", + "expected": "abc+def\n" + }, + { + "s": "my++test", + "text": "mytest\nmyytest\nmtest\nmytests\n", + "expected": "mytest\nmyytest\n" + }, + { + "s": "end+", + "text": "end\nendd\nenddd\nen\nendxd\n", + "expected": "end\nendd\nenddd\n" + }, + { + "s": "", + "text": "some\nboy\nwhant\nto\nsee\n\n", + "expected": "\n" + } + ] +} diff --git a/2025.02.14/8Ex/test_runner.py b/2025.02.14/8Ex/test_runner.py new file mode 100644 index 0000000..1865bfd --- /dev/null +++ b/2025.02.14/8Ex/test_runner.py @@ -0,0 +1,121 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, s, text, expected): + self.s = s + self.text = text + self.expected = expected + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.f_in = self.config["f_in"] + self.f_out = self.config["f_out"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, f_in, f_out = test_suite.exe, test_suite.f_in, test_suite.f_out + + # Write input data to a file + with open(f_in, "w", encoding="utf-8") as f: + f.write(test.text) + + # Windows fix: remove './' for executables + cmd = [exe, f_in, f_out, test.s] if platform.system() == "Windows" else [f"./{exe}", f_in, f_out, test.s] + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.s}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.s}' should have failed but did not.", Fore.RED)) + return + + # Read output file + try: + with open(f_out, "r", encoding="utf-8") as f: + output = f.read() + except FileNotFoundError: + output = None + + # Check result + if output == test.expected: + print(color_text(f"[PASS] Test '{test.s}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.s}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{output}") + + # Cleanup test files + for file in [f_in, f_out]: + try: + os.remove(file) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {file}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.14/8Ex/Примеры.txt b/2025.02.14/8Ex/Примеры.txt new file mode 100644 index 0000000..93c71df --- /dev/null +++ b/2025.02.14/8Ex/Примеры.txt @@ -0,0 +1,76 @@ +Default: +{ + s: 'some' + t: 'some' +} + +Проверка, что если часть предложения: +{ + s: 'some' + t: 'somebody here!?' +} + +Проверка +: +{ + s: 'so+me' + t: 'sooooome\nsme\nsome' +} + +Проверка \s -> s: +{ + s: 's\ome\\' + t: 'some\' +} + +Проверка \: +{ + s: 'some\\\' + t: 'not important' +} + +Проверка \+: +{ + s: '+o\+o' + t: '+o+o' +} + +Множество +: +{ + s: 'ha++++++ha' + t: 'haaaaaaaaha' +} + +Проверка на не выход за стэк: +{ + s: 'som+e' + t: 'sommmme' +} + +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss +abs* +somePalongPway +some +howPsomePitPbe +howPsomething +whyPanysome + diff --git a/2025.02.14/9Ex/Makefile b/2025.02.14/9Ex/Makefile new file mode 100644 index 0000000..669b997 --- /dev/null +++ b/2025.02.14/9Ex/Makefile @@ -0,0 +1,38 @@ +CFLAGS = -mfpmath=sse \ + -fstack-protector-all \ + -W \ + -Wall \ + -Wextra \ + -Wunused \ + -Wcast-align \ + -Werror \ + -pedantic \ + -pedantic-errors \ + -Wfloat-equal \ + -Wpointer-arith \ + -Wformat-security \ + -Wmissing-format-attribute \ + -Wformat=1 \ + -Wwrite-strings \ + -Wcast-align \ + -Wno-long-long \ + -std=gnu99 \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -Wmissing-declarations \ + -Wold-style-definition \ + -Wdeclaration-after-statement \ + -Wbad-function-cast \ + -Wnested-externs \ + -O3 \ + -D_DEBUG -g \ + -c + +all: main.o array.o + gcc main.o array.o -lssp && del *.o + +main.o: main.c + gcc $(CFLAGS) main.c + +array.o: array.c + gcc $(CFLAGS) array.c diff --git a/2025.02.14/9Ex/array.c b/2025.02.14/9Ex/array.c new file mode 100644 index 0000000..716bdc4 --- /dev/null +++ b/2025.02.14/9Ex/array.c @@ -0,0 +1,133 @@ +#include "array.h" + + +io_status process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '*') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (buf[len_buf - 1] == '\n') buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + else if (recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf)) return true; + } + if (len_buf == 0 && len_s == 0) return true; + return recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + } + if (s1[0] == '1') return recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + + return false; +} + +bool recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (recursion(buf + (i + 1) * char_s, s1 + i * char_s, s2 + i * char_s, len_s - i, + len_buf - (i + 1))) + return true; + else if (recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, len_s - (i + 1), + len_buf - i)) + return true; + } + } + else + { + if (s1[i] == '1') + { + return (recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, len_s - (i + 1), + len_buf - i)); + return true; + } + return false; + } + } + + if (i == (int)len_s) return true; + return false; + } +} diff --git a/2025.02.14/9Ex/array.h b/2025.02.14/9Ex/array.h new file mode 100644 index 0000000..9ec7e36 --- /dev/null +++ b/2025.02.14/9Ex/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" +#include +#include +#include + +io_status process_s(const char * s, char * s1, char * s2, const size_t len_s); +io_status process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r); +bool start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf); +bool recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf); + +#endif diff --git a/2025.02.14/9Ex/io_status.h b/2025.02.14/9Ex/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/9Ex/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/9Ex/main.c b/2025.02.14/9Ex/main.c new file mode 100644 index 0000000..168d588 --- /dev/null +++ b/2025.02.14/9Ex/main.c @@ -0,0 +1,67 @@ +#include +#include +#include "io_status.h" +#include "array.h" + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1]; // т.к. требуется место для \0 + char s2[len_s + 1]; + + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + else + { + return process_file(f_in, f_out, s1, s2, res); + } + } +} + +int main(int argc, char* argv[]) +{ + int task = 9; + io_status ret; + const char* f_in = 0; + const char* f_out = 0; + const char* s = 0; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task9(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/9Ex/o.txt b/2025.02.14/9Ex/o.txt new file mode 100644 index 0000000..3d4dc53 --- /dev/null +++ b/2025.02.14/9Ex/o.txt @@ -0,0 +1,2 @@ +abs +abs diff --git a/2025.02.14/9Ex/t.txt b/2025.02.14/9Ex/t.txt new file mode 100644 index 0000000..a2c71b8 --- /dev/null +++ b/2025.02.14/9Ex/t.txt @@ -0,0 +1,23 @@ +abs +\abs +absababa +ahahabs +ahahahabsahhaha +^abs +ahahahabs$jajaja +ha\abss$hello what! +pbs +ubs +.abs +abs +pbt +ats +.b. +bs +bsaha +?abs +aaaaaaaaaaaaabs ++abs+ +absssssss + + diff --git a/2025.02.14/9Ex/Примеры.txt b/2025.02.14/9Ex/Примеры.txt new file mode 100644 index 0000000..c04b0a9 --- /dev/null +++ b/2025.02.14/9Ex/Примеры.txt @@ -0,0 +1,47 @@ +Default: +{ + s: 'some' + t: 'some\nheysome\nsomeone\nhey someone!' +} + +Проверка, на отсутствие буквы: +{ + s: 'so*me' + t: 'sme\nsome\nsume' +} + +Проверка, на множественное повторение: +{ + s: 'so*me' + t: 'sooooome\nsme\nsome\nsiiiime' +} + +Проверка \s -> s: +{ + s: 's\ome\\' + t: 'some\' +} + +Проверка, что если заканчивается t, то он не подходит +{ + s: 'something' + t: 'some' +} + +Проверка \: +{ + s: 'some\\\' + t: 'not important' +} + +Проверка \*: +{ + s: '*o\*o' + t: '*o*o\no*o\n**o*o\n*ooooo\n**o\n*oooo*o' +} + +Множество *: +{ + s: 'ha*****ha' + t: 'haaaaaaaaha' +} diff --git a/2025.02.14/Krivoruchenko_SK.zip b/2025.02.14/Krivoruchenko_SK.zip new file mode 100644 index 0000000000000000000000000000000000000000..b74f28dd29dba4160b26b875e9b1b8c4e987e946 GIT binary patch literal 9560 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

bRVm1X)THyxHFq~lg@;1JY@s@D}l#e)3l&ZC$ zm3FmY+crb>2Kg(HO~N+bF~xI%ug1?~L8G1Z{a65Zcoh$ma0C^5(S6EWH&qnfWl@|^ z9I9`i=V*q$Y&*k$JrH?zFX;s*YNTuxsjjy_lpNakY}BD>Iq9=A*tR0Kw_GF{!(NQZ68^P_AFq8u=%u z`>!kVk`DAL9yrP$x|c|hhiYkht-EN~GZMFxPhn0)oV?lTiZw|(z!hb{A&9~Lw^t-6 zo_vGnkN@xA|9)Wt0gU8#2@Zw}mesHC+aI_H4*cS2q6b<8|5Lxj{xj@;iH&+{s0J)g z(f3PiA5)xv#S<1vEbTY;PyIi!e-AHTVlkh3v;oUgl=%`{J`(vGOQG2O8~dkziT!6p z^%5KW +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t1_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t1_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 1; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task1(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a02.c b/2025.02.14/Krivoruchenko_SK/a02.c new file mode 100644 index 0000000..d89dc80 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a02.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t2_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t2_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 2; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task2(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a03.c b/2025.02.14/Krivoruchenko_SK/a03.c new file mode 100644 index 0000000..c201e58 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a03.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res); + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t3_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t3_process_file(f_in, f_out, s1, s2, t_param, res); + } +} + +int main(int argc, char* argv[]) { + int task = 3; + io_status ret; + const char *f_in, *f_out, *s, *t_param; + int res = 0; + double t; + if (argc != 5) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t_param = argv[4]; + t = clock(); + ret = task3(f_in, f_out, s, t_param, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a04.c b/2025.02.14/Krivoruchenko_SK/a04.c new file mode 100644 index 0000000..e166283 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a04.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res); + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t4_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t4_process_file(f_in, f_out, s1, s2, t_param, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 4; + io_status ret; + const char *f_in, *f_out, *s, *t_param; + int res = 0; + double t; + if (argc != 5) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t_param = argv[4]; + t = clock(); + ret = task4(f_in, f_out, s, t_param, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a06.c b/2025.02.14/Krivoruchenko_SK/a06.c new file mode 100644 index 0000000..82b0e38 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a06.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t6_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t6_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 6; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task6(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a07.c b/2025.02.14/Krivoruchenko_SK/a07.c new file mode 100644 index 0000000..deb9928 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a07.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t7_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t7_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 7; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task7(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a08.c b/2025.02.14/Krivoruchenko_SK/a08.c new file mode 100644 index 0000000..83d0cb9 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a08.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = t8_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t8_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 8; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task8(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/a09.c b/2025.02.14/Krivoruchenko_SK/a09.c new file mode 100644 index 0000000..4caa8c7 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/a09.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t9_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t9_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 9; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task9(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Krivoruchenko_SK/io_status.h b/2025.02.14/Krivoruchenko_SK/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/Krivoruchenko_SK/solve.c b/2025.02.14/Krivoruchenko_SK/solve.c new file mode 100644 index 0000000..88fa367 --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/solve.c @@ -0,0 +1,886 @@ +#include "solve.h" + +/* ======================================= */ +/* ========== TASK 1 (Задание 1) ========= */ +/* ======================================= */ + +io_status t1_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = 0; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '^') && (i == 0)) + { + s1[j] = '1'; + s2[j++] = s[++i]; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t1_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = t1_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Исправленная проверка на '\n': */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t1_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + + if (s1[0] == '1') + { + size_t i; + for (i = 0; i < len_s; ++i) + { + if (buf[i] != s2[i]) return false; + } + } + else + { + char* s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + +/* ======================================= */ +/* ========== TASK 2 (Задание 2) ========= */ +/* ======================================= */ + +io_status t2_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = 0; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '$') && (i + 1 == len_s)) + { + if (j != 0) + { + s1[j - 1] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t2_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + /* Исправленная проверка на '\n' + уменьшение len_buf: */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + + is_approach = t2_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Здесь снова, если вдруг ещё раз проверяется: */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t2_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + + if (s1[len_s - 1] == '1') + { + size_t i; + /* Проверка с конца строки */ + for (i = len_buf - 1; i > len_buf - len_s - 1; --i) + { + if (buf[i] != s2[i - (len_buf - len_s)]) return false; + } + } + else + { + char* s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + +/* ======================================= */ +/* ========== TASK 3 (Задание 3) ========= */ +/* ======================================= */ + +io_status t3_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == 0) && (s[i + 1] == '<')) + { + s1[j] = '1'; + i++; + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t3_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = t3_process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t3_process_string(const char* buf, const char* s1, const char* s2, const char* t, + const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[0] == '1') + { + int last_space = -1, i; + size_t per_sim = 0; // Percent of similarity + for (i = 0; i < (int)len_buf; ++i) + { + if (t3_is_space(buf[i], t)) + { + last_space = i; + per_sim = 0; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space + 1) || (per_sim)) + { + if (++per_sim == len_s) + { + return true; + } + } + } + else + { + per_sim = 0; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +bool t3_is_space(char symbol, const char* t) +{ + int i; + for (i = 0; t[i] != '\0'; ++i) + { + if (t[i] == symbol) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 4 (Задание 4) ========= */ +/* ======================================= */ + +io_status t4_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == len_s - 2) && (s[i + 1] == '>')) + { + if (j > 0) + { + s1[j++ - 1] = '1'; + } + else + { + s1[j++] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t4_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t4_process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + /* Проверка повторно (если была) */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t4_process_string(const char* buf, const char* s1, const char* s2, const char* t, + const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[len_s - 1] == '1') + { + size_t i, last_space = len_buf, per_sim = len_s - 1; // Percent of similarity + /* Обратный цикл, используя size_t */ + for (i = len_buf - 1; i < i + 2; --i) + { + if (t3_is_space(buf[i], t)) // используем t3_is_space, чтобы логику не менять + { + last_space = i; + per_sim = len_s - 1; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space - 1) || ((per_sim + 1) < len_s)) + { + if (per_sim-- == 0) + { + return true; + } + } + } + else + { + per_sim = len_s - 1; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +/* ======================================= */ +/* ========== TASK 6 (Задание 6) ========= */ +/* ======================================= */ + +io_status t6_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if (s[i] == '.') + { + s1[j] = '1'; + s2[j++] = '.'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t6_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t6_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Повторная проверка на всякий случай */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t6_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + if (s1[0] == '1' || buf[0] == s2[0]) + { + int j; + for (j = 1; j < (int)len_s; ++j) + { + if ((buf[j] != s2[j]) && (s1[j] == '0')) + { + break; + } + } + + if (j == (int)len_s && j == (int)len_buf) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 7 (Задание 7) ========= */ +/* ======================================= */ + +io_status t7_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i; + int j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '?') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t7_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = t7_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t7_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + bool is_approach = false; + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + + if (s1[0] == '1') + { + is_approach = t7_start(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + if (is_approach) return true; + } + if (len_buf != 0 && buf[0] == s2[0]) + { + is_approach = t7_start(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + if (is_approach) return true; + } + + + return false; +} + +/* ======================================= */ +/* ========== TASK 8 (Задание 8) ========= */ +/* ======================================= */ + +io_status t8_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '+') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t8_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (buf[len_buf - 1] == '\n') buf[--len_buf] = '\0'; + is_approach = t8_recursion(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t8_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_s == 0) return (len_buf == 0); + else if (len_buf == 0) return false; + + if (buf[0] == s2[0]) + { + if (s1[0] == '1') if (t8_recursion(buf + 1, s1, s2, len_s, len_buf - 1)) return true; + if (t8_recursion(buf + 1, s1 + 1, s2 + 1, len_s - 1, len_buf - 1)) return true; + } + return false; +} + +/* ======================================= */ +/* ========== TASK 9 (Задание 9) ========= */ +/* ======================================= */ + +io_status t9_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '*') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t9_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t9_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t9_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (t9_recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + else if (t9_recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf)) return true; + } + if (len_buf == 0 && len_s == 0) return true; + return t9_recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + } + if (s1[0] == '1') return t9_recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + + return false; +} + +bool t9_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (t9_recursion(buf + (i + 1) * char_s, s1 + i * char_s, s2 + i * char_s, + len_s - i, len_buf - (i + 1))) + return true; + else if (t9_recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, + len_s - (i + 1), len_buf - i)) + return true; + } + } + else + { + if (s1[i] == '1') + { + /* Здесь два return подряд в оригинале - оставляем как есть */ + return (t9_recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, + len_s - (i + 1), len_buf - i)); + return true; + } + return false; + } + } + + if (i == (int)len_s) return true; + return false; + } +} diff --git a/2025.02.14/Krivoruchenko_SK/solve.h b/2025.02.14/Krivoruchenko_SK/solve.h new file mode 100644 index 0000000..c611b0e --- /dev/null +++ b/2025.02.14/Krivoruchenko_SK/solve.h @@ -0,0 +1,53 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include "io_status.h" +#include +#include +#include + +/* ========== TASK 1 (Исходный код из первого задания) ========== */ +io_status t1_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t1_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t1_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 2 ========== */ +io_status t2_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t2_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t2_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 3 ========== */ +io_status t3_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t3_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, const char *t, int *r); +bool t3_process_string(const char *buf, const char *s1, const char *s2, const char *t, + const size_t len_s, const size_t len_buf); +bool t3_is_space(char symbol, const char *t); + +/* ========== TASK 4 ========== */ +io_status t4_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t4_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, const char *t, int *r); +bool t4_process_string(const char *buf, const char *s1, const char *s2, const char *t, + const size_t len_s, const size_t len_buf); + +/* ========== TASK 6 ========== */ +io_status t6_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t6_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t6_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 7 ========== */ +io_status t7_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t7_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t7_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 8 ========== */ +io_status t8_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t8_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t8_recursion(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 9 ========== */ +io_status t9_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t9_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t9_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); +bool t9_recursion(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +#endif // SOLVE_H diff --git a/2025.02.14/Linux/Makefile b/2025.02.14/Linux/Makefile new file mode 100644 index 0000000..b60e76f --- /dev/null +++ b/2025.02.14/Linux/Makefile @@ -0,0 +1,13 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +%.out: %.o solve.o + gcc $(FLAGS) $^ -o $@ +%.o: %.c + gcc -c $(FLAGS) $< + +all: a01.out a02.out a03.out a04.out a06.out a07.out a08.out a09.out + +solve.o: solve.c solve.h + +clean: + rm -f *.o *.out diff --git a/2025.02.14/Linux/a01.c b/2025.02.14/Linux/a01.c new file mode 100644 index 0000000..89c70fa --- /dev/null +++ b/2025.02.14/Linux/a01.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t1_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t1_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 1; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task1(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a02.c b/2025.02.14/Linux/a02.c new file mode 100644 index 0000000..d89dc80 --- /dev/null +++ b/2025.02.14/Linux/a02.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t2_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t2_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 2; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task2(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a03.c b/2025.02.14/Linux/a03.c new file mode 100644 index 0000000..c201e58 --- /dev/null +++ b/2025.02.14/Linux/a03.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res); + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t3_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t3_process_file(f_in, f_out, s1, s2, t_param, res); + } +} + +int main(int argc, char* argv[]) { + int task = 3; + io_status ret; + const char *f_in, *f_out, *s, *t_param; + int res = 0; + double t; + if (argc != 5) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t_param = argv[4]; + t = clock(); + ret = task3(f_in, f_out, s, t_param, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a04.c b/2025.02.14/Linux/a04.c new file mode 100644 index 0000000..e166283 --- /dev/null +++ b/2025.02.14/Linux/a04.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res); + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t4_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t4_process_file(f_in, f_out, s1, s2, t_param, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 4; + io_status ret; + const char *f_in, *f_out, *s, *t_param; + int res = 0; + double t; + if (argc != 5) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t_param = argv[4]; + t = clock(); + ret = task4(f_in, f_out, s, t_param, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a06.c b/2025.02.14/Linux/a06.c new file mode 100644 index 0000000..82b0e38 --- /dev/null +++ b/2025.02.14/Linux/a06.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t6_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t6_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 6; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task6(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a07.c b/2025.02.14/Linux/a07.c new file mode 100644 index 0000000..deb9928 --- /dev/null +++ b/2025.02.14/Linux/a07.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t7_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t7_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 7; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task7(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a08.c b/2025.02.14/Linux/a08.c new file mode 100644 index 0000000..83d0cb9 --- /dev/null +++ b/2025.02.14/Linux/a08.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = t8_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t8_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 8; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task8(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/a09.c b/2025.02.14/Linux/a09.c new file mode 100644 index 0000000..4caa8c7 --- /dev/null +++ b/2025.02.14/Linux/a09.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t9_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t9_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 9; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task9(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/Linux/io_status.h b/2025.02.14/Linux/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/Linux/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/Linux/solve.c b/2025.02.14/Linux/solve.c new file mode 100644 index 0000000..eafa00d --- /dev/null +++ b/2025.02.14/Linux/solve.c @@ -0,0 +1,929 @@ +#include "solve.h" + +/* ======================================= */ +/* ========== TASK 1 (Задание 1) ========= */ +/* ======================================= */ + +io_status t1_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = 0; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '^') && (i == 0)) + { + s1[j] = '1'; + s2[j++] = s[++i]; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t1_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = t1_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Исправленная проверка на '\n': */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t1_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + + if (s1[0] == '1') + { + size_t i; + for (i = 0; i < len_s; ++i) + { + if (buf[i] != s2[i]) return false; + } + } + else + { + char* s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + +/* ======================================= */ +/* ========== TASK 2 (Задание 2) ========= */ +/* ======================================= */ + +io_status t2_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = 0; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '$') && (i + 1 == len_s)) + { + if (j != 0) + { + s1[j - 1] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t2_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + /* Исправленная проверка на '\n' + уменьшение len_buf: */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + + is_approach = t2_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Здесь снова, если вдруг ещё раз проверяется: */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t2_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + + if (s1[len_s - 1] == '1') + { + size_t i; + /* Проверка с конца строки */ + for (i = len_buf - 1; i > len_buf - len_s - 1; --i) + { + if (buf[i] != s2[i - (len_buf - len_s)]) return false; + } + } + else + { + char* s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + +/* ======================================= */ +/* ========== TASK 3 (Задание 3) ========= */ +/* ======================================= */ + +io_status t3_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == 0) && (s[i + 1] == '<')) + { + s1[j] = '1'; + i++; + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t3_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = t3_process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t3_process_string(const char* buf, const char* s1, const char* s2, const char* t, + const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[0] == '1') + { + int last_space = -1, i; + size_t per_sim = 0; // Percent of similarity + for (i = 0; i < (int)len_buf; ++i) + { + if (t3_is_space(buf[i], t)) + { + last_space = i; + per_sim = 0; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space + 1) || (per_sim)) + { + if (++per_sim == len_s) + { + return true; + } + } + } + else + { + per_sim = 0; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +bool t3_is_space(char symbol, const char* t) +{ + int i; + for (i = 0; t[i] != '\0'; ++i) + { + if (t[i] == symbol) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 4 (Задание 4) ========= */ +/* ======================================= */ + +io_status t4_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == len_s - 2) && (s[i + 1] == '>')) + { + if (j > 0) + { + s1[j++ - 1] = '1'; + } + else + { + s1[j++] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t4_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t4_process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + /* Проверка повторно (если была) */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t4_process_string(const char* buf, const char* s1, const char* s2, const char* t, + const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[len_s - 1] == '1') + { + size_t i, last_space = len_buf, per_sim = len_s - 1; // Percent of similarity + /* Обратный цикл, используя size_t */ + for (i = len_buf - 1; i < i + 2; --i) + { + if (t3_is_space(buf[i], t)) // используем t3_is_space, чтобы логику не менять + { + last_space = i; + per_sim = len_s - 1; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space - 1) || ((per_sim + 1) < len_s)) + { + if (per_sim-- == 0) + { + return true; + } + } + } + else + { + per_sim = len_s - 1; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +/* ======================================= */ +/* ========== TASK 6 (Задание 6) ========= */ +/* ======================================= */ + +io_status t6_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if (s[i] == '.') + { + s1[j] = '1'; + s2[j++] = '.'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t6_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t6_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Повторная проверка на всякий случай */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t6_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + if (s1[0] == '1' || buf[0] == s2[0]) + { + int j; + for (j = 1; j < (int)len_s; ++j) + { + if ((buf[j] != s2[j]) && (s1[j] == '0')) + { + break; + } + } + + if (j == (int)len_s && j == (int)len_buf) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 7 (Задание 7) ========= */ +/* ======================================= */ + +io_status t7_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i; + int j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '?') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t7_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t7_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t7_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + bool is_approach = false; + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + else if (len_buf == 0) return false; + + if (buf[0] == s2[0]) + { + is_approach = t7_start(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + if (is_approach) return true; + } + if (s1[0] == '1') + { + is_approach = t7_start(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + if (is_approach) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 8 (Задание 8) ========= */ +/* ======================================= */ + +io_status t8_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '+') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t8_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t8_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t8_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (t8_recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + } + if (len_buf == 0 && len_s == 0) return true; + if (t8_recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1)) return true; + } + + return false; +} + +bool t8_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) return true; + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (t8_recursion(buf + (i + 1) * char_s, s1 + i * char_s, s2 + i * char_s, len_s - i, + len_buf - (i + 1))) + return true; + } + if ((i + 1) == (int)len_s) + { + if (i + 1 == (int)len_buf) return true; + return false; + } + } + else + { + return false; + } + } + + return false; + } +} + +/* ======================================= */ +/* ========== TASK 9 (Задание 9) ========= */ +/* ======================================= */ + +io_status t9_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '*') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t9_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t9_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t9_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (t9_recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + else if (t9_recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf)) return true; + } + if (len_buf == 0 && len_s == 0) return true; + return t9_recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + } + if (s1[0] == '1') return t9_recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + + return false; +} + +bool t9_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (t9_recursion(buf + (i + 1) * char_s, s1 + i * char_s, s2 + i * char_s, + len_s - i, len_buf - (i + 1))) + return true; + else if (t9_recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, + len_s - (i + 1), len_buf - i)) + return true; + } + } + else + { + if (s1[i] == '1') + { + /* Здесь два return подряд в оригинале - оставляем как есть */ + return (t9_recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, + len_s - (i + 1), len_buf - i)); + return true; + } + return false; + } + } + + if (i == (int)len_s) return true; + return false; + } +} diff --git a/2025.02.14/Linux/solve.h b/2025.02.14/Linux/solve.h new file mode 100644 index 0000000..14afcef --- /dev/null +++ b/2025.02.14/Linux/solve.h @@ -0,0 +1,54 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include "io_status.h" +#include +#include +#include + +/* ========== TASK 1 (Исходный код из первого задания) ========== */ +io_status t1_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t1_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t1_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 2 ========== */ +io_status t2_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t2_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t2_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 3 ========== */ +io_status t3_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t3_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, const char *t, int *r); +bool t3_process_string(const char *buf, const char *s1, const char *s2, const char *t, + const size_t len_s, const size_t len_buf); +bool t3_is_space(char symbol, const char *t); + +/* ========== TASK 4 ========== */ +io_status t4_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t4_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, const char *t, int *r); +bool t4_process_string(const char *buf, const char *s1, const char *s2, const char *t, + const size_t len_s, const size_t len_buf); + +/* ========== TASK 6 ========== */ +io_status t6_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t6_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t6_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 7 ========== */ +io_status t7_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t7_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t7_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 8 ========== */ +io_status t8_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t8_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t8_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); +bool t8_recursion(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 9 ========== */ +io_status t9_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t9_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t9_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); +bool t9_recursion(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +#endif // SOLVE_H diff --git a/2025.02.14/Makefile b/2025.02.14/Makefile new file mode 100644 index 0000000..b60e76f --- /dev/null +++ b/2025.02.14/Makefile @@ -0,0 +1,13 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +%.out: %.o solve.o + gcc $(FLAGS) $^ -o $@ +%.o: %.c + gcc -c $(FLAGS) $< + +all: a01.out a02.out a03.out a04.out a06.out a07.out a08.out a09.out + +solve.o: solve.c solve.h + +clean: + rm -f *.o *.out diff --git a/2025.02.14/Tasks01.pdf b/2025.02.14/Tasks01.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ab6070899cecf142706dadf7b550d9425c036cd9 GIT binary patch literal 121360 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%0AxnDrZB)}i3wVA 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

pwBG!v!d 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 O@N%iDy865EasdDceb1`^ literal 0 HcmV?d00001 diff --git a/2025.02.14/a01.c b/2025.02.14/a01.c new file mode 100644 index 0000000..89c70fa --- /dev/null +++ b/2025.02.14/a01.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task1(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t1_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t1_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 1; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task1(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a02.c b/2025.02.14/a02.c new file mode 100644 index 0000000..d89dc80 --- /dev/null +++ b/2025.02.14/a02.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task2(const char* f_in, const char* f_out, const char* s, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t2_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t2_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 2; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task2(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a03.c b/2025.02.14/a03.c new file mode 100644 index 0000000..c201e58 --- /dev/null +++ b/2025.02.14/a03.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res); + +io_status task3(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t3_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t3_process_file(f_in, f_out, s1, s2, t_param, res); + } +} + +int main(int argc, char* argv[]) { + int task = 3; + io_status ret; + const char *f_in, *f_out, *s, *t_param; + int res = 0; + double t; + if (argc != 5) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t_param = argv[4]; + t = clock(); + ret = task3(f_in, f_out, s, t_param, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a04.c b/2025.02.14/a04.c new file mode 100644 index 0000000..e166283 --- /dev/null +++ b/2025.02.14/a04.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res); + +io_status task4(const char* f_in, const char* f_out, const char* s, const char* t_param, int* res) +{ + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t4_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t4_process_file(f_in, f_out, s1, s2, t_param, res); + } +} + +int main(int argc, char* argv[]) +{ + int task = 4; + io_status ret; + const char *f_in, *f_out, *s, *t_param; + int res = 0; + double t; + if (argc != 5) + { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t_param = argv[4]; + t = clock(); + ret = task4(f_in, f_out, s, t_param, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) + { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a06.c b/2025.02.14/a06.c new file mode 100644 index 0000000..82b0e38 --- /dev/null +++ b/2025.02.14/a06.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task6(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t6_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t6_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 6; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task6(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a07.c b/2025.02.14/a07.c new file mode 100644 index 0000000..deb9928 --- /dev/null +++ b/2025.02.14/a07.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task7(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t7_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t7_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 7; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task7(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a08.c b/2025.02.14/a08.c new file mode 100644 index 0000000..83d0cb9 --- /dev/null +++ b/2025.02.14/a08.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task8(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + + status = t8_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t8_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 8; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task8(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/a09.c b/2025.02.14/a09.c new file mode 100644 index 0000000..4caa8c7 --- /dev/null +++ b/2025.02.14/a09.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "io_status.h" +#include "solve.h" + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res); + +io_status task9(const char* f_in, const char* f_out, const char* s, int* res) { + if (s == NULL) return ERROR_PATTERN; + else + { + size_t len_s = strlen(s); + io_status status; + char s1[len_s + 1], s2[len_s + 1]; + memset(s1, 0, len_s + 1); + memset(s2, 0, len_s + 1); + status = t9_process_s(s, s1, s2, len_s); + if (status != SUCCESS) return status; + return t9_process_file(f_in, f_out, s1, s2, res); + } +} + +int main(int argc, char* argv[]) { + int task = 9; + io_status ret; + const char *f_in, *f_out, *s; + int res = 0; + double t; + if (argc != 4) { + printf("Usage: %s \n", argv[0]); + return 1; + } + f_in = argv[1]; + f_out = argv[2]; + s = argv[3]; + t = clock(); + ret = task9(f_in, f_out, s, &res); + t = (clock() - t) / CLOCKS_PER_SEC; + switch (ret) { + case SUCCESS: + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t); + break; + case ERROR_OPEN: + printf("Can not open %s\n", f_out); + return 1; + case ERROR_READ: + printf("Can not read %s\n", f_out); + return 2; + case ERROR_PATTERN: + printf("Error in pattern %s\n", s); + return 3; + } + return 0; +} diff --git a/2025.02.14/io_status.h b/2025.02.14/io_status.h new file mode 100644 index 0000000..dbdaf41 --- /dev/null +++ b/2025.02.14/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum io_status_ { + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_PATTERN, +} io_status; + +#endif diff --git a/2025.02.14/solve.c b/2025.02.14/solve.c new file mode 100644 index 0000000..eafa00d --- /dev/null +++ b/2025.02.14/solve.c @@ -0,0 +1,929 @@ +#include "solve.h" + +/* ======================================= */ +/* ========== TASK 1 (Задание 1) ========= */ +/* ======================================= */ + +io_status t1_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = 0; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '^') && (i == 0)) + { + s1[j] = '1'; + s2[j++] = s[++i]; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t1_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = t1_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Исправленная проверка на '\n': */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t1_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + + if (s1[0] == '1') + { + size_t i; + for (i = 0; i < len_s; ++i) + { + if (buf[i] != s2[i]) return false; + } + } + else + { + char* s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + +/* ======================================= */ +/* ========== TASK 2 (Задание 2) ========= */ +/* ======================================= */ + +io_status t2_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = 0; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '$') && (i + 1 == len_s)) + { + if (j != 0) + { + s1[j - 1] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t2_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + /* Исправленная проверка на '\n' + уменьшение len_buf: */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + + is_approach = t2_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Здесь снова, если вдруг ещё раз проверяется: */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t2_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + + if (s1[len_s - 1] == '1') + { + size_t i; + /* Проверка с конца строки */ + for (i = len_buf - 1; i > len_buf - len_s - 1; --i) + { + if (buf[i] != s2[i - (len_buf - len_s)]) return false; + } + } + else + { + char* s_pointer = strstr(buf, s2); + if (!s_pointer) return false; + } + + return true; +} + +/* ======================================= */ +/* ========== TASK 3 (Задание 3) ========= */ +/* ======================================= */ + +io_status t3_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == 0) && (s[i + 1] == '<')) + { + s1[j] = '1'; + i++; + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + if (s1[j] != '1') s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t3_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach = t3_process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + return SUCCESS; +} + +bool t3_process_string(const char* buf, const char* s1, const char* s2, const char* t, + const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[0] == '1') + { + int last_space = -1, i; + size_t per_sim = 0; // Percent of similarity + for (i = 0; i < (int)len_buf; ++i) + { + if (t3_is_space(buf[i], t)) + { + last_space = i; + per_sim = 0; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space + 1) || (per_sim)) + { + if (++per_sim == len_s) + { + return true; + } + } + } + else + { + per_sim = 0; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +bool t3_is_space(char symbol, const char* t) +{ + int i; + for (i = 0; t[i] != '\0'; ++i) + { + if (t[i] == symbol) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 4 (Задание 4) ========= */ +/* ======================================= */ + +io_status t4_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else if ((i == len_s - 2) && (s[i + 1] == '>')) + { + if (j > 0) + { + s1[j++ - 1] = '1'; + } + else + { + s1[j++] = '1'; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t4_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, const char* t, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t4_process_string(buf, s1, s2, t, len_s, len_buf); + + if (is_approach) + { + i++; + /* Проверка повторно (если была) */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t4_process_string(const char* buf, const char* s1, const char* s2, const char* t, + const size_t len_s, const size_t len_buf) +{ + if (len_buf < len_s) return false; + else + { + if (s1[len_s - 1] == '1') + { + size_t i, last_space = len_buf, per_sim = len_s - 1; // Percent of similarity + /* Обратный цикл, используя size_t */ + for (i = len_buf - 1; i < i + 2; --i) + { + if (t3_is_space(buf[i], t)) // используем t3_is_space, чтобы логику не менять + { + last_space = i; + per_sim = len_s - 1; + } + else + { + if (buf[i] == s2[per_sim]) + { + if ((i == last_space - 1) || ((per_sim + 1) < len_s)) + { + if (per_sim-- == 0) + { + return true; + } + } + } + else + { + per_sim = len_s - 1; + } + } + } + + return false; + } + else + { + if (strstr(buf, s2)) return true; + else return false; + } + } +} + +/* ======================================= */ +/* ========== TASK 6 (Задание 6) ========= */ +/* ======================================= */ + +io_status t6_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + size_t i; + int j; + for (i = 0, j = 0; i < len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if (s[i] == '.') + { + s1[j] = '1'; + s2[j++] = '.'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t6_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t6_process_string(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + /* Повторная проверка на всякий случай */ + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t6_process_string(const char* buf, const char* s1, const char* s2, const size_t len_s, + const size_t len_buf) +{ + if (len_buf < len_s) return false; + if (s1[0] == '1' || buf[0] == s2[0]) + { + int j; + for (j = 1; j < (int)len_s; ++j) + { + if ((buf[j] != s2[j]) && (s1[j] == '0')) + { + break; + } + } + + if (j == (int)len_s && j == (int)len_buf) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 7 (Задание 7) ========= */ +/* ======================================= */ + +io_status t7_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i; + int j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '?') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t7_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t7_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t7_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + bool is_approach = false; + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + else if (len_buf == 0) return false; + + if (buf[0] == s2[0]) + { + is_approach = t7_start(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + if (is_approach) return true; + } + if (s1[0] == '1') + { + is_approach = t7_start(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + if (is_approach) return true; + } + + return false; +} + +/* ======================================= */ +/* ========== TASK 8 (Задание 8) ========= */ +/* ======================================= */ + +io_status t8_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '+') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t8_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t8_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t8_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (t8_recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + } + if (len_buf == 0 && len_s == 0) return true; + if (t8_recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1)) return true; + } + + return false; +} + +bool t8_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) return true; + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (t8_recursion(buf + (i + 1) * char_s, s1 + i * char_s, s2 + i * char_s, len_s - i, + len_buf - (i + 1))) + return true; + } + if ((i + 1) == (int)len_s) + { + if (i + 1 == (int)len_buf) return true; + return false; + } + } + else + { + return false; + } + } + + return false; + } +} + +/* ======================================= */ +/* ========== TASK 9 (Задание 9) ========= */ +/* ======================================= */ + +io_status t9_process_s(const char* s, char* s1, char* s2, const size_t len_s) +{ + int i, j; + for (i = 0, j = 0; i < (int)len_s; ++i) + { + if (s[i] == '\\') + { + if (i + 1 == (int)len_s) return ERROR_PATTERN; + else + { + s1[j] = '0'; + s2[j++] = s[++i]; + } + } + else if ((s[i] == '*') && (j != 0)) + { + s1[j - 1] = '1'; + } + else + { + s1[j] = '0'; + s2[j++] = s[i]; + } + } + + s2[j] = '\0'; + + return SUCCESS; +} + +io_status t9_process_file(const char* f_in, const char* f_out, const char* s1, const char* s2, int* r) +{ + FILE* fp = fopen(f_in, "r"); + if (!fp) return ERROR_OPEN; + else + { + char buf[LEN] = {0}; + size_t len_s = strlen(s2); + FILE* fw = fopen(f_out, "w"); + int i; + + if (!fw) + { + fclose(fp); + return ERROR_OPEN; + } + for (i = 0; fgets(buf, sizeof(buf), fp);) + { + size_t len_buf = strlen(buf); + bool is_approach; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[--len_buf] = '\0'; + is_approach = t9_start(buf, s1, s2, len_s, len_buf); + + if (is_approach) + { + i++; + if (len_buf > 0 && buf[len_buf - 1] == '\n') + buf[len_buf - 1] = '\0'; + fprintf(fw, "%s\n", buf); + } + } + + *r = i; + fclose(fw); + } + + fclose(fp); + + return SUCCESS; +} + +bool t9_start(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (buf[0] == s2[0]) + { + if (s1[0] == '1') + { + if (t9_recursion(buf + char_s, s1, s2, len_s, len_buf - 1)) return true; + else if (t9_recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf)) return true; + } + if (len_buf == 0 && len_s == 0) return true; + return t9_recursion(buf + char_s, s1 + char_s, s2 + char_s, len_s - 1, len_buf - 1); + } + if (s1[0] == '1') return t9_recursion(buf, s1 + char_s, s2 + char_s, len_s - 1, len_buf); + + return false; +} + +bool t9_recursion(const char* buf, const char* s1, const char* s2, const size_t len_s, const size_t len_buf) +{ + size_t char_s = sizeof(char); + if (len_s == 0) + { + if (len_buf == 0) return true; + return false; + } + else if (len_buf == 0) return false; + else + { + int i; + for (i = 0; i < (int)len_buf; ++i) + { + if (buf[i] == s2[i]) + { + if (s1[i] == '1') + { + if (t9_recursion(buf + (i + 1) * char_s, s1 + i * char_s, s2 + i * char_s, + len_s - i, len_buf - (i + 1))) + return true; + else if (t9_recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, + len_s - (i + 1), len_buf - i)) + return true; + } + } + else + { + if (s1[i] == '1') + { + /* Здесь два return подряд в оригинале - оставляем как есть */ + return (t9_recursion(buf + i * char_s, s1 + (i + 1) * char_s, s2 + (i + 1) * char_s, + len_s - (i + 1), len_buf - i)); + return true; + } + return false; + } + } + + if (i == (int)len_s) return true; + return false; + } +} diff --git a/2025.02.14/solve.h b/2025.02.14/solve.h new file mode 100644 index 0000000..14afcef --- /dev/null +++ b/2025.02.14/solve.h @@ -0,0 +1,54 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include "io_status.h" +#include +#include +#include + +/* ========== TASK 1 (Исходный код из первого задания) ========== */ +io_status t1_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t1_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t1_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 2 ========== */ +io_status t2_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t2_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t2_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 3 ========== */ +io_status t3_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t3_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, const char *t, int *r); +bool t3_process_string(const char *buf, const char *s1, const char *s2, const char *t, + const size_t len_s, const size_t len_buf); +bool t3_is_space(char symbol, const char *t); + +/* ========== TASK 4 ========== */ +io_status t4_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t4_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, const char *t, int *r); +bool t4_process_string(const char *buf, const char *s1, const char *s2, const char *t, + const size_t len_s, const size_t len_buf); + +/* ========== TASK 6 ========== */ +io_status t6_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t6_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t6_process_string(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 7 ========== */ +io_status t7_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t7_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t7_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 8 ========== */ +io_status t8_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t8_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t8_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); +bool t8_recursion(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +/* ========== TASK 9 ========== */ +io_status t9_process_s(const char *s, char *s1, char *s2, const size_t len_s); +io_status t9_process_file(const char *f_in, const char *f_out, const char *s1, const char *s2, int *r); +bool t9_start(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); +bool t9_recursion(const char *buf, const char *s1, const char *s2, const size_t len_s, const size_t len_buf); + +#endif // SOLVE_H diff --git a/2025.02.21/1Ex/Makefile b/2025.02.21/1Ex/Makefile new file mode 100644 index 0000000..11a8ad1 --- /dev/null +++ b/2025.02.21/1Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a01.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a01.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe \ No newline at end of file diff --git a/2025.02.21/1Ex/array.c b/2025.02.21/1Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/1Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/1Ex/array.h b/2025.02.21/1Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/1Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/1Ex/io_status.h b/2025.02.21/1Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/1Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/1Ex/main.c b/2025.02.21/1Ex/main.c new file mode 100644 index 0000000..e0e5ea6 --- /dev/null +++ b/2025.02.21/1Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 1; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status ret; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + ret = read_array(a, n, name); + do { + switch (ret) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + ret = t1_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, ret, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, ret, t); + free_array(a, ret); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/1Ex/solve.c b/2025.02.21/1Ex/solve.c new file mode 100644 index 0000000..b04f1a7 --- /dev/null +++ b/2025.02.21/1Ex/solve.c @@ -0,0 +1,16 @@ +#include "solve.h" + +int t1_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (strcmp(a[i], s) >= 0) + { + if (i != j) a[j] = a[i]; + j++; + } else free(a[i]); + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} diff --git a/2025.02.21/1Ex/solve.h b/2025.02.21/1Ex/solve.h new file mode 100644 index 0000000..7f6ed03 --- /dev/null +++ b/2025.02.21/1Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE +#define SOLVE + +#include + +#include "array.h" + +int t1_solve(char **arr, int n, char *s); + +#endif diff --git a/2025.02.21/1Ex/t.txt b/2025.02.21/1Ex/t.txt new file mode 100644 index 0000000..94dc09d --- /dev/null +++ b/2025.02.21/1Ex/t.txt @@ -0,0 +1,3 @@ +abcdef +abcefg +zyxwvf diff --git a/2025.02.21/2Ex/Makefile b/2025.02.21/2Ex/Makefile new file mode 100644 index 0000000..b4136a4 --- /dev/null +++ b/2025.02.21/2Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a02.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a02.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/2Ex/array.c b/2025.02.21/2Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/2Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/2Ex/array.h b/2025.02.21/2Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/2Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/2Ex/io_status.h b/2025.02.21/2Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/2Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/2Ex/main.c b/2025.02.21/2Ex/main.c new file mode 100644 index 0000000..e73740f --- /dev/null +++ b/2025.02.21/2Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 2; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t2_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/2Ex/solve.c b/2025.02.21/2Ex/solve.c new file mode 100644 index 0000000..3a163c5 --- /dev/null +++ b/2025.02.21/2Ex/solve.c @@ -0,0 +1,18 @@ +#include "solve.h" + +int t2_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (!strstr(s, a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + } else free(a[i]); + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} diff --git a/2025.02.21/2Ex/solve.h b/2025.02.21/2Ex/solve.h new file mode 100644 index 0000000..6fe2229 --- /dev/null +++ b/2025.02.21/2Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE +#define SOLVE + +#include + +#include "array.h" + +int t2_solve(char **arr, int n, char *s); + +#endif diff --git a/2025.02.21/2Ex/t.txt b/2025.02.21/2Ex/t.txt new file mode 100644 index 0000000..3ce8488 --- /dev/null +++ b/2025.02.21/2Ex/t.txt @@ -0,0 +1,5 @@ +hello +friends +we +are +here diff --git a/2025.02.21/3Ex/Makefile b/2025.02.21/3Ex/Makefile new file mode 100644 index 0000000..742a071 --- /dev/null +++ b/2025.02.21/3Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a03.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a03.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/3Ex/array.c b/2025.02.21/3Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/3Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/3Ex/array.h b/2025.02.21/3Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/3Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/3Ex/io_status.h b/2025.02.21/3Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/3Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/3Ex/main.c b/2025.02.21/3Ex/main.c new file mode 100644 index 0000000..072006f --- /dev/null +++ b/2025.02.21/3Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 3; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t3_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/3Ex/solve.c b/2025.02.21/3Ex/solve.c new file mode 100644 index 0000000..62da943 --- /dev/null +++ b/2025.02.21/3Ex/solve.c @@ -0,0 +1,20 @@ +#include "solve.h" + +int t3_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (strpbrk(s, a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + } else { + free(a[i]); + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} diff --git a/2025.02.21/3Ex/solve.h b/2025.02.21/3Ex/solve.h new file mode 100644 index 0000000..3595dcd --- /dev/null +++ b/2025.02.21/3Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE +#define SOLVE + +#include + +#include "array.h" + +int t3_solve(char **arr, int n, char *s); + +#endif diff --git a/2025.02.21/3Ex/t.txt b/2025.02.21/3Ex/t.txt new file mode 100644 index 0000000..3ce8488 --- /dev/null +++ b/2025.02.21/3Ex/t.txt @@ -0,0 +1,5 @@ +hello +friends +we +are +here diff --git a/2025.02.21/4Ex/Makefile b/2025.02.21/4Ex/Makefile new file mode 100644 index 0000000..b93020e --- /dev/null +++ b/2025.02.21/4Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a04.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a04.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/4Ex/array.c b/2025.02.21/4Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/4Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/4Ex/array.h b/2025.02.21/4Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/4Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/4Ex/io_status.h b/2025.02.21/4Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/4Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/4Ex/main.c b/2025.02.21/4Ex/main.c new file mode 100644 index 0000000..9bcfd2b --- /dev/null +++ b/2025.02.21/4Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 4; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t4_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/4Ex/solve.c b/2025.02.21/4Ex/solve.c new file mode 100644 index 0000000..1e2f4ed --- /dev/null +++ b/2025.02.21/4Ex/solve.c @@ -0,0 +1,29 @@ +#include "solve.h" + +int t4_solve(char ** a, int n, char *s) { + size_t len_s = strlen(s); + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (len_s <= strlen(a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } else { + free(a[i]); + } + k++; + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} diff --git a/2025.02.21/4Ex/solve.h b/2025.02.21/4Ex/solve.h new file mode 100644 index 0000000..3a1ac7d --- /dev/null +++ b/2025.02.21/4Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE +#define SOLVE + +#include + +#include "array.h" + +int t4_solve(char **arr, int n, char *s); + +#endif diff --git a/2025.02.21/4Ex/t.txt b/2025.02.21/4Ex/t.txt new file mode 100644 index 0000000..98f854e --- /dev/null +++ b/2025.02.21/4Ex/t.txt @@ -0,0 +1,11 @@ +1 +22 +333 +4444 +55555 +666666 +333 +22 +1 +7777777 +22 diff --git a/2025.02.21/5Ex/Makefile b/2025.02.21/5Ex/Makefile new file mode 100644 index 0000000..c40ed58 --- /dev/null +++ b/2025.02.21/5Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a05.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a05.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/5Ex/array.c b/2025.02.21/5Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/5Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/5Ex/array.h b/2025.02.21/5Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/5Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/5Ex/io_status.h b/2025.02.21/5Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/5Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/5Ex/main.c b/2025.02.21/5Ex/main.c new file mode 100644 index 0000000..ca878c7 --- /dev/null +++ b/2025.02.21/5Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 5; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t5_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/5Ex/solve.c b/2025.02.21/5Ex/solve.c new file mode 100644 index 0000000..49e28b5 --- /dev/null +++ b/2025.02.21/5Ex/solve.c @@ -0,0 +1,44 @@ +#include "solve.h" + +int t5_solve(char ** a, int n, char *s) { + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (!check(a[i], s)) { + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } else { + free(a[i]); + } + k++; + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + + +bool check(char *a, char *s) { + int i; + int len_s = (int)strlen(s); + int len_a = (int)strlen(a); + int diff = len_a - len_s; + + if (diff < 0) return false; + + for (i = (len_a - 1); i > (diff - 1); --i) { + if (a[i] != s[i - diff]) return false; + } + + return true; +} diff --git a/2025.02.21/5Ex/solve.h b/2025.02.21/5Ex/solve.h new file mode 100644 index 0000000..41781ae --- /dev/null +++ b/2025.02.21/5Ex/solve.h @@ -0,0 +1,12 @@ +#ifndef SOLVE +#define SOLVE + +#include +#include + +#include "array.h" + +int t5_solve(char **arr, int n, char *s); +bool check(char *a, char *s); + +#endif diff --git a/2025.02.21/5Ex/t.txt b/2025.02.21/5Ex/t.txt new file mode 100644 index 0000000..31a1902 --- /dev/null +++ b/2025.02.21/5Ex/t.txt @@ -0,0 +1,3 @@ +xyz +pqr +zzz diff --git a/2025.02.21/6Ex/Makefile b/2025.02.21/6Ex/Makefile new file mode 100644 index 0000000..aef2b70 --- /dev/null +++ b/2025.02.21/6Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a06.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a06.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/6Ex/array.c b/2025.02.21/6Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/6Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/6Ex/array.h b/2025.02.21/6Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/6Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/6Ex/io_status.h b/2025.02.21/6Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/6Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/6Ex/main.c b/2025.02.21/6Ex/main.c new file mode 100644 index 0000000..e3decb7 --- /dev/null +++ b/2025.02.21/6Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 6; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t6_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/6Ex/solve.c b/2025.02.21/6Ex/solve.c new file mode 100644 index 0000000..6f30a8e --- /dev/null +++ b/2025.02.21/6Ex/solve.c @@ -0,0 +1,39 @@ +#include "solve.h" + +int t6_solve(char ** a, int n, char *s) { + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (strpbrk(a[i], s)) { + if (k > 1) + { + for (int x = 2; x < k; x++) free(a[i - x]); + a[j++] = a[i - 1]; + } + + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } + k++; + } + } + + if (k > 1) + { + for (int x = 2; x < k; x++) free(a[i - x]); + a[j++] = a[i - 1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + diff --git a/2025.02.21/6Ex/solve.h b/2025.02.21/6Ex/solve.h new file mode 100644 index 0000000..a89dc75 --- /dev/null +++ b/2025.02.21/6Ex/solve.h @@ -0,0 +1,11 @@ +#ifndef SOLVE +#define SOLVE + +#include +#include + +#include "array.h" + +int t6_solve(char **arr, int n, char *s); + +#endif diff --git a/2025.02.21/6Ex/t.txt b/2025.02.21/6Ex/t.txt new file mode 100644 index 0000000..31a1902 --- /dev/null +++ b/2025.02.21/6Ex/t.txt @@ -0,0 +1,3 @@ +xyz +pqr +zzz diff --git a/2025.02.21/7Ex/Makefile b/2025.02.21/7Ex/Makefile new file mode 100644 index 0000000..90aeeae --- /dev/null +++ b/2025.02.21/7Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a07.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a07.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/7Ex/array.c b/2025.02.21/7Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/7Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/7Ex/array.h b/2025.02.21/7Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/7Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/7Ex/io_status.h b/2025.02.21/7Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/7Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/7Ex/main.c b/2025.02.21/7Ex/main.c new file mode 100644 index 0000000..e3cb05f --- /dev/null +++ b/2025.02.21/7Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 7; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t7_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/7Ex/solve.c b/2025.02.21/7Ex/solve.c new file mode 100644 index 0000000..e65afb6 --- /dev/null +++ b/2025.02.21/7Ex/solve.c @@ -0,0 +1,39 @@ +#include "solve.h" + +int t7_solve(char ** a, int n, char *s) { + bool fl_lst = false, fl_cur = false, fl_nxt = false; + int i, j; + + if (strcmp(a[0], s) < 0) fl_cur = true; + + for (i = 1, j = 0; i < n; ++i) { + if (strcmp(a[i], s) < 0) { + fl_lst = true; + fl_nxt = true; + } + + if (!fl_lst) { + if (j != (i-1)) { + a[j] = a[i-1]; + } + j++; + } else { + free(a[i-1]); + } + + fl_lst = fl_cur; + fl_cur = fl_nxt; + fl_nxt = false; + } + + if (fl_lst) + { + free(a[i-1]); + } else { + a[j++] = a[i-1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} diff --git a/2025.02.21/7Ex/solve.h b/2025.02.21/7Ex/solve.h new file mode 100644 index 0000000..79e0bde --- /dev/null +++ b/2025.02.21/7Ex/solve.h @@ -0,0 +1,11 @@ +#ifndef SOLVE +#define SOLVE + +#include +#include + +#include "array.h" + +int t7_solve(char **arr, int n, char *s); + +#endif diff --git a/2025.02.21/7Ex/t.txt b/2025.02.21/7Ex/t.txt new file mode 100644 index 0000000..bfba8e3 --- /dev/null +++ b/2025.02.21/7Ex/t.txt @@ -0,0 +1,3 @@ +apple +banana +coffee diff --git a/2025.02.21/8Ex/Makefile b/2025.02.21/8Ex/Makefile new file mode 100644 index 0000000..6d0657c --- /dev/null +++ b/2025.02.21/8Ex/Makefile @@ -0,0 +1,16 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a08.exe: main.o array.o solve.o + gcc main.o solve.o array.o -o a08.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +clean: + del *.o *.exe diff --git a/2025.02.21/8Ex/array.c b/2025.02.21/8Ex/array.c new file mode 100644 index 0000000..5a5f7b4 --- /dev/null +++ b/2025.02.21/8Ex/array.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int delete_string(char ** a, int n, int i) +{ + free(a[i]); + a[i] = a[n - 1]; + a[n - 1] = 0; + return n - 1; +} + diff --git a/2025.02.21/8Ex/array.h b/2025.02.21/8Ex/array.h new file mode 100644 index 0000000..2b5a9ce --- /dev/null +++ b/2025.02.21/8Ex/array.h @@ -0,0 +1,16 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int delete_string(char ** a, int n, int i); + +#endif diff --git a/2025.02.21/8Ex/io_status.h b/2025.02.21/8Ex/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/8Ex/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/8Ex/main.c b/2025.02.21/8Ex/main.c new file mode 100644 index 0000000..eaae524 --- /dev/null +++ b/2025.02.21/8Ex/main.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 8; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t8_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/8Ex/solve.c b/2025.02.21/8Ex/solve.c new file mode 100644 index 0000000..734542c --- /dev/null +++ b/2025.02.21/8Ex/solve.c @@ -0,0 +1,77 @@ +#include "solve.h" + +#define INF 97 +#define EXTR 122 +#define TO_UPPER 32 + +#define LOWER(a) (INF <= a && a <= EXTR) + +int t8_solve(char ** a, int n, char *s) { + bool fl_lst = false, fl_cur = false, fl_nxt = false; + int i, j; + + fl_cur = is_inside(a[0], s); + + for (i = 1, j = 0; i < n; ++i) { + if (is_inside(a[i], s)) { + fl_lst = true; + fl_nxt = true; + } + + if (!fl_lst) { + if (j != (i-1)) { + a[j] = a[i-1]; + } + j++; + } else { + free(a[i-1]); + } + + fl_lst = fl_cur; + fl_cur = fl_nxt; + fl_nxt = false; + } + + if (fl_lst) + { + free(a[i-1]); + } else { + a[j++] = a[i-1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +bool is_inside(char *a, char *s) +{ + int len_s = (int)strlen(s); + int len_a = (int)strlen(a); + int i, j; + + if (len_s < len_a) return false; + + for (i = 0; i < len_s; ++i) { + if (!ccmp(a[0], s[i])) { + if (len_a > (len_s-len_a)) return false; + + for (j = 0; j < len_a; ++j) { + if (ccmp(a[j], s[i + j]) != 0) break; + } + + if (j == len_a) return true; + } + } + + return false; +} + +int ccmp(char a, char b) { + if (LOWER(a)) a -= TO_UPPER; + if (LOWER(b)) b -= TO_UPPER; + + if (a < b) return -1; + if (a > b) return 1; + return 0; +} diff --git a/2025.02.21/8Ex/solve.h b/2025.02.21/8Ex/solve.h new file mode 100644 index 0000000..3dfa18a --- /dev/null +++ b/2025.02.21/8Ex/solve.h @@ -0,0 +1,13 @@ +#ifndef SOLVE +#define SOLVE + +#include +#include + +#include "array.h" + +int t8_solve(char **arr, int n, char *s); +bool is_inside(char *a, char *s); +int ccmp(char a, char s); + +#endif diff --git a/2025.02.21/8Ex/t.txt b/2025.02.21/8Ex/t.txt new file mode 100644 index 0000000..cb163b8 --- /dev/null +++ b/2025.02.21/8Ex/t.txt @@ -0,0 +1,9 @@ +anysome +hello +anybody +here +someone?! +somehelp +I +need +cosomello diff --git a/2025.02.21/Example/array.c b/2025.02.21/Example/array.c new file mode 100644 index 0000000..d87eee2 --- /dev/null +++ b/2025.02.21/Example/array.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + +#define LEN 1234 + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + delete_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == "\n") + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + delete_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void delete_array(char ** a. int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + + diff --git a/2025.02.21/Example/io_status.h b/2025.02.21/Example/io_status.h new file mode 100644 index 0000000..491c8a1 --- /dev/null +++ b/2025.02.21/Example/io_status.h @@ -0,0 +1,13 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#typedef enum _io_status +{ + SUCCESS, + READ_ERROR, + SIZE_ERROR, + FORMAT_ERROR, + MEMORY_ERROR +} io_status; + +#endif diff --git a/2025.02.21/Example/main.c b/2025.02.21/Example/main.c new file mode 100644 index 0000000..7c7c5e0 --- /dev/null +++ b/2025.02.21/Example/main.c @@ -0,0 +1,52 @@ +#include +#include "io_status.h" + + +int main(int argc, char * srgv[]) { + int n = 0, m = 0; + char * name = 0; + char ** a = 0; + io_status ret; + + if (!(argc == 4 && fscanf(argv[1], "%d", &n) == 1 && fscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file\n", argv[0]); + return 1; + } + name = argv[3]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return MEMORY_ERROR; + } + ret = read_array(a, n, name); + do { + switch (ret) { + case SUCCESS; + continue; + case ERROR_OPEN; + printf("Can not open %s\n", name); + break; + case ERROR_READ; + printf("Can not read %s\n", name); + break; + case ERROR_MEM; + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + // TODO: Замер времени + l = solve(a, n); + // TODO: Замер времени + print_array(a, l, m); + delete_array(a, l); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Krivoruchenko_SK.zip b/2025.02.21/Krivoruchenko_SK.zip new file mode 100644 index 0000000000000000000000000000000000000000..35a3dac56b3a1498c8242a23325566e978e3228a GIT binary patch literal 8300 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 literal 0 HcmV?d00001 diff --git a/2025.02.21/Linux/Makefile b/2025.02.21/Linux/Makefile new file mode 100644 index 0000000..4437b75 --- /dev/null +++ b/2025.02.21/Linux/Makefile @@ -0,0 +1,13 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +%.out: %.o solve.o + gcc $(FLAGS) $^ -o $@ +%.o: %.c + gcc -c $(FLAGS) $< + +all: a01.out a02.out a03.out a04.out a05.out a06.out a07.out a08.out + +solve.o: solve.c solve.h + +clean: + rm -f *.o *.out diff --git a/2025.02.21/Linux/a01.c b/2025.02.21/Linux/a01.c new file mode 100644 index 0000000..e0e5ea6 --- /dev/null +++ b/2025.02.21/Linux/a01.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 1; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status ret; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + ret = read_array(a, n, name); + do { + switch (ret) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + ret = t1_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, ret, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, ret, t); + free_array(a, ret); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a02.c b/2025.02.21/Linux/a02.c new file mode 100644 index 0000000..e73740f --- /dev/null +++ b/2025.02.21/Linux/a02.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 2; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t2_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a03.c b/2025.02.21/Linux/a03.c new file mode 100644 index 0000000..072006f --- /dev/null +++ b/2025.02.21/Linux/a03.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 3; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t3_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a04.c b/2025.02.21/Linux/a04.c new file mode 100644 index 0000000..9bcfd2b --- /dev/null +++ b/2025.02.21/Linux/a04.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 4; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t4_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a05.c b/2025.02.21/Linux/a05.c new file mode 100644 index 0000000..ca878c7 --- /dev/null +++ b/2025.02.21/Linux/a05.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 5; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t5_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a06.c b/2025.02.21/Linux/a06.c new file mode 100644 index 0000000..e3decb7 --- /dev/null +++ b/2025.02.21/Linux/a06.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 6; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t6_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a07.c b/2025.02.21/Linux/a07.c new file mode 100644 index 0000000..e3cb05f --- /dev/null +++ b/2025.02.21/Linux/a07.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 7; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t7_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/a08.c b/2025.02.21/Linux/a08.c new file mode 100644 index 0000000..eaae524 --- /dev/null +++ b/2025.02.21/Linux/a08.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 8; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t8_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/Linux/array.c b/2025.02.21/Linux/array.c new file mode 100644 index 0000000..7d03417 --- /dev/null +++ b/2025.02.21/Linux/array.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} diff --git a/2025.02.21/Linux/array.h b/2025.02.21/Linux/array.h new file mode 100644 index 0000000..4617a02 --- /dev/null +++ b/2025.02.21/Linux/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); + +#endif diff --git a/2025.02.21/Linux/io_status.h b/2025.02.21/Linux/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/Linux/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/Linux/solve.c b/2025.02.21/Linux/solve.c new file mode 100644 index 0000000..30145ea --- /dev/null +++ b/2025.02.21/Linux/solve.c @@ -0,0 +1,269 @@ +#include "solve.h" + +int t1_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (strcmp(a[i], s) >= 0) + { + if (i != j) a[j] = a[i]; + j++; + } else free(a[i]); + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t2_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (!strstr(s, a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + } else free(a[i]); + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t3_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (strpbrk(s, a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + } else { + free(a[i]); + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t4_solve(char ** a, int n, char *s) { + size_t len_s = strlen(s); + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (len_s <= strlen(a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } else { + free(a[i]); + } + k++; + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t5_solve(char ** a, int n, char *s) { + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (!check(a[i], s)) { + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } else { + free(a[i]); + } + k++; + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + + +bool check(char *a, char *s) { + int i; + int len_s = (int)strlen(s); + int len_a = (int)strlen(a); + int diff = len_a - len_s; + + if (diff < 0) return false; + + for (i = (len_a - 1); i > (diff - 1); --i) { + if (a[i] != s[i - diff]) return false; + } + + return true; +} + +int t6_solve(char ** a, int n, char *s) { + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (strpbrk(a[i], s)) { + if (k > 1) + { + for (int x = 2; x < k; x++) free(a[i - x]); + a[j++] = a[i - 1]; + } + + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } + k++; + } + } + + if (k > 1) + { + for (int x = 2; x < k; x++) free(a[i - x]); + a[j++] = a[i - 1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t7_solve(char ** a, int n, char *s) { + bool fl_lst = false, fl_cur = false, fl_nxt = false; + int i, j; + + if (strcmp(a[0], s) < 0) fl_cur = true; + + for (i = 1, j = 0; i < n; ++i) { + if (strcmp(a[i], s) < 0) { + fl_lst = true; + fl_nxt = true; + } + + if (!fl_lst) { + if (j != (i-1)) { + a[j] = a[i-1]; + } + j++; + } else { + free(a[i-1]); + } + + fl_lst = fl_cur; + fl_cur = fl_nxt; + fl_nxt = false; + } + + if (fl_lst) + { + free(a[i-1]); + } else { + a[j++] = a[i-1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + + +int t8_solve(char ** a, int n, char *s) { + bool fl_lst = false, fl_cur = false, fl_nxt = false; + int i, j; + + fl_cur = is_inside(a[0], s); + + for (i = 1, j = 0; i < n; ++i) { + if (is_inside(a[i], s)) { + fl_lst = true; + fl_nxt = true; + } + + if (!fl_lst) { + if (j != (i-1)) { + a[j] = a[i-1]; + } + j++; + } else { + free(a[i-1]); + } + + fl_lst = fl_cur; + fl_cur = fl_nxt; + fl_nxt = false; + } + + if (fl_lst) + { + free(a[i-1]); + } else { + a[j++] = a[i-1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +bool is_inside(char *a, char *s) +{ + int len_s = (int)strlen(s); + int len_a = (int)strlen(a); + int i, j; + + if (len_s < len_a) return false; + + for (i = 0; i < len_s; ++i) { + if (!ccmp(a[0], s[i])) { + if (len_a > (len_s-len_a)) return false; + + for (j = 0; j < len_a; ++j) { + if (ccmp(a[j], s[i + j]) != 0) break; + } + + if (j == len_a) return true; + } + } + + return false; +} + +int ccmp(char a, char b) { + if (LOWER(a)) a -= TO_UPPER; + if (LOWER(b)) b -= TO_UPPER; + + if (a < b) return -1; + if (a > b) return 1; + return 0; +} diff --git a/2025.02.21/Linux/solve.h b/2025.02.21/Linux/solve.h new file mode 100644 index 0000000..e90508f --- /dev/null +++ b/2025.02.21/Linux/solve.h @@ -0,0 +1,27 @@ +#ifndef SOLVE +#define SOLVE + +#include +#include + +#include "array.h" + +#define INF 97 +#define EXTR 122 +#define TO_UPPER 32 + +#define LOWER(a) (INF <= a && a <= EXTR) + +int t1_solve(char **arr, int n, char *s); +int t2_solve(char **arr, int n, char *s); +int t3_solve(char **arr, int n, char *s); +int t4_solve(char **arr, int n, char *s); +int t5_solve(char **arr, int n, char *s); +bool check(char *a, char *s); +int t6_solve(char **arr, int n, char *s); +int t7_solve(char **arr, int n, char *s); +int t8_solve(char **arr, int n, char *s); +bool is_inside(char *a, char *s); +int ccmp(char a, char s); + +#endif diff --git a/2025.02.21/Makefile b/2025.02.21/Makefile new file mode 100644 index 0000000..8050f29 --- /dev/null +++ b/2025.02.21/Makefile @@ -0,0 +1,14 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +%.out: %.o solve.o array.o + gcc $(FLAGS) $^ -o $@ +%.o: %.c + gcc -c $(FLAGS) $< + +all: a01.out a02.out a03.out a04.out a05.out a06.out a07.out a08.out + +solve.o: solve.c solve.h +array.o: array.c array.h + +clean: + rm -f *.o *.out diff --git a/2025.02.21/Tasks02.pdf b/2025.02.21/Tasks02.pdf new file mode 100644 index 0000000000000000000000000000000000000000..80e2ca0d96c2e022c44660f3320be220c02bfedf GIT binary patch literal 70417 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

R0vID6E842!D0AnGBVB|om} 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

B9E_= z<8_Z1K|OR4>{_+D+CQr6kS)#5zo&8*7bxNlxiCp@yy>9whH(H+J}BJjl_xV>ilO!} zLyTpx58n>DY;C6&N9OL&Ajo{0O~EGY)o0yZ^?|}Dh3xLAKeAlY;zB{2#1t)QU?yii zB7+`i$!BY~sLiXcjq&g&M9?Gj*npg(E(fn*ltZBYC83gZN~bO0+qeNTJRb*L`*yC? zC$aW3g1tKb(}&=gA4LF0gR43g1dCSo20s7X@VcM1)@SkD-~C1SF=W%=#tFDth4d_w zdwZL;FDUScmGtqATvPun1f&V;{IaPS^Ge_v*Z4qo_GQy5mVoWm+MT&qTkEStKy`s2ZK`<$!mabMW6jlDcVCZBjD8L>5Ln_?U4 znnuWK>Da_8MvDBruceyKMusAVPo`?#JLXG(3$q1*O+12KNjnhO02= zrlp|?)6$fKA>|e2VG6P&pn_CHkeW^+73H;H8drh;twOS*=j!85zyMI#KWlaVk0Nfq zPmOG3ju*A&LO$GF+UIm`ilLlmLCFFZ5BOyZIAd64fr~fq`TK0YY~E1jm`&G6)-as6 z&M30VeruJPY0B$V4V6wI%_1R=)arNX>5YvPyW>qVgjXz@cC~8axTAlmc#8XUJx>a< ydxrX{r1hwCpVch$<>SqyGL^7X0z=$?2HB6`h$jT$NnurhkPsS3L_`aH4fHp`BLf`( literal 0 HcmV?d00001 diff --git a/2025.02.21/a01.c b/2025.02.21/a01.c new file mode 100644 index 0000000..e0e5ea6 --- /dev/null +++ b/2025.02.21/a01.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 1; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status ret; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + ret = read_array(a, n, name); + do { + switch (ret) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + ret = t1_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, ret, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, ret, t); + free_array(a, ret); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a02.c b/2025.02.21/a02.c new file mode 100644 index 0000000..e73740f --- /dev/null +++ b/2025.02.21/a02.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 2; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t2_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a03.c b/2025.02.21/a03.c new file mode 100644 index 0000000..072006f --- /dev/null +++ b/2025.02.21/a03.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 3; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t3_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a04.c b/2025.02.21/a04.c new file mode 100644 index 0000000..9bcfd2b --- /dev/null +++ b/2025.02.21/a04.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 4; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t4_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a05.c b/2025.02.21/a05.c new file mode 100644 index 0000000..ca878c7 --- /dev/null +++ b/2025.02.21/a05.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 5; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t5_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a06.c b/2025.02.21/a06.c new file mode 100644 index 0000000..e3decb7 --- /dev/null +++ b/2025.02.21/a06.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 6; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t6_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a07.c b/2025.02.21/a07.c new file mode 100644 index 0000000..e3cb05f --- /dev/null +++ b/2025.02.21/a07.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 7; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t7_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/a08.c b/2025.02.21/a08.c new file mode 100644 index 0000000..eaae524 --- /dev/null +++ b/2025.02.21/a08.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "io_status.h" +#include "array.h" +#include "solve.h" + +int main(int argc, char * argv[]) { + int task = 8; + int n = 0, m = 0; + char * name = 0; + char * s = 0; + char ** a = 0; + io_status res; + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &n) == 1 && sscanf(argv[2], "%d", &m) == 1)) + { + printf("Usage: %s n m file string\n", argv[0]); + return 1; + } + name = argv[3]; + s = argv[4]; + a = (char **)malloc(n * sizeof(char **)); + if (!a) + { + printf("Can not allocate array len %d\n", n); + return ERROR_MEM; + } + res = read_array(a, n, name); + do { + switch (res) { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Can not open %s\n", name); + break; + case ERROR_READ: + printf("Can not read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory\n"); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, m); + t = clock(); + res = t8_solve(a, n, s); + t = (clock() - t); + printf("New array:\n"); + print_array(a, res, m); + printf("%s : Task = %d Result = %d Elapsed = %.2f\n", + argv[0], task, res, t); + free_array(a, res); + free(a); + a = 0; + return 0; +} diff --git a/2025.02.21/array.c b/2025.02.21/array.c new file mode 100644 index 0000000..7d03417 --- /dev/null +++ b/2025.02.21/array.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include "io_status.h" +#include "array.h" + + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} diff --git a/2025.02.21/array.h b/2025.02.21/array.h new file mode 100644 index 0000000..4617a02 --- /dev/null +++ b/2025.02.21/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY +#define ARRAY + +#define LEN 1234 + +#include +#include + +#include "io_status.h" + +io_status read_array(char *a[], int n, const char * name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); + +#endif diff --git a/2025.02.21/io_status.h b/2025.02.21/io_status.h new file mode 100644 index 0000000..40210e9 --- /dev/null +++ b/2025.02.21/io_status.h @@ -0,0 +1,12 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.21/solve.c b/2025.02.21/solve.c new file mode 100644 index 0000000..30145ea --- /dev/null +++ b/2025.02.21/solve.c @@ -0,0 +1,269 @@ +#include "solve.h" + +int t1_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (strcmp(a[i], s) >= 0) + { + if (i != j) a[j] = a[i]; + j++; + } else free(a[i]); + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t2_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (!strstr(s, a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + } else free(a[i]); + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t3_solve(char ** a, int n, char *s) { + int i, j; + for (i = 0, j = 0; i < n; ++i) { + if (strpbrk(s, a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + } else { + free(a[i]); + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t4_solve(char ** a, int n, char *s) { + size_t len_s = strlen(s); + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (len_s <= strlen(a[i])) { + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } else { + free(a[i]); + } + k++; + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t5_solve(char ** a, int n, char *s) { + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (!check(a[i], s)) { + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } else { + free(a[i]); + } + k++; + } + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + + +bool check(char *a, char *s) { + int i; + int len_s = (int)strlen(s); + int len_a = (int)strlen(a); + int diff = len_a - len_s; + + if (diff < 0) return false; + + for (i = (len_a - 1); i > (diff - 1); --i) { + if (a[i] != s[i - diff]) return false; + } + + return true; +} + +int t6_solve(char ** a, int n, char *s) { + int i, j, k; + for (i = 0, j = 0, k = 0; i < n; ++i) { + if (strpbrk(a[i], s)) { + if (k > 1) + { + for (int x = 2; x < k; x++) free(a[i - x]); + a[j++] = a[i - 1]; + } + + if (i != j) + { + a[j] = a[i]; + } + j++; + k = 0; + } else { + if (k == 0) { + if (i != j) + a[j] = a[i]; + j++; + } + k++; + } + } + + if (k > 1) + { + for (int x = 2; x < k; x++) free(a[i - x]); + a[j++] = a[i - 1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +int t7_solve(char ** a, int n, char *s) { + bool fl_lst = false, fl_cur = false, fl_nxt = false; + int i, j; + + if (strcmp(a[0], s) < 0) fl_cur = true; + + for (i = 1, j = 0; i < n; ++i) { + if (strcmp(a[i], s) < 0) { + fl_lst = true; + fl_nxt = true; + } + + if (!fl_lst) { + if (j != (i-1)) { + a[j] = a[i-1]; + } + j++; + } else { + free(a[i-1]); + } + + fl_lst = fl_cur; + fl_cur = fl_nxt; + fl_nxt = false; + } + + if (fl_lst) + { + free(a[i-1]); + } else { + a[j++] = a[i-1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + + +int t8_solve(char ** a, int n, char *s) { + bool fl_lst = false, fl_cur = false, fl_nxt = false; + int i, j; + + fl_cur = is_inside(a[0], s); + + for (i = 1, j = 0; i < n; ++i) { + if (is_inside(a[i], s)) { + fl_lst = true; + fl_nxt = true; + } + + if (!fl_lst) { + if (j != (i-1)) { + a[j] = a[i-1]; + } + j++; + } else { + free(a[i-1]); + } + + fl_lst = fl_cur; + fl_cur = fl_nxt; + fl_nxt = false; + } + + if (fl_lst) + { + free(a[i-1]); + } else { + a[j++] = a[i-1]; + } + + for (i = j; i < n; ++i) a[i] = 0; + + return j; +} + +bool is_inside(char *a, char *s) +{ + int len_s = (int)strlen(s); + int len_a = (int)strlen(a); + int i, j; + + if (len_s < len_a) return false; + + for (i = 0; i < len_s; ++i) { + if (!ccmp(a[0], s[i])) { + if (len_a > (len_s-len_a)) return false; + + for (j = 0; j < len_a; ++j) { + if (ccmp(a[j], s[i + j]) != 0) break; + } + + if (j == len_a) return true; + } + } + + return false; +} + +int ccmp(char a, char b) { + if (LOWER(a)) a -= TO_UPPER; + if (LOWER(b)) b -= TO_UPPER; + + if (a < b) return -1; + if (a > b) return 1; + return 0; +} diff --git a/2025.02.21/solve.h b/2025.02.21/solve.h new file mode 100644 index 0000000..e90508f --- /dev/null +++ b/2025.02.21/solve.h @@ -0,0 +1,27 @@ +#ifndef SOLVE +#define SOLVE + +#include +#include + +#include "array.h" + +#define INF 97 +#define EXTR 122 +#define TO_UPPER 32 + +#define LOWER(a) (INF <= a && a <= EXTR) + +int t1_solve(char **arr, int n, char *s); +int t2_solve(char **arr, int n, char *s); +int t3_solve(char **arr, int n, char *s); +int t4_solve(char **arr, int n, char *s); +int t5_solve(char **arr, int n, char *s); +bool check(char *a, char *s); +int t6_solve(char **arr, int n, char *s); +int t7_solve(char **arr, int n, char *s); +int t8_solve(char **arr, int n, char *s); +bool is_inside(char *a, char *s); +int ccmp(char a, char s); + +#endif diff --git a/2025.02.28/1Ex/Makefile b/2025.02.28/1Ex/Makefile new file mode 100644 index 0000000..859dbc6 --- /dev/null +++ b/2025.02.28/1Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a01.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a01.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/1Ex/a.txt b/2025.02.28/1Ex/a.txt new file mode 100644 index 0000000..8a1218a --- /dev/null +++ b/2025.02.28/1Ex/a.txt @@ -0,0 +1,5 @@ +1 +2 +3 +4 +5 diff --git a/2025.02.28/1Ex/array.c b/2025.02.28/1Ex/array.c new file mode 100644 index 0000000..616f68e --- /dev/null +++ b/2025.02.28/1Ex/array.c @@ -0,0 +1,61 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} diff --git a/2025.02.28/1Ex/array.h b/2025.02.28/1Ex/array.h new file mode 100644 index 0000000..c68d721 --- /dev/null +++ b/2025.02.28/1Ex/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); + +#endif diff --git a/2025.02.28/1Ex/io_status.h b/2025.02.28/1Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/1Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/1Ex/main.c b/2025.02.28/1Ex/main.c new file mode 100644 index 0000000..6c8e47f --- /dev/null +++ b/2025.02.28/1Ex/main.c @@ -0,0 +1,66 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./aout x c n p filename */ + int c, p, n, res, task = 1; + io_status ret; + char *name, *x, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 6 && sscanf(argv[2], "%d", &c) && sscanf(argv[3], "%d", &n) == 1 && sscanf(argv[4], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s x c n p name\n", argv[0]); + return 1; + } + x = argv[1]; + name = argv[5]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + res = t1_solve(a, n, x, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + + printf("%s : Task = %d Res = %d Elapsed = %.2f\n", argv[0], task, res, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/1Ex/solve.c b/2025.02.28/1Ex/solve.c new file mode 100644 index 0000000..466f73c --- /dev/null +++ b/2025.02.28/1Ex/solve.c @@ -0,0 +1,14 @@ +#include "solve.h" + +int t1_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)) { + int avg = (n + (-1)*(n%2)) / 2; + int comp; + + if (n == 0) return 0; + + comp = cmp(x, a[avg]); + if (comp < 0) return t1_solve(a, avg, x, cmp); + if (comp > 0) return avg+1 + t1_solve(a+avg+1, n-(avg+1), x, cmp); + else return avg; +} + diff --git a/2025.02.28/1Ex/solve.h b/2025.02.28/1Ex/solve.h new file mode 100644 index 0000000..9dc8792 --- /dev/null +++ b/2025.02.28/1Ex/solve.h @@ -0,0 +1,8 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +int t1_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/1Ex/sort.c b/2025.02.28/1Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/1Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/1Ex/sort.h b/2025.02.28/1Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/1Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/2Ex/Makefile b/2025.02.28/2Ex/Makefile new file mode 100644 index 0000000..ebc13fc --- /dev/null +++ b/2025.02.28/2Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a02.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a02.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/2Ex/a.txt b/2025.02.28/2Ex/a.txt new file mode 100644 index 0000000..b8836ca --- /dev/null +++ b/2025.02.28/2Ex/a.txt @@ -0,0 +1,4 @@ +alpha +beta +gamma +delta \ No newline at end of file diff --git a/2025.02.28/2Ex/array.c b/2025.02.28/2Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/2Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/2Ex/array.h b/2025.02.28/2Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/2Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/2Ex/b.txt b/2025.02.28/2Ex/b.txt new file mode 100644 index 0000000..deea518 --- /dev/null +++ b/2025.02.28/2Ex/b.txt @@ -0,0 +1,5 @@ +alpha +beta +gamma +delta +epsilon \ No newline at end of file diff --git a/2025.02.28/2Ex/io_status.h b/2025.02.28/2Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/2Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/2Ex/main.c b/2025.02.28/2Ex/main.c new file mode 100644 index 0000000..a1eea09 --- /dev/null +++ b/2025.02.28/2Ex/main.c @@ -0,0 +1,120 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a02.out c n p_a filename_a m p_b filename_b */ + int c, p_a, n, p_b, m, diff, task = 2; + io_status ret; + char *name_a, *name_b, **arr_a, **arr_b, **arr_c; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 8 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p_a) == 1 && sscanf(argv[5], "%d", &m) && sscanf(argv[6], "%d",&p_b) && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p_a filename_a m p_b filename_b\n", argv[0]); + return 1; + } + name_a = argv[4]; + name_b = argv[7]; + cmp = f[c-1]; + + if (!(arr_a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + if (!(arr_b = (char **)malloc(m * sizeof(char *)))) + { + free(arr_a); + + printf("Not enough memory: \n"); + return 2; + } + if (!(arr_c = (char **)malloc((n+m) * sizeof(char *)))) + { + free(arr_a); + free(arr_b); + + printf("Not enough memory: \n"); + return 2; + } + + + ret = read_array(arr_a, n, name_a); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name_a); + break; + case ERROR_READ: + printf("Cannot read %s\n", name_a); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(arr_a); + free(arr_b); + free(arr_c); + return 3; + } while (0); + + ret = read_array(arr_b, m, name_b); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name_b); + break; + case ERROR_READ: + printf("Cannot read %s\n", name_b); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free_array(arr_a, n); + + free(arr_a); + free(arr_b); + free(arr_c); + return 3; + } while (0); + + print_array(arr_a, n, p_a); + printf("\n"); + print_array(arr_b, m, p_b); + + t = clock(); + t2_solve(arr_a, arr_b, arr_c, n, m, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(arr_c, n+m, cmp); + + printf("New array:\n"); + print_array(arr_c, n+m, p_a+p_b); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(arr_a, n); + free_array(arr_b, m); + + free(arr_a); + free(arr_b); + free(arr_c); + + return 0; +} diff --git a/2025.02.28/2Ex/solve.c b/2025.02.28/2Ex/solve.c new file mode 100644 index 0000000..a7a0130 --- /dev/null +++ b/2025.02.28/2Ex/solve.c @@ -0,0 +1,24 @@ +#include "solve.h" + +#include "array.h" + +void t2_solve(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)) +{ + int i, j, k, cntr, len = n + m; // cntr - contrast + for (i = 0, j = 0, k = 0; k < len; ++k) + { + if (i >= n) + { + arr_c[k] = arr_b[j++]; + } else if (j >= m) + { + arr_c[k] = arr_a[i++]; + } else + { + cntr = cmp(arr_a[i], arr_b[j]); + if (cntr <= 0) arr_c[k] = arr_a[i++]; + else arr_c[k] = arr_b[j++]; + } + } +} + diff --git a/2025.02.28/2Ex/solve.h b/2025.02.28/2Ex/solve.h new file mode 100644 index 0000000..ca5dca6 --- /dev/null +++ b/2025.02.28/2Ex/solve.h @@ -0,0 +1,9 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t2_solve(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/2Ex/sort.c b/2025.02.28/2Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/2Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/2Ex/sort.h b/2025.02.28/2Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/2Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/2Ex/test_cases.json b/2025.02.28/2Ex/test_cases.json new file mode 100644 index 0000000..5322614 --- /dev/null +++ b/2025.02.28/2Ex/test_cases.json @@ -0,0 +1,19 @@ +{ + "exe": "a02.exe", + "filename_a": "a.txt", + "filename_b": "b.txt", + "tests": [ + { + "c": 1, + "a": "1 2 3 4\n5 6 7 8", + "b": "9 10 11\n12 13 14", + "expected": "1 2 3 4 5 6 7 8 9 10 11 12 13 14" + }, + { + "c": 2, + "a": "10 20\n30 40 50", + "b": "15 25 35\n45 55", + "expected": "10 20 30 40 50 15 25 35 45 55" + } + ] +} diff --git a/2025.02.28/2Ex/test_runner.py b/2025.02.28/2Ex/test_runner.py new file mode 100644 index 0000000..6715556 --- /dev/null +++ b/2025.02.28/2Ex/test_runner.py @@ -0,0 +1,130 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, a, b, expected): + self.c = c + self.a = a + self.b = b + self.expected = expected + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename_a = self.config["filename_a"] + self.filename_b = self.config["filename_b"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd): + """Runs a shell command and handles errors""" + result = subprocess.run(cmd, capture_output=True, text=True, shell=True) + return result + +def count_lines(filename): + """Counts the number of non-empty lines in a file""" + try: + with open(filename, "r", encoding="utf-8") as f: + return sum(1 for line in f if line.strip()) + except FileNotFoundError: + print(color_text(f"[ERROR] File {filename} not found.", Fore.RED)) + return 0 + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe = test_suite.exe + filename_a = test_suite.filename_a + filename_b = test_suite.filename_b + + # Write input arrays to files + with open(filename_a, "w", encoding="utf-8") as fa: + fa.write(test.a) + with open(filename_b, "w", encoding="utf-8") as fb: + fb.write(test.b) + + # Calculate n and m correctly + n = count_lines(filename_a) + m = count_lines(filename_b) + pa = n + pb = m + + # Debug output to check file contents + print(color_text(f"[DEBUG] a.txt content:\n{open(filename_a).read()}", Fore.CYAN)) + print(color_text(f"[DEBUG] b.txt content:\n{open(filename_b).read()}", Fore.CYAN)) + print(color_text(f"[DEBUG] Calculated n = {n}, m = {m}", Fore.CYAN)) + + # Ensure correct execution command on Windows + exe_cmd = exe if platform.system() == "Windows" else f"./{exe}" + + # Form command-line arguments as a list + cmd = [exe_cmd, str(test.c), str(n), str(pa), filename_a, str(m), str(pb), filename_b] + print(color_text(f"[DEBUG] Running command: {' '.join(cmd)}", Fore.CYAN)) + + # Run program + result = run_command(cmd) + if result.returncode != 0: + print(color_text(f"[ERROR] Test failed to execute: {' '.join(cmd)}", Fore.RED)) + print(color_text(f"[EXIT CODE]: {result.returncode}", Fore.YELLOW)) + print(color_text(f"[STDOUT]: {result.stdout}", Fore.YELLOW)) + print(color_text(f"[STDERR]: {result.stderr}", Fore.YELLOW)) + return + + # Extract relevant output + output_lines = result.stdout.split("\n") + try: + start_index = output_lines.index("New array:") + 1 + end_index = next(i for i, line in enumerate(output_lines) if "Task" in line) + output = "\n".join(output_lines[start_index:end_index]) + except (ValueError, IndexError): + print(color_text(f"[FAIL] Could not parse output correctly.", Fore.RED)) + return + + # Validate output + if output == test.expected: + print(color_text(f"[PASS] Test passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test failed.", Fore.RED)) + print(color_text(f"Expected:\n{test.expected}", Fore.YELLOW)) + print(color_text(f"Got:\n{output}", Fore.YELLOW)) + + # Cleanup files + for file in [filename_a, filename_b]: + try: + os.remove(file) + except FileNotFoundError: + print(color_text(f"[WARNING] Could not delete {file}, may be locked.", Fore.MAGENTA)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.MAGENTA)) + run_command(["make", "clean"]) + print(color_text("[BUILD] Compiling project...", Fore.MAGENTA)) + run_command(["make"]) + + test_suite = TestSuite("test_cases.json") + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.MAGENTA)) + run_command(["make", "clean"]) + +if __name__ == "__main__": + main() diff --git a/2025.02.28/3Ex/Makefile b/2025.02.28/3Ex/Makefile new file mode 100644 index 0000000..1bff8fe --- /dev/null +++ b/2025.02.28/3Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a03.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a03.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/3Ex/a.txt b/2025.02.28/3Ex/a.txt new file mode 100644 index 0000000..0646efc --- /dev/null +++ b/2025.02.28/3Ex/a.txt @@ -0,0 +1,4 @@ +same +one +one +same diff --git a/2025.02.28/3Ex/array.c b/2025.02.28/3Ex/array.c new file mode 100644 index 0000000..616f68e --- /dev/null +++ b/2025.02.28/3Ex/array.c @@ -0,0 +1,61 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} diff --git a/2025.02.28/3Ex/array.h b/2025.02.28/3Ex/array.h new file mode 100644 index 0000000..c68d721 --- /dev/null +++ b/2025.02.28/3Ex/array.h @@ -0,0 +1,14 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); + +#endif diff --git a/2025.02.28/3Ex/io_status.h b/2025.02.28/3Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/3Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/3Ex/main.c b/2025.02.28/3Ex/main.c new file mode 100644 index 0000000..c1aae34 --- /dev/null +++ b/2025.02.28/3Ex/main.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./aout x c n p filename */ + int c, p, n, res, task = 3; + io_status ret; + char *name, *x, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 6 && sscanf(argv[2], "%d", &c) && sscanf(argv[3], "%d", &n) == 1 && sscanf(argv[4], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s x c n p name\n", argv[0]); + return 1; + } + x = argv[1]; + name = argv[5]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + res = t3_solve(a, n, x, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Res = %d Elapsed = %.2f\n", argv[0], task, res, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/3Ex/solve.c b/2025.02.28/3Ex/solve.c new file mode 100644 index 0000000..6cdee26 --- /dev/null +++ b/2025.02.28/3Ex/solve.c @@ -0,0 +1,21 @@ +#include "solve.h" + +int t3_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)) { + int i = 0, j = n-1; + char *temp; + + while (1) + { + for (; i < n; i++) if (cmp(a[i], x) >= 0) break; + for (; j >= 0; j--) if (cmp(a[j], x) < 0) break; + + if (i >= j) break; + temp = a[i]; + a[i] = a[j]; + a[j] = temp; + + i++, j--; + } + + return i; +} diff --git a/2025.02.28/3Ex/solve.h b/2025.02.28/3Ex/solve.h new file mode 100644 index 0000000..f312d1f --- /dev/null +++ b/2025.02.28/3Ex/solve.h @@ -0,0 +1,8 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +int t3_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/3Ex/sort.c b/2025.02.28/3Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/3Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/3Ex/sort.h b/2025.02.28/3Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/3Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/3Ex/test_cases.json b/2025.02.28/3Ex/test_cases.json new file mode 100644 index 0000000..d682b9a --- /dev/null +++ b/2025.02.28/3Ex/test_cases.json @@ -0,0 +1,110 @@ +{ + "exe": "a03.exe", + "filename": "input.txt", + "tests": [ + { + "name": "Basic Sorting Test", + "x": "5", + "c": 1, + "text": "9\n8\n7\n6\n5\n4\n3\n2\n1\n0", + "expected": "0\n1\n2\n3\n4\n5\n6\n7\n8\n9", + "res": 5 + }, + { + "name": "Insert at Start (Should not change order)", + "x": "aaa", + "c": 1, + "text": "bbb\nccc\nddd\neee", + "expected": "bbb\nccc\nddd\neee", + "res": 0 + }, + { + "name": "Insert at End (Should not change order)", + "x": "zzz", + "c": 1, + "text": "aaa\nbbb\nccc\nddd", + "expected": "aaa\nbbb\nccc\nddd", + "res": 4 + }, + { + "name": "Insert in Middle", + "x": "mmm", + "c": 1, + "text": "aaa\njjj\nnnn\nzzz", + "expected": "aaa\njjj\nnnn\nzzz", + "res": 2 + }, + { + "name": "Already Present", + "x": "hello", + "c": 1, + "text": "apple\nbanana\nhello\norange\ntiger", + "expected": "apple\nbanana\nhello\norange\ntiger", + "res": 2 + }, + { + "name": "Reverse Order", + "x": "h", + "c": 2, + "text": "z\ny\nx\nw\nv\nu\nt\ns\nr\nq\np", + "expected": "z\ny\nx\nw\nv\nu\nt\ns\nr\nq\np", + "res": 11 + }, + { + "name": "Equal Length Sorting", + "x": "abc", + "c": 3, + "text": "x\ny\nz\napple\nbanana\ncoconut", + "expected": "x\ny\nz\napple\nbanana\ncoconut", + "res": 3 + }, + { + "name": "All Same Elements", + "x": "same", + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame", + "res": 0 + }, + { + "name": "Similar Elements", + "x": "one", + "c": 1, + "text": "same\none\none\nsame", + "expected": "same\none\none\nsame", + "res": 0 + }, + { + "name": "Insert in Empty List", + "x": "new", + "c": 1, + "text": "", + "expected": "", + "res": 1 + }, + { + "name": "Insert Before Larger Values", + "x": "mid", + "c": 1, + "text": "zeta\nzulu", + "expected": "zeta\nzulu", + "res": 0 + }, + { + "name": "Insert After Smaller Values", + "x": "mid", + "c": 1, + "text": "alpha\nbeta", + "expected": "alpha\nbeta", + "res": 2 + }, + { + "name": "Sorting Numbers as Strings", + "x": "5", + "c": 1, + "text": "10\n20\n30\n40", + "expected": "10\n20\n30\n40", + "res": 4 + } + ] +} diff --git a/2025.02.28/3Ex/test_runner.py b/2025.02.28/3Ex/test_runner.py new file mode 100644 index 0000000..754392d --- /dev/null +++ b/2025.02.28/3Ex/test_runner.py @@ -0,0 +1,156 @@ +import json +import subprocess +import os +import time +import platform +import re +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, x, c, text, expected, res, p=None, debug=False, name=None): + self.x = x + self.c = c + self.text = text + self.expected = expected + self.res = res + self.p = p + self.debug = debug + self.name = name if name else str(c) # Используем c, если name отсутствует + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].strip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Res = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def check_res(output, expected_res): + """Checks if Res matches expected value""" + match = re.search(r"Res\s*=\s*(-?\d+)", output) + if match: + res_value = int(match.group(1)) + if res_value != expected_res: + print(color_text(f"[FAIL] Test failed: Res = {res_value} (expected {expected_res})", Fore.RED)) + return False + return True + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, test.x, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.name}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.name}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check Res value + if not check_res(result.stdout, test.res): + return + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.name}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.name}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/4Ex/Makefile b/2025.02.28/4Ex/Makefile new file mode 100644 index 0000000..217960a --- /dev/null +++ b/2025.02.28/4Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a04.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a04.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/4Ex/a.txt b/2025.02.28/4Ex/a.txt new file mode 100644 index 0000000..ece7a82 --- /dev/null +++ b/2025.02.28/4Ex/a.txt @@ -0,0 +1,4 @@ + apple +banana + cherry +date diff --git a/2025.02.28/4Ex/array.c b/2025.02.28/4Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/4Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/4Ex/array.h b/2025.02.28/4Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/4Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/4Ex/io_status.h b/2025.02.28/4Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/4Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/4Ex/main.c b/2025.02.28/4Ex/main.c new file mode 100644 index 0000000..bc0aa48 --- /dev/null +++ b/2025.02.28/4Ex/main.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a04.out c n p filename */ + int c, n, p, diff, task = 4; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t4_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/4Ex/solve.c b/2025.02.28/4Ex/solve.c new file mode 100644 index 0000000..987d4ab --- /dev/null +++ b/2025.02.28/4Ex/solve.c @@ -0,0 +1,20 @@ +#include "solve.h" + +void t4_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + char *temp; + int i, j; + for (i=n; i > 0; --i) + { + for (j=0; j < i-1; ++j) + { + if (cmp(a[j], a[j+1]) >= 0) + { + temp = a[j]; + a[j] = a[j+1]; + a[j+1] = temp; + } + } + } +} + diff --git a/2025.02.28/4Ex/solve.h b/2025.02.28/4Ex/solve.h new file mode 100644 index 0000000..122e950 --- /dev/null +++ b/2025.02.28/4Ex/solve.h @@ -0,0 +1,8 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t4_solve(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/4Ex/sort.c b/2025.02.28/4Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/4Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/4Ex/sort.h b/2025.02.28/4Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/4Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/4Ex/test_cases.json b/2025.02.28/4Ex/test_cases.json new file mode 100644 index 0000000..56c66a2 --- /dev/null +++ b/2025.02.28/4Ex/test_cases.json @@ -0,0 +1,76 @@ +{ + "exe": "a04.exe", + "filename": "input.txt", + "tests": [ + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" +}, +{ + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" +}, +{ + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" +}, +{ + "c": 1, + "text": "", + "expected": "" +}, +{ + "c": 1, + "text": "onlyone", + "expected": "onlyone" +}, +{ + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" +}, +{ + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" +}, +{ + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" +}, +{ + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" +}, +{ + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" +}, +{ + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" +} + ] +} diff --git a/2025.02.28/4Ex/test_runner.py b/2025.02.28/4Ex/test_runner.py new file mode 100644 index 0000000..5dbc484 --- /dev/null +++ b/2025.02.28/4Ex/test_runner.py @@ -0,0 +1,153 @@ +import json +import subprocess +import os +import time +import platform +import re +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, text, expected, p=None, debug=False): + self.c = c + self.text = text + self.expected = expected + self.p = p + self.debug = debug + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].rstrip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Diff = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def check_diff(output): + """Checks if Diff != 0 in the program output""" + match = re.search(r"Diff\s*=\s*(\d+)", output) + if match: + diff_value = int(match.group(1)) + if diff_value != 0: + print(color_text(f"[FAIL] Test failed: Diff = {diff_value} (expected 0)", Fore.RED)) + return False + return True + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.c}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check Diff value + if not check_diff(result.stdout): + return + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.c}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/5Ex/Makefile b/2025.02.28/5Ex/Makefile new file mode 100644 index 0000000..b01b1b5 --- /dev/null +++ b/2025.02.28/5Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a05.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a05.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/5Ex/a.txt b/2025.02.28/5Ex/a.txt new file mode 100644 index 0000000..ece7a82 --- /dev/null +++ b/2025.02.28/5Ex/a.txt @@ -0,0 +1,4 @@ + apple +banana + cherry +date diff --git a/2025.02.28/5Ex/array.c b/2025.02.28/5Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/5Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/5Ex/array.h b/2025.02.28/5Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/5Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/5Ex/io_status.h b/2025.02.28/5Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/5Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/5Ex/main.c b/2025.02.28/5Ex/main.c new file mode 100644 index 0000000..964130e --- /dev/null +++ b/2025.02.28/5Ex/main.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a05.out c n p filename */ + int c, n, p, diff, task = 5; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t5_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/5Ex/solve.c b/2025.02.28/5Ex/solve.c new file mode 100644 index 0000000..720e9c1 --- /dev/null +++ b/2025.02.28/5Ex/solve.c @@ -0,0 +1,28 @@ +#include "solve.h" + +void t5_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + char *temp; + size_t size_c = sizeof(char); + int i, min; + for (i=0; i < n-1; ++i) + { + min = minimum(a+i*size_c, n-i, cmp)+i; + temp = a[min]; + a[min] = a[i]; + a[i] = temp; + } +} + +int minimum(char **a, int n, int (*cmp)(const char *, const char *)) +{ + int i, min=0; + if (n <= 0) return 0; + for (i = 1; i < n; ++i) + { + if (cmp(a[min], a[i]) > 0) min = i; + } + + return min; +} + diff --git a/2025.02.28/5Ex/solve.h b/2025.02.28/5Ex/solve.h new file mode 100644 index 0000000..d9d649e --- /dev/null +++ b/2025.02.28/5Ex/solve.h @@ -0,0 +1,9 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t5_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int minimum(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/5Ex/sort.c b/2025.02.28/5Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/5Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/5Ex/sort.h b/2025.02.28/5Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/5Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/5Ex/test_cases.json b/2025.02.28/5Ex/test_cases.json new file mode 100644 index 0000000..0346994 --- /dev/null +++ b/2025.02.28/5Ex/test_cases.json @@ -0,0 +1,231 @@ +{ + "exe": "a05.exe", + "filename": "input.txt", + "tests": [ + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" +}, +{ + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" +}, +{ + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" +}, +{ + "c": 1, + "text": "", + "expected": "" +}, +{ + "c": 1, + "text": "onlyone", + "expected": "onlyone" +}, +{ + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" +}, +{ + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" +}, +{ + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" +}, +{ + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" +}, +{ + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" +}, +{ + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" +}, + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" + }, + { + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" + }, + { + "c": 1, + "text": "", + "expected": "" + }, + { + "c": 1, + "text": "onlyone", + "expected": "onlyone" + }, + { + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" + }, + { + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" + }, + { + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" + }, + { + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" + }, + { + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" + }, + { + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" + }, + { + "c": 2, + "text": "zoo\napple\nbanana\ncherry", + "expected": "zoo\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "abcd\na\nabcdef\nabc", + "expected": "a\nabc\nabcd\nabcdef" + }, + { + "c": 4, + "text": "abcd\na\nabcdef\nabc", + "expected": "abcdef\nabcd\nabc\na" + }, + { + "c": 3, + "text": "12345\n1234\n123\n12\n1", + "expected": "1\n12\n123\n1234\n12345" + }, + { + "c": 4, + "text": "12345\n1234\n123\n12\n1", + "expected": "12345\n1234\n123\n12\n1" + }, + { + "c": 1, + "text": "hello\nHELLO\nhElLo\nHeLLo", + "expected": "HELLO\nHeLLo\nhElLo\nhello" + }, + { + "c": 1, + "text": "A\nB\nC\nD\nE", + "expected": "A\nB\nC\nD\nE" + }, + { + "c": 2, + "text": "A\nB\nC\nD\nE", + "expected": "E\nD\nC\nB\nA" + }, + { + "c": 3, + "text": "aaa\nbb\nc", + "expected": "c\nbb\naaa" + }, + { + "c": 4, + "text": "aaa\nbb\nc", + "expected": "aaa\nbb\nc" + }, + { + "c": 1, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 4, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 2, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "3\n1\n4\n1\n5\n9\n2\n6\n5\n3", + "expected": "1\n1\n2\n3\n3\n4\n5\n5\n6\n9" + }, + { + "c": 3, + "text": "hello\nworld\nhi\ncode", + "expected": "hi\ncode\nhello\nworld" + }, + { + "c": 4, + "text": "hello\nworld\nhi\ncode", + "expected": "world\nhello\ncode\nhi" + } + ] +} diff --git a/2025.02.28/5Ex/test_runner.py b/2025.02.28/5Ex/test_runner.py new file mode 100644 index 0000000..30ed462 --- /dev/null +++ b/2025.02.28/5Ex/test_runner.py @@ -0,0 +1,138 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, text, expected, p=None, debug=False): + self.c = c + self.text = text + self.expected = expected + self.p = p + self.debug = debug + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].rstrip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Diff = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.c}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.c}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/6Ex/Makefile b/2025.02.28/6Ex/Makefile new file mode 100644 index 0000000..a156fa5 --- /dev/null +++ b/2025.02.28/6Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a06.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a06.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/6Ex/a.txt b/2025.02.28/6Ex/a.txt new file mode 100644 index 0000000..ece7a82 --- /dev/null +++ b/2025.02.28/6Ex/a.txt @@ -0,0 +1,4 @@ + apple +banana + cherry +date diff --git a/2025.02.28/6Ex/array.c b/2025.02.28/6Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/6Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/6Ex/array.h b/2025.02.28/6Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/6Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/6Ex/io_status.h b/2025.02.28/6Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/6Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/6Ex/main.c b/2025.02.28/6Ex/main.c new file mode 100644 index 0000000..cdf1dad --- /dev/null +++ b/2025.02.28/6Ex/main.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a06.out c n p filename */ + int c, n, p, diff, task = 6; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t6_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/6Ex/solve.c b/2025.02.28/6Ex/solve.c new file mode 100644 index 0000000..9830e08 --- /dev/null +++ b/2025.02.28/6Ex/solve.c @@ -0,0 +1,21 @@ +#include "solve.h" + +void t6_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + int i; + for (i = 1; i < n; ++i) append(a, i+1, a[i], find(a, i, a[i], cmp)); +} + +int find(char **arr, int n, char *a, int (*cmp)(const char *, const char *)) +{ + int i; + for (i=0; i index; --i) arr[i] = arr[i-1]; + arr[index] = a; +} + diff --git a/2025.02.28/6Ex/solve.h b/2025.02.28/6Ex/solve.h new file mode 100644 index 0000000..a716162 --- /dev/null +++ b/2025.02.28/6Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t6_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int find(char **arr, int n, char *a, int (*cmp)(const char *, const char *)); +void append(char **arr, int n, char *a, int index); + +#endif diff --git a/2025.02.28/6Ex/sort.c b/2025.02.28/6Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/6Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/6Ex/sort.h b/2025.02.28/6Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/6Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/6Ex/test_cases.json b/2025.02.28/6Ex/test_cases.json new file mode 100644 index 0000000..491dca7 --- /dev/null +++ b/2025.02.28/6Ex/test_cases.json @@ -0,0 +1,231 @@ +{ + "exe": "a06.exe", + "filename": "input.txt", + "tests": [ + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" +}, +{ + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" +}, +{ + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" +}, +{ + "c": 1, + "text": "", + "expected": "" +}, +{ + "c": 1, + "text": "onlyone", + "expected": "onlyone" +}, +{ + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" +}, +{ + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" +}, +{ + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" +}, +{ + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" +}, +{ + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" +}, +{ + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" +}, + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" + }, + { + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" + }, + { + "c": 1, + "text": "", + "expected": "" + }, + { + "c": 1, + "text": "onlyone", + "expected": "onlyone" + }, + { + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" + }, + { + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" + }, + { + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" + }, + { + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" + }, + { + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" + }, + { + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" + }, + { + "c": 2, + "text": "zoo\napple\nbanana\ncherry", + "expected": "zoo\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "abcd\na\nabcdef\nabc", + "expected": "a\nabc\nabcd\nabcdef" + }, + { + "c": 4, + "text": "abcd\na\nabcdef\nabc", + "expected": "abcdef\nabcd\nabc\na" + }, + { + "c": 3, + "text": "12345\n1234\n123\n12\n1", + "expected": "1\n12\n123\n1234\n12345" + }, + { + "c": 4, + "text": "12345\n1234\n123\n12\n1", + "expected": "12345\n1234\n123\n12\n1" + }, + { + "c": 1, + "text": "hello\nHELLO\nhElLo\nHeLLo", + "expected": "HELLO\nHeLLo\nhElLo\nhello" + }, + { + "c": 1, + "text": "A\nB\nC\nD\nE", + "expected": "A\nB\nC\nD\nE" + }, + { + "c": 2, + "text": "A\nB\nC\nD\nE", + "expected": "E\nD\nC\nB\nA" + }, + { + "c": 3, + "text": "aaa\nbb\nc", + "expected": "c\nbb\naaa" + }, + { + "c": 4, + "text": "aaa\nbb\nc", + "expected": "aaa\nbb\nc" + }, + { + "c": 1, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 4, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 2, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "3\n1\n4\n1\n5\n9\n2\n6\n5\n3", + "expected": "1\n1\n2\n3\n3\n4\n5\n5\n6\n9" + }, + { + "c": 3, + "text": "hello\nworld\nhi\ncode", + "expected": "hi\ncode\nhello\nworld" + }, + { + "c": 4, + "text": "hello\nworld\nhi\ncode", + "expected": "world\nhello\ncode\nhi" + } + ] +} diff --git a/2025.02.28/6Ex/test_runner.py b/2025.02.28/6Ex/test_runner.py new file mode 100644 index 0000000..30ed462 --- /dev/null +++ b/2025.02.28/6Ex/test_runner.py @@ -0,0 +1,138 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, text, expected, p=None, debug=False): + self.c = c + self.text = text + self.expected = expected + self.p = p + self.debug = debug + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].rstrip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Diff = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.c}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.c}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/7Ex/Makefile b/2025.02.28/7Ex/Makefile new file mode 100644 index 0000000..edeec68 --- /dev/null +++ b/2025.02.28/7Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a07.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a07.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/7Ex/a.txt b/2025.02.28/7Ex/a.txt new file mode 100644 index 0000000..15a1d5a --- /dev/null +++ b/2025.02.28/7Ex/a.txt @@ -0,0 +1,8 @@ +zzzzzzzz +zzzzzzz +zzzzzz +zzzzz +zzzz +zzz +zz +z diff --git a/2025.02.28/7Ex/array.c b/2025.02.28/7Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/7Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/7Ex/array.h b/2025.02.28/7Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/7Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/7Ex/io_status.h b/2025.02.28/7Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/7Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/7Ex/main.c b/2025.02.28/7Ex/main.c new file mode 100644 index 0000000..a5ea454 --- /dev/null +++ b/2025.02.28/7Ex/main.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a07.out c n p filename */ + int c, n, p, diff, task = 7; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t7_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/7Ex/solve.c b/2025.02.28/7Ex/solve.c new file mode 100644 index 0000000..0d0190c --- /dev/null +++ b/2025.02.28/7Ex/solve.c @@ -0,0 +1,25 @@ +#include "solve.h" + +void t7_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + int i; + for (i = 1; i < n; ++i) append(a, i+1, a[i], find(a, i, a[i], cmp)); +} + +int find(char **a, int n, char *x, int (*cmp)(const char *, const char *)) { + int avg = (n + (-1)*(n%2)) / 2; + int comp; + + if (n == 0) return 0; + + comp = cmp(x, a[avg]); + if (comp < 0) return find(a, avg, x, cmp); + if (comp > 0) return avg+1 + find(a+(avg+1), n-(avg+1), x, cmp); + else return avg; +} + +void append(char **arr, int n, char *a, int index) +{ + for (int i = n-1; i > index; --i) arr[i] = arr[i-1]; + arr[index] = a; +} diff --git a/2025.02.28/7Ex/solve.h b/2025.02.28/7Ex/solve.h new file mode 100644 index 0000000..5d0f991 --- /dev/null +++ b/2025.02.28/7Ex/solve.h @@ -0,0 +1,10 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t7_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int find(char **arr, int n, char *a, int (*cmp)(const char *, const char *)); +void append(char **arr, int n, char *a, int index); + +#endif diff --git a/2025.02.28/7Ex/sort.c b/2025.02.28/7Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/7Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/7Ex/sort.h b/2025.02.28/7Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/7Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/7Ex/test_cases.json b/2025.02.28/7Ex/test_cases.json new file mode 100644 index 0000000..fbdf85f --- /dev/null +++ b/2025.02.28/7Ex/test_cases.json @@ -0,0 +1,231 @@ +{ + "exe": "a07.exe", + "filename": "input.txt", + "tests": [ + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" +}, +{ + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" +}, +{ + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" +}, +{ + "c": 1, + "text": "", + "expected": "" +}, +{ + "c": 1, + "text": "onlyone", + "expected": "onlyone" +}, +{ + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" +}, +{ + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" +}, +{ + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" +}, +{ + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" +}, +{ + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" +}, +{ + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" +}, + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" + }, + { + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" + }, + { + "c": 1, + "text": "", + "expected": "" + }, + { + "c": 1, + "text": "onlyone", + "expected": "onlyone" + }, + { + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" + }, + { + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" + }, + { + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" + }, + { + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" + }, + { + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" + }, + { + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" + }, + { + "c": 2, + "text": "zoo\napple\nbanana\ncherry", + "expected": "zoo\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "abcd\na\nabcdef\nabc", + "expected": "a\nabc\nabcd\nabcdef" + }, + { + "c": 4, + "text": "abcd\na\nabcdef\nabc", + "expected": "abcdef\nabcd\nabc\na" + }, + { + "c": 3, + "text": "12345\n1234\n123\n12\n1", + "expected": "1\n12\n123\n1234\n12345" + }, + { + "c": 4, + "text": "12345\n1234\n123\n12\n1", + "expected": "12345\n1234\n123\n12\n1" + }, + { + "c": 1, + "text": "hello\nHELLO\nhElLo\nHeLLo", + "expected": "HELLO\nHeLLo\nhElLo\nhello" + }, + { + "c": 1, + "text": "A\nB\nC\nD\nE", + "expected": "A\nB\nC\nD\nE" + }, + { + "c": 2, + "text": "A\nB\nC\nD\nE", + "expected": "E\nD\nC\nB\nA" + }, + { + "c": 3, + "text": "aaa\nbb\nc", + "expected": "c\nbb\naaa" + }, + { + "c": 4, + "text": "aaa\nbb\nc", + "expected": "aaa\nbb\nc" + }, + { + "c": 1, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 4, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 2, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "3\n1\n4\n1\n5\n9\n2\n6\n5\n3", + "expected": "1\n1\n2\n3\n3\n4\n5\n5\n6\n9" + }, + { + "c": 3, + "text": "hello\nworld\nhi\ncode", + "expected": "hi\ncode\nhello\nworld" + }, + { + "c": 4, + "text": "hello\nworld\nhi\ncode", + "expected": "world\nhello\ncode\nhi" + } + ] +} diff --git a/2025.02.28/7Ex/test_runner.py b/2025.02.28/7Ex/test_runner.py new file mode 100644 index 0000000..30ed462 --- /dev/null +++ b/2025.02.28/7Ex/test_runner.py @@ -0,0 +1,138 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, text, expected, p=None, debug=False): + self.c = c + self.text = text + self.expected = expected + self.p = p + self.debug = debug + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].rstrip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Diff = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.c}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.c}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/8Ex/' b/2025.02.28/8Ex/' new file mode 100644 index 0000000..8914634 --- /dev/null +++ b/2025.02.28/8Ex/' @@ -0,0 +1,47 @@ +#include "solve.h" + +#include "array.h" + +void t8_solve(char **a, char **b, int n, int (*cmp)(const char *, const char *)) +{ + int i = 2, j, margin; + do { + int hf_i = i/2; + for (j = 0; j < n; j += i) + { + if (n < j+i) + { + margin = n-(j+hf_i); + if (margin <= 0) break; + } else margin = hf_i; + + unite(a+j, a+(j+hf_i), b, hf_i, margin, cmp); + for (int k = 0; k < hf_i+margin; k++) a[i+j] = b[i]; + } + + printf("\ni: %d:\n", i); + print_array(a, n, n); + i *= 2; + } while (i < n); +} + +void unite(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)) +{ + int i, j, k, cntr, len = n + m; // cntr - contrast + for (i = 0, j = 0, k = 0; k < len; ++k) + { + if (i >= n) + { + arr_c[k] = arr_b[j++]; + } else if (j >= m) + { + arr_c[k] = arr_a[i++]; + } else + { + cntr = cmp(arr_a[i], arr_b[j]); + if (cntr <= 0) arr_c[k] = arr_a[i++]; + else arr_c[k] = arr_b[j++]; + } + } +} + diff --git a/2025.02.28/8Ex/Makefile b/2025.02.28/8Ex/Makefile new file mode 100644 index 0000000..f31a9c0 --- /dev/null +++ b/2025.02.28/8Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a08.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a08.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/8Ex/a.txt b/2025.02.28/8Ex/a.txt new file mode 100644 index 0000000..abb8f77 --- /dev/null +++ b/2025.02.28/8Ex/a.txt @@ -0,0 +1,9 @@ +9 +8 +7 +6 +5 +4 +3 +2 +1 diff --git a/2025.02.28/8Ex/array.c b/2025.02.28/8Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/8Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/8Ex/array.h b/2025.02.28/8Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/8Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/8Ex/io_status.h b/2025.02.28/8Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/8Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/8Ex/main.c b/2025.02.28/8Ex/main.c new file mode 100644 index 0000000..988280c --- /dev/null +++ b/2025.02.28/8Ex/main.c @@ -0,0 +1,76 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a08.out c n p filename */ + int c, n, p, diff, task = 8; + io_status ret; + char *name, **a, **b; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } if (!(b = (char **)malloc(n * sizeof(char *)))) + { + + free(a); + printf("Not enough memory: \n"); + return 2; + } + memset(b, 0, (n * sizeof(char *))); + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t8_solve(a, b, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + free(b); + + return 0; +} diff --git a/2025.02.28/8Ex/solve.c b/2025.02.28/8Ex/solve.c new file mode 100644 index 0000000..7100cf7 --- /dev/null +++ b/2025.02.28/8Ex/solve.c @@ -0,0 +1,43 @@ +#include "solve.h" + +void t8_solve(char **a, char **b, int n, int (*cmp)(const char *, const char *)) +{ + int i = 2, j, margin; + do { + int hf_i = i/2; + for (j = 0; j < n; j += i) + { + if (n < j+i) + { + margin = n-(j+hf_i); + if (margin <= 0) break; + } else margin = hf_i; + + unite(a+j, a+(j+hf_i), b, hf_i, margin, cmp); + for (int k = 0; k < hf_i+margin; k++) a[j+k] = b[k]; + } + + i *= 2; + } while (i < n*2); +} + +void unite(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)) +{ + int i, j, k, cntr, len = n + m; // cntr - contrast + for (i = 0, j = 0, k = 0; k < len; ++k) + { + if (i >= n) + { + arr_c[k] = arr_b[j++]; + } else if (j >= m) + { + arr_c[k] = arr_a[i++]; + } else + { + cntr = cmp(arr_a[i], arr_b[j]); + if (cntr <= 0) arr_c[k] = arr_a[i++]; + else arr_c[k] = arr_b[j++]; + } + } +} + diff --git a/2025.02.28/8Ex/solve.h b/2025.02.28/8Ex/solve.h new file mode 100644 index 0000000..1519154 --- /dev/null +++ b/2025.02.28/8Ex/solve.h @@ -0,0 +1,9 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t8_solve(char **a, char **b, int n, int (*cmp)(const char *, const char *)); +void unite(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/8Ex/sort.c b/2025.02.28/8Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/8Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/8Ex/sort.h b/2025.02.28/8Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/8Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/8Ex/test_cases.json b/2025.02.28/8Ex/test_cases.json new file mode 100644 index 0000000..0a16078 --- /dev/null +++ b/2025.02.28/8Ex/test_cases.json @@ -0,0 +1,231 @@ +{ + "exe": "a08.exe", + "filename": "input.txt", + "tests": [ + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" +}, +{ + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" +}, +{ + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" +}, +{ + "c": 1, + "text": "", + "expected": "" +}, +{ + "c": 1, + "text": "onlyone", + "expected": "onlyone" +}, +{ + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" +}, +{ + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" +}, +{ + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" +}, +{ + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" +}, +{ + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" +}, +{ + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" +}, + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" + }, + { + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" + }, + { + "c": 1, + "text": "", + "expected": "" + }, + { + "c": 1, + "text": "onlyone", + "expected": "onlyone" + }, + { + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" + }, + { + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" + }, + { + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" + }, + { + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" + }, + { + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" + }, + { + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" + }, + { + "c": 2, + "text": "zoo\napple\nbanana\ncherry", + "expected": "zoo\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "abcd\na\nabcdef\nabc", + "expected": "a\nabc\nabcd\nabcdef" + }, + { + "c": 4, + "text": "abcd\na\nabcdef\nabc", + "expected": "abcdef\nabcd\nabc\na" + }, + { + "c": 3, + "text": "12345\n1234\n123\n12\n1", + "expected": "1\n12\n123\n1234\n12345" + }, + { + "c": 4, + "text": "12345\n1234\n123\n12\n1", + "expected": "12345\n1234\n123\n12\n1" + }, + { + "c": 1, + "text": "hello\nHELLO\nhElLo\nHeLLo", + "expected": "HELLO\nHeLLo\nhElLo\nhello" + }, + { + "c": 1, + "text": "A\nB\nC\nD\nE", + "expected": "A\nB\nC\nD\nE" + }, + { + "c": 2, + "text": "A\nB\nC\nD\nE", + "expected": "E\nD\nC\nB\nA" + }, + { + "c": 3, + "text": "aaa\nbb\nc", + "expected": "c\nbb\naaa" + }, + { + "c": 4, + "text": "aaa\nbb\nc", + "expected": "aaa\nbb\nc" + }, + { + "c": 1, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 4, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 2, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "3\n1\n4\n1\n5\n9\n2\n6\n5\n3", + "expected": "1\n1\n2\n3\n3\n4\n5\n5\n6\n9" + }, + { + "c": 3, + "text": "hello\nworld\nhi\ncode", + "expected": "hi\ncode\nhello\nworld" + }, + { + "c": 4, + "text": "hello\nworld\nhi\ncode", + "expected": "world\nhello\ncode\nhi" + } + ] +} diff --git a/2025.02.28/8Ex/test_runner.py b/2025.02.28/8Ex/test_runner.py new file mode 100644 index 0000000..30ed462 --- /dev/null +++ b/2025.02.28/8Ex/test_runner.py @@ -0,0 +1,138 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, text, expected, p=None, debug=False): + self.c = c + self.text = text + self.expected = expected + self.p = p + self.debug = debug + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].rstrip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Diff = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.c}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.c}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/9Ex/Makefile b/2025.02.28/9Ex/Makefile new file mode 100644 index 0000000..e5f9668 --- /dev/null +++ b/2025.02.28/9Ex/Makefile @@ -0,0 +1,19 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +a09.exe: main.o array.o solve.o sort.o + gcc main.o solve.o array.o sort.o -o a09.exe -lssp + +main.o: main.c + gcc $(CFLAGS) -c main.c + +solve.o: solve.c + gcc $(FLAGS) -c solve.c + +array.o: array.c + gcc $(CFLAGS) -c array.c + +sort.o: sort.c + gcc $(CFLAGS) -c sort.c + +clean: + del *.o *.exe diff --git a/2025.02.28/9Ex/a.txt b/2025.02.28/9Ex/a.txt new file mode 100644 index 0000000..050d01f --- /dev/null +++ b/2025.02.28/9Ex/a.txt @@ -0,0 +1,10 @@ +3 +1 +4 +1 +5 +9 +2 +6 +5 +3 diff --git a/2025.02.28/9Ex/array.c b/2025.02.28/9Ex/array.c new file mode 100644 index 0000000..5841914 --- /dev/null +++ b/2025.02.28/9Ex/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/9Ex/array.h b/2025.02.28/9Ex/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/9Ex/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/9Ex/io_status.h b/2025.02.28/9Ex/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/9Ex/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/9Ex/main.c b/2025.02.28/9Ex/main.c new file mode 100644 index 0000000..edfeaad --- /dev/null +++ b/2025.02.28/9Ex/main.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a09.out c n p filename */ + int c, n, p, diff, task = 9; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t9_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/9Ex/solve.c b/2025.02.28/9Ex/solve.c new file mode 100644 index 0000000..c49bfb5 --- /dev/null +++ b/2025.02.28/9Ex/solve.c @@ -0,0 +1,41 @@ +#include "solve.h" + +void t9_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + while (n > 1) + { + int is_edge = 0, ind_x = findIndex(a, n, a[n/2], cmp); + if (ind_x < n-ind_x) + { + if (ind_x == 0) is_edge = 1; + t9_solve(a, ind_x, cmp); + a += ind_x + is_edge; + n -= ind_x + is_edge; + } else + { + t9_solve(a+ind_x, n-ind_x, cmp); + n = ind_x; + } + } +} + +int findIndex(char **a, int n, char *x, int (*cmp)(const char *, const char *)) +{ + int i = 0, j = n-1; + char *temp; + + while (1) + { + for (; i < n; i++) if (cmp(a[i], x) >= 0) break; + for (; j >= 0; j--) if (cmp(a[j], x) <= 0) break; + + if (i >= j) break; + temp = a[i]; + a[i] = a[j]; + a[j] = temp; + + i++, j--; + } + + return i; +} diff --git a/2025.02.28/9Ex/solve.h b/2025.02.28/9Ex/solve.h new file mode 100644 index 0000000..b52d2b9 --- /dev/null +++ b/2025.02.28/9Ex/solve.h @@ -0,0 +1,9 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include + +void t9_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int findIndex(char **a, int n, char *x, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/9Ex/sort.c b/2025.02.28/9Ex/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/9Ex/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/9Ex/sort.h b/2025.02.28/9Ex/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/9Ex/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/9Ex/test_cases.json b/2025.02.28/9Ex/test_cases.json new file mode 100644 index 0000000..0317142 --- /dev/null +++ b/2025.02.28/9Ex/test_cases.json @@ -0,0 +1,231 @@ +{ + "exe": "a09.exe", + "filename": "input.txt", + "tests": [ + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" +}, +{ + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" +}, +{ + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" +}, +{ + "c": 1, + "text": "", + "expected": "" +}, +{ + "c": 1, + "text": "onlyone", + "expected": "onlyone" +}, +{ + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" +}, +{ + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" +}, +{ + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" +}, +{ + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" +}, +{ + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" +}, +{ + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" +}, +{ + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" +}, + { + "c": 1, + "text": "1\n3\n2\n4\n5", + "expected": "1\n2\n3\n4\n5" + }, + { + "c": 2, + "text": "apple\nbanana\ncherry\ndate", + "expected": "date\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "a\nabcde\nabc\nabcd", + "expected": "a\nabc\nabcd\nabcde" + }, + { + "c": 4, + "text": "a\nabcde\nabc\nabcd", + "expected": "abcde\nabcd\nabc\na" + }, + { + "c": 1, + "text": "", + "expected": "" + }, + { + "c": 1, + "text": "onlyone", + "expected": "onlyone" + }, + { + "c": 1, + "text": "same\nsame\nsame\nsame", + "expected": "same\nsame\nsame\nsame" + }, + { + "c": 1, + "text": "apple\nbanana\ncherry\ndate", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 1, + "text": "date\ncherry\nbanana\napple", + "expected": "apple\nbanana\ncherry\ndate" + }, + { + "c": 3, + "text": "a\nbbbbbbbbbbbbbbbbbbbbbbbb\nccc", + "expected": "a\nccc\nbbbbbbbbbbbbbbbbbbbbbbbb" + }, + { + "c": 1, + "text": "Apple\nbanana\nCherry\ndate", + "expected": "Apple\nCherry\nbanana\ndate" + }, + { + "c": 1, + "text": " apple\nbanana\n cherry\ndate", + "expected": " apple\n cherry\nbanana\ndate" + }, + { + "c": 1, + "text": "10\n2\n1", + "expected": "1\n10\n2" + }, + { + "c": 1, + "text": "abc\nabcd\nabcde", + "expected": "abc\nabcd\nabcde" + }, + { + "c": 2, + "text": "zoo\napple\nbanana\ncherry", + "expected": "zoo\ncherry\nbanana\napple" + }, + { + "c": 3, + "text": "abcd\na\nabcdef\nabc", + "expected": "a\nabc\nabcd\nabcdef" + }, + { + "c": 4, + "text": "abcd\na\nabcdef\nabc", + "expected": "abcdef\nabcd\nabc\na" + }, + { + "c": 3, + "text": "12345\n1234\n123\n12\n1", + "expected": "1\n12\n123\n1234\n12345" + }, + { + "c": 4, + "text": "12345\n1234\n123\n12\n1", + "expected": "12345\n1234\n123\n12\n1" + }, + { + "c": 1, + "text": "hello\nHELLO\nhElLo\nHeLLo", + "expected": "HELLO\nHeLLo\nhElLo\nhello" + }, + { + "c": 1, + "text": "A\nB\nC\nD\nE", + "expected": "A\nB\nC\nD\nE" + }, + { + "c": 2, + "text": "A\nB\nC\nD\nE", + "expected": "E\nD\nC\nB\nA" + }, + { + "c": 3, + "text": "aaa\nbb\nc", + "expected": "c\nbb\naaa" + }, + { + "c": 4, + "text": "aaa\nbb\nc", + "expected": "aaa\nbb\nc" + }, + { + "c": 1, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 4, + "text": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz" + }, + { + "c": 2, + "text": "z\nzz\nzzz\nzzzz\nzzzzz\nzzzzzz\nzzzzzzz\nzzzzzzzz", + "expected": "zzzzzzzz\nzzzzzzz\nzzzzzz\nzzzzz\nzzzz\nzzz\nzz\nz" + }, + { + "c": 1, + "text": "3\n1\n4\n1\n5\n9\n2\n6\n5\n3", + "expected": "1\n1\n2\n3\n3\n4\n5\n5\n6\n9" + }, + { + "c": 3, + "text": "hello\nworld\nhi\ncode", + "expected": "hi\ncode\nhello\nworld" + }, + { + "c": 4, + "text": "hello\nworld\nhi\ncode", + "expected": "world\nhello\ncode\nhi" + } + ] +} diff --git a/2025.02.28/9Ex/test_runner.py b/2025.02.28/9Ex/test_runner.py new file mode 100644 index 0000000..30ed462 --- /dev/null +++ b/2025.02.28/9Ex/test_runner.py @@ -0,0 +1,138 @@ +import json +import subprocess +import os +import time +import platform +from colorama import Fore, Style, init + +# Enable color support in Windows +init(autoreset=True) + +def color_text(text, color): + """Returns colored text""" + return color + text + Style.RESET_ALL + +class TestCase: + """Represents a single test case""" + def __init__(self, c, text, expected, p=None, debug=False): + self.c = c + self.text = text + self.expected = expected + self.p = p + self.debug = debug + + def get_num_lines(self): + """Returns the number of lines in the input text (n)""" + return self.text.count("\n") + 1 # +1, чтобы учесть последнюю строку + + def should_fail(self): + """Checks if the test expects a failure""" + return self.expected.lower() == "fall" + +class TestSuite: + """Handles loading and running test cases""" + def __init__(self, config_file): + self.config = self.load_config(config_file) + self.exe = self.config["exe"] + self.filename = self.config["filename"] + self.tests = [TestCase(**test) for test in self.config["tests"]] + + @staticmethod + def load_config(filename): + """Loads test cases from JSON""" + with open(filename, "r", encoding="utf-8") as f: + return json.load(f) + +def run_command(cmd, exit_on_error=False): + """Runs a shell command and handles errors""" + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + return result + except subprocess.CalledProcessError as e: + print(color_text(f"[ERROR] Command failed: {cmd}", Fore.RED)) + print(e.stderr) + if exit_on_error: + exit(1) + return None + +def wait_for_executable(exe): + """Waits for the executable file to appear after compilation""" + print(color_text(f"[WAIT] Waiting for {exe} to be compiled...", Fore.YELLOW)) + while not os.path.exists(exe): + time.sleep(0.1) # Reduce CPU usage + print(color_text(f"[READY] {exe} compiled successfully.", Fore.GREEN)) + +def parse_sorted_output(output): + """Extracts the second print_array output from program output""" + parts = output.split("New array:\n") + if len(parts) > 1: + sorted_array = parts[1].rstrip().split("\n") + sorted_array = sorted_array[:-1] # Убираем последнюю строку (Task = ... Diff = ... Elapsed = ...) + return "\n".join(sorted_array) + return "" + +def run_test(test_suite, test): + """Runs the program and checks its result""" + exe, filename = test_suite.exe, test_suite.filename + n = test.get_num_lines() # Auto-count lines in input + p = test.p if test.p is not None else n # Default p = n + + # Write input data to a file (Ensure last line has \n) + with open(filename, "w", encoding="utf-8") as f: + text = test.text.rstrip() + "\n" # Если нет \n в конце, добавляем + f.write(text) + + # Windows fix: remove './' for executables + cmd = [exe, str(test.c), str(n), str(p), filename] + if test.debug: + cmd.append("DEBUG") + + # Run the program + result = run_command(cmd) + + # Check if test expected failure + if test.should_fail(): + if result and result.returncode != 0: + print(color_text(f"[PASS] Test '{test.c}' correctly failed (expected crash).", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' should have failed but did not.", Fore.RED)) + return + + # Extract sorted array output + sorted_output = parse_sorted_output(result.stdout) if result else None + + # Check result + if sorted_output == test.expected: + print(color_text(f"[PASS] Test '{test.c}' passed.", Fore.GREEN)) + else: + print(color_text(f"[FAIL] Test '{test.c}' failed.", Fore.RED)) + print(f"Expected:\n{test.expected}") + print(f"Got:\n{sorted_output}") + if test.debug: + print(color_text("[DEBUG] Full Program Output:", Fore.YELLOW)) + print(result.stdout) + + # Cleanup test files + try: + os.remove(filename) + except (FileNotFoundError, PermissionError): + print(color_text(f"[WARNING] Could not delete {filename}, Windows may be locking it.", Fore.RED)) + +def main(): + print(color_text("[CLEAN] Cleaning project...", Fore.BLUE)) + run_command("make clean", exit_on_error=True) + + print(color_text("[BUILD] Compiling project...", Fore.BLUE)) + run_command("make", exit_on_error=True) + + test_suite = TestSuite("test_cases.json") + wait_for_executable(test_suite.exe) + + for test in test_suite.tests: + run_test(test_suite, test) + + print(color_text("[CLEAN] Final cleanup...", Fore.BLUE)) + run_command("make clean") + +if __name__ == "__main__": + main() diff --git a/2025.02.28/Example/compare.c b/2025.02.28/Example/compare.c new file mode 100644 index 0000000..b09926b --- /dev/null +++ b/2025.02.28/Example/compare.c @@ -0,0 +1,18 @@ +#include "compare.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return strcmp(b, a); } + +int up_len(const char *a, const char *b) +{ + ssize_t diff = (ssize_t)strlen(a) - (ssize_t)strlen(b); + if (diff < 0) return -1; + if (diff > 0) return 1; + return up_strcmp(a, b); +} + +int down_len(const char *a, const char *b) +{ return up_len(b, a); } diff --git a/2025.02.28/Example/compare.h b/2025.02.28/Example/compare.h new file mode 100644 index 0000000..a807307 --- /dev/null +++ b/2025.02.28/Example/compare.h @@ -0,0 +1,9 @@ +#ifndef COMPARE_H +#define COMPARE_H + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/Example/main.c b/2025.02.28/Example/main.c new file mode 100644 index 0000000..3704f7f --- /dev/null +++ b/2025.02.28/Example/main.c @@ -0,0 +1,52 @@ +int main(int argc, char *argv[]) +{ + /* ./aout c n p a.txt */ + int c, p, n; + char *name; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + + if (!(argc == 5 && sscanf(argv[2]. "%d", &n) == 1 && sscanf(argv[3], "%d" &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + } + + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + sort(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + print_array(a, n, p); + + delete_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Example/solve.c b/2025.02.28/Example/solve.c new file mode 100644 index 0000000..4eb8a43 --- /dev/null +++ b/2025.02.28/Example/solve.c @@ -0,0 +1,13 @@ +#include "solve.h" + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} diff --git a/2025.02.28/Example/sort.h b/2025.02.28/Example/sort.h new file mode 100644 index 0000000..40c768b --- /dev/null +++ b/2025.02.28/Example/sort.h @@ -0,0 +1,6 @@ +#ifndef SORT_H +#define SORT_H + +void sort(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/Krivoruchenko_SK.zip b/2025.02.28/Krivoruchenko_SK.zip new file mode 100644 index 0000000000000000000000000000000000000000..11d7e223170bc246b0844b6195c8e243828c4f63 GIT binary patch literal 11186 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 C$#E_K literal 0 HcmV?d00001 diff --git a/2025.02.28/Linux/Makefile b/2025.02.28/Linux/Makefile new file mode 100644 index 0000000..5f902ba --- /dev/null +++ b/2025.02.28/Linux/Makefile @@ -0,0 +1,15 @@ +FLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused -Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal -Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 -Wwrite-strings -Wcast-align -Wno-long-long -std=gnu99 -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs -O3 + +%.out: %.o solve.o array.o sort.o + gcc $(FLAGS) $^ -o $@ +%.o: %.c + gcc -c $(FLAGS) $< + +all: a01.out a02.out a03.out a04.out a05.out a06.out a07.out a08.out a09.out + +solve.o: solve.c solve.h +array.o: array.c array.h +sort.o: sort.c sort.h + +clean: + rm -f *.o *.out diff --git a/2025.02.28/Linux/a01.c b/2025.02.28/Linux/a01.c new file mode 100644 index 0000000..6c8e47f --- /dev/null +++ b/2025.02.28/Linux/a01.c @@ -0,0 +1,66 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./aout x c n p filename */ + int c, p, n, res, task = 1; + io_status ret; + char *name, *x, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 6 && sscanf(argv[2], "%d", &c) && sscanf(argv[3], "%d", &n) == 1 && sscanf(argv[4], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s x c n p name\n", argv[0]); + return 1; + } + x = argv[1]; + name = argv[5]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + res = t1_solve(a, n, x, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + + printf("%s : Task = %d Res = %d Elapsed = %.2f\n", argv[0], task, res, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/a02.c b/2025.02.28/Linux/a02.c new file mode 100644 index 0000000..a1eea09 --- /dev/null +++ b/2025.02.28/Linux/a02.c @@ -0,0 +1,120 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a02.out c n p_a filename_a m p_b filename_b */ + int c, p_a, n, p_b, m, diff, task = 2; + io_status ret; + char *name_a, *name_b, **arr_a, **arr_b, **arr_c; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 8 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p_a) == 1 && sscanf(argv[5], "%d", &m) && sscanf(argv[6], "%d",&p_b) && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p_a filename_a m p_b filename_b\n", argv[0]); + return 1; + } + name_a = argv[4]; + name_b = argv[7]; + cmp = f[c-1]; + + if (!(arr_a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + if (!(arr_b = (char **)malloc(m * sizeof(char *)))) + { + free(arr_a); + + printf("Not enough memory: \n"); + return 2; + } + if (!(arr_c = (char **)malloc((n+m) * sizeof(char *)))) + { + free(arr_a); + free(arr_b); + + printf("Not enough memory: \n"); + return 2; + } + + + ret = read_array(arr_a, n, name_a); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name_a); + break; + case ERROR_READ: + printf("Cannot read %s\n", name_a); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(arr_a); + free(arr_b); + free(arr_c); + return 3; + } while (0); + + ret = read_array(arr_b, m, name_b); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name_b); + break; + case ERROR_READ: + printf("Cannot read %s\n", name_b); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free_array(arr_a, n); + + free(arr_a); + free(arr_b); + free(arr_c); + return 3; + } while (0); + + print_array(arr_a, n, p_a); + printf("\n"); + print_array(arr_b, m, p_b); + + t = clock(); + t2_solve(arr_a, arr_b, arr_c, n, m, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(arr_c, n+m, cmp); + + printf("New array:\n"); + print_array(arr_c, n+m, p_a+p_b); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(arr_a, n); + free_array(arr_b, m); + + free(arr_a); + free(arr_b); + free(arr_c); + + return 0; +} diff --git a/2025.02.28/Linux/a03.c b/2025.02.28/Linux/a03.c new file mode 100644 index 0000000..c1aae34 --- /dev/null +++ b/2025.02.28/Linux/a03.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./aout x c n p filename */ + int c, p, n, res, task = 3; + io_status ret; + char *name, *x, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 6 && sscanf(argv[2], "%d", &c) && sscanf(argv[3], "%d", &n) == 1 && sscanf(argv[4], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s x c n p name\n", argv[0]); + return 1; + } + x = argv[1]; + name = argv[5]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + res = t3_solve(a, n, x, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Res = %d Elapsed = %.2f\n", argv[0], task, res, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/a04.c b/2025.02.28/Linux/a04.c new file mode 100644 index 0000000..bc0aa48 --- /dev/null +++ b/2025.02.28/Linux/a04.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a04.out c n p filename */ + int c, n, p, diff, task = 4; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t4_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/a05.c b/2025.02.28/Linux/a05.c new file mode 100644 index 0000000..964130e --- /dev/null +++ b/2025.02.28/Linux/a05.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a05.out c n p filename */ + int c, n, p, diff, task = 5; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t5_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/a06.c b/2025.02.28/Linux/a06.c new file mode 100644 index 0000000..cdf1dad --- /dev/null +++ b/2025.02.28/Linux/a06.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a06.out c n p filename */ + int c, n, p, diff, task = 6; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t6_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/a07.c b/2025.02.28/Linux/a07.c new file mode 100644 index 0000000..a5ea454 --- /dev/null +++ b/2025.02.28/Linux/a07.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a07.out c n p filename */ + int c, n, p, diff, task = 7; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t7_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/a08.c b/2025.02.28/Linux/a08.c new file mode 100644 index 0000000..988280c --- /dev/null +++ b/2025.02.28/Linux/a08.c @@ -0,0 +1,76 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a08.out c n p filename */ + int c, n, p, diff, task = 8; + io_status ret; + char *name, **a, **b; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } if (!(b = (char **)malloc(n * sizeof(char *)))) + { + + free(a); + printf("Not enough memory: \n"); + return 2; + } + memset(b, 0, (n * sizeof(char *))); + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t8_solve(a, b, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + free(b); + + return 0; +} diff --git a/2025.02.28/Linux/a09.c b/2025.02.28/Linux/a09.c new file mode 100644 index 0000000..edfeaad --- /dev/null +++ b/2025.02.28/Linux/a09.c @@ -0,0 +1,68 @@ +#include "solve.h" +#include "sort.h" +#include "array.h" +#include "io_status.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + /* ./a09.out c n p filename */ + int c, n, p, diff, task = 9; + io_status ret; + char *name, **a; + int (*cmp)(const char *, const char *); + int (*f[])(const char *, const char *) = {up_strcmp, down_strcmp, up_len, down_len}; + int len_f = sizeof(f) / sizeof(f[0]); + double t; + + if (!(argc == 5 && sscanf(argv[1], "%d", &c) && sscanf(argv[2], "%d", &n) == 1 && sscanf(argv[3], "%d", &p) == 1 && c >= 1 && c <= len_f)) + { + printf("Usage %s c n p name\n", argv[0]); + return 1; + } + name = argv[4]; + cmp = f[c-1]; + + if (!(a = (char **)malloc(n * sizeof(char *)))) + { + printf("Not enough memory: \n"); + return 2; + } + ret = read_array(a, n, name); + + do { + switch(ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + break; + case ERROR_MEM: + printf("Not enough memory"); + break; + } + free(a); + return 3; + } while (0); + + print_array(a, n, p); + t = clock(); + t9_solve(a, n, cmp); + t = (clock() - t) / CLOCKS_PER_SEC; + diff = check(a, n, cmp); + + printf("New array:\n"); + print_array(a, n, p); + printf("%s : Task = %d Diff = %d Elapsed = %.2f\n", argv[0], task, diff, t); + + free_array(a, n); + free(a); + + return 0; +} diff --git a/2025.02.28/Linux/array.c b/2025.02.28/Linux/array.c new file mode 100644 index 0000000..cd34789 --- /dev/null +++ b/2025.02.28/Linux/array.c @@ -0,0 +1,73 @@ +#include "array.h" + +io_status read_array(char* a[], int n, const char * name) +{ + char buf[LEN] = {0}; + FILE *fp = 0; + int i, j; + + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) { + if (!fgets(buf, sizeof(buf), fp)) + { + fclose(fp); + free_array(a, i); + return ERROR_READ; + } + + for (j = 0; buf[j]; j++) + { + if (buf[j] == '\n') + { + buf[j] = 0; + break; + } + } + + a[i] = (char *)malloc((j+1) * sizeof(char)); + if (!a[i]) + { + fclose(fp); + free_array(a, i); + return ERROR_MEM; + } + + strcpy(a[i], buf); + } + + fclose(fp); + return SUCCESS; +} + + +void free_array(char ** a, int n) +{ + int i; + for(i = 0; i < n; ++i) + { + if (a[i]) + { + free(a[i]); + a[i] = 0; + } + } +} + +void print_array(char ** a, int n, int m) +{ + int l = (n > m ? m : n); + int i; + for (i = 0; i < l; ++i) printf("%s\n", a[i]); +} + +int check(char **a, int n, int (*cmp)(const char *, const char *)) +{ + /* Каждый элемент больше следующего */ + int i; int count = 0; + for (i = 1; i < n; i++) + { + if ((*cmp)(a[i-1], a[i]) > 0) + count++; + } + return count; +} \ No newline at end of file diff --git a/2025.02.28/Linux/array.h b/2025.02.28/Linux/array.h new file mode 100644 index 0000000..a90dd77 --- /dev/null +++ b/2025.02.28/Linux/array.h @@ -0,0 +1,15 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include "io_status.h" + +#include +#include +#include + +io_status read_array(char *a[], int n, const char *name); +void free_array(char **a, int n); +void print_array(char **a, int n, int m); +int check(char **a, int n, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/Linux/io_status.h b/2025.02.28/Linux/io_status.h new file mode 100644 index 0000000..a51376d --- /dev/null +++ b/2025.02.28/Linux/io_status.h @@ -0,0 +1,14 @@ +#ifndef IO_STATUS_H +#define IO_STATUS_H + +#define LEN 1234 + +typedef enum _io_status +{ + SUCCESS, + ERROR_OPEN, + ERROR_READ, + ERROR_MEM +} io_status; + +#endif diff --git a/2025.02.28/Linux/solve.c b/2025.02.28/Linux/solve.c new file mode 100644 index 0000000..81f2083 --- /dev/null +++ b/2025.02.28/Linux/solve.c @@ -0,0 +1,237 @@ +// Program from 1Ex +#include "solve.h" + +int t1_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)) { + int avg = (n + (-1)*(n%2)) / 2; + int comp; + + if (n == 0) return 0; + + comp = cmp(x, a[avg]); + if (comp < 0) return t1_solve(a, avg, x, cmp); + if (comp > 0) return avg+1 + t1_solve(a+avg+1, n-(avg+1), x, cmp); + else return avg; +} + +// Program from 2Ex + +void t2_solve(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)) +{ + int i, j, k, cntr, len = n + m; // cntr - contrast + for (i = 0, j = 0, k = 0; k < len; ++k) + { + if (i >= n) + { + arr_c[k] = arr_b[j++]; + } else if (j >= m) + { + arr_c[k] = arr_a[i++]; + } else + { + cntr = cmp(arr_a[i], arr_b[j]); + if (cntr <= 0) arr_c[k] = arr_a[i++]; + else arr_c[k] = arr_b[j++]; + } + } +} + +// Program from 3Ex + +int t3_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)) { + int i = 0, j = n-1; + char *temp; + + while (1) + { + for (; i < n; i++) if (cmp(a[i], x) >= 0) break; + for (; j >= 0; j--) if (cmp(a[j], x) < 0) break; + + if (i >= j) break; + temp = a[i]; + a[i] = a[j]; + a[j] = temp; + + i++, j--; + } + + return i; +} + +// Program from 4Ex + +void t4_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + char *temp; + int i, j; + for (i=n; i > 0; --i) + { + for (j=0; j < i-1; ++j) + { + if (cmp(a[j], a[j+1]) >= 0) + { + temp = a[j]; + a[j] = a[j+1]; + a[j+1] = temp; + } + } + } +} + +// Program from 5Ex + +void t5_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + char *temp; + size_t size_c = sizeof(char); + int i, min; + for (i=0; i < n-1; ++i) + { + min = minimum(a+i*size_c, n-i, cmp)+i; + temp = a[min]; + a[min] = a[i]; + a[i] = temp; + } +} + +int minimum(char **a, int n, int (*cmp)(const char *, const char *)) +{ + int i, min=0; + if (n <= 0) return 0; + for (i = 1; i < n; ++i) + { + if (cmp(a[min], a[i]) > 0) min = i; + } + + return min; +} + +// Program from 6Ex + +void t6_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + int i; + for (i = 1; i < n; ++i) t6_append(a, i+1, a[i], t6_find(a, i, a[i], cmp)); +} + +int t6_find(char **arr, int n, char *a, int (*cmp)(const char *, const char *)) +{ + int i; + for (i=0; i index; --i) arr[i] = arr[i-1]; + arr[index] = a; +} + +// Program from 7Ex + +void t7_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + int i; + for (i = 1; i < n; ++i) t7_append(a, i+1, a[i], t7_find(a, i, a[i], cmp)); +} + +int t7_find(char **a, int n, char *x, int (*cmp)(const char *, const char *)) { + int avg = (n + (-1)*(n%2)) / 2; + int comp; + + if (n == 0) return 0; + + comp = cmp(x, a[avg]); + if (comp < 0) return t7_find(a, avg, x, cmp); + if (comp > 0) return avg+1 + t7_find(a+(avg+1), n-(avg+1), x, cmp); + else return avg; +} + +void t7_append(char **arr, int n, char *a, int index) +{ + for (int i = n-1; i > index; --i) arr[i] = arr[i-1]; + arr[index] = a; +} +// Program from 8Ex + +void t8_solve(char **a, char **b, int n, int (*cmp)(const char *, const char *)) +{ + int i = 2, j, margin; + do { + int hf_i = i/2; + for (j = 0; j < n; j += i) + { + if (n < j+i) + { + margin = n-(j+hf_i); + if (margin <= 0) break; + } else margin = hf_i; + + unite(a+j, a+(j+hf_i), b, hf_i, margin, cmp); + for (int k = 0; k < hf_i+margin; k++) a[j+k] = b[k]; + } + + i *= 2; + } while (i < n*2); +} + +void unite(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)) +{ + int i, j, k, cntr, len = n + m; // cntr - contrast + for (i = 0, j = 0, k = 0; k < len; ++k) + { + if (i >= n) + { + arr_c[k] = arr_b[j++]; + } else if (j >= m) + { + arr_c[k] = arr_a[i++]; + } else + { + cntr = cmp(arr_a[i], arr_b[j]); + if (cntr <= 0) arr_c[k] = arr_a[i++]; + else arr_c[k] = arr_b[j++]; + } + } +} + +// Program from 9Ex + +void t9_solve(char **a, int n, int (*cmp)(const char *, const char *)) +{ + while (n > 1) + { + int is_edge = 0, ind_x = findIndex(a, n, a[n/2], cmp); + if (ind_x < n-ind_x) + { + if (ind_x == 0) is_edge = 1; + t9_solve(a, ind_x, cmp); + a += ind_x + is_edge; + n -= ind_x + is_edge; + } else + { + t9_solve(a+ind_x, n-ind_x, cmp); + n = ind_x; + } + } +} + +int findIndex(char **a, int n, char *x, int (*cmp)(const char *, const char *)) +{ + int i = 0, j = n-1; + char *temp; + + while (1) + { + for (; i < n; i++) if (cmp(a[i], x) >= 0) break; + for (; j >= 0; j--) if (cmp(a[j], x) <= 0) break; + + if (i >= j) break; + temp = a[i]; + a[i] = a[j]; + a[j] = temp; + + i++, j--; + } + + return i; +} diff --git a/2025.02.28/Linux/solve.h b/2025.02.28/Linux/solve.h new file mode 100644 index 0000000..a93a43b --- /dev/null +++ b/2025.02.28/Linux/solve.h @@ -0,0 +1,42 @@ +#ifndef SOLVE_H +#define SOLVE_H + +#include +#include "array.h" +#include "sort.h" + +// Headers from 1Ex +int t1_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)); + +// Headers from 2Ex +void t2_solve(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)); + +// Headers from 3Ex +int t3_solve(char **a, int n, char *x, int (*cmp)(const char *, const char *)); + +// Headers from 4Ex +void t4_solve(char **a, int n, int (*cmp)(const char *, const char *)); + +// Headers from 5Ex +void t5_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int minimum(char **a, int n, int (*cmp)(const char *, const char *)); + +// Headers from 6Ex +void t6_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int t6_find(char **arr, int n, char *a, int (*cmp)(const char *, const char *)); +void t6_append(char **arr, int n, char *a, int index); + +// Headers from 7Ex +void t7_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int t7_find(char **arr, int n, char *a, int (*cmp)(const char *, const char *)); +void t7_append(char **arr, int n, char *a, int index); + +// Headers from 8Ex +void t8_solve(char **a, char **b, int n, int (*cmp)(const char *, const char *)); +void unite(char **arr_a, char **arr_b, char **arr_c, int n, int m, int (*cmp)(const char *, const char *)); + +// Headers from 9Ex +void t9_solve(char **a, int n, int (*cmp)(const char *, const char *)); +int findIndex(char **a, int n, char *x, int (*cmp)(const char *, const char *)); + +#endif diff --git a/2025.02.28/Linux/sort.c b/2025.02.28/Linux/sort.c new file mode 100644 index 0000000..b7ad1e9 --- /dev/null +++ b/2025.02.28/Linux/sort.c @@ -0,0 +1,23 @@ +#include "sort.h" + +int up_strcmp(const char *a, const char *b) +{ return strcmp(a, b); } + +int down_strcmp(const char *a, const char *b) +{ return -strcmp(a, b); } + +int up_len(const char *a, const char *b) +{ + int i = 0; + while (1) + { + if (a[i] == '\0' && b[i] == '\0') return strcmp(a, b); + else if (a[i] == '\0') return -1; + else if (b[i] == '\0') return 1; + + i++; + } +} +int down_len(const char *a, const char *b) +{ return -up_len(a, b); } + diff --git a/2025.02.28/Linux/sort.h b/2025.02.28/Linux/sort.h new file mode 100644 index 0000000..d28192a --- /dev/null +++ b/2025.02.28/Linux/sort.h @@ -0,0 +1,11 @@ +#ifndef SORT_H +#define SORT_H + +#include + +int up_strcmp(const char *a, const char *b); +int down_strcmp(const char *a, const char *b); +int up_len(const char *a, const char *b); +int down_len(const char *a, const char *b); + +#endif diff --git a/2025.02.28/Tasks03.pdf b/2025.02.28/Tasks03.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1a00ae5fe2e6c3959bfeb8ebd0377e177b1af7cd GIT binary patch literal 115181 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�X^dacZGY7WbKD;?M0rxB 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 bPWlc`ZVo?pf`NgVjfEbXghWJE6#D-I&^7J) literal 0 HcmV?d00001 diff --git a/2025.03.07/Example/array_io.c b/2025.03.07/Example/array_io.c new file mode 100644 index 0000000..65f4dbe --- /dev/null +++ b/2025.03.07/Example/array_io.c @@ -0,0 +1,41 @@ +#include +#include "array_io.h" + +#define MAX(n, m) (n < m ? n : m) + +io_status read_matrix(double *a, int n, int m, const char *name) +{ + int i, j; + FILE *fp; + if (!(fp = fopen(name, "r"))) return ERROR_OPEN; + for (i = 0; i < n; i++) + for (j = 0; j < m; j++) + if (fscanf(fp, "%lf", a + i * m + j) != 1) + {fclose(fp); return ERROR_READ;} + fclose(fp); + return SUCCESS; +} + +void print_matrix(const double *a, int n, int m, int p) +{ + int np = (n > p ? p : n); + int mp = (m > p ? p : m); + int i, j; + + for (i = 0; i < np; i++) + { + for (j = 0; i < mp; j++) + printf(" %10.3e", a[i * m + j]); + printf("\n"); + } +} + +void init_matrix(double *a, int n, int m) +{ + double (*f)[](int, int, int, int) = {f1, f2, f3, f4}; + int i, j; + q = f[k-1]; + for (i = 0; i < m; i++) + for (j = 0; j < n; j++) + a[i * m + j] = (*q(n, m , i, j)); +} diff --git a/2025.03.07/Example/init_f.c b/2025.03.07/Example/init_f.c new file mode 100644 index 0000000..56e7785 --- /dev/null +++ b/2025.03.07/Example/init_f.c @@ -0,0 +1,22 @@ +#include "init_f.h" + +double f1(int n, int m, int i, int j) + return MAX(n, m) - MAX(i, j) + 1; + +double f2(int n, int m, int i, int j) +{ + void n, m; + return MAX(i, j); +} + +double f3(int n, int m, int i, int j) +{ + void n, m; + return abs(i - j); +} + +double f4(int n, int m, int i, int j) +{ + void n, m; + return 1./(i+j-1); +} diff --git a/2025.03.07/Example/init_f.h b/2025.03.07/Example/init_f.h new file mode 100644 index 0000000..691aace --- /dev/null +++ b/2025.03.07/Example/init_f.h @@ -0,0 +1,9 @@ +#ifndef INIT_F_H +#define INIT_F_H + +double f1(int n, int m, int i, int j); +double f2(int n, int m, int i, int j); +double f3(int n, int m, int i, int j); +double f4(int n, int m, int i, int j); + +#endif diff --git a/2025.03.07/Example/main.c b/2025.03.07/Example/main.c new file mode 100644 index 0000000..4bdd56a --- /dev/null +++ b/2025.03.07/Example/main.c @@ -0,0 +1,63 @@ +#include +#include +#include "array_io.h" + +/* ./a.out n m p k [name] */ +int main(int argc, char *argv[]) +{ + double *a; + int n, m, p, k; + char *name = 0; + + if (!((argc == 5 || argc == 6) && + sscanf(argv[1], "%d", &n) == 1 && + sscanf(argv[2], "%d", &m) == 1 && + sscanf(argv[3], "%d", &p) == 1 && + sscanf(argv[4], "%d", &k) == 1 && + k >= 0 && k <= 4 && (!(k == 0 && argc != 6)))) + { + printf("Usage: %s n m p k [name]\n", argv[0]); + return 0; + } + if (arc == 6) name = argv[5]; + + a = (double *)malloc(n * m * sizeof(double)); + if (!a) + { + printf("Not enough memory\n"); + return 2; + } + + if (name) + { /* из файла */ + io_status ret; + ret = read_matrix(a, n, m, name); + do { + switch (ret) + { + case SUCCESS: + continue; + case ERROR_OPEN: + printf("Cannot open %s\n", name); + break; + case ERROR_READ: + printf("Cannot read %s\n", name); + } + free(a); + return 3; + } + } else init_matrix(a, n, m, k); + + printf("initial matrix:\n"); + print_matrix(a, n, m, p); + + t = clock(); + solve(a, n, m); + t = (clock() - t) / CLOCKS_PER_SEC; + + printf("Result matrix:\n"); + print_matrix(a, n, m, p); + printf("Elapsed = %.2f\n", t); + free(a); + return 0; +}