Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основи програмування Паскаль.docx
Скачиваний:
51
Добавлен:
12.05.2015
Размер:
511.7 Кб
Скачать

11.3 Алгоритми нагромадження суми й добутку

Застосовуються, коли потрібно скласти або перемножити обрані дані. У загальному виді ці широко застосовувані алгоритми можна описати так:

  1. для підрахунку кожної суми або добутку описати по одній змінної того ж типу, що суммируемые або дані, що перемножуються;

  2. до циклу змінної-сумі привласнити початкове значення 0, а добутку – значення1;

  3. у тілі циклу, якщо черговий елемент даних 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обмежив би діапазон оброблюваних значень і не дозволив у зручному виді ввести копійки. Перевірки коректності введення, що робляться програмою, знайомі по попередніх прикладах і тому не закомментированы.

12. Типові алгоритми пошуку максимуму й мінімуму

У цій главі ми вивчимо найпростіші статистичні алгоритми, головний з яких – визначення максимального й мінімального значення на безлічі даних.

Розглянемо алгоритм у загальному виді:

  1. описати для кожного максимуму й мінімуму по одній змінної того ж типу, що аналізовані дані;

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

  3. у тілі циклу кожний підходящий для пошуку елемент даних tобробляється операторами виду: if t>max then max:=t; - для максимуму; if t<min then min:=t;- для мінімуму, де max і min – змінні для максимуму й мінімуму відповідно.

Крок 2 цього алгоритму вимагає коментарів, які ми зробимо на прикладі пошуку максимуму. Очевидно, що сам алгоритм нескладний – кожний елемент даних tпослідовно рівняється з коміркою пам'ятіmaxі, якщо виявлене значенняt, більше поточного значенняmax, воно заноситься вmaxоператоромmax:=t;. Як ми пам'ятаємо, після опису на кроці 1 змінноїmax, її значення ще не визначене, і може виявитися кожним – звідки випливає необхідність завдання початкового значення. Представимо, що після вибору початкового значенняmax, рівного нулю, при аналізі зустрілися тільки негативні значення елементівt. У цьому випадку умоваt>maxне виконається жодного разу й відповіддю будеmax, рівне нулю, що неправильно! Вибірсвідомо малогопочаткового значенняmax(наприклад, значення-1E30, тобто -1030, чи навряд зустрінеться в будь-яких реальних даних) гарантує, що умоваt>maxвиконається хоча б раз і максимум буде знайдений. Альтернативний спосіб – привласнитиmaxзначення окремо обчисленого першого елемента послідовності даних. У цьому випадку відповідь або вже знайдений, якщо перший елемент і є максимальний, або буде знайдений у циклі.

Аналогічні міркування допомагають зрозуміти, чому мінімуму слід привласнювати в якості початкового значення свідомо великечисло.

Перейдемо до прикладів.

Пр.Для функції y(x)=sin2(x),знайти мінімальне серед позитивних і максимальне значення.

Позначивши шукані значення min іmaxвідповідно, складемо наступну програму:

var x,y,max,min:real;

begin

x:=-pi/3;

max:=-2;

min:=2; {ці початкові значення - свідомо мале й велике для синуса}

while x<=pi/3+1e-6 do begin

y:=sqr(sin(x));

if y>0 then {шукаємо min тільки серед позитивних!}

if y<min then min:=y;

if y>max then max:=y;

x:=x+pi/24;

end;

writeln ('Мінімум =',min:8:2);

writeln ('Максимум=',max:8:2);

reset (input); readln;

end.

У наступному прикладі додатково збережемо значення аргументів функції, для яких знайдені мінімум і максимум.

Пр.Послідовність T(k) задана співвідношеннями T(k)=max(sin k, cos k), k=1,2,…,31. Знайти номери максимального й мінімального елементів послідовності.

Пошук номерівне позбавить нас від необхідності пошукузначень. Тому, крім змінних min і max, нам знадобляться дві Цілочисельні змінні для зберігання номерів мінімального й максимального значень, позначимо їх kmin і kmax відповідно. Звернете також увагу, що на кожному кроці циклу додатково буде потрібно знаходити максимальне зі значень sin(k) і cos(k), для занесення його в t.

var t,max,min:real;

k,kmin,kmax:integer;

begin

min:=1e30; {не визначаючи свідомо великого й малого для цих даних значень,}

max:=-1e30;{задаємо "надійні" значення, близькі до плюс і мінус нескінченності}

for k:=1 to 31 do begin

if sin(k)>cos(k) then t:=sin(k)

else t:=cos(k);

if t<min then begin

{ за умовою потрібні 2 оператора - збереження нового хв. значення}

{і збереження номера елемента, звідси операторные дужки!}

min:=t; kmin:=k;

end;

if t>max then begin

max:=t; kmax:=k;

end;

end;

writeln ('Номер хв. елемента =',kmin);

writeln ('Номер макс. елемента=',kmax);

reset (input); readln;

end.