Лабораторні роботи з дисципліни:
“ Технологія створення програмних продуктів "

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

Тема: Базові типи даних, арифметичні операції і їх пріоритет, перетворення типів даних

Дидактична мета заняття: отримання практичних навичок роботи з типами даних мови C, отримання практичних навичок програмування алгоритмів лінійної структури

Розвиваюча мета заняття: Розвивати творчість та культуру написання програм. Розвивати логічне мислення, увагу, уяву, кмітливість

Виховна мета заняття: Виховувати охайність, культуру спілкування, ввічливість , дисциплінованість, наполегливість у навчанні, дбайливе ставлення до програмного забезпечення та ПК.

Програмне забезпечення: Builder C++

Технічні засоби навчання: комп’ютер.

I. Вступний інструктаж

Повторити правила техніки безпеки при роботі за ПК

II. Хід виконання роботи

Короткі теоретичні відомості

Концепція типу даних з'явилася в мовах програмування високого рівня як природне віддзеркалення того факту, що дані, що обробляються програмою, можуть мати різні діапазони допустимих значень, зберігатися в пам'яті комп'ютера різним чином, займати різні обсяги пам'яті та оброблятися за допомогою різних команд процесора.

В C існує всього лише кілька базових типів:
char - одиничний байт, який може містити один символ з допустимого символьного набору;
int - ціле, зазвичай відображає цілочисельний регістр процесора;
float - число з плаваючою точкою одинарної точності;
double - число з плаваючою точкою подвійної точності.

Є також кілька кваліфікаторів, які можна використовувати разом із зазначеними базовими типами. Наприклад, кваліфікатори signed (зі знаком) або unsigned (без знаку) можна застосовувати до будь-якого цілочисельного типу. За замовчуванням змінні цілих типів мають знак, тому кваліфікатор signed є необов’язковим. Значення unsigned завжди невід’ємне.

Якщо кваліфікатори short (короткий) і long (довгий) застосовуються до цілих, то можна не вказувати тип int:

short a; /*замість short int a;*/
long b; /*замість long int b; */
unsigned short c; /*замість unsigned short int c; */
unsigned long d; /*замість unsigned long int d; */

Нижче наведена таблиця з діапазонами значень базових типів з можливими кваліфікаторами:

Назва типу

Опис типу

Діапазон значень

Ціле

char

Ціле число

-128 ... 127

unsigned char

Ціле число без знака

0 ... 255

short int

Ціле число

-32768 ... 32767

unsigned short int

Ціле число без знака

0 ... 65535

int

Ціле число

-231 ... 231-1

unsigned int

Ціле число без знака

0 ... 232-1

long int

Ціле число

-231 ... 231-1

unsigned long int

Ціле число без знака

0 ... 232-1

Дробові

float

Число з плаваючою точкою

3.4⋅10-38 ... 3.4⋅10+38

double

Число з плаваючою точкою подвійної точності

1.7⋅10-308 ... 1.7⋅10+380

Оголошення змінних в мові C

Змінна - це іменована область пам'яті, до якої ми маємо доступ з програми; туди можна поміщати значення і потім отримувати їх. Кожна змінна мови C має певний тип, який характеризує розмір та розташування цієї області пам'яті, діапазон значень, які вона може зберігати, формат зберігання та набір операцій.

Мова C вимагає, щоб змінна була відома до першого звернення до неї. Це викликано необхідністю гарантувати правильність використання змінної відповідно до її типу.

Ім'я змінної, або ідентифікатор, може складатися з латинських букв, цифр і символу підкреслення. Великі і малі літери в іменах розрізняються. Крім того, ідентифікатор повинен починатися з букви або символу підкреслення, але не може починатися з цифри.

Числові константи в мові C

Коли в програмі зустрічається деяке число, наприклад 1, то це число називається константою. Константою тому, що ми не можемо змінити його значення. Кожна константа має певний тип, який визначається її значенням. Цілочисельні константи за умовчанням мають тип int, а константи з плаваючою комою - тип double. Так, 0 має тип int, 3.14159 - тип double.

Константи цілих типів можна записати в десятковій, вісімковій та шістнадцятковій формі. Якщо константа починається з 0 (нуля), вона трактується як вісімкове число, якщо з 0х або 0Х, то як шістнадцяткове. Звичний запис розглядається як десяткове число. Ось як виглядає число 25, записане десятковою, вісімковою та шістнадцятковою константою:

25 десяткова форма
031 вісімкова форма
0х19 шістнадцяткова форма

