Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

159 строки
7.0 KiB
Plaintext

#include <iostream>
#include <cstdint>
#include <cstring> // Для использования 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<const uint8_t*>(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;
}