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