From ece2303537432f080bf0652e230bbc5a5616c129 Mon Sep 17 00:00:00 2001 From: TimofeevAnM Date: Sun, 26 Jan 2025 12:51:12 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB(=D0=B0)=20?= =?UTF-8?q?'lab04=5F3.cpp'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab04_3.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 lab04_3.cpp diff --git a/lab04_3.cpp b/lab04_3.cpp new file mode 100644 index 0000000..a059c85 --- /dev/null +++ b/lab04_3.cpp @@ -0,0 +1,84 @@ +#include +#include +#include // Для offsetof +#include // Для strcpy + +struct Student { + char name[17]; // Имя (массив из 17 символов) + uint16_t year; // Год поступления (беззнаковое целое, 2 байта) + float gpa; // Средний балл (с плавающей запятой) + unsigned int gender : 1; // Пол (1 бит, 0 — женский, 1 — мужской) + uint16_t courses; // Количество пройденных курсов + Student* leader; // Указатель на старосту группы (для старосты — нулевой указатель) +}; + +int main() { + // Объявление массива из трех студентов + Student students[3]; + + // Заполнение данных для студентов + strcpy(students[0].name, "Alice"); + students[0].year = 2021; + students[0].gpa = 4.5; + students[0].gender = 0; // Женский + students[0].courses = 5; + students[0].leader = nullptr; // Не староста + + strcpy(students[1].name, "Bob"); + students[1].year = 2021; + students[1].gpa = 3.8; + students[1].gender = 1; // Мужской + students[1].courses = 6; + students[1].leader = &students[2]; // Староста + + strcpy(students[2].name, "Charlie"); + students[2].year = 2020; + students[2].gpa = 4.0; + students[2].gender = 1; // Мужской + students[2].courses = 7; + students[2].leader = nullptr; // Не староста + + // 3.3.1 Адрес и размер массива + std::cout << "Address of students array: " << &students << std::endl; + std::cout << "Size of students array: " << sizeof(students) << " bytes" << std::endl; + + // 3.3.2 Адреса и размеры всех элементов массива + for (int i = 0; i < 3; ++i) { + std::cout << "Address of student[" << i << "]: " << &students[i] << std::endl; + std::cout << "Size of student[" << i << "]: " << sizeof(students[i]) << " bytes" << std::endl; + } + + // 3.3.3 Информация о полях структуры + Student& student = students[0]; // Возьмем первого студента для примера + + std::cout << "Field information for student[0]:" << std::endl; + + std::cout << "Name address: " << static_cast(student.name) << ", Offset: " + << offsetof(Student, name) << ", Size: " << sizeof(student.name) + << " bytes" << std::endl; + + std::cout << "Year address: " << &student.year << ", Offset: " + << offsetof(Student, year) << ", Size: " << sizeof(student.year) + << " bytes" << std::endl; + + std::cout << "GPA address: " << &student.gpa << ", Offset: " + << offsetof(Student, gpa) << ", Size: " << sizeof(student.gpa) + << " bytes" << std::endl; + + std::cout << "Courses address: " << &student.courses << ", Offset: " + << offsetof(Student, courses) << ", Size: " << sizeof(student.courses) + << " bytes" << std::endl; + + // 3.3.4 Элементы массива в шестнадцатеричном виде + std::cout << "Students array in hexadecimal:" << std::endl; + for (int i = 0; i < 3; ++i) { + std::cout << "student[" << i << "]: "; + for (size_t j = 0; j < sizeof(students[i]); ++j) { + std::cout << std::hex << std::setw(2) << std::setfill('0') + << static_cast(reinterpret_cast(&students[i])[j]) << " "; + } + std::cout << std::dec << std::endl; // Сброс формата обратно в десятичный + } + + return 0; +} \ No newline at end of file