ДОСЛІДЖЕННЯ ВИКОРИСТАННЯ ПІДПРОГРАМ В ЛІНІЙНИХ СТРУКТУРАХ ДАНИХ

Написати програму на мові Сі, яка складається з наступних дій:

1. Створення заголовного файлу (з розширенням .h). В файлі описується:

– лінійна структура даних в зв’язаному уявленні (список), елемент якої має тип згідно з варіантом (табл.25);

– відкрита підпрограма (inline-функція) згідно з варіантом (табл.26).

2. Створення основного файлу (з розширенням .cpp), в якому необхідно:

– включити заголовний файл за допомогою директиви препроцесора include;

– описати „підпрограму_1” формування елемента першого списку згідно з варіантом (табл.25);

– описати „підпрограму_2” формування другого списку згідно з варіантом (табл.26). При формуванні використовується inline-функція;

– описати головну програму, в якій застосовуються описані підпрограми, тобто формується перший список за допомогою „підпрограми_1” (кількість елементів згідно з варіантом) та формується другий список за допомогою „підпрограми_2”.

Таблиця 25

№ варіанта Тип даних елементу списків Кількість елементів 1-го списку Перший список Спосіб формування елементу 1-го списку
char Односпрямований Включення до початку списку
float Односпрямований Включення в кінець списку
char Односпрямований Включення до початку списку
int Односпрямований Включення після першого елементу
double Односпрямований Включення в кінець списку
short Односпрямований Включення в кінець списку
float Односпрямований Включення після другого елементу
char Двоспрямований Включення в кінець списку
double Двоспрямований Включення до початку списку
long Двоспрямований Включення в кінець списку
float Односпрямований Включення до початку списку
int Односпрямований Включення після першого елементу
char Односпрямований Включення в кінець списку
double Двоспрямований Включення до початку списку
short Односпрямований Включення в кінець списку

Таблиця 26

№ варіанта Принцип формування 2-го списку Спосіб формування елементу 2-го списку Призначення inline-функції
Односпрямованого списку зі значень елементів 1-го списку, які розташовані на парних позиціях Включення в кінець списку Перевірка на рівність нулю вказівника на наступний елемент
Односпрямованого списку зі значень елементів 1-го списку, які розташовані на непарних позиціях Включення в кінець списку Перевірка на нерівність нулю вказівника на наступний елемент
Перетворення односпрямованого списку в двоспрямований список Включення в кінець списку Перевірка на рівність нулю вказівника на наступний елемент
Односпрямованого списку з парних значень елементів 1-го списку Включення до початку списку Перевірка на існування першого елементу списку
Односпрямованого списку з від’ємних значень елементів 1-го списку Включення в кінець списку Перевірка на нерівність нулю вказівника на наступний елемент
Односпрямованого списку з непарних значень елементів 1-го списку Включення до початку списку Перевірка на рівність нулю вказівника на наступний елемент
Односпрямованого списку з додатних значень елементів 1-го списку Включення до початку списку Перевірка на існування другого елементу списку
Перетворення двоспрямованого списку у односпрямований список Включення до початку списку Перевірка на рівність нулю вказівника на наступний елемент
Односпрямованого списку з додатних значень елементів 1-го списку Включення в кінець списку Перевірка на знак значення елементу списку
Односпрямованого списку з від’ємних значень елементів 1-го списку Включення до початку списку Перевірка на знак значення елементу списку
Односпрямованого списку з значень елементів 1-го списку, які більше 10 Включення в кінець списку Перевірка значення елементу списку на більшість 10
Двоспрямованого списку з значень елементів 1-го списку, які менше 5 Включення в кінець списку Перевірка значення елементу списку на меншість 5
Односпрямованого списку з значень елементів 1-го списку, які не дорівнюють символу ’а’ Включення до початку списку Перевірка значення елементу списку на рівність символу ’а’
Двоспрямованого списку з значень елементів 1-го списку, які входять до діапазону [0,1] Включення в кінець списку Перевірка значення елементу списку на входження до діапазону [0,1]
Односпрямованого списку з значень елементів 1-го списку, які кратні 3 Включення після першого елементу Перевірка значення елементу списку на кратність 3





Приклад виконання завдання

Сі

//варіант 15

Lab_11_3.h

//опис елемента списку, який складається з елемента цілого типу та покажчика
//на наступний елемент

struct Element

{

short data;

Element *pNext;

};

//опис відкритої підпрограми, яка повертає значення true, якщо значення
//елемента списку кратне 3

inline bool Check (Element * el)

{

if ((el ->data % 3) == 0)

return true;

else

return false;

}

