Застосовуються, коли потрібно скласти або перемножити обрані дані. У загальному виді ці широко застосовувані алгоритми можна описати так:
- для підрахунку кожної суми або добутку описати по одній змінної того ж типу, що суммируемые або дані, що перемножуються;
- до циклу змінної-сумі привласнити початкове значення 0, а добутку – значення 1;
- у тілі циклу, якщо черговий елемент даних t відповідає умові підсумовування або перемножування, сума накопичується оператором виду s:=s+t;, а добуток – оператором виду p:=p*t;
Очевидно, чому початкове значення добутку – одиниця, а не нуль. Після оператора p:=0; оператор p:=p*t;, розташований у тілі циклу, буде повертати тільки нулі.
Пр. Для функції
,
знайти арифметичне середнє її позитивних значень і добуток ненульових значень.
Для пошуку арифметичного середнього необхідно спочатку знайти суму s і кількість k позитивних значень функції. Складемо наступну програму:
var x,f,s,p:real;
k:integer;
begin
s:=0;
k:=0;
p:=1;
x:=-5;
while x<=5+1e-6 do begin
if x<0 then f:=sqr(ln(abs(x)))
else if x>0 then f:=sin(sqr(x))
else f:=0;
if f>0 then begin
s:=s+f;
k:=k+1;
end;
if f<>0 then p:=p*f;
x:=x+0.5;
end;
s:=s/k; {тепер в s - шукане середнє}
writeln ('Середнє позитивних =',s:10:6);
writeln ('Добуток ненульових=',p:10:6);
reset (input); readln;
end.
Пр. Написати програму, що імітує роботу касового апарата: користувач у циклі вводить ціну чергового товару або 0 для завершення введення, програма підсумує ціни. По завершенню циклу введення програма нараховує знижку із загальної вартості товару за правилом:
знижки ні, якщо загальна вартість < 10000 руб.;
знижка = 5%, якщо загальна вартість - від 10000 до 20000 руб.;
знижка = 7%, якщо загальна вартість - понад 20000 руб.
Після нарахування знижки виводиться остаточна вартість покупки.
Позначивши загальну вартість покупки s, а ціну чергового товару – t, напишемо наступну програму:
var s,t:real;
begin
writeln;
s:=0; {початкове значення суми!}
repeat
writeln ('Уведіть вартість товару або 0 для завершення введення:');
{$I-}read(t);{$I+}
if (Ioresult<>0) or (t<0) then begin
writeln ('Помилка! Повторите введення');
continue;
end;
if t=0 then break;
{Округляємо t до 2 знаків після коми - на випадок, якщо є копійки}
t:=Round (t*100) / 100;
s:=s+t; {нагромадження суми!}
until false;
{Нарахування знижки й вивід відповіді}
writeln ('Вартість без знижки:',s:8:2);
if s>20000 then s:=s-s*0.07
else if s>10000 then s:=s-s*0.05;
writeln ('Вартість зі знижкою:',s:8:2);
writeln ('Спасибі за покупку!');
reset (input); readln;
end.
Тип даних real обраний для s і t не випадково – вибір integer обмежив би діапазон оброблюваних значень і не дозволив у зручному виді ввести копійки. Перевірки коректності введення, що робляться програмою, знайомі по попередніх прикладах і тому не закомментированы.