From 03737ad0585d0e692d8d5a03070b482575652e8a Mon Sep 17 00:00:00 2001 From: RozhinIV Date: Wed, 15 Jan 2025 12:52:11 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D0=BB(=D0=B0)=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20''?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kp3_3.cpp | 204 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 kp3_3.cpp diff --git a/kp3_3.cpp b/kp3_3.cpp new file mode 100644 index 0000000..2f09e40 --- /dev/null +++ b/kp3_3.cpp @@ -0,0 +1,204 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; + + +char nibble_to_hex(uint8_t i) +{ + assert(0x0 <= i && i <= 0xf); + const char digits[] = "0123456789abcdef"; + return digits[i]; +} + +uint8_t get_lower_nibble(uint8_t byte) +{ + return byte & 0x0F; +} + +uint8_t get_upper_nibble(uint8_t byte) +{ + return byte >> 4; +} + +void print_in_hex(uint8_t byte) +{ + cout << nibble_to_hex(get_upper_nibble(byte)) + << nibble_to_hex(get_lower_nibble(byte)); +} + +const uint8_t* as_bytes(const void* data) +{ + return reinterpret_cast(data); +} + +void print_in_hex(const void* data, size_t size) +{ + const uint8_t* bytes = as_bytes(data); + for (size_t i = 0; i < size; i++) + { + print_in_hex(bytes[i]); + if ((i + 1) % 16 == 0) + { + cout << '\n'; + } + else + { + cout << ' '; + } + } +} + +void print_in_binary(uint8_t byte) +{ + for (int bit = 7; bit >= 0; --bit) + { + cout << ((byte & (1 << bit)) ? '1' : '0'); + } +} + +void print_in_binary(const void* data, size_t size) +{ + const uint8_t* bytes = as_bytes(data); + for (size_t i = 0; i < size; i++) + { + print_in_binary(bytes[i]); + if ((i + 1) % 4 == 0) + { + cout << '\n'; + } + else + { + cout << ' '; + } + } +} + +struct Student +{ + char name[17]; + uint16_t admissionYear; + float averageGrade; + uint8_t gender : 1; + uint32_t coursesCount; + Student* groupLeader; +}; + +int main() +{ + setlocale(LC_ALL, "Russian"); + + for (uint8_t i = 0; i < 16; i++) + { + assert(nibble_to_hex(i) == (i < 10 ? '0' + i : 'a' + (i - 10))); + } + + uint8_t byte = 0xab; + + cout << "Hex: "; + print_in_hex(byte); + cout << '\n'; + + cout << "Binary: "; + print_in_binary(byte); + cout << '\n'; + + Student students[3] = + { + {"Alice Johnson", 2022, 3.5, 0, 4, nullptr}, + {"John Smith", 2021, 3.8, 1, 5, nullptr}, + {"", 0, 0.0, 0, 0, nullptr} + }; + + cout << "\n1) Адрес и размер массива: " << endl; + cout << "Адрес массива: " << static_cast(students) << endl; + cout << "Размер массива: " << sizeof(students) << " байт" << endl; + + for (int i = 0; i < 3; i++) + { + cout << "2) Адреса и размеры элементов массива (Student[" << i << "]): " << endl; + cout << "Адрес: " << static_cast(&students[i]) << endl; + cout << "Размер: " << sizeof(students[i]) << " байт" << endl; + } + + cout << "\n3) Сведения о полях одного элемента (Student[0]): " << endl; + Student& alice = students[0]; + + cout << "Имя:" << endl; + cout << "Адрес: " << static_cast(alice.name) << endl; + cout << "Смещение: " << offsetof(Student, name) << " байт" << endl; + cout << "Размер: " << sizeof(alice.name) << " байт" << endl; + cout << "Шестнадцатеричное: "; + for (size_t i = 0; i < sizeof(alice.name); i++) { + cout << hex << (static_cast(alice.name[i]) & 0xFF) << " "; + } + cout << "\nДвоичное: "; + for (size_t i = 0; i < sizeof(alice.name); i++) + { + for (int bit = 7; bit >= 0; --bit) + { + cout << ((alice.name[i] & (1 << bit)) ? '1' : '0'); + } + cout << " "; + } + cout << "\n\n"; + + cout << "Год поступления:" << endl; + cout << "Адрес: " << &alice.admissionYear << endl; + cout << "Смещение: " << offsetof(Student, admissionYear) << " байт" << endl; + cout << "Размер: " << sizeof(alice.admissionYear) << " байт" << endl; + cout << "Шестнадцатеричное: " << hex << alice.admissionYear << endl; + cout << "Двоичное: "; + for (int bit = 15; bit >= 0; --bit) + { + cout << ((alice.admissionYear & (1 << bit)) ? '1' : '0'); + } + cout << "\n\n"; + + cout << "Средний балл:" << endl; + cout << "Адрес: " << &alice.averageGrade << endl; + cout << "Смещение: " << offsetof(Student, averageGrade) << " байт" << endl; + cout << "Размер: " << sizeof(alice.averageGrade) << " байт" << endl; + cout << "Шестнадцатеричное: " << hex << *reinterpret_cast(&alice.averageGrade) << endl; + cout << "Двоичное: "; + uint32_t averageGradeBits = *reinterpret_cast(&alice.averageGrade); + for (int bit = 31; bit >= 0; --bit) + { + cout << ((averageGradeBits & (1 << bit)) ? '1' : '0'); + } + cout << "\n\n"; + + cout << "Пол:" << endl; + cout << "Значение: " << static_cast(alice.gender) << endl; + cout << "Размер (один бит): 1 бит" << endl; + cout << "\n\n"; + + cout << "Количество пройденных курсов:" << endl; + cout << "Адрес: " << &alice.coursesCount << endl; + cout << "Смещение: " << offsetof(Student, coursesCount) << " байт" << endl; + cout << "Размер: " << sizeof(alice.coursesCount) << " байт" << endl; + cout << "Шестнадцатеричное: " << hex << alice.coursesCount << endl; + cout << "Двоичное: "; + for (int bit = 31; bit >= 0; --bit) + { + cout << ((alice.coursesCount & (1 << bit)) ? '1' : '0'); + } + cout << "\n\n"; + + cout << "4) Все элементы массива в шестнадцатеричном виде:" << endl; + for (int i = 0; i < 3; i++) + { + cout << "Student[" << i << "] = "; + for (size_t j = 0; j < sizeof(students[i]); j++) + { + cout << hex << setw(2) << setfill('0') << (static_cast(reinterpret_cast(&students[i])[j]) & 0xFF) << " "; + } + cout << endl; + } + + return 0; +}