diff --git a/Задание №3 b/Задание №3 new file mode 100644 index 0000000..29ba8e6 --- /dev/null +++ b/Задание №3 @@ -0,0 +1,158 @@ +#include +#include +#include // Для использования strlen и strcpy + +using namespace std; + +// Структура Student, описывающая студента +struct Student { + char Name[17]; // Имя студента (максимум 16 символов + завершающий нулевой символ) + uint16_t Year_of_receipt; // Год поступления + float Average_score; // Средний балл + uint16_t Sex : 1; // Пол (0 — женский, 1 — мужской) + uint16_t Finished_courses; // Количество пройденных курсов + Student* Team_lead; // Указатель на старосту группы +}; + +// Вспомогательные массивы и функции для работы с шестнадцатеричным и двоичным представлением +char digits[] = "0123456789ABCDEF"; + +// Функция преобразования данных в массив байтов +const uint8_t* as_bytes(const void* data) { + return reinterpret_cast(data); +} + +// Функция преобразования nibble в шестнадцатеричный символ +char nibble_to_hex(uint8_t i) { + return digits[i & 0xf]; +} + +// Функция вывода одного байта в шестнадцатеричном формате +void print_in_hex(uint8_t byte) { + cout << nibble_to_hex(byte >> 4) << nibble_to_hex(byte & 0xf); +} + +// Функция вывода блока данных в шестнадцатеричном формате +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 << ' '; + } + } +} + +// Функция вывода одного бита +char bit_digit(uint8_t byte, uint8_t bit) { + return (byte & (0x1 << bit)) ? '1' : '0'; +} + +// Функция вывода одного байта в двоичном формате +void print_in_binary(uint8_t byte) { + for (int bit = 7; bit >= 0; --bit) { + cout << bit_digit(byte, bit); + } +} + +// Функция вывода блока данных в двоичном формате +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 << ' '; + } + } +} + +int main() { + setlocale(LC_ALL, "rus"); + Student students[3]; // Массив студентов + uint16_t gender; + + // Ввод данных для каждого студента + for (int i = 0; i < 3; ++i) { + if (i != 0) { + cout << "Ученик " << i << "\n"; + students[i].Team_lead = &students[0]; + } + else { + students[i].Team_lead = nullptr; + cout << "Староста\n"; + } + cout << "Имя: "; + cin >> students[i].Name; + cout << "Год поступления: "; + cin >> students[i].Year_of_receipt; + cout << "Средний балл: "; + cin >> students[i].Average_score; + cout << "Пол (0-1): "; + cin >> gender; + students[i].Sex = gender; + cout << "Количество пройденных курсов: "; + cin >> students[i].Finished_courses; + } + + // Вывод информации о массиве + cout << "Адрес массива: " << (void*)students << "\n"; + cout << "Размер массива: " << sizeof(students) << " bytes\n"; + + // Вывод информации о каждом элементе массива + for (int i = 0; i < 3; ++i) { + cout << "Адрес элемента: " << i << ": " << (void*)&students[i] << "\n"; + cout << "Размер элемента: " << i << ": " << sizeof(Student) << " bytes\n"; + } + + // Вывод информации о полях второго студента + cout << "Ученик 2\n"; + cout << "Имя (адрес): " << (void*)&students[1].Name + << " Смещение: " << offsetof(Student, Name) + << " Размер: " << sizeof(students[1].Name) << "\nШестнадцатиричный код:\n"; + print_in_hex(&students[1].Name, sizeof(students[1].Name)); + cout << "\nВ двоичном представлении:\n"; + print_in_binary(&students[1].Name, sizeof(students[1].Name)); + + cout << "\n\nГод поступления (адрес): " << (void*)&students[1].Year_of_receipt + << " Смещение: " << offsetof(Student, Year_of_receipt) + << " Размер: " << sizeof(students[1].Year_of_receipt) << "\nШестнадцатиричный код:\n"; + print_in_hex(&students[1].Year_of_receipt, sizeof(students[1].Year_of_receipt)); + cout << "\nВ двоичном представлении:\n"; + print_in_binary(&students[1].Year_of_receipt, sizeof(students[1].Year_of_receipt)); + + cout << "\n\nСредний балл (адрес): " << (void*)&students[1].Average_score + << " Смещение: " << offsetof(Student, Average_score) + << " Размер: " << sizeof(students[1].Average_score) << "\nШестнадцатиричный код:\n"; + print_in_hex(&students[1].Average_score, sizeof(students[1].Average_score)); + cout << "\nВ двоичном представлении:\n"; + print_in_binary(&students[1].Average_score, sizeof(students[1].Average_score)); + + cout << "\n\nКоличество пройденных курсов (адрес): " << (void*)&students[1].Finished_courses + << " Смещение: " << offsetof(Student, Finished_courses) + << " Размер = " << sizeof(students[1].Finished_courses) << "\nШестнадцатиричный код:\n"; + print_in_hex(&students[1].Finished_courses, sizeof(students[1].Finished_courses)); + cout << "\nВ двоичном представлении:\n"; + print_in_binary(&students[1].Finished_courses, sizeof(students[1].Finished_courses)); + + cout << "\n\nСтароста (адрес): " << (void*)&students[1].Team_lead + << " Смещение: " << offsetof(Student, Team_lead) + << " Размер: " << sizeof(students[1].Team_lead) << "\nШестнадцатиричный код:\n"; + print_in_hex(&students[1].Team_lead, sizeof(students[1].Team_lead)); + cout << "\nВ двоичном представлении:\n"; + print_in_binary(&students[1].Team_lead, sizeof(students[1].Team_lead)); + + // Вывод всего массива студентов + cout << "\nВесь массив:\n"; + print_in_hex(students, sizeof(students)); + cout << "\nВ двоичном представлении:\n"; + print_in_binary(students, sizeof(students)); + + cin >> gender; // Задержка завершения программы + return 0; +}