Цей алгоритм застосовується, коли потрібно підрахувати кількість елементів даних, що відповідають якій-небудь умові або умовам. У загальному виді алгоритм описується в такий спосіб:
- у розділі var описати змінну целочисленного типу, за допомогою якої буде вестися підрахунок;
- до циклу привласнити їй початкове значення 0;
- у тілі циклу, якщо черговий елемент даних відповідає умові підрахунку, збільшити цю змінну на 1 оператором виду k:=k+1;.
Необхідність присвоювання початкових значень на кроці 2 цього й наступних алгоритмів пов'язана з тим, що після опису в розділі var значення змінної ще не визначене. "Поки ми не почали підраховувати кількість, воно дорівнює нулю" – цей очевидний для людини факт не очевидний для комп'ютера! Тому будь-який змінної, яка може змінюватися в тілі циклу, необхідно привласнити до циклу початкове значення, що й робить оператор виду k:=0;.
Розглянутий нами алгоритм дуже часто зустрічається у всіляких завданнях, тому для "швидкої" запису операції по збільшенню лічильника (вона називається инкремент) або його зменшенню (декремент) існують спеціальні стандартні процедури:
Inc(X,N); - Збільшує значення змінної.
Тут параметр X - змінна порядкового типу, а N – змінна або вирази целочисленного типу. Значення X збільшується на 1, якщо параметр N не визначений, або на N, якщо параметр N визначений, тобто Inc(X); відповідає X:=X+1;, а Inc(X,N); відповідає X:=X+N;.
Dec(X,N); - Зменшує значення змінної.
Параметр X – також змінна порядкового типу, N – целочисленное значення або вирази. Значення X зменшується на 1, якщо параметр N не визначений, або на N, якщо параметр N визначений, тобто Dec(X); відповідає X:=X-1;, а Dec(X,N); відповідає X:=X-N;.
За допомогою Inc і Dec генерується більш оптимізований код, особливо корисний у складних циклах. Можливо, ми будемо використовувати їх не у всіх прикладах, але Вам раджу про них не забувати.
Як приклад реалізації алгоритму розглянемо наступне завдання:
Пр. Послідовність z(i) задана співвідношеннями , i=1,2,…,100. Знайти кількість елементів послідовності, більших значення 0.5.
Позначивши шукану кількість за k, складемо наступну програму:
var z:real;
i,k:integer;
begin
k:=0;
for i:=1 to 100 do begin
if i mod 2 = 0 then z:=sqr(i)*cos(i)
else z:=sin(i/2);
if z>0.5 then inc(k);
end;
writeln ('Кількість=',k);
end.
Тому що крок по змінній i рівний 1, у програмі використаний цикл for, для перевірки того, чи є значення i парним, використана операція mod.
У наступнім завданні займемося обробкою даних у міру їх уведення користувачем:
Пр. Відомі оцінки за екзамен з інформатики для групи з n студентів, 2≤n≤25. Оцінити кількісну і якісну успішність групи по формулах:
, , де k1 – кількість "трійок", "четвірок" і "п'ятірок", k2 - кількість тільки "четвірок" і "п'ятірок".
Для введення поточної оцінки використовуємо целочисленную змінну a, у якості лічильника циклу for уведемо змінну i ("номер студента"), інші величини описані в умові. При введенні значення n і чергового значення a для простоти не будемо контролювати коректність даних, що вводяться.
var a,i,n,k1,k2:integer;
ykol,ykach:real;
begin
writeln;
writeln ('Уведіть кількість студентів:');
read (n);
k1:=0;
k2:=0;
for i:=1 to n do begin
write ('Уведіть оцінку ',i,' студента:');
read (a);
if a>2 then begin
inc(k1);
if a>3 then inc(k2);
end;
end;
ykol:=k1/n*100;
ykach:=k2/n*100;
writeln ('Кількісна успішність=',ykol:6:2);
writeln ('Якісна успішність =',ykach:6:2);
reset (input); readln;
end.