Изменил(а) на 'task_3'

main
VashchishinMV 3 недель назад
Родитель 3e737efbf0
Сommit b3c74fc178

210
task_3

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