Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OTP_labs-NEW2.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
787.97 Кб
Скачать

6.3 Приклад

Завдання. Створити функцію обчислення факторіала.

//бібліотека функцій стандартного вводу/виводу

#include <stdio.h>

//бібліотека функцій консольного вводу/виводу

#include <conio.h>

//прототип функції обчислення факторіала

int factorial(int a);

int main(void)

{

int a;

printf("Enter a: ");

scanf("%i",&a);

//введення початкових даних

//виклик функції обчислення факторіала

int r=factorial(a);

//виведення результату

printf("factorial of a is %i",r);

getch();

return 0;

}

//реалізація функції обчислення факторіала

int factorial(int a){

int r=1;

// i змінюється від 2 до a

for(int i=2;i<=a;i++)

r=r*i; //перемноження всіх i

return r;

}

Листінг 6.1 – Приклад виконання індивідуального завдання

6.4 Зміст звіту

Звіт з лабораторної роботи повинен містити:

    • мету роботи;

    • завдання на виконання роботи;

    • схему алгоритму роботи програми;

    • текст програми;

    • результати роботи програми для різних початкових даних;

    • висновки.

6.5 Завдання на лабораторну роботу

Переробіть завдання на лабораторну роботу №5, використавши функції для реалізації основної частини програми.

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

При підготовці до захисту лабораторної роботи використовуйте контрольні запитання.

6.6.1 Що таке функція на мові Сі(С++)? Для чого вона застосовується?

6.6.2 Опишіть механізм передачі параметрів у функцію.

6.6.3 Як використовується оператор return у функції?

6.6.4 Що ми маємо на увазі, коли говоримо про тип функції?

6.6.5 Чим відрізняються прототип, визначення і виклик функції?

6.6.6 Запишіть приклад прототипу функції, що повертає покажчик на змінну типу unsigned long.

6.6.7 Як передати в функцію масив та визначити останній елемент масиву? Привести приклад.

6.6.8 Чи є різниця між наступними двома заголовками функцій?

void func(int a[]) void func(int *a)

6.6.9 В чому різниця між функціями, прототипи яких мають вигляд:

int *fp(int,float) int fp(int *,float)

6.6.10 Як повернути з функції покажчик на елемент масиву?

6.6.11 Що таке перевантаження функцій? Для чого воно застосовується?

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

7 Абстрактні типи даних

Мета роботи: ознайомитись з технікою створення, зберігання і обробки динамічних списків на мові програмування C++.

7.1 Теоретичні відомості

Список це послідовність елементів, визначеного типу:

List: x1, a2,…an, n>=0.

Тип списку визначає множина операторів, заданих у списку. Найпростішим є однозв’язаний список, над яким задані наступні операції:

  1. insert (x, p, l) – вставляє елемент x на позицію p у списку l.

  2. locate (x, l) – повертає позицію x у списку l.

  3. retrieve (p, l) – повертає елемент, що стоїть на позиції p у списку l.

  4. delete (p, l) – видаляє елемент, що стоїть на позиції p у списку l.

  5. next (p, l) – повертає наступний елемент відносно позиції p.

  6. previous (p, l) – повертає попередній.

  7. make null – (l) – обнуляє список.

  8. first (l) – повертає перший елемент списку.

  9. last (l) – останній елемент списку.

Найпростіший спосіб реалізації – за допомогою масивів. Кожний елемент списку зберігається у відповідному масиву. Але така форма є незручною, оскільки операції insert і delete вимагають велику кількість перестановок елементів. Крім того, максимальна довжина списку обмежена розміром масиву. Інший спосіб – за допомогою покажчиків. Для зв’язування елементів між собою застосовуються покажчики. Список складається з комірок, які зберігають елемент списку та покажчик на наступну комірку:

Struct node

{

int data;

node * next;

}

Інші варіанти списків:

двоїв`язаний список: елемент посилається на попередній і на наступний елемент.

struct node

{int data;

node * next;

node * prev};

кільцеві списки: поле next останнього елементу посилається на перший елемент. У кільцевому двозв`язному поле prev першого елементу посилається на останній.

спеціальні види списків: стеки, черги, дерева, графи.

Стек – спеціальний вид списків, доступ до елементів якого відбувається за принципом LIFO (Last In First Out). Додавання та видалення елементів зі стеку можливе лише з одного боку списку, який називається вершиною стеку.

Операції над стеком:

  1. Make Null (S) – очищення стеку;

  2. Top (S) – повертає елемент з вершини стеку;

  3. Pop (S) – видаляє елемент з вершини стеку. Вершиною стеку стане попередній елемент;

  4. Push (x, S) – вставляє елемент в вершину стеку. Новий елемент стає вершиною стеку, а стара вершина – стає наступним елементом;

  5. IsEmpty (S) – повертає істину, якщо стек пустий.

Черги – спеціальний вид списку, елементи якого вставляються з одного боку (голова), а видаляються з іншого (хвіст).

Операції над чергами:

  1. Make Null (Q) – очищення черги;

  2. Front (Q) – повертає перший елемент черги;

  3. Enquence (x, Q) – вставляє елемент x в кінець черги Q, який стає її кінцем;

  4. Dequene (Q) – видаляє перший елемент черги;

  5. Is Empty (Q) – перевіряє, чи є черга пустою.

Абстрактний тип даних дерево зберігає інформацію щодо ієрархії об’єктів. Кожний елемент дерева має одного батька та декілька нащадків. Два елементи не можуть бути батьками і нащадками одночасно один до одного. Елемент, який має нащадків називають гілкою або вузлом. Якщо не має нащадків – лист. У дереві є один елемент, що не має батьків – корінь.

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

Операції:

  1. Parent (n, T) – повертає батька для вузла n;

  2. Left Most Child (h, T) – повертає самого лівого нащадка для вузла h;

  3. Right Sibling (n, T) – повертає брата вузла n, що стоїть правіше;

  4. Label (n, T) – повертає мітку вузла n, якщо задана. Мітки застосовуються при обході дерева;

  5. Create (…) – група операцій для створення потомків вузлів;

  6. Root (T) – повертає корінь дерева T;

  7. Make NULL (T) – очищення дерева.

Дерева розрізняються в залежності від максимальної кількості нащадків: бінарне – максимальна кількість нащадків 2, тринарне - 3 і т.д. Регулярне – всі вузли мають максимальну кількість нащадків.

Довжина дерева це максимальна кількість елементів у ланцюжку „Корінь – лист”

Будь-який вузол та всі його нащадки є піддеревом до усього дерева.

Граф це абстрактний тип даних, який описує множину елементів та зв’язків між ними. Складається з вершин (об’єктів) та дуг (зв’язків).

Графи можуть бути направлені (зв’язок діє в обидві строки). Дуги можуть мати значення. Приклад: міста на мапі – вершини графи, відстані душ.

Зазвичай зберігається в вигляді масивів – матриць інциндентності. Елемент матриці [i] [j] зберігає значення дуги між i-ою та j-ою вершиною графа.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]