На початку уроку бажано зробити опитування у письмовому чи усному вигляді за
попереднім матеріалом. Потім можна розглянути кілька задач на застосування
методів впорядкування табличних величин. Якщо клас досить сильний, можна
запропонувати учням самостійний розв'язок цих задач.
Задача №339
(1).
Умова: Дано натуральне число n та послідовність
дійсних чисел a1, a2, … an. Після впорядкування цієї
послідовності за спаданням визначити, скільки членів послідовності залишилося
стояти на своїх місцях.
Для того, щоб визначити, скільки чисел залишилось на
своїх місцях, нам необхідно зберігати як вихідний масив, так і відсортований,
тому перш за все зарезервуємо два однакових одновимірних масиви: А -
вихідний масив та В - відсортований. Метод сортування масиву в даному
випадку можна використовувати будь-який, наприклад, метол прямої вставки. Після
виконання впорядкування проходом по обох масивах порівнюємо відповідні елементи
вихідного та відсортованого масивів і, якщо вони співпадають, виконуємо
підрахунок. Програма, що виконує описаний алгоритм, має наступний вигляд.
Program Example_339_1 ;
Uses crt;
Const N = 100;
Type
Masiv = array[1..N] of real;
Var A,B:Masiv; {A - масив для зберігання
початкової послідовності, В -
відсортований масив}
i,j,count:byte; {і,j - змінні циклу, count -
кількість елементів, що
залишились на своїх місцях}
Max:real; {Max - максимальний елемент
підмасиву}
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]:=B[i];
B[i]:=Max;
End;
count:=0;
For i:=1 to N do
Begin
If A[i]=B[i]
then count:=count+1;
End;
Writeln;
Writeln('Кількість елементів, що не змінили свого місця ',count);
Readkey; {Затримка зображення на екрані}
End.
Задача №342(1).Умова: Дано натуральне
число
n та послідовність дійсних чисел
a1, a2, … an. Визначити усі
числа, що входять у послідовність по одному разу.
Пошук чисел, що входять у
послідовність по одному разу, виконати важко, тому що для цього необхідно
порівняти кожне число з кожним. Набагато простіше зробити це у відсортованому
масиві, так як однакові числа в ньому будуть розташовані поруч. Тобто пропонуємо
в даній задачі спочатку відсортувати масив (метод сортування будь-який,
наприклад, "бульбашка"), а потім зробити по ньому прохід, порівнюючи сусідні
елементи. Якщо вони не рівні, виконуємо підрахунок. Загальна кількість чисел, що
входять у послідовність по одному разу, буде на одиницю більша, ніж отримане
число в лічильнику.
Program Example_342_1;
Uses crt;
Const N = 100;
Type
Masiv = array[1..N] of real;
Var A:Masiv; {A - масив для зберігання
вихідної послідовності}
i,j,count:byte; {і,j - змінні циклу, count -
кількість елементів, що входять в
послідовність один раз}
k:integer; {k - змінна, що коригує праву
границю сортування}
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]B>then
Begin
{Обмін елементів масиву через третю змінну}
Rez:=A[i];
A[i]:=A[i+1];
A[i+1]:=Rez;
Flag:=true;
End;
k:=k-1;
Until Flag = false;
count:=0;
For i:=1 to N-1 do
Begin
If A[i]<>A[i+1]
then count:=count+1;
End;
count:=count+1;
Writeln;
Writeln('Кількість елементів, що входять у послідовність один раз ',count);
Readkey; {Затримка зображення на екрані}
End.
Задача №360(3).Умова: Дано квадратну матрицю
розмірності
n. Надрукувати елементи бічної діагоналі у порядку
зростання.
Для того, щоб надрукувати елементи в порядку зростання, пропонуємо
їх занести у одновимірний масив і відсортувати будь-яким методом сортування,
наприклад, методом прямої вставки.
Program Example_360_3;
Uses crt;
Const N = 10;
Type
Var A:array[1..N,1..N] of real; {A - вихідний масив}
Mas:array[1..N] of real; {Mas - масив для
зберігання діагональних
елементів вихідного масиву}
i,j:byte; {і,j - змінні циклу}
Rez:real; {Rez - змінна для взаємообміну
між двома елементами масиву}
Begin
Randomize;
Clrscr;
For i:=1 to n do
Begin
For j:=1 to n do
begin
A[i,j]:=random(120)/3-random*20;
Write(A[i,j]:8:2);
end;
writeln;
End;
{Формування масиву з елементів бічної діагоналі
вихідного масиву}
For i:=1 to N do
Mas[i]:=A[i,N+1-i];
For i:=2 to N do
Begin
j:=i;
while (j>1) and (Mas[j] <Mas[j-1]) do
Begin
Rez:=Mas[j];
Mas[j]:=Mas[j-1];
Mas[j-1]:=Rez;
j:=j-1;
End;
End;
Writeln('Елементи бічної діагоналі:');
For i:=1 to n do
begin
Write(Mas[i]:8:2);
end;
Readkey; {Затримка зображення на екрані}
End.
Задача №368.Умова: Вважатимемо рядок квадратної
матриці порядку n позначеним, якщо перший елемент цього рядка - нульовий.
Вивести елементи матриці в такому вигляді: в кожному позначеному рядку -
впорядковані за зростанням, а в інших - за спаданням.
Перевіривши перший
елемент заданої квадратної таблиці на нуль, виконаємо впорядкування за
зростанням або за спаданням одним з відомих способів сортування, наприклад,
"бульбашкою".
Program Example_368;
Uses crt;
Const N = 9;
Type
Var A:array[1..N,1..N] of real; {A - вихідний масив}
i,j,k:byte; {і,j,k - змінні циклу}
Rez:real; {Rez - змінна для взаємообміну
між двома елементами}
Begin
Randomize;
Clrscr;
{Заповнення та виведення масиву на екран}
For i:=1 to n do
Begin
For j:=1 to n do
begin
A[i,j]:=random(120)/3-random*20;
Write(A[i,j]:8:2);
end;
writeln;
End;
{Цикл по рядках для перевірки першого елемента}
For k:=1 to n do
Begin
If A[k,1]=0
Then
Begin
{Сортування "бульбашкою" за зростанням}
For i:=1 to N do
For j:=1 to N-i do
If A[k,j]>A[k,j+1]
then
Begin
Rez:=A[k,j];
A[k,j]:=A[k,j+1];
A[k,j+1]:=Rez;
End;
End
Else
Begin
{Сортування "бульбашкою" за спаданням}
For i:=1 to N do
For j:=1 to N-i do
If A[k,j]B>then
Begin
Rez:=A[k,j];
A[k,j]:=A[k,j+1];
A[k,j+1]:=Rez;
End;
End;
End;
{Виведення перетвореного масиву}
For i:=1 to n do
Begin
For j:=1 to n do
begin
Write(A[i,j]:8:2);
end;
writeln;
End;
Readkey; {Затримка зображення на екрані}
End.