Пошук найбільшого або найменшого елементу масиву

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

Задача 169.169. Знайти значення температури найтеплішого ранку в лютому.

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

Розв’язання: Для простоти будемо вважати, що у всі ранки з 8 по 21 число температура була стабільною і змінювалась в межах від –5оС до –8оС. Ще раз приведемо нашу таблицю температур:

-8 -7 -5 -4 -4 -5 -4 ... -9 -7 -4 -2 -1
...

а нижче приведемо значення найвищої температури по проходженню чергового ранку:

-8 -7 -5 -4 -4 -4 -4 ... -4 -4 -4 -2

Як ми знаходили найвище значення? Давайте опишемо процес знаходження найвищої температури словесно. Зрозуміло, що в перший день лютого було зафіксовано найвищу температуру в лютому, адже інші дні ще не настали. Коли було знято покази термометра вранці 2–го лютого, ми порівняли знайдену температуру з найвищою температурою (–8) і побачили, що нова температура є вищою за попереднє значення, тому новим значенням найвищої температури стало –7. Таким самим способом ми поступали кожного дня. Звертаємо вашу увагу на те, що ми порівнювали нове значення температури не з температурою попереднього дня, а з значенням найвищої температури за всі попередні дні. Це значення не є елементом масиву, а є значенням окремої змінної.

Тепер програмна реалізація описаного способу розв’язку поставленої задачі є «справою техніки»:

program temperatura_max;

uses dos, crt;

var i, maxtemp : integer;

temp : array[1..28] of integer;

begin

clrscr;

for i := 1 to 28 do

begin

write(‘Введiть значення температури ’,i,‘-го лютого: ’);

readln(temp[i]);

end;

maxtemp := temp[1];

for i := 2 to 28 do

if temp[i] > maxtemp then maxtemp := temp[i];

writeln(‘ Найвища температура у лютому становить ’,maxtemp);

readln

end.

Задача 170.170. Спробуйте модифікувати приведену вище програму для знаходження найнижчої температури у лютому.

Розв’яжіть цю задачу самостійно, а ми ж сформулюємо розв’язану вище задачу трішечки інакше.

Задача 171.171. Знайти найвищу температуру і вказати, якого числа її було зафіксовано.

Розв’язання: Очевидно, що для знаходження номера дня нам потрібно ввести ще одну змінну, наприклад, num_day_max_temp типу integer і в циклі пошуку найбільшої температури додати пошук номера дня найбільшої температури. При цьому слід не забути про те, що до початку циклу пошуку дану температуру було зафіксовано першого дня, тобто зробити початкове присвоєння вказаної змінної. Наведемо лише фрагмент програми, де реалізовано наведені міркування. Весь інший текст програми повністю співпадає з попередньою задачею, за винятком додаткової змінної, описаної више.

...

maxtemp := temp[1];

num_day_max_temp := 1;

for i := 2 to 28 do

if temp[i] > maxtemp then

begin

maxtemp := temp[i];

num_day_max_temp := 1;

end;

...

На перший погляд все нібито вірно. Але даний розв’язок задачі не є вірним.

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

Помилку спровоковано невірним формулюванням самої умови задачі. Наведемо формулювання задачі ще раз і підкреслимо слова, які і спонукають нас до невірного розв’язку: Знайти найвищу температуру і вказати, якого числа її було зафіксовано.Здогадались? Так, звичайно, найвища температура у лютому могла бути зафіксована не одного дня, а в декілька днів. Причому ці дні не обов’язково йдуть підряд. Більше того, теоретично можливий і фантастичний випадок, коли у всі дні лютого температура була однаковою і тоді нам необхідно було б надрукувати номери всіх днів з цією нереальною, але цілком теоретично можливою картою погоди.

Якщо номери днів нам не потрібно зберігати, то вірна програмна реалізація розв’язку задачі матиме вигляд:

program temperatura_max1;

uses dos, crt;

var i, maxtemp : integer;

temp : array[1..28] of integer;

begin

clrscr;

for i := 1 to 28 do

begin

write(‘Введiть значення температури ’,i,‘-го лютого: ’);

readln(temp[i]);

end;

maxtemp := temp[1];

for i := 2 to 28 do

if temp[i] > maxtemp then maxtemp := temp[i];

writeln(‘Найвища температура у лютому становить ’,maxtemp);

write(‘Її було зафіксовано у наступні дні місяця: ’);

for i := 1 to 28 do

if temp[i] = maxtemp then write( temp[i], ‘ ’);

readln

end.

Як бачимо, ми у даному випадку обійшлись і без додаткової змінної. А як бути у тому випадку, коли нам потрібно було б зберігати номери днів з найвищою температурою? У цьому випадку згадувана змінна num_day_max_temp повинна бути описана також як масив, а не окрема змінна. До початку знаходження номерів днів з найвищою температурою необхідно присвоїти елементам цього масиву таке значення, яке вони не можуть мати при подальшому пошуку днів з найвищою температурою, наприклад, 0, так як такого дня місяця не існує. Спробуйте самостійно реалізувати даний випадок розв’язку задачі.

Наши рекомендации