diff --git a/README.md b/README.md index 2d70a2c..adc4191 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Информационные системы и технологии -**БрГТУ | Кафедра интеллектуальных информационных технологий | 2023** +**БрГТУ | Кафедра интеллектуальных информационных технологий | 2026** > Дисциплина: «Информационные системы и технологии» > Специальность: 6-05-0612-03 «Системы управления информацией» diff --git a/lab1/variants/variant01/report.md b/lab1/variants/variant01/report.md deleted file mode 100644 index 657e7a2..0000000 --- a/lab1/variants/variant01/report.md +++ /dev/null @@ -1,67 +0,0 @@ -# Отчёт по лабораторной работе №1 -## Частотная таблица файла. Энтропия - -**Студент:** Иванов Иван Иванович -**Группа:** ИУС-21 -**Вариант:** 01 -**Дата выполнения:** 01.02.2024 - ---- - -## 1. Цель работы - -Изучить понятие энтропии дискретного источника информации. Научиться строить частотную таблицу символов файла и вычислять энтропию по формуле Шеннона. - ---- - -## 2. Краткое описание алгоритма - -1. Считываем файл в строку. -2. Подсчитываем, сколько раз встречается каждый символ (`Counter`). -3. Вычисляем вероятность каждого символа: `p_i = count_i / N`. -4. Вычисляем энтропию: `H = -sum(p_i * log2(p_i))`. -5. Выводим топ-5 символов по убыванию частоты (вариант 1). - ---- - -## 3. Описание программы - -- `build_frequency_table(text)` — возвращает `Counter` с частотами символов. -- `compute_entropy(freq_table, total)` — вычисляет энтропию H. -- `main()` — читает файл, вызывает функции, выводит результат. - ---- - -## 4. Пример работы программы - -Входные данные (`test.txt`, 246 символов): - -``` -Информационная система — это взаимосвязанная совокупность средств... -``` - -Вывод программы: - -``` -Файл: test.txt -Всего символов: 246 -Уникальных символов: 38 -Энтропия H = 4.1203 бит -Макс. энтропия Hmax = 5.2479 бит -Избыточность R = 0.2148 (21.48%) - -Топ-5 символов по частоте: -Символ Частота Вероятность --------------------------------- -' ' 45 0.1829 -'о' 24 0.0976 -'и' 19 0.0772 -'а' 18 0.0732 -'е' 15 0.0610 -``` - ---- - -## 5. Выводы - -В ходе работы была реализована программа для вычисления энтропии текстового файла. Пробел является самым частым символом (18.3%), что характерно для естественного текста. Энтропия составила 4.12 бит при максимально возможной 5.25 бит, что означает избыточность 21.5% — текст на русском языке содержит статистическую структуру, которую можно использовать для сжатия. diff --git a/lab1/variants/variant08/report.md b/lab1/variants/variant08/report.md new file mode 100644 index 0000000..59b02b4 --- /dev/null +++ b/lab1/variants/variant08/report.md @@ -0,0 +1,92 @@ +# Отчёт по лабораторной работе №1 +## Частотная таблица файла. Энтропия + +**Студент:** Дудко Даниил Валерьевич +**Группа:** АС-70 +**Вариант:** 08 +**Дата выполнения:** 12.04.2026 + +--- + +## 1. Цель работы + +Изучить понятие энтропии дискретного источника информации. Научиться строить частотную таблицу символов файла и вычислять энтропию по формуле Шеннона. + +--- + +## 2. Краткое описание алгоритма + +1. Считываем имя входного файла из аргументов командной строки. +2. Открываем файл в бинарном режиме и определяем его размер. +3. Загружаем весь файл в память. +4. Подсчитываем частоты байтов, игнорируя \n, \r, \t. +5. Формируем список встречающихся символов и их частот. +6. Сортируем символы по убыванию частоты. +7. Считаем общее число учтённых символов. +8. Вычисляем вероятности появления символов. +9. Вычисляем энтропию, максимальную энтропию и избыточность. +10. Выводим результаты в консоль. +11. Записываем данные (символ, частота, вероятность) в CSV-файл. + +--- + +## 3. Описание программы + +- Программа запускается в `main(argc, argv)` и считывает имя входного файла из аргументов командной строки. +- Файл открывается в бинарном режиме, определяется его размер и содержимое загружается в память. +- Подсчитывается частота появления каждого байта (0–255) с помощью массива `cnt[256]`, при этом игнорируются символы `\n, \r, \t`. +- Формируется список пар `(символ, частота)` только для встречающихся символов. +- Список сортируется по убыванию частоты. +- Вычисляется общее количество обработанных символов. +- Для каждого символа вычисляется вероятность: `p_i = count_i / total`. +- Вычисляется энтропия: `H = -Σ(p_i * log2(p_i))`. +- Вычисляется максимальная энтропия: `Hmax = log2(N)`, где `N` — число уникальных символов. +- Вычисляется избыточность: `R = 1 - H / Hmax`. +- Результаты выводятся в консоль. +- Формируется CSV-файл `output.csv` со столбцами. + +--- + +## 4. Пример работы программы + +Входные данные (`test.txt`, 246 символов): + +``` +Т. БОРЩЕВСКАЯ + +ОПЕРАЦИЯ "ВЫРОДОК В КОСМОСЕ". ПОПЫТКА РЕКОНСТРУКЦИИ + +(Описание очень старой игрушки - год эдак 91-й) + +ДОКУМЕНТ N 1. ОБЪЯСНИТЕЛЬНАЯ СЛЕДОВАТЕЛЮ + + Осознавая, что по моей вине один из представителей инопланетной +цивилизации... +``` + +Вывод программы: + +``` +Файл: test_input.txt +Всего символов: 4990 +Уникальных символов: 77 +Энтропия H = 4.7374 бит +Макс. энтропия Hmax = 6.2668 бит +Избыточность R = 0.2441 (24.4050%) +Файл output.csv создан + +Топ-5 символов по частоте: +Символ Частота Вероятность +-------------------------------- +' ' 955 0.199399 +'о' 421 0.084369 +'e' 311 0.062325 +'а' 285 0.057114 +'н' 243 0.048697 +``` + +--- + +## 5. Выводы + +В ходе работы была реализована программа для анализа текстового файла и вычисления его информационных характеристик. Для входного файла test_input.txt общее количество символов составило 4990, при этом было выявлено 77 уникальных символов. Рассчитанная энтропия составила H = 4.7374 бит, при максимальной возможной энтропии Hmax = 6.2668 бит, что показывает, что распределение символов не является равномерным. Избыточность составила R = 0.2441 (24.4050%), что указывает на наличие статистической структуры в тексте и потенциальную возможность его сжатия. Результаты анализа были сохранены в файл output.csv. diff --git a/lab1/variants/variant08/solution.cpp b/lab1/variants/variant08/solution.cpp new file mode 100644 index 0000000..d46b6ff --- /dev/null +++ b/lab1/variants/variant08/solution.cpp @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +int main(int argc, char* argv[]) { + SetConsoleOutputCP(1251); + SetConsoleCP(1251); + + // чек аргументов командной строки + if (argc < 2) { + cout << "Использование: program input.txt\n"; + return 1; + } + + string name = argv[1]; + + // открытие файла в бинарном режиме и переход в конец чтобы сразу узнать размер файла + ifstream f(name, ios::binary | ios::ate); + if (!f) { + cout << "Файл не найден\n"; + return 1; + } + + // размер файла в байтах + long long size = f.tellg(); + f.seekg(0); // возврат в начало файла для чтения + + // чтение всего файла в память + vector data(size); + if (size) { + f.read((char*)data.data(), size); + } + f.close(); + + // чвстоты + long long cnt[256] = { 0 }; + + for (auto b : data) { + // игнорируем служебные спец символы + if (b == '\n' || b == '\r' || b == '\t') + continue; + + cnt[b]++; + } + + // вектор для тех символов которые встретились + vector> v; + + for (int i = 0; i < 256; i++) { + if (cnt[i]) { + v.emplace_back(i, cnt[i]); + } + } + + // сортировка по убыванию + sort(v.begin(), v.end(), + [](auto a, auto b) { + return a.second > b.second; + }); + + long long total = 0; + + // общее количество символов + for (auto& p : v) total += p.second; + + double h = 0.0; + vector probabilities; + + // вычисление вероятностей и энтропии + for (auto& p : v) { + double pi = (double)p.second / total; + probabilities.push_back(pi); + h -= pi * log2(pi); + } + + int N = v.size(); + + // макс энтропия + double h_max = (N > 0) ? log2(N) : 0; + + // избыточность + double R = (h_max > 0) ? (1 - h / h_max) : 0; + + cout << "Файл: " << name << endl; + cout << "Всего символов: " << total << endl; + cout << "Уникальных символов: " << N << endl; + + cout << fixed << setprecision(4); + cout << "Энтропия H = " << h << " бит" << endl; + cout << "Макс. энтропия Hmax = " << h_max << " бит" << endl; + cout << "Избыточность R = " << R << " (" << R * 100 << "%)" << endl; + + ofstream csv("output.csv"); + + // заголовок csv файла + csv << "символ;частота;вероятность\n"; + + for (size_t i = 0; i < v.size(); i++) { + int byte = v[i].first; + long long count = v[i].second; + double pi = probabilities[i]; + + // байт в символ + string symbol(1, (char)byte); + + // кавычки для csv + if (symbol == "\"") { + symbol = "\"\""; + } + + // запись строки csv + csv << "\"" << symbol << "\"" + << ";" << count + << ";" << fixed << setprecision(6) << pi + << "\n"; + } + + csv.close(); + + cout << "Файл output.csv создан\n"; + + return 0; +} \ No newline at end of file diff --git a/lab1/variants/variant08/test_input.txt b/lab1/variants/variant08/test_input.txt new file mode 100644 index 0000000..7147646 --- /dev/null +++ b/lab1/variants/variant08/test_input.txt @@ -0,0 +1,92 @@ + . + + " ". + + ( - 91-) + + + N 1. + + , + , - , : + + , . + , + . + ( +, ) + ( +), ( ) + , +. , + . + + + N 2. + + 1-. + - ! ! - +- ... + . , , - +- . + + 2-. + - . ? - + . - - , +. + + 8- + ! , ! + . () . + , . , + . ... , . , +. + . +- . , , + . , . + (- , +), - . , + . , ... + , ( + ). . + . , , + . , , , +" ", ? + . , +, , . + (, ! -! +, - + - ), + , +. ? . + , ... , + . , ? + - , + , , - - +, , +- - , . -! + . ! +- . , ? +, . , ? ? +, "" !.. + , ! ? +... , - , , + . . . ! + . ? ? + ? , + . , , + . ? . +, ? ? + . + ? , + ? ? ? + . , ?! + + + N 3. + " " + + , +, + . + diff --git "a/lab1/variants/variant08/\320\275\320\265\320\276\320\261\321\217\320\267/output.csv" "b/lab1/variants/variant08/\320\275\320\265\320\276\320\261\321\217\320\267/output.csv" new file mode 100644 index 0000000..b530ae3 --- /dev/null +++ "b/lab1/variants/variant08/\320\275\320\265\320\276\320\261\321\217\320\267/output.csv" @@ -0,0 +1,78 @@ +;; +" ";995;0.199399 +"";421;0.084369 +"";311;0.062325 +"";285;0.057114 +"";243;0.048697 +"";241;0.048297 +"";232;0.046493 +"";163;0.032665 +"";154;0.030862 +"";152;0.030461 +"";119;0.023848 +"";110;0.022044 +"";107;0.021443 +"";103;0.020641 +"";101;0.020240 +"";90;0.018036 +"";77;0.015431 +"";77;0.015431 +"";71;0.014228 +"";71;0.014228 +".";68;0.013627 +",";63;0.012625 +"";55;0.011022 +"";50;0.010020 +"";49;0.009820 +"";40;0.008016 +"";34;0.006814 +"";32;0.006413 +"-";29;0.005812 +"";27;0.005411 +"";26;0.005210 +"";25;0.005010 +"";23;0.004609 +"";21;0.004208 +"";20;0.004008 +"";20;0.004008 +"?";19;0.003808 +"";18;0.003607 +"";18;0.003607 +"";18;0.003607 +"";16;0.003206 +"";15;0.003006 +"";14;0.002806 +"";14;0.002806 +"";13;0.002605 +"";13;0.002605 +"!";12;0.002405 +"";10;0.002004 +"";9;0.001804 +"""";8;0.001603 +"(";8;0.001603 +")";8;0.001603 +"";8;0.001603 +"";8;0.001603 +"";8;0.001603 +"";6;0.001202 +"";5;0.001002 +"";5;0.001002 +"";4;0.000802 +"";3;0.000601 +"1";3;0.000601 +"N";3;0.000601 +"";2;0.000401 +"";2;0.000401 +"2";2;0.000401 +"";2;0.000401 +"3";1;0.000200 +"";1;0.000200 +":";1;0.000200 +"9";1;0.000200 +"8";1;0.000200 +"";1;0.000200 +"";1;0.000200 +"";1;0.000200 +"";1;0.000200 +"";1;0.000200 +"";1;0.000200 diff --git "a/lab1/variants/variant08/\320\275\320\265\320\276\320\261\321\217\320\267/solution.exe" "b/lab1/variants/variant08/\320\275\320\265\320\276\320\261\321\217\320\267/solution.exe" new file mode 100644 index 0000000..0ca7b22 Binary files /dev/null and "b/lab1/variants/variant08/\320\275\320\265\320\276\320\261\321\217\320\267/solution.exe" differ diff --git a/lab1/variants/variant01/solution.py "b/lab1/variants/variant08/\320\275\320\265\320\276\320\261\321\217\320\267/solution.py" similarity index 100% rename from lab1/variants/variant01/solution.py rename to "lab1/variants/variant08/\320\275\320\265\320\276\320\261\321\217\320\267/solution.py" diff --git a/lab2/variants/variant08/report.md b/lab2/variants/variant08/report.md new file mode 100644 index 0000000..0494703 --- /dev/null +++ b/lab2/variants/variant08/report.md @@ -0,0 +1,112 @@ +# Отчёт по лабораторной работе №2 +## Кодовые таблицы для сжатия файла + +**Студент:** Дудко Даниил Валерьевич +**Группа:** АС-70 +**Вариант:** 08 +**Дата выполнения:** 13.04.2026 + +--- + +## 1. Цель работы + +Изучить методы статистического кодирования: код Хаффмана и код Шеннона-Фано. Построить кодовые таблицы и оценить степень сжатия. + +--- + +## 2. Краткое описание алгоритма + +1. Считываем имя входного файла из аргументов командной строки. +2. Открываем файл в бинарном режиме и определяем его размер. +3. Загружаем весь файл в память. +4. Подсчитываем частоты всех байтов, игнорируя символы переноса строки и табуляции (\n, \r, \t). +5. Формируем список символов, которые встречаются в файле, и их частоты. +6. Сортируем символы по убыванию частоты. +7. Применяем алгоритм Шеннона–Фано: + - рекурсивно делим набор символов на две группы с максимально близкими суммарными частотами; + - левой группе добавляем бит 0, правой — бит 1; + - продолжаем деление до получения уникальных кодов. +8. Формируем кодовую таблицу (символ → частота → код → длина кода). +9. Вычисляем общее количество символов. +10. Вычисляем среднюю длину кодового слова. +11. Вычисляем энтропию источника сообщения. +12. Вычисляем коэффициент сжатия. +13. Выводим кодовую таблицу и статистические характеристики в консоль. +14. Выводим шаги разбиения, выполненные в алгоритме Шеннона–Фано. + +--- + +## 3. Описание программы + +- Программа запускается в `main(argc, argv)` и считывает имя входного файла из аргументов командной строки. +- Файл открывается в бинарном режиме, определяется его размер и всё содержимое загружается в память. +- Подсчитывается частота появления каждого байта (0–255) с помощью массива `cnt[256]`, при этом игнорируются символы `\n, \r, \t`. +- Формируется список структур `Node`, содержащих символ и его частоту (только для реально встречающихся символов). +- Список сортируется по убыванию частоты. +- Запускается алгоритм Шеннона–Фано (`shannonFano`), который рекурсивно делит набор символов на две группы с максимально близкими суммарными частотами. +- При каждом разбиении левой группе добавляется бит `0`, правой — бит `1`. +- Рекурсия продолжается до тех пор, пока каждый символ не получит свой уникальный код. +- В процессе работы сохраняются шаги разбиения групп для последующего вывода. +- Формируется кодовая таблица: символ, частота, полученный код и длина кода. +- Вычисляется общее количество обработанных символов. +- Для каждого символа вычисляется вероятность появления и средняя длина кодового слова. +- Вычисляется средняя длина кода `L` и энтропия источника `H`. +- Вычисляется коэффициент сжатия `K = 8 / L`. +- Результаты (кодовая таблица, статистика и шаги разбиения) выводятся в консоль. + +--- + +## 4. Пример работы программы + +Входные данные (`test_input.txt`, 4729 символов): + +``` +Т. БОРЩЕВСКАЯ + +ОПЕРАЦИЯ "ВЫРОДОК В КОСМОСЕ". ПОПЫТКА РЕКОНСТРУКЦИИ + +(Описание очень старой игрушки - год эдак 91-й) + +ДОКУМЕНТ N 1. ОБЪЯСНИТЕЛЬНАЯ СЛЕДОВАТЕЛЮ + + Осознавая, что по моей вине один из представителей инопланетной +цивилизации... +``` + +Вывод программы: + +``` +Файл: test_input.txt +Метод: Шеннон-Фано + +Кодовая таблица (топ-5 символов по частоте): +Символ | Частота | Код | Длина +' ' | 995 | 000 | 3 +'о' |421 | 001 | 3 +'е' |311 | 0100 | 4 +'а' |285 | 0101 | 4 +'н' |243 | 0110 | 4 + + +Средняя длина кодового слова L = 4.8002 бит +Энтропия H = 4.7374 бит +Коэффициент сжатия K = 1.6666 + +Шаги разбиения на группы (первые 10): +Группа [0-5] | [6-76] +Группа [0-1] | [2-5] +Группа [0-0] | [1-1] +Группа [2-3] | [4-5] +Группа [2-2] | [3-3] +Группа [4-4] | [5-5] +Группа [6-14] | [15-76] +Группа [6-8] | [9-14] +Группа [6-6] | [7-8] +Группа [7-7] | [8-8] +``` + +--- + +## 5. Выводы + +В ходе лабораторной работы был реализован алгоритм кодирования Шеннона–Фано. Программа считывает входной файл test_input.txt в бинарном режиме, подсчитывает частоты появления символов (исключая служебные \n, \r, \t), формирует список символов и сортирует его по убыванию частоты. Далее выполняется рекурсивное разбиение множества символов на две группы с максимально близкими суммарными частотами, при котором левой группе присваивается бит 0, правой — 1, что позволяет сформировать префиксные коды. После построения кодовой таблицы вычисляются основные характеристики: средняя длина кода L = 4.8002 бит, энтропия H = 4.7374 бит и коэффициент сжатия K = 1.6666. Полученные результаты показывают эффективность метода Шеннона–Фано для сжатия текстовых данных. \ No newline at end of file diff --git a/lab2/variants/variant08/solution.cpp b/lab2/variants/variant08/solution.cpp new file mode 100644 index 0000000..e8b4840 --- /dev/null +++ b/lab2/variants/variant08/solution.cpp @@ -0,0 +1,164 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +// структура одного символа и его кода +struct Node { + unsigned char symbol; // сам символ + long long freq; // частота появления + string code; // код шенона-фано +}; + +// для хранения шагов разбиения +vector steps; + +// алгоритм шенона-фано +void shannonFano(vector& v, int l, int r) { + if (l >= r) return; + + long long total = 0; + + // считаем суммарную частоту текущего диапазона + for (int i = l; i <= r; i++) total += v[i].freq; + + long long leftSum = 0; + int bestSplit = l; + long long bestDiff = LLONG_MAX; + + // ищем оптимальную точку разбиения + for (int i = l; i < r; i++) { + leftSum += v[i].freq; + long long diff = abs(leftSum - (total - leftSum)); + + if (diff < bestDiff) { + bestDiff = diff; + bestSplit = i; + } + } + + // сохраняем шаг разбиения + steps.push_back("Группа [" + to_string(l) + "-" + to_string(bestSplit) + + "] | [" + to_string(bestSplit + 1) + "-" + to_string(r) + "]"); + + // добавляем биты кодов лево - 0 право - 1 + for (int i = l; i <= bestSplit; i++) v[i].code += "0"; + for (int i = bestSplit + 1; i <= r; i++) v[i].code += "1"; + + // рекурсивно делим дальше + shannonFano(v, l, bestSplit); + shannonFano(v, bestSplit + 1, r); +} + +int main(int argc, char* argv[]) { + SetConsoleOutputCP(1251); + SetConsoleCP(1251); + + // проверка аргументов + if (argc < 2) { + cout << "Использование: solution.exe input.txt\n"; + return 1; + } + + string filename = argv[1]; + + // открываем файл в бинарном режиме и сразу в конец + ifstream f(filename, ios::binary | ios::ate); + if (!f) { + cout << "Файл не найден: " << filename << endl; + return 1; + } + + long long fileSize = f.tellg(); + f.seekg(0); + + // читаем весь файл в память + vector data(fileSize); + if (fileSize) f.read(reinterpret_cast(data.data()), fileSize); + f.close(); + + // массив частот символов + long long cnt[256] = { 0 }; + + // считаем частоты + for (auto b : data) { + if (b == '\n' || b == '\r' || b == '\t') continue; + cnt[b]++; + } + + // список символов которые встречаются в файле + vector v; + for (int i = 0; i < 256; i++) { + if (cnt[i] > 0) { + v.push_back({ (unsigned char)i, cnt[i], "" }); + } + } + + if (v.empty()) { + cout << "Нет данных\n"; + return 0; + } + + // сортировка по убыванию частоты + sort(v.begin(), v.end(), [](const Node& a, const Node& b) { + return a.freq > b.freq; + }); + + // построение кодов + shannonFano(v, 0, (int)v.size() - 1); + + cout << "Файл: " << filename << endl; + cout << "Метод: Шеннон-Фано" << endl; + + cout << "\nКодовая таблица:" << endl; + cout << "Символ | Частота | Код | Длина" << endl; + + long long totalSymbols = 0; + for (const auto& x : v) totalSymbols += x.freq; + + double L = 0.0; // средняя длина кода + double H = 0.0; // энтропия + + for (const auto& x : v) { + double p = static_cast(x.freq) / totalSymbols; + int len = (int)x.code.length(); + + // средняя длина + L += p * len; + + // энтропия + if (p > 0) H -= p * log2(p); + + // вывод символов + cout << "'"; + if (x.symbol == '\'') cout << "\\'"; + else if (x.symbol == '\\') cout << "\\\\"; + else cout << x.symbol; + cout << "' |"; + + cout << setw(8) << x.freq << " | " + << left << setw(12) << x.code + << " | " << len << endl; + } + + // коэффициент сжатия + double K = (L > 0) ? (8.0 / L) : 0.0; + + cout << fixed << setprecision(4); + cout << "\nСредняя длина кодового слова L = " << L << " бит" << endl; + cout << "Энтропия H = " << H << " бит" << endl; + cout << "Коэффициент сжатия K = " << K << endl; + + cout << "\nШаги разбиения на группы:" << endl; + for (const auto& s : steps) { + cout << s << endl; + } + + return 0; +} \ No newline at end of file diff --git a/lab2/variants/variant08/test_input.txt b/lab2/variants/variant08/test_input.txt new file mode 100644 index 0000000..7147646 --- /dev/null +++ b/lab2/variants/variant08/test_input.txt @@ -0,0 +1,92 @@ + . + + " ". + + ( - 91-) + + + N 1. + + , + , - , : + + , . + , + . + ( +, ) + ( +), ( ) + , +. , + . + + + N 2. + + 1-. + - ! ! - +- ... + . , , - +- . + + 2-. + - . ? - + . - - , +. + + 8- + ! , ! + . () . + , . , + . ... , . , +. + . +- . , , + . , . + (- , +), - . , + . , ... + , ( + ). . + . , , + . , , , +" ", ? + . , +, , . + (, ! -! +, - + - ), + , +. ? . + , ... , + . , ? + - , + , , - - +, , +- - , . -! + . ! +- . , ? +, . , ? ? +, "" !.. + , ! ? +... , - , , + . . . ! + . ? ? + ? , + . , , + . ? . +, ? ? + . + ? , + ? ? ? + . , ?! + + + N 3. + " " + + , +, + . + diff --git a/theory/README.md b/theory/README.md index 030249a..b700e37 100644 --- a/theory/README.md +++ b/theory/README.md @@ -2,7 +2,7 @@ **БрГТУ | Кафедра интеллектуальных информационных технологий | 2023** Специальность: 6-05-0612-03 «Системы управления информацией» -Составитель: Пролиско Е.Е. +Составитель: Шорох Д.В. (по конспектам Пролиско Е.Е.) ---