
- •Звіт з практики
- •5.05010301 “Розробка програмного забезпечення”
- •Вибір варіанту завдань
- •1. Основні поняття Object Pascal
- •Label { Розділ опису міток } Const { Розділ опису констант }
- •Дійсні дані зображуються в експоненціальній формі
- •Введення і виведення даних. Для введення і виведення даних використовуються процедури
- •Лабораторна робота № 1 Лінійні програми з розгалуженнями
- •2. Оператори повторень
- •Оператор for з зарезервованим словом to виконується за алгоритмом:
- •Завершення виконання оператора for.
- •Лабораторна робота № 2 Циклічні програми. Обчислення з заданою точністю
- •3. Структуровані типи даних. Масиви
- •Лабораторна робота № 3 Алгоритми обробки масивів
- •4. Алгоритми обробки багатовимірних масивів
- •Лабораторна робота № 4 Алгоритми обробки багатовимірних масивів
- •5. Упорядкування і пошук даних
- •Лабораторна робота № 5 Упорядкування і пошук даних
- •6. Структуровані типи даних. Множини
- •Лабораторна робота № 6 Множини
- •7. Символьні рядки
- •Лабораторна робота № 7 Символьні рядки
- •8. Процедури і функції
- •Лабораторна робота № 8 Процедури і функції
- •9. Процедури і функції. Процедурні типи
- •Лабораторна робота № 9 Процедурні типи
- •Теоретичні відомості для виконання лабораторної роботи
- •1. Формула середніх прямокутників
- •2. Формула трапецій
- •3. Формула Сімпсона (формула парабол)
- •Розв’язування рівнянь. Розв’язування рівнянь виду
- •10. Рекурсивні процедури і функції Рекурсія – це такий спосіб організації обчислювального процесу, при якому підпрограма під час виконання звертається сама до себе.
- •Лабораторна робота № 10 Рекурсивні процедури і функції
- •11. Файли
- •Лабораторна робота № 11 Текстові файли
- •Додаток а Процедури і функції Object Pascal
5. Упорядкування і пошук даних
Упорядкування даних. Одним із важливих є клас задач – упорядкування файлів, тобто розміщення елементів даних у певному порядку, що дозволяє значно прискорити пошук і обробку інформації. Упорядкування даних може бути за зростанням, за спаданням, за алфавітним порядком.
Упорядковувати доводиться як прості структури даних (масиви чисел), так і складні (масиви записів). У випадку записів упорядкування здійснюється за ключами, тобто окремими полями або групою полів запису. Ключі можуть бути як числовими, так і символьними. Переміщення ключа при упорядкуванні вимагає переміщення всього запису, але це не викликає принципових труднощів, тому розглянемо впорядкування масивів.
Упорядкування може бути внутрішнім і зовнішнім. Якщо дані, які впорядковуються, цілком розміщені в пам’яті, то упорядкування буде внутрішнім. Якщо даних багато і для їх розміщення вимагається зовнішня пам’ять, то впорядкування буде зовнішнім. При зовнішньому впорядкуванні масив даних розбивається на частини, які впорядковуються методами внутрішнього впорядкування і потім зливаються в один упорядкований масив.
Методи внутрішнього впорядкування базуються на таких підходах:
1. Вибірка: вибирається найбільший (або найменший) елемент масиву і поміщається на перше місце, потім аналогічна процедура виконується з елементами, що залишилися.
2. Обмін: багатократно порівнюються і впорядковуються сусідні елементи.
3. Вставка: кожний новий елемент уставляється в правильну позицію стосовно вже розміщених у масиві і впорядкованих елементів.
4. Злиття: впорядковані підмножини елементів об’єднуються в більші впорядковані підмножини.
5. Розподіл: машинна модифікація ручних методів упорядкування. Наприклад, упорядкування листів на пошті. Перша механічна версія такого впорядкування називається цифровим упорядкуванням. Ключ упорядкування розділяється на цифри, дані впорядковуються за значенням старшої цифри, потім отримані підмножини упорядковуються за значенням наступної цифри і так далі.
Розглянемо алгоритм упорядкування вибіркою.
Приклад.
Нехай
задано масив цілих чисел
.
Розробити програму, яка впорядковує
цей масивів за зростанням елементів.
Для впорядкування елементів масиву за зростанням шукається мінімальний елемент і міняється місцем з першим елементом. На наступному кроці шукається мінімальний серед тих елементів, що залишилися, і міняється місцем з другим елементом і т. д. Останній -ий елемент автоматично буде розміщений на своєму місці.
Програма впорядкування за зростанням масиву цілих чисел має вигляд:
Program LABR5_1;
{$APPTYPE CONSOLE}
uses Sysutils;
VAR a: array[1..300] of integer;
n, i, j, k, r: integer;
BEGIN
{Введення початкових даних}
writeln(‘Введіть розмір масиву а, (n<=300)’);
readln(n);
writeln(‘Введіть елементи масиву а’);
for i:=1 to n do
read(a[i]);
{Упорядкування за зростанням методом вибірки}
for i:=1 to n-1 do
begin k:=i;
for j:=i+1 to n do
if a[j]<a[k] then k:=j;
r:=a[i];
a[i]:=a[k];
a[k]:=r;
end;
{Виведення масиву по п’ять елементів у рядку}
for i:=1 to n do
if i mod 5 <> 0 then write(a[i]:6)
else writeln(a[i]:6);
readln;
END.
Розглянемо алгоритм злиття впорядкованих масивів. Цей алгоритм можна використовувати як для внутрішнього, так і зовнішнього впорядкування.
Приклад.
Нехай
задано два впорядкованих за зростанням
елементів масиви цілих чисел
і
.
Розробити програму, яка зливає ці масиви
в один упорядкований за неспаданням
елементів масив
.
Для
злиття масивів порівнюємо елементи
масивів
і
:
якщо
,
то
записуємо в масив
і переходимо до
,
інакше в масив
записуємо
і переходимо до
і т. д. Цей процес завершується, якщо
вичерпуються елементи масиву
або
.
Якщо вичерпався масив
,
то елементи, які залишилися у масиві
,
дописуються в масив
.
Якщо вичерпався масив
,
то елементи, які залишилися в масиві
,
дописуються в масив
.
Програма злиття упорядкованих масивів
має вигляд
Program LABR5_2;
{$APPTYPE CONSOLE}
uses Sysutils;
VAR a : array[1..300] of integer;
b : array[1..200] of integer;
c : array[1..500] of integer;
n, m, i, j, k: integer;
BEGIN
{Введення початкових даних}
writeln(‘Введіть розмір масиву а, (n<=300)’);
readln(n);
writeln(‘Введіть впорядковані елементи масиву а’);
for i:=1 to n do
read(a[i]);
writeln(‘Введіть розмір масиву b, (m<=200)’);
readln(m);
writeln(‘Введіть впорядковані елементи масиву b’);
for i:=1 to m do
read(b[i]);
{Впорядкування злиттям}
i:=1; j:=1; k:=0;
while (i <= n) and (j <= m) do
if a[i] < b[j] then
begin k:=k+1; c[k]:=a[i]; i:=i+1;end
else
begin k:=k+1; c[k]:=b[j]; j:=j+1;end;
if i > n then
for i:=j to m do
begin k:=k+1; c[k]:=b[i]; end
else
for j:=i to n do
begin k:=k+1; c[k]:=a[j]; end;
{Виведення впорядкованого масиву}
{ по п’ять елементів у рядку}
for i:=1 to k do
if i mod 5 <> 0 then write(c[i]:6)
else writeln(c[i]:6);
readln;
END.
Пошук даних. Задача пошуку даних є основною при роботі з великими обcягами інформації. Якщо дані не впорядковані, то пошук зводиться до послідовного перегляду всіх даних. Якщо дані впорядковані, то існує ряд ефективних алгоритмів пошуку даних.
Розглянемо один з таких алгоритмів пошуку даних поділом масиву навпіл.
Приклад.
Нехай задано масив упорядкованих за
зростанням цілих чисел
,
.
Розробити програму, яка знаходить у
цьому масиві порядковий номер елемента
.
Для
пошуку заданого елемента встановимо
ознаку
і межі масиву
,
.
Тепер послідовно обчислюємо
і порівнюємо
елементом масиву
.
Якщо
,
то пошук буде успішним, ознака
встановлюється рівною
,
номер елемента
буде шуканим номером. Якщо
,
то на наступному кроці розглядається
масив у межах
,
.
Якщо
,
то на наступному кроці розглядається
масив у межах
,
.
Якщо виявиться
і
не збіглося з жодним
,
то пошук буде неуспішним і ознака
дорівнюватиме
.
Описаний алгоритм називається поділом
масиву навпіл.
Програма пошуку в упорядкованому масиві методом поділу масиву навпіл має вигляд
Program LABR5_3;
{$APPTYPE CONSOLE}
uses Sysutils;
VAR x: array[1..300] of integer;
n, i, a, b, kl: integer;
f: boolean;
BEGIN
{Введення початкових даних}
writeln(‘Введіть розмір масиву x, (n<=300)’);
readln(n);
writeln(‘Введіть упорядковані елементи масиву x’);
for i:=1 to n do
read(x[i]);
writeln(‘Введіть елемент kl’);
readln(kl);
{Пошук заданого елемента в упорядкованому масиві x}
a:=1; b:=n; f:=false;
while (a < b) and (not f) do
begin i:=(a+b) div 2; {поділ масиву навпіл}
if x[i] = kl then f:=true;
if x[i] < kl then a:=i+1;
if x[i] > kl then b:=i -1;
end;
if f then writeln(‘Номер шуканого елемента в масиві =’,i)
else writeln(‘Шуканого елемента в масиві немає’);
readln;
END.