You are on page 1of 6

Лабораторна робота № 1

Робота з базовими типами даних


Мета роботи: отримати практичні навички по роботі з базовими типами даних
(простими і складними типами даних).
Хід роботи:
Завдання 1. Записати і заповнити структуру даних зберігання поточного часу
(включаючи секунди) і дату в найбільш компактному вигляді. Визначити обсяг
пам'яті, яку займає змінна даного типу. Порівняти зі стандартною структурою tm
(time.h). Вивести вміст структури в зручному вигляді для користувача на
дисплей..
Лістинг програми:
#include <iostream>
#include <ctime>
#include <Windows.h>

struct DateTime {
unsigned int year : 16;
unsigned int month : 4;
unsigned int day : 5;
unsigned int hour : 5;
unsigned int minute : 6;
unsigned int second : 6;
};

int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
std::time_t now = std::time(nullptr);
std::tm timeinfo;
localtime_s(&timeinfo, &now);
DateTime datetime = {
static_cast<unsigned int>(timeinfo.tm_year + 1900),
static_cast<unsigned int>(timeinfo.tm_mon + 1),
static_cast<unsigned int>(timeinfo.tm_mday),
static_cast<unsigned int>(timeinfo.tm_hour),
static_cast<unsigned int>(timeinfo.tm_min),
static_cast<unsigned int>(timeinfo.tm_sec)
};
std::cout << "Поточний час та дата: ";
std::cout << static_cast<int>(datetime.hour) << ":" << static_cast<int>(datetime.minute) << ":" <<
static_cast<int>(datetime.second) << " ";
std::cout << static_cast<int>(datetime.day) << "." << static_cast<int>(datetime.month) << "." << datetime.year <<
std::endl;

std::cout << "Розмір структури даних: " << sizeof(DateTime) << " біт" << std::endl;

return 0;
}

ДУ «Житомирська політехніка».22.121.14.000–Лр1
Змн. Арк. № докум. Підпис Дата
Результат виконання:
Розроб. Літ. Арк. Аркушів
Перевір. Локтікова Т.М. 1 6
Керівник
Звіт з
Н. контр. лабораторної роботи ФІКТ Гр. IПЗ-22-3[1]
Зав. каф.
Завдання 2. Реалізувати введення цілочисельного значення типу signed short.
Визначити знак і значення, використовуючи: 1) структури даних та об'єднання; 2)
побітові логічні операції
Лістинг програми:
#include <iostream>
#include <windows.h>

using namespace std;

struct m_byte
{
unsigned short b0 : 1;
unsigned short b1 : 1;
unsigned short b2 : 1;
unsigned short b3 : 1;
unsigned short b4 : 1;
unsigned short b5 : 1;
unsigned short b6 : 1;
unsigned short b7 : 1;
};

union num
{
signed short value;
struct build
{
unsigned short val : 15;
unsigned short sign : 1;
}build;

struct bytes
{
m_byte second_byte;
m_byte first_byte;
}bytes;
};

void print_byte(m_byte b);


void print_in_binary_16(num n);
void inspect_number(num n);

int main()
{
SetConsoleCP(1251); SetConsoleOutputCP(1251);

num my_num;
printf("Введіть число: ");
scanf_s("%d", &my_num.value);
inspect_number(my_num);

return 0;
}

void print_byte(m_byte b)
{
printf("%d%d%d%d%d%d%d%d", b.b7, b.b6, b.b5, b.b4, b.b3, b.b2, b.b1, b.b0);
}

void print_in_binary_16(num n)

Арк.
Локтікова Т.М. ДУ «Житомирська політехніка».22.121.14.000 – Лр1
6
Змн. Арк. № докум. Підпис Дата
{
print_byte(n.bytes.first_byte);
printf("");
print_byte(n.bytes.second_byte);
}

void inspect_number(num n)
{
if (n.build.sign == 0 && n.build.val == 0)
{
printf("Змінна збергає нуль!");
return;
}
if (n.build.sign == 0)
{
printf("Число додатнє!\n");
printf("Представлення в двійковій системі: ");
print_in_binary_16(n);
printf("\nЗначення: %d\n", n.build.val);

}
else
{
printf("Число від'ємне\n");
num abs = n;
printf("Перед конвертуванням:\n");
print_in_binary_16(abs);
printf("\n");

abs.build.val = ~(--abs.build.val);
printf("Після конвертуванням:\n");
print_in_binary_16(abs);
printf("\n");
printf("Значення: %d", abs.build.val);
}
}
Результат виконання:

Мал.1

Арк.
Локтікова Т.М. ДУ «Житомирська політехніка».22.121.14.000 – Лр1
6
Змн. Арк. № докум. Підпис Дата
Завдання 3. Виконати операції: а) 5 + 127; б) 2-3; в) -120-34; г) (unsigned char) (-
5); д) 56 & 38; е) 56 | 38
Лістинг програми:
#include <iostream>

int main()
{
const signed char res1 = 5 + 127;
printf("5 + 127 = %d\n", res1);

const signed char res2 = 2 - 3;


printf("2 - 3 = %d\n", res2);

const signed char res3 = -120 - 34;


printf("-120 - 34 = %d\n", res3);

printf("(unsigned char(-5)) = %d\n", (unsigned char)(-5));

const signed char res5 = 56 & 38;


printf("56 & 38 = %d\n", res5);

const signed char res6 = 56 | 38;


printf("56 | 38 = %d\n", res6);
}
Результат виконання:

Мал.2
1) 5+127=-124
1012(510) + 11111112(12710) = 100001002(13210), але так як signed char має
діапазон значень від -128 до 127, саме тому виводиться -124
2) 2 – 3 =-1
12(110) - 112(310) = 102(-110)
3) -120 – 34 = 102
-120 - 34=-154, але так як signed char має діапазон значень від -128 до 127,
саме тому виводиться 102
4) (unsigned char(-5)) = 251
У випадку з unsigned char розрядність 8 біт, тому значення -5 в двійковій
формі 1111 1011 буде розцінено як беззнакове число 251, бо 251 + 2^8 = 251
+ 256 = 507, що після переповнення беззнакового 8-бітного типу
залишається значенням 251.
4) 56 & 38 = 32
00111000 (56)
& 00100110 (38)
----------
00100000 (32)

Арк.
Локтікова Т.М. ДУ «Житомирська політехніка».22.121.14.000 – Лр1
6
Змн. Арк. № докум. Підпис Дата
5) 56 | 38 = 62
00111000 (56)
| 00100110 (38)
----------
00111110 (62)

Завдання 4. Записати і заповнити структуру даних (об'єднання) для зберігання


дійсного числа типу float в найбільш компактному вигляді. Реалізувати
відображення на дисплей: 1) значення побитово; 2) значення побайтово; 3) знака,
мантиси і ступінь значення. Виконати перевірку результату в ручну. Визначити
обсяг пам'яті, яку займає змінна користувацького типу
Лістинг програми:
#include <iostream>
#include <bitset>
#include <iomanip>

using namespace std;

int main()
{
float number = 3.14f;

cout << "Float value: " << number << endl;

int floatBits = *reinterpret_cast<int*>(&number);


cout << "Float value in bits: " << bitset<32>(floatBits) << endl;

unsigned char* floatBytes = reinterpret_cast<unsigned char*>(&number);

cout << "Float value in bytes: ";


for (int i = sizeof(float) - 1; i >= 0; i--)
{
cout << setfill('0') << setw(2) << hex << static_cast<int>(floatBytes[i]) << " ";
}
cout << endl;

int sign = (floatBits >> 31) & 1;


int exponent = (floatBits >> 23) & 0xFF;
int mantissa = floatBits & 0x7FFFFF;
cout << "Float value sign: " << sign << endl;
cout << "Float value exponent: " << hex << exponent << endl;
cout << "Float value mantissa: " << hex << mantissa << endl;
cout << "Size of float: " << sizeof(float) << endl;

return 0;
}

Арк.
Локтікова Т.М. ДУ «Житомирська політехніка».22.121.14.000 – Лр1
6
Змн. Арк. № докум. Підпис Дата
Результат виконання:

Мал.3
Висновок: я отримав практичні навички по роботі з базовими типами даних

Арк.
Локтікова Т.М. ДУ «Житомирська політехніка».22.121.14.000 – Лр1
6
Змн. Арк. № докум. Підпис Дата

You might also like