From 045ed586b71376872f1055c083b903be11c4dfee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=BD=D0=B0=20=D0=9B=D0=B8=D1=82=D0=B2=D0=B8?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0?= Date: Sun, 14 Dec 2025 15:02:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8=203=20?= =?UTF-8?q?=D0=B8=204.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab04_LitvinovaAnna/Task3/Task3.vcxproj | 2 +- .../Task3/Task3.vcxproj.filters | 2 +- lab04_LitvinovaAnna/Task3/main.cpp | 167 ++++++++++++++++++ lab04_LitvinovaAnna/Task4/Task4.vcxproj | 2 +- .../Task4/Task4.vcxproj.filters | 2 +- lab04_LitvinovaAnna/Task4/main.cpp | 149 ++++++++++++++++ 6 files changed, 320 insertions(+), 4 deletions(-) create mode 100644 lab04_LitvinovaAnna/Task3/main.cpp create mode 100644 lab04_LitvinovaAnna/Task4/main.cpp diff --git a/lab04_LitvinovaAnna/Task3/Task3.vcxproj b/lab04_LitvinovaAnna/Task3/Task3.vcxproj index 367703c..3793e18 100644 --- a/lab04_LitvinovaAnna/Task3/Task3.vcxproj +++ b/lab04_LitvinovaAnna/Task3/Task3.vcxproj @@ -19,7 +19,7 @@ - + 17.0 diff --git a/lab04_LitvinovaAnna/Task3/Task3.vcxproj.filters b/lab04_LitvinovaAnna/Task3/Task3.vcxproj.filters index 432013a..e8deb3d 100644 --- a/lab04_LitvinovaAnna/Task3/Task3.vcxproj.filters +++ b/lab04_LitvinovaAnna/Task3/Task3.vcxproj.filters @@ -15,7 +15,7 @@ - + Исходные файлы diff --git a/lab04_LitvinovaAnna/Task3/main.cpp b/lab04_LitvinovaAnna/Task3/main.cpp new file mode 100644 index 0000000..fb879db --- /dev/null +++ b/lab04_LitvinovaAnna/Task3/main.cpp @@ -0,0 +1,167 @@ +#include +#include +#include +#include +#include +#include // + +// +struct Student { + char name[17]; + uint16_t year; + float gpa; + uint8_t gender : 1; // 0 , 1 + uint8_t courses : 7; + Student* captain; +}; + +// hex +static void print_in_hex(uint8_t byte) { + static const char digits[] = "0123456789ABCDEF"; + std::cout << digits[byte >> 4] << digits[byte & 0x0F]; +} + +// hex 16 +static void print_in_hex(const void* data, size_t size) { + const uint8_t* bytes = static_cast(data); + for (size_t i = 0; i < size; ++i) { + print_in_hex(bytes[i]); + if (i + 1 != size) { + std::cout << ' '; + } + if ((i + 1) % 16 == 0 && i + 1 != size) { + std::cout << '\n'; + } + } +} + +// +static void print_in_binary(uint8_t byte) { + for (int bit = 7; bit >= 0; --bit) { + std::cout << ((byte >> bit) & 1); + } +} + +// 4 +static void print_in_binary(const void* data, size_t size) { + const uint8_t* bytes = static_cast(data); + for (size_t i = 0; i < size; ++i) { + print_in_binary(bytes[i]); + if (i + 1 != size) { + std::cout << ' '; + } + if ((i + 1) % 4 == 0 && i + 1 != size) { + std::cout << '\n'; + } + } +} + +int main() { + // + SetConsoleOutputCP(1251); + SetConsoleCP(1251); + + Student group[3]{}; + + // + strcpy_s(group[0].name, "Smirnov Denis"); // + group[0].year = 2022; + group[0].gpa = 4.6f; + group[0].gender = 1; + group[0].courses = 3; + group[0].captain = nullptr; + + // + strcpy_s(group[1].name, "Kuznetsova Al"); // + group[1].year = 2022; + group[1].gpa = 4.9f; + group[1].gender = 0; + group[1].courses = 3; + group[1].captain = &group[0]; + + strcpy_s(group[2].name, "Belova Irina"); // + group[2].year = 2021; + group[2].gpa = 4.3f; + group[2].gender = 0; + group[2].courses = 4; + group[2].captain = &group[0]; + + std::cout << "1) \n"; + std::cout << " : " << static_cast(group) << '\n'; + std::cout << " : " << sizeof(group) << " \n\n"; + + std::cout << "2) \n"; + for (int i = 0; i < 3; ++i) { + std::cout << " #" << i << " : " << static_cast(&group[i]) + << " : " << sizeof(Student) << " \n"; + } + std::cout << '\n'; + + std::cout << "3) ( )\n"; + std::cout << " name\n"; + std::cout << " : " << static_cast(group[1].name) << '\n'; + std::cout << " : " << offsetof(Student, name) << '\n'; + std::cout << " : " << sizeof(group[1].name) << " \n"; + std::cout << " hex:\n"; + print_in_hex(group[1].name, sizeof(group[1].name)); + std::cout << "\n bin:\n"; + print_in_binary(group[1].name, sizeof(group[1].name)); + std::cout << "\n\n"; + + std::cout << " year\n"; + std::cout << " : " << static_cast(&group[1].year) << '\n'; + std::cout << " : " << offsetof(Student, year) << '\n'; + std::cout << " : " << sizeof(group[1].year) << " \n"; + std::cout << " hex:\n"; + print_in_hex(&group[1].year, sizeof(group[1].year)); + std::cout << "\n bin:\n"; + print_in_binary(&group[1].year, sizeof(group[1].year)); + std::cout << "\n\n"; + + std::cout << " gpa\n"; + std::cout << " : " << static_cast(&group[1].gpa) << '\n'; + std::cout << " : " << offsetof(Student, gpa) << '\n'; + std::cout << " : " << sizeof(group[1].gpa) << " \n"; + std::cout << " hex:\n"; + print_in_hex(&group[1].gpa, sizeof(group[1].gpa)); + std::cout << "\n bin:\n"; + print_in_binary(&group[1].gpa, sizeof(group[1].gpa)); + std::cout << "\n\n"; + + std::cout << " captain\n"; + std::cout << " : " << static_cast(&group[1].captain) << '\n'; + std::cout << " : " << offsetof(Student, captain) << '\n'; + std::cout << " : " << sizeof(group[1].captain) << " \n"; + std::cout << " hex:\n"; + print_in_hex(&group[1].captain, sizeof(group[1].captain)); + std::cout << "\n bin:\n"; + print_in_binary(&group[1].captain, sizeof(group[1].captain)); + std::cout << "\n\n"; + + std::cout << "4) hex\n"; + for (int i = 0; i < 3; ++i) { + std::cout << " #" << i + << (i == 0 ? " ()" : "") << '\n'; + std::cout << " :\n"; + print_in_hex(&group[i], sizeof(Student)); + std::cout << '\n'; + std::cout << " name:\n"; + print_in_hex(&group[i].name, sizeof(group[i].name)); + std::cout << '\n'; + std::cout << " year:\n"; + print_in_hex(&group[i].year, sizeof(group[i].year)); + std::cout << '\n'; + std::cout << " gpa:\n"; + print_in_hex(&group[i].gpa, sizeof(group[i].gpa)); + std::cout << '\n'; + uint8_t packed = static_cast((group[i].gender << 7) | group[i].courses); + std::cout << " gender+courses ():\n"; + print_in_hex(&packed, sizeof(packed)); + std::cout << '\n'; + std::cout << " captain:\n"; + print_in_hex(&group[i].captain, sizeof(group[i].captain)); + std::cout << "\n\n"; + } + + return 0; +} \ No newline at end of file diff --git a/lab04_LitvinovaAnna/Task4/Task4.vcxproj b/lab04_LitvinovaAnna/Task4/Task4.vcxproj index 4db3710..ee1da7e 100644 --- a/lab04_LitvinovaAnna/Task4/Task4.vcxproj +++ b/lab04_LitvinovaAnna/Task4/Task4.vcxproj @@ -19,7 +19,7 @@ - + 17.0 diff --git a/lab04_LitvinovaAnna/Task4/Task4.vcxproj.filters b/lab04_LitvinovaAnna/Task4/Task4.vcxproj.filters index 432013a..e8deb3d 100644 --- a/lab04_LitvinovaAnna/Task4/Task4.vcxproj.filters +++ b/lab04_LitvinovaAnna/Task4/Task4.vcxproj.filters @@ -15,7 +15,7 @@ - + Исходные файлы diff --git a/lab04_LitvinovaAnna/Task4/main.cpp b/lab04_LitvinovaAnna/Task4/main.cpp new file mode 100644 index 0000000..796c236 --- /dev/null +++ b/lab04_LitvinovaAnna/Task4/main.cpp @@ -0,0 +1,149 @@ +#include +#include +#include +#include +#include +#include // + +// ( ) +constexpr std::size_t kMaxFilenameLen = 260; +constexpr std::size_t kMaxQueryLen = 256; + +// (Windows) +constexpr const char* kForbidden = "*\"<>?|"; + +// +bool validate_filename(const char* name) { + // + for (const char* p = kForbidden; *p; ++p) { + if (std::strchr(name, *p)) { + return false; + } + } + + // + const char* colon = std::strchr(name, ':'); + if (colon) { + if (colon != name + 1) return false; // + if (!std::isalpha(static_cast(name[0]))) return false; + if (colon[1] != '\\') return false; // + } + + // .txt ( ) + const char* dot = std::strrchr(name, '.'); + if (dot) { + if (std::strlen(dot) != 4) return false; // ".txt" + char ext[5]{}; + // : strncpy_s strncpy + strncpy_s(ext, sizeof(ext), dot, 4); + for (char& c : ext) c = static_cast(std::tolower(static_cast(c))); + if (std::strcmp(ext, ".txt") != 0) return false; + } + + return true; +} + +// .txt, +void ensure_txt_extension(char* name, size_t bufferSize) { + if (std::strrchr(name, '.') == nullptr) { + // : strcat_s strcat + strcat_s(name, bufferSize, ".txt"); + } +} + +// sub text +int count_occurrences(const char* text, const char* sub) { + int count = 0; + const std::size_t len = std::strlen(sub); + if (len == 0) return 0; + + const char* pos = text; + while ((pos = std::strstr(pos, sub)) != nullptr) { + ++count; + pos += len; + } + return count; +} + +int main() { + // + SetConsoleOutputCP(1251); + SetConsoleCP(1251); + + // 4.1: ( ) + char filename[kMaxFilenameLen]{}; + std::cout << " : "; + std::cin.getline(filename, kMaxFilenameLen); + + // 4.2: + if (!validate_filename(filename)) { + std::cout << " \n"; + return 1; + } + + // 4.3: .txt + ensure_txt_extension(filename, sizeof(filename)); + if (!validate_filename(filename)) { + std::cout << " .txt\n"; + return 1; + } + + // 4.4: + FILE* f = nullptr; + // : fopen_s fopen + if (fopen_s(&f, filename, "rb") != 0 || !f) { + std::cout << " : " << filename << "\n"; + return 1; + } + + if (std::fseek(f, 0, SEEK_END) != 0) { + std::cout << " \n"; + std::fclose(f); + return 1; + } + + long sz = std::ftell(f); + if (sz < 0) { + std::cout << " \n"; + std::fclose(f); + return 1; + } + std::rewind(f); + + char* buffer = static_cast(std::malloc(static_cast(sz) + 1)); + if (!buffer) { + std::cout << " \n"; + std::fclose(f); + return 1; + } + + std::size_t read = std::fread(buffer, 1, static_cast(sz), f); + if (read != static_cast(sz)) { + std::cout << " \n"; + std::free(buffer); + std::fclose(f); + return 1; + } + buffer[sz] = '\0'; + std::fclose(f); + + // 4.5: ( ) + char query[kMaxQueryLen]{}; + std::cout << " : "; + std::cin.getline(query, kMaxQueryLen); + + // 4.6: + const std::size_t qlen = std::strlen(query); + if (qlen == 0) { + std::cout << " \n"; + std::free(buffer); + return 1; + } + + int hits = count_occurrences(buffer, query); + std::cout << " \"" << query << "\": " << hits << "\n"; + + // 4.7: + std::free(buffer); + return 0; +} \ No newline at end of file