Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

5.1.1. На межах масивів "прикордонної застави" немає

У мові програмування C++ не виконується ніякої перевірки "порушення кордонів" масивів, тобто нічого не може перешкодити програмісту звернутися до масиву за його межами. Якщо це відбувається у процесі виконання настанови присвоєння, то можуть бути змінені значення в елементах пам'яті, виділених деяким іншим змінним або навіть Вашій програмі. Іншими словами, звернення до масиву (розміром у N елементів) за межею N-ro елемента може призвести до руйнування програми за відсутності яких-небудь зауважень з боку компілятора і без видачі повідомлень про помилки під час роботи програми. Це означає, що вся відповідальність за дотримання "кордонів" масивів покладається тільки на програмістів, які повинні гарантувати коректну роботу з масивами. Іншими словами, програміст зобов'язаний використовувати масиви достатньо великого розміру, щоб в них можна було без ускладнень поміщати дані. Однак краще за все у програмі передбачити перевірку перетину "кордонів" масивів.

Наприклад, С++-компілятор "мовчки" скомпілює і дасть змогу запустити таку програму на виконання, хоча у ній відбувається вихід за межі масиву cMas.

Обережно! Не виконуйте наведений нижче приклад програми. Це може призвести до руйнування Вашої системи.

Код програми 5.2. Демонстрація некоректного прикладу програми

int main()

{

int cMas[10], i;

for(i=0; i<100; i++) cMas[i] = i;

return 1;

}

У цьому випадку цикл for виконає 100 ітерацій, хоча масив cMas призначений для зберігання тільки десяти елементів. У процесі виконання цієї програми можливий перезапис важливої інформації, що може призвести до аварійної зупинки програми.

Вас, можливо, дивує така "непередбачливість" мови програмування C++, яка виражається у відсутності вбудованих засобів динамічної перевірки на "недоторканність" меж масивів. Нагадаємо, проте, що мова програмування C++ призначена для професійних програмістів, і її завдання – надати їм можливість створювати максимально ефективний програмний код. Будь-яка перевірка коректності доступу засобами мови програмування C++ істотно уповільнює виконання програми. Тому такі дії залишено на розгляд програмістам. Як буде показано далі, у разі потреби програміст може сам визначити тип масиву і закласти у ньому перевірку непорушності меж.

5.1.2. Сортування масиву

Однією з найпоширеніших операцій, що виконуються над масивами, є сортування. Існує багато різних алгоритмів сортування. Широко застосовується, наприклад, сортування перемішуванням і сортування методом Шелла. Відомий також алгоритм Quicksort (швидке сортування з розбиттям початкового набору даних на дві половини так, що будь-який елемент першої половини впорядкований щодо будь-якого елемента другої половини). Проте найпростішим вважають алгоритм сортування методом бульбашок. Незважаючи на те, що бульбашкове сортування не відрізняється високою ефективністю (і справді, його продуктивність неприйнятна для сортування великих масивів), його цілком успішно можна застосовувати для сортування масивів малого розміру.

Алгоритм сортування методом бульбашок отримав свою назву від способу, використовуваного для впорядковування елементів масиву. Тут виконуються операції порівняння, що повторюються, і у разі потреби міняються місцями суміжні елементи. При цьому елементи з меншими значеннями поступово переміщаються до одного кінця масиву, а елементи з великими значеннями – до іншого. Цей процес нагадує поведінку бульбашок повітря в резервуарі з водою. Бульбашкове сортування виконується шляхом декількох проходів по масиву, під час яких у разі потреби здійснюється перестановка елементів, що опинилися "не на своєму місці". Кількість проходів, що гарантують отримання відсортованого масиву, дорівнює кількості елементів у масиві, зменшеному на одиницю.

У наведеному нижче коді програми реалізовано сортування масиву (цілочисельного типу), що містить випадкові числа. Ця програма заслуговує уважного розбору.

Код програми 5.3. Демонстрація механізму використання методу бульбашок для сортування елементів масиву

#include <iostream> // Для потокового введення-виведення

#include <cstdlib> // Для використання бібліотечних функцій

using namespace std; // Використання стандартного простору імен

int main()

{

int tMas[10];

int a, b, t;

int size;

size = 10; // Кількість елементів, що підлягають сортуванню.

// Поміщаємо в масив випадкові числа.

for(t=0; t<size; t++) tMas[t] = rand();

// Відображаємо початковий масив.

cout << "Початковий масив: ";

for(t=0; t<size; t++) cout << tMas[t] << " ";

cout << "\n";

// Реалізація методу бульбашкового сортування.

for(a=1; a<size; a++)

for(b=size-1; b>=a; b--) {

if(tMas[b-1]> tMas[b]) { // Елементи неврегульовані.

// Міняємо елементи місцями.

t = tMas[b-1];

tMas[b-1] = tMas[b];

tMas[b] = t;

}

} // Кінець бульбашкового сортування.

// Відображаємо відсортований масив.

cout << "Відсортований масив: ";

for(t=0; t<size; t++) cout << tMas[t] << " ";

cout << "\n";

getch(); return 0;

}

Хоча алгоритм бульбашкового сортування придатний для невеликих масивів, для масивів великого розміру він стає неефективним. Більш універсальним вважають алгоритм Quicksort. У стандартну бібліотеку мови програмування C++ включена функція qsort(), яка реалізує одну з версій цього алгоритму1. Але, перш ніж використовувати її, Вам необхідно вивчити більше засобів мови програмування C++.