За замовчуванням всі цілі константи мають тип int. Можна явно призначити цілій константі тип long, приписавши в кінці числа букву L (допускається як велика L, так і мала l, однак для зручності читання не слід вживати малу: її легко переплутати з одиницею). Буква U (або u) наприкінці визначає константу як unsigned int, а дві букви - UL або LU - як тип unsigned long.

Константи, що є дійсними числами, можуть бути записані як з десятковою крапкою, так і в науковій (експоненціальній) формі запису. За умовчанням вони мають тип double. Для явної вказівки типу float потрібно використовувати суфікс F або f, а для long double - L або l, але тільки у разі запису з десятковою крапкою.

Приведення (перетворення) типів у мові C

Якщо операнди оператора належать до різних типів, то при виконанні арифметичних операцій вони приводяться до деякого загального типу. Приведення виконується відповідно з невеликим числом правил. Зазвичай автоматично виконуються лише ті перетворення, які без будь-якої втрати інформації перетворюють операнди з меншим діапазоном значень в операнди з більшим діапазоном, як, наприклад, перетворення цілого в дробове у виразах на зразок float + int. Вирази, які не мають сенсу, наприклад число з плаваючою крапкою в ролі індексу, не допускаються. Вирази, в яких могла б втрачатися інформація (скажімо, при присвоєнні довгих цілих змінним коротших типів або при присвоєнні значень з плаваючою комою цілим змінним), можуть спричинити за собою попередження (warning), але вони допустимі.

Існує одна тонкість, що стосується перетворення символів в цілі числа: мова не визначає, чи є змінні типу char знаковими або беззнаковими. На деяких машинах значення типу char з одиничним старшим бітом буде перетворено на негативне ціле (за допомогою "поширення знака"). На інших - перетворення char в int здійснюється додаванням нулів зліва таким чином, що завжди отримується позитивне значення.

Неявні арифметичні перетворення, як правило, здійснюються природним чином. У загальному випадку, коли такі оператори як + або * з двома операндами (бінарний оператор) мають різнотипні операнди, перш ніж операція почне виконуватися, "нижчий" тип підвищується до "вищого". Результат буде мати вищий тип.

Цілі і числа з плаваючою точкою

При перетворенні з типу з плаваючою точкою в цілочисельний дробова частина значення відкидається; якщо отримане при цьому значення не можна представити в заданому цілочисельному типі, то результат не визначений. Зокрема, не визначено результат перетворення негативних значень з плаваючою крапкою в беззнакові цілі.

Якщо значення перетворюється з цілого у величину з плаваючою комою і воно знаходиться в допустимому діапазоні, але видається в новому типі неточно, то результатом буде одне з двох значень нового типу, найближчих до вхідного. Якщо результат виходить за межі діапазону допустимих значень, поведінка програми не визначена.

Типи з плаваючою точкою

При перетворенні з типу з плаваючою комою меншої точності в тип з плаваючою комою більшої точності значення не змінюється. Якщо навпаки, перехід здійснюється від більшої точності до меншої і значення залишається в допустимих межах нового типу, то результатом буде одне з двох найближчих значень нового типу. Якщо результат виходить за межі діапазону допустимих значень, поведінка програми не визначена.

Явне перетворення типів

Явне перетворення типів може бути здійснене за допомогою операції приведення типів, яка має формат:

