Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Лабораторна робота №2
з курсу «Програмування. Частина III. Структури даних та алгоритми»на тему:«Перетворення типів даних»
1. МЕТА РОБОТИ
Дослідження методів та засобів явного і неявного перетворення типів даних.
2. ТЕОРЕТИЧНІ ВІДОМОСТІ
Компілятор мови С++ виконує автоматичне перетворення типів даних, особливо в математичних виразах, коли найчастіше цілочисельний тип перетворюється у тип з плаваючою комою, причому значення типу char та int в арифметичних виразах змішуються: кожний з таких символів автоматично перетворюється в ціле. Взагалі, якщо операнди мають різні типи, перед тим, як виконати операцію, молодший тип "підтягується" до старшого. Результат - старшого типу. Отже,
• char та short перетворюються в int;
• float перетворюється в double;
• якщо один з операндів long double, то і другий перетворюється в long double;
• інакше, якщо один з операндів long, тоді другий перетворюється відповідно до того ж типу, і результат буде long;
• інакше, якщо один з операндів unsigned, тоді другий перетворюється відповідно до того ж типу, і результат буде unsigned.
Приклад:
double ft, sd;
unsigned char ch;
unsigned long in;
int i;
sd = ft*(i+ch*in);
При виконанні оператора присвоювання в даному прикладі правила перетворення типів будуть використані наступним чином. Операнд ch перетворюється до unsigned int. Після цього він перетворюється до типу unsigned long. За цим же принципом і перетворюється до unsigned long і результат операції, що розміщена в круглих дужках буде мати тип unsigned long. Потім він перетворюється до типу double і результат всього виразу буде мати тип double.
Взагалі, тип результату кожної арифметичної операції виразу є тип того операнду, який має у відповідності більш високий тип приведення.
Але, окрім цього в С++, з'являється можливість і примусового перетворення типу, щоб дозволити явно конвертувати (перетворювати) значення одного типу даних в інший.
3. ПОРЯДОК ВИКОНАННЯ РОБОТИ
1. При підготовці до лабораторної роботи, необхідно засвоїти теоретичний матеріал по темі і підготуватись до контрольного опитування по розумінню питань даної тематики.
2. Згідно з індивідуальним завданням розробити алгоритм розв’язання задачі.
3. Підготувати програмну реалізацію розробленого алгоритму. Засобами вбудованого тексто-вого редактора інтегрованого середовища набрати текст підготовленої програми. Відкомпілювати, налагодити та виконати програму.
4. Протестувати програму згідно зі складеною системою тестів і, при потребі, відкоректувати текст програми. Проаналізувати отримані результати.
5. Написати контрольне опитування по темі.
6. Оформити звіт по роботі.
Без підготовкі до лабораторної роботи (програмної реалізації розробленого алгоритму) студент до роботи не допускається.
4. ЗАВДАННЯ НА ЛАБОРАТОРНУ РОБОТУ
Обчислити вирази та визначити, які неявні та явні перетворення типів будуть відбуватись. Хід міркувань підтвердити програмними результатами.
Далі використовувати такі позначення:
RN - число, що відповідає року народження,
MN - число, що відповідає місяцю народження % 8,
DN - число, що відповідає дню народження,
mn і dn– ті ж самі значення, що й MN і DN відповідно, записані у вигляді двох цифр,
Pr1 – ASCII-код першої літери прізвища (латинська велика літера),
pr2 – ASCII-код другої літери прізвища (латинська мала літера),
pr3 – ASCII-код третьої літери прізвища (латинська мала літера).
Завдання 1. Неявні перетворення типів даних
char x0 = 0xRN - 10;
float x1 ;
unsigned short x2 = 0MN;
short x3 = Pr1 - 110;
bool x4 = DN % 3 * 10;
x1 = x0 + x2 + x4+0Х123;
x2 = x2 + x3 - 0123;
x3 = x1 + x2 * 0.123 + ’1’;
Завдання 2. Явні перетворення типів даних
const int x_0=DN*MN*100; // наприклад: 15*3*100= 4500 => x_0= 4500;
const int x_1= 0dnmn0; // наприклад: x_1= 015030;
const int x_2= 0xdnmn; // наприклад: x_2= 0x1502;
const int x_3= 0mndn0; // наприклад: x_3= 003150;
const int x_4= 0xmndn; // наприклад: x_4= 0x0315;
const double y_0=DN*MN/100; // наприклад: 15*3/100= 0.45 => y_0= 0.45;
const double y_1= - DN.MN; // наприклад: y_1= -15.3;
const double y_2= MN. DN e +2; // наприклад: y_2= 3.15e+2;
const double y_3= - DN.MN e 1; // наприклад: y_3= -15.3 e1;
const double y_4= - MN. DN e -1; // наприклад: y_4= -3.15 e-1;
int x = х_№; // замість № підставити значення: DN % 5
double y = y_№; // замість № підставити значення: MN % 5
float v1 = static_cast< float > (x);
char v2 = static_cast<char> (x);
float v3 =*reinterpret_cast<float*> (&x)+1;
char v4 =*(reinterpret_cast<char*> (&x)+2)+3;
int w1 = static_cast<int>(y)+0X0E2;
long w2 =*reinterpret_cast<long*>(&y)+1;
short w3 =*(reinterpret_cast<short*>(&y)+2);
char w4 =*(reinterpret_cast<char*>(&y)+7)+3;
Примітка: Я студент Косяк, народився 5 липня 1994 року (05.07.1994), мені треба виконати підстановки:
замість RN підставляти 1994,
замість MN підставляти 7, оскільки 4 % 8 = 7,
замість DN підставляти 5,
замість mn підставляти 07,
замість dn підставляти 05,
замість Pr1 підставляти 75,
замість pr2 підставляти 111,
замість pr3 підставляти 115.
Виконання завдання 1:
Код програми
#include <iostream>
#include<stdio.h>
#include<conio.h>
using namespace std;
int main (void)
{
char x0 = 0x1994 - 10;
float x1 ;
unsigned short x2 = 07;
short x3 = 75 - 110;
bool x4 = 5 % 3 * 10;
x1 = x0 + x2 + x4+0x123;
x2 = x2 + x3 - 0123;
x3 = x1 + x2 * 0.123 + '1';
printf ("x1 VPK: ");
unsigned char *vx1=(unsigned char *)(&x1);
for (int i=0;i<sizeof(x1);i++)
printf("%02X ",vx1[i]);
printf("\n");
printf ("x2 VPK: ");
unsigned char *vx2=(unsigned char *)(&x2);
for (int i=0;i<sizeof(x2);i++)
printf("%02X ",vx2[i]);
printf("\n");
printf ("x3 VPK: ");
unsigned char *vx3=(unsigned char *)(&x3);
for (int i=0;i<sizeof(x3);i++)
printf("%02X ",vx3[i]);
printf("\n");
printf ("x4 VPK: ");
unsigned char *vx4=(unsigned char *)(&x4);
for (int i=0;i<sizeof(x4);i++)
printf("%02X ",vx4[i]);
printf("\n");
getch();
return 0;
}
Результат виконання завдання 1:
/
Виконання завдання 2:
Код програми
#include <iostream>
#include<stdio.h>
#include<conio.h>
using namespace std;
int main (void)
{ const int x_0=5*7*100;
const int x_1= 005070;
const int x_2= 0x0507;
const int x_3= 007050;
const int x_4= 0x0705;
const double y_0=5*7/100;
const double y_1= -5.7;
const double y_2= 7.5e+2;
const double y_3= - 5.7e1;
const double y_4= -7.5e-1;
int x = x_0;
double y= y_2;
float v1 = static_cast< float > (x);
char v2 = static_cast<char> (x);
float v3 =*reinterpret_cast<float*> (&x)+1;
char v4 =*(reinterpret_cast<char*> (&x)+2)+3;
int w1 = static_cast<int>(y)+0X0E2;
long w2 =*reinterpret_cast<long*>(&y)+1;
short w3 =*(reinterpret_cast<short*>(&y)+2);
char w4 =*(reinterpret_cast<char*>(&y)+7)+3;
printf ("v1 VPK: ");
unsigned char *vv1=(unsigned char *)(&v1);
for (int i=0;i<sizeof(v1);i++)
printf("%02X ",vv1[i]);
printf("\n");
printf ("v2 VPK: ");
unsigned char *vv2=(unsigned char *)(&v2);
for (int i=0;i<sizeof(v2);i++)
printf("%02X ",vv2[i]);
printf("\n");
printf ("v3 VPK: ");
unsigned char *vv3=(unsigned char *)(&v3);
for (int i=0;i<sizeof(v3);i++)
printf("%02X ",vv3[i]);
printf("\n");
printf ("v4 VPK: ");
unsigned char *vv4=(unsigned char *)(&v4);
for (int i=0;i<sizeof(v4);i++)
printf("%02X ",vv4[i]);
printf("\n");
printf ("w1 VPK: ");
unsigned char *vw1=(unsigned char *)(&w1);
for (int i=0;i<sizeof(w1);i++)
printf("%02X ",vw1[i]);
printf("\n");
printf ("w2 VPK: ");
unsigned char *vw2=(unsigned char *)(&w2);
for (int i=0;i<sizeof(w2);i++)
printf("%02X ",vw2[i]);
printf("\n");
printf ("w3 VPK: ");
unsigned char *vw3=(unsigned char *)(&w3);
for (int i=0;i<sizeof(w3);i++)
printf("%02X ",vw3[i]);
printf("\n");
printf ("w4 VPK: ");
unsigned char *vw4=(unsigned char *)(&w4);
for (int i=0;i<sizeof(w4);i++)
printf("%02X ",vw4[i]);
printf("\n");
getch();
return 0;
}
Результат виконання завдання 2:/
Висновок:
Я освоїв основні методи та засоби явного та неявного представлення типів даних та використав ці знання для виконання прикладних програм.