МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
"Перетворення типів даних"
МЕТОДИЧНІ ВКАЗІВКИ
до лабораторної роботи № 2
з дисципліни
" Програмування. Частина III.
Структури даних та алгоритми "
для студентів напряму
6.050102 “Комп’ютерна інженерія”
Львів – 2010
Методичні вказівки до лабораторної роботи "Перетворення типів даних" з дисципліни “Програмування. Частина IIІ. Структури даних та алгоритми" для підготовки студентів напряму 6.050102 “Комп’ютерна інженерія” / Укл. Т.А.Лисак, Л.О.Цигилик – Львів: Видавництво НУ “Львівська політехніка”, 2010 – 9 с.
Укладач: Лисак Т.А., ст. викладач каф.ЕОМ
Цигилик Л.О., асистент каф.ЕОМ
Відповідальний
за випуск: Мельник А.О., д-р техн. наук, проф.
Рецензенти: Мороз І.В., ст. викладач каф.ЕОМ
Юрчак І.Ю., доцент кафедри САПР, к.т.н.
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. ЗАВДАННЯ НА ЛАБОРАТОРНУ РОБОТУ
Завдання 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 – місяць народження
type_№ x0=0; // замість № підставити значення: DN % 9
type_№ x1=DN; // замість № підставити значення: DN % DN
type_№ x2=2; // замість № підставити значення: MN % 9
type_№ x3=3; // замість № підставити значення: MN % 13
type_№ x4=4; // замість № підставити значення: (DN * MN) % 9
type_№ x5=5; // замість № підставити значення: DN % 12
type_№ x6=6; // замість № підставити значення: MN % 3
type_№ x7=7; // замість № підставити значення: (DN * MN) % 12
type_№ x8=8; // замість № підставити значення: DN % 13
type_№ x9=9; // замість № підставити значення: MN % 6
type_№ x10=10; // замість № підставити значення: (DN * MN) % 10
type_№ 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=DN*MN*100; // наприклад: 5*3*100=1500 => x_0=1500;
const int x_1= 0dnmn0; // наприклад: x_1=005030;
const int x_2= 0xdnmn; // наприклад: x_2=0x0503;
const int x_3= 0mndn0; // наприклад: x_3=003050;
const int x_4= 0xmndn; // наприклад: x_4=0x0305;
const double y_0=DN*MN/100; // наприклад: 5*3/100=0.15 => y_0=0.15;
const double y_1= - DN.MN; // наприклад: y_1=-5.3;
const double y_2= MN. DN e +2; // наприклад: y_2=3.5e+2;
const double y_3= - DN.MN e 1; // наприклад: y_3=-5.3e1;
const double y_4= - MN. DN e -1; // наприклад: y_4=-3.5e-1;
int x = х_№; // замість № підставити значення: DN % 5
double y = y_№; // замість № підставити значення: DN % 3
char v0=*reinterpret_cast<char*> (&x) +3; printf("%d %x %c \n", v0,v0,v0);
char v1 = static_cast< char > (x)+11; printf("%d %x %c \n", v1,v1,v1);
char v2=*reinterpret_cast<char*> (&x) +1; printf("%d %x %c \n", v2,v2,v2);
char v3=*(reinterpret_cast<char*> (&x)+1)+11; printf("%d %x %c \n", v3,v3,v3);
char v4 = static_cast< char > (x)+22; printf("%d %x %c \n", v4,v4,v4);
char v5=*reinterpret_cast<char*> (&x) +2; printf("%d %x %c \n", v5,v5,v5);
char v6=*(reinterpret_cast<char*> (&x)+2)+22; printf("%d %x %c \n", v6,v6,v6);
char *v7=reinterpret_cast<char*> (&x); printf("%d %x %c \n", *v7+1,*v7+2, *v7+3);
char w0 =*(reinterpret_cast<char*>(&y)+2)+12; printf("%x %u %d \n", w0,w0,w0);
long w1 =*reinterpret_cast<long*>(&y)+33; printf("%lx %lu %ld \n", w1,w1,w1);
long w2=static_cast<long>(y)+55; printf("%lx %lu %ld \n", w2,w2,w2);
short w3=*reinterpret_cast<short*>(&y) + 1; printf("%x %u %d \n", w3,w3,w3);
short w4=*(reinterpret_cast<short*>(&y)+1)+11; printf("%x %u %d \n", w4,w4,w4);
short w5=*(reinterpret_cast<short*>(&y)+2)+12; printf("%x %u %d \n", w5,w5,w5);
short w6=*(reinterpret_cast<short*>(&y)+3)+13; printf("%x %u %d \n", w6,w6,w6);
short w7=*(reinterpret_cast<short*>(&y)+2)+2; printf("%x %u %d \n", w7,w7,w7);
5. ВИБІР ІНДИВІДУАЛЬНОГО ЗАВДАННЯ
Вибрати назви змінних для дослідження в завданні 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
6. ВИМОГИ ДО ОФОРМЛЕННЯ ЗВІТУ
I. Оформити титульну сторінку звіту стандартного зразка, на якій обов’язково вказати номер лабораторної роботи, її назву та вибір номера варіанта.
II. В звіті мають бути відображені наступні пункти:
Мета роботи.
Постановка задачі.
Алгоритм розв’язання задачі.
Система тестів.
Результати виконання програми.
Висновки.
Додатки.
IIІ. Змістовне наповнення пунктів:
Постановка задачі має містити індивідуальне завдання зі своїми конкретними значеннями.
В пункті алгоритм розв’язання задачі надається словесний опис основних прийомів, що застосовуються для знаходження розв’язку.
В пункті система тестів наводяться основні ручні розрахунки.
7. КОНТРОЛЬНІ ПИТАННЯ
1.
Оголошено змінні:
signed char sch;
unsigned char uch;
double dх;
Які неявні перетворення типів будуть виконані:
sch = uch + dx;
Відповідь дати в такій формі: 1) int → double
2) float → double
3) . . .
Визначити результат виконання фрагменту програми. Відповідь пояснити.
2.
int x= 0XC1A70000;
printf("%f",* reinterpret_cast<float*> (&x));
4.
float x=2670.05; //2670.05 = 0XA6E.0CCCCC
printf("%d",*reinterpret_cast<short*> (&x));
3.
int x= 0XC1A70000;
printf("%c",*(reinterpret_cast<char*>(&x)+2)+5);
5.
float x=2670.05;
printf("%d", static_cast<int> (x));
СПИСОК ЛІТЕРАТУРИ
Грегори К. Использование Visual С++. Специальное издание. - М.: «Диалектика», 1999.
Мешков А.В., Тихомиров Ю.В. Visual С++ и MFC. Пер. с англ. – 2-е изд. перераб. и доп. – СПб.: БХВ - Петербург, 2002. – 1040 с.
Страуструп Б. Язык программирования С++. Третье издание. - М.: «Издательство Бином», 1999.
Трамбле Ж., Соренсон П. Введение в структуры данных. – М.:Машиностроение, 1982
Уильям Топп, Уильям Форд. Структуры данных в С++. – М.:Бином, 2000 - 700 с
ЗМІСТ
Мета роботи……………………………………..………………………………………..……3
Теоретичні відомості……………………………….…….……………………………..……..3
Порядок виконання роботи….…………………………………………………………...…....4
Завдання на лабораторну роботу…..………………………………………..……..…….…....4
Вибір індивідуального завдання……………………………………………………….……...6
Зміст звіту....................................………...…………………………………………………......6
Контрольні завдання.................………..…………………………………………………….....7
Список літератури........................………...………………………………………………….....7
НАВЧАЛЬНЕ ВИДАННЯ
МЕТОДИЧНІ ВКАЗІВКИ
до лабораторної роботи
"Перетворення типів даних"
з дисципліни
“Програмування. Частина IIІ. Структури даних та алгоритми"
для підготовки студентів напряму
6.050102 “Комп’ютерна інженерія
Укладачі Т.А.Лисак, ст. викладач каф.ЕОМ
Л.О. Цигилик, асистент каф.ЕОМ
Редактор
Комп’ютерне складання
Підписано до друку 2010 р.
Формат 70 х 100 1/16. Папір офсетний.
Друк на різографі. Умовн. друк. арк. ...... Обл.-вид. арк. ......
Наклад ..... прим. Зам.
Поліграфічний центр
Видавництва Національного університету “Львівська політехніка”
вул. Колесси, 2, 79000, Львів