Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Лабораторна робота №3
з дисципліни: “Програмування, частина 3 (Структури даних та алгоритми)”
Мета роботи
Дослідження методів та засобів явного та неявного перетворення типів даних
Завдання на лабораторну роботу
Завдання 1:
Визначити, які неявні перетворення типів будуть відбуватись при обчисленнях. З’ясувати, чи відбудуться втрати значимості даних. Хід міркувань підтвердити програмними результатами. В звіти пояснити кожне перетворення і метод, яким воно здійснено.
typedef unsigned int type_0;
typedef unsigned short int type_1;
typedef unsigned long int type_2;
typedef signed short int type_3;
typedef signed int type_4;
typedef signed long int type_5;
typedef bool type_6;
typedef char type_7;
typedef wchar_t type_8;
typedef float type_9;
typedef double type_10;
typedef long double type_11;
// позначимо через DN - день народження, MN – місяць народження
char x0=0; // замість № підставити значення: DN % 9
unsigned int x1=25; // замість № підставити значення: DN % DN
signed long int x2=2; // замість № підставити значення: MN % 9
signed long int x3=3; // замість № підставити значення: MN % 13
wchar_t x4=4; // замість № підставити значення: (DN * MN) % 9
unsigned short int x5=5; // замість № підставити значення: DN % 12
unsigned long int x6=6; // замість № підставити значення: MN % 3
signed long int x7=7; // замість № підставити значення: (DN * MN) % 12
long double x8=8; // замість № підставити значення: DN % 13
signed long int x9=9; // замість № підставити значення: MN % 6
signed long int x10=10; // замість № підставити значення: (DN * MN) % 10
unsigned short int x11=11; // замість № підставити значення: DN % 3
/* 1 */ x1 = x1 – 0xFFFFFFFA;
/* 2 */ x3 = ’a’ + x0 – x2;
/* 3 */ x7 = x4 + x5 + x6 * 0.1;
/* 4 */ x8 = x9 + x10 – x11*10;
Завдання 2
Визначити, які явні і неявні перетворення типів будуть відбуватись. Результати обчислень підтвердити програмними результатами. В звіти пояснити кожне перетворення і кожний отриманий результат.
// позначимо через DN і MN числа, що відповідають дню і місяцю народження,
// через dn і mn – по дві цифри, що відповідають дню і місяцю народження,
// наприклад: DN=5 , MN=3 , dn=05 , mn =03
const int x_0= 12500; // наприклад: 5*3*100=1500 => x_0=1500;
const double y_1= 1.25; // наприклад: 5*3/100=0.15 => y_0=0.15;
int x = х_0; // замість № підставити значення: DN % 5
double y = y_1; // замість № підставити значення: DN % 3
char v0=*reinterpret_cast<char*> (&x) +3; printf("%d %x %c \n", v0,v0,v0);
char v5=*reinterpret_cast<char*> (&x) +2; printf("%d %x %c \n", v5,v5,v5);
long w1 =*reinterpret_cast<long*>(&y)+33; printf("%lx %lu %ld \n", w1,w1,w1);
short w6=*(reinterpret_cast<short*>(&y)+3)+13; printf("%x %u %d \n", w6,w6,w6);
Вибір індивідуального завдання
Вибрати назви змінних для дослідження в завданні 2 згідно з варіантом з таблиці:
(місяць народження студента) % 4
(день народження студента) % 4
0
1
2
3
0
v0 , w1 ,
v3 , w4
v1 , w2 ,
v4 , w5
v2 , w3 ,
v5 , w6
v3 , w4 ,
v6 , w7
1
v4 , w5 ,
v7 , w8
v5 , w6 ,
v0, w1
v6 , w7 ,
v1 , w2
v7 , w0 ,
v2 , w3
2
v0 , w2,
v4, w7
v1 , w3 ,
v5 , w0
v2 , w4 ,
v6 , w1
v3 , w5 ,
v7 , w2
3
v4 , w6 ,
v0 , w3
v5 , w7 ,
v1, w4
v6 , w0,
v2 , w5
v7 , w1 ,
v3 , w6
Моя дата народження: 25.05.2000, варіант – v5 , w6, v0 , w1
Пояснення результатів
Завдання 1
x1 = x1 – 0xFFFFFFFA;
unsigned int x1=25
ВПК: 19 00 00 00
0xFFFFFFFA16 = 610
ВПК: FAFFFFFF −> FAFFFFFF
Комп’ютер знає тільки дію додавання, вираз набуде вигляду:
x1 = x1+ (–0xFFFFFFFA)
Тоді:x1 = 25 +(- 6)...