From 806f9d52a5111b9d778a4b07ab0cb7f903e02fe7 Mon Sep 17 00:00:00 2001 From: NosovDI Date: Fri, 27 Oct 2023 14:45:18 +0700 Subject: [PATCH] add task3 --- task3.cpp | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 task3.cpp diff --git a/task3.cpp b/task3.cpp new file mode 100644 index 0000000..9f51644 --- /dev/null +++ b/task3.cpp @@ -0,0 +1,131 @@ +#include +#include + +using namespace std; + +void print_in_hex(uint8_t byte) +{ + printf("%02X ", byte); +} + +void print_in_hex(const void* data, size_t size) +{ + const uint8_t* bytes = (const uint8_t*)data; + for (size_t i = 0; i < size; i++) + { + print_in_hex(bytes[i]); + if ((i + 1) % 8 == 0) + printf("\n"); + } + printf("\n"); +} + +void print_in_binary(uint8_t byte) +{ + for (int i = 7; i >= 0; i--) + { + printf("%d", (byte >> i) & 1); + if (i % 8 == 0) + printf(" "); + } +} + +void print_in_binary(const void* data, size_t size) +{ + const uint8_t* bytes = (const uint8_t*)data; + for (size_t i = 0; i < size; ++i) + { + print_in_binary(bytes[i]); + if ((i + 1) % 8 == 0) + printf("\n"); + } +} + +#pragma pack(1) +// Структура студента +struct Student +{ + // Имя + char _name[17]; + // год поступления + uint16_t _year; + // средний балл + float _averageGrade; + // пол (0 — женский, 1 — мужской) + uint8_t _gender : 1; + // количество пройденных курсов + uint8_t _numCourses : 7; + // указатель на старосту группы + Student* _leader; +}; +#pragma pack() + +int main() +{ + setlocale(LC_ALL, "Russian"); + Student students[3] = {0}; + + // Заполнение данных для старосты + strcpy(students[0]._name, "Ольга"); + students[0]._year = 2020; + students[0]._averageGrade = 4.9f; + students[0]._gender = 0; + students[0]._numCourses = 7; + students[0]._leader = nullptr; + + // Заполнение данных для второго студента + strcpy(students[1]._name, "Иван"); + students[1]._year = 2020; + students[1]._averageGrade = 4.5f; + students[1]._gender = 1; + students[1]._numCourses = 5; + students[1]._leader = &students[0]; + + // Заполнение данных для третьего студента + strcpy(students[2]._name, "Данил"); + students[2]._year = 2021; + students[2]._averageGrade = 4.8f; + students[2]._gender = 1; + students[2]._numCourses = 6; + students[2]._leader = &students[0]; + + // Вывод адреса и размера массива + cout << "Адрес массива: " << &students << endl; + cout << "Размер массива: " << sizeof(students) << " байт" << endl; + + // Вывод адресов и размеров всех элементов массива + for (int i = 0; i < 3; i++) + { + cout << "Адрес элемента " << i << ": " << &students[i] << endl; + cout << "Размер элемента " << i << ": " << sizeof(students[i]) << " байт" << endl; + } + + // Вывод информации о полях одного из элементов массива (не старосты) + int index = 1; + Student& student = students[index]; + cout << "Информация о студенте " << index << ":" << endl; + cout << "Значение поля _name: " << student._name << endl; + cout << "Адрес поля _name: " << &(student._name) << endl; + cout << "Смещение поля _name от начала структуры: " << offsetof(Student, _name) << " байт" << endl; + cout << "Размер поля _name: " << sizeof(student._name) << " байт" << endl; + cout << "Шестнадцатеричное представление поля _name:" << endl; + print_in_hex(student._name, sizeof(student._name)); + cout << "Двоичное представление поля _name:" << endl; + print_in_binary(student._name, sizeof(student._name)); + cout << endl; + + cout << "Элементы массива в шестнадцатеричном виде:" << endl; + cout << "(Первые " << sizeof(student._name) << " байт - поле _name):" << endl; + cout << "(Далее " << sizeof(student._year) << " байта - поле _year):" << endl; + cout << "(Далее " << sizeof(student._averageGrade) << " байта - поле _averageGrade):" << endl; + cout << "(Далее " << sizeof(uint8_t) << " байта - 1 бит для _gender и 7 бит для _numCourses):" << endl; + cout << "(Далее " << sizeof(student._leader) << " байта - поле _leader):" << endl; + for (int i = 0; i < 3; i++) + { + cout << "Студент с индексом " << i << endl; + print_in_hex(&students[i], sizeof(students[i])); + } + + system("pause"); + return 0; +} \ No newline at end of file