#include #include struct Student { char name[17]; //имя unsigned short int admissionYear; //год поступления float averageGrade; //средний балл bool gender : 1; //пол unsigned short int coursesPassed; //количество пройденных курсов Student* groupLeader; // указатель на старосту группы }; int main() { setlocale(0, "ru-ru"); // Создание трех студентов Student students[3]; // Заполнение информации о студентах // Студент 1 students[0].name[0] = 'A'; students[0].name[1] = '\0'; students[0].admissionYear = 2023; students[0].averageGrade = 4.2; students[0].gender = 1; // Мужской пол students[0].coursesPassed = 4; // Студент 2 students[1].name[0] = 'B'; students[1].name[1] = '\0'; students[1].admissionYear = 2022; students[1].averageGrade = 4.5; students[1].gender = 0; // Женский пол students[1].coursesPassed = 5; // Староста группы (студент 3) students[2].name[0] = 'C'; students[2].name[1] = '\0'; students[2].admissionYear = 2022; students[2].averageGrade = 4.8; students[2].gender = 1; // Мужской пол students[2].coursesPassed = 6; students[2].groupLeader = nullptr; // Староста имеет нулевой указатель // Назначение старосты students[0].groupLeader = &students[2]; students[1].groupLeader = &students[2]; // Вывод информации о студентах for (int i = 0; i < 3; ++i) { std::cout << "Студент " << i + 1 << ":\n"; std::cout << "Имя: " << students[i].name << std::endl; std::cout << "Год поступления: " << students[i].admissionYear << std::endl; std::cout << "Средний балл: " << students[i].averageGrade << std::endl; std::cout << "Пол: " << (students[i].gender ? "Мужской" : "Женский") << std::endl; std::cout << "Количество пройденных курсов: " << students[i].coursesPassed << std::endl; if (students[i].groupLeader != nullptr) { std::cout << "Староста группы: " << students[i].groupLeader->name << std::endl; } else { std::cout << "Староста группы: Нет" << std::endl; } std::cout << std::endl; } // 1) Адрес и размер массива std::cout << "Адрес массива: " << &students << std::endl; std::cout << "Размер массива: " << sizeof(students) << " байт" << std::endl << std::endl; // 2) Адреса и размеры всех элементов массива for (int i = 0; i < 3; ++i) { std::cout << "Адрес элементп " << i << ": " << &students[i] << std::endl; std::cout << "Размер элемента " << i << ": " << sizeof(students[i]) << " байт" << std::endl; } std::cout << std::endl; // 3) Для всех полей, кроме пола, одного из элементов массива std::cout << "Адреса полей, смещения, размеры, шестнадцатеричное и двоичное представление:" << std::endl; for (int i = 0; i < 3; ++i) { std::cout << "Элемент " << i << ":" << std::endl; // Адреса, смещения, размеры и представления полей std::cout << "Адрес имени: " << reinterpret_cast(&students[i].name) << ", " << "Смещение: " << offsetof(Student, name) << ", " << "Размер: " << sizeof(students[i].name) << ", " << "Шестнадцатеричный: "; for (size_t j = 0; j < sizeof(students[i].name); ++j) { std::cout << std::hex << static_cast(students[i].name[j]); } std::cout << ", Двоичный: "; for (size_t j = 0; j < sizeof(students[i].name); ++j) { std::cout << std::bitset<8>(students[i].name[j]) << " "; } std::cout << std::endl; // Повтор этого шаблона для остальных полей структуры std::cout << "Адрес года поступления: " << reinterpret_cast(&students[i].admissionYear) << ", " << "Смещение: " << offsetof(Student, admissionYear) << ", " << "Размер: " << sizeof(students[i].admissionYear) << ", " << "Шестнадцатеричный: " << std::hex << students[i].admissionYear << ", " << "Двоичный: " << std::bitset(students[i].admissionYear) << std::endl; std::cout << "Адрес среднего балла: " << reinterpret_cast(&students[i].averageGrade) << ", " << "Смещение: " << offsetof(Student, averageGrade) << ", " << "Размер: " << sizeof(students[i].averageGrade) << ", " << "Шестнадцатеричный: " << std::hex << students[i].averageGrade << ", " << "Двоичный: " << std::bitset(students[i].averageGrade) << std::endl; std::cout << "Адрес количества пройденных курсов: " << reinterpret_cast(&students[i].coursesPassed) << ", " << "Смещение: " << offsetof(Student, coursesPassed) << ", " << "Размер: " << sizeof(students[i].coursesPassed) << ", " << "Шестнадцатеричный: " << std::hex << students[i].coursesPassed << ", " << "Двоичный: " << std::bitset(students[i].coursesPassed) << std::endl; // для указателя на старосту группы адрес и размер указателя будут различными на разных платформах, // но можно также вывести его адрес и размер для полноты картины. std::cout << "Адрес старосты: " << reinterpret_cast(&students[i].groupLeader) << ", " << "Смещение: " << offsetof(Student, groupLeader) << ", " << "Размер: " << sizeof(students[i].groupLeader) << std::endl; std::cout << std::endl; } // 4) Все элементы массива в шестнадцатеричном виде с указанием соответствия блоков байт полям структур std::cout << "Шестнадцатеричное представление всех элементов:" << std::endl; for (int i = 0; i < 3; ++i) { std::cout << "Элемент " << i << ": "; unsigned char* ptr = reinterpret_cast(&students[i]); for (size_t j = 0; j < sizeof(students[i]); ++j) { std::cout << std::hex << static_cast(ptr[j]) << " "; } std::cout << std::endl; } return 0; }