#inlude #include #include #include #include #include using namespace std; struct Student { char name[17]; // Массив из 17 байт uint16_t year; // целое число без знака 2 байта float average_score; // успеваемость, представлена числом с плавающей точкой unsigned int gender : 1; // пол студента, 0 - мужской, 1 - женский uint16_t courses; // количество пройденных курсов Student* leader; // указатель на старосту // вывод данных в шестнадцатеричном формате void print_hex(const void* data, size_t size) const { const uint8_t* bytes = reinterpret_cast(data); for (size_t i = 0; i < size; i++) { cout << hex << uppercase << setw(2) << setfill('0') << static_cast(bytes[i]) << " "; } cout << dec; // Возвращаем десятичный вывод } // вывод данных в двоичном формате void print_binary(const void* data, size_t size) const { const uint8_t* bytes = reinterpret_cast(data); for (size_t i = 0; i < size; i++) { for (int j = 7; j >= 0; j--) { cout << ((bytes[i] >> j) & 1); } cout << " "; } } }; int main() { setlocale(LC_ALL, "Russian"); Student students[3]; // Вносим данные про студентов strcpy(students[0].name, "Александр "); students[0].year = 2019; students[0].average_score = 4.2; students[0].gender = 1; students[0].courses = 6; students[0].leader = nullptr; strcpy(students[1].name, "Алексей"); students[1].year = 2022; students[1].average_score = 3.5; students[1].gender = 1; students[1].courses = 3; students[1].leader = &students[0]; strcpy(students[2].name, "Екатерина"); students[2].year = 2021; students[2].average_score = 4.1; students[2].gender = 0; students[2].courses = 4; students[2].leader = &students[0]; // Выводим адрес массива и размер массива в байтах cout << "Информация о массиве:" << endl; cout << "Адрес массива: " << &students << endl; cout << "Размер массива: " << sizeof(students) << " байт" << endl << endl; // Выводим номер, адрес и размер структуры студента cout << "Информация об элементах массива:" << endl; for (int i = 0; i < 3; i++) { cout << "Студент " << i << ":" << endl; cout << "Адрес: " << &students[i] << endl; cout << "Размер: " << sizeof(Student) << " байт" << endl << endl; } cout << "Данные о полях других студентов:" << endl; // Выводим смещение поля имени относительно начала структуры cout << "Имя:" << endl; cout << " Адрес: " << static_cast(students[1].name) << endl; cout << " Смещение: " << offsetof(Student, name) << endl; cout << " Размер: " << sizeof(students[1].name) << " байт" << endl; cout << " Шестнацатеричный формат: "; students[1].print_hex(students[1].name, sizeof(students[1].name)); cout << endl << " Двоичный формат: "; students[1].print_binary(students[1].name, sizeof(students[1].name)); cout << endl << endl; // Выводим адрес, смещение, размер поля года cout << "Год:" << endl; cout << " Адрес: " << &students[1].year << endl; cout << " Смещение: " << offsetof(Student, year) << endl; cout << " Размер: " << sizeof(students[1].year) << " байт" << endl; cout << " Шестнацатеричный формат: "; students[1].print_hex(&students[1].year, sizeof(students[1].year)); cout << endl << " Двоичный формат: "; students[1].print_binary(&students[1].year, sizeof(students[1].year)); cout << endl << endl; // Выводим смещение и размер поля успеваемости cout << "Успеваемость:" << endl; cout << " Адрес: " << &students[1].average_score << endl; cout << " Смещение: " << offsetof(Student, average_score) << endl; cout << " Размер: " << sizeof(students[1].average_score) << " байт" << endl; cout << " Шестнацатеричный формат: "; students[1].print_hex(&students[1].average_score, sizeof(students[1].average_score)); cout << endl << " Двоичный формат: "; students[1].print_binary(&students[1].average_score, sizeof(students[1].average_score)); cout << endl << endl; // Выводим адрес, смещение, размер указателя на старосту cout << "Староста:" << endl; cout << " Адрес: " << &students[1].leader << endl; cout << " Смещение: " << offsetof(Student, leader) << endl; cout << " Размер: " << sizeof(students[1].leader) << " байт" << endl; cout << " Шестнацатеричный формат: "; students[1].print_hex(&students[1].leader, sizeof(students[1].leader)); cout << endl << " Двоичный формат: "; students[1].print_binary(&students[1].leader, sizeof(students[1].leader)); cout << endl << endl; // все элементы массива в шестнадцатеричном виде с указанием соответствия блоков байт полям структур cout << "Шестнадцатеричное представление структур:" << endl; for (int i = 0; i < 3; i++) { cout << "Студент " << i << (students[i].leader == nullptr ? " (не староста)" : " (староста, лидер - ") << (students[i].leader == nullptr ? "нет лидера" : students[i].leader->name) << ")" << endl; cout << " Все поля: "; students[i].print_hex(&students[i], sizeof(Student)); cout << endl; cout << " Имя: "; students[i].print_hex(students[i].name, sizeof(students[i].name)); cout << endl; cout << " Год: "; students[i].print_hex(&students[i].year, sizeof(students[i].year)); cout << endl; cout << " Успеваемость: "; students[i].print_hex(&students[i].average_score, sizeof(students[i].average_score)); cout << endl; uint8_t bit_fields = (students[i].gender << 7) | students[i].courses; cout << " Пол и количество курсов (как байт: старший бит - пол, младшие биты - количество курсов): "; students[i].print_hex(&bit_fields, sizeof(bit_fields)); cout << " Староста: "; students[i].print_hex(&students[i].leader, sizeof(students[i].leader)); cout << endl << endl; } return 0; }