( ім'я-типу )операнд

Наприклад:

int a = 5;

float b;

b = (float) a; /* перетворення a цілого типу у дійсне значення */

Приктична частина

1. Постановка задачі.

Розробити програму з власнисми функціями:
1. для обчислення виразів c1, c2, c3 та c4 згідно варіанту з додатку 1. Результат обчислення величин вивести на екран (для цього використовувати функцію printf().
2. для виконання обчислень згідно варіанту з додатку 2. Результат обчислення величин вивести на екран (для цього використовувати функцію printf(). Для завдання 3 результат вивести в вісімковому, десятковому та шістнадцятковому форматах.
3. для виконання обчислень в додатках 1 та 2 згідно варіанту використайте операції приведення типів мови С++ де це необхідно для отримання правильної відповіді. Результат обчислення величин вивести на екран.

2. Побудова математичної моделі

Потрібно скористатись або вивести математичні формули для розв’язання завдання.

3. Побудова алгоритму

Розробити блок-схему в якій відобразити порядок виконання обчислювальних операцій на основі математичної моделі.

4. Складання сценарію діалогу ПК з користувачем

Визначити правила роботи людини з ПК, правила введення даних, форму подання інформації користувачу.

5. Складання програми

Описуємо лістинг програми

6. Відлагодження

Виправляємо помилки при компіляції.

7.Тестування програми.

Перевіряємо роботу програми. Дані потрібно вводити такі, щоб результат роботи програми був відомий вам на перед. Дані можна взяти з математичної моделі.

8. Оформити звіт.

III. Зміст звіту

  1. Тема
  2. Мета
  3. Хід робити(з пунктами 1-7)
  4. Висновок

IV. Контрольні питання

  1. Які базові типи даних в мові C ви знаєте?
  2. Скільки байт відводиться для зберігання кожного з базових типів даних в мові C?
  3. З яких компонент складається оголошення змінної в мові C?
  4. У чому відмінність простих і складених операторів?
  5. Які арифметичні операції мають найвищий пріоритет у мові C? Які найменший?
  6. Як відбувається перетворення з типів плаваючою точкою в цілочисельні?
  7. Як відбувається перетворення з цілочисельні типів в типи з плаваючою точкою?
  8. Які функції стандартного вводу/виводу мови C вам відомі?

Додаток 1. Варіанти завдань

Номер варіанта

Завдання 1

Завдання 2

Завдання 3

Завдання 4

1

int a1 = 5;

int b1 = 2;

int c1;

c1 = a1/b1;

float a2 = 5;

int c2;

c2 = a2/2.0;

unsigned char a3 = 100;

unsigned short c3;

c3 = a3 + 65540;

unsigned char a4 = 100;

unsigned short c4;

c4 = a4 - 170;

2

iint a = 5;
int b = 2;
float c1;
c1 = a/b;

float a2 = 5;
int b2 = 2;
float c2;
c2 = a2/b2;

unsigned char a3 = 100;
unsigned char c3;
c3 = a3 + 200;

unsigned char a4 = 17;
unsigned char c4;
c4 = a4 - 20;

3

intint a = 5;
float c1;
c1 = a/2.0;

int a2 = 5;
float b2 = 2;
int c2;
c2 = a2/b2;

unsigned short a3= 100;
unsigned char c3;
c3 = a3 + 190;

unsigned char a4 = 2;
unsigned short c4;
c4 = a4 -3;

4

int aint a = 4;
int b = 2;
int c1;
c1 = (a+1)/b;

int a2 = 5;
double b2 = 2;
int c2;
c2 = a2/b2;

unsigned char a3 = 100;
unsigned char c3;
c3 = a3 + 217;

unsigned char a4 = 4;
unsigned short c4;
c4 = a4 - 170;

5

int a = 4;
int b = 2;
int c1;
c1 = (a-1)/b;

int a2 = 5;
int c2;
c2 = a2/2.0;

unsigned short a3= 270;
unsigned char c3;
c3 = a3*2;

unsigned char a4 = 4;
unsigned char c4;
c4 = a4 – 5;

6

float a = 4;

float b = 2;
int c1;
c1 = (a+1)/b;

double a2 = 5;

int b2 = 2;
int c2;
c2 = a2/b2;

unsigned char a3 = 199;

unsigned char c3;
c3 = a3*2;

unsigned short a4=1000;

unsigned char c4;
c4 = a4 - 10;

7

float a = 4;
float b = 2;
int c1;
c1 = (a-1)/b;

int a2 = 5;
int b2 = 2;
float c2;
c2 = a2/b2;

unsigned char a3 = 200;
unsigned short c3;
c3 = a3*400;

unsigned short a4=2000;
unsigned char c4;
c4 = a4 - 20;

8

float a = 5;
int c1;
c1 = a/2.0;

Int a2 = 7;
float c2;
c2 = a2/2.0;

unsigned char a3 = 17;
unsigned char c3;
c3 = a3*a3;

unsigned short a4=10;
unsigned char c4;
c4 = a4 - 20;

9

int a = 5;
int b = 2;
int c = 2;
int c1;
c1 = a/b + c;

float a2 = 7;
int b2 = 2;
float c2;
c2 = a2/(b2+1);

unsigned char a3 = 16;
unsigned char c3;
c3 = a3*(a3+5);

unsigned char a4=18;
unsigned char c4;
c4 = a4 – 37;

10

int a = 5;
int b = 2;
float c = 2;
int c1;
c1 = a/b + c;

int a2 = 7;
int b2 = 2;
float c2;
c2 = a2/(b2+1);

unsigned char a3 = 25;
unsigned char c3;
c3 = a3*(a3-3);

unsigned short a4=1000;
unsigned char c4;
c4 = a4 - 100;

11

float a = 5;
int b = 2;
int c = 2;
int c1;
c1 = a/b + c;

int a2 = 7;
int b2 = 2;
float c2;
c2 = a2/(b2+1.0);

unsigned short a3= 100;
unsigned short c3;
c3=a3*(a3+5)*(a3+10);

unsigned short a4=2000;
unsigned char c4;
c4 = a4 - 200;

12

int a = 5;
float b = 2;
int c = 2;
int c1;
c1 = a/b + c;

int a2 = 8;
int b2 = 2;
float c2;
c2 = (a2+1)/b2+1;

unsigned short a3= 150;
unsigned char c3;
c3 = a3 + 217;

unsigned char a4=100;
unsigned char c4;
c4 = a4 - 140;

13

int a = 5;
int b = 3;
int c = 1;
int c1;
c1 = a/b - c;

float a2 = 8;
int b2 = 2;
float c2;
c2 = (a2+1)/b2+1;

unsigned char a3 = 80;
unsigned char c3;
c3 = a3*(a3-4);

unsigned short a4=1;
unsigned char c4;
c4 = a4 - 2;

14

int a = 5;
int b = 3;
int c = 1;
float c1;
c1 = a/b - c;

int a2 = 8;
int b2 = 2;
int c2;
c2=(a2+1)/b2+1.5;

unsigned char a3 = 180;
unsigned char c3;
c3 = a3*3;

unsigned char a4=1;
unsigned short c4;
c4 = a4 - 2;

15

float a = 5;
int b = 3;
int c = 1;
float c1;
c1 = a/b - c;

int a2 = 8;
int b2 = 2;
float c2;
c2 = (a2+1)/b2+1;

unsigned char a3 = 180;
unsigned char c3;
c3 = (a3+7)*2;

unsigned char a4=100;
unsigned short c4;
c4 = a4 - 200;

16

int a = 7;
int b = 2;
int c = 1;
int c1;
c1 = a/(b + c);

int a2 = 8;
int b2 = 2;
float c2;
c2 = (a2+1.0)/b2;

unsigned char a3 = 250;
unsigned short c3;
c3 = a3*(a3+25)+3;

unsigned char a4=100;
unsigned char c4;
c4 = a4 - 200;

17

int a = 7;
int b = 2;

int c = 1;
float c1;
c1 = a/(b + c);

int a2 = 10;
int c2;

c2 = a2/(a2 - 6);

unsigned char a3 = 250;
unsigned char c3;

c3 = a3+25;

unsigned short a4=1;
unsigned short c4;

c4 = a4 - 2;

18

float a = 7;
int b = 2;
int c = 1;
int c1;
c1 = a/(b + c);

int a2 = 10;
float c2;
c2=(a2+4.0)/(a2-6);

unsigned char a3 = 200;
unsigned char c3;
c3 = a3+100;

unsigned short a4=1000;
unsigned char c4;
c4 = a4 - 1;

19

int a = 7;
int c1;
c1 = a/3;

int a2 = 10;
int c2;
c2=(a2+4.0)/(a2-6);

unsigned char a3 = 200;
unsigned char c3;
c3 = a3*3;

unsigned short a4=700;
unsigned char c4;
c4 = a4 - 1;

20

int a = 7;
int c1;
c1 = a/3.5;

int a2 = 7;
int b2 = 2;
int d2 = 1;
int c2;
c2 = a2/b2 – d2;

unsigned short a3= 200;
unsigned char c3;
c3 = a3*3;

unsigned short a4=12;
unsigned char c4;
c4 = a4 – 700;

21

int a = 7;
float c1;
c1 = a/3;

int a2 = 5;
int b2 = 3;
int d2 = 1;
float c2;
c2 = a2/b2 – d2;

unsigned short a3= 500;
unsigned short c3;
c3 = a3*(a3+7);

unsigned short a4=10;
unsigned char c4;
c4 = a4 – 17;

22

int a = 5;
int b = 3;
int c = 1;
int c1;
c1 = a/b - c;

int a2 = 8;
int b2 = 2;
int c2;
c2=(a2+1)/b2+1.5;

unsigned char a3 = 180;
unsigned char c3;
c3 = (a3+7)*2;

unsigned char a4=100;
unsigned short c4;
c4 = a4 - 200;

23

int a = 5;
int b = 3;
int c = 1;
float c1;
c1 = a/b - c;

int a2 = 8;
int b2 = 2;
float c2;
c2 = (a2+1)/b2+1;

unsigned char a3 = 250;
unsigned short c3;
c3 = a3*(a3+25)+3;

unsigned short a4=1000;
unsigned char c4;
c4 = a4 - 1;

24

int a = 7;
int b = 2;
int c = 1;
int c1;
c1 = a/(b + c);

int a2 = 10;
float c2;
c2=(a2+4.0)/(a2-6);

unsigned char a3 = 200;
unsigned char c3;
c3 = a3*3;

unsigned short a4=12;
unsigned char c4;
c4 = a4 – 700;

25

int a = 7;
int b = 2;
int c = 1;
int c1;
c1 = a/(b + c);

int a2 = 8;
int b2 = 2;
float c2;
c2 = (a2-1.0)/b2;

unsigned char a3 = 16;
unsigned char c3;
c3 = a3*(a3+5);

unsigned char a4=18;
unsigned char c4;
c4 = a4 – 37;

Додаток 2. Варіанти завдань

Номер варіанта

Завдання 1

Завдання 2

Завдання 3

1

int j, b = 5, a =4 ; j = b---a;

7 - 2 * ( 5 / 2 ) =

5 + 05 =

2

int j, b = 5, a =4 ; j = (b--)-a;

7 - (2 * 5) / 3 =

07 + 7 =

3

int j, b = 5, a =4 ; j = b-(--a);

(float)7 - 2 * ( 5 / 2 ) =

0х10 + 10 =

4

int j, b = 5, a =4 ; j = --b-a--;

7 – (float)2 * ( 5 / 3 ) =

0х12 + 2 =

5

int j, b = 5, a =4 ; j = b+++a;

9 - 2 * ( 5 / 4 ) =

6 + 06 =

6

int j, b = 5, a =4 ; j = (b++)+a;

7 - (4 * 5) / 2 =

012 + 12 =

7

int j, b = 5, a =4 ; j = b+(++a);

(float) 9 - 2 * ( 5 / 2 ) =

0х1A + 10 =

8

int j, b = 5, a =4 ; j = ++b+a++;

9 – (float)2 * ( 5 / 7 ) =

0х77 + 17 =

9

int j, b = 5, a =4 ; j = ++b-a--;

18 - 2 * ( 7 / 3 ) =

15 + 05 =

10

int j, b = 5, a =4 ; j = (b++)-a;

18 - (2 * 5) / 4 =

07 + 14 =

11

int j, b = 5, a =4 ; j = b-(++a);

(float) 13 - 2 * ( 5 / 2 ) =

0х1А + 10 =

12

int j, b = 5, a =4 ; j = --b-a++;

7 – (float)2 * ( 5 / 9 ) =

0х22 + 22 =

13

int j, b = 5, a =4 ; j = ++b-a++;

18 - 2 * ( 7 / (float) 3 ) =

21 + 021 =

14

int j, b = 5, a =4, c =3; j = b---a---c;

18 - (2 * (float) 5) / 3 =

014 + 74 =

15

int j, b = 5, a =4, c =3; j = (b--)-a-(--c);

(float) 13 - 2 * ( 5 / 11 ) =

0х51 + 51 =

16

int j, b = 5, a =4, c =3; j = b-(--a)-(c--);

77 - 2 * ( 55 / 2 ) =

0х11 + 011 =

17

int j, b = 5, a =4, c =3; j = --b-a---(c--);

73 - (2.3 * 54) / 7 =

0х31 + 031 + 31=

18

int j, b = 5, a =4, c =3; j=(b---a-(++c));

18 – 2.2 * ( 7 / 3 ) =

041 + 0х41 + 41 =

19

int j, b = 5, a =4, c =3; j=(b++-a-(--c));

18 - (2 * 5) / 4.1 =

0х9 + 033 =

20

int j, b = 5, a =4, c =3;j =b-(++a)-(c--);

(float)17 – 2 * ( 5 / 2 ) =

0х20 + 12 =

21

int j, b = 5, a =4, c =3; j=--b-a---(c++);

7 – (float)2 * ( 5 / 12 ) =

37 + 012 =

22

int j, b = 5, a =4, c =3; j = b---a---c;

(float) 13 - 2 * ( 5 / 11 ) =

0х11 + 011 =

23

int j, b = 5, a =4, c =3; j = (b--)-a-(--c);

77 - 2 * ( 55 / 2 ) =

0х31 + 031 + 31=

24

int j, b = 5, a =4, c =3; j = b-(--a)-(c--);

73 - (2.3 * 54) / 7 =

041 + 0х41 + 41 =

25

int j, b = 5, a =4 ; j = b+++a;

7 - (4 * 5) / 2 =

0х1A + 10 =