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

167 строки
5.6 KiB
C++

#include <cstddef>
#include <cstdint>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <windows.h> // Äîáàâëåíî äëÿ ðàáîòû ñ êîäèðîâêîé
// Ñòðóêòóðà ñ áèòîâûì ïîëåì è îáÿçàòåëüíûìè àòðèáóòàìè
struct Student {
char name[17];
uint16_t year;
float gpa;
uint8_t gender : 1; // 0 — æåí, 1 — ìóæ
uint8_t courses : 7;
Student* captain;
};
// Ïå÷àòü îäíîãî áàéòà â hex
static void print_in_hex(uint8_t byte) {
static const char digits[] = "0123456789ABCDEF";
std::cout << digits[byte >> 4] << digits[byte & 0x0F];
}
// Ïå÷àòü áëîêà â hex ñ ðàçðûâîì ñòðîê êàæäûå 16 áàéò
static void print_in_hex(const void* data, size_t size) {
const uint8_t* bytes = static_cast<const uint8_t*>(data);
for (size_t i = 0; i < size; ++i) {
print_in_hex(bytes[i]);
if (i + 1 != size) {
std::cout << ' ';
}
if ((i + 1) % 16 == 0 && i + 1 != size) {
std::cout << '\n';
}
}
}
// Ïå÷àòü îäíîãî áàéòà â äâîè÷íîì âèäå
static void print_in_binary(uint8_t byte) {
for (int bit = 7; bit >= 0; --bit) {
std::cout << ((byte >> bit) & 1);
}
}
// Ïå÷àòü áëîêà â äâîè÷íîì âèäå ñ ïåðåâîäîì ñòðîêè êàæäûå 4 áàéòà
static void print_in_binary(const void* data, size_t size) {
const uint8_t* bytes = static_cast<const uint8_t*>(data);
for (size_t i = 0; i < size; ++i) {
print_in_binary(bytes[i]);
if (i + 1 != size) {
std::cout << ' ';
}
if ((i + 1) % 4 == 0 && i + 1 != size) {
std::cout << '\n';
}
}
}
int main() {
// Íàñòðîéêà êîäèðîâêè êîíñîëè äëÿ ðóññêîãî òåêñòà
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
Student group[3]{};
// Ñòàðîñòà
strcpy_s(group[0].name, "Smirnov Denis"); // Èñïðàâëåíî
group[0].year = 2022;
group[0].gpa = 4.6f;
group[0].gender = 1;
group[0].courses = 3;
group[0].captain = nullptr;
// Ñòóäåíòêè
strcpy_s(group[1].name, "Kuznetsova Al"); // Èñïðàâëåíî
group[1].year = 2022;
group[1].gpa = 4.9f;
group[1].gender = 0;
group[1].courses = 3;
group[1].captain = &group[0];
strcpy_s(group[2].name, "Belova Irina"); // Èñïðàâëåíî
group[2].year = 2021;
group[2].gpa = 4.3f;
group[2].gender = 0;
group[2].courses = 4;
group[2].captain = &group[0];
std::cout << "1) Ìàññèâ ñòóäåíòîâ\n";
std::cout << " Àäðåñ: " << static_cast<const void*>(group) << '\n';
std::cout << " Ðàçìåð: " << sizeof(group) << " áàéò\n\n";
std::cout << "2) Ýëåìåíòû ìàññèâà\n";
for (int i = 0; i < 3; ++i) {
std::cout << " #" << i << " àäðåñ: " << static_cast<const void*>(&group[i])
<< " ðàçìåð: " << sizeof(Student) << " áàéò\n";
}
std::cout << '\n';
std::cout << "3) Ïîëÿ âòîðîãî ñòóäåíòà (áåç ïîëà)\n";
std::cout << " name\n";
std::cout << " àäðåñ: " << static_cast<void*>(group[1].name) << '\n';
std::cout << " ñìåùåíèå: " << offsetof(Student, name) << '\n';
std::cout << " ðàçìåð: " << sizeof(group[1].name) << " áàéò\n";
std::cout << " hex:\n";
print_in_hex(group[1].name, sizeof(group[1].name));
std::cout << "\n bin:\n";
print_in_binary(group[1].name, sizeof(group[1].name));
std::cout << "\n\n";
std::cout << " year\n";
std::cout << " àäðåñ: " << static_cast<const void*>(&group[1].year) << '\n';
std::cout << " ñìåùåíèå: " << offsetof(Student, year) << '\n';
std::cout << " ðàçìåð: " << sizeof(group[1].year) << " áàéò\n";
std::cout << " hex:\n";
print_in_hex(&group[1].year, sizeof(group[1].year));
std::cout << "\n bin:\n";
print_in_binary(&group[1].year, sizeof(group[1].year));
std::cout << "\n\n";
std::cout << " gpa\n";
std::cout << " àäðåñ: " << static_cast<const void*>(&group[1].gpa) << '\n';
std::cout << " ñìåùåíèå: " << offsetof(Student, gpa) << '\n';
std::cout << " ðàçìåð: " << sizeof(group[1].gpa) << " áàéò\n";
std::cout << " hex:\n";
print_in_hex(&group[1].gpa, sizeof(group[1].gpa));
std::cout << "\n bin:\n";
print_in_binary(&group[1].gpa, sizeof(group[1].gpa));
std::cout << "\n\n";
std::cout << " captain\n";
std::cout << " àäðåñ: " << static_cast<const void*>(&group[1].captain) << '\n';
std::cout << " ñìåùåíèå: " << offsetof(Student, captain) << '\n';
std::cout << " ðàçìåð: " << sizeof(group[1].captain) << " áàéò\n";
std::cout << " hex:\n";
print_in_hex(&group[1].captain, sizeof(group[1].captain));
std::cout << "\n bin:\n";
print_in_binary(&group[1].captain, sizeof(group[1].captain));
std::cout << "\n\n";
std::cout << "4) Ñòðóêòóðû â hex\n";
for (int i = 0; i < 3; ++i) {
std::cout << " Ñòóäåíò #" << i
<< (i == 0 ? " (ñòàðîñòà)" : "") << '\n';
std::cout << " âñå ïîëÿ:\n";
print_in_hex(&group[i], sizeof(Student));
std::cout << '\n';
std::cout << " name:\n";
print_in_hex(&group[i].name, sizeof(group[i].name));
std::cout << '\n';
std::cout << " year:\n";
print_in_hex(&group[i].year, sizeof(group[i].year));
std::cout << '\n';
std::cout << " gpa:\n";
print_in_hex(&group[i].gpa, sizeof(group[i].gpa));
std::cout << '\n';
uint8_t packed = static_cast<uint8_t>((group[i].gender << 7) | group[i].courses);
std::cout << " gender+courses (áàéò):\n";
print_in_hex(&packed, sizeof(packed));
std::cout << '\n';
std::cout << " captain:\n";
print_in_hex(&group[i].captain, sizeof(group[i].captain));
std::cout << "\n\n";
}
return 0;
}