Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
69
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

4.2. Похідні типи

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

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

Розглянемо задачу підрахунку площі прямокутного трикутника, а також кут при одному з катетів. Значення катетів вводяться з клавіатури.

#include <stdio.h>

/*підключення бібліотек, що містять функції введення-виведення*/void main(void)

/*заголовок функції main, з якої завжди починається виконання С-програми*/

{

/*початок програми*/

float cat1, cat2, square, kut;

/*ідентифікатори cat1, cat2 вводяться для використання в програмі значень катетів, square для одержання значення площі, kut для збереження величини кута*/

scanf("%f%f', & cat1, & cat2);

/*за допомогою функції scanf вводимо з клавіатури значення катетів*/

square=cat 1*cat2/2;

/*обчислюємо площу трикутника і значення присвоюємо змінній square*/

kut=atan(cat1/cat2);

printf("square=%f ugol=%f\n', square,kut);

/*за допомогою функції printf друкуємо значення площі трикутника й відповідного кута*/

} /*кінець програми*/

Наведений текст для компіляції помилок не містить, тому програма правильно підрахує площу й величину кута. Наступний, семантично неправильний оператор

square=kut/2;

компілятор пропустить, і результат при виконанні програми буде хибним.

Перевагою похідних типів є можливість написання такої програми:

typedef float znachennia, vel_kut;

/*за допомогою ключового слова typedef вводимо нові типи даних, потім просто посилаємося на введене ім'я типу*/

znachennia cat1, cat2, square;

vel_kut kut;

/*ідентифікатори cat1, cat2 вводяться для використання в програмі значень катетів, square для одержання значення площі, kyt для збереження величини кута*/

scanf("%f%f',&cat1,&cat2);

/*за допомогою функції scanf вводимо з клавіатури значення катетів*/

square=cat1*cat2/2;

/*обчислюємо площу трикутника і значення присвоюємо змінній square*/

kut=atan(cat1/cat2);

printf("square=%f kyt=%f \n', square,kut);

/*за допомогою функції printf друкуємо значення площі трикутника й відповідного кута*/

} /*кінець програми*/

У цьому варіанті програми визначаються два нових типи – znachennia і vel_kut – на основі існуючого простого типу float. Описані за допомогою типу znachennia об'єкти містяться явно в класі, логічно відмінному від класу об'єктів, описаних типом vel_kut. Такі нові типи називаються похідними.

Введення в мову похідних типів збільшує її надійність, дозволяючи компілятору, принаймні в принципі, виявляти такі помилки, як

square=kut/2;

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

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