Lab_11_3.cpp

//підключення заголовного файлу

#include "lab_11_3.h"

//опис прототипів підпрограм

void CreateElement (Element* &, short);

Element* CreateList (Element*);

void main()

{

int i;

//опис та ініціалізація покажчика на перший елемент першого списку

Element* pList1 = 0;

//організація циклу для формування 11 елементів першого списку

for (i = 1; i <= 11; i++)

//виклик підпрограми, яка формує один елемент списку
//у підпрограму передається перший елемент списку та дані для ініціалізації
//значення нового елемента списку

CreateElement(pList1, i+ 4);

//опис покажчика на перший елемент другого списку

Element* pList2;

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

pList2 = CreateList (pList1);

}

//опис «підпрограми_1», яка формує один елемент списку, включаючи його у
//кінець списку

void CreateElement (Element* & FirstEl, short d)

{

//опис змінної, яка використовується для формування нового елементу списку

Element* NewEl;

//розподіл пам’яті у купі для нового елемента

NewEl = new Element;

//запис у поле даних значення, яке передається у підпрограму

NewEl ->data = d;

//онулення покажчика на наступний елемент, оскільки новий елемент буде у
//списку останнім

NewEl ->pNext = 0;

//визначаємо місце у списку для нового елементу

//якщо списку немає, тобто покажчик на перший елемент дорівнює 0,

if (FirstEl == 0)

//то новий елемент стає першим у списку

FirstEl = NewEl;

else {

//якщо елементи у списку є, то починається пошук останнього елементу

Element* CurEl = FirstEl;

while (CurEl ->pNext != 0)

CurEl = CurEl ->pNext;

//елемент, у якого покажчик на наступний елемент дорівнює 0, є останнім у
//списку

//новий елемент ставиться у список поза знайденим останнім елементом

CurEl ->pNext = NewEl;

}

}

//опис «підпрограми_2» для формування односпрямованого списку із значень
//елементів іншого списку, покажчик на перший елемент якого передається як
//параметр підпрограми

Element* CreateList (Element* List1)

{

//опис та ініціалізація покажчика на перший елемент нового списку

Element* List2 = 0;

//опис покажчика на поточний елемент списку, за допомогою якого можна
//пересуватися по цьому списку, та

//ініціалізація цього покажчика адресою першого елементу першого списку,
Element* CurEl = List1;

//організація циклу, в якому перевіряються значення елементів першого списку
//і формуються елементи нового списку

do {

//перевірка, чи є значення елемента списку кратним 3 (використовується inline-
//підпрограма)

if(Check (CurEl)) {

//якщо значення елемента списку задовольняє вимогам, то описується елемент
//нового списку та розподіляється для нього пам’ять у купі

Element* NewEl = new Element;

//запис у поле даних нового елемента значення елемента першого списку

NewEl ->data = CurEl ->data;

//визначення місце розташування нового елемента у новому списку

//перевірка покажчика на перший елемент нового списку

if (List2 == 0) {

//запис у поле, яке вказує на наступний елемент, значення 0

NewEl ->pNext = 0;

//новий елемент стає першим у новому списку

List2 = NewEl;

}

else {

//якщо перший елемент у новому списку є, то новий елемент розташовується
//після першого елемента списку

NewEl ->pNext = List2 ->pNext;

List2 ->pNext = NewEl;

}

}

//пересунення до наступного елемента першого списку

CurEl = CurEl ->pNext;

}

while (CurEl);

//повернення з підпрограми покажчика на перший елемент нового списку

return List2;

}

Контроль знань та вмінь

Таблиці вмінь

Таблиця 23

Відкриті підпрограми та спеціальні механізми
макро шаблони inline переванта-ження рекурсія
умовна компіляція макроси істинна косвенна
п с с с с с п

Таблиця 24

Закриті підпрограми
зв'язаний список (створення) перетворення списку (1) в список (2)
односпрямований список (1) двоспрямований список (2)
п c п c п c

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

1. Що таке побічний ефект? Наведіть приклади.

2. Що таке аргумент підпрограм?

3. Наведіть типи підпрограм.

4. Опишіть засоби передачі значень у закриту підпрограму?

5. Засоби повернення значень з закритої підпрограми.

6. Дайте порівняльну характеристику закритих та відкритих підпрограм (переваги та нестатки).

7. Що таке незалежна компіляція?

8. Що таке перевантаження підпрограм?

Література: [1]; [4]; [5]; [6]; [7].

Лабораторна робота 12


2616004786427345.html
2616101890982086.html
    PR.RU™