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

2.7 Пошук елементів, що володіють заданою властивістю

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

У таких випадках для перегляду масиву зазвичай використовується оператор циклу while зі складним умовою. Графічна схема для розглянутого прикладу зображена на малюнку 2.12. Після циклу достатньо перевірити, чому дорівнює i . Якщо виявиться, що i = n , тобто були переглянуті всі елементи, то в масиві немає нульових елементів.

i = 0;

while (i

If (i == n)

puts ("У масиві немає нульових елементів ");

else

puts ("У масиві є нульовий елемент ");

Малюнок 2.12 Графічна схема і фрагмент програми пошуку нульового елемента в масиві

Зустрічаються завдання, в яких потрібно не тільки визначити, чи є елемент, що володіє заданою властивістю в масиві, але і номер (індекс) такого елемента. Наприклад, знайти максимальний елемент у частині масиву, що знаходиться після останнього нуля. Рішення задачі слід почати з обчислення індексу останнього нульового елемента. Для визначення індексу самого правого елемента, що володіє заданою властивістю, масив слід переглядати з кінця до тих пір, поки не закінчаться елементи і поточний елемент не дорівнює нулю (малюнок 2.13).

i = n-1;

while (i> = 0 && a [i]! = 0) i = i-1;

If (i <0)

puts ("У масиві немає нульових елементів ");

else

printf ("Індекс останнього нуля -% d n ", i);

Малюнок 2.13 Графічна схема і фрагмент програми пошуку номера останнього нульового елемента в масиві

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

2.8 Пошук у впорядкованому масиві

Упорядкованість елементів масиву дозволяє значно збільшити швидкість його обробки, за рахунок зниження числа перевіряються елементів масиву. У таких алгоритмах масив перевіряється поки виконується (або не виконується) додаткове умова, що визначає достроковий вихід з циклу. Також при складанні алгоритму необхідно враховувати зростаючим або убутним є перевірявся масив, що робить вплив на те як зручніше обробляти масив з початку або з кінця. Загалом випадки алгоритм обробки упорядкованого масиву має наступний вигляд - малюнок 2.14.

(а)

(б)

Малюнок 2.14. Графічний алгоритм обробки упорядкованого масиву з перебором з початку (а), з кінця (б)

Як видно з блок-схеми, додаткова умова управляє достроковим виходом із циклу. Поки додаткове умова істина і не кінець масиву i , цикл виконується, як тільки одна з умов буде не виконана відбувається вихід із циклу.

Приклад 2.7

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

Рішення

У даній задачі обробку масиву будемо проводити з початку. Вихід з циклу по додатковому умові буде виконаний, якщо в масиві знайдений елемент більший або рівний A ( k = 1 ). Для індикації наявності в масиві елемента рівного A , введемо допоміжну змінну f з початковим значенням f = 0 . При виявленні елемента A , змінна f = 1 . Для визначення номера позиції числа A в масиві введемо додаткову змінну poz з початковим значенням n , тобто припускаючи, що всі елементи масиву менше A . При виявленні в масиві числа більшого або рівного A у змінній poz зберігається його індекс - i . Після виходу з циклу, за значенням змінної f визначається наявність і місце змінної A в масиві. Описаний алгоритм пошуку і програма представлені на малюнку 2.15.

Використовувані змінні:

n - число елементів масиву;

a [] - статичний масив;

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

f - допоміжна змінна для індикації наявності в масиві числа рівного a ;

poz - номер елемента масиву на якому повинно знаходитися число a ;

i - параметр циклу;

# include

main ()

{

int f, k, n, poz, i, x [10], a;

puts ("Введіть кількість елементів масиву: ");

scanf ("% d", & n);

for (i = 0; i

{

printf ("x [% 2d] =", i);

scanf ("% d", & x [i]);

}

puts ("Введіть число a: ");

scanf ("% d", & a);

f = 0; poz = n; k = 0;

for (i = 0; i

{

if (x [i]> a) {poz = i; k = 1;}

else

{

if (x [i] == a)

{poz = i; f = 1; k = 1;}

}

}

if (f == 1)

printf ("У масиві є число =% d, на позиції-% d n ", a, poz);

else

printf ("Число% d повинно знаходитися на позиції-% d n ", a, poz);

for (i = 0; i

printf ("x [% d] =% d n", i, x [i]);

return 0;

}

Малюнок 2.15. Графічний алгоритм і програма для прикладу 2.7

Описаний алгоритм можна доповнити попередніми порівнянням останнього елемента масиву X [ n -1] з числом A , якщо X [ n -1] = < b> A - то задане число знаходиться на останньому місці, а в випадки виконання X [ n -1] > A - то, число A повинне знаходиться в масиві на позиції n . Якщо жодне з цих умов не виконано, то це означає що необ... 2.9 Пошук мінімального та максимального елемента масиву та його порядкового номера (Індексу)

Нехай потрібно знайти мінімальний елемент ( min ) і його індекс ( n_min ) у всьому масиві ( In = 0 і ik = n ) або якою те його частини (з in - Го по ik - ий), в цьому випадки алгоритм розв'язання задачі можна записати так:

1. в якості початкового значення змінної min виберемо будь-який з розглянутих елементів (зазвичай обирають перший). Тоді min = a in , n_min = in;

2. потім в циклі по параметру i починаючи з наступного елементу ( i = in +1, ..., ik ) будемо порівнювати елементи масиву a i поточним мінімальним min . Якщо виявиться, що поточний ( i - ий ) елемент масиву менше мінімального ( a i ), то змінна min приймає значення a i , а n_min - На i : min = a i , n_min = i .

Графічна схема алгоритму та фрагмент програми пошуку мінімального елемента в масиві наведені на рисунку 2.16.

min = a [in];

n_min = in;

for (i = in +1; i

if (a [i]

{

min = a [i];

n_min = i;

}

Малюнок 2.16. Графічний алгоритм і фрагмент програми пошуку мінімального елемента в масиві

Зауважимо, що за наявності в масиві декількох мінімальних елементів, буде знайдений перший з них (самий лівий мінімальний елемент) при перегляді масиву зліва направо. Якщо в нерівності a i знак > поміняти на знак ≥ , то буде знайдений останній з них (самий правий мінімальний елемент).

Для пошуку максимального елемента max і його індексу n_max використовується аналогічний алгоритм, в якому спочатку треба прийняти max = a in , n_ max = in , замість нерівності a i використовується нерівність a i > max . У випадки виконання умови a i > Max записати в max = a i та в n_ max = i .

Для пошуку в масиві екстремуму можна не використовувати допоміжну змінну min ( max ). У цьому випадки мінімальний елемент масиву визначається тільки по його індексу n_min ( N_max ) (малюнок 2.17).

/* пошук мінімального елемента */

n_min = in;

for (i = in +1; i

if (a [i]

n_min = i;

/* пошук максимального елемента */

n_max = in;

for (i = in +1; i

if (a [i]> a [n_max])

n_max = i;

Малюнок 2.17. Графічний алгоритм і фрагмент програми пошуку мінімального елемента в масиві по його індексу

Приклад використання розглянутих алгоритмів представлений в додатку 2.

2.10 Копіювання масивів

У ряді завдань для організації додаткових або проміжних обчислень, потрібне створення копії всього масиву або частини його елементів. Для цього можна скористатися алгоритмом представленим на малюнку 2.18.

k = 0;

for (i = in; i

{

y [k] = a [i];

k + +;

}

Малюнок 2.18 Алгоритм і фрагмент програми створення копії масиву

В залежності від параметрів in і ik , в масив y [] копіюються елементи з вихідного масиву a [] . Так для копіювання всіх елементів масиву a [ ] необхідно задати in = 0 , ik = n ( N - кількість елементів масиву a [] ). При копіюванні частини масиву, наприклад з 3 по 9, приймаємо in = 2 (Оскільки нумерація елементів масиву в С + +, починається з нуля) і ik = 9 .