Пошук

Показ дописів із міткою алгоритми пошуку. Показати всі дописи
Показ дописів із міткою алгоритми пошуку. Показати всі дописи

неділя, 10 січня 2010 р.

X. Впорядкування масивів

ЗАДАЧА № 56

Постановка задачі:

Дано натуральне число п та послідовність дійсних чисел а1, а2, …, ап. Після впорядкування цієї послідовності за спаданням визначити, скільки членів послідовності залишилося стояти на своїх місцях.

Аналіз алгоритму:

Для того, щоб визначити, скільки чисел залишилось на своїх місцях, нам необхідно зберігати як вихідний масив, так і відсортований, тому перш за все зарезервуємо два однакових одновимірних масиви: А – вихідний масив та В – відсортований. Метод сортування масиву в даному випадку можна використовувати будь-який, наприклад, метод прямого вибору. Після виконання впорядкування проходом по обох масивах порівнюємо відповідні елементи вихідного та відсортованого масивів і, якщо вони збігаються, виконуємо підрахунок.

Текст програми:

Program Task_56;

Uses crt;

Const N = 100;

Type Masiv = array[1..N] of real;

Var A, B:Masiv; {A – масив для зберігання початкової послідовності,

В – відсортований масив}

і, j, count:byte; {i, j – змінні циклу,

count – кількість елементів, що залишились на своїх місцях}

Max:real; {Мах – максимальний елемент підмасиву}

N_max:byte; {N_max – номер максимального елементу}

Begin

Randomize;

Clrscr;

For i:=1 to N do

Begin

A[i]:=random*100–random*50;

Write(A[i]:8:2);

End;

B:=A; {Копіювання елементів масиву А в масив В}

For i:=1 to N–1 do

Begin

Max:=B[i]; {Зберігання еталону максимуму}

N_Max:=i; {Зберігання номера максимуму}

For j:=i+1 to N do

If B[j]>Max Then

Begin

Max:=B[j]; {Перевизначення еталону}

N_Max:=j; {Зберігання номеру еталону}

End;

{Обмін місцями мінімуму та першого елементу підмасиву}

B[N_Max]:=В[і]; В[і]:=Мах;

End;

count:=0;

For і:=1 to N do

Begin

If A[i]=B[i] Then count:=count+1;

End;

Writeln;

Writeln(‘Кількість елементів, що не змінили місця = ‘ , count) ;

Readkey;

End.

ЗАДАЧА № 57

Постановка задачі:

Дано натуральне число п та послідовність дійсних чисел а1, а2, …, ап. Визначити усі числа, що входять у послідовність по одному разу.


Аналіз алгоритму:

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

Текст програми:

Program Task_57;

Uses crt;

Const N = 100;

Type Masiv = array[1..N] of real;

Var A:Masiv; {A – масив для вихідної послідовності}

і, j, count:byte; {і, j – змінні циклу,

count – кількість елементів, що входять у послідовність один раз}

k: integer; {к – змінна, що коригує праву границю сортування}

Flag:Boolean; {Flag – змінна, що фіксує, чи була перестановка}

Begin

Randomize; Clrscr;

For i:=1 to N do

Begin

A[i]:=random(300)/11–random*15;

Write(A[i]:8:2);

End;

k:=1;

Repeat

Flag:=false;

For i:=1 to N–k do

Begin

If A[i]

Begin {Обмін елементів масиву через третю змінну}

Rez:=A[i]; А[і]:=А[і+1]; A[i+1]:=Rez;

Flag:=true;

End;

k:=k–1;

End;

Until Flag = false;

count:=0;

For i:=1 to N–1 do

Begin If A[i]OA[i+l] then count: =count+1; End;

count:=count+l;

Writeln;

Write (‘Кількість елементів, що входять у послідовність 1 paз = ‘);

Writeln(count);

Readkey;

End.

IX. Пошук елементів у масивах

ЗАДАЧА № 51

Постановка задачі:

Середню групу дитячого садочка вивели на прогулянку. Скільки дівчаток і скільки хлопчиків видно з-за паркану, якщо зріст хлопчиків задається у сантиметрах від’ємними числами, а дівчаток – додатними у вигляді цілих значень а1, а2, …, аn? Крім того, у всіх дівчаток на голівках зав’язані бантики заввишки 10 см, а висота паркану Н см.

Аналіз алгоритму:

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

Текст програми:

Program Task_51;

Uses crt;

Var N, H:word;{N – кількість дітей в дитсадочку, Н – висота паркану}

А:аrrау[1..100] of longint;

{А – зарезервований масив для зберігання зросту дітей}

і, Count_Girl, Count_Boy:longint;

{і – змінна циклу,

Count_Girl – кількість дівчаток,

Count_Boy – кількість хлопців}

Begin

Randomize;

Clrscr;

Count_Girl:=0;

Count_Boy:=0;

Write(‘Введіть висоту паркану: ‘);

Readln(H);

Write(‘Введіть кількість дітей в дитсадочку: ‘);

Readln(N);

For i:=1 to N do

Begin

A[i]:=random(300)–150;

{Заповнення масиву випадковими числами від –150 до +150}

Write(А[і]:5);

{Виведення масиву на екран для контролю роботи програми}

If (A[i]<0)>H) Then Count_Boy:=Count_Boy+1;

If (A[i]>0) and (A[i]+10>H) Then Count_Girl:=Count_Girl+1;

End;

Write(‘хлопчики, яких видно з–за паркану: ‘, Count_Boy);

Write(‘дівчатка, яких видно з–за паркану: ‘ , Count_Girl);

Readkey;

End.


ЗАДАЧА № 52

Постановка задачі:

Дано натуральне число п та послідовність дійсних чисел а1, а2, …, аn. Визначити кількість сусідств двох чисел різного знаку.

Аналіз алгоритму:

Перш за все запропонуємо в цій задачі інший метод опису масиву з використанням константи, що задає розмір масиву, та вказівки Туре. А, по-друге, зверніть увагу, що для визначення двох сусідніх елементів масиву використовується загальний опис індексів і та і + 1 (можна і – 1 та і), а це при організації циклу можне викликати ситуацію виходу за межі масиву. Дійсно, якщо організувати цикл з параметром для зміни індексу від 1 до N, де N – кількість елементів масиву, то при і = N значення і + 1 буде виходити за межі масиву. Це є помилкою, що призводить до неочікуваних результатів, тому цикл треба організовувати для зміни індексу не від 1 до N, а для зміни від 1 до N – 1.

Текст програми:

Program Task_52;

Uses crt;

Const N=100;

Type Masiv = array[1..N] of real;

Var A:Masiv; {A – масив для зберігання даних чисел}

і, Count:byte; {і – змінна циклу, count – кількість сусідств}

Begin

Randomize;

Clrscr;

Count:=0;

For і:=1 to N do

Begin

A[i]:=random*100–random*50;

Write(А[і]:8:2);

End;

For i:=1 to N–l do

If ((A[i]<0)>0)) or ((A[i]>0) and (A[i+1]<0))

Then Count:=Count+l;

Writeln;

Writeln(‘Кількість заданих сусідств = ‘, Count);

Readkey;

End.

ЗАДАЧА № 53

Постановка задачі:

Дано одновимірний масив цілих чисел A[i], де i = 1, 2, …, п. Визначити, скільки разів максимальний елемент зустрічається у даному масиві та порядковий номер першого найбільшого елементу.


Аналіз алгоритму:

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

1) береться будь-який елемент масиву (як правило, перший) і його значення присвоюється змінній max, тобто він вважається за еталон найбільшого елементу;

2) по черзі з масиву вибираються всі останні елементи і, якщо серед них знайдеться більший за обраний еталон, то змінній max присвоюється нове значення, яке тепер буде новим еталоном. В іншій змінній, наприклад, N_max запам’ятовується номер цього найбільшого елементу (початкове значення цієї змінної було 1, тому що спочатку ми вважали найбільшим 1-ий елемент). Після закінчення перегляду всього масиву змінна max буде містити шуканий максимум, а змінна N_max – його номер. Щоб запам’ятати номер першого максимального елемента, необхідно шукати в матриці елемент, що точно більший еталону. Якщо ж ми будемо шукати елемент, що не менший за еталон, то в змінній N_max залишиться номер останнього найбільшого елементу (подумайте чому).

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

Текст програми:

Program Task_53;

Uses crt;

Const n = 30;

Var A:array[1..n] of integer; {A – масив даних чисел}

і:byte; {і – змінна циклу}

count, N_max:byte;

{count – кількість максимальних елементів в масиві,

N_max – номер першого найбільшого елементу}

max:integer; {max – максимальний елемент масиву}

Begin

Clrscr;

Randomize;

For і:=1 to n do

Begin

A[i]:=random(150)–random(80);

Write(A[i]:5);

End;

{Надання змінним початкових значень}

max:=A[1];

N_max:=1;

count:=0;

{Прохід по масиву для пошуку максимуму та його номера}

For і:=2 to n do

If A[i]>max Then

Begin

max:=A[i];

N_max:=i;

End;

{Другий прохід по масиву для підрахунку кількості максимальних елементів}

For i:=1 to n do

If A[i]= max Then count:=count+1;

Writeln(‘Максимум = ‘ , max);

Writeln(‘Номер першого максимума = ‘, N_max);

Writeln(‘Кількість максимумів = ‘, count);

Readkey;

End.

ЗАДАЧА № 54

Постановка задачі:

Дано цілочислову прямокутну таблицю порядку N × M. Усі елементи таблиці менші за середнє арифметичне її значень, замінити на «– 1», а більші – на «1».

Аналіз алгоритму:

Щоб виконати задану заміну, необхідно спочатку обчислити середнє арифметичне елементів таблиці. Для цього знайдемо суму всіх елементів, а потім поділимо на їх кількість (елементів у таблиці всього N • M). Після виконання зазначених обчислень необхідно ще раз організувати прохід по масиву, в результаті якого командою розгалуження вибрати додатні та від’ємні елементи і замінити їх відповідно до умови.

Текст програми:

Program Task_54;

Uses crt;

Const n = 9; m = 12;

Type Masiv = array[1..n, 1..m] of integer;

Var A:Masiv; i, j:byte; {i, j – змінні циклу}

Sum, SA:real; {Sum – сума елементів таблиці,

SA – середнє арифметичне}

Begin

Randomize;

Clrscr;

Sum:=0; {Початкове значення суми}

Writeln(‘Вихідний масив: ‘);

For і:=1 to n do

Begin

For j:=1 to m do

Begin

A[i,j]:=random(120)–random(65);

Write(A[i,j]:5);

Sum:=Sum+A[і,j]; {Накопичення суми елементів масиву}

End;

Writeln;

End;

SA:=Sum/(n*m);

Writeln(‘Середнє арифметичне = ‘, SA:8:2);

Writeln(‘Результуючий масив: ‘);

For i:=1 to n do

Begin

For j:=1 to m do

Begin

if A[i,j] <>

if A[i,j] > SA then A[i,j]:=1;

Write(A[i,j]:5);

End;

Writeln;

End;

Readkey;

End.

ЗАДАЧА № 55

Постановка задачі:

У даній дійсній матриці розмірністю 6×9 знайти суму елементів рядка, що містить найбільший елемент. Вважається, що такий елемент у матриці єдиний.

Аналіз алгоритму:

Щоб знайти суму елементів заданого рядка, спочатку визначимо, в якому з рядків матриці знаходиться максимальний елемент. Після цього ми повинні запам’ятати номер рядка, в якому він знаходиться. Використаємо для цього додаткову змінну N_max. Після повного проходу по масиву з метою пошуку максимуму, організовуємо новий цикл, але вже не по всьому масиву, а тільки по рядку з номером N_max для обчислення суми елементів цього рядка.

Текст програми:

Program Task_55;

Uses crt;

Type masiv = array[1..6, 1..9] of real;

Var A: Masiv;

i, j:byte; {i, j – змінні циклу}

Sum, max:real;

{Sum – сума елементів таблиці, max – махе. елемент таблиці}

N_max:byte; {N_max – номер рядка, що містить макс. елемент}

Begin

Randomize;

Clrscr;

Writeln(‘Вихідний масив: ‘);

Fox i:=1 to 6 do

Begin

For j:=1 to 9 do

Begin

A[i,j]:=random*12–random(65)/11;

Write(A[i,j]:8:2);

End;

Writeln;

End;

{Беремо у якості еталону перший елемент масиву}

mах:=А[1,1];

Nmax:=1;

For i:=1 to 6 do

For j:=1 to 9 do

if A[i,j]>max then

Begin

max:=A[i,j];

N_max:=i;

End;

Writeln(‘Максимальний елемент масиву = ‘, max:8:2);

Sum:=0;

For j:=1 to n do

Sum: =Sum+A[N_max,j];

Writeln(‘Отримана сума = ‘, Sum:8:2);

Readkey;